{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "xLOXFOT5Q40E"
},
"source": [
"##### Copyright 2020 The TensorFlow Authors."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"cellView": "form",
"execution": {
"iopub.execute_input": "2025-09-13T23:51:29.815683Z",
"iopub.status.busy": "2025-09-13T23:51:29.815410Z",
"iopub.status.idle": "2025-09-13T23:51:29.819547Z",
"shell.execute_reply": "2025-09-13T23:51:29.818867Z"
},
"id": "iiQkM5ZgQ8r2"
},
"outputs": [],
"source": [
"#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"# you may not use this file except in compliance with the License.\n",
"# You may obtain a copy of the License at\n",
"#\n",
"# https://www.apache.org/licenses/LICENSE-2.0\n",
"#\n",
"# Unless required by applicable law or agreed to in writing, software\n",
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"# See the License for the specific language governing permissions and\n",
"# limitations under the License."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "j6331ZSsQGY3"
},
"source": [
"# Research tools"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "i9Jcnb8bQQyd"
},
"source": [
"
"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tOpPugFsILnT"
},
"source": [
"TensorFlow Quantum brings quantum primitives into the TensorFlow ecosystem. Now quantum researchers can leverage tools from TensorFlow. In this tutorial you will take a closer look at incorporating [TensorBoard](https://www.tensorflow.org/tensorboard) into your quantum computing research. Using the [DCGAN tutorial](https://www.tensorflow.org/tutorials/generative/dcgan) from TensorFlow you will quickly build up working experiments and visualizations similar to ones done by [Niu et al.](https://arxiv.org/pdf/2010.11983.pdf). Broadly speaking you will:\n",
"\n",
"1. Train a GAN to produce samples that look like they came from quantum circuits.\n",
"2. Visualize the training progress as well as distribution evolution over time.\n",
"3. Benchmark the experiment by exploring the compute graph."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:51:29.822435Z",
"iopub.status.busy": "2025-09-13T23:51:29.822189Z",
"iopub.status.idle": "2025-09-13T23:52:09.160214Z",
"shell.execute_reply": "2025-09-13T23:52:09.159222Z"
},
"id": "yZvic4nmOH7v"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting tensorflow==2.15.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading tensorflow-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.4 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting tensorflow-quantum==0.7.3\r\n",
" Using cached tensorflow_quantum-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.7 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting tensorboard_plugin_profile==2.15.0\r\n",
" Downloading tensorboard_plugin_profile-2.15.0-py3-none-any.whl.metadata (1.0 kB)\r\n",
"Requirement already satisfied: absl-py>=1.0.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (2.3.1)\r\n",
"Requirement already satisfied: astunparse>=1.6.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (1.6.3)\r\n",
"Requirement already satisfied: flatbuffers>=23.5.26 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (25.2.10)\r\n",
"Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (0.6.0)\r\n",
"Requirement already satisfied: google-pasta>=0.1.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (0.2.0)\r\n",
"Requirement already satisfied: h5py>=2.9.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (3.14.0)\r\n",
"Requirement already satisfied: libclang>=13.0.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (18.1.1)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting ml-dtypes~=0.2.0 (from tensorflow==2.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (20 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting numpy<2.0.0,>=1.23.5 (from tensorflow==2.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Using cached numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)\r\n",
"Requirement already satisfied: opt-einsum>=2.3.2 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (3.4.0)\r\n",
"Requirement already satisfied: packaging in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (25.0)\r\n",
"Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (4.21.12)\r\n",
"Requirement already satisfied: setuptools in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (80.9.0)\r\n",
"Requirement already satisfied: six>=1.12.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (1.17.0)\r\n",
"Requirement already satisfied: termcolor>=1.1.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (3.1.0)\r\n",
"Requirement already satisfied: typing-extensions>=3.6.6 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (4.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting wrapt<1.15,>=1.11.0 (from tensorflow==2.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading wrapt-1.14.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.metadata (6.5 kB)\r\n",
"Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (0.37.1)\r\n",
"Requirement already satisfied: grpcio<2.0,>=1.24.3 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorflow==2.15.0) (1.75.0rc1)\r\n",
"Collecting tensorboard<2.16,>=2.15 (from tensorflow==2.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading tensorboard-2.15.2-py3-none-any.whl.metadata (1.7 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting tensorflow-estimator<2.16,>=2.15.0 (from tensorflow==2.15.0)\r\n",
" Downloading tensorflow_estimator-2.15.0-py2.py3-none-any.whl.metadata (1.3 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting keras<2.16,>=2.15.0 (from tensorflow==2.15.0)\r\n",
" Downloading keras-2.15.0-py3-none-any.whl.metadata (2.4 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting cirq-core==1.3.0 (from tensorflow-quantum==0.7.3)\r\n",
" Using cached cirq_core-1.3.0-py3-none-any.whl.metadata (1.9 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting cirq-google==1.3.0 (from tensorflow-quantum==0.7.3)\r\n",
" Using cached cirq_google-1.3.0-py3-none-any.whl.metadata (2.0 kB)\r\n",
"Collecting sympy==1.12 (from tensorflow-quantum==0.7.3)\r\n",
" Using cached sympy-1.12-py3-none-any.whl.metadata (12 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting gviz-api>=1.9.0 (from tensorboard_plugin_profile==2.15.0)\r\n",
" Downloading gviz_api-1.10.0-py2.py3-none-any.whl.metadata (2.6 kB)\r\n",
"Requirement already satisfied: werkzeug>=0.11.15 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard_plugin_profile==2.15.0) (3.1.3)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting duet~=0.2.8 (from cirq-core==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached duet-0.2.9-py3-none-any.whl.metadata (2.3 kB)\r\n",
"Requirement already satisfied: matplotlib~=3.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from cirq-core==1.3.0->tensorflow-quantum==0.7.3) (3.9.4)\r\n",
"Requirement already satisfied: networkx>=2.4 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from cirq-core==1.3.0->tensorflow-quantum==0.7.3) (3.2.1)\r\n",
"Requirement already satisfied: pandas in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from cirq-core==1.3.0->tensorflow-quantum==0.7.3) (2.3.2)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting sortedcontainers~=2.0 (from cirq-core==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl.metadata (10 kB)\r\n",
"Requirement already satisfied: scipy in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from cirq-core==1.3.0->tensorflow-quantum==0.7.3) (1.13.1)\r\n",
"Requirement already satisfied: tqdm in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from cirq-core==1.3.0->tensorflow-quantum==0.7.3) (4.67.1)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting google-api-core>=1.14.0 (from google-api-core[grpc]>=1.14.0->cirq-google==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached google_api_core-2.25.1-py3-none-any.whl.metadata (3.0 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting proto-plus>=1.20.0 (from cirq-google==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached proto_plus-1.26.1-py3-none-any.whl.metadata (2.2 kB)\r\n",
"Collecting mpmath>=0.19 (from sympy==1.12->tensorflow-quantum==0.7.3)\r\n",
" Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: contourpy>=1.0.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (1.3.0)\r\n",
"Requirement already satisfied: cycler>=0.10 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (0.12.1)\r\n",
"Requirement already satisfied: fonttools>=4.22.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (4.59.2)\r\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (1.4.7)\r\n",
"Requirement already satisfied: pillow>=8 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (11.3.0)\r\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (3.2.4)\r\n",
"Requirement already satisfied: python-dateutil>=2.7 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (2.9.0.post0)\r\n",
"Requirement already satisfied: importlib-resources>=3.2.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (6.5.2)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting google-auth<3,>=1.6.3 (from tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Using cached google_auth-2.40.3-py2.py3-none-any.whl.metadata (6.2 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting google-auth-oauthlib<2,>=0.5 (from tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Downloading google_auth_oauthlib-1.2.2-py3-none-any.whl.metadata (2.7 kB)\r\n",
"Requirement already satisfied: markdown>=2.6.8 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.16,>=2.15->tensorflow==2.15.0) (3.9)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: requests<3,>=2.21.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.16,>=2.15->tensorflow==2.15.0) (2.32.5)\r\n",
"Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from tensorboard<2.16,>=2.15->tensorflow==2.15.0) (0.7.2)\r\n",
"Collecting cachetools<6.0,>=2.0.0 (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Using cached cachetools-5.5.2-py3-none-any.whl.metadata (5.4 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting pyasn1-modules>=0.2.1 (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Using cached pyasn1_modules-0.4.2-py3-none-any.whl.metadata (3.5 kB)\r\n",
"Collecting rsa<5,>=3.1.4 (from google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Using cached rsa-4.9.1-py3-none-any.whl.metadata (5.6 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting requests-oauthlib>=0.7.0 (from google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading requests_oauthlib-2.0.0-py2.py3-none-any.whl.metadata (11 kB)\r\n",
"Requirement already satisfied: charset_normalizer<4,>=2 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow==2.15.0) (3.4.3)\r\n",
"Requirement already satisfied: idna<4,>=2.5 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow==2.15.0) (3.10)\r\n",
"Requirement already satisfied: urllib3<3,>=1.21.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow==2.15.0) (2.5.0)\r\n",
"Requirement already satisfied: certifi>=2017.4.17 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from requests<3,>=2.21.0->tensorboard<2.16,>=2.15->tensorflow==2.15.0) (2025.8.3)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting pyasn1>=0.1.3 (from rsa<5,>=3.1.4->google-auth<3,>=1.6.3->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Using cached pyasn1-0.6.1-py3-none-any.whl.metadata (8.4 kB)\r\n",
"Requirement already satisfied: wheel<1.0,>=0.23.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from astunparse>=1.6.0->tensorflow==2.15.0) (0.45.1)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting googleapis-common-protos<2.0.0,>=1.56.2 (from google-api-core>=1.14.0->google-api-core[grpc]>=1.14.0->cirq-google==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached googleapis_common_protos-1.70.0-py3-none-any.whl.metadata (9.3 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting grpcio-status<2.0.0,>=1.33.2 (from google-api-core[grpc]>=1.14.0->cirq-google==1.3.0->tensorflow-quantum==0.7.3)\r\n",
" Using cached grpcio_status-1.74.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"INFO: pip is looking at multiple versions of grpcio-status to determine which version is compatible with other requirements. This could take a while.\r\n",
" Downloading grpcio_status-1.73.1-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.73.0-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.72.2-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.72.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.71.2-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.71.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.70.0-py3-none-any.whl.metadata (1.1 kB)\r\n",
"INFO: pip is still looking at multiple versions of grpcio-status to determine which version is compatible with other requirements. This could take a while.\r\n",
" Downloading grpcio_status-1.69.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.68.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.68.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.67.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.67.0-py3-none-any.whl.metadata (1.1 kB)\r\n",
"INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press Ctrl + C.\r\n",
" Downloading grpcio_status-1.66.2-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.66.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.66.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.65.5-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.65.4-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.65.2-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.65.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.64.3-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.64.1-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.64.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.63.2-py3-none-any.whl.metadata (1.1 kB)\r\n",
" Downloading grpcio_status-1.63.0-py3-none-any.whl.metadata (1.1 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Downloading grpcio_status-1.62.3-py3-none-any.whl.metadata (1.3 kB)\r\n",
"Requirement already satisfied: zipp>=3.1.0 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib~=3.0->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (3.23.0)\r\n",
"Requirement already satisfied: importlib-metadata>=4.4 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from markdown>=2.6.8->tensorboard<2.16,>=2.15->tensorflow==2.15.0) (8.7.0)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Collecting oauthlib>=3.0.0 (from requests-oauthlib>=0.7.0->google-auth-oauthlib<2,>=0.5->tensorboard<2.16,>=2.15->tensorflow==2.15.0)\r\n",
" Downloading oauthlib-3.3.1-py3-none-any.whl.metadata (7.9 kB)\r\n",
"Requirement already satisfied: MarkupSafe>=2.1.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from werkzeug>=0.11.15->tensorboard_plugin_profile==2.15.0) (3.0.2)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: pytz>=2020.1 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from pandas->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (2025.2)\r\n",
"Requirement already satisfied: tzdata>=2022.7 in /tmpfs/src/tf_docs_env/lib/python3.9/site-packages (from pandas->cirq-core==1.3.0->tensorflow-quantum==0.7.3) (2025.2)\r\n",
"Downloading tensorflow-2.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (475.2 MB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using cached tensorflow_quantum-0.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.8 MB)\r\n",
"Downloading tensorboard_plugin_profile-2.15.0-py3-none-any.whl (5.6 MB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using cached cirq_core-1.3.0-py3-none-any.whl (1.8 MB)\r\n",
"Using cached cirq_google-1.3.0-py3-none-any.whl (598 kB)\r\n",
"Using cached sympy-1.12-py3-none-any.whl (5.7 MB)\r\n",
"Using cached duet-0.2.9-py3-none-any.whl (29 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading keras-2.15.0-py3-none-any.whl (1.7 MB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading ml_dtypes-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB)\r\n",
"Using cached numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)\r\n",
"Using cached sortedcontainers-2.4.0-py2.py3-none-any.whl (29 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading tensorboard-2.15.2-py3-none-any.whl (5.5 MB)\r\n",
"Using cached google_auth-2.40.3-py2.py3-none-any.whl (216 kB)\r\n",
"Using cached cachetools-5.5.2-py3-none-any.whl (10 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading google_auth_oauthlib-1.2.2-py3-none-any.whl (19 kB)\r\n",
"Using cached rsa-4.9.1-py3-none-any.whl (34 kB)\r\n",
"Downloading tensorflow_estimator-2.15.0-py2.py3-none-any.whl (441 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading wrapt-1.14.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (76 kB)\r\n",
"Using cached google_api_core-2.25.1-py3-none-any.whl (160 kB)\r\n",
"Using cached googleapis_common_protos-1.70.0-py3-none-any.whl (294 kB)\r\n",
"Using cached proto_plus-1.26.1-py3-none-any.whl (50 kB)\r\n",
"Downloading grpcio_status-1.62.3-py3-none-any.whl (14 kB)\r\n",
"Downloading gviz_api-1.10.0-py2.py3-none-any.whl (13 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)\r\n",
"Using cached pyasn1-0.6.1-py3-none-any.whl (83 kB)\r\n",
"Using cached pyasn1_modules-0.4.2-py3-none-any.whl (181 kB)\r\n",
"Downloading requests_oauthlib-2.0.0-py2.py3-none-any.whl (24 kB)\r\n",
"Downloading oauthlib-3.3.1-py3-none-any.whl (160 kB)\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Installing collected packages: sortedcontainers, mpmath, wrapt, tensorflow-estimator, sympy, pyasn1, proto-plus, oauthlib, numpy, keras, gviz-api, googleapis-common-protos, duet, cachetools, tensorboard_plugin_profile, rsa, requests-oauthlib, pyasn1-modules, ml-dtypes, grpcio-status, google-auth, google-auth-oauthlib, google-api-core, cirq-core, tensorboard, tensorflow, cirq-google, tensorflow-quantum\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: wrapt\r\n",
" Found existing installation: wrapt 2.0.0rc2\r\n",
" Uninstalling wrapt-2.0.0rc2:\r\n",
" Successfully uninstalled wrapt-2.0.0rc2\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: numpy\r\n",
" Found existing installation: numpy 2.0.2\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Uninstalling numpy-2.0.2:\r\n",
" Successfully uninstalled numpy-2.0.2\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: keras\r\n",
" Found existing installation: keras 3.10.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Uninstalling keras-3.10.0:\r\n",
" Successfully uninstalled keras-3.10.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: cachetools\r\n",
" Found existing installation: cachetools 6.2.0\r\n",
" Uninstalling cachetools-6.2.0:\r\n",
" Successfully uninstalled cachetools-6.2.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: ml-dtypes\r\n",
" Found existing installation: ml_dtypes 0.5.3\r\n",
" Uninstalling ml_dtypes-0.5.3:\r\n",
" Successfully uninstalled ml_dtypes-0.5.3\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: tensorboard\r\n",
" Found existing installation: tensorboard 2.19.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Uninstalling tensorboard-2.19.0:\r\n",
" Successfully uninstalled tensorboard-2.19.0\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Attempting uninstall: tensorflow\r\n",
" Found existing installation: tensorflow 2.19.1\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Uninstalling tensorflow-2.19.1:\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" Successfully uninstalled tensorflow-2.19.1\r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\r\n",
"tf-keras 2.19.0 requires tensorflow<2.20,>=2.19, but you have tensorflow 2.15.0 which is incompatible.\u001b[0m\u001b[31m\r\n",
"\u001b[0mSuccessfully installed cachetools-5.5.2 cirq-core-1.3.0 cirq-google-1.3.0 duet-0.2.9 google-api-core-2.25.1 google-auth-2.40.3 google-auth-oauthlib-1.2.2 googleapis-common-protos-1.70.0 grpcio-status-1.62.3 gviz-api-1.10.0 keras-2.15.0 ml-dtypes-0.2.0 mpmath-1.3.0 numpy-1.26.4 oauthlib-3.3.1 proto-plus-1.26.1 pyasn1-0.6.1 pyasn1-modules-0.4.2 requests-oauthlib-2.0.0 rsa-4.9.1 sortedcontainers-2.4.0 sympy-1.12 tensorboard-2.15.2 tensorboard_plugin_profile-2.15.0 tensorflow-2.15.0 tensorflow-estimator-2.15.0 tensorflow-quantum-0.7.3 wrapt-1.14.2\r\n"
]
}
],
"source": [
"!pip install tensorflow==2.15.0 tensorflow-quantum==0.7.3 tensorboard_plugin_profile==2.15.0"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {},
"colab_type": "code",
"execution": {
"iopub.execute_input": "2025-09-13T23:52:09.163391Z",
"iopub.status.busy": "2025-09-13T23:52:09.163100Z",
"iopub.status.idle": "2025-09-13T23:52:09.275718Z",
"shell.execute_reply": "2025-09-13T23:52:09.275035Z"
},
"id": "4Ql5PW-ACO0J"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmpfs/tmp/ipykernel_11749/2730622109.py:2: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n",
" import importlib, pkg_resources\n",
"/usr/lib/python3.9/importlib/__init__.py:169: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n",
" _bootstrap._exec(spec, module)\n"
]
},
{
"data": {
"text/plain": [
"
"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Update package resources to account for version changes.\n",
"import importlib, pkg_resources\n",
"\n",
"importlib.reload(pkg_resources)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "INxjZ39hzHLu"
},
"outputs": [],
"source": [
"#docs_infra: no_execute\n",
"%load_ext tensorboard"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:09.278237Z",
"iopub.status.busy": "2025-09-13T23:52:09.277990Z",
"iopub.status.idle": "2025-09-13T23:52:13.007369Z",
"shell.execute_reply": "2025-09-13T23:52:13.006398Z"
},
"id": "OVU9jSM80hvj"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2025-09-13 23:52:11.089770: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
"2025-09-13 23:52:11.089814: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
"2025-09-13 23:52:11.091508: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2025-09-13 23:52:12.094803: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2025-09-13 23:52:12.917980: E external/local_xla/xla/stream_executor/cuda/cuda_driver.cc:274] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected\n"
]
}
],
"source": [
"import datetime\n",
"import time\n",
"import cirq\n",
"import tensorflow as tf\n",
"import tensorflow_quantum as tfq\n",
"from tensorflow.keras import layers\n",
"\n",
"# visualization tools\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"from cirq.contrib.svg import SVGCircuit"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IYf7A1mubOfW"
},
"source": [
"## 1. Data generation\n",
"\n",
"Start by gathering some data. You can use TensorFlow Quantum to quickly generate some bitstring samples that will be the primary datasource for the rest of your experiments. Like Niu et al. you will explore how easy it is to emulate sampling from random circuits with drastically reduced depth. First, define some helpers:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.010879Z",
"iopub.status.busy": "2025-09-13T23:52:13.009948Z",
"iopub.status.idle": "2025-09-13T23:52:13.015227Z",
"shell.execute_reply": "2025-09-13T23:52:13.014505Z"
},
"id": "1_6ayfdGbExV"
},
"outputs": [],
"source": [
"def generate_circuit(qubits):\n",
" \"\"\"Generate a random circuit on qubits.\"\"\"\n",
" random_circuit = cirq.experiments.random_rotations_between_grid_interaction_layers_circuit(\n",
" qubits, depth=2)\n",
" return random_circuit\n",
"\n",
"\n",
"def generate_data(circuit, n_samples):\n",
" \"\"\"Draw n_samples samples from circuit into a tf.Tensor.\"\"\"\n",
" return tf.squeeze(tfq.layers.Sample()(circuit,\n",
" repetitions=n_samples).to_tensor())"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4BaTKnlMfJcW"
},
"source": [
"Now you can inspect the circuit as well as some sample data:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.017616Z",
"iopub.status.busy": "2025-09-13T23:52:13.017396Z",
"iopub.status.idle": "2025-09-13T23:52:13.303840Z",
"shell.execute_reply": "2025-09-13T23:52:13.303026Z"
},
"id": "wpXMPpaCdMHs"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"findfont: Font family 'Arial' not found.\n"
]
},
{
"data": {
"image/svg+xml": [
"(0, 0): (0, 1): (0, 2): (0, 3): (0, 4): X^0.5 X^0.5 X^0.5 Y^0.5 Y^0.5 Y^0.5 Y^0.5 Y^0.5 X^0.5 PhX(0.25)^0.5 PhX(0.25)^0.5 X^0.5 X^0.5 Y^0.5 X^0.5 M M M M M "
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"qubits = cirq.GridQubit.rect(1, 5)\n",
"random_circuit_m = generate_circuit(qubits) + cirq.measure_each(*qubits)\n",
"SVGCircuit(random_circuit_m)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.306766Z",
"iopub.status.busy": "2025-09-13T23:52:13.306351Z",
"iopub.status.idle": "2025-09-13T23:52:13.317753Z",
"shell.execute_reply": "2025-09-13T23:52:13.317014Z"
},
"id": "vswKr--Lfecp"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 Random bitstrings from this circuit:\n",
"q(0, 0)=1111110101\n",
"q(0, 1)=1111111111\n",
"q(0, 2)=1111111111\n",
"q(0, 3)=1111111111\n",
"q(0, 4)=0110000000\n"
]
}
],
"source": [
"samples = cirq.sample(random_circuit_m, repetitions=10)\n",
"print('10 Random bitstrings from this circuit:')\n",
"print(samples)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DQ7Hkc87hO5m"
},
"source": [
"You can do the same thing in TensorFlow Quantum with:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.320399Z",
"iopub.status.busy": "2025-09-13T23:52:13.320142Z",
"iopub.status.idle": "2025-09-13T23:52:13.458368Z",
"shell.execute_reply": "2025-09-13T23:52:13.457441Z"
},
"id": "lr35KSuehN7J"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"generate_data(random_circuit_m, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qjP1bEfkjFPz"
},
"source": [
"Now you can quickly generate your training data with:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.461252Z",
"iopub.status.busy": "2025-09-13T23:52:13.460996Z",
"iopub.status.idle": "2025-09-13T23:52:13.543082Z",
"shell.execute_reply": "2025-09-13T23:52:13.542254Z"
},
"id": "c_vAWkZFc0g-"
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"N_SAMPLES = 60000\n",
"N_QUBITS = 10\n",
"QUBITS = cirq.GridQubit.rect(1, N_QUBITS)\n",
"REFERENCE_CIRCUIT = generate_circuit(QUBITS)\n",
"all_data = generate_data(REFERENCE_CIRCUIT, N_SAMPLES)\n",
"all_data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_aQ1MvuYmoGv"
},
"source": [
"It will be useful to define some helper functions to visualize as training gets underway. Two interesting quantities to use are:\n",
"1. The integer values of samples, so that you can create histograms of the distribution.\n",
"2. The [linear XEB](https://arxiv.org/pdf/1608.00263.pdf) fidelity estimate of a set of samples, to give some indication of how \"truly quantum random\" the samples are.\n",
"\n",
"Note: Since you are dealing with reduced depth random circuits XEB fidelity numbers may tend to vary from run to run."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.545872Z",
"iopub.status.busy": "2025-09-13T23:52:13.545608Z",
"iopub.status.idle": "2025-09-13T23:52:13.551917Z",
"shell.execute_reply": "2025-09-13T23:52:13.551116Z"
},
"id": "MJakIECTbMd7"
},
"outputs": [],
"source": [
"@tf.function\n",
"def bits_to_ints(bits):\n",
" \"\"\"Convert tensor of bitstrings to tensor of ints.\"\"\"\n",
" sigs = tf.constant([1 << i for i in range(N_QUBITS)], dtype=tf.int32)\n",
" rounded_bits = tf.clip_by_value(tf.math.round(\n",
" tf.cast(bits, dtype=tf.dtypes.float32)),\n",
" clip_value_min=0,\n",
" clip_value_max=1)\n",
" return tf.einsum('jk,k->j', tf.cast(rounded_bits, dtype=tf.dtypes.int32),\n",
" sigs)\n",
"\n",
"\n",
"@tf.function\n",
"def xeb_fid(bits):\n",
" \"\"\"Compute linear XEB fidelity of bitstrings.\"\"\"\n",
" final_probs = tf.squeeze(\n",
" tf.abs(tfq.layers.State()(REFERENCE_CIRCUIT).to_tensor())**2)\n",
" nums = bits_to_ints(bits)\n",
" return (2**N_QUBITS) * tf.reduce_mean(tf.gather(final_probs, nums)) - 1.0"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "tWj-bZHboXZI"
},
"source": [
"Here you can visualize your distribution and sanity check things using XEB:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.554314Z",
"iopub.status.busy": "2025-09-13T23:52:13.554074Z",
"iopub.status.idle": "2025-09-13T23:52:13.842688Z",
"shell.execute_reply": "2025-09-13T23:52:13.841983Z"
},
"id": "9HFGMGLToVHu"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGdCAYAAADwjmIIAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAui0lEQVR4nO3df1TVdZ7H8RdI96LlBX8EFyZU+jGiib8nupWmKysax4bJnS01tSIdGyyVxpQyB3MbWD1atpmuW2Z70jT3FFPqqldMyRF/kahYMpkaNnlxJ5OrZijy3T9m+W53/BV5Efj4fJzzPYfv9/O+3/v5fEDuy+8vQizLsgQAAGCY0PruAAAAQF0g5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjBRW3x2oT9XV1fr666/VvHlzhYSE1Hd3AADAj2BZlk6cOKHY2FiFhl78eM01HXK+/vprxcXF1Xc3AADAT3D48GHddNNNF22/pkNO8+bNJf1tklwuVz33BgAA/Bh+v19xcXH25/jFXNMhp+YUlcvlIuQAANDIXO5SEy48BgAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADBSWH13AKhr7SavvGzNodzUq9ATAMDVxJEcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxU65BTUFCgQYMGKTY2ViEhIcrLywtoDwkJueAyc+ZMu6Zdu3bntefm5gbsZ/fu3erVq5fCw8MVFxenGTNmnNeX5cuXKyEhQeHh4UpMTNSqVatqOxwAAGCoWoecU6dOqUuXLpo7d+4F248cORKwLFy4UCEhIRo8eHBA3QsvvBBQ9+STT9ptfr9f/fv3V9u2bVVUVKSZM2cqOztbCxYssGs2b96sIUOGKD09XTt37lRaWprS0tJUUlJS2yEBAAADhdX2BQMHDtTAgQMv2u52uwPW//jHP6pv3766+eabA7Y3b978vNoaixcv1pkzZ7Rw4UI5HA7dfvvtKi4u1uzZszV69GhJ0pw5czRgwABNnDhRkjR9+nR5vV69+uqrmj9/fm2HBQAADFOn1+SUl5dr5cqVSk9PP68tNzdXrVq1Urdu3TRz5kxVVVXZbYWFherdu7ccDoe9LSUlRaWlpfr222/tmuTk5IB9pqSkqLCw8KL9qayslN/vD1gAAICZan0kpzbeeustNW/eXA888EDA9qeeekrdu3dXy5YttXnzZmVlZenIkSOaPXu2JMnn8yk+Pj7gNdHR0XZbixYt5PP57G0/rPH5fBftT05OjqZNmxaMoQEAgAauTkPOwoULNWzYMIWHhwdsz8zMtL/u3LmzHA6HfvOb3ygnJ0dOp7PO+pOVlRXw3n6/X3FxcXX2fgAAoP7UWcj5+OOPVVpaqmXLll22NikpSVVVVTp06JDat28vt9ut8vLygJqa9ZrreC5Wc7HrfCTJ6XTWaYgCAAANR51dk/PGG2+oR48e6tKly2Vri4uLFRoaqqioKEmSx+NRQUGBzp49a9d4vV61b99eLVq0sGvy8/MD9uP1euXxeII4CgAA0FjVOuScPHlSxcXFKi4uliQdPHhQxcXFKisrs2v8fr+WL1+uxx9//LzXFxYW6uWXX9auXbt04MABLV68WBMmTNDDDz9sB5ihQ4fK4XAoPT1de/fu1bJlyzRnzpyAU03jxo3T6tWrNWvWLO3bt0/Z2dnasWOHxo4dW9shAQAAA9X6dNWOHTvUt29fe70meIwcOVKLFi2SJC1dulSWZWnIkCHnvd7pdGrp0qXKzs5WZWWl4uPjNWHChIAAExERobVr1yojI0M9evRQ69atNXXqVPv2cUm66667tGTJEk2ZMkXPPvusbrvtNuXl5alTp061HRIAADBQiGVZVn13or74/X5FRESooqJCLpervruDOtJu8srL1hzKTb0KPQEABMOP/fzmb1cBAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMFKtQ05BQYEGDRqk2NhYhYSEKC8vL6D9kUceUUhISMAyYMCAgJpjx45p2LBhcrlcioyMVHp6uk6ePBlQs3v3bvXq1Uvh4eGKi4vTjBkzzuvL8uXLlZCQoPDwcCUmJmrVqlW1HQ4AADBUrUPOqVOn1KVLF82dO/eiNQMGDNCRI0fs5Z133gloHzZsmPbu3Suv16sVK1aooKBAo0ePttv9fr/69++vtm3bqqioSDNnzlR2drYWLFhg12zevFlDhgxRenq6du7cqbS0NKWlpamkpKS2QwIAAAYKsSzL+skvDgnR+++/r7S0NHvbI488ouPHj593hKfGZ599po4dO2r79u3q2bOnJGn16tW677779NVXXyk2Nlbz5s3Tc889J5/PJ4fDIUmaPHmy8vLytG/fPknSgw8+qFOnTmnFihX2vu+880517dpV8+fP/1H99/v9ioiIUEVFhVwu10+YATQG7SavvGzNodzUq9ATAEAw/NjP7zq5JmfDhg2KiopS+/bt9cQTT+ibb76x2woLCxUZGWkHHElKTk5WaGiotm7datf07t3bDjiSlJKSotLSUn377bd2TXJycsD7pqSkqLCw8KL9qqyslN/vD1gAAICZgh5yBgwYoP/8z/9Ufn6+/vVf/1UbN27UwIEDde7cOUmSz+dTVFRUwGvCwsLUsmVL+Xw+uyY6Ojqgpmb9cjU17ReSk5OjiIgIe4mLi7uywQIAgAYrLNg7fOihh+yvExMT1blzZ91yyy3asGGD+vXrF+y3q5WsrCxlZmba636/n6ADAICh6vwW8ptvvlmtW7fW/v37JUlut1tHjx4NqKmqqtKxY8fkdrvtmvLy8oCamvXL1dS0X4jT6ZTL5QpYAACAmeo85Hz11Vf65ptvFBMTI0nyeDw6fvy4ioqK7Jr169erurpaSUlJdk1BQYHOnj1r13i9XrVv314tWrSwa/Lz8wPey+v1yuPx1PWQAABAI1DrkHPy5EkVFxeruLhYknTw4EEVFxerrKxMJ0+e1MSJE7VlyxYdOnRI+fn5+uUvf6lbb71VKSkpkqQOHTpowIABGjVqlLZt26Y//elPGjt2rB566CHFxsZKkoYOHSqHw6H09HTt3btXy5Yt05w5cwJONY0bN06rV6/WrFmztG/fPmVnZ2vHjh0aO3ZsEKYFAAA0drUOOTt27FC3bt3UrVs3SVJmZqa6deumqVOnqkmTJtq9e7fuv/9+/fznP1d6erp69Oihjz/+WE6n097H4sWLlZCQoH79+um+++7TPffcE/AMnIiICK1du1YHDx5Ujx499PTTT2vq1KkBz9K56667tGTJEi1YsEBdunTRf/3XfykvL0+dOnW6kvkAAACGuKLn5DR2PCfn2sBzcgDALPX6nBwAAID6RsgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEi1DjkFBQUaNGiQYmNjFRISory8PLvt7NmzmjRpkhITE3X99dcrNjZWI0aM0Ndffx2wj3bt2ikkJCRgyc3NDajZvXu3evXqpfDwcMXFxWnGjBnn9WX58uVKSEhQeHi4EhMTtWrVqtoOBwAAGKrWIefUqVPq0qWL5s6de17bd999p08++UTPP/+8PvnkE7333nsqLS3V/ffff17tCy+8oCNHjtjLk08+abf5/X71799fbdu2VVFRkWbOnKns7GwtWLDArtm8ebOGDBmi9PR07dy5U2lpaUpLS1NJSUlthwQAAAwUVtsXDBw4UAMHDrxgW0REhLxeb8C2V199VXfccYfKysrUpk0be3vz5s3ldrsvuJ/FixfrzJkzWrhwoRwOh26//XYVFxdr9uzZGj16tCRpzpw5GjBggCZOnChJmj59urxer1599VXNnz+/tsMCAACGqfNrcioqKhQSEqLIyMiA7bm5uWrVqpW6deummTNnqqqqym4rLCxU79695XA47G0pKSkqLS3Vt99+a9ckJycH7DMlJUWFhYUX7UtlZaX8fn/AAgAAzFTrIzm18f3332vSpEkaMmSIXC6Xvf2pp55S9+7d1bJlS23evFlZWVk6cuSIZs+eLUny+XyKj48P2Fd0dLTd1qJFC/l8PnvbD2t8Pt9F+5OTk6Np06YFa3gAAKABq7OQc/bsWf3zP/+zLMvSvHnzAtoyMzPtrzt37iyHw6Hf/OY3ysnJkdPprKsuKSsrK+C9/X6/4uLi6uz9AABA/amTkFMTcL788kutX78+4CjOhSQlJamqqkqHDh1S+/bt5Xa7VV5eHlBTs15zHc/Fai52nY8kOZ3OOg1RAACg4Qj6NTk1Aefzzz/XunXr1KpVq8u+pri4WKGhoYqKipIkeTweFRQU6OzZs3aN1+tV+/bt1aJFC7smPz8/YD9er1cejyeIowEAAI1VrY/knDx5Uvv377fXDx48qOLiYrVs2VIxMTH6p3/6J33yySdasWKFzp07Z18j07JlSzkcDhUWFmrr1q3q27evmjdvrsLCQk2YMEEPP/ywHWCGDh2qadOmKT09XZMmTVJJSYnmzJmjl156yX7fcePG6d5779WsWbOUmpqqpUuXaseOHQG3mQMAgGtXiGVZVm1esGHDBvXt2/e87SNHjlR2dvZ5FwzX+Oijj9SnTx998skn+u1vf6t9+/apsrJS8fHxGj58uDIzMwNOJe3evVsZGRnavn27WrdurSeffFKTJk0K2Ofy5cs1ZcoUHTp0SLfddptmzJih++6770ePxe/3KyIiQhUVFZc9pYbGq93klZetOZSbehV6AgAIhh/7+V3rkGMSQs61gZADAGb5sZ/f/O0qAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEaqdcgpKCjQoEGDFBsbq5CQEOXl5QW0W5alqVOnKiYmRk2bNlVycrI+//zzgJpjx45p2LBhcrlcioyMVHp6uk6ePBlQs3v3bvXq1Uvh4eGKi4vTjBkzzuvL8uXLlZCQoPDwcCUmJmrVqlW1HQ4AADBUrUPOqVOn1KVLF82dO/eC7TNmzNArr7yi+fPna+vWrbr++uuVkpKi77//3q4ZNmyY9u7dK6/XqxUrVqigoECjR4+22/1+v/r376+2bduqqKhIM2fOVHZ2thYsWGDXbN68WUOGDFF6erp27typtLQ0paWlqaSkpLZDAgAABgqxLMv6yS8OCdH777+vtLQ0SX87ihMbG6unn35av/vd7yRJFRUVio6O1qJFi/TQQw/ps88+U8eOHbV9+3b17NlTkrR69Wrdd999+uqrrxQbG6t58+bpueeek8/nk8PhkCRNnjxZeXl52rdvnyTpwQcf1KlTp7RixQq7P3feeae6du2q+fPn/6j++/1+RUREqKKiQi6X66dOAxq4dpNXXrbmUG7qVegJACAYfuznd1CvyTl48KB8Pp+Sk5PtbREREUpKSlJhYaEkqbCwUJGRkXbAkaTk5GSFhoZq69atdk3v3r3tgCNJKSkpKi0t1bfffmvX/PB9ampq3udCKisr5ff7AxYAAGCmoIYcn88nSYqOjg7YHh0dbbf5fD5FRUUFtIeFhally5YBNRfaxw/f42I1Ne0XkpOTo4iICHuJi4ur7RABAEAjcU3dXZWVlaWKigp7OXz4cH13CQAA1JGghhy32y1JKi8vD9heXl5ut7ndbh09ejSgvaqqSseOHQuoudA+fvgeF6upab8Qp9Mpl8sVsAAAADMFNeTEx8fL7XYrPz/f3ub3+7V161Z5PB5Jksfj0fHjx1VUVGTXrF+/XtXV1UpKSrJrCgoKdPbsWbvG6/Wqffv2atGihV3zw/epqal5HwAAcG2rdcg5efKkiouLVVxcLOlvFxsXFxerrKxMISEhGj9+vP7lX/5FH3zwgfbs2aMRI0YoNjbWvgOrQ4cOGjBggEaNGqVt27bpT3/6k8aOHauHHnpIsbGxkqShQ4fK4XAoPT1de/fu1bJlyzRnzhxlZmba/Rg3bpxWr16tWbNmad++fcrOztaOHTs0duzYK58VAADQ6IXV9gU7duxQ37597fWa4DFy5EgtWrRIzzzzjE6dOqXRo0fr+PHjuueee7R69WqFh4fbr1m8eLHGjh2rfv36KTQ0VIMHD9Yrr7xit0dERGjt2rXKyMhQjx491Lp1a02dOjXgWTp33XWXlixZoilTpujZZ5/Vbbfdpry8PHXq1OknTQQAADDLFT0np7HjOTnXBp6TAwBmqZfn5AAAADQUhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGCnoIaddu3YKCQk5b8nIyJAk9enT57y2MWPGBOyjrKxMqampatasmaKiojRx4kRVVVUF1GzYsEHdu3eX0+nUrbfeqkWLFgV7KAAAoBELC/YOt2/frnPnztnrJSUl+sd//Ef9+te/treNGjVKL7zwgr3erFkz++tz584pNTVVbrdbmzdv1pEjRzRixAhdd911+sMf/iBJOnjwoFJTUzVmzBgtXrxY+fn5evzxxxUTE6OUlJRgDwkAADRCQQ85N954Y8B6bm6ubrnlFt177732tmbNmsntdl/w9WvXrtWnn36qdevWKTo6Wl27dtX06dM1adIkZWdny+FwaP78+YqPj9esWbMkSR06dNCmTZv00ksvEXIAAICkOr4m58yZM3r77bf12GOPKSQkxN6+ePFitW7dWp06dVJWVpa+++47u62wsFCJiYmKjo62t6WkpMjv92vv3r12TXJycsB7paSkqLCwsC6HAwAAGpGgH8n5oby8PB0/flyPPPKIvW3o0KFq27atYmNjtXv3bk2aNEmlpaV67733JEk+ny8g4Eiy130+3yVr/H6/Tp8+raZNm16wP5WVlaqsrLTX/X7/FY8RAAA0THUact544w0NHDhQsbGx9rbRo0fbXycmJiomJkb9+vXTF198oVtuuaUuu6OcnBxNmzatTt8DAAA0DHV2uurLL7/UunXr9Pjjj1+yLikpSZK0f/9+SZLb7VZ5eXlATc16zXU8F6txuVwXPYojSVlZWaqoqLCXw4cP125QAACg0aizkPPmm28qKipKqampl6wrLi6WJMXExEiSPB6P9uzZo6NHj9o1Xq9XLpdLHTt2tGvy8/MD9uP1euXxeC75Xk6nUy6XK2ABAABmqpOQU11drTfffFMjR45UWNj/nxH74osvNH36dBUVFenQoUP64IMPNGLECPXu3VudO3eWJPXv318dO3bU8OHDtWvXLq1Zs0ZTpkxRRkaGnE6nJGnMmDE6cOCAnnnmGe3bt0+vvfaa3n33XU2YMKEuhgMAABqhOgk569atU1lZmR577LGA7Q6HQ+vWrVP//v2VkJCgp59+WoMHD9aHH35o1zRp0kQrVqxQkyZN5PF49PDDD2vEiBEBz9WJj4/XypUr5fV61aVLF82aNUuvv/46t48DAABbiGVZVn13or74/X5FRESooqKCU1cGazd55WVrDuVe+rQqAKDh+LGf3/ztKgAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGCnrIyc7OVkhISMCSkJBgt3///ffKyMhQq1atdMMNN2jw4MEqLy8P2EdZWZlSU1PVrFkzRUVFaeLEiaqqqgqo2bBhg7p37y6n06lbb71VixYtCvZQUIfaTV552QUAgCtRJ0dybr/9dh05csReNm3aZLdNmDBBH374oZYvX66NGzfq66+/1gMPPGC3nzt3TqmpqTpz5ow2b96st956S4sWLdLUqVPtmoMHDyo1NVV9+/ZVcXGxxo8fr8cff1xr1qypi+EAAIBGKKxOdhoWJrfbfd72iooKvfHGG1qyZIn+4R/+QZL05ptvqkOHDtqyZYvuvPNOrV27Vp9++qnWrVun6Ohode3aVdOnT9ekSZOUnZ0th8Oh+fPnKz4+XrNmzZIkdejQQZs2bdJLL72klJSUuhgSAABoZOrkSM7nn3+u2NhY3XzzzRo2bJjKysokSUVFRTp79qySk5Pt2oSEBLVp00aFhYWSpMLCQiUmJio6OtquSUlJkd/v1969e+2aH+6jpqZmHwAAAEE/kpOUlKRFixapffv2OnLkiKZNm6ZevXqppKREPp9PDodDkZGRAa+Jjo6Wz+eTJPl8voCAU9Ne03apGr/fr9OnT6tp06YX7FtlZaUqKyvtdb/ff0VjBQAADVfQQ87AgQPtrzt37qykpCS1bdtW77777kXDx9WSk5OjadOm1WsfAATHj7k4/VBu6lXoCYCGqs5vIY+MjNTPf/5z7d+/X263W2fOnNHx48cDasrLy+1reNxu93l3W9WsX67G5XJdMkhlZWWpoqLCXg4fPnylwwMAAA1UnYeckydP6osvvlBMTIx69Oih6667Tvn5+XZ7aWmpysrK5PF4JEkej0d79uzR0aNH7Rqv1yuXy6WOHTvaNT/cR01NzT4uxul0yuVyBSwAAMBMQQ85v/vd77Rx40YdOnRImzdv1q9+9Ss1adJEQ4YMUUREhNLT05WZmamPPvpIRUVFevTRR+XxeHTnnXdKkvr376+OHTtq+PDh2rVrl9asWaMpU6YoIyNDTqdTkjRmzBgdOHBAzzzzjPbt26fXXntN7777riZMmBDs4QAAgEYq6NfkfPXVVxoyZIi++eYb3Xjjjbrnnnu0ZcsW3XjjjZKkl156SaGhoRo8eLAqKyuVkpKi1157zX59kyZNtGLFCj3xxBPyeDy6/vrrNXLkSL3wwgt2TXx8vFauXKkJEyZozpw5uummm/T6669z+zgAALAFPeQsXbr0ku3h4eGaO3eu5s6de9Gatm3batWqVZfcT58+fbRz586f1EcAAGA+/nYVAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABgp6H/WAQCAv9du8srL1hzKTb0KPcG1hCM5AADASIQcAABgJEIOAAAwEiEHAAAYiZADAACMRMgBAABGIuQAAAAjEXIAAICRCDkAAMBIhBwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgpKCHnJycHP3iF79Q8+bNFRUVpbS0NJWWlgbU9OnTRyEhIQHLmDFjAmrKysqUmpqqZs2aKSoqShMnTlRVVVVAzYYNG9S9e3c5nU7deuutWrRoUbCHAwAAGqmgh5yNGzcqIyNDW7Zskdfr1dmzZ9W/f3+dOnUqoG7UqFE6cuSIvcyYMcNuO3funFJTU3XmzBlt3rxZb731lhYtWqSpU6faNQcPHlRqaqr69u2r4uJijR8/Xo8//rjWrFkT7CEBAIBGKCzYO1y9enXA+qJFixQVFaWioiL17t3b3t6sWTO53e4L7mPt2rX69NNPtW7dOkVHR6tr166aPn26Jk2apOzsbDkcDs2fP1/x8fGaNWuWJKlDhw7atGmTXnrpJaWkpAR7WAAAoJEJesj5exUVFZKkli1bBmxfvHix3n77bbndbg0aNEjPP/+8mjVrJkkqLCxUYmKioqOj7fqUlBQ98cQT2rt3r7p166bCwkIlJycH7DMlJUXjx4+/aF8qKytVWVlpr/v9/isdnlHaTV552ZpDualXoScAAFy5Og051dXVGj9+vO6++2516tTJ3j506FC1bdtWsbGx2r17tyZNmqTS0lK99957kiSfzxcQcCTZ6z6f75I1fr9fp0+fVtOmTc/rT05OjqZNmxbUMQIAgIapTkNORkaGSkpKtGnTpoDto0ePtr9OTExUTEyM+vXrpy+++EK33HJLnfUnKytLmZmZ9rrf71dcXFydvR8AAKg/dXYL+dixY7VixQp99NFHuummmy5Zm5SUJEnav3+/JMntdqu8vDygpma95jqei9W4XK4LHsWRJKfTKZfLFbAAAAAzBT3kWJalsWPH6v3339f69esVHx9/2dcUFxdLkmJiYiRJHo9He/bs0dGjR+0ar9crl8uljh072jX5+fkB+/F6vfJ4PEEaCQAAaMyCHnIyMjL09ttva8mSJWrevLl8Pp98Pp9Onz4tSfriiy80ffp0FRUV6dChQ/rggw80YsQI9e7dW507d5Yk9e/fXx07dtTw4cO1a9curVmzRlOmTFFGRoacTqckacyYMTpw4ICeeeYZ7du3T6+99preffddTZgwIdhDAgAAjVDQQ868efNUUVGhPn36KCYmxl6WLVsmSXI4HFq3bp369++vhIQEPf300xo8eLA+/PBDex9NmjTRihUr1KRJE3k8Hj388MMaMWKEXnjhBbsmPj5eK1eulNfrVZcuXTRr1iy9/vrr3D4OAAAk1cGFx5ZlXbI9Li5OGzduvOx+2rZtq1WrVl2ypk+fPtq5c2et+gcAAK4Ndf6cHOCn4rk9AIArwR/oBAAARuJIDgAAqLXGcLSdIzkAAMBIHMkBADQIjeHIABoXjuQAAAAjEXIAAICROF0FANcoTg/BdBzJAQAARiLkAAAAI3G6CkDQcPoDQEPCkRwAAGAkQg4AADASIQcAABiJkAMAAIxEyAEAAEYi5AAAACMRcgAAgJF4Tg6ABufHPG8HAC6HIzkAAMBIhBwAAGAkTlch6DjVAABoCAg5aNQIVI0P37NLa4x//4vvKRoqQg5qhV9mAIDGgmtyAACAkQg5AADASJyuAhqpxnjtBgBcTRzJAQAARuJITgPH/9YBAPhpCDkAABiC/xgHIuQYgNu6AQA4H9fkAAAAI3EkB8CPwhFDAI0NR3IAAICROJJTj/ifMRoCfg4BmIqQAwQRdzaY6Vr+vhKC0ZgRcgCD8QF17eJ733A0xpBsys9Po78mZ+7cuWrXrp3Cw8OVlJSkbdu21XeXAABAA9Coj+QsW7ZMmZmZmj9/vpKSkvTyyy8rJSVFpaWlioqKqte+mZKCUT/4+QGAK9eoQ87s2bM1atQoPfroo5Kk+fPna+XKlVq4cKEmT55cz70DgECEV+DqarQh58yZMyoqKlJWVpa9LTQ0VMnJySosLLzgayorK1VZWWmvV1RUSJL8fn/Q+1dd+V3Q94m682N+Bjr9fk1Q3qvNhOVB2Q8u78fMdcm0lMvW/Jh/z1fz+3ot/wwF6/d1sP49B4upP6t18fn6w/1alnXJukYbcv7617/q3Llzio6ODtgeHR2tffv2XfA1OTk5mjZt2nnb4+Li6qSPaDwiXq7vHqC+8L1vXK7l71djHHtd9/nEiROKiIi4aHujDTk/RVZWljIzM+316upqHTt2TK1atVJISEit9uX3+xUXF6fDhw/L5XIFu6v4P8xz3WOOrw7mue4xx1dHQ5hny7J04sQJxcbGXrKu0Yac1q1bq0mTJiovLw/YXl5eLrfbfcHXOJ1OOZ3OgG2RkZFX1A+Xy8U/pquAea57zPHVwTzXPeb46qjveb7UEZwajfYWcofDoR49eig/P9/eVl1drfz8fHk8nnrsGQAAaAga7ZEcScrMzNTIkSPVs2dP3XHHHXr55Zd16tQp+24rAABw7WrUIefBBx/U//zP/2jq1Kny+Xzq2rWrVq9efd7FyHXB6XTq97///XmnvxBczHPdY46vDua57jHHV0djmucQ63L3XwEAADRCjfaaHAAAgEsh5AAAACMRcgAAgJEIOQAAwEiEnJ9g7ty5ateuncLDw5WUlKRt27bVd5cajZycHP3iF79Q8+bNFRUVpbS0NJWWlgbUfP/998rIyFCrVq10ww03aPDgwec99LGsrEypqalq1qyZoqKiNHHiRFVVVV3NoTQqubm5CgkJ0fjx4+1tzPOV+8tf/qKHH35YrVq1UtOmTZWYmKgdO3bY7ZZlaerUqYqJiVHTpk2VnJyszz//PGAfx44d07Bhw+RyuRQZGan09HSdPHnyag+lwTp37pyef/55xcfHq2nTprrllls0ffr0gL9ZxDzXXkFBgQYNGqTY2FiFhIQoLy8voD1Yc7p792716tVL4eHhiouL04wZM+p6aIEs1MrSpUsth8NhLVy40Nq7d681atQoKzIy0iovL6/vrjUKKSkp1ptvvmmVlJRYxcXF1n333We1adPGOnnypF0zZswYKy4uzsrPz7d27Nhh3XnnndZdd91lt1dVVVmdOnWykpOTrZ07d1qrVq2yWrdubWVlZdXHkBq8bdu2We3atbM6d+5sjRs3zt7OPF+ZY8eOWW3btrUeeeQRa+vWrdaBAwesNWvWWPv377drcnNzrYiICCsvL8/atWuXdf/991vx8fHW6dOn7ZoBAwZYXbp0sbZs2WJ9/PHH1q233moNGTKkPobUIL344otWq1atrBUrVlgHDx60li9fbt1www3WnDlz7BrmufZWrVplPffcc9Z7771nSbLef//9gPZgzGlFRYUVHR1tDRs2zCopKbHeeecdq2nTpta///u/X61hWoScWrrjjjusjIwMe/3cuXNWbGyslZOTU4+9aryOHj1qSbI2btxoWZZlHT9+3Lruuuus5cuX2zWfffaZJckqLCy0LOtv/zhDQ0Mtn89n18ybN89yuVxWZWXl1R1AA3fixAnrtttus7xer3XvvffaIYd5vnKTJk2y7rnnnou2V1dXW26325o5c6a97fjx45bT6bTeeecdy7Is69NPP7UkWdu3b7dr/vu//9sKCQmx/vKXv9Rd5xuR1NRU67HHHgvY9sADD1jDhg2zLIt5Doa/DznBmtPXXnvNatGiRcDvi0mTJlnt27ev4xH9P05X1cKZM2dUVFSk5ORke1toaKiSk5NVWFhYjz1rvCoqKiRJLVu2lCQVFRXp7NmzAXOckJCgNm3a2HNcWFioxMTEgIc+pqSkyO/3a+/evVex9w1fRkaGUlNTA+ZTYp6D4YMPPlDPnj3161//WlFRUerWrZv+4z/+w24/ePCgfD5fwBxHREQoKSkpYI4jIyPVs2dPuyY5OVmhoaHaunXr1RtMA3bXXXcpPz9ff/7znyVJu3bt0qZNmzRw4EBJzHNdCNacFhYWqnfv3nI4HHZNSkqKSktL9e23316VsTTqJx5fbX/961917ty5856oHB0drX379tVTrxqv6upqjR8/Xnfffbc6deokSfL5fHI4HOf94dTo6Gj5fD675kLfg5o2/M3SpUv1ySefaPv27ee1Mc9X7sCBA5o3b54yMzP17LPPavv27XrqqafkcDg0cuRIe44uNIc/nOOoqKiA9rCwMLVs2ZI5/j+TJ0+W3+9XQkKCmjRponPnzunFF1/UsGHDJIl5rgPBmlOfz6f4+Pjz9lHT1qJFizrpf0Cf6vwdgIvIyMhQSUmJNm3aVN9dMc7hw4c1btw4eb1ehYeH13d3jFRdXa2ePXvqD3/4gySpW7duKikp0fz58zVy5Mh67p053n33XS1evFhLlizR7bffruLiYo0fP16xsbHMMy6L01W10Lp1azVp0uS8O1DKy8vldrvrqVeN09ixY7VixQp99NFHuummm+ztbrdbZ86c0fHjxwPqfzjHbrf7gt+Dmjb87XTU0aNH1b17d4WFhSksLEwbN27UK6+8orCwMEVHRzPPVygmJkYdO3YM2NahQweVlZVJ+v85utTvC7fbraNHjwa0V1VV6dixY8zx/5k4caImT56shx56SImJiRo+fLgmTJignJwcScxzXQjWnDaE3yGEnFpwOBzq0aOH8vPz7W3V1dXKz8+Xx+Opx541HpZlaezYsXr//fe1fv368w5l9ujRQ9ddd13AHJeWlqqsrMyeY4/Hoz179gT8A/N6vXK5XOd96Fyr+vXrpz179qi4uNheevbsqWHDhtlfM89X5u677z7v8Qd//vOf1bZtW0lSfHy83G53wBz7/X5t3bo1YI6PHz+uoqIiu2b9+vWqrq5WUlLSVRhFw/fdd98pNDTwo6pJkyaqrq6WxDzXhWDNqcfjUUFBgc6ePWvXeL1etW/f/qqcqpLELeS1tXTpUsvpdFqLFi2yPv30U2v06NFWZGRkwB0ouLgnnnjCioiIsDZs2GAdOXLEXr777ju7ZsyYMVabNm2s9evXWzt27LA8Ho/l8Xjs9ppbm/v3728VFxdbq1evtm688UZubb6MH95dZVnM85Xatm2bFRYWZr344ovW559/bi1evNhq1qyZ9fbbb9s1ubm5VmRkpPXHP/7R2r17t/XLX/7ygrfhduvWzdq6dau1adMm67bbbrumb23+eyNHjrR+9rOf2beQv/fee1br1q2tZ555xq5hnmvvxIkT1s6dO62dO3dakqzZs2dbO3futL788kvLsoIzp8ePH7eio6Ot4cOHWyUlJdbSpUutZs2acQt5Q/dv//ZvVps2bSyHw2Hdcccd1pYtW+q7S42GpAsub775pl1z+vRp67e//a3VokULq1mzZtavfvUr68iRIwH7OXTokDVw4ECradOmVuvWra2nn37aOnv27FUeTePy9yGHeb5yH374odWpUyfL6XRaCQkJ1oIFCwLaq6urreeff96Kjo62nE6n1a9fP6u0tDSg5ptvvrGGDBli3XDDDZbL5bIeffRR68SJE1dzGA2a3++3xo0bZ7Vp08YKDw+3br75Zuu5554LuC2Zea69jz766IK/i0eOHGlZVvDmdNeuXdY999xjOZ1O62c/+5mVm5t7tYZoWZZlhVjWDx4bCQAAYAiuyQEAAEYi5AAAACMRcgAAgJEIOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASP8LoxepukDscdIAAAAASUVORK5CYII=",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(bits_to_ints(all_data).numpy(), 50)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:13.845522Z",
"iopub.status.busy": "2025-09-13T23:52:13.845285Z",
"iopub.status.idle": "2025-09-13T23:52:14.296140Z",
"shell.execute_reply": "2025-09-13T23:52:14.295350Z"
},
"id": "9m-PzaTMpB_H"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"WARNING:tensorflow:You are casting an input of type complex64 to an incompatible dtype float32. This will discard the imaginary part and may not be what you intended.\n"
]
},
{
"data": {
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"xeb_fid(all_data)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g79655cbZQLh"
},
"source": [
"## 2. Build a model\n",
"\n",
"Here you can use the relevant components from the [DCGAN tutorial](https://www.tensorflow.org/tutorials/generative/dcgan) for the quantum case. Instead of producing MNIST digits the new GAN will be used to produce bitstring samples with length `N_QUBITS`"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.299017Z",
"iopub.status.busy": "2025-09-13T23:52:14.298748Z",
"iopub.status.idle": "2025-09-13T23:52:14.305080Z",
"shell.execute_reply": "2025-09-13T23:52:14.304284Z"
},
"id": "FKFndGRszJSD"
},
"outputs": [],
"source": [
"LATENT_DIM = 100\n",
"\n",
"\n",
"def make_generator_model():\n",
" \"\"\"Construct generator model.\"\"\"\n",
" model = tf.keras.Sequential()\n",
" model.add(layers.Dense(256, use_bias=False, input_shape=(LATENT_DIM,)))\n",
" model.add(layers.Dense(128, activation='relu'))\n",
" model.add(layers.Dropout(0.3))\n",
" model.add(layers.Dense(64, activation='relu'))\n",
" model.add(layers.Dense(N_QUBITS, activation='relu'))\n",
"\n",
" return model\n",
"\n",
"\n",
"def make_discriminator_model():\n",
" \"\"\"Construct discriminator model.\"\"\"\n",
" model = tf.keras.Sequential()\n",
" model.add(layers.Dense(256, use_bias=False, input_shape=(N_QUBITS,)))\n",
" model.add(layers.Dense(128, activation='relu'))\n",
" model.add(layers.Dropout(0.3))\n",
" model.add(layers.Dense(32, activation='relu'))\n",
" model.add(layers.Dense(1))\n",
"\n",
" return model"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "793ddeeed493"
},
"source": [
"Next, instantiate your generator and discriminator models, define the losses and create the `train_step` function to use for your main training loop:"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.307887Z",
"iopub.status.busy": "2025-09-13T23:52:14.307606Z",
"iopub.status.idle": "2025-09-13T23:52:14.415194Z",
"shell.execute_reply": "2025-09-13T23:52:14.414429Z"
},
"id": "DWNFY37H0f2p"
},
"outputs": [],
"source": [
"discriminator = make_discriminator_model()\n",
"generator = make_generator_model()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.418420Z",
"iopub.status.busy": "2025-09-13T23:52:14.418163Z",
"iopub.status.idle": "2025-09-13T23:52:14.426858Z",
"shell.execute_reply": "2025-09-13T23:52:14.426155Z"
},
"id": "J3NxLYGb0gfo"
},
"outputs": [],
"source": [
"cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n",
"\n",
"\n",
"def discriminator_loss(real_output, fake_output):\n",
" \"\"\"Compute discriminator loss.\"\"\"\n",
" real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n",
" fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)\n",
" total_loss = real_loss + fake_loss\n",
" return total_loss\n",
"\n",
"\n",
"def generator_loss(fake_output):\n",
" \"\"\"Compute generator loss.\"\"\"\n",
" return cross_entropy(tf.ones_like(fake_output), fake_output)\n",
"\n",
"\n",
"generator_optimizer = tf.keras.optimizers.Adam(1e-4)\n",
"discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.429333Z",
"iopub.status.busy": "2025-09-13T23:52:14.429087Z",
"iopub.status.idle": "2025-09-13T23:52:14.434763Z",
"shell.execute_reply": "2025-09-13T23:52:14.434073Z"
},
"id": "c4YfBzfy08-c"
},
"outputs": [],
"source": [
"BATCH_SIZE = 256\n",
"\n",
"\n",
"@tf.function\n",
"def train_step(images):\n",
" \"\"\"Run train step on provided image batch.\"\"\"\n",
" noise = tf.random.normal([BATCH_SIZE, LATENT_DIM])\n",
" with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n",
" generated_images = generator(noise, training=True)\n",
"\n",
" real_output = discriminator(images, training=True)\n",
" fake_output = discriminator(generated_images, training=True)\n",
"\n",
" gen_loss = generator_loss(fake_output)\n",
" disc_loss = discriminator_loss(real_output, fake_output)\n",
"\n",
" gradients_of_generator = gen_tape.gradient(gen_loss,\n",
" generator.trainable_variables)\n",
" gradients_of_discriminator = disc_tape.gradient(\n",
" disc_loss, discriminator.trainable_variables)\n",
"\n",
" generator_optimizer.apply_gradients(\n",
" zip(gradients_of_generator, generator.trainable_variables))\n",
" discriminator_optimizer.apply_gradients(\n",
" zip(gradients_of_discriminator, discriminator.trainable_variables))\n",
"\n",
" return gen_loss, disc_loss"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bb6f98ab4bf9"
},
"source": [
"Now that you have all the building blocks needed for your model, you can setup a training function that incorporates TensorBoard visualization. First setup a TensorBoard filewriter:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.437696Z",
"iopub.status.busy": "2025-09-13T23:52:14.437383Z",
"iopub.status.idle": "2025-09-13T23:52:14.443499Z",
"shell.execute_reply": "2025-09-13T23:52:14.442832Z"
},
"id": "dJMnoal9HFM-"
},
"outputs": [],
"source": [
"logdir = \"tb_logs/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n",
"file_writer = tf.summary.create_file_writer(logdir + \"/metrics\")\n",
"file_writer.set_as_default()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "d4076c62f4f1"
},
"source": [
"Using the `tf.summary` module, you can now incorporate `scalar`, `histogram` (as well as other) logging to TensorBoard inside of the main `train` function:"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"execution": {
"iopub.execute_input": "2025-09-13T23:52:14.446379Z",
"iopub.status.busy": "2025-09-13T23:52:14.446103Z",
"iopub.status.idle": "2025-09-13T23:52:14.453810Z",
"shell.execute_reply": "2025-09-13T23:52:14.453132Z"
},
"id": "rt4_0Dy_ENvv"
},
"outputs": [],
"source": [
"def train(dataset, epochs, start_epoch=1):\n",
" \"\"\"Launch full training run for the given number of epochs.\"\"\"\n",
" # Log original training distribution.\n",
" tf.summary.histogram('Training Distribution',\n",
" data=bits_to_ints(dataset),\n",
" step=0)\n",
"\n",
" batched_data = tf.data.Dataset.from_tensor_slices(dataset).shuffle(\n",
" N_SAMPLES).batch(512)\n",
" t = time.time()\n",
" for epoch in range(start_epoch, start_epoch + epochs):\n",
" for i, image_batch in enumerate(batched_data):\n",
" # Log batch-wise loss.\n",
" gl, dl = train_step(image_batch)\n",
" tf.summary.scalar('Generator loss',\n",
" data=gl,\n",
" step=epoch * len(batched_data) + i)\n",
" tf.summary.scalar('Discriminator loss',\n",
" data=dl,\n",
" step=epoch * len(batched_data) + i)\n",
"\n",
" # Log full dataset XEB Fidelity and generated distribution.\n",
" generated_samples = generator(tf.random.normal([N_SAMPLES, 100]))\n",
" tf.summary.scalar('Generator XEB Fidelity Estimate',\n",
" data=xeb_fid(generated_samples),\n",
" step=epoch)\n",
" tf.summary.histogram('Generator distribution',\n",
" data=bits_to_ints(generated_samples),\n",
" step=epoch)\n",
" # Log new samples drawn from this particular random circuit.\n",
" random_new_distribution = generate_data(REFERENCE_CIRCUIT, N_SAMPLES)\n",
" tf.summary.histogram('New round of True samples',\n",
" data=bits_to_ints(random_new_distribution),\n",
" step=epoch)\n",
"\n",
" if epoch % 10 == 0:\n",
" print('Epoch {}, took {}(s)'.format(epoch, time.time() - t))\n",
" t = time.time()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4ceb5dc64798"
},
"source": [
"## 3. Visualize training and performance\n",
"\n",
"The TensorBoard dashboard can now be launched with:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"resources": {
"https://localhost:6006/": {
"data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KPGxpbmsgcmVsPSJhcHBsZS10b3VjaC1pY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICBjb2xvcjogdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKTsKCiAgICAvKiBMZWdhY3kgbWVjaGFuaXNtIHRvIGF2b2lkIGlzc3VlcyB3aXRoIHN1YnBpeGVsIGFudGktYWxpYXNpbmcgb24gbWFjT1MuCiAgICAgKgogICAgICogSW4gdGhlIHBhc3QgWzFdLCBtYWNPUyBzdWJwaXhlbCBBQSBjYXVzZWQgZXhjZXNzaXZlIGJvbGRpbmcgZm9yIGxpZ2h0LW9uLWRhcmsgdGV4dDsgdGhpcyBydWxlCiAgICAgKiBhdm9pZHMgdGhhdCBieSByZXF1ZXN0aW5nIG5vbi1zdWJwaXhlbCBBQSBhbHdheXMsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCB3aGljaCBpcwogICAgICogdG8gdXNlIHN1YnBpeGVsIEFBIHdoZW4gYXZhaWxhYmxlLiBUaGUgb3JpZ2luYWwgaXNzdWUgd2FzICJmaXhlZCIgYnkgcmVtb3Zpbmcgc3VicGl4ZWwgQUEgaW4KICAgICAqIG1hY09TIDE0IChNb2phdmUpLCBidXQgZm9yIGxlZ2FjeSByZWFzb25zIHRoZXkgcHJlc2VydmVkIHRoZSBib2xkaW5nIGVmZmVjdCBhcyBhbiBvcHRpb24uCiAgICAgKiBDaHJvbWUgdGhlbiBpbiB0dXJuIHVwZGF0ZWQgaXRzIGZvbnQgcmVuZGVyaW5nIHRvIGFwcGx5IHRoYXQgYm9sZGluZyBlZmZlY3QgWzJdLCB3aGljaCBtZWFucwogICAgICogdGhhdCBldmVuIHRob3VnaCB0aGUgYC13ZWJraXQtZm9udC1zbW9vdGhpbmdgIGRvY3MgWzNdIHN1Z2dlc3QgdGhhdCBzZXR0aW5nIGBhbnRpYWxpYXNlZGAKICAgICAqIHdvdWxkIGhhdmUgbm8gZWZmZWN0IGZvciByZWNlbnQgdmVyc2lvbnMgb2YgbWFjT1MsIGl0IHN0aWxsIGlzIG5lZWRlZCB0byBhdm9pZCB0aGUgYm9sZGluZy4KICAgICAqCiAgICAgKiBbMV06IGh0dHA6Ly93d3cubGlnaHRlcnJhLmNvbS9hcnRpY2xlcy9tYWNvc3h0ZXh0YWFidWcvCiAgICAgKiBbMl06IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTg1ODg2MQogICAgICogWzNdOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZm9udC1zbW9vdGgKICAgICAqCiAgICAgKi8KICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIH0KPC9zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICA6cm9vdCB7CiAgICAtLXRiLW9yYW5nZS13ZWFrOiAjZmZhNzI2OwogICAgLS10Yi1vcmFuZ2Utc3Ryb25nOiAjZjU3YzAwOwogICAgLS10Yi1vcmFuZ2UtZGFyazogI2RjNzMyMDsKICAgIC0tdGItZ3JleS1kYXJrZXI6ICNlMmUyZTI7CiAgICAtLXRiLWdyZXktbGlnaHRlcjogI2YzZjNmMzsKICAgIC0tdGItdWktZGFyay1hY2NlbnQ6ICM3NTc1NzU7CiAgICAtLXRiLXVpLWxpZ2h0LWFjY2VudDogI2UwZTBlMDsKICAgIC0tdGItZ3JhcGgtZmFkZWQ6ICNlMGQ0YjM7CiAgfQo8L3N0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyLC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9we2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3h7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja3twb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7LyohKi99QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7LyohKi99LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnQ7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb257Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZCAubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveHtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudHtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudCwubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZle3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW0gLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50e3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjJweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTExcHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93IC5tYXQtYmFkZ2UtY29udGVudHtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbntjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5e2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtaWNvbi1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLC5tYXQtZmFiLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm57Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwubWF0LWZhYi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxle2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXB7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgLm1hdC1jaGlwLXJlbW92ZTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWR7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxle2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCxtYXQtaGVhZGVyLXJvdyxtYXQtcm93LG1hdC1mb290ZXItcm93LFttYXQtaGVhZGVyLXJvd10sW21hdC1yb3ddLFttYXQtZm9vdGVyLXJvd10sLm1hdC10YWJsZS1zdGlja3l7YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3csbWF0LWhlYWRlci1yb3csbWF0LWZvb3Rlci1yb3csdGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxse2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbiwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnR7Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcntib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50e2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCwubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50IC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2FybiAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbjpob3ZlciwubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cywubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtb3B0aW9uYWx7Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29ue2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsLC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3MsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3MsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXB7YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWV7YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfS8qIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlcy5jc3MubWFwICovCjwvc3R5bGU+Cgo8L2hlYWQ+PGJvZHk+PGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBbaGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLS1sYXlvdXQ6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWlubGluZTogewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbDogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH07CgogICAgICAtLWxheW91dC1ob3Jpem9udGFsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtdmVydGljYWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtdmVydGljYWwtcmV2ZXJzZTogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC13cmFwOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH07CgogICAgICAtLWxheW91dC13cmFwLXJldmVyc2U6IHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtYXV0bzogewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC1ub25lOiB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4OiB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0yOiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTM6IHsKICAgICAgICAtbXMtZmxleDogMzsKICAgICAgICAtd2Via2l0LWZsZXg6IDM7CiAgICAgICAgZmxleDogMzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNDogewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC01OiB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTY6IHsKICAgICAgICAtbXMtZmxleDogNjsKICAgICAgICAtd2Via2l0LWZsZXg6IDY7CiAgICAgICAgZmxleDogNjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNzogewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC04OiB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTk6IHsKICAgICAgICAtbXMtZmxleDogOTsKICAgICAgICAtd2Via2l0LWZsZXg6IDk7CiAgICAgICAgZmxleDogOTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTA6IHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTE6IHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMTI6IHsKICAgICAgICAtbXMtZmxleDogMTI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMjsKICAgICAgICBmbGV4OiAxMjsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBjcm9zcyBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydDogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZDogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmFzZWxpbmU6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogYWxpZ25tZW50IGluIG1haW4gYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1jZW50ZXI6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9OwoKICAgICAgLyogc2VsZiBhbGlnbm1lbnQgKi8KCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RhcnQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtY2VudGVyOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWVuZDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1zdHJldGNoOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgIH07CgogICAgICAvKiBtdWx0aS1saW5lIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1iZXR3ZWVuLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfTsKCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBPdGhlciBMYXlvdXQKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgIC0tbGF5b3V0LWJsb2NrOiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbnZpc2libGU6IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXJlbGF0aXZlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml0OiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNjcm9sbDogewogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZ1bGxibGVlZDogewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICB9OwoKICAgICAgLyogZml4ZWQgcG9zaXRpb24gKi8KCiAgICAgIC0tbGF5b3V0LWZpeGVkLXRvcDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLXJpZ2h0OiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1ib3R0b206IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1sZWZ0OiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJpcHBsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwoKICAgICAgICAvKiBTZWUgUG9seW1lckVsZW1lbnRzL3BhcGVyLWJlaGF2aW9ycy9pc3N1ZXMvMzQuIE9uIG5vbi1DaHJvbWUgYnJvd3NlcnMsCiAgICAgICAgICogY3JlYXRpbmcgYSBub2RlICh3aXRoIGEgcG9zaXRpb246YWJzb2x1dGUpIGluIHRoZSBtaWRkbGUgb2YgYW4gZXZlbnQKICAgICAgICAgKiBoYW5kbGVyICJpbnRlcnJ1cHRzIiB0aGF0IGV2ZW50IGhhbmRsZXIgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUKICAgICAgICAgKiByaXBwbGUgaXMgY3JlYXRlZCBvbiBkZW1hbmQpICovCiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFthbmltYXRpbmddKSB7CiAgICAgICAgLyogVGhpcyByZXNvbHZlcyBhIHJlbmRlcmluZyBpc3N1ZSBpbiBDaHJvbWUgKGFzIG9mIDQwKSB3aGVyZSB0aGUKICAgICAgICAgICByaXBwbGUgaXMgbm90IHByb3Blcmx5IGNsaXBwZWQgYnkgaXRzIHBhcmVudCAod2hpY2ggbWF5IGhhdmUKICAgICAgICAgICByb3VuZGVkIGNvcm5lcnMpLiBTZWU6IGh0dHA6Ly9qc2Jpbi5jb20vdGVtZXhhLzQKCiAgICAgICAgICAgTm90ZTogV2Ugb25seSBhcHBseSB0aGlzIHN0eWxlIGNvbmRpdGlvbmFsbHkuIE90aGVyd2lzZSwgdGhlIGJyb3dzZXIKICAgICAgICAgICB3aWxsIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGluZyBsYXllciBmb3IgZXZlcnkgcmlwcGxlIGVsZW1lbnQgb24gdGhlCiAgICAgICAgICAgcGFnZSwgYW5kIHRoYXQgd291bGQgYmUgYmFkLiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgICN3YXZlcywKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgIC53YXZlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpICNiYWNrZ3JvdW5kLAogICAgICA6aG9zdCguY2lyY2xlKSAjd2F2ZXMgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgLndhdmUtY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImJhY2tncm91bmQiPjwvZGl2PgogICAgPGRpdiBpZD0id2F2ZXMiPjwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLS1zaGFkb3ctdHJhbnNpdGlvbjogewogICAgICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4yOHMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LW5vbmU6IHsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICB9OwoKICAgICAgLyogZnJvbSBodHRwOi8vY29kZXBlbi5pby9zaHluZG1hbi9wZW4vYzUzOTRkZGYyZThiMmE1YzkxODU5MDRiNTc0MjFjZGIgKi8KCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0yZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCAycHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTNkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgM3B4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA0cHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA2cHggMTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggMThweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLThkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgNHB4IDIycHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwICA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwICA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0yNGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItbWF0ZXJpYWwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0LCBodG1sIHsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsOiB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi00ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsKSwgLnBhcGVyLW1hdGVyaWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjIiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjIiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMyJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMyJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjUiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjUiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAvKgogICAgICAgKiBZb3UgY2FuIHVzZSB0aGVzZSBnZW5lcmljIHZhcmlhYmxlcyBpbiB5b3VyIGVsZW1lbnRzIGZvciBlYXN5IHRoZW1pbmcuCiAgICAgICAqIEZvciBleGFtcGxlLCBpZiBhbGwgeW91ciBlbGVtZW50cyB1c2UgYC0tcHJpbWFyeS10ZXh0LWNvbG9yYCBhcyBpdHMgbWFpbgogICAgICAgKiBjb2xvciwgdGhlbiBzd2l0Y2hpbmcgZnJvbSBhIGxpZ2h0IHRvIGEgZGFyayB0aGVtZSBpcyBqdXN0IGEgbWF0dGVyIG9mCiAgICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGluIHlvdXIgYXBwbGljYXRpb24uCiAgICAgICAqLwogICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgLS1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtc2Vjb25kYXJ5LWNvbG9yKTsKICAgICAgLS1kaXNhYmxlZC10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcik7CiAgICAgIC0tZGl2aWRlci1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtZGl2aWRlci1jb2xvcik7CiAgICAgIC0tZXJyb3ItY29sb3I6IHZhcigtLXBhcGVyLWRlZXAtb3JhbmdlLWE3MDApOwoKICAgICAgLyoKICAgICAgICogUHJpbWFyeSBhbmQgYWNjZW50IGNvbG9ycy4gQWxzbyBzZWUgY29sb3IuaHRtbCBmb3IgbW9yZSBjb2xvcnMuCiAgICAgICAqLwogICAgICAtLXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby01MDApOwogICAgICAtLWxpZ2h0LXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby0xMDApOwogICAgICAtLWRhcmstcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTcwMCk7CgogICAgICAtLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMjAwKTsKICAgICAgLS1saWdodC1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTEwMCk7CiAgICAgIC0tZGFyay1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTQwMCk7CgoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIExpZ2h0IGJhY2tncm91bmQgdGhlbWUKICAgICAgICovCiAgICAgIC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1saWdodC10aGVtZS1iYXNlLWNvbG9yOiAjMDAwMDAwOwogICAgICAtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3I6ICM3MzczNzM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM5YjliOWI7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yOiAjZGJkYmRiOwoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIERhcmsgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1kYXJrLXRoZW1lLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1kYXJrLXRoZW1lLWJhc2UtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS10ZXh0LWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWRhcmstdGhlbWUtc2Vjb25kYXJ5LWNvbG9yOiAjYmNiY2JjOyAgLyogZm9yIHNlY29uZGFyeSB0ZXh0IGFuZCBpY29ucyAqLwogICAgICAtLWRhcmstdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM2NDY0NjQ7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1kYXJrLXRoZW1lLWRpdmlkZXItY29sb3I6ICMzYzNjM2M7CgogICAgICAvKgogICAgICAgKiBEZXByZWNhdGVkIHZhbHVlcyBiZWNhdXNlIG9mIHRoZWlyIGNvbmZ1c2luZyBuYW1lcy4KICAgICAgICovCiAgICAgIC0tdGV4dC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLWRlZmF1bHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWNoZWNrYm94Ij4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtc2l6ZSwgMThweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZWQgaW4gYGF0dGFjaGVkYC4gKi8KICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemU6IHZhcigtLXBhcGVyLWNoZWNrYm94LWluay1zaXplLCAtMXB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAjY2hlY2tib3hDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBtYXJnaW46IHZhcigtLXBhcGVyLWNoZWNrYm94LW1hcmdpbiwgaW5pdGlhbCk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHZhcigtLXBhcGVyLWNoZWNrYm94LXZlcnRpY2FsLWFsaWduLCBtaWRkbGUpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIH0KCiAgICAgICNpbmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCiAgICAgICAgLyogQ2VudGVyIHRoZSByaXBwbGUgaW4gdGhlIGNoZWNrYm94IGJ5IG5lZ2F0aXZlIG9mZnNldHRpbmcgaXQgYnkKICAgICAgICAgKiAoaW5rV2lkdGggLSByaXBwbGVXaWR0aCkgLyAyICovCiAgICAgICAgdG9wOiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgbGVmdDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNpbms6ZGlyKHJ0bCkgewogICAgICAgIHJpZ2h0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgbGVmdDogYXV0bzsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja2JveCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlcjogc29saWQgMnB4OwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxNDBtcywgYm9yZGVyLWNvbG9yIDE0MG1zOwogICAgICB9CgogICAgICAvKiBjaGVja2JveCBjaGVja2VkIGFuaW1hdGlvbnMgKi8KICAgICAgI2NoZWNrYm94LmNoZWNrZWQgI2NoZWNrbWFyayB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgICAgYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAsIDApIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGNoZWNrbWFyay1leHBhbmQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHJvdGF0ZSg0NWRlZyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjY2hlY2tib3guY2hlY2tlZCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjY2hlY2ttYXJrIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDM2JTsKICAgICAgICBoZWlnaHQ6IDcwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgICAgICBib3JkZXItYm90dG9tLXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrbWFyay1jb2xvciwgd2hpdGUpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiBwcm90ZWN0IGFnYWluc3QgcGFnZS1sZXZlbCBib3gtc2l6aW5nICovCiAgICAgIH0KCiAgICAgICNjaGVja21hcms6ZGlyKHJ0bCkgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIDE0JTsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICB9CgogICAgICAvKiBsYWJlbCAqLwogICAgICAjY2hlY2tib3hMYWJlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjY2hlY2tib3hMYWJlbCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNoZWNrZWQtY29sb3IsIHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZDsKICAgICAgfQoKICAgICAgI2NoZWNrYm94TGFiZWw6ZGlyKHJ0bCkgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAwOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI2NoZWNrYm94IHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3hMYWJlbCAgewogICAgICAgIG9wYWNpdHk6IDAuNjU7CiAgICAgIH0KCiAgICAgIC8qIGludmFsaWQgc3RhdGUgKi8KICAgICAgI2NoZWNrYm94LmludmFsaWQ6bm90KC5jaGVja2VkKSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1lcnJvci1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJjaGVja2JveENvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9ImNoZWNrYm94IiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja2JveENsYXNzKGNoZWNrZWQsIGludmFsaWQpXV0iPgogICAgICAgIDxkaXYgaWQ9ImNoZWNrbWFyayIgY2xhc3MkPSJbW19jb21wdXRlQ2hlY2ttYXJrQ2xhc3MoY2hlY2tlZCldXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY2hlY2tib3hMYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tYTExeS1hbm5vdW5jZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgY2xpcDogcmVjdCgwcHgsMHB4LDBweCwwcHgpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBhcmlhLWxpdmUkPSJbW21vZGVdXSI+W1tfdGV4dF1dPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3QgaWQ9ImNvbnRlbnQiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC8qIFNoYXJlZCBTdHlsZXMgKi8KICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCAnTm90bycsIHNhbnMtc2VyaWY7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1leHBlbnNpdmUta2VybmluZzogewogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDogewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfTsKCiAgICAgIC8qIE1hdGVyaWFsIEZvbnQgU3R5bGVzICovCgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMTJweDsKICAgICAgICBmb250LXdlaWdodDogMzAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjA0NGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MzogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDU2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMjZlbTsKICAgICAgICBsaW5lLWhlaWdodDogNjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogNDVweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAzNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDFlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1oZWFkbGluZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxMmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXRpdGxlOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXN1YmhlYWQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY2FwdGlvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMTFlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1tZW51OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJ1dHRvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3Bhbj5bW19jaGFyQ291bnRlclN0cl1dPC9zcGFuPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU6IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIHRvIG1ha2UgYSBzdGFja2luZyBjb250ZXh0ICovCiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiBub25lOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1lcnJvciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtZXJyb3I7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6MDsKICAgICAgICByaWdodDowOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9OwogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9InBhcGVyLWRyb3Bkb3duLW1lbnUiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRyb3Bkb3duLW1lbnUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CgogICAgCiAgICA8c3BhbiByb2xlPSJidXR0b24iPjwvc3Bhbj4KICAgIDxwYXBlci1tZW51LWJ1dHRvbiBpZD0ibWVudUJ1dHRvbiIgdmVydGljYWwtYWxpZ249IltbdmVydGljYWxBbGlnbl1dIiBob3Jpem9udGFsLWFsaWduPSJbW2hvcml6b250YWxBbGlnbl1dIiBkeW5hbWljLWFsaWduPSJbW2R5bmFtaWNBbGlnbl1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbX2NvbXB1dGVNZW51VmVydGljYWxPZmZzZXQobm9MYWJlbEZsb2F0LCB2ZXJ0aWNhbE9mZnNldCldXSIgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgbm8tYW5pbWF0aW9ucz0iW1tub0FuaW1hdGlvbnNdXSIgb24taXJvbi1zZWxlY3Q9Il9vbklyb25TZWxlY3QiIG9uLWlyb24tZGVzZWxlY3Q9Il9vbklyb25EZXNlbGVjdCIgb3BlbmVkPSJ7e29wZW5lZH19IiBjbG9zZS1vbi1hY3RpdmF0ZSBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iPgogICAgICAKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciI+CiAgICAgICAgPHBhcGVyLXJpcHBsZT48L3BhcGVyLXJpcHBsZT4KICAgICAgICAKICAgICAgICA8cGFwZXItaW5wdXQgdHlwZT0idGV4dCIgaW52YWxpZD0iW1tpbnZhbGlkXV0iIHJlYWRvbmx5IGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW3ZhbHVlXV0iIHBsYWNlaG9sZGVyPSJbW3BsYWNlaG9sZGVyXV0iIGVycm9yLW1lc3NhZ2U9IltbZXJyb3JNZXNzYWdlXV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1thbHdheXNGbG9hdExhYmVsXV0iIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBsYWJlbD0iW1tsYWJlbF1dIj4KICAgICAgICAgIAogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJwYXBlci1kcm9wZG93bi1tZW51OmFycm93LWRyb3AtZG93biIgc3VmZml4IHNsb3Q9InN1ZmZpeCI+PC9pcm9uLWljb24+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICAgIDxzbG90IGlkPSJjb250ZW50IiBuYW1lPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij48L3Nsb3Q+CiAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWxpc3Rib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1saXN0Ym94LWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1saXN0Ym94LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbGlzdGJveDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0LCAucGFwZXItaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tbWluLWhlaWdodCwgNDhweCk7CiAgICAgICAgcGFkZGluZzogMHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5wYXBlci1pdGVtIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgYm9yZGVyOm5vbmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSksIC5wYXBlci1pdGVtW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tc2VsZWN0ZWQpLCAucGFwZXItaXRlbS5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBmb250LXdlaWdodDogdmFyKC0tcGFwZXItaXRlbS1zZWxlY3RlZC13ZWlnaHQsIGJvbGQpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLXNlbGVjdGVkOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSwgLnBhcGVyLWl0ZW1bZGlzYWJsZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1kaXNhYmxlZC1jb2xvciwgdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpLCAucGFwZXItaXRlbTpmb2N1cyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG91dGxpbmU6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZm9jdXNlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKTpiZWZvcmUsIC5wYXBlci1pdGVtOmZvY3VzOmJlZm9yZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKCiAgICAgICAgYmFja2dyb3VuZDogY3VycmVudENvbG9yOwogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIG9wYWNpdHk6IHZhcigtLWRhcmstZGl2aWRlci1vcGFjaXR5KTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmFja2VuZCI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtc3RvcmFnZSI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwsCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0LmlubGluZSB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbCB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAubGF5b3V0Lm5vLXdyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5mbGV4IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH0KCiAgICAgIC5mbGV4LWF1dG8gewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICAuZmxleC1ub25lIHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1yZXZlcnNlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbC1yZXZlcnNlLAogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQud3JhcC1yZXZlcnNlIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1hbGlnbm1lbnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBjcm9zcyBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5iYXNlbGluZSB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZW5kOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGRpc3RyaWJ1dGU7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZiBhbGlnbm1lbnQuCiAgICAgICAqLwogICAgICAuc2VsZi1zdGFydCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLWNlbnRlciB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5zZWxmLWVuZCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5zZWxmLXN0cmV0Y2ggewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9CgogICAgICAuc2VsZi1iYXNlbGluZSB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBtdWx0aS1saW5lIGFsaWdubWVudCBpbiBtYWluIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0LWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogc3RhcnQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuZW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZW5kOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGNlbnRlcjsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5iZXR3ZWVuLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazoganVzdGlmeTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBkaXN0cmlidXRlOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iZGFzaGJvYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0iaXJvbi1mbGV4Ij48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7CiAgICAgICAgLS1zaWRlYmFyLWxlZnQtcGFkZGluZzogMzBweDsKICAgICAgfQoKICAgICAgW3Nsb3Q9J3NpZGViYXInXSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogNXB4IDA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5zZXR0aW5ncyB7CiAgICAgICAgbWluLWhlaWdodDogNTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBsZWZ0OiB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSAqIDIpOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuc2VhcmNoLWlucHV0IHsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiB7CiAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kYXNoYm9hcmQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgPHNsb3QgbmFtZT0ic2lkZWJhciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY2VudGVyIj4KICAgICAgPHNsb3QgbmFtZT0iY2VudGVyIiBjbGFzcz0ic2NvbGxiYXIiPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzaWRlYmFyIHsKICAgICAgICBmbGV4OiAwIDAgdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzLCAyNSUpOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1tYXgtd2lkdGgsIDM1MHB4KTsKICAgICAgICBtaW4td2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGgsIDI3MHB4KTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAjY2VudGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0nY2VudGVyJ10pIHsKICAgICAgICBjb250YWluOiBzdHJpY3Q7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC50Zi1ncmFwaC1kYXNoYm9hcmQgI2NlbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW9wdGlvbi1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0id3JhcCI+CiAgICAgIDxoMz5bW25hbWVdXTwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlciI+PHNsb3Q+PC9zbG90PjwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKC5zZWxlY3RlZCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1jb2xsYXBzZSI+CgogIDx0ZW1wbGF0ZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICAvKiBTYWZhcmkgMTAgbmVlZHMgdGhpcyBwcm9wZXJ0eSBwcmVmaXhlZCB0byBjb3JyZWN0bHkgYXBwbHkgdGhlIGN1c3RvbSBwcm9wZXJ0eSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0taXJvbi1jb2xsYXBzZS10cmFuc2l0aW9uLWR1cmF0aW9uLCAzMDBtcyk7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLWNvbGxhcHNlLWNsb3NlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tY29sbGFwc2Utb3BlbmVkKSkgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wYW5lUmVuZGVyZWRdXSIgaWQ9ImlmUmVuZGVyZWQiPgogICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9Il90b2dnbGVQYW5lIiBvcGVuLWJ1dHRvbiQ9Iltbb3BlbmVkXV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3Bhbj5UYWdzIG1hdGNoaW5nIG11bHRpcGxlIGV4cGVyaW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiZuYnNwOzxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPlRhZ3MgbWF0Y2hpbmcgLzwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSI+W1tjYXRlZ29yeS5uYW1lXV08L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij4vPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNVbml2ZXJzYWxTZWFyY2hRdWVyeV1dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiAoYWxsIHRhZ3MpPC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IDxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSI+W1tjYXRlZ29yeS5uYW1lXV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY291bnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZV1dIj4KICAgICAgICAgICAgPHNwYW4+W1tfY291bnRdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImV4cGFuZC1tb3JlIiBjbGFzcz0iZXhwYW5kLWFycm93Ij48L2lyb24taWNvbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgICAKICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW29wZW5lZF1dIiBuby1hbmltYXRpb24+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICA8c3BhbiBpZD0idG9wLW9mLWNvbnRhaW5lciI+PC9zcGFuPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgaWQ9Iml0ZW1zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbnRyb2xzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAwIDVweCI+CiAgICAgICAgICAgICAgICBQYWdlCiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgaWQ9InBhZ2UtaW5wdXQiIHR5cGU9Im51bWJlciIgbm8tbGFiZWwtZmxvYXQgbWluPSIxIiBtYXg9IltbX3BhZ2VDb3VudF1dIiB2YWx1ZT0iW1tfcGFnZUlucHV0VmFsdWVdXSIgb24taW5wdXQ9Il9oYW5kbGVQYWdlSW5wdXRFdmVudCIgb24tY2hhbmdlPSJfaGFuZGxlUGFnZUNoYW5nZUV2ZW50IiBvbi1mb2N1cz0iX2hhbmRsZVBhZ2VGb2N1c0V2ZW50IiBvbi1ibHVyPSJfaGFuZGxlUGFnZUJsdXJFdmVudCI+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIG9mIFtbX3BhZ2VDb3VudF1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1QcmV2aW91c1BhZ2UiIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIj5QcmV2aW91cyBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDAgNXB4IDFweCAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6Zmlyc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpsYXN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuaGVhZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmhlYWRpbmc6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gLmV4cGFuZC1hcnJvdyB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVaKDE4MGRlZyk7CiAgICAgIH0KCiAgICAgIC5uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgIC5jYXRlZ29yeS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgcGFkZGluZzogMnB4IDA7CiAgICAgIH0KCiAgICAgIC5jb3VudCB7CiAgICAgICAgbWFyZ2luOiAwIDVweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWRpbmc6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZWRlZGU7CiAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsZXgtYmFzaXM6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgfQoKICAgICAgc2xvdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdpdGVtcyddKSB7CiAgICAgICAgLyogVG9vbHRpcCBmb3IgZGVzY3JpcHRpb25zIGFuZCBvdGhlcnMgYnJlYWsgd2l0aCBtb3JlIHN0cmljdCBvbmVzLiAqLwogICAgICAgIGNvbnRhaW46IHN0eWxlOwogICAgICB9CgogICAgICAjcGFnZS1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoLCAxMDAlKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDI0cHggNDBweDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItZGlhbG9nLWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLm5vLXBhZGRpbmcpIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3MKICAgICAgdG8gc2VsZWN0IGRpcmVjdCBjaGlsZHJlbiBvbmx5LCB3aGljaCBpbmNyZWFzZXMgdGhlIHdlaWdodCBvZiB0aGlzCiAgICAgIHNlbGVjdG9yLCBzbyB3ZSBoYXZlIHRvIHJlLWRlZmluZSBmaXJzdC1jaGlsZC9sYXN0LWNoaWxkIG1hcmdpbnMgYmVsb3cuICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC10aXRsZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIC8qIEFwcGx5IG1peGluIGFnYWluLCBpbiBjYXNlIGl0IHNldHMgbWFyZ2luLXRvcC4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tYm90dG9tLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5wYXBlci1kaWFsb2ctYnV0dG9ucyksCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDI0cHg7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZGlhbG9nLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+PGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiIgLz48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiIC8+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiIC8+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIgLz48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6IiAvPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiIgLz48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiIgLz48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6IiAvPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6IiAvPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6IiAvPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiIgLz48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6IiAvPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiIgLz48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiIC8+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIgLz48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiIgLz48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiIC8+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiIgLz48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiIC8+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiIgLz48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiIC8+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6IiAvPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiIgLz48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIgLz48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiIgLz48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiIgLz48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiIgLz48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiIC8+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiIgLz48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6IiAvPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6IiAvPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6IiAvPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6IiAvPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiIgLz48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6IiAvPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiIC8+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiIgLz48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiIgLz48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiIC8+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiIgLz48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6IiAvPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiIgLz48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6IiAvPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiIC8+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6IiAvPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiIgLz48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiIgLz48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6IiAvPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiIC8+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6IiAvPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiIC8+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiIC8+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiIC8+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiIC8+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6IiAvPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiIgLz48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiIC8+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiIC8+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiIC8+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiIC8+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiIgLz48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiIC8+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6IiAvPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiIgLz48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiIgLz48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiIC8+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiIC8+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiIC8+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiIC8+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiIgLz48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIgLz48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiIgLz48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiIgLz48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6IiAvPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiIgLz48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiIgLz48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6IiAvPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6IiAvPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiIC8+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiIgLz48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiIgLz48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiIgLz48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiIC8+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiIgLz48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6IiAvPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSIgLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSIgLz48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6IiAvPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiIgLz48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiIgLz48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiIC8+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiIC8+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiIC8+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0IiAvPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6IiAvPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiIgLz48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6IiAvPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiIgLz48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6IiAvPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiIC8+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6IiAvPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiIC8+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6IiAvPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiAvPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiIC8+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiIgLz48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiIgLz48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiIC8+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiIgLz48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6IiAvPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6IiAvPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6IiAvPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6IiAvPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiIgLz48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiIgLz48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6IiAvPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiIC8+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiIC8+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiIC8+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6IiAvPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiIC8+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6IiAvPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiIgLz48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6IiAvPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6IiAvPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6IiAvPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6IiAvPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiIC8+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6IiAvPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6IiAvPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiIC8+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiIgLz48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6IiAvPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiIC8+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiIC8+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiIgLz48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiIgLz48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6IiAvPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW11bHRpLWNoZWNrYm94Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InJ1bi1jb2xvci1zdHlsZSI+PC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQgaWQ9Im5hbWVzLXJlZ2V4IiBuby1sYWJlbC1mbG9hdCBsYWJlbD0iV3JpdGUgYSByZWdleCB0byBmaWx0ZXIgcnVucyIgdmFsdWU9IltbcmVnZXhdXSIgb24tYmluZC12YWx1ZS1jaGFuZ2VkPSJfZGVib3VuY2VkUmVnZXhDaGFuZ2UiPjwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGlkPSJvdXRlci1jb250YWluZXIiIGNsYXNzPSJzY3JvbGxiYXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW25hbWVzTWF0Y2hpbmdSZWdleF1dIiBvbi1kb20tY2hhbmdlPSJzeW5jaHJvbml6ZUNvbG9ycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmFtZS1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgY2hlY2tib3gtY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIiBpZCQ9ImNoZWNrYm94LVtbaXRlbV1dIiBuYW1lPSJbW2l0ZW1dXSIgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIiBvbi1jaGFuZ2U9Il9jaGVja2JveENoYW5nZSI+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJyYWRpby1idXR0b24tdW5jaGVja2VkIiBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIiBvbi10YXA9Il9pc29sYXRlTmFtZSIgbmFtZT0iW1tpdGVtXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgPHNwYW4+W1tpdGVtXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgI291dGVyLWNvbnRhaW5lciB7CiAgICAgICAgY29udGFpbjogY29udGVudDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLm5hbWUtcm93IHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgLyogbWFrZXMgd3JhcHBpbmcgb2YgaHlwZXJwYXJhbSBzdHJpbmdzIGJldHRlciAqLwogICAgICB9CiAgICAgIC5pY29uLWNvbnRhaW5lciB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC5jaGVja2JveCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvciB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQogICAgICAuaXNvbGF0b3ItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94LWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLml0ZW0tbGFiZWwtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDBweDsgLyogaGFjayB0byBnZXQgdGhlIGZsZXgtZ3JvdyB0byB3b3JrIHByb3Blcmx5ICovCiAgICAgIH0KICAgICAgLnRvb2x0aXAtdmFsdWUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAudmVydGljYWwtYWxpZ24tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLWNlbnRlciB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLXRvcCB7CiAgICAgICAgYWxpZ24tc2VsZjogc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi13YnItc3RyaW5nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3BhcnRzXV0iIGFzPSJwYXJ0Ij5bW3BhcnRdXTx3YnI+PC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXJ1bnMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iZGF0YS1sb2NhdGlvbi1kaWFsb2ciPgogICAgICA8aDI+RGF0YSBMb2NhdGlvbjwvaDI+CiAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW2RhdGFMb2NhdGlvbl1dIiBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIiAvPgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8ZGl2IGlkPSJ0b3AtdGV4dCI+CiAgICAgIDxoMyBpZD0idG9vbHRpcC1oZWxwIiBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPlJ1bnM8L2gzPgogICAgPC9kaXY+CiAgICA8dGYtbXVsdGktY2hlY2tib3ggaWQ9Im11bHRpQ2hlY2tib3giIG5hbWVzPSJbW3J1bnNdXSIgc2VsZWN0aW9uLXN0YXRlPSJ7e3J1blNlbGVjdGlvblN0YXRlfX0iIG91dC1zZWxlY3RlZD0ie3tzZWxlY3RlZFJ1bnN9fSIgcmVnZXg9Int7cmVnZXhJbnB1dH19IiBjb2xvcmluZz0iW1tjb2xvcmluZ11dIj48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX2NsaXBwZWREYXRhTG9jYXRpb25dXSIgZGVsaW1pdGVyLXBhdHRlcm49IltbX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm5dXSI+PC90Zi13YnItc3RyaW5nPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLWxpdGUiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGxvdHRhYmxlLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1jaGFydC10b29sdGlwIj4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1wYW4tem9vbS1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuaGVscCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IDFzOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMXM7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhZGUtb3V0OwogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CgogICAgICAuaGVscCA+IHNwYW4gewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQoKICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydDIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICAgIDx2ei1jaGFydC10b29sdGlwIGlkPSJ0b29sdGlwIiBwb3NpdGlvbj0iW1t0b29sdGlwUG9zaXRpb25dXSIgY29udGVudC1jb21wb25lbnQtbmFtZT0idnotbGluZS1jaGFydC10b29sdGlwIj48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dGhlYWQ+PC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICB0aGVhZCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICB0Ym9keSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIHRkIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgfQoKICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgfQoKICAgICAgLmNsb3Nlc3QgLnN3YXRjaCB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICNmZmY7CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuZGlzdGFudCB0ZDpub3QoLnN3YXRjaCkgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNjcm9sbGFibGUiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCguaXMtc2Nyb2xsZWQ6bm90KDpmaXJzdC1jaGlsZCkpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhbi1zY3JvbGw6bm90KC5zY3JvbGxlZC10by1ib3R0b20pOm5vdCg6bGFzdC1jaGlsZCkpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICAuc2Nyb2xsYWJsZSB7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtc2Nyb2xsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNjcm9sbGFibGUiIGNsYXNzPSJzY3JvbGxhYmxlIiBvbi1zY3JvbGw9InVwZGF0ZVNjcm9sbFN0YXRlIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbWFya2Rvd24tdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ibWFya2Rvd24iIGlubmVyLWgtdC1tLWw9IltbaHRtbF1dIj48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLyoKICAgICAgICogUmVkdWNlIHRvcG1vc3QgYW5kIGJvdHRvbW1vc3QgbWFyZ2lucyBmcm9tIDE2cHggdG8gMC4zZW0gKHJlbmRlcnMKICAgICAgICogYXQgYWJvdXQgNC44cHgpIHRvIGtlZXAgdGhlIGxheW91dCBjb21wYWN0LiBUaGlzIGltcHJvdmVzIHRoZQogICAgICAgKiBhcHBlYXJhbmNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgbGluZSBvZiB0ZXh0OyBzdGFuZGFyZCBNYXJrZG93bgogICAgICAgKiByZW5kZXJlcnMgd2lsbCBzdGlsbCBpbmNsdWRlIGEgYDxwPmAgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQnkgdGFyZ2V0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCwgZXh0cmVtYWwgZWxlbWVudHMsIHdlIHByZXNlcnZlIGFueQogICAgICAgKiBhY3R1YWwgcGFyYWdyYXBoIGJyZWFrcyBhbmQgb25seSBjaGFuZ2UgdGhlIHBhZGRpbmcgYWdhaW5zdCB0aGUKICAgICAgICogY29tcG9uZW50IGVkZ2VzLgogICAgICAgKi8KICAgICAgI21hcmtkb3duID4gcDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMC4zZW07CiAgICAgIH0KICAgICAgI21hcmtkb3duID4gcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjNlbTsKICAgICAgfQoKICAgICAgLyogUGxlYXNhbnQgc3R5bGVzIGZvciBNYXJrZG93biB0YWJsZXMuICovCiAgICAgICNtYXJrZG93biB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGggewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoLAogICAgICAjbWFya2Rvd24gdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZmUyZTU7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYzZjYmQxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRvd25sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0icnVuIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19ydW59fSI+CiAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcnVuc11dIj4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1bl1dIj4KICAgICAgPGEgZG93bmxvYWQ9IltbX2Nzdk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19jc3ZVcmwodGFnLCBfcnVuLCB1cmxGbildXSI+Q1NWPC9hPjxhIGRvd25sb2FkPSJbW19qc29uTmFtZSh0YWcsIF9ydW4pXV0iIGhyZWY9IltbX2pzb25VcmwodGFnLCBfcnVuLCB1cmxGbildXSI+SlNPTjwvYT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKV1dIiBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iIGRhdGEtdG8tbG9hZD0iW1tkYXRhVG9Mb2FkXV0iIGdldC1kYXRhLWxvYWQtbmFtZT0iW1tfZ2V0RGF0YUxvYWROYW1lXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iIHJlcXVlc3QtZGF0YT0iW1tyZXF1ZXN0RGF0YV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iIGxvYWQta2V5PSJbW3RhZ11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJhdXRvIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPHBhcGVyLW1lbnUtYnV0dG9uIG9uLXBhcGVyLWRyb3Bkb3duLW9wZW49Il91cGRhdGVEb3dubG9hZExpbmsiPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIiBpY29uPSJmaWxlLWRvd25sb2FkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICA8YSBpZD0ic3ZnTGluayIgZG93bmxvYWQ9IltbdGFnXV0uc3ZnIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIEN1cnJlbnQgQ2hhcnQgYXMgU1ZHCiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHRmLWRvd25sb2FkZXIgcnVucz0iW1tfcnVuc0Zyb21EYXRhKGRhdGFUb0xvYWQpXV0iIHRhZz0iW1t0YWddXSIgdXJsLWZuPSJbW19kb3dubG9hZFVybEZuXV0iPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXByb2dyZXNzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlbiQ9IltbX2hpZGVTZWNvbmRhcnlQcm9ncmVzcyhzZWNvbmRhcnlSYXRpbyldXSI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InByaW1hcnlQcm9ncmVzcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNsaWRlciI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS0zMDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodDogdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwgMnB4KTsKICAgICAgfQoKICAgICAgLyogZm9jdXMgc2hvd3MgdGhlIHJpcHBsZSAqLwogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IFRob3VnaCA6aG9zdC1jb250ZXh0IGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsIHNvbWUgcGFnZXMKICAgICAgICogc3RpbGwgcmVseSBvbiBwYXBlci1zbGlkZXIgYmVpbmcgZmxpcHBlZCB3aGVuIGRpcj0icnRsIiBpcyBzZXQgb24gYm9keS4gRm9yIGZ1bGwKICAgICAgICogY29tcGF0YWJpbGl0eSwgZGlyPSJydGwiIG11c3QgYmUgZXhwbGljaXRseSBzZXQgb24gcGFwZXItc2xpZGVyLgogICAgICAgKi8KICAgICAgOmRpcihydGwpICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIHJ1bGUgYWJvdmUgYmVjYXVzZSA6aG9zdC1jb250ZXh0IG1heQogICAgICAgKiBub3QgYmUgcmVjb2duaXplZC4KICAgICAgICovCiAgICAgIDpob3N0KFtkaXI9InJ0bCJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogTmVlZGVkIHRvIG92ZXJyaWRlIHRoZSA6aG9zdC1jb250ZXh0IHJ1bGUgKHdoZXJlIHN1cHBvcnRlZCkKICAgICAgICogdG8gc3VwcG9ydCBMVFIgc2xpZGVycyBpbiBSVEwgcGFnZXMuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJsdHIiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiAwOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyLmVkaXRhYmxlIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICAgIH0KCiAgICAgIC5iYXItY29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5yaW5nID4gLmJhci1jb250YWluZXIgewogICAgICAgIGxlZnQ6IGNhbGMoNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMThzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5yaW5nLmV4cGFuZC5kcmFnZ2luZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQ6bm90KC5waW4pID4gLmJhci1jb250YWluZXIgewogICAgICAgIGxlZnQ6IGNhbGMoOHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckJhciB7CiAgICAgICAgcGFkZGluZzogMTVweCAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1iYXItY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgfQoKICAgICAgLnNsaWRlci1tYXJrZXJzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiBjYWxjKDE0cHggKyB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LDJweCkvMik7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IC0xcHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgLnNsaWRlci1tYXJrZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CiAgICAgIC5zbGlkZXItbWFya2Vyczo6YWZ0ZXIsCiAgICAgIC5zbGlkZXItbWFya2VyOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7CiAgICAgICAgd2lkdGg6IDJweDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoLTE1cHggLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIHdpZHRoOiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICB9CgogICAgICAudHJhbnNpdGluZyA+IC5zbGlkZXIta25vYiB7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjA4cyBlYXNlOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2I6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnNuYXBzID4gLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKCiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICAgIH0KCiAgICAgIC5leHBhbmQ6bm90KC5waW4pID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgIH0KCiAgICAgIC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTNweDsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlIDUwJSA1MCUgMDsKCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUsCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5waW4ucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgIH0KCiAgICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiBhdHRyKHZhbHVlKTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTE2cHg7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWZvbnQtY29sb3IsICNmZmYpOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgIH0KCiAgICAgIC8qIHBhcGVyLWlucHV0ICovCiAgICAgIC5zbGlkZXItaW5wdXQgewogICAgICAgIHdpZHRoOiA1MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dC1jb250YWluZXItaW5wdXQ7CiAgICAgICAgfTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQ7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCiAgICAgICNzbGlkZXJDb250YWluZXIuZGlzYWJsZWQgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuZGlzYWJsZWQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2xpZGVyQ29udGFpbmVyIiBjbGFzcyQ9IltbX2dldENsYXNzTmFtZXMoZGlzYWJsZWQsIHBpbiwgc25hcHMsIGltbWVkaWF0ZVZhbHVlLCBtaW4sIGV4cGFuZCwgZHJhZ2dpbmcsIHRyYW5zaXRpbmcsIGVkaXRhYmxlKV1dIj4KICAgICAgPGRpdiBjbGFzcz0iYmFyLWNvbnRhaW5lciI+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpZD0ic2xpZGVyQmFyIiBhcmlhLWhpZGRlbj0idHJ1ZSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIHN0ZXA9Iltbc3RlcF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBzZWNvbmRhcnktcHJvZ3Jlc3M9Iltbc2Vjb25kYXJ5UHJvZ3Jlc3NdXSIgb24tZG93bj0iX2JhcmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX2JhcnRyYWNrIiBvbi10YXA9Il9iYXJjbGljayI+CiAgICAgICAgPC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc25hcHNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlcnMiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttYXJrZXJzXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VyIj48L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8ZGl2IGlkPSJzbGlkZXJLbm9iIiBjbGFzcz0ic2xpZGVyLWtub2IiIG9uLWRvd249Il9rbm9iZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfb25UcmFjayIgb24tdHJhbnNpdGlvbmVuZD0iX2tub2JUcmFuc2l0aW9uRW5kIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1rbm9iLWlubmVyIiB2YWx1ZSQ9IltbaW1tZWRpYXRlVmFsdWVdXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VkaXRhYmxlXV0iPgogICAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgY2xhc3M9InNsaWRlci1pbnB1dCIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIG9uLWNoYW5nZT0iX2NoYW5nZVZhbHVlIiBvbi1rZXlkb3duPSJfaW5wdXRLZXlEb3duIiBuby1sYWJlbC1mbG9hdD4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtc21vb3RoaW5nLWlucHV0Ij4KICA8dGVtcGxhdGU+CiAgICA8aDMgY2xhc3M9InRpdGxlIj5TbW9vdGhpbmc8L2gzPgogICAgPGRpdiBjbGFzcz0ic21vb3RoaW5nLWJsb2NrIj4KICAgICAgPHBhcGVyLXNsaWRlciBpZD0ic2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7X2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyfX0iIG1heD0iW1ttYXhdXSIgbWluPSJbW21pbl1dIiBwaW4gc3RlcD0iW1tzdGVwXV0iIHR5cGU9Im51bWJlciIgdmFsdWU9Int7d2VpZ2h0fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiBsYWJlbD0id2VpZ2h0IiBuby1sYWJlbC1mbG9hdCB2YWx1ZT0ie3tfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0fX0iIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIj48L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAuc21vb3RoaW5nLWJsb2NrIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9InNob3ctZG93bmxvYWQtbGlua3MiIGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iaWdub3JlLXktb3V0bGllciIgY2hlY2tlZD0ie3tfaWdub3JlWU91dGxpZXJzfX0iPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVmYXVsdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5uZWFyZXN0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1zbW9vdGhpbmctaW5wdXQgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIgc3RlcD0iMC4wMDEiIG1pbj0iMCIgbWF4PSIwLjk5OSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgZGF0YS10by1sb2FkPSJbW2l0ZW0uc2VyaWVzXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgbXVsdGktZXhwZXJpbWVudHM9IltbX2dldE11bHRpRXhwZXJpbWVudHMoZGF0YVNlbGVjdGlvbildXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShjYXRlZ29yeSwgX3J1blRvVGFnSW5mbywgaXRlbSldXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbX3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSI+PC90Zi1zY2FsYXItY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgLmNlbnRlciB7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgfQoKICAgICAgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMTlweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNidXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihtYXJnaW5DaGFydFNlcmllcyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0iZGF0YVNlcmllc05hbWUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IiBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkNTVjwvYT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIiBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5KU09OPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbiIgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iIGFzPSJ0YWciPgogICAgICAgICAgICAgICAgICA8bGk+W1t0YWddXTwvbGk+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0ZpbHRlckludmFsaWRdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGlzIHJlZ3VsYXIgZXhwcmVzaW9uIGlzIGludmFsaWQ6PGJyPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9InNlcmllc05hbWUiIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuZXJyb3ItY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogI2YwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIG1hcmdpbjogMCBhdXRvIDVweCBhdXRvOwogICAgICB9CgogICAgICAuaW52YWxpZC1yZWdleCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5lcnJvci1jb250ZW50IHVsIHsKICAgICAgICBtYXJnaW46IDFweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxOXB4OwogICAgICB9CgogICAgICAudGFnLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS10aXRsZS10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5taXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogOHB4IDAgMCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e190b29sdGlwU29ydGluZ01ldGhvZH19Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2F0ZWdvcmllcy1jb250YWluZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPlRoZSBjdXN0b20gc2NhbGFycyBkYXNoYm9hcmQgaXMgaW5hY3RpdmUuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgYXM9ImNoYXJ0IiBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBkaXNhYmxlLXBhZ2luYXRpb24gaW5pdGlhbC1vcGVuZWQ9IltbY2F0ZWdvcnkubWV0YWRhdGEub3BlbmVkXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tdWx0aWxpbmVdXSI+CiAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm1hcmdpbl1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaW1hZ2UtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2PnNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbX3RvTG9jYWxlU3RyaW5nKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBkYXRldGltZSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzSW1hZ2VMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KCiAgICAKICAgIDxhIGlkPSJtYWluLWltYWdlLWNvbnRhaW5lciIgcm9sZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJUb2dnbGUgYWN0dWFsIHNpemUiIGFyaWEtZXhwYW5kZWQkPSJbW19nZXRBcmlhRXhwYW5kZWQoYWN0dWFsU2l6ZSldXSIgb24tdGFwPSJfaGFuZGxlVGFwIj48L2E+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC8qKiBNYWtlIGJ1dHRvbiBhIGRpdi4gKi8KICAgICAgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogR2V0IHJpZCBvZiBkb3R0ZWQgbGluZSBpbnNpZGUgYnV0dG9uLiAqLwogICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogU2ltdWxhdGUgQ2hyb21lJ3Mgb3V0ZXIgZ2xvdyBvbiBidXR0b24gd2hlbiBmb2N1c2VkLiAqLwogICAgICBidXR0b246LW1vei1mb2N1c3JpbmcgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggMnB4IEhpZ2hsaWdodDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMCAxNXB4IDQwcHggMDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAvKiogV2hlbiBhY3R1YWwgc2l6ZSBzaG93biBpcyBvbiwgdXNlIHRoZSBhY3R1YWwgaW1hZ2Ugd2lkdGguICovCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLXNwaW5uZXItbGl0ZSB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIC8qCiAgICAgICAgICogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZQogICAgICAgICAqIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcgMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMKICAgICAgICAgKiB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLCBhbmQKICAgICAgICAgKiBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mCiAgICAgICAgICogdGhlIGltYWdlLiAzMCAtIDEgKyAyLgogICAgICAgICAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogMTAyNHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiAtbW96LWNyaXNwLWVkZ2VzOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19hY3R1YWxTaXplfX0iPlNob3cgYWN0dWFsIGltYWdlIHNpemU8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+QnJpZ2h0bmVzcyBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSIyIiBzbmFwcyBwaW4gc3RlcD0iMC4wMSIgdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iIGltbWVkaWF0ZS12YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0QnJpZ2h0bmVzcyIgZGlzYWJsZWQ9IltbX2JyaWdodG5lc3NJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIiPgogICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjUwMCIgc25hcHMgcGluIHN0ZXA9IjEiIHZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYXVkaW8tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IgaWQ9InJ1bnMtc2VsZWN0b3IiIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij48L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gYXVkaW8gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGF1ZGlvIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtYXVkaW8tbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgdG90YWwtc2FtcGxlcz0iW1tpdGVtLnRvdGFsU2FtcGxlc11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIC1tb3otYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0YXJlYTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAubWlycm9yLXRleHQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgICAgdGV4dGFyZWEgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICByZXNpemU6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAvKiBzZWUgY29tbWVudHMgaW4gdGVtcGxhdGUgKi8KICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0OwogICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYTsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWEtcGxhY2Vob2xkZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgCiAgICAKICAgIDxkaXYgaWQ9Im1pcnJvciIgY2xhc3M9Im1pcnJvci10ZXh0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+CgogICAgCiAgICA8ZGl2IGNsYXNzPSJ0ZXh0YXJlYS1jb250YWluZXIgZml0Ij4KICAgICAgPHRleHRhcmVhIGlkPSJ0ZXh0YXJlYSIgbmFtZSQ9IltbbmFtZV1dIiBhcmlhLWxhYmVsJD0iW1tsYWJlbF1dIiBhdXRvY29tcGxldGUkPSJbW2F1dG9jb21wbGV0ZV1dIiBhdXRvZm9jdXMkPSJbW2F1dG9mb2N1c11dIiBpbnB1dG1vZGUkPSJbW2lucHV0bW9kZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgcm93cyQ9Iltbcm93c11dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIj48L3RleHRhcmVhPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci10ZXh0YXJlYSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBsYWJlbCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWlucHV0LWNvbnRhaW5lciBuby1sYWJlbC1mbG9hdCQ9Iltbbm9MYWJlbEZsb2F0XV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1tfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWwoYWx3YXlzRmxvYXRMYWJlbCxwbGFjZWhvbGRlcildXSIgYXV0by12YWxpZGF0ZSQ9IltbYXV0b1ZhbGlkYXRlXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBpbnZhbGlkPSJbW2ludmFsaWRdXSI+CgogICAgICA8bGFiZWwgaGlkZGVuJD0iW1shbGFiZWxdXSIgYXJpYS1oaWRkZW49InRydWUiIGZvciQ9IltbX2lucHV0SWRdXSIgc2xvdD0ibGFiZWwiPltbbGFiZWxdXTwvbGFiZWw+CgogICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcz0icGFwZXItaW5wdXQtaW5wdXQiIHNsb3Q9ImlucHV0IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3IkPSJbW3ZhbGlkYXRvcl1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbmFtZSQ9IltbbmFtZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIHJlcXVpcmVkJD0iW1tyZXF1aXJlZF1dIiBtaW5sZW5ndGgkPSJbW21pbmxlbmd0aF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBhdXRvY2FwaXRhbGl6ZSQ9IltbYXV0b2NhcGl0YWxpemVdXSIgcm93cyQ9Iltbcm93c11dIiBtYXgtcm93cyQ9IltbbWF4Um93c11dIiBvbi1jaGFuZ2U9Il9vbkNoYW5nZSI+PC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtbWluaW1hcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGxpbmVhcjsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoLmhpZGRlbikgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIGNhbnZhcyB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKICAgICAgfQoKICAgICAgcmVjdCB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjMTExMTExOwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWx0ZXI6IHVybCgjbWluaW1hcERyb3BTaGFkb3cpOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3ZnPgogICAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJtaW5pbWFwRHJvcFNoYWRvdyIgeD0iLTIwJSIgeT0iLTIwJSIgd2lkdGg9IjE1MCUiIGhlaWdodD0iMTUwJSI+CiAgICAgICAgICA8ZmVvZmZzZXQgcmVzdWx0PSJvZmZPdXQiIGluPSJTb3VyY2VHcmFwaGljIiBkeD0iMSIgZHk9IjEiPjwvZmVvZmZzZXQ+CiAgICAgICAgICA8ZmVjb2xvcm1hdHJpeCByZXN1bHQ9Im1hdHJpeE91dCIgaW49Im9mZk91dCIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuNSAwIj48L2ZlY29sb3JtYXRyaXg+CiAgICAgICAgICA8ZmVnYXVzc2lhbmJsdXIgcmVzdWx0PSJibHVyT3V0IiBpbj0ibWF0cml4T3V0IiBzdGRkZXZpYXRpb249IjIiPjwvZmVnYXVzc2lhbmJsdXI+CiAgICAgICAgICA8ZmVibGVuZCBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJibHVyT3V0IiBtb2RlPSJub3JtYWwiPjwvZmVibGVuZD4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICA8cmVjdD48L3JlY3Q+CiAgICA8L3N2Zz4KICAgIDxjYW52YXMgY2xhc3M9ImZpcnN0Ij48L2NhbnZhcz4KICAgIAogICAgPGNhbnZhcyBjbGFzcz0ic2Vjb25kIj48L2NhbnZhcz4KICAgIDxjYW52YXMgY2xhc3M9ImRvd25sb2FkIj48L2NhbnZhcz4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBuby1jYW5jZWwtb24tb3V0c2lkZS1jbGljayBuby1jYW5jZWwtb24tZXNjLWtleSBvcGVuZWQ9Int7X29wZW59fSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzQ3VzdG9tTWVzc2FnZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSI+CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL1Nlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPnRmLlNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKc2VzcyA9IHRmLlNlc3Npb24oKQpzZXNzID0gdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHNlc3MsICJbW19ob3N0XV06W1tfcG9ydF1dIikKc2Vzcy5ydW4obXlfZmV0Y2hlcykKICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9wcm9ncmFtbWVyc19ndWlkZS9lc3RpbWF0b3JzIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Fc3RpbWF0b3I8L2E+CiAgICAgICAgICAgICAgfAogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi90cmFpbi9Nb25pdG9yZWRTZXNzaW9uIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj5Nb25pdG9yZWRTZXNzaW9uPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKCmhvb2sgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnSG9vaygiW1tfaG9zdF1dOltbX3BvcnRdXSIpCm15X2VzdGltYXRvci5maXQoeD14X2RhdGEsIHk9eV9kYXRhLCBzdGVwcz0xMDAwLCBtb25pdG9ycz1baG9va10pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2tlcmFzLmlvL21vZGVscy9tb2RlbC8iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPktlcmFzIE1vZGVsPC9hPjoKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvZGUtc25pcHBldCI+aW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKZnJvbSB0ZW5zb3JmbG93LnB5dGhvbiBpbXBvcnQgZGVidWcgYXMgdGZfZGVidWcKaW1wb3J0IGtlcmFzCgprZXJhcy5iYWNrZW5kLnNldF9zZXNzaW9uKAogICAgdGZfZGVidWcuVGVuc29yQm9hcmREZWJ1Z1dyYXBwZXJTZXNzaW9uKHRmLlNlc3Npb24oKSwgIltbX2hvc3RdXTpbW19wb3J0XV0iKSkKIyBEZWZpbmUgeW91ciBrZXJhcyBtb2RlbCwgY2FsbGVkICJtb2RlbCIuCm1vZGVsLmZpdCguLi4pCiAgICAgICAgICAgIDwvcHJlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZT4KICAgICAgLyoqIFdlIHJlbHkgb24gYSBzZXBhcmF0ZSBgX2hpZGRlbmAgcHJvcGVydHkgaW5zdGVhZCBvZiBkaXJlY3RseSBtYWtpbmcgdXNlCiAgICAgICAgICBvZiB0aGUgYF9vcGVuYCBhdHRyaWJ1dGUgYmVjYXVzZSB0aGlzIENTUyBzcGVjaWZpY2F0aW9uIG1heSBzdHJhbmdlbHkKICAgICAgICAgIGFmZmVjdCBvdGhlciBlbGVtZW50cyB0aHJvdWdob3V0IFRlbnNvckJvYXJkLiBTZWUgIzg5OS4gKi8KICAgICAgOmhvc3QoW19oaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICA6aG9zdCwKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICB9CgogICAgICAuY29kZS1leGFtcGxlIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgfQogICAgICAuY29kZS1leGFtcGxlLXNlY3Rpb24gewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmNvZGUtc25pcHBldCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLXJlc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImJhcnMiPgogICAgICA8ZGl2IGNsYXNzPSJiYXJzLXJvdGF0b3IiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYXJzLXRleHQiPnwgfDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW19yZXNpemVyLWlkZW50aWZpZXJdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpcy1ob3Jpem9udGFsXSkgewogICAgICAgIGN1cnNvcjogcm93LXJlc2l6ZTsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW19pcy12ZXJ0aWNhbF0pIHsKICAgICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgICAgcmlnaHQ6IC0xNXB4OwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5iYXJzIHsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICB9CgogICAgICAvKiogVGhpcyBibG9jayBwcmV2ZW50cyB0aGUgYmFycyByb3RhdG9yIGZyb20gaGF2aW5nIGEgaGVpZ2h0IHRoYXQgaXMKICAgICAgICAgIHRoZSBlbnRpcmUgdmlld3BvcnQsIHRodXMgb2NjbHVkaW5nIGl0IGFuZCBnaXZpbmcgaXQgYW4gdW5kZXNpcmVkIGN1cnNvcgogICAgICAgICAgdmFsdWUuICovCiAgICAgIC5iYXJzLXJvdGF0b3IgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSAuYmFycy1yb3RhdG9yIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7CiAgICAgIH0KCiAgICAgIC5iYXJzLXRleHQgewogICAgICAgIHRyYW5zZm9ybTogc2NhbGVZKDE1KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0Ym9keT48dHIgYWxpZ249ImxlZnQiPgogICAgICAgICAgPHRoPkZlZWRzPC90aD4KICAgICAgICAgIDx0aD5GZXRjaGVzPC90aD4KICAgICAgICAgIDx0aD5UYXJnZXRzPC90aD4KICAgICAgICAgIDx0aD4jKERldmljZXMpPC90aD4KICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgPC90cj4KICAgICAgPC90Ym9keT48L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRlbnNvci13aWRnZXQtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8dnotbGluZS1jaGFydDIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW19saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX2xpbmVDaGFydFRvb2x0aXBDb2x1bW5zXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19saW5lQ2hhcnRTbW9vdGhpbmdFbmFibGVkXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICA8c3R5bGU+CiAgICAgIHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dGJvZHk+PHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIGlkPSJ0ZW5zb3ItbmFtZSIgb24tdGFwPSJ0ZW5zb3JOYW1lQ2FsbGJhY2siPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0ZW5zb3ItbmFtZS10ZXh0Ij5bW3RlbnNvck5hbWVdXTwvc3Bhbj4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iY2xvc2UiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNsb3NlIiBvbi10YXA9ImNsb3NlQnV0dG9uQ2FsbGJhY2siPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJmb3J3YXJkIiBjbGFzcz0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgaWQ9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIHRpdGxlPSJDb250aW51ZSB0byIgb24tdGFwPSJjb250aW51ZVRvQnV0dG9uQ2FsbGJhY2siPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InRlbnNvci12YWx1ZS12YWx1ZS10ciI+CiAgICAgICAgPHRkPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW191c2VUZW5zb3JXaWRnZXRdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRlbnNvci13aWRnZXQiPjwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV91c2VUZW5zb3JXaWRnZXRdXSI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIGlkPSJkZWJ1Zy1vcCI+PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0iaW5saW5lIHZhbHVlLWNhcmQtaW5wdXQiIGxhYmVsPSJTbGljaW5nIiBpZD0ic2xpY2luZyIgdmFsdWU9Int7c2xpY2luZ319IiBvbi1jaGFuZ2U9InJlZnJlc2giPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBjbGFzcz0iaW5saW5lIHZhbHVlLWNhcmQtaW5wdXQiIGxhYmVsPSJUaW1lIEluZGljZXMiIGlkPSJ0aW1lLWluZGljZXMiIHZhbHVlPSJ7e3RpbWVJbmRpY2VzfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9InRpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIiBjbGFzcz0idGVuc29yLXZhbHVlLWJ1dHRvbnMiIG9uLWNsaWNrPSJfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjayI+RnVsbCBIaXN0b3J5PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgIDwvZGl2PjwvdGVtcGxhdGU+PC90ZD48dGQgY2xhc3M9InRlbnNvci12YWx1ZS12aWV3LXRkIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNWYWx1ZVNjYWxhcl1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUiIGxhYmVsPSJTY2FsYXIgVmFsdWUiIGlkPSJ2YWx1ZS1zY2FsYXIiIHZhbHVlPSJbW19kYXRhU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNWYWx1ZUxpbmVDaGFydF1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQgZGF0YT0iW1tfbGluZUNoYXJ0RGF0YV1dIj48L3RmLWRlYnVnZ2VyLWxpbmUtY2hhcnQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlSW1hZ2VdXSI+CiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9InZhbHVlLWltYWdlIiBoZWlnaHQ9IjI1MHB4IiB3aWR0aD0iMjUwcHgiIHNyYyQ9IltbX2RhdGFJbWFnZVNyY11dIj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgCiAgICAgICAgICAKICAgICAgICAKICAgICAgPC90cj4KICAgIDwvdGJvZHk+PC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFthbmltYXRlZF0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctdHJhbnNpdGlvbjsKICAgICAgfQogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgaDIgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDEwcHggMTBweCAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLmNvbG9yLXByZXZpZXcgewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbjogMCAxMHB4IDAgMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1sYWJlbCwKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC50ZW5zb3ItY291bnQgewogICAgICAgIGNvbG9yOiAjNzc3OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNnB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcKICAgKiAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducyB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLAogICAqIGFuZCBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgKiBBcHBhcmVudGx5LCB0aGUgcGFwZXItc2xpZGVyIGxhY2tzIGEgbWl4aW4gZm9yIHRob3NlIHBhZGRpbmcgdmFsdWVzLiAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxscy1sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgdGQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgd2lkdGg6IDgwcHg7CiAgICAgIH0KCiAgICAgIC50ZW5zb3ItZGV2aWNlLXRkIHsKICAgICAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsIHsKICAgICAgICB3aWR0aDogMTMwcHg7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsID4gZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAjZXZlbnQtY291bnRzLXRoIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMTQxLCAwKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigwLCA2MiwgMjEyKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyMDQsIDQ3LCA0NCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uLAogICAgICAucG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAxMHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQgaGVhbHRoLXBpbGwtbGVnZW5kIj4KICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgIEVuYWJsZSBhbGwgKG5vdCBqdXN0IHNhbXBsZWQpIHN0ZXBzLiBSZXF1aXJlcyBzbG93IGRpc2sgcmVhZC4KICAgICAgPC9kaXY+CiAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGlkPSJlbmFibGVBbGxTdGVwc01vZGVUb2dnbGUiIGNoZWNrZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19Ij4KICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8aDI+CiAgICAgICAgU3RlcCBvZiBIZWFsdGggUGlsbHM6CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQiIG1pbj0iMCIgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXA6OmlucHV0fX0iPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgW1tfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWVdXQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iIGlkPSJoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIj48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iPjwvcGFwZXItc2xpZGVyPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tYXhTdGVwSW5kZXhdXSI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8aDI+CiAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIENvdW50cyBmb3IgU2VsZWN0ZWQgTm9kZQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgTGVnZW5kCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1toZWFsdGhQaWxsRW50cmllc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1lbnRyeSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1wcmV2aWV3IiBzdHlsZT0iYmFja2dyb3VuZDpbW2l0ZW0uYmFja2dyb3VuZF9jb2xvcl1dIj48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxhYmVsIj5bW2l0ZW0ubGFiZWxdXTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idGVuc29yLWNvdW50Ij4KICAgICAgICAgICAgW1tfY29tcHV0ZVRlbnNvckNvdW50U3RyaW5nKGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUsCiAgICAgICAgICAgIGluZGV4KV1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBoaWRkZW4kPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPGgyIGlkPSJudW1lcmljLWFsZXJ0cy1oZWFkZXIiPk51bWVyaWMgQWxlcnRzPC9oMj4KICAgICAgICA8cD4KICAgICAgICAgIEFsZXJ0cyBhcmUgc29ydGVkIGZyb20gdG9wIHRvIGJvdHRvbSBieSBpbmNyZWFzaW5nIHRpbWVzdGFtcC4KICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIDwvcD4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLWJvZHkiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47IC8qIG5lZWRlZCBmb3IgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgdG8gd29yayBvbiBmZiAqLwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R3by1saW5lXSkgewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS10d28tbGluZS1taW4taGVpZ2h0LCA3MnB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoW3RocmVlLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXRocmVlLWxpbmUtbWluLWhlaWdodCwgODhweCk7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKFtzZWNvbmRhcnldKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnktY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMDsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QgewogICAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLWVsbGlwc2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QsCiAgICAgIC5mYWRlZC1lbGxpcHNlLAogICAgICAuZmFkZWQtc2VyaWVzIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLWdyYXBoLWZhZGVkKSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgCiAgICA8c3ZnIGhlaWdodD0iMCIgd2lkdGg9IjAiIGlkPSJzdmdEZWZzIj4KICAgICAgPGRlZnM+CiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1zdGFtcCIgcng9IjcuNSIgcnk9IjMiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZWxsaXBzZSBpZD0ib3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiByeD0iNSIgcnk9IjIiIHN0cm9rZT0iaW5oZXJpdCIgZmlsbD0iaW5oZXJpdCIgLz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjkiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iMyIgLz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjE2IiB5PSI0IiAvPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTIiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0IiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ic3VtbWFyeS1pY29uIiBmaWxsPSIjODQ4NDg0IiBoZWlnaHQ9IjEyIiB2aWV3Ym94PSIwIDAgMjQgMjQiIHdpZHRoPSIxMiI+CiAgICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICAgIDwvZz4KICAgICAgPC9kZWZzPgogICAgPC9zdmc+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnQ09OU1QnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTAgMTAiPgogICAgICAgIDxjaXJjbGUgY3g9IjUiIGN5PSI1IiByPSIzIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NVTU1BUlknKV1dIj4KICAgICAgPHN2ZyB3aWR0aCQ9IltbaGVpZ2h0XV0iIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHZpZXdib3g9IjAgMCAyNCAyNCIgZmlsbD0iIzg0ODQ4NCI+CiAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ09QJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE2IDgiPgogICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnZWxsaXBzZScpfX0iIHg9IjgiIHk9IjQiIC8+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdNRVRBJyldXSI+CiAgICAgIDxzdmcgaGVpZ2h0JD0iW1toZWlnaHRdXSIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDM3IDE2Ij4KICAgICAgICA8cmVjdCB4PSIxIiB5PSIxIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAncmVjdCcpfX0iIHN0cm9rZS13aWR0aD0iMnB4IiBoZWlnaHQ9IjE0IiB3aWR0aD0iMzUiIHJ4PSI1IiByeT0iNSIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NFUklFUycpXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgMTUiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCIgZmlsbCQ9IltbX2ZpbGxdXSIgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iIHg9IjAiIHk9IjIiIC8+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMjQgMTAiPgogICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMSIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1pY29uIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIC0tdGItZ3JhcGgtZmFkZWQ6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1ncmFwaC1pY29uIGlkPSJpY29uIiB0eXBlPSJbW19nZXRUeXBlKG5vZGUsIHN1bW1hcnksIGNvbnN0LCB0eXBlKV1dIiBoZWlnaHQ9IltbaGVpZ2h0XV0iIGZpbGwtb3ZlcnJpZGU9IltbX2ZpbGxPdmVycmlkZV1dIiBzdHJva2Utb3ZlcnJpZGU9IltbX2dldFN0cm9rZU92ZXJyaWRlKF9maWxsT3ZlcnJpZGUpXV0iIGZhZGVkPSJbW19nZXRGYWRlZChyZW5kZXJJbmZvKV1dIiB2ZXJ0aWNhbD0iW1tfaXNWZXJ0aWNhbChub2RlLCB2ZXJ0aWNhbCldXSI+PC90Zi1ncmFwaC1pY29uPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9Imxpc3QtaXRlbSIgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIiBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbiBjbGFzcz0ibm9kZS1pY29uIiBoZWlnaHQ9IjEyIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIG5vZGU9IltbaXRlbU5vZGVdXSIgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICA8L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIC5pbmNvbXBhdGlibGUtb3BzLWxpc3QgewogICAgICAgIGhlaWdodDogMzUwcHg7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgaXJvbi1saXN0IHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtZGlzcGxheSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIHN2Zy5vcC1jb21wYXQgewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtdmFsdWUgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj5bW25vZGVUaXRsZV1dPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzZWNvbmRhcnk+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC1kaXNwbGF5Ij4KICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJvcC1jb21wYXQiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNTAgMjUiPgogICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ib3AtY29tcGF0LWZpbGwiPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yIF1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgIDwvbGluZWFyZ3JhZGllbnQ+CiAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICA8cmVjdCBoZWlnaHQ9IjI1IiB3aWR0aD0iMjUwIiByeD0iNSIgcnk9IjUiIHN0eWxlPSJmaWxsOiB1cmwoJyNvcC1jb21wYXQtZmlsbCcpOyIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcC1jb21wYXQtdmFsdWUiPltbX29wQ29tcGF0U2NvcmVMYWJlbF1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgoKICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIEluY29tcGF0aWJsZSBPcGVyYXRpb25zOiAoPHNwYW4+W1tfdG90YWxJbmNvbXBhdE9wc11dPC9zcGFuPikKICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9ImluY29tcGF0aWJsZS1vcHMtbGlzdCIgaWQ9ImluY29tcGF0aWJsZU9wc0xpc3QiIGl0ZW1zPSJbW19pbmNvbXBhdGlibGVPcE5vZGVzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgaXRlbS1ub2RlPSJbW2l0ZW1dXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhpdGVtLm5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBpdGVtLXR5cGU9ImluY29tcGF0aWJsZS1vcHMiPgogICAgICAgICAgICAgIDwvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9pcm9uLWNvbGxhcHNlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtbGlzdC1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICNsaXN0LWl0ZW0gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLmNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiA0MHB4OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtLmV4Y2x1ZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4uZWRnZS1sYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxcHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICB9CgogICAgICAuZmFkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9Imxpc3QtaXRlbSIgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIiBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbiBjbGFzcz0ibm9kZS1pY29uIiBoZWlnaHQ9IjEyIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIG5vZGU9IltbaXRlbU5vZGVdXSIgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIj48L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWRnZS1sYWJlbCI+W1tlZGdlTGFiZWxdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWluZm8iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnN1Yi1saXN0LWdyb3VwIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogOHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgfQoKICAgICAgLmF0dHItbGVmdCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5hdHRyLXJpZ2h0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgLnN1Yi1saXN0LXRhYmxlLWNlbGw6bGFzdC1jaGlsZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1jZWxsIHsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbS1ib2R5W3R3by1saW5lXSB7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweCA0cHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmRlZEluZm8gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICB9CgogICAgICAuY29udHJvbERlcHMgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQoKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgY29sb3I6ICM1ZTVlNWU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sTGluZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlLWdyb3VwIHsKICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUgewogICAgICAgIG1hcmdpbjogNXB4IDZweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIgY2xhc3M9InRvZ2dsZS1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vZGUtbmFtZSI+CiAgICAgICAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW19ub2RlLm5hbWVdXSIgZGVsaW1pdGVyLXBhdHRlcm49Ii8iIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOjpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jbG9zZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBsZWZ0OiAxNXB4OwogICAgICAgIGJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZyB7CiAgICAgICAgY3Vyc29yOiBwcm9ncmVzczsKICAgICAgICBvcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZy5lcnJvciB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICB9CgogICAgICAjaW5mbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA1cHg7CiAgICAgICAgdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMjBweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgICNtYWluIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1tc2cgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICB9CgogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOb3RDb21wbGV0ZShwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3MkPSJbW19nZXRDb250YWluZXJDbGFzcyhwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9Im1haW4iPgogICAgICAgIDx0Zi1ncmFwaCBpZD0iZ3JhcGgiIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IiBiYXNpYy1ncmFwaD0iW1tncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IiBkZXZpY2VzLWZvci1zdGF0cz0iW1tkZXZpY2VzRm9yU3RhdHNdXSIgc3RhdHM9Iltbc3RhdHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcHJvZ3Jlc3M9Int7cHJvZ3Jlc3N9fSIgZWRnZS1sYWJlbC1mdW5jdGlvbj0iW1tlZGdlTGFiZWxGdW5jdGlvbl1dIiBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1toZWFsdGhQaWxsU3RlcEluZGV4XV0iIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIiBoYW5kbGUtZWRnZS1zZWxlY3RlZD0iW1toYW5kbGVFZGdlU2VsZWN0ZWRdXSIgdHJhY2UtaW5wdXRzPSJbW3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbyBpZD0iZ3JhcGgtaW5mbyIgdGl0bGU9InNlbGVjdGVkIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZ3JhcGg9IltbZ3JhcGhdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgc2VsZWN0ZWQtbm9kZS1pbmNsdWRlPSJ7e19zZWxlY3RlZE5vZGVJbmNsdWRlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tkZWJ1Z2dlckRhdGFFbmFibGVkXV0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iIG9uLW5vZGUtdG9nZ2xlLWluY2x1c2lvbj0iX29uTm9kZUluY2x1c2lvblRvZ2dsZWQiIG9uLW5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwPSJfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkIj48L3RmLWdyYXBoLWluZm8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZSBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNyYWRpb0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgICAgIH0KCiAgICAgICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im9mZlJhZGlvIj48L2Rpdj4KICAgICAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJyYWRpb0xhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItcmFkaW8tZ3JvdXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCopIHsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1wYXBlci1yYWRpby1ncm91cC1pdGVtLXBhZGRpbmcsIDEycHgpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2x0aXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtbm9kZS1zZWFyY2giPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNlYXJjaC1jb250YWluZXIiPgogICAgICA8cGFwZXItaW5wdXQgaWQ9InJ1bnMtcmVnZXgiIGxhYmVsPSJTZWFyY2ggbm9kZXMuIFJlZ2V4ZXMgc3VwcG9ydGVkLiIgdmFsdWU9Int7X3Jhd1JlZ2V4SW5wdXR9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzLWFuY2hvciI+CiAgICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcmVnZXhNYXRjaGVzXV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtbWF0Y2giIG9uLWNsaWNrPSJfbWF0Y2hDbGlja2VkIj5bW2l0ZW1dXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgI3NlYXJjaC1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjcnVucy1yZWdleCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cy1hbmNob3IgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2ggewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXJlY3Rpb246IHJ0bDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXdlYWspOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWNvbnRyb2xzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXQ6IHsKICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgICB9CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDE1cHg7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxNXB4OwogICAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiBncmF5OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzMHB4OwogICAgICB9CgogICAgICBwYXBlci1idXR0b25bcmFpc2VkXS5rZXlib2FyZC1mb2N1cyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQoKICAgICAgLnJ1bi1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDhweCAwIDhweCAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmNvbG9yLWRyb3Bkb3duIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjogewogICAgICAgICAgcGFkZGluZzogOXB4IDAgMCAxM3B4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiAwIDIwcHggMjBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ob2xkZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBwYWRkaW5nOiAxNXB4IDIwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLWJ1dHRvbiB7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgc3ZnLmljb24sCiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgfQogICAgICAuZG9tYWluVmFsdWVzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgfQogICAgICAuZG9tYWluU3RhcnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIC5kb21haW5FbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29sb3JCb3ggewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAuaW1hZ2UtaWNvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAuaGVscC1pY29uIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ncmF5IHsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgbWFyZ2luOiA4cHggNXB4IDhweCAwOwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgfQogICAgICAudGl0bGUgc21hbGwgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgLmRldmljZUxpc3QsCiAgICAgIC54bGFDbHVzdGVyTGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI2ZpbGUgewogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IC5sYWJlbCwKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgc3ZnLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyB0Zi1ncmFwaC1pY29uIHsKICAgICAgICBmbGV4OiAwIDAgNDBweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5kZXZpY2VzLWNoZWNrYm94IGlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWhvbGRlciAuaWNvbi1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW46IDAgLTVweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24tdGV4dCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CgogICAgICAudXBsb2FkLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC5idXR0b24taWNvbiB7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtNTAwKTsKICAgICAgfQoKICAgICAgLmhpZGRlbi1pbnB1dCB7CiAgICAgICAgaGVpZ2h0OiAwcHg7CiAgICAgICAgd2lkdGg6IDBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICBzcGFuLmNvdW50ZXIgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgfQoKICAgICAgLnJ1bnMgcGFwZXItaXRlbSB7CiAgICAgICAgLS1wYXBlci1pdGVtOiB7CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUuY29udHJvbC1ob2xkZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CgogICAgICB0YWJsZS50Zi1ncmFwaC1jb250cm9scyB0ZC5pbnB1dC1lbGVtZW50LXRhYmxlLWRhdGEgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmNvbG9yLXRleHQgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIHRoYXQgc3VwcHJlc3MgcG9pbnRlciBldmVudHMgZm9yIGRpc2FibGVkIGJ1dHRvbnMuIE90aGVyd2lzZSwgdGhlICovCiAgICAgIC8qICB0b29sdGlwcyBkbyBub3QgYXBwZWFyLiAqLwogICAgICBwYXBlci1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHsKICAgICAgICBjb2xvcjogIzI2NjIzNjsKICAgICAgICBjdXJzb3I6IGhlbHA7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciBwYXBlci10b29sdGlwIHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdGhlcndpc2UsIHBvbHltZXIgVUkgY29udHJvbHMgYXBwZWFyIGF0b3Agbm9kZSBzZWFyY2guICovCiAgICAgIHRmLWdyYXBoLW5vZGUtc2VhcmNoIHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iYWxsY29udHJvbHMiPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHRmLWdyYXBoLW5vZGUtc2VhcmNoIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iPjwvdGYtZ3JhcGgtbm9kZS1zZWFyY2g+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLXRhcD0iX2ZpdCIgYWx0PSJGaXQgdG8gc2NyZWVuIj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXNwZWN0LXJhdGlvIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5GaXQgdG8gU2NyZWVuPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi1jbGljaz0iZG93bmxvYWQiIGFsdD0iRG93bmxvYWQgUE5HIj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZmlsZS1kb3dubG9hZCIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+RG93bmxvYWQgUE5HPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxhIGhyZWY9IiMiIGlkPSJncmFwaGRvd25sb2FkIiBjbGFzcz0idGl0bGUiIGRvd25sb2FkPSJncmFwaC5wbmciPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIHJ1bnMiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgIFJ1biA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbZGF0YXNldHMubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgbm9pbmsgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIgY2xhc3M9InJ1bi1kcm9wZG93biI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkUnVuSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZGF0YXNldHNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLm5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1Nlc3Npb25SdW5zRHJvcGRvd25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUYWcKICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19udW1UYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSk8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIgbm9pbmsgY2xhc3M9InJ1bi1kcm9wZG93biI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWdJbmRleH19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19nZXRUYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0uZGlzcGxheU5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93VXBsb2FkQnV0dG9uXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5VcGxvYWQ8L2Rpdj4KICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ1cGxvYWQtYnV0dG9uIiBvbi1jbGljaz0iX2dldEZpbGUiIHRpdGxlPSJVcGxvYWQgYSBncmFwaCBwYnR4dCBmaWxlIHRvIHZpZXcgdGhlIGdyYXBoIj4KICAgICAgICAgICAgQ2hvb3NlIEZpbGUKICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGlkZGVuLWlucHV0Ij4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIGlkPSJmaWxlIiBuYW1lPSJmaWxlIiBvbi1jaGFuZ2U9Il91cGRhdGVGaWxlSW5wdXQiIGFjY2VwdD0iLnBidHh0Ij4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e19zZWxlY3RlZEdyYXBoVHlwZX19Ij4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJvcF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbk9wR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5HcmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJjb25jZXB0dWFsX2dyYXBoIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+Q29uY2VwdHVhbCBHcmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJwcm9maWxlIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPlByb2ZpbGU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e3RyYWNlSW5wdXRzfX0iIGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgIFRyYWNlIGlucHV0cwogICAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxzRmVhdHVyZUVuYWJsZWRdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBjbGFzcz0idGl0bGUiPlNob3cgaGVhbHRoIHBpbGxzPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkNvbG9yPC9kaXY+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSI+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InN0cnVjdHVyZSI+U3RydWN0dXJlPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJkZXZpY2UiPkRldmljZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgbmFtZT0ieGxhX2NsdXN0ZXIiIGRpc2FibGVkPSJbWyFfeGxhQ2x1c3RlcnNQcm92aWRlZChyZW5kZXJIaWVyYXJjaHkpXV0iPgogICAgICAgICAgICBYTEEgQ2x1c3RlcgogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IFhMQSBjbHVzdGVyIGlzIG9ubHkgZW5hYmxlZCBpZiBhdCBsZWFzdCAxIG9wIHNwZWNpZmllcwogICAgICAgICAgICBhbiBYTEEgY2x1c3Rlci4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJjb21wdXRlLXRpbWUtcmFkaW8tYnV0dG9uIiBuYW1lPSJjb21wdXRlX3RpbWUiIGRpc2FibGVkPSJbWyFzdGF0c11dIj4KICAgICAgICAgICAgQ29tcHV0ZSB0aW1lCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJjb21wdXRlLXRpbWUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IGNvbXB1dGUgdGltZSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIgbmFtZT0ibWVtb3J5IiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIE1lbW9yeQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBtZW1vcnkgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIgbmFtZT0ib3BfY29tcGF0aWJpbGl0eSI+CiAgICAgICAgICAgIFRQVSBDb21wYXRpYmlsaXR5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgd2hldGhlciBhbiBvcGVyYXRpb24gaXMgY29tcGF0aWJsZSBmb3IgdGhlIFRQVSBkZXZpY2UuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICA8c3BhbiBjbGFzcz0ic3BhY2VyIj48L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNHcmFkaWVudENvbG9yaW5nKHN0YXRzLCBjb2xvckJ5KV1dIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE0MCIgaGVpZ2h0PSIyMCIgc3R5bGU9Im1hcmdpbjogMCA1cHgiIGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJsaW5lYXJHcmFkaWVudCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgICAgICAgICAgICAgPHN0b3AgY2xhc3M9InN0YXJ0IiBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLnN0YXJ0Q29sb3JdXSIgLz4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJlbmQiIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5lbmRDb2xvcl1dIiAvPgogICAgICAgICAgICAgIDwvbGluZWFyZ3JhZGllbnQ+CiAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEzNSIgaGVpZ2h0PSIyMCIgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudCkiIHN0cm9rZT0iYmxhY2siIC8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblZhbHVlcyBjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluU3RhcnQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5taW5WYWx1ZV1dPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpbkVuZCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1heFZhbHVlXV08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJyIHN0eWxlPSJjbGVhcjogYm90aCI+CiAgICAgICAgICA8ZGl2PkRldmljZXMgaW5jbHVkZWQgaW4gc3RhdHM6PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXZpY2VMaXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyBkZXZpY2VzLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgIDxzcGFuPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWUkPSJbW2l0ZW0uZGV2aWNlXV0iIGNoZWNrZWQkPSJbW2l0ZW0udXNlZF1dIiBvbi1jbGljaz0iX2RldmljZUNoZWNrYm94Q2xpY2tlZCI+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+W1tpdGVtLnN1ZmZpeF1dPC9zcGFuPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2l0ZW0uaWdub3JlZE1zZ11dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImhlbHAiIGNsYXNzPSJoZWxwLWljb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIiBhbmltYXRpb24tZGVsYXk9IjAiPltbaXRlbS5pZ25vcmVkTXNnXV08L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnc3RydWN0dXJlJyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj4KICAgICAgICAgICAgICAgIGNvbG9ycwogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5zYW1lIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNlZWUiIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVuaXF1ZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnZGV2aWNlJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iW1tpdGVtLmNvbG9yXV0iIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLmRldmljZV1dPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIGRldmljZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICd4bGFfY2x1c3RlcicpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjdW5maWxsZWQtcmVjdCIgeD0iMCIgeT0iMCIgc3R5bGU9ImZpbGw6W1tpdGVtLmNvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS54bGFfY2x1c3Rlcl1dPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI2dyZXktcmVjdCIgeD0iMCIgeT0iMCIgLz4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIFhMQSBjbHVzdGVyPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iIzBmOWQ1OCIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+VmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2RiNDQzNyIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+SW52YWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RhdHNOb3ROdWxsKHN0YXRzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmYWRlZD48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVudXNlZCBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGVnZW5kLWhvbGRlciI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVMZWdlbmRJY29uKF9sZWdlbmRPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTGVnZW5kT3BlbiIgY2xhc3M9InRvZ2dsZS1sZWdlbmQtYnV0dG9uIj4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9InRvZ2dsZS1sZWdlbmQtdGV4dCI+CiAgICAgICAgW1tfZ2V0VG9nZ2xlVGV4dChfbGVnZW5kT3BlbmVkKV1dCiAgICAgIDwvc3Bhbj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19sZWdlbmRPcGVuZWRdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgPHRib2R5Pjx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90Ym9keT48L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZXJyb3ItZGlhbG9nIiB3aXRoLWJhY2tkcm9wPjwvcGFwZXItZGlhbG9nPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ0VNUFRZJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICA8cD4KICAgICAgICAgIFRvIHN0b3JlIGEgZ3JhcGgsIGNyZWF0ZSBhCiAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICA8Y29kZT5hZGRfZ3JhcGgoKTwvY29kZT4gbWV0aG9kLiBZb3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvZ3JhcGhfdml6Ij5ncmFwaCB2aXN1YWxpemVyIHR1dG9yaWFsPC9hPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8gYWRkCiAgICAgICAgICBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICA8L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YXNldHNTdGF0ZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdQUkVTRU5UJyldXSI+CiAgICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICAgIDx0Zi1ncmFwaC1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIiBzdGF0cz0iW1tfc3RhdHNdXSIgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHJlbmRlci1oaWVyYXJjaHk9IltbX3JlbmRlckhpZXJhcmNoeV1dIiBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IiBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgb24tZml0LXRhcD0iX2ZpdCIgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319Ij48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIGlkPSJsb2FkZXIiIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIiBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIiBzZWxlY3RlZC1maWxlPSJbW19zZWxlY3RlZEZpbGVdXSIgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e19ncmFwaH19IiBvdXQtc3RhdHM9Int7X3N0YXRzfX0iIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgY29tcGF0aWJpbGl0eS1wcm92aWRlcj0iW1tfY29tcGF0aWJpbGl0eVByb3ZpZGVyXV0iPjwvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcj4KICAgICAgICAgIDx0Zi1ncmFwaC1ib2FyZCBpZD0iZ3JhcGhib2FyZCIgZGV2aWNlcy1mb3Itc3RhdHM9IltbX2RldmljZXNGb3JTdGF0c11dIiBjb2xvci1ieT0iW1tfY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7X2NvbG9yQnlQYXJhbXN9fSIgZ3JhcGgtaGllcmFyY2h5PSJbW19ncmFwaEhpZXJhcmNoeV1dIiBncmFwaD0iW1tfZ3JhcGhdXSIgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iIHByb2dyZXNzPSJbW19wcm9ncmVzc11dIiBkZWJ1Z2dlci1kYXRhLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW19hcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tfbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9IltbX2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IiBzdGF0cz0iW1tfc3RhdHNdXSIgdHJhY2UtaW5wdXRzPSJbW190cmFjZUlucHV0c11dIj48L3RmLWdyYXBoLWJvYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCAvZGVlcC8gewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIAogICAgPHZ6LWRpc3RyaWJ1dGlvbi1jaGFydCBpZD0iY2hhcnQiIHgtdHlwZT0iW1t4VHlwZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIj48L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydD4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiA3MDBweDsKICAgICAgICBoZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICB2ei1oaXN0b2dyYW0tdGltZXNlcmllcyB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgICAgKEhpc3RvZ3JhbXMgYW5kIGRpc3RyaWJ1dGlvbnMgYm90aCB1c2UgdGhlIGhpc3RvZ3JhbSBzdW1tYXJ5CiAgICAgICAgICAgICAgICBvcGVyYXRpb24uKQogICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPjxzcGFuPjwvc3Bhbj48L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxnPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHgiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSBzbGljZSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJzdGFnZSI+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iYmFja2dyb3VuZCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8ZyBjbGFzcz0ieC1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InktYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LXNsaWNlLWF4aXMtaG92ZXIiPjwvZz4KICAgICAgPC9nPgogICAgPC9zdmc+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsbDogcmVkOwogICAgICB9CgogICAgICAuaGlzdG9ncmFtIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmhvdmVyIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3ZlciBjaXJjbGUgewogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLmhvdmVyIHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3Zlci5ob3Zlci1jbG9zZXN0IGNpcmNsZSB7CiAgICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmJhc2VsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5vdXRsaW5lIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLm91dGxpbmUub3V0bGluZS1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiBibGFjayAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyLAogICAgICAueS1heGlzLWhvdmVyLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LWF4aXMtaG92ZXIgLmxhYmVsLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIC5sYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC1hbmNob3I6IGVuZDsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAueS1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgdGV4dCB7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIGxpbmUsCiAgICAgIC55LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciBsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmF4aXMgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmF4aXMgcGF0aC5kb21haW4gewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5heGlzIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDI7CiAgICAgIH0KCiAgICAgIC5zbWFsbCAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpmaXJzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpsYXN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhpc3RvZ3JhbS1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBpZD0iY2hhcnQiIHRpbWUtcHJvcGVydHk9IltbdGltZVByb3BlcnR5XV0iIG1vZGU9IltbaGlzdG9ncmFtTW9kZV1dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iPjwvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXM+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogOTAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib3ZlcmxheSI+b3ZlcmxheTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXRiLXRleHQtbG9hZGVyLW91dGxpbmUpOwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIiBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSI+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJSZXNldCBheGVzIHRvIFswLCAxXS4iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIFtbcnVuXV0gaXMgYXQKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWxhYmVsLXRleHQiPgogICAgICAgICAgICBzdGVwIFtbX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSA8L3NwYW4+PGJyPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU2xpZGVyc11dIiBhcz0icnVuIj4KICAgICAgPGRpdiBjbGFzcz0icnVuLXdpZGdldCI+CiAgICAgICAgPGRpdiBjbGFzcz0icnVuLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi1jb2xvci1ib3giIHN0eWxlPSJiYWNrZ3JvdW5kOltbX2NvbXB1dGVDb2xvckZvclJ1bihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi10ZXh0Ij4KICAgICAgICAgICAgW1tydW5dXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1kaXNwbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICBbW19jb21wdXRlVGltZVRleHRGb3JSdW4ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4LAogICAgICAgICAgcnVuLCB0aW1lRGlzcGxheVR5cGUpXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItc2xpZGVyIGRhdGEtcnVuJD0iW1tydW5dXSIgc3RlcD0iMSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iIHZhbHVlPSJbW19nZXRTdGVwKF9ydW5Ub1N0ZXBJbmRleCwgcnVuKV1dIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0iX3NsaWRlclZhbHVlQ2hhbmdlZCI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnJ1bi13aWRnZXQgewogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIG1hcmdpbjogLThweCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnN0ZXAtZGlzcGxheS1jb250YWluZXIgewogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgbWFyZ2luOiAwIDE1cHggMCAwOwogICAgICB9CiAgICAgIC5ydW4tdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC5ydW4tY29sb3ItYm94IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InRpbWUtdHlwZS1zZWxlY3RvciIgbmFtZT0iVGltZSBEaXNwbGF5IFR5cGUiIHNlbGVjdGVkLWlkPSJ7e190aW1lRGlzcGxheVR5cGV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICAgIDx0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciBydW5zPSJbW19yZWxldmFudFNlbGVjdGVkUnVuc11dIiBydW4tdG8tc3RlcD0ie3tfcnVuVG9TdGVwfX0iIHJ1bi10by1hdmFpbGFibGUtdGltZS1lbnRyaWVzPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iIHRpbWUtZGlzcGxheS10eXBlPSJbW190aW1lRGlzcGxheVR5cGVdXSI+CiAgICAgICAgICAgICAgPC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvcj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwcmVjaXNpb27igJNyZWNhbGwgY3VydmUgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iIGdldC1jYXRlZ29yeS1pdGVtLWtleT0iW1tfZ2V0Q2F0ZWdvcnlJdGVtS2V5XV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1wci1jdXJ2ZS1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgcnVucz0iW1tpdGVtLnJ1bnNdXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW5zLCBpdGVtLnRhZyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBydW4tdG8tc3RlcC1jYXA9IltbX3J1blRvU3RlcF1dIiBvbi1kYXRhLWNoYW5nZT0iW1tfY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKGl0ZW0udGFnKV1dIj48L3RmLXByLWN1cnZlLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDYwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIDwvcD4KICAgICAgPHRleHRhcmVhIGlkPSJjb21tYW5kVGV4dGFyZWEiIHJlYWRvbmx5IHJvd3M9IjEiIG9uLWJsdXI9Il9yZW1vdmVDb3BpZWRNZXNzYWdlIj4KW1tfaW5zdGFsbENvbW1hbmRdXTwvdGV4dGFyZWE+CiAgICAgIDxkaXYgaWQ9ImNvcHlDb250YWluZXIiPgogICAgICAgIDxzcGFuIGlkPSJjb3BpZWRNZXNzYWdlIj48L3NwYW4+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgb24tdGFwPSJfY29weUluc3RhbGxDb21tYW5kIj5Db3B5IHRvIGNsaXBib2FyZDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLm1lc3NhZ2UgewogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICB9CiAgICAgICNjb21tYW5kVGV4dGFyZWEgewogICAgICAgIG1hcmdpbi10b3A6IDFleDsKICAgICAgICBwYWRkaW5nOiAxZXggMWVtOwogICAgICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI2NvcHlDb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgI2NvcGllZE1lc3NhZ2UgewogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1wbHVnaW4tZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG1vZGFsIG9wZW5lZD0ie3tfb3Blbn19IiB3aXRoLWJhY2tkcm9wPSJbW191c2VOYXRpdmVCYWNrZHJvcF1dIj4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjdXN0b20tbWVzc2FnZSI+W1tfY3VzdG9tTWVzc2FnZV1dPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZT4KICAgICAgLyoqIFdlIHJlbHkgb24gYSBzZXBhcmF0ZSBgX2hpZGRlbmAgcHJvcGVydHkgaW5zdGVhZCBvZiBkaXJlY3RseSBtYWtpbmcgdXNlCiAgICAgICAgICBvZiB0aGUgYF9vcGVuYCBhdHRyaWJ1dGUgYmVjYXVzZSB0aGlzIENTUyBzcGVjaWZpY2F0aW9uIG1heSBzdHJhbmdlbHkKICAgICAgICAgIGFmZmVjdCBvdGhlciBlbGVtZW50cyB0aHJvdWdob3V0IFRlbnNvckJvYXJkLiBTZWUgIzg5OS4gKi8KICAgICAgI2Rhc2hib2FyZC1iYWNrZHJvcCB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItdmlkZW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxpbWcgaWQ9InZpZGVvIiBzcmMkPSJbW19pbWFnZVVSTF1dIj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgaW1nIHsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8ZGl2IGNsYXNzPSJkZXByZWNhdGlvbi13YXJuaW5nIj4KICAgICAgQmVob2xkZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIFRlbnNvckJvYXJkCiAgICAgIHJlbGVhc2UuIFBsZWFzZSBzZWUKICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzM4NDMiPiMzODQzPC9hPgogICAgICBmb3IgZGV0YWlscy4KICAgIDwvZGl2PgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8cCBjbGFzcz0iY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSI+CiAgICAgICAgICAgICAgQ29udHJvbHMgZGlzYWJsZWQ6IGRpcmVjdG9yeSBpcyBub3Qgd3JpdGVhYmxlLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBCZWhvbGRlciByZXF1aXJlcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGxvZyBkaXJlY3RvcnkgaW4gb3JkZXIgdG8KICAgICAgICAgICAgICBjb21tdW5pY2F0ZSB2aXN1YWxpemF0aW9uIGNoYW5nZXMgdG8gdGhlIDxjb2RlPkJlaG9sZGVyPC9jb2RlPgogICAgICAgICAgICAgIGluc3RhbmNlIGluIHlvdXIgbW9kZWwuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNfYWN0aXZlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIEJlaG9sZGVyIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdXIgc2NyaXB0IGlzbid0IHJ1bm5pbmcuPC9saT4KICAgICAgICAgICAgICA8bGk+WW91IGFyZW4ndCBjYWxsaW5nIDxjb2RlPmJlaG9sZGVyLnVwZGF0ZSgpPC9jb2RlPi48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gdXNlIEJlaG9sZGVyLCBpbXBvcnQgYW5kIGluc3RhbnRpYXRlIHRoZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVyPC9jb2RlPiBjbGFzcywgYW5kIGNhbGwgaXRzCiAgICAgICAgICAgICAgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2Qgd2l0aCBhIDxjb2RlPlNlc3Npb248L2NvZGU+IGFyZ3VtZW50CiAgICAgICAgICAgICAgYWZ0ZXIgZXZlcnkgdHJhaW4gc3RlcDoKICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlckhvb2sKYmVob2xkZXJfaG9vayA9IEJlaG9sZGVySG9vayhMT0dfRElSRUNUT1JZKQp3aXRoIE1vbml0b3JlZFNlc3Npb24oLi4uLCBob29rcz1bYmVob2xkZXJfaG9va10pIGFzIHNlc3M6CiAgc2Vzcy5ydW4odHJhaW5fb3ApPC9wcmU+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgZXZlcnl0aGluZyBpcyBzZXQgdXAgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci90ZW5zb3Jib2FyZC9wbHVnaW5zL2JlaG9sZGVyL1JFQURNRS5tZCI+dGhlIFJFQURNRTwvYT4KICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICAgIE5vdGU6IEJlaG9sZGVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdlbGwgb24gbG9jYWwgZmlsZSBzeXN0ZW1zLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmRlcHJlY2F0aW9uLXdhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjNmNhZDE7IC8qICR0Zi1zbGF0ZSAzMDAgKi8KICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgdGYtZGFzaGJvYXJkLWxheW91dCB7CiAgICAgICAgLyogTGVhdmUgc3BhY2UgZm9yIC5kZXByZWNhdGlvbi13YXJuaW5nIHRvcCBiYXIuICovCiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA2MHB4KTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcXVlcnktcGFuZSI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcy1zdGF0dXNlcyI+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0iaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3MiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIGh5cGVycGFyYW1ldGVycyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SHlwZXJwYXJhbWV0ZXJzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfaHBhcmFtc319IiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhwYXJhbSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e2hwYXJhbS5kaXNwbGF5ZWR9fSIgY2xhc3M9ImhwYXJhbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e2l0ZW0uY2hlY2tlZH19IiBjbGFzcz0iZGlzY3JldGUtdmFsdWUtY2hlY2tib3giIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tfcHJldHR5UHJpbnQoaXRlbS52YWx1ZSldXQogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWxdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNaW4iIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4uaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iLWluZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWF4IiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLmludGVydmFsLm1heC52YWx1ZX19IiBhbGxvd2VkX3BhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWRdXSIgcGxhY2Vob2xkZXI9IitpbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLnJlZ2V4cF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlJlZ3VsYXIgZXhwcmVzc2lvbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5yZWdleHB9fSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gbWV0cmljcyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWV0cmljczwvZGl2PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X21ldHJpY3N9fSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWMiPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7bWV0cmljLmRpc3BsYXllZH19IiBjbGFzcz0ibWV0cmljLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXC1dIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC52YWx1ZX19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZH19IiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzdGF0dXMiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0dXM8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc3RhdHVzZXNdXSIgYXM9InN0YXR1cyI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7c3RhdHVzLmFsbG93ZWR9fSIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgW1tzdGF0dXMuZGlzcGxheU5hbWVdXQogICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InNvcnRpbmctcGFnaW5nIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNvcnRpbmc8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IlNvcnQgYnkiIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NvcnRCeUluZGV4fX0iIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2hwYXJhbXNdXSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21ldHJpY3NdXSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkRpcmVjdGlvbiIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydERpcmVjdGlvbn19Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPkFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPkRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJwYWdpbmctZG93bmxvYWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UGFnaW5nPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczoKICAgICAgICAgICAgICAgIFtbX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLW51bWJlci1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlBhZ2UgIyIgdmFsdWU9Int7X3BhZ2VOdW1iZXJJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlTnVtYmVySW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9InN1ZmZpeCIgY2xhc3M9InBhZ2Utc3VmZml4Ij4KICAgICAgICAgICAgICAgICAgICAvIFtbX3BhZ2VDb3VudFN0cl1dCiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gZG93bmxvYWQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2Vzc2lvbkdyb3Vwc1JlcXVlc3RdXSI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBkYXRhIGFzCiAgICAgICAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgICAgICAgPGEgaWQ9ImNzdkxpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSI+Q1NWPC9hPgogICAgICAgICAgICAgICAgICA8YSBpZD0ianNvbkxpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5KU09OPC9hPgogICAgICAgICAgICAgICAgICA8YSBpZD0ibGF0ZXhMaW5rIiBkb3dubG9hZD0iaHBhcmFtc190YWJsZS50ZXgiIGhyZWY9IltbX2xhdGV4VXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSI+TGFUZVg8L2E+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogNXB4IDEwcHggNXB4IDEwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogN3B4OwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcy1zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogNzAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAjaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IDkwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLmh5cGVycGFyYW1ldGVycyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm1ldHJpY3MgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5zdGF0dXNlcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3NvcnRpbmctcGFnaW5nIHsKICAgICAgICBmbGV4LWJhc2lzOiAzMCU7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgICNwYWdpbmctZG93bmxvYWQgewogICAgICAgIGZsZXgtYmFzaXM6IDkwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnNvcnRpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0iaXJvbi1wYWdlcyI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCg6bm90KHNsb3QpOm5vdCguaXJvbi1zZWxlY3RlZCkpIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0icGFwZXItdGFiIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYjsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xpbmtdKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1zZWxlY3RlZCkpID4gLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAwLjg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LXVuc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRhYi1pbmssIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCA+IDo6c2xvdHRlZChhKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2xiYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1oZWlnaHQsIDY0cHgpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodDogdmFyKC0tcGFwZXItdG9vbGJhci1zbS1oZWlnaHQsIDU2cHgpOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXRvb2xiYXItYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sYmFyLWNvbG9yLCB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyOwogICAgICB9CgogICAgICA6aG9zdCguYW5pbWF0ZSkgewogICAgICAgIHRyYW5zaXRpb246IHZhcigtLXBhcGVyLXRvb2xiYXItdHJhbnNpdGlvbiwgaGVpZ2h0IDAuMThzIGVhc2UtaW4pOwogICAgICB9CgogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAyKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLW1lZGl1bTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCkgKiAzKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRhbGw7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBwYWRkaW5nOiAwIDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIFRPRE86IFdoZXJlIHNob3VsZCBtZWRpYSBxdWVyeSBicmVha3BvaW50cyBsaXZlIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGVsZW1lbnRzPwogICAgICAgKi8KCiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgubWVkaXVtLXRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDIpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLnRhbGwpIHsKICAgICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KSAqIDMpOwogICAgICAgIH0KCiAgICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICN0b3BCYXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLyogbWlkZGxlIGJhciAqLwogICAgICAjbWlkZGxlQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSAjbWlkZGxlQmFyLAogICAgICA6aG9zdCgubWVkaXVtLXRhbGwpICNtaWRkbGVCYXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgfQoKICAgICAgLyogYm90dG9tIGJhciAqLwogICAgICAjYm90dG9tQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1ha2UgZWxlbWVudHMgKGUuZy4gYnV0dG9ucykgcmVzcG9uZCB0byBtb3VzZS90b3VjaCBldmVudHMKICAgICAgICoKICAgICAgICogYC50b29sYmFyLXRvb2xzYCBkaXNhYmxlcyB0b3VjaCBldmVudHMgc28gbXVsdGlwbGUgdG9vbGJhcnMgY2FuIHN0YWNrIGFuZCBub3QKICAgICAgICogYWJzb3JiIGV2ZW50cy4gQWxsIGNoaWxkcmVuIG11c3QgaGF2ZSBwb2ludGVyIGV2ZW50cyByZS1lbmFibGVkIHRvIHdvcmsgYXMKICAgICAgICogZXhwZWN0ZWQuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgqOm5vdChbZGlzYWJsZWRdKSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDU2cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKHBhcGVyLWljb24tYnV0dG9uICsgLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgLS1wYXBlci10b29sYmFyLXRpdGxlIG1peGluIGlzIGFwcGxpZWQgaGVyZSBpbnN0ZWFkIG9mIGFib3ZlIHRvCiAgICAgICAqIGZpeCB0aGUgaXNzdWUgd2l0aCBtYXJnaW4tbGVmdCBiZWluZyBpZ25vcmVkIGR1ZSB0byBjc3Mgb3JkZXJpbmcuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRpdGxlOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbltpY29uPW1lbnVdKSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCguZml0KSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogYXV0bzsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC8qIFRPRE8obm9tcyk6IFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gZm9yIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UKICAgICAgICogL2RlZXAvIGNyZWF0ZSBvdXIgb3duLgogICAgICAgKi8KICAgICAgLnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmNlbnRlci1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9CgogICAgICAuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b3BCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKGp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJ0b3AiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9Im1pZGRsZUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3Nlcyhib3R0b21KdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0iYm90dG9tIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udHJvbC1wYW5lbCI+CiAgICAgIAogICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iQ29sb3IgYnkiIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IiBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIgaWQ9ImNvbG9yQnlMaXN0Qm94Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbb3B0aW9ucy5jb2x1bW5zXV0iIGFzPSJjb2x1bW4iIGlkPSJjb2xvckJ5Q29sdW1uVGVtcGxhdGUiPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgCiAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbnMtY29udGFpbmVyIj4KICAgICAgICAKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e29wdGlvbnMuY29sdW1uc319IiBhcz0iY29sdW1uIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOdW1lcmljQ29sdW1uKGNvbHVtbi5pbmRleCldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sdW1uLXRpdGxlIj4KICAgICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgY2xhc3M9InNjYWxlLXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tjb2x1bW4uc2NhbGV9fSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iTElORUFSIj4KICAgICAgICAgICAgICAgICAgICBMaW5lYXIKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iIG5hbWU9IkxPRyIgZGlzYWJsZWQ9IltbIV9hbGxvd0xvZ1NjYWxlKGNvbHVtbiwgc2Vzc2lvbkdyb3Vwcy4qKV1dIj4KICAgICAgICAgICAgICAgICAgICBMb2dhcml0aG1pYwogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJRVUFOVElMRSI+CiAgICAgICAgICAgICAgICAgICAgUXVhbnRpbGUKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuY29udHJvbC1wYW5lbCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLmNvbHVtbiB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICAgIGJvcmRlcjogc29saWQgMXB4IGRhcmtncmF5OwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuY29sdW1uLXRpdGxlIHsKICAgICAgICAvKiBGaXQgZXZlcnkgdGl0bGUgaW4gb25lIGxpbmUgc28gdGhlIHJhZGlvIGJveGVzIGFsaWduIHZlcnRpY2FsbHkuICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAuY29sdW1ucy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAuc2NhbGUtcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1hY3RpdmUtaXRlbS10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvd1thY3RpdmVdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctYWN0aXZlLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjdGFibGUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgei1pbmRleDogLTI7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2lvc10gI3RhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2ZpeGVkLXNlY3Rpb25zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgewogICAgICAgIHotaW5kZXg6IC0xOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gewogICAgICAgIC8qIEFueSB2YWx1ZSBvdGhlciB0aGFuIOKAmG5vbmXigJkgZm9yIHRoZSB0cmFuc2Zvcm0gcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYm90aCBhIHN0YWNraW5nIGNvbnRleHQgYW5kCiAgICAgICAgYSBjb250YWluaW5nIGJsb2NrLiBUaGUgb2JqZWN0IGFjdHMgYXMgYSBjb250YWluaW5nIGJsb2NrIGZvciBmaXhlZCBwb3NpdGlvbmVkIGRlc2NlbmRhbnRzLiAqLwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW2ZpeGVkLXNlY3Rpb25zXSB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5I2l0ZW1zIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiPjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXItY2VsbCI+PC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5jZWxsIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBsaW5lLWhlaWdodDogMDsKICAgICAgICBmb250LXNpemU6IDFweDsKICAgICAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgICB9CgogICAgICAuY2VsbFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NvbHVtbnNdXSIgYXM9ImNvbHVtbiI+CiAgICAgIDx2YWFkaW4tZ3JpZC1zaXplci1jZWxsIGNsYXNzPSJjZWxsIiBjb2x1bW49IltbY29sdW1uXV0iPiZuYnNwOzwvdmFhZGluLWdyaWQtc2l6ZXItY2VsbD4KICAgIDwvdGVtcGxhdGU+CgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFtwYXNzdGhyb3VnaF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc10pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICAgIHotaW5kZXg6IC0zOwogICAgICB9CgogICAgICA6aG9zdChbaW9zXVtzY3JvbGxpbmddKSB7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgIDpob3N0IHsKICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgIHotaW5kZXg6IC0zOwogICAgICAgaGVpZ2h0OiAwOwogICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICB9CgogICAgIDpob3N0KDpmb2N1cyksCiAgICAgLnByaW1hcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5wcmltYXJ5OmZvY3VzKSwKICAgICAuc2Vjb25kYXJ5OmZvY3VzLAogICAgIDo6c2xvdHRlZCguc2Vjb25kYXJ5OmZvY3VzKSB7CiAgICAgICBvdXRsaW5lOiBub25lOwogICAgIH0KICAgIDwvc3R5bGU+CgogICAgCiAgICA8ZGl2IGNsYXNzPSJwcmltYXJ5IiB0YWJpbmRleD0iMCIgcm9sZT0iZ3JpZGNlbGwiIG9uLWZvY3VzPSJfb25CYWl0Rm9jdXMiIG9uLWJsdXI9Il9vbkJhaXRCbHVyIj48ZGl2IGFyaWEtaGlkZGVuPSJ0cnVlIj4mbmJzcDs8L2Rpdj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlY29uZGFyeSIgdGFiaW5kZXg9Ii0xIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij48L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBbZGV0YWlsc2NlbGxdIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnZhYWRpbi1ncmlkLWNlbGxbZGV0YWlsc2NlbGxdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LWRldGFpbHMtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogQW5pbSAqLwogICAgICBAa2V5ZnJhbWVzIHZhYWRpbi1ncmlkLXNwaW4tMzYwIHsKICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3NwaW5uZXIgewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IsICMwM0E5RjQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC04cHg7CiAgICAgICAgbWFyZ2luLXRvcDogLThweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgd2lkdGg6IDE2cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1sb2FkaW5nLXNwaW5uZXIpOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNzcGlubmVyIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiB2YWFkaW4tZ3JpZC1zcGluLTM2MCA0MDBtcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtsb2FkaW5nXSkgI2l0ZW1zIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2VsZWN0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W3NlbGVjdGVkXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktMTAwLCByZ2IoMjQzLCAyNDMsIDI0MykpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LXNlbGVjdGVkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAgI3RhYmxlOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbmF2aWdhdGluZ106bm90KFtpbnRlcmFjdGluZ10pKSBbZm9jdXNlZF0gPiAudmFhZGluLWdyaWQtcm93W2ZvY3VzZWRdID4gW2ZvY3VzZWRdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAzcHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWZvY3VzZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdmFhZGluLWdyaWQtdGFibGVbcmVvcmRlcmluZ10gLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImRyYWdnaW5nIl0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktY29sb3IsICMwMDApOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMzAwbXM7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJhbGxvd2VkIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgICNzY3JvbGxlciAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMC45NTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFtpb3NdW2NvbHVtbi1yZXNpemluZ10pICNvdXRlcnNjcm9sbGVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAjZml4ZWRzaXplciwKICAgICAgI291dGVyc2l6ZXIgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI3RhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3RhYmxlW292ZXJmbG93LWhpZGRlbl0sCiAgICAgICNvdXRlcnNjcm9sbGVyW292ZXJmbG93LWhpZGRlbl0gewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXNpemVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzaXplcndyYXBwZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB6LWluZGV4OiAtMTAwOwogICAgICB9CgogICAgICAjcmVvcmRlcmdob3N0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbiksCiAgICAgIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICAvKiBEZWZhdWx0IGJvcmRlcnMgKi8KICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLXJvdzpmaXJzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IC52YWFkaW4tZ3JpZC1yb3c6bm90KFtsYXN0cm93XSkgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIC8qIENvbHVtbiByZXNpemUgaGFuZGxlICovCgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlKTsKICAgICAgfQoKICAgICAgLyogQ2VsbHMgKi8KICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWhlYWRlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWZvb3Rlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSBbb2RkXSAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LW9kZC1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSlbbGFzdC1mcm96ZW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jZWxsLWxhc3QtZnJvemVuKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGU6bm90KFtzY3JvbGxpbmddKSB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IC52YWFkaW4tZ3JpZC1yb3c6aG92ZXIgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktcm93LWhvdmVyLWNlbGwpOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsLnZhYWRpbi1ncmlkLWNlbGxbbGFzdGNvbHVtbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtc3R5bGVzIj48L3N0eWxlPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC10YWJsZS10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtc2VsZWN0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1uYXZpZ2F0aW9uLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1hY3RpdmUtaXRlbS10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8dmFhZGluLWdyaWQtdGFibGUgaWQ9InNjcm9sbGVyIiBsb2FkaW5nJD0iW1tfbG9hZGluZ11dIiBiaW5kLWRhdGE9IltbX2JpbmREYXRhXV0iIHNpemU9Iltbc2l6ZV1dIiBjb2x1bW4tdHJlZT0iW1tfY29sdW1uVHJlZV1dIiByb3ctZGV0YWlscy10ZW1wbGF0ZT0iW1tfcm93RGV0YWlsc1RlbXBsYXRlXV0iIGNvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWQ9IltbY29sdW1uUmVvcmRlcmluZ0FsbG93ZWRdXSI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIgaWQ9ImhlYWRlciIgc2xvdD0iaGVhZGVyIiB0YXJnZXQ9IltbX2dldENvbnRlbnRUYXJnZXQoKV1dIiBjb2x1bW4tdHJlZT0iW1tfY29sdW1uVHJlZV1dIj48L3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlcj4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgaWQ9Iml0ZW1zIiBzbG90PSJpdGVtcyI+PC92YWFkaW4tZ3JpZC10YWJsZS1ib2R5PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIGlkPSJmb290ZXIiIHNsb3Q9ImZvb3RlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1mb290ZXI+CgogICAgICAKICAgICAgPHNsb3QgbmFtZT0iZm9vdGVyRm9jdXNUcmFwIj48L3Nsb3Q+CgogICAgICAKICAgICAgCiAgICAgIDxzbG90Pjwvc2xvdD4KCiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIGlkPSJmb290ZXJGb2N1c1RyYXAiIHNsb3Q9ImZvb3RlckZvY3VzVHJhcCIgb24tZm9jdXMtZ2FpbmVkPSJfb25Gb290ZXJGb2N1cyIgb24tZm9jdXMtbG9zdD0iX29uRm9jdXNvdXQiPgogICAgICA8L3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXA+CiAgICA8L3ZhYWRpbi1ncmlkLXRhYmxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shc2Vzc2lvbkdyb3VwXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBzZXNzaW9uIGdyb3VwIHNlbGVjdGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgc2Vzc2lvbiBncm91cCB0byBzZWUgaXRzIG1ldHJpYy1ncmFwaHMgaGVyZS48L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhdmVNZXRyaWNzKHZpc2libGVTY2hlbWEuKildXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIG1ldHJpY3MgYXJlIGVuYWJsZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBlbmFibGUgc29tZSBtZXRyaWNzIHRvIHNlZSBjb250ZW50IGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtdGFibGUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHZhYWRpbi1ncmlkIGNsYXNzPSJzZXNzaW9uLWdyb3VwLXRhYmxlIiBpZD0ic2Vzc2lvbkdyb3Vwc1RhYmxlIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkIGl0ZW1zPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPgogICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5UcmlhbCBJRDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+W1tpdGVtLm5hbWVdXTwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZW5hYmxlU2hvd01ldHJpY3NdXSI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIHdpZHRoPSI1ZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlNob3cgTWV0cmljczwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJ0YWJsZS1jZWxsIiBjaGVja2VkPSJ7e2V4cGFuZGVkfX0iPgogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zXV0iIGFzPSJocGFyYW1JbmZvIiBpbmRleC1hcz0iaHBhcmFtSW5kZXgiPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW1JbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwSFBhcmFtKGl0ZW0sIGhwYXJhbUluZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7dmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc319IiBhcz0ibWV0cmljSW5mbyIgaW5kZXgtYXM9Im1ldHJpY0luZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cE1ldHJpYyhpdGVtLCBtZXRyaWNJbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgY2xhc3M9InJvdy1kZXRhaWxzIj4KICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW2l0ZW1dXSIgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIiBjbGFzcz0ic2Vzc2lvbi1ncm91cC1kZXRhaWxzIj4KICAgICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgICA8L3RlbXBsYXRlPgogICAgPC92YWFkaW4tZ3JpZD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC50YWJsZS1oZWFkZXIgewogICAgICAgIC8qIGxpbmUtYnJlYWsgb3ZlcmZsb3dpbmcgY29sdW1uIGhlYWRlcnMgKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2Vzc2lvbi1ncm91cC1kZXRhaWxzIHsKICAgICAgICBoZWlnaHQ6IDM2MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodmlzaWJsZVNjaGVtYSwgc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgCiAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iPgogICAgICA8L3RmLWhwYXJhbXMtdGFibGUtdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIDxkaXY+CiAgICAgICAgQ2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgc2xvdD0iaGVhZGVyIiBjbGFzcz0idGFiLWJhciI+CiAgICAgICAgPHBhcGVyLXRhYnMgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFifX0iIHNsb3Q9InRvcCI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0idGFibGUtdmlldyI+CiAgICAgICAgICAgIFRBQkxFIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJwYXJhbGxlbC1jb29yZHMtdmlldyI+CiAgICAgICAgICAgIFBBUkFMTEVMIENPT1JESU5BVEVTIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJzY2F0dGVyLXBsb3QtbWF0cml4LXZpZXciPgogICAgICAgICAgICBTQ0FUVEVSIFBMT1QgTUFUUklYIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC1hbmQtZmVlZGJhY2siPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYnVnUmVwb3J0VXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2J1Z1JlcG9ydFVybF1dIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9ImJ1Zy1yZXBvcnQiIHJhaXNlZCB0aXRsZT0iU2VuZCBhIGJ1ZyByZXBvcnQgb3IgZmVhdHVyZSByZXF1ZXN0Ij4KICAgICAgICAgICAgICAgICAgQnVnIFJlcG9ydCAvIEZlYXR1cmUgUmVxdWVzdAogICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVscFVybF1dIj4KICAgICAgICAgICAgICA8YSBocmVmJD0iW1toZWxwVXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImhlbHAtb3V0bGluZSIgdGl0bGU9IlZpZXcgZG9jdW1lbnRhdGlvbiI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgPC9wYXBlci10b29sYmFyPgogICAgICA8aXJvbi1wYWdlcyBzZWxlY3RlZD0iW1tfc2VsZWN0ZWRUYWJdXSIgY2xhc3M9ImZpdCB0YWItdmlldyI+CiAgICAgICAgPGRpdiBpZD0iMCIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgZW5hYmxlLXNob3ctbWV0cmljcz4KICAgICAgICAgIDwvdGYtaHBhcmFtcy10YWJsZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjEiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIj4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSIyIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLXBhZ2VzPgogICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CgogICAgPHN0eWxlPgogICAgICAudGFiLXZpZXcgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAudGFiLWJhciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgIH0KICAgICAgLnRhYiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGYtaHBhcmFtcy10YWJsZS12aWV3IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgICAjYnVnLXJlcG9ydCB7CiAgICAgICAgYm9yZGVyOiBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkczsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5oZWxwLWFuZC1mZWVkYmFjayBhIHsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtbWFpbiI+CiAgPHRlbXBsYXRlPgogICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUgaWQ9InF1ZXJ5LXBhbmUiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0ie3tfY29uZmlndXJhdGlvbn19IiBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319IiBkYXRhLWxvYWRlZC13aXRoLW5vbi1lbXB0eS1ocGFyYW1zPSJ7e19kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtc319IiBkYXRhLWxvYWRlZC13aXRoLWVtcHR5LWhwYXJhbXM9Int7X2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1xdWVyeS1wYW5lPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaHBhcmFtcyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBocGFyYW1zIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIEV2ZW50IGZpbGVzIGFyZSBzdGlsbCBiZWluZyBsb2FkZWQgKHRyeSByZWxvYWRpbmcgdGhpcyBwYWdlKS4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtc11dIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUgaWQ9InNlc3Npb25zLXBhbmUiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBoZWxwLXVybD0iW1toZWxwVXJsXV0iIGJ1Zy1yZXBvcnQtdXJsPSJbW2J1Z1JlcG9ydFVybF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tfY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tfc2Vzc2lvbkdyb3Vwc11dIj4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgoKICAgIDxzdHlsZT4KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbWluLXdpZHRoOiAxMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogODAlOwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtbWVzaC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzTWVzaExvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBtYXgtbWFya2Vycz0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0aXRsZSI+UG9pbnQgb2YgdmlldzwvaDM+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iYWxsLXJhZGlvLWJ1dHRvbiIgbmFtZT0iYWxsIj4KICAgICAgICAgICAgICAgICAgRGlzcGxheSBhbGwgcG9pbnRzCiAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJhbGwtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsCiAgICAgICAgICAgICAgICAgIHRoYXQgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlCiAgICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idXNlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InNoYXJlLXJhZGlvLWJ1dHRvbiIgbmFtZT0ic2hhcmUiPgogICAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InNoYXJlLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcG9pbnQgY2xvdWQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1tZXNoLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHNlbGVjdGVkLXZpZXc9IltbX3NlbGVjdGVkVmlld11dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWNvbnRhaW5lciIgb24tY2FtZXJhLXBvc2l0aW9uLWNoYW5nZT0iX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkIj4KICAgICAgICAgICAgICAgIDwvdGYtbWVzaC1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgLnNpZGViYXItc2VjdGlvbiBoMy50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIHRoYXQgeW914oCZdmUgZml4ZWQgdGhlIHByb2JsZW0sIGNsaWNrIHRoZSByZWxvYWQKICAgICAgICAgICAgICAgIGJ1dHRvbiBpbiB0aGUgdG9wLXJpZ2h0LgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2F1dG9SZWxvYWRFbmFibGVkXV0iPgogICAgICAgICAgICAgICAgICBXZeKAmWxsIHRyeSB0byByZWxvYWQgZXZlcnkKICAgICAgICAgICAgICAgICAgW1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV0mbmJzcDtzZWNvbmRzIGFzIHdlbGwuCiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjwvcD48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+PC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5ObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LjwvaDM+CiAgICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICA8L3A+CgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48L3A+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPjwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+CiAgICAgICAgICAgICAgICBUaGVyZeKAmXMgbm8gZGFzaGJvYXJkIGJ5IHRoZSBuYW1lIG9mCiAgICAgICAgICAgICAgICDigJw8dHQ+W1tfc2VsZWN0ZWREYXNoYm9hcmRdXTwvdHQ+LuKAnQogICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICAgICAgPHA+WW91IGNhbiBzZWxlY3QgYSBkYXNoYm9hcmQgZnJvbSB0aGUgbGlzdCBhYm92ZS48L3A+PC90ZW1wbGF0ZT4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjwvcD48cD4KICAgICAgICAgICAgICAgICAgICA8aT5EYXRhIGxvY2F0aW9uOgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+PC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGlkPSJkYXNoYm9hcmRzLXRlbXBsYXRlIiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iIG9uLWRvbS1jaGFuZ2U9Il9vblRlbXBsYXRlQ2hhbmdlZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogNnB4OwogICAgICAgIC8qIEluY3JlYXNlIGNsaWNrYWJsZSBhcmVhIGZvciBjYXNlIHdoZXJlIHRpdGxlIGlzIGFuIGFuY2hvci4gKi8KICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBkaXNwbGF5OiB2YXIoLS10Yi10b29sYmFyLXRpdGxlLWRpc3BsYXksIGJsb2NrKTsKICAgICAgfQoKICAgICAgYS50b29sYmFyLXRpdGxlIHsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciBjb2xvci4gKi8KICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAvKiBPdmVycmlkZSBkZWZhdWx0IGFuY2hvciB0ZXh0LWRlY29yYXRpb24uICovCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjdG9vbGJhci1jb250ZW50IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAjY29udGVudC1wYW5lIHsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRlbnQgewogICAgICAgIGZsZXg6IDEgMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAvKiBIaWRlIHVuc2VsZWN0ZWQgZGFzaGJvYXJkcy4gV2Ugc3RpbGwgZGlzcGxheSB0aGVtIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgICAgICBvZiBoZWlnaHQgMCBzaW5jZSBQbG90dGFibGUgcHJvZHVjZXMgZGVnZW5lcmF0ZSBjaGFydHMgd2hlbiBjaGFydHMgYXJlCiAgICAgICAgIHJlbG9hZGVkIHdoaWxlIG5vdCBkaXNwbGF5ZWQuICovCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyOm5vdChbZGF0YS1zZWxlY3RlZF0pIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC8qKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICBoZWlnaHQgaGVyZSB0byAwIHdpbGwgbm90IGhpZGUgdGhlbS4gKi8KICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndhcm5pbmctbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIFtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgICNyZWxvYWQtYnV0dG9uLnJlZnJlc2hpbmcgewogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByb3RhdGUgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+PHRiLXdlYmFwcD48L3RiLXdlYmFwcD48c2NyaXB0IHNyYz0iaW5kZXguanMiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+",
"headers": [
[
"content-type",
"text/html; charset=utf-8"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/environment": {
"data": "eyJkYXRhX2xvY2F0aW9uIjogInRiX2xvZ3MvIiwgIndpbmRvd190aXRsZSI6ICIifQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/debugger-v2/runs": {
"data": "e30=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/histograms/histograms?run=20201119-035554%2Fmetrics&tag=Generator%20distribution": {
"data": "W1sxNjA1NzU4MTYyLjUxNjUzMywgMSwgW1swLjAsIDMzLjY2NjY2NjY2NjY2NjY2NCwgNzAyMC4wXSwgWzMzLjY2NjY2NjY2NjY2NjY2NCwgNjcuMzMzMzMzMzMzMzMzMzMsIDg4MTQuMF0sIFs2Ny4zMzMzMzMzMzMzMzMzMywgMTAxLjAsIDQ3NzAuMF0sIFsxMDEuMCwgMTM0LjY2NjY2NjY2NjY2NjY2LCAyMDAyLjBdLCBbMTM0LjY2NjY2NjY2NjY2NjY2LCAxNjguMzMzMzMzMzMzMzMzMzEsIDIzMy4wXSwgWzE2OC4zMzMzMzMzMzMzMzMzMSwgMjAyLjAsIDYxMy4wXSwgWzIwMi4wLCAyMzUuNjY2NjY2NjY2NjY2NjYsIDI2Mi4wXSwgWzIzNS42NjY2NjY2NjY2NjY2NiwgMjY5LjMzMzMzMzMzMzMzMzMsIDExMjcuMF0sIFsyNjkuMzMzMzMzMzMzMzMzMywgMzAzLjAsIDE4NDQuMF0sIFszMDMuMCwgMzM2LjY2NjY2NjY2NjY2NjYzLCA0NTUwLjBdLCBbMzM2LjY2NjY2NjY2NjY2NjYzLCAzNzAuMzMzMzMzMzMzMzMzMywgNTIwMi4wXSwgWzM3MC4zMzMzMzMzMzMzMzMzLCA0MDQuMCwgNzcuMF0sIFs0MDQuMCwgNDM3LjY2NjY2NjY2NjY2NjYzLCAzMjEuMF0sIFs0MzcuNjY2NjY2NjY2NjY2NjMsIDQ3MS4zMzMzMzMzMzMzMzMzLCAzNzMuMF0sIFs0NzEuMzMzMzMzMzMzMzMzMywgNTA0Ljk5OTk5OTk5OTk5OTk0LCA2NzYuMF0sIFs1MDQuOTk5OTk5OTk5OTk5OTQsIDUzOC42NjY2NjY2NjY2NjY2LCAxMzcxLjBdLCBbNTM4LjY2NjY2NjY2NjY2NjYsIDU3Mi4zMzMzMzMzMzMzMzMzLCAzMzM3LjBdLCBbNTcyLjMzMzMzMzMzMzMzMzMsIDYwNi4wLCAxMzkxLjBdLCBbNjA2LjAsIDYzOS42NjY2NjY2NjY2NjY2LCAxNDc1LjBdLCBbNjM5LjY2NjY2NjY2NjY2NjYsIDY3My4zMzMzMzMzMzMzMzMzLCAyMDkuMF0sIFs2NzMuMzMzMzMzMzMzMzMzMywgNzA3LjAsIDQ5Mi4wXSwgWzcwNy4wLCA3NDAuNjY2NjY2NjY2NjY2NiwgMTU4LjBdLCBbNzQwLjY2NjY2NjY2NjY2NjYsIDc3NC4zMzMzMzMzMzMzMzMzLCA2OTkuMF0sIFs3NzQuMzMzMzMzMzMzMzMzMywgODA4LjAsIDI1NjAuMF0sIFs4MDguMCwgODQxLjY2NjY2NjY2NjY2NjYsIDMyOTkuMF0sIFs4NDEuNjY2NjY2NjY2NjY2NiwgODc1LjMzMzMzMzMzMzMzMzMsIDM5ODAuMF0sIFs4NzUuMzMzMzMzMzMzMzMzMywgOTA4Ljk5OTk5OTk5OTk5OTksIDEwODguMF0sIFs5MDguOTk5OTk5OTk5OTk5OSwgOTQyLjY2NjY2NjY2NjY2NjYsIDM4MS4wXSwgWzk0Mi42NjY2NjY2NjY2NjY2LCA5NzYuMzMzMzMzMzMzMzMzMywgNzY5LjBdLCBbOTc2LjMzMzMzMzMzMzMzMzMsIDEwMTAuMCwgOTA3LjBdXV0sIFsxNjA1NzU4MTY0LjQyOTcwMSwgMiwgW1swLjAsIDMzLjYzMzMzMzMzMzMzMzMzLCAyMzUzMy4wXSwgWzMzLjYzMzMzMzMzMzMzMzMzLCA2Ny4yNjY2NjY2NjY2NjY2NywgMTE0OC4wXSwgWzY3LjI2NjY2NjY2NjY2NjY3LCAxMDAuOSwgODA2LjBdLCBbMTAwLjksIDEzNC41MzMzMzMzMzMzMzMzMywgMzE2LjBdLCBbMTM0LjUzMzMzMzMzMzMzMzMzLCAxNjguMTY2NjY2NjY2NjY2NjYsIDk5LjBdLCBbMTY4LjE2NjY2NjY2NjY2NjY2LCAyMDEuOCwgMzguMF0sIFsyMDEuOCwgMjM1LjQzMzMzMzMzMzMzMzM0LCA5LjBdLCBbMjM1LjQzMzMzMzMzMzMzMzM0LCAyNjkuMDY2NjY2NjY2NjY2NjYsIDY4NDcuMF0sIFsyNjkuMDY2NjY2NjY2NjY2NjYsIDMwMi43LCAxNDY2LjBdLCBbMzAyLjcsIDMzNi4zMzMzMzMzMzMzMzMzLCA0MDEuMF0sIFszMzYuMzMzMzMzMzMzMzMzMywgMzY5Ljk2NjY2NjY2NjY2NjY0LCA1Ni4wXSwgWzM2OS45NjY2NjY2NjY2NjY2NCwgNDAzLjYsIDM5Ny4wXSwgWzQwMy42LCA0MzcuMjMzMzMzMzMzMzMzMzUsIDg1LjBdLCBbNDM3LjIzMzMzMzMzMzMzMzM1LCA0NzAuODY2NjY2NjY2NjY2NywgMTMuMF0sIFs0NzAuODY2NjY2NjY2NjY2NywgNTA0LjUsIDEuMF0sIFs1MDQuNSwgNTM4LjEzMzMzMzMzMzMzMzMsIDQxNzYuMF0sIFs1MzguMTMzMzMzMzMzMzMzMywgNTcxLjc2NjY2NjY2NjY2NjcsIDM1NC4wXSwgWzU3MS43NjY2NjY2NjY2NjY3LCA2MDUuNCwgMTEyLjBdLCBbNjA1LjQsIDYzOS4wMzMzMzMzMzMzMzMzLCA3LjBdLCBbNjM5LjAzMzMzMzMzMzMzMzMsIDY3Mi42NjY2NjY2NjY2NjY2LCAyMDQuMF0sIFs2NzIuNjY2NjY2NjY2NjY2NiwgNzA2LjMsIDM1LjBdLCBbNzA2LjMsIDczOS45MzMzMzMzMzMzMzMzLCA1LjBdLCBbNzM5LjkzMzMzMzMzMzMzMzMsIDc3My41NjY2NjY2NjY2NjY2LCA4Mjc2LjBdLCBbNzczLjU2NjY2NjY2NjY2NjYsIDgwNy4yLCA4MDU5LjBdLCBbODA3LjIsIDg0MC44MzMzMzMzMzMzMzM0LCA4MzMuMF0sIFs4NDAuODMzMzMzMzMzMzMzNCwgODc0LjQ2NjY2NjY2NjY2NjcsIDYxLjBdLCBbODc0LjQ2NjY2NjY2NjY2NjcsIDkwOC4xLCAxNzIzLjBdLCBbOTA4LjEsIDk0MS43MzMzMzMzMzMzMzMzLCA3MzUuMF0sIFs5NDEuNzMzMzMzMzMzMzMzMywgOTc1LjM2NjY2NjY2NjY2NjcsIDE5NS4wXSwgWzk3NS4zNjY2NjY2NjY2NjY3LCAxMDA5LjAsIDEwLjBdXV0sIFsxNjA1NzU4MTY2LjI4OTcwMiwgMywgW1swLjAsIDMzLjY2NjY2NjY2NjY2NjY2NCwgNTEyNy4wXSwgWzMzLjY2NjY2NjY2NjY2NjY2NCwgNjcuMzMzMzMzMzMzMzMzMzMsIDE0NjM0LjBdLCBbNjcuMzMzMzMzMzMzMzMzMzMsIDEwMS4wLCA4ODUxLjBdLCBbMTAxLjAsIDEzNC42NjY2NjY2NjY2NjY2NiwgMjUzNS4wXSwgWzEzNC42NjY2NjY2NjY2NjY2NiwgMTY4LjMzMzMzMzMzMzMzMzMxLCAzMzYuMF0sIFsxNjguMzMzMzMzMzMzMzMzMzEsIDIwMi4wLCAyNTQ2LjBdLCBbMjAyLjAsIDIzNS42NjY2NjY2NjY2NjY2NiwgMTQxOS4wXSwgWzIzNS42NjY2NjY2NjY2NjY2NiwgMjY5LjMzMzMzMzMzMzMzMzMsIDQwMS4wXSwgWzI2OS4zMzMzMzMzMzMzMzMzLCAzMDMuMCwgMzAwLjBdLCBbMzAzLjAsIDMzNi42NjY2NjY2NjY2NjY2MywgNjgzLjBdLCBbMzM2LjY2NjY2NjY2NjY2NjYzLCAzNzAuMzMzMzMzMzMzMzMzMywgMTE2OS4wXSwgWzM3MC4zMzMzMzMzMzMzMzMzLCA0MDQuMCwgMTE4LjBdLCBbNDA0LjAsIDQzNy42NjY2NjY2NjY2NjY2MywgMTE1LjBdLCBbNDM3LjY2NjY2NjY2NjY2NjYzLCA0NzEuMzMzMzMzMzMzMzMzMywgMzI5LjBdLCBbNDcxLjMzMzMzMzMzMzMzMzMsIDUwNC45OTk5OTk5OTk5OTk5NCwgNDQ3LjBdLCBbNTA0Ljk5OTk5OTk5OTk5OTk0LCA1MzguNjY2NjY2NjY2NjY2NiwgNTQxLjBdLCBbNTM4LjY2NjY2NjY2NjY2NjYsIDU3Mi4zMzMzMzMzMzMzMzMzLCAxOTIuMF0sIFs1NzIuMzMzMzMzMzMzMzMzMywgNjA2LjAsIDI3ODYuMF0sIFs2MDYuMCwgNjM5LjY2NjY2NjY2NjY2NjYsIDkzMy4wXSwgWzYzOS42NjY2NjY2NjY2NjY2LCA2NzMuMzMzMzMzMzMzMzMzMywgMjU2LjBdLCBbNjczLjMzMzMzMzMzMzMzMzMsIDcwNy4wLCA5MDkuMF0sIFs3MDcuMCwgNzQwLjY2NjY2NjY2NjY2NjYsIDQzMy4wXSwgWzc0MC42NjY2NjY2NjY2NjY2LCA3NzQuMzMzMzMzMzMzMzMzMywgOTAwLjBdLCBbNzc0LjMzMzMzMzMzMzMzMzMsIDgwOC4wLCA5MzcuMF0sIFs4MDguMCwgODQxLjY2NjY2NjY2NjY2NjYsIDM0NzcuMF0sIFs4NDEuNjY2NjY2NjY2NjY2NiwgODc1LjMzMzMzMzMzMzMzMzMsIDQxMDYuMF0sIFs4NzUuMzMzMzMzMzMzMzMzMywgOTA4Ljk5OTk5OTk5OTk5OTksIDY1My4wXSwgWzkwOC45OTk5OTk5OTk5OTk5LCA5NDIuNjY2NjY2NjY2NjY2NiwgMzcwLjBdLCBbOTQyLjY2NjY2NjY2NjY2NjYsIDk3Ni4zMzMzMzMzMzMzMzMzLCAyNTI2LjBdLCBbOTc2LjMzMzMzMzMzMzMzMzMsIDEwMTAuMCwgMTk3MS4wXV1dLCBbMTYwNTc1ODE2OC4xMzk4ODMsIDQsIFtbMC4wLCAzNC4wLCAxNjcwNi4wXSwgWzM0LjAsIDY4LjAsIDI5NDkuMF0sIFs2OC4wLCAxMDIuMCwgOTg1OS4wXSwgWzEwMi4wLCAxMzYuMCwgMjUzOC4wXSwgWzEzNi4wLCAxNzAuMCwgOC4wXSwgWzE3MC4wLCAyMDQuMCwgMi4wXSwgWzIwNC4wLCAyMzguMCwgNy4wXSwgWzIzOC4wLCAyNzIuMCwgODA4OS4wXSwgWzI3Mi4wLCAzMDYuMCwgMzI3MC4wXSwgWzMwNi4wLCAzNDAuMCwgMTY1Ni4wXSwgWzM0MC4wLCAzNzQuMCwgMTA4Ny4wXSwgWzM3NC4wLCA0MDguMCwgMTM4LjBdLCBbNDA4LjAsIDQ0Mi4wLCA0LjBdLCBbNDQyLjAsIDQ3Ni4wLCA4LjBdLCBbNDc2LjAsIDUxMC4wLCAwLjBdLCBbNTEwLjAsIDU0NC4wLCA1NS4wXSwgWzU0NC4wLCA1NzguMCwgNi4wXSwgWzU3OC4wLCA2MTIuMCwgMjYuMF0sIFs2MTIuMCwgNjQ2LjAsIDMuMF0sIFs2NDYuMCwgNjgwLjAsIDAuMF0sIFs2ODAuMCwgNzE0LjAsIDAuMF0sIFs3MTQuMCwgNzQ4LjAsIDAuMF0sIFs3NDguMCwgNzgyLjAsIDgxODEuMF0sIFs3ODIuMCwgODE2LjAsIDMyOTQuMF0sIFs4MTYuMCwgODUwLjAsIDkyMC4wXSwgWzg1MC4wLCA4ODQuMCwgOTYwLjBdLCBbODg0LjAsIDkxOC4wLCAyMTkuMF0sIFs5MTguMCwgOTUyLjAsIDkuMF0sIFs5NTIuMCwgOTg2LjAsIDMuMF0sIFs5ODYuMCwgMTAyMC4wLCAzLjBdXV0sIFsxNjA1NzU4MTcwLjEzNDA3NiwgNSwgW1swLjAsIDM0LjA2NjY2NjY2NjY2NjY3LCAxMjA1MC4wXSwgWzM0LjA2NjY2NjY2NjY2NjY3LCA2OC4xMzMzMzMzMzMzMzMzNCwgMTI0NjUuMF0sIFs2OC4xMzMzMzMzMzMzMzMzNCwgMTAyLjIwMDAwMDAwMDAwMDAyLCA1NTcyLjBdLCBbMTAyLjIwMDAwMDAwMDAwMDAyLCAxMzYuMjY2NjY2NjY2NjY2NjgsIDU5MTYuMF0sIFsxMzYuMjY2NjY2NjY2NjY2NjgsIDE3MC4zMzMzMzMzMzMzMzMzNCwgMTEyLjBdLCBbMTcwLjMzMzMzMzMzMzMzMzM0LCAyMDQuNDAwMDAwMDAwMDAwMDMsIDIyLjBdLCBbMjA0LjQwMDAwMDAwMDAwMDAzLCAyMzguNDY2NjY2NjY2NjY2NywgMzMuMF0sIFsyMzguNDY2NjY2NjY2NjY2NywgMjcyLjUzMzMzMzMzMzMzMzM2LCA2MjYuMF0sIFsyNzIuNTMzMzMzMzMzMzMzMzYsIDMwNi42LCAxNzA2LjBdLCBbMzA2LjYsIDM0MC42NjY2NjY2NjY2NjY3LCAxMzUuMF0sIFszNDAuNjY2NjY2NjY2NjY2NywgMzc0LjczMzMzMzMzMzMzMzM1LCA2MzMuMF0sIFszNzQuNzMzMzMzMzMzMzMzMzUsIDQwOC44MDAwMDAwMDAwMDAwNywgMTIxLjBdLCBbNDA4LjgwMDAwMDAwMDAwMDA3LCA0NDIuODY2NjY2NjY2NjY2NzMsIDE3LjBdLCBbNDQyLjg2NjY2NjY2NjY2NjczLCA0NzYuOTMzMzMzMzMzMzMzNCwgMi4wXSwgWzQ3Ni45MzMzMzMzMzMzMzM0LCA1MTEuMDAwMDAwMDAwMDAwMDYsIDQuMF0sIFs1MTEuMDAwMDAwMDAwMDAwMDYsIDU0NS4wNjY2NjY2NjY2NjY3LCA1MTIuMF0sIFs1NDUuMDY2NjY2NjY2NjY2NywgNTc5LjEzMzMzMzMzMzMzMzQsIDkyNS4wXSwgWzU3OS4xMzMzMzMzMzMzMzM0LCA2MTMuMiwgMjc5LjBdLCBbNjEzLjIsIDY0Ny4yNjY2NjY2NjY2NjY4LCA1NzMuMF0sIFs2NDcuMjY2NjY2NjY2NjY2OCwgNjgxLjMzMzMzMzMzMzMzMzQsIDEwLjBdLCBbNjgxLjMzMzMzMzMzMzMzMzQsIDcxNS40MDAwMDAwMDAwMDAxLCA5LjBdLCBbNzE1LjQwMDAwMDAwMDAwMDEsIDc0OS40NjY2NjY2NjY2NjY3LCA0LjBdLCBbNzQ5LjQ2NjY2NjY2NjY2NjcsIDc4My41MzMzMzMzMzMzMzM0LCAyMTUwLjBdLCBbNzgzLjUzMzMzMzMzMzMzMzQsIDgxNy42MDAwMDAwMDAwMDAxLCA5MzUwLjBdLCBbODE3LjYwMDAwMDAwMDAwMDEsIDg1MS42NjY2NjY2NjY2NjY3LCA4OTEuMF0sIFs4NTEuNjY2NjY2NjY2NjY2NywgODg1LjczMzMzMzMzMzMzMzUsIDQzMDEuMF0sIFs4ODUuNzMzMzMzMzMzMzMzNSwgOTE5LjgwMDAwMDAwMDAwMDEsIDEzOTYuMF0sIFs5MTkuODAwMDAwMDAwMDAwMSwgOTUzLjg2NjY2NjY2NjY2NjgsIDg2LjBdLCBbOTUzLjg2NjY2NjY2NjY2NjgsIDk4Ny45MzMzMzMzMzMzMzM0LCAzOC4wXSwgWzk4Ny45MzMzMzMzMzMzMzM0LCAxMDIyLjAsIDYyLjBdXV0sIFsxNjA1NzU4MTczLjgzMDcwNywgNywgW1swLjAsIDMzLjgzMzMzMzMzMzMzMzMzNiwgMTI1ODMuMF0sIFszMy44MzMzMzMzMzMzMzMzMzYsIDY3LjY2NjY2NjY2NjY2NjY3LCAxMTI3OC4wXSwgWzY3LjY2NjY2NjY2NjY2NjY3LCAxMDEuNSwgMTQzNS4wXSwgWzEwMS41LCAxMzUuMzMzMzMzMzMzMzMzMzQsIDg3ODguMF0sIFsxMzUuMzMzMzMzMzMzMzMzMzQsIDE2OS4xNjY2NjY2NjY2NjY2OSwgMTc2Ny4wXSwgWzE2OS4xNjY2NjY2NjY2NjY2OSwgMjAzLjAsIDQwNi4wXSwgWzIwMy4wLCAyMzYuODMzMzMzMzMzMzMzMzQsIDI5OC4wXSwgWzIzNi44MzMzMzMzMzMzMzMzNCwgMjcwLjY2NjY2NjY2NjY2NjcsIDE2MDQuMF0sIFsyNzAuNjY2NjY2NjY2NjY2NywgMzA0LjUsIDI5Mi4wXSwgWzMwNC41LCAzMzguMzMzMzMzMzMzMzMzMzcsIDgyLjBdLCBbMzM4LjMzMzMzMzMzMzMzMzM3LCAzNzIuMTY2NjY2NjY2NjY2NywgMTQxLjBdLCBbMzcyLjE2NjY2NjY2NjY2NjcsIDQwNi4wLCAxMTMuMF0sIFs0MDYuMCwgNDM5LjgzMzMzMzMzMzMzMzM3LCAzMy4wXSwgWzQzOS44MzMzMzMzMzMzMzMzNywgNDczLjY2NjY2NjY2NjY2NjcsIDUuMF0sIFs0NzMuNjY2NjY2NjY2NjY2NywgNTA3LjUwMDAwMDAwMDAwMDA2LCA0MC4wXSwgWzUwNy41MDAwMDAwMDAwMDAwNiwgNTQxLjMzMzMzMzMzMzMzMzQsIDk0NS4wXSwgWzU0MS4zMzMzMzMzMzMzMzM0LCA1NzUuMTY2NjY2NjY2NjY2NywgNjkzLjBdLCBbNTc1LjE2NjY2NjY2NjY2NjcsIDYwOS4wLCAxNTMuMF0sIFs2MDkuMCwgNjQyLjgzMzMzMzMzMzMzMzQsIDg5MC4wXSwgWzY0Mi44MzMzMzMzMzMzMzM0LCA2NzYuNjY2NjY2NjY2NjY2NywgOTEuMF0sIFs2NzYuNjY2NjY2NjY2NjY2NywgNzEwLjUsIDM4LjBdLCBbNzEwLjUsIDc0NC4zMzMzMzMzMzMzMzM0LCAxOC4wXSwgWzc0NC4zMzMzMzMzMzMzMzM0LCA3NzguMTY2NjY2NjY2NjY2NywgMzk2OS4wXSwgWzc3OC4xNjY2NjY2NjY2NjY3LCA4MTIuMCwgNTMyOC4wXSwgWzgxMi4wLCA4NDUuODMzMzMzMzMzMzMzNCwgMTM4OC4wXSwgWzg0NS44MzMzMzMzMzMzMzM0LCA4NzkuNjY2NjY2NjY2NjY2NywgOTczLjBdLCBbODc5LjY2NjY2NjY2NjY2NjcsIDkxMy41MDAwMDAwMDAwMDAxLCA1NjgwLjBdLCBbOTEzLjUwMDAwMDAwMDAwMDEsIDk0Ny4zMzMzMzMzMzMzMzM0LCAzNzUuMF0sIFs5NDcuMzMzMzMzMzMzMzMzNCwgOTgxLjE2NjY2NjY2NjY2NjcsIDEwNy4wXSwgWzk4MS4xNjY2NjY2NjY2NjY3LCAxMDE1LjAsIDQ4Ny4wXV1dLCBbMTYwNTc1ODE3NS43NzgwNSwgOCwgW1swLjAsIDMzLjgzMzMzMzMzMzMzMzMzNiwgMjI5NjkuMF0sIFszMy44MzMzMzMzMzMzMzMzMzYsIDY3LjY2NjY2NjY2NjY2NjY3LCAyNzc1LjBdLCBbNjcuNjY2NjY2NjY2NjY2NjcsIDEwMS41LCA1NzE5LjBdLCBbMTAxLjUsIDEzNS4zMzMzMzMzMzMzMzMzNCwgNTc0Ny4wXSwgWzEzNS4zMzMzMzMzMzMzMzMzNCwgMTY5LjE2NjY2NjY2NjY2NjY5LCAxMzUuMF0sIFsxNjkuMTY2NjY2NjY2NjY2NjksIDIwMy4wLCAxNTkuMF0sIFsyMDMuMCwgMjM2LjgzMzMzMzMzMzMzMzM0LCAyNzkuMF0sIFsyMzYuODMzMzMzMzMzMzMzMzQsIDI3MC42NjY2NjY2NjY2NjY3LCA2MTYuMF0sIFsyNzAuNjY2NjY2NjY2NjY2NywgMzA0LjUsIDYwLjBdLCBbMzA0LjUsIDMzOC4zMzMzMzMzMzMzMzMzNywgMTIzLjBdLCBbMzM4LjMzMzMzMzMzMzMzMzM3LCAzNzIuMTY2NjY2NjY2NjY2NywgMTUxLjBdLCBbMzcyLjE2NjY2NjY2NjY2NjcsIDQwNi4wLCAyOC4wXSwgWzQwNi4wLCA0MzkuODMzMzMzMzMzMzMzMzcsIDIuMF0sIFs0MzkuODMzMzMzMzMzMzMzMzcsIDQ3My42NjY2NjY2NjY2NjY3LCA2LjBdLCBbNDczLjY2NjY2NjY2NjY2NjcsIDUwNy41MDAwMDAwMDAwMDAwNiwgNC4wXSwgWzUwNy41MDAwMDAwMDAwMDAwNiwgNTQxLjMzMzMzMzMzMzMzMzQsIDExNDEuMF0sIFs1NDEuMzMzMzMzMzMzMzMzNCwgNTc1LjE2NjY2NjY2NjY2NjcsIDQ2LjBdLCBbNTc1LjE2NjY2NjY2NjY2NjcsIDYwOS4wLCA2NzUuMF0sIFs2MDkuMCwgNjQyLjgzMzMzMzMzMzMzMzQsIDQ1NS4wXSwgWzY0Mi44MzMzMzMzMzMzMzM0LCA2NzYuNjY2NjY2NjY2NjY2NywgMTAuMF0sIFs2NzYuNjY2NjY2NjY2NjY2NywgNzEwLjUsIDYuMF0sIFs3MTAuNSwgNzQ0LjMzMzMzMzMzMzMzMzQsIDMyLjBdLCBbNzQ0LjMzMzMzMzMzMzMzMzQsIDc3OC4xNjY2NjY2NjY2NjY3LCA2MjA0LjBdLCBbNzc4LjE2NjY2NjY2NjY2NjcsIDgxMi4wLCAxMzcwLjBdLCBbODEyLjAsIDg0NS44MzMzMzMzMzMzMzM0LCAxMDI3LjBdLCBbODQ1LjgzMzMzMzMzMzMzMzQsIDg3OS42NjY2NjY2NjY2NjY3LCA0MDQ4LjBdLCBbODc5LjY2NjY2NjY2NjY2NjcsIDkxMy41MDAwMDAwMDAwMDAxLCA1OTcyLjBdLCBbOTEzLjUwMDAwMDAwMDAwMDEsIDk0Ny4zMzMzMzMzMzMzMzM0LCAxNi4wXSwgWzk0Ny4zMzMzMzMzMzMzMzM0LCA5ODEuMTY2NjY2NjY2NjY2NywgMTQyLjBdLCBbOTgxLjE2NjY2NjY2NjY2NjcsIDEwMTUuMCwgODMuMF1dXSwgWzE2MDU3NTgxNzcuNTk1Nzk3LCA5LCBbWzAuMCwgMzQuMSwgMjM1MjEuMF0sIFszNC4xLCA2OC4yLCAzMDYxLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2MjkxLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNDIzNS4wXSwgWzEzNi40LCAxNzAuNSwgMTA5MS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDY5OC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA2MzQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NjIuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAxMjYuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAxMzIuMF0sIFszNDEuMCwgMzc1LjEsIDMwMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDEwNS4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAyMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDUuMF0sIFs1MTEuNSwgNTQ1LjYsIDY4MS4wXSwgWzU0NS42LCA1NzkuNywgNTIuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDQyMS4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTM5LjBdLCBbNjQ3LjksIDY4Mi4wLCAxMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMy4wXSwgWzcxNi4xLCA3NTAuMiwgMTguMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU0MzguMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDExNjQuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDE4MzUuMF0sIFs4NTIuNSwgODg2LjYsIDYzMzcuMF0sIFs4ODYuNiwgOTIwLjcsIDI1NjguMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDkuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDY5LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNzUuMF1dXSwgWzE2MDU3NTgxODAuMDUzOTM5LCAxMCwgW1swLjAsIDMzLjgsIDI2NDEwLjBdLCBbMzMuOCwgNjcuNiwgMjU2OS4wXSwgWzY3LjYsIDEwMS4zOTk5OTk5OTk5OTk5OSwgMjgxMC4wXSwgWzEwMS4zOTk5OTk5OTk5OTk5OSwgMTM1LjIsIDUyNjkuMF0sIFsxMzUuMiwgMTY5LjAsIDE4ODYuMF0sIFsxNjkuMCwgMjAyLjc5OTk5OTk5OTk5OTk4LCA3MC4wXSwgWzIwMi43OTk5OTk5OTk5OTk5OCwgMjM2LjU5OTk5OTk5OTk5OTk3LCAxMzUuMF0sIFsyMzYuNTk5OTk5OTk5OTk5OTcsIDI3MC40LCA2MzYuMF0sIFsyNzAuNCwgMzA0LjIsIDI5OS4wXSwgWzMwNC4yLCAzMzguMCwgNDcuMF0sIFszMzguMCwgMzcxLjc5OTk5OTk5OTk5OTk1LCAzMDEuMF0sIFszNzEuNzk5OTk5OTk5OTk5OTUsIDQwNS41OTk5OTk5OTk5OTk5NywgMjYuMF0sIFs0MDUuNTk5OTk5OTk5OTk5OTcsIDQzOS40LCA4LjBdLCBbNDM5LjQsIDQ3My4xOTk5OTk5OTk5OTk5MywgMi4wXSwgWzQ3My4xOTk5OTk5OTk5OTk5MywgNTA2Ljk5OTk5OTk5OTk5OTk0LCA4LjBdLCBbNTA2Ljk5OTk5OTk5OTk5OTk0LCA1NDAuOCwgNDY1LjBdLCBbNTQwLjgsIDU3NC41OTk5OTk5OTk5OTk5LCAxNjkuMF0sIFs1NzQuNTk5OTk5OTk5OTk5OSwgNjA4LjQsIDE3MC4wXSwgWzYwOC40LCA2NDIuMTk5OTk5OTk5OTk5OSwgMjQyLjBdLCBbNjQyLjE5OTk5OTk5OTk5OTksIDY3Ni4wLCAxLjBdLCBbNjc2LjAsIDcwOS44LCAwLjBdLCBbNzA5LjgsIDc0My41OTk5OTk5OTk5OTk5LCA0LjBdLCBbNzQzLjU5OTk5OTk5OTk5OTksIDc3Ny40LCA0MDQxLjBdLCBbNzc3LjQsIDgxMS4xOTk5OTk5OTk5OTk5LCAzNDk4LjBdLCBbODExLjE5OTk5OTk5OTk5OTksIDg0NC45OTk5OTk5OTk5OTk5LCAxMDI4LjBdLCBbODQ0Ljk5OTk5OTk5OTk5OTksIDg3OC44LCAzMzE3LjBdLCBbODc4LjgsIDkxMi41OTk5OTk5OTk5OTk5LCA2NTEyLjBdLCBbOTEyLjU5OTk5OTk5OTk5OTksIDk0Ni4zOTk5OTk5OTk5OTk5LCAxNS4wXSwgWzk0Ni4zOTk5OTk5OTk5OTk5LCA5ODAuMTk5OTk5OTk5OTk5OSwgMTkuMF0sIFs5ODAuMTk5OTk5OTk5OTk5OSwgMTAxNC4wLCA0My4wXV1dLCBbMTYwNTc1ODE4Mi4yODYzNTUsIDExLCBbWzAuMCwgMzQuMDY2NjY2NjY2NjY2NjcsIDI4ODk4LjBdLCBbMzQuMDY2NjY2NjY2NjY2NjcsIDY4LjEzMzMzMzMzMzMzMzM0LCAyNjAxLjBdLCBbNjguMTMzMzMzMzMzMzMzMzQsIDEwMi4yMDAwMDAwMDAwMDAwMiwgNzkyNS4wXSwgWzEwMi4yMDAwMDAwMDAwMDAwMiwgMTM2LjI2NjY2NjY2NjY2NjY4LCAzOTUwLjBdLCBbMTM2LjI2NjY2NjY2NjY2NjY4LCAxNzAuMzMzMzMzMzMzMzMzMzQsIDE3Ny4wXSwgWzE3MC4zMzMzMzMzMzMzMzMzNCwgMjA0LjQwMDAwMDAwMDAwMDAzLCA1MC4wXSwgWzIwNC40MDAwMDAwMDAwMDAwMywgMjM4LjQ2NjY2NjY2NjY2NjcsIDIyMi4wXSwgWzIzOC40NjY2NjY2NjY2NjY3LCAyNzIuNTMzMzMzMzMzMzMzMzYsIDM5OS4wXSwgWzI3Mi41MzMzMzMzMzMzMzMzNiwgMzA2LjYsIDEyNC4wXSwgWzMwNi42LCAzNDAuNjY2NjY2NjY2NjY2NywgMTk5LjBdLCBbMzQwLjY2NjY2NjY2NjY2NjcsIDM3NC43MzMzMzMzMzMzMzMzNSwgMzQwLjBdLCBbMzc0LjczMzMzMzMzMzMzMzM1LCA0MDguODAwMDAwMDAwMDAwMDcsIDQyLjBdLCBbNDA4LjgwMDAwMDAwMDAwMDA3LCA0NDIuODY2NjY2NjY2NjY2NzMsIDAuMF0sIFs0NDIuODY2NjY2NjY2NjY2NzMsIDQ3Ni45MzMzMzMzMzMzMzM0LCA2LjBdLCBbNDc2LjkzMzMzMzMzMzMzMzQsIDUxMS4wMDAwMDAwMDAwMDAwNiwgMC4wXSwgWzUxMS4wMDAwMDAwMDAwMDAwNiwgNTQ1LjA2NjY2NjY2NjY2NjcsIDQ3OS4wXSwgWzU0NS4wNjY2NjY2NjY2NjY3LCA1NzkuMTMzMzMzMzMzMzMzNCwgMTMuMF0sIFs1NzkuMTMzMzMzMzMzMzMzNCwgNjEzLjIsIDMwMS4wXSwgWzYxMy4yLCA2NDcuMjY2NjY2NjY2NjY2OCwgNDAuMF0sIFs2NDcuMjY2NjY2NjY2NjY2OCwgNjgxLjMzMzMzMzMzMzMzMzQsIDEuMF0sIFs2ODEuMzMzMzMzMzMzMzMzNCwgNzE1LjQwMDAwMDAwMDAwMDEsIDAuMF0sIFs3MTUuNDAwMDAwMDAwMDAwMSwgNzQ5LjQ2NjY2NjY2NjY2NjcsIDIuMF0sIFs3NDkuNDY2NjY2NjY2NjY2NywgNzgzLjUzMzMzMzMzMzMzMzQsIDM3NjUuMF0sIFs3ODMuNTMzMzMzMzMzMzMzNCwgODE3LjYwMDAwMDAwMDAwMDEsIDE1MDIuMF0sIFs4MTcuNjAwMDAwMDAwMDAwMSwgODUxLjY2NjY2NjY2NjY2NjcsIDQxOC4wXSwgWzg1MS42NjY2NjY2NjY2NjY3LCA4ODUuNzMzMzMzMzMzMzMzNSwgNzcyMy4wXSwgWzg4NS43MzMzMzMzMzMzMzM1LCA5MTkuODAwMDAwMDAwMDAwMSwgNzY2LjBdLCBbOTE5LjgwMDAwMDAwMDAwMDEsIDk1My44NjY2NjY2NjY2NjY4LCAwLjBdLCBbOTUzLjg2NjY2NjY2NjY2NjgsIDk4Ny45MzMzMzMzMzMzMzM0LCA0OS4wXSwgWzk4Ny45MzMzMzMzMzMzMzM0LCAxMDIyLjAsIDguMF1dXSwgWzE2MDU3NTgxODQuMTQzOTU2LCAxMiwgW1swLjAsIDMzLjk2NjY2NjY2NjY2NjY3LCAyNDk1OC4wXSwgWzMzLjk2NjY2NjY2NjY2NjY3LCA2Ny45MzMzMzMzMzMzMzMzNCwgNTEyMC4wXSwgWzY3LjkzMzMzMzMzMzMzMzM0LCAxMDEuOSwgMzg0OS4wXSwgWzEwMS45LCAxMzUuODY2NjY2NjY2NjY2NjcsIDU0ODIuMF0sIFsxMzUuODY2NjY2NjY2NjY2NjcsIDE2OS44MzMzMzMzMzMzMzMzNCwgNjMyLjBdLCBbMTY5LjgzMzMzMzMzMzMzMzM0LCAyMDMuOCwgMzkuMF0sIFsyMDMuOCwgMjM3Ljc2NjY2NjY2NjY2NjY4LCAxMTIuMF0sIFsyMzcuNzY2NjY2NjY2NjY2NjgsIDI3MS43MzMzMzMzMzMzMzMzNSwgMjg1LjBdLCBbMjcxLjczMzMzMzMzMzMzMzM1LCAzMDUuNzAwMDAwMDAwMDAwMDUsIDI1My4wXSwgWzMwNS43MDAwMDAwMDAwMDAwNSwgMzM5LjY2NjY2NjY2NjY2NjcsIDg5LjBdLCBbMzM5LjY2NjY2NjY2NjY2NjcsIDM3My42MzMzMzMzMzMzMzMzLCAxMDcuMF0sIFszNzMuNjMzMzMzMzMzMzMzMywgNDA3LjYsIDE5LjBdLCBbNDA3LjYsIDQ0MS41NjY2NjY2NjY2NjY3LCA5LjBdLCBbNDQxLjU2NjY2NjY2NjY2NjcsIDQ3NS41MzMzMzMzMzMzMzMzNiwgNC4wXSwgWzQ3NS41MzMzMzMzMzMzMzMzNiwgNTA5LjUsIDIuMF0sIFs1MDkuNSwgNTQzLjQ2NjY2NjY2NjY2NjcsIDIzNS4wXSwgWzU0My40NjY2NjY2NjY2NjY3LCA1NzcuNDMzMzMzMzMzMzMzNCwgMzAzLjBdLCBbNTc3LjQzMzMzMzMzMzMzMzQsIDYxMS40MDAwMDAwMDAwMDAxLCAxMjQuMF0sIFs2MTEuNDAwMDAwMDAwMDAwMSwgNjQ1LjM2NjY2NjY2NjY2NjcsIDI1MS4wXSwgWzY0NS4zNjY2NjY2NjY2NjY3LCA2NzkuMzMzMzMzMzMzMzMzNCwgMi4wXSwgWzY3OS4zMzMzMzMzMzMzMzM0LCA3MTMuMzAwMDAwMDAwMDAwMSwgMC4wXSwgWzcxMy4zMDAwMDAwMDAwMDAxLCA3NDcuMjY2NjY2NjY2NjY2NywgMy4wXSwgWzc0Ny4yNjY2NjY2NjY2NjY3LCA3ODEuMjMzMzMzMzMzMzMzMywgMTkyNC4wXSwgWzc4MS4yMzMzMzMzMzMzMzMzLCA4MTUuMiwgNjI0Ny4wXSwgWzgxNS4yLCA4NDkuMTY2NjY2NjY2NjY2NywgODQ3LjBdLCBbODQ5LjE2NjY2NjY2NjY2NjcsIDg4My4xMzMzMzMzMzMzMzM0LCA3ODcxLjBdLCBbODgzLjEzMzMzMzMzMzMzMzQsIDkxNy4xLCA5MTEuMF0sIFs5MTcuMSwgOTUxLjA2NjY2NjY2NjY2NjcsIDE0My4wXSwgWzk1MS4wNjY2NjY2NjY2NjY3LCA5ODUuMDMzMzMzMzMzMzMzNCwgNTUuMF0sIFs5ODUuMDMzMzMzMzMzMzMzNCwgMTAxOS4wLCAxMjQuMF1dXSwgWzE2MDU3NTgxODguMDc3OTcyLCAxNCwgW1swLjAsIDMzLjcsIDE2OTE1LjBdLCBbMzMuNywgNjcuNCwgMTI1MjguMF0sIFs2Ny40LCAxMDEuMTAwMDAwMDAwMDAwMDEsIDkxNDYuMF0sIFsxMDEuMTAwMDAwMDAwMDAwMDEsIDEzNC44LCAyMTcyLjBdLCBbMTM0LjgsIDE2OC41LCAyMi4wXSwgWzE2OC41LCAyMDIuMjAwMDAwMDAwMDAwMDIsIDU5LjBdLCBbMjAyLjIwMDAwMDAwMDAwMDAyLCAyMzUuOTAwMDAwMDAwMDAwMDMsIDE3LjBdLCBbMjM1LjkwMDAwMDAwMDAwMDAzLCAyNjkuNiwgMTI5LjBdLCBbMjY5LjYsIDMwMy4zLCAxNDUuMF0sIFszMDMuMywgMzM3LjAsIDg1LjBdLCBbMzM3LjAsIDM3MC43MDAwMDAwMDAwMDAwNSwgODcuMF0sIFszNzAuNzAwMDAwMDAwMDAwMDUsIDQwNC40MDAwMDAwMDAwMDAwMywgNC4wXSwgWzQwNC40MDAwMDAwMDAwMDAwMywgNDM4LjEsIDIuMF0sIFs0MzguMSwgNDcxLjgwMDAwMDAwMDAwMDA3LCAxLjBdLCBbNDcxLjgwMDAwMDAwMDAwMDA3LCA1MDUuNTAwMDAwMDAwMDAwMDYsIDAuMF0sIFs1MDUuNTAwMDAwMDAwMDAwMDYsIDUzOS4yLCAyNDAuMF0sIFs1MzkuMiwgNTcyLjkwMDAwMDAwMDAwMDEsIDE0My4wXSwgWzU3Mi45MDAwMDAwMDAwMDAxLCA2MDYuNiwgODkxLjBdLCBbNjA2LjYsIDY0MC4zMDAwMDAwMDAwMDAxLCAyMjYuMF0sIFs2NDAuMzAwMDAwMDAwMDAwMSwgNjc0LjAsIDEuMF0sIFs2NzQuMCwgNzA3LjcsIDYuMF0sIFs3MDcuNywgNzQxLjQwMDAwMDAwMDAwMDEsIDIuMF0sIFs3NDEuNDAwMDAwMDAwMDAwMSwgNzc1LjEsIDE2MTYuMF0sIFs3NzUuMSwgODA4LjgwMDAwMDAwMDAwMDEsIDMyNjMuMF0sIFs4MDguODAwMDAwMDAwMDAwMSwgODQyLjUwMDAwMDAwMDAwMDEsIDQwNzYuMF0sIFs4NDIuNTAwMDAwMDAwMDAwMSwgODc2LjIsIDY4OTAuMF0sIFs4NzYuMiwgOTA5LjkwMDAwMDAwMDAwMDEsIDExMjEuMF0sIFs5MDkuOTAwMDAwMDAwMDAwMSwgOTQzLjYwMDAwMDAwMDAwMDEsIDEzLjBdLCBbOTQzLjYwMDAwMDAwMDAwMDEsIDk3Ny4zMDAwMDAwMDAwMDAxLCAxMzguMF0sIFs5NzcuMzAwMDAwMDAwMDAwMSwgMTAxMS4wLCA2Mi4wXV1dLCBbMTYwNTc1ODE4OS45MzcxNjIsIDE1LCBbWzAuMCwgMzQuMDY2NjY2NjY2NjY2NjcsIDE3MzYyLjBdLCBbMzQuMDY2NjY2NjY2NjY2NjcsIDY4LjEzMzMzMzMzMzMzMzM0LCA5OTg3LjBdLCBbNjguMTMzMzMzMzMzMzMzMzQsIDEwMi4yMDAwMDAwMDAwMDAwMiwgMzQ5Ny4wXSwgWzEwMi4yMDAwMDAwMDAwMDAwMiwgMTM2LjI2NjY2NjY2NjY2NjY4LCA2NzE2LjBdLCBbMTM2LjI2NjY2NjY2NjY2NjY4LCAxNzAuMzMzMzMzMzMzMzMzMzQsIDMzODAuMF0sIFsxNzAuMzMzMzMzMzMzMzMzMzQsIDIwNC40MDAwMDAwMDAwMDAwMywgMjAyLjBdLCBbMjA0LjQwMDAwMDAwMDAwMDAzLCAyMzguNDY2NjY2NjY2NjY2NywgMTI0Mi4wXSwgWzIzOC40NjY2NjY2NjY2NjY3LCAyNzIuNTMzMzMzMzMzMzMzMzYsIDI5OC4wXSwgWzI3Mi41MzMzMzMzMzMzMzMzNiwgMzA2LjYsIDM3OC4wXSwgWzMwNi42LCAzNDAuNjY2NjY2NjY2NjY2NywgMjQ1LjBdLCBbMzQwLjY2NjY2NjY2NjY2NjcsIDM3NC43MzMzMzMzMzMzMzMzNSwgMTUyLjBdLCBbMzc0LjczMzMzMzMzMzMzMzM1LCA0MDguODAwMDAwMDAwMDAwMDcsIDMzMS4wXSwgWzQwOC44MDAwMDAwMDAwMDAwNywgNDQyLjg2NjY2NjY2NjY2NjczLCA4OS4wXSwgWzQ0Mi44NjY2NjY2NjY2NjY3MywgNDc2LjkzMzMzMzMzMzMzMzQsIDIyOS4wXSwgWzQ3Ni45MzMzMzMzMzMzMzM0LCA1MTEuMDAwMDAwMDAwMDAwMDYsIDIyLjBdLCBbNTExLjAwMDAwMDAwMDAwMDA2LCA1NDUuMDY2NjY2NjY2NjY2NywgMTEwLjBdLCBbNTQ1LjA2NjY2NjY2NjY2NjcsIDU3OS4xMzMzMzMzMzMzMzM0LCA4NC4wXSwgWzU3OS4xMzMzMzMzMzMzMzM0LCA2MTMuMiwgMTEuMF0sIFs2MTMuMiwgNjQ3LjI2NjY2NjY2NjY2NjgsIDY0LjBdLCBbNjQ3LjI2NjY2NjY2NjY2NjgsIDY4MS4zMzMzMzMzMzMzMzM0LCAzNi4wXSwgWzY4MS4zMzMzMzMzMzMzMzM0LCA3MTUuNDAwMDAwMDAwMDAwMSwgNC4wXSwgWzcxNS40MDAwMDAwMDAwMDAxLCA3NDkuNDY2NjY2NjY2NjY2NywgMTAuMF0sIFs3NDkuNDY2NjY2NjY2NjY2NywgNzgzLjUzMzMzMzMzMzMzMzQsIDk0NC4wXSwgWzc4My41MzMzMzMzMzMzMzM0LCA4MTcuNjAwMDAwMDAwMDAwMSwgNDA4My4wXSwgWzgxNy42MDAwMDAwMDAwMDAxLCA4NTEuNjY2NjY2NjY2NjY2NywgMTgxNS4wXSwgWzg1MS42NjY2NjY2NjY2NjY3LCA4ODUuNzMzMzMzMzMzMzMzNSwgMTYxNy4wXSwgWzg4NS43MzMzMzMzMzMzMzM1LCA5MTkuODAwMDAwMDAwMDAwMSwgMzYwMC4wXSwgWzkxOS44MDAwMDAwMDAwMDAxLCA5NTMuODY2NjY2NjY2NjY2OCwgMTI1NS4wXSwgWzk1My44NjY2NjY2NjY2NjY4LCA5ODcuOTMzMzMzMzMzMzMzNCwgMTg4MC4wXSwgWzk4Ny45MzMzMzMzMzMzMzM0LCAxMDIyLjAsIDM1Ny4wXV1dLCBbMTYwNTc1ODE5MS44MDg2MzYsIDE2LCBbWzAuMCwgMzMuOTY2NjY2NjY2NjY2NjcsIDE0ODg3LjBdLCBbMzMuOTY2NjY2NjY2NjY2NjcsIDY3LjkzMzMzMzMzMzMzMzM0LCAxMDAzNS4wXSwgWzY3LjkzMzMzMzMzMzMzMzM0LCAxMDEuOSwgNTE2My4wXSwgWzEwMS45LCAxMzUuODY2NjY2NjY2NjY2NjcsIDY1NTguMF0sIFsxMzUuODY2NjY2NjY2NjY2NjcsIDE2OS44MzMzMzMzMzMzMzMzNCwgNTUuMF0sIFsxNjkuODMzMzMzMzMzMzMzMzQsIDIwMy44LCA3LjBdLCBbMjAzLjgsIDIzNy43NjY2NjY2NjY2NjY2OCwgMjAuMF0sIFsyMzcuNzY2NjY2NjY2NjY2NjgsIDI3MS43MzMzMzMzMzMzMzMzNSwgMjEwLjBdLCBbMjcxLjczMzMzMzMzMzMzMzM1LCAzMDUuNzAwMDAwMDAwMDAwMDUsIDU3OS4wXSwgWzMwNS43MDAwMDAwMDAwMDAwNSwgMzM5LjY2NjY2NjY2NjY2NjcsIDE3NS4wXSwgWzMzOS42NjY2NjY2NjY2NjY3LCAzNzMuNjMzMzMzMzMzMzMzMywgMTYwLjBdLCBbMzczLjYzMzMzMzMzMzMzMzMsIDQwNy42LCAzMC4wXSwgWzQwNy42LCA0NDEuNTY2NjY2NjY2NjY2NywgMy4wXSwgWzQ0MS41NjY2NjY2NjY2NjY3LCA0NzUuNTMzMzMzMzMzMzMzMzYsIDIuMF0sIFs0NzUuNTMzMzMzMzMzMzMzMzYsIDUwOS41LCAxLjBdLCBbNTA5LjUsIDU0My40NjY2NjY2NjY2NjY3LCA2OS4wXSwgWzU0My40NjY2NjY2NjY2NjY3LCA1NzcuNDMzMzMzMzMzMzMzNCwgMTg3LjBdLCBbNTc3LjQzMzMzMzMzMzMzMzQsIDYxMS40MDAwMDAwMDAwMDAxLCA5NS4wXSwgWzYxMS40MDAwMDAwMDAwMDAxLCA2NDUuMzY2NjY2NjY2NjY2NywgMTYwLjBdLCBbNjQ1LjM2NjY2NjY2NjY2NjcsIDY3OS4zMzMzMzMzMzMzMzM0LCAyLjBdLCBbNjc5LjMzMzMzMzMzMzMzMzQsIDcxMy4zMDAwMDAwMDAwMDAxLCAxLjBdLCBbNzEzLjMwMDAwMDAwMDAwMDEsIDc0Ny4yNjY2NjY2NjY2NjY3LCAwLjBdLCBbNzQ3LjI2NjY2NjY2NjY2NjcsIDc4MS4yMzMzMzMzMzMzMzMzLCA5MjcuMF0sIFs3ODEuMjMzMzMzMzMzMzMzMywgODE1LjIsIDczNjQuMF0sIFs4MTUuMiwgODQ5LjE2NjY2NjY2NjY2NjcsIDQ3NjUuMF0sIFs4NDkuMTY2NjY2NjY2NjY2NywgODgzLjEzMzMzMzMzMzMzMzQsIDY5NjkuMF0sIFs4ODMuMTMzMzMzMzMzMzMzNCwgOTE3LjEsIDEyODIuMF0sIFs5MTcuMSwgOTUxLjA2NjY2NjY2NjY2NjcsIDEyNC4wXSwgWzk1MS4wNjY2NjY2NjY2NjY3LCA5ODUuMDMzMzMzMzMzMzMzNCwgOTkuMF0sIFs5ODUuMDMzMzMzMzMzMzMzNCwgMTAxOS4wLCA3MS4wXV1dLCBbMTYwNTc1ODE5My43MTAxMjMsIDE3LCBbWzAuMCwgMzIuOTY2NjY2NjY2NjY2NjcsIDI1NzEyLjBdLCBbMzIuOTY2NjY2NjY2NjY2NjcsIDY1LjkzMzMzMzMzMzMzMzM0LCA2NjM3LjBdLCBbNjUuOTMzMzMzMzMzMzMzMzQsIDk4LjksIDc2MDYuMF0sIFs5OC45LCAxMzEuODY2NjY2NjY2NjY2NjcsIDMwMDcuMF0sIFsxMzEuODY2NjY2NjY2NjY2NjcsIDE2NC44MzMzMzMzMzMzMzMzNCwgOC4wXSwgWzE2NC44MzMzMzMzMzMzMzMzNCwgMTk3LjgsIDEuMF0sIFsxOTcuOCwgMjMwLjc2NjY2NjY2NjY2NjY4LCA0LjBdLCBbMjMwLjc2NjY2NjY2NjY2NjY4LCAyNjMuNzMzMzMzMzMzMzMzMzUsIDQ3Mi4wXSwgWzI2My43MzMzMzMzMzMzMzMzNSwgMjk2LjcwMDAwMDAwMDAwMDA1LCAxNDUuMF0sIFsyOTYuNzAwMDAwMDAwMDAwMDUsIDMyOS42NjY2NjY2NjY2NjY3LCAyMC4wXSwgWzMyOS42NjY2NjY2NjY2NjY3LCAzNjIuNjMzMzMzMzMzMzMzMywgMTc3LjBdLCBbMzYyLjYzMzMzMzMzMzMzMzMsIDM5NS42LCAyNS4wXSwgWzM5NS42LCA0MjguNTY2NjY2NjY2NjY2NywgMi4wXSwgWzQyOC41NjY2NjY2NjY2NjY3LCA0NjEuNTMzMzMzMzMzMzMzMzYsIDAuMF0sIFs0NjEuNTMzMzMzMzMzMzMzMzYsIDQ5NC41LCAwLjBdLCBbNDk0LjUsIDUyNy40NjY2NjY2NjY2NjY3LCAzNjAuMF0sIFs1MjcuNDY2NjY2NjY2NjY2NywgNTYwLjQzMzMzMzMzMzMzMzQsIDExMS4wXSwgWzU2MC40MzMzMzMzMzMzMzM0LCA1OTMuNDAwMDAwMDAwMDAwMSwgMjEuMF0sIFs1OTMuNDAwMDAwMDAwMDAwMSwgNjI2LjM2NjY2NjY2NjY2NjcsIDE0My4wXSwgWzYyNi4zNjY2NjY2NjY2NjY3LCA2NTkuMzMzMzMzMzMzMzMzNCwgMTMuMF0sIFs2NTkuMzMzMzMzMzMzMzMzNCwgNjkyLjMwMDAwMDAwMDAwMDEsIDAuMF0sIFs2OTIuMzAwMDAwMDAwMDAwMSwgNzI1LjI2NjY2NjY2NjY2NjcsIDAuMF0sIFs3MjUuMjY2NjY2NjY2NjY2NywgNzU4LjIzMzMzMzMzMzMzMzMsIDAuMF0sIFs3NTguMjMzMzMzMzMzMzMzMywgNzkxLjIsIDk1NTcuMF0sIFs3OTEuMiwgODI0LjE2NjY2NjY2NjY2NjcsIDE0MzQuMF0sIFs4MjQuMTY2NjY2NjY2NjY2NywgODU3LjEzMzMzMzMzMzMzMzQsIDQwODcuMF0sIFs4NTcuMTMzMzMzMzMzMzMzNCwgODkwLjEsIDMxNi4wXSwgWzg5MC4xLCA5MjMuMDY2NjY2NjY2NjY2NywgMTAyLjBdLCBbOTIzLjA2NjY2NjY2NjY2NjcsIDk1Ni4wMzMzMzMzMzMzMzM0LCAxLjBdLCBbOTU2LjAzMzMzMzMzMzMzMzQsIDk4OS4wLCAzOS4wXV1dLCBbMTYwNTc1ODE5NS43MDI5NDMsIDE4LCBbWzAuMCwgMzMuODMzMzMzMzMzMzMzMzM2LCAxMTI5MC4wXSwgWzMzLjgzMzMzMzMzMzMzMzMzNiwgNjcuNjY2NjY2NjY2NjY2NjcsIDYwOTkuMF0sIFs2Ny42NjY2NjY2NjY2NjY2NywgMTAxLjUsIDExMTg3LjBdLCBbMTAxLjUsIDEzNS4zMzMzMzMzMzMzMzMzNCwgNzU5My4wXSwgWzEzNS4zMzMzMzMzMzMzMzMzNCwgMTY5LjE2NjY2NjY2NjY2NjY5LCAxMDgxLjBdLCBbMTY5LjE2NjY2NjY2NjY2NjY5LCAyMDMuMCwgNTYwLjBdLCBbMjAzLjAsIDIzNi44MzMzMzMzMzMzMzMzNCwgNTY2LjBdLCBbMjM2LjgzMzMzMzMzMzMzMzM0LCAyNzAuNjY2NjY2NjY2NjY2NywgODIuMF0sIFsyNzAuNjY2NjY2NjY2NjY2NywgMzA0LjUsIDUzLjBdLCBbMzA0LjUsIDMzOC4zMzMzMzMzMzMzMzMzNywgMjQuMF0sIFszMzguMzMzMzMzMzMzMzMzMzcsIDM3Mi4xNjY2NjY2NjY2NjY3LCA2OC4wXSwgWzM3Mi4xNjY2NjY2NjY2NjY3LCA0MDYuMCwgMzYuMF0sIFs0MDYuMCwgNDM5LjgzMzMzMzMzMzMzMzM3LCAzNi4wXSwgWzQzOS44MzMzMzMzMzMzMzMzNywgNDczLjY2NjY2NjY2NjY2NjcsIDE3LjBdLCBbNDczLjY2NjY2NjY2NjY2NjcsIDUwNy41MDAwMDAwMDAwMDAwNiwgNC4wXSwgWzUwNy41MDAwMDAwMDAwMDAwNiwgNTQxLjMzMzMzMzMzMzMzMzQsIDIzMi4wXSwgWzU0MS4zMzMzMzMzMzMzMzM0LCA1NzUuMTY2NjY2NjY2NjY2NywgMTg2LjBdLCBbNTc1LjE2NjY2NjY2NjY2NjcsIDYwOS4wLCA2ODQuMF0sIFs2MDkuMCwgNjQyLjgzMzMzMzMzMzMzMzQsIDQ1Mi4wXSwgWzY0Mi44MzMzMzMzMzMzMzM0LCA2NzYuNjY2NjY2NjY2NjY2NywgODMuMF0sIFs2NzYuNjY2NjY2NjY2NjY2NywgNzEwLjUsIDg3LjBdLCBbNzEwLjUsIDc0NC4zMzMzMzMzMzMzMzM0LCAxMTUuMF0sIFs3NDQuMzMzMzMzMzMzMzMzNCwgNzc4LjE2NjY2NjY2NjY2NjcsIDEyOTEuMF0sIFs3NzguMTY2NjY2NjY2NjY2NywgODEyLjAsIDIwMTUuMF0sIFs4MTIuMCwgODQ1LjgzMzMzMzMzMzMzMzQsIDE1MzMuMF0sIFs4NDUuODMzMzMzMzMzMzMzNCwgODc5LjY2NjY2NjY2NjY2NjcsIDQ1NzQuMF0sIFs4NzkuNjY2NjY2NjY2NjY2NywgOTEzLjUwMDAwMDAwMDAwMDEsIDM3MTMuMF0sIFs5MTMuNTAwMDAwMDAwMDAwMSwgOTQ3LjMzMzMzMzMzMzMzMzQsIDEwNjMuMF0sIFs5NDcuMzMzMzMzMzMzMzMzNCwgOTgxLjE2NjY2NjY2NjY2NjcsIDM5ODcuMF0sIFs5ODEuMTY2NjY2NjY2NjY2NywgMTAxNS4wLCAxMjg5LjBdXV0sIFsxNjA1NzU4MTk3LjU0NTg5OSwgMTksIFtbMC4wLCAzMy4yLCAxNzI3Mi4wXSwgWzMzLjIsIDY2LjQsIDM4NTMuMF0sIFs2Ni40LCA5OS42MDAwMDAwMDAwMDAwMSwgMTAzOTYuMF0sIFs5OS42MDAwMDAwMDAwMDAwMSwgMTMyLjgsIDQ3MTMuMF0sIFsxMzIuOCwgMTY2LjAsIDMwLjBdLCBbMTY2LjAsIDE5OS4yMDAwMDAwMDAwMDAwMiwgMTEuMF0sIFsxOTkuMjAwMDAwMDAwMDAwMDIsIDIzMi40MDAwMDAwMDAwMDAwMywgOS4wXSwgWzIzMi40MDAwMDAwMDAwMDAwMywgMjY1LjYsIDIxOS4wXSwgWzI2NS42LCAyOTguOCwgNzQuMF0sIFsyOTguOCwgMzMyLjAsIDU4LjBdLCBbMzMyLjAsIDM2NS4yMDAwMDAwMDAwMDAwNSwgNzcuMF0sIFszNjUuMjAwMDAwMDAwMDAwMDUsIDM5OC40MDAwMDAwMDAwMDAwMywgMTcuMF0sIFszOTguNDAwMDAwMDAwMDAwMDMsIDQzMS42LCAwLjBdLCBbNDMxLjYsIDQ2NC44MDAwMDAwMDAwMDAwNywgMC4wXSwgWzQ2NC44MDAwMDAwMDAwMDAwNywgNDk4LjAwMDAwMDAwMDAwMDA2LCAwLjBdLCBbNDk4LjAwMDAwMDAwMDAwMDA2LCA1MzEuMiwgNjE0LjBdLCBbNTMxLjIsIDU2NC40MDAwMDAwMDAwMDAxLCAxNzcuMF0sIFs1NjQuNDAwMDAwMDAwMDAwMSwgNTk3LjYsIDQ0Ni4wXSwgWzU5Ny42LCA2MzAuODAwMDAwMDAwMDAwMSwgMzE0LjBdLCBbNjMwLjgwMDAwMDAwMDAwMDEsIDY2NC4wLCAxNi4wXSwgWzY2NC4wLCA2OTcuMiwgMC4wXSwgWzY5Ny4yLCA3MzAuNDAwMDAwMDAwMDAwMSwgMi4wXSwgWzczMC40MDAwMDAwMDAwMDAxLCA3NjMuNiwgMC4wXSwgWzc2My42LCA3OTYuODAwMDAwMDAwMDAwMSwgNjgxNS4wXSwgWzc5Ni44MDAwMDAwMDAwMDAxLCA4MzAuMDAwMDAwMDAwMDAwMSwgMzMzOC4wXSwgWzgzMC4wMDAwMDAwMDAwMDAxLCA4NjMuMiwgNzU5NC4wXSwgWzg2My4yLCA4OTYuNDAwMDAwMDAwMDAwMSwgMzgxNC4wXSwgWzg5Ni40MDAwMDAwMDAwMDAxLCA5MjkuNjAwMDAwMDAwMDAwMSwgNzkuMF0sIFs5MjkuNjAwMDAwMDAwMDAwMSwgOTYyLjgwMDAwMDAwMDAwMDEsIDE1LjBdLCBbOTYyLjgwMDAwMDAwMDAwMDEsIDk5Ni4wLCA0Ny4wXV1dLCBbMTYwNTc1ODE5OS4zOTAyMywgMjAsIFtbMC4wLCAzMy42LCAxNDA2Ni4wXSwgWzMzLjYsIDY3LjIsIDQ1NzAuMF0sIFs2Ny4yLCAxMDAuODAwMDAwMDAwMDAwMDEsIDkwMTguMF0sIFsxMDAuODAwMDAwMDAwMDAwMDEsIDEzNC40LCA3ODg2LjBdLCBbMTM0LjQsIDE2OC4wLCA5LjBdLCBbMTY4LjAsIDIwMS42MDAwMDAwMDAwMDAwMiwgMTcuMF0sIFsyMDEuNjAwMDAwMDAwMDAwMDIsIDIzNS4yMDAwMDAwMDAwMDAwMiwgMTQuMF0sIFsyMzUuMjAwMDAwMDAwMDAwMDIsIDI2OC44LCAxNTEuMF0sIFsyNjguOCwgMzAyLjQwMDAwMDAwMDAwMDAzLCAxMDUuMF0sIFszMDIuNDAwMDAwMDAwMDAwMDMsIDMzNi4wLCAzMy4wXSwgWzMzNi4wLCAzNjkuNiwgMjYzLjBdLCBbMzY5LjYsIDQwMy4yMDAwMDAwMDAwMDAwNSwgMzcuMF0sIFs0MDMuMjAwMDAwMDAwMDAwMDUsIDQzNi44LCAwLjBdLCBbNDM2LjgsIDQ3MC40MDAwMDAwMDAwMDAwMywgMS4wXSwgWzQ3MC40MDAwMDAwMDAwMDAwMywgNTA0LjAsIDAuMF0sIFs1MDQuMCwgNTM3LjYsIDQyNi4wXSwgWzUzNy42LCA1NzEuMiwgMTg0LjBdLCBbNTcxLjIsIDYwNC44MDAwMDAwMDAwMDAxLCAyMjcuMF0sIFs2MDQuODAwMDAwMDAwMDAwMSwgNjM4LjQsIDExOS4wXSwgWzYzOC40LCA2NzIuMCwgMTQuMF0sIFs2NzIuMCwgNzA1LjYsIDEuMF0sIFs3MDUuNiwgNzM5LjIsIDAuMF0sIFs3MzkuMiwgNzcyLjgwMDAwMDAwMDAwMDEsIDU0MDIuMF0sIFs3NzIuODAwMDAwMDAwMDAwMSwgODA2LjQwMDAwMDAwMDAwMDEsIDU2OTYuMF0sIFs4MDYuNDAwMDAwMDAwMDAwMSwgODQwLjAsIDIyMzkuMF0sIFs4NDAuMCwgODczLjYsIDYzMjkuMF0sIFs4NzMuNiwgOTA3LjIsIDMwODIuMF0sIFs5MDcuMiwgOTQwLjgwMDAwMDAwMDAwMDEsIDYuMF0sIFs5NDAuODAwMDAwMDAwMDAwMSwgOTc0LjQwMDAwMDAwMDAwMDEsIDQ4LjBdLCBbOTc0LjQwMDAwMDAwMDAwMDEsIDEwMDguMCwgNTcuMF1dXSwgWzE2MDU3NTgyMDEuMjMwMzA4LCAyMSwgW1swLjAsIDMzLjgzMzMzMzMzMzMzMzMzNiwgOTQ2Ny4wXSwgWzMzLjgzMzMzMzMzMzMzMzMzNiwgNjcuNjY2NjY2NjY2NjY2NjcsIDUwNjEuMF0sIFs2Ny42NjY2NjY2NjY2NjY2NywgMTAxLjUsIDY1NDkuMF0sIFsxMDEuNSwgMTM1LjMzMzMzMzMzMzMzMzM0LCA3OTk0LjBdLCBbMTM1LjMzMzMzMzMzMzMzMzM0LCAxNjkuMTY2NjY2NjY2NjY2NjksIDI0NDcuMF0sIFsxNjkuMTY2NjY2NjY2NjY2NjksIDIwMy4wLCAxNTQ1LjBdLCBbMjAzLjAsIDIzNi44MzMzMzMzMzMzMzMzNCwgMzgzNi4wXSwgWzIzNi44MzMzMzMzMzMzMzMzNCwgMjcwLjY2NjY2NjY2NjY2NjcsIDkzNS4wXSwgWzI3MC42NjY2NjY2NjY2NjY3LCAzMDQuNSwgNDkuMF0sIFszMDQuNSwgMzM4LjMzMzMzMzMzMzMzMzM3LCA1My4wXSwgWzMzOC4zMzMzMzMzMzMzMzMzNywgMzcyLjE2NjY2NjY2NjY2NjcsIDEzMS4wXSwgWzM3Mi4xNjY2NjY2NjY2NjY3LCA0MDYuMCwgOTYuMF0sIFs0MDYuMCwgNDM5LjgzMzMzMzMzMzMzMzM3LCAxMy4wXSwgWzQzOS44MzMzMzMzMzMzMzMzNywgNDczLjY2NjY2NjY2NjY2NjcsIDE1Ni4wXSwgWzQ3My42NjY2NjY2NjY2NjY3LCA1MDcuNTAwMDAwMDAwMDAwMDYsIDE5LjBdLCBbNTA3LjUwMDAwMDAwMDAwMDA2LCA1NDEuMzMzMzMzMzMzMzMzNCwgMjAzLjBdLCBbNTQxLjMzMzMzMzMzMzMzMzQsIDU3NS4xNjY2NjY2NjY2NjY3LCAxMjEuMF0sIFs1NzUuMTY2NjY2NjY2NjY2NywgNjA5LjAsIDEyOC4wXSwgWzYwOS4wLCA2NDIuODMzMzMzMzMzMzMzNCwgMTAxLjBdLCBbNjQyLjgzMzMzMzMzMzMzMzQsIDY3Ni42NjY2NjY2NjY2NjY3LCAyMzkuMF0sIFs2NzYuNjY2NjY2NjY2NjY2NywgNzEwLjUsIDU2LjBdLCBbNzEwLjUsIDc0NC4zMzMzMzMzMzMzMzM0LCA3OC4wXSwgWzc0NC4zMzMzMzMzMzMzMzM0LCA3NzguMTY2NjY2NjY2NjY2NywgNDU5My4wXSwgWzc3OC4xNjY2NjY2NjY2NjY3LCA4MTIuMCwgMjUzNS4wXSwgWzgxMi4wLCA4NDUuODMzMzMzMzMzMzMzNCwgMTAwNi4wXSwgWzg0NS44MzMzMzMzMzMzMzM0LCA4NzkuNjY2NjY2NjY2NjY2NywgMzU1Ny4wXSwgWzg3OS42NjY2NjY2NjY2NjY3LCA5MTMuNTAwMDAwMDAwMDAwMSwgNDgyNi4wXSwgWzkxMy41MDAwMDAwMDAwMDAxLCA5NDcuMzMzMzMzMzMzMzMzNCwgNzE2LjBdLCBbOTQ3LjMzMzMzMzMzMzMzMzQsIDk4MS4xNjY2NjY2NjY2NjY3LCAyNTI5LjBdLCBbOTgxLjE2NjY2NjY2NjY2NjcsIDEwMTUuMCwgOTYxLjBdXV0sIFsxNjA1NzU4MjAzLjA1Mjk3OCwgMjIsIFtbMC4wLCAzMy43LCA4MDQ2LjBdLCBbMzMuNywgNjcuNCwgNTAwMC4wXSwgWzY3LjQsIDEwMS4xMDAwMDAwMDAwMDAwMSwgODY4My4wXSwgWzEwMS4xMDAwMDAwMDAwMDAwMSwgMTM0LjgsIDgxNjMuMF0sIFsxMzQuOCwgMTY4LjUsIDE2LjBdLCBbMTY4LjUsIDIwMi4yMDAwMDAwMDAwMDAwMiwgNy4wXSwgWzIwMi4yMDAwMDAwMDAwMDAwMiwgMjM1LjkwMDAwMDAwMDAwMDAzLCAyMy4wXSwgWzIzNS45MDAwMDAwMDAwMDAwMywgMjY5LjYsIDE3LjBdLCBbMjY5LjYsIDMwMy4zLCA2LjBdLCBbMzAzLjMsIDMzNy4wLCA4LjBdLCBbMzM3LjAsIDM3MC43MDAwMDAwMDAwMDAwNSwgOC4wXSwgWzM3MC43MDAwMDAwMDAwMDAwNSwgNDA0LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDA0LjQwMDAwMDAwMDAwMDAzLCA0MzguMSwgMC4wXSwgWzQzOC4xLCA0NzEuODAwMDAwMDAwMDAwMDcsIDAuMF0sIFs0NzEuODAwMDAwMDAwMDAwMDcsIDUwNS41MDAwMDAwMDAwMDAwNiwgMC4wXSwgWzUwNS41MDAwMDAwMDAwMDAwNiwgNTM5LjIsIDY0OS4wXSwgWzUzOS4yLCA1NzIuOTAwMDAwMDAwMDAwMSwgNDk1LjBdLCBbNTcyLjkwMDAwMDAwMDAwMDEsIDYwNi42LCA5ODYuMF0sIFs2MDYuNiwgNjQwLjMwMDAwMDAwMDAwMDEsIDgxNS4wXSwgWzY0MC4zMDAwMDAwMDAwMDAxLCA2NzQuMCwgMTAuMF0sIFs2NzQuMCwgNzA3LjcsIDQuMF0sIFs3MDcuNywgNzQxLjQwMDAwMDAwMDAwMDEsIDEuMF0sIFs3NDEuNDAwMDAwMDAwMDAwMSwgNzc1LjEsIDQxODMuMF0sIFs3NzUuMSwgODA4LjgwMDAwMDAwMDAwMDEsIDYxMDAuMF0sIFs4MDguODAwMDAwMDAwMDAwMSwgODQyLjUwMDAwMDAwMDAwMDEsIDI1NjUuMF0sIFs4NDIuNTAwMDAwMDAwMDAwMSwgODc2LjIsIDkyMzQuMF0sIFs4NzYuMiwgOTA5LjkwMDAwMDAwMDAwMDEsIDQ5MzAuMF0sIFs5MDkuOTAwMDAwMDAwMDAwMSwgOTQzLjYwMDAwMDAwMDAwMDEsIDE1LjBdLCBbOTQzLjYwMDAwMDAwMDAwMDEsIDk3Ny4zMDAwMDAwMDAwMDAxLCAyMi4wXSwgWzk3Ny4zMDAwMDAwMDAwMDAxLCAxMDExLjAsIDE0LjBdXV0sIFsxNjA1NzU4MjA1LjIzNTA0OCwgMjMsIFtbMC4wLCAzMy42LCAxODE5NC4wXSwgWzMzLjYsIDY3LjIsIDUzMTAuMF0sIFs2Ny4yLCAxMDAuODAwMDAwMDAwMDAwMDEsIDk0NDIuMF0sIFsxMDAuODAwMDAwMDAwMDAwMDEsIDEzNC40LCAzNDY4LjBdLCBbMTM0LjQsIDE2OC4wLCA1Ny4wXSwgWzE2OC4wLCAyMDEuNjAwMDAwMDAwMDAwMDIsIDExNS4wXSwgWzIwMS42MDAwMDAwMDAwMDAwMiwgMjM1LjIwMDAwMDAwMDAwMDAyLCAzMTYuMF0sIFsyMzUuMjAwMDAwMDAwMDAwMDIsIDI2OC44LCAyODcuMF0sIFsyNjguOCwgMzAyLjQwMDAwMDAwMDAwMDAzLCA1Ny4wXSwgWzMwMi40MDAwMDAwMDAwMDAwMywgMzM2LjAsIDMwLjBdLCBbMzM2LjAsIDM2OS42LCA5OS4wXSwgWzM2OS42LCA0MDMuMjAwMDAwMDAwMDAwMDUsIDIzLjBdLCBbNDAzLjIwMDAwMDAwMDAwMDA1LCA0MzYuOCwgMC4wXSwgWzQzNi44LCA0NzAuNDAwMDAwMDAwMDAwMDMsIDQuMF0sIFs0NzAuNDAwMDAwMDAwMDAwMDMsIDUwNC4wLCAwLjBdLCBbNTA0LjAsIDUzNy42LCA2MjguMF0sIFs1MzcuNiwgNTcxLjIsIDkzLjBdLCBbNTcxLjIsIDYwNC44MDAwMDAwMDAwMDAxLCAzNjUuMF0sIFs2MDQuODAwMDAwMDAwMDAwMSwgNjM4LjQsIDQwLjBdLCBbNjM4LjQsIDY3Mi4wLCAzMS4wXSwgWzY3Mi4wLCA3MDUuNiwgMS4wXSwgWzcwNS42LCA3MzkuMiwgOC4wXSwgWzczOS4yLCA3NzIuODAwMDAwMDAwMDAwMSwgNjE5OS4wXSwgWzc3Mi44MDAwMDAwMDAwMDAxLCA4MDYuNDAwMDAwMDAwMDAwMSwgNjEwOS4wXSwgWzgwNi40MDAwMDAwMDAwMDAxLCA4NDAuMCwgMjcyMi4wXSwgWzg0MC4wLCA4NzMuNiwgNTI3Mi4wXSwgWzg3My42LCA5MDcuMiwgMTAwMS4wXSwgWzkwNy4yLCA5NDAuODAwMDAwMDAwMDAwMSwgMTMuMF0sIFs5NDAuODAwMDAwMDAwMDAwMSwgOTc0LjQwMDAwMDAwMDAwMDEsIDUxLjBdLCBbOTc0LjQwMDAwMDAwMDAwMDEsIDEwMDguMCwgNjUuMF1dXSwgWzE2MDU3NTgyMDcuMDQxMzExLCAyNCwgW1swLjAsIDMzLjkzMzMzMzMzMzMzMzMzLCA4MTI5LjBdLCBbMzMuOTMzMzMzMzMzMzMzMzMsIDY3Ljg2NjY2NjY2NjY2NjY2LCA1ODMxLjBdLCBbNjcuODY2NjY2NjY2NjY2NjYsIDEwMS43OTk5OTk5OTk5OTk5OCwgNTA2NC4wXSwgWzEwMS43OTk5OTk5OTk5OTk5OCwgMTM1LjczMzMzMzMzMzMzMzMyLCA4NDcyLjBdLCBbMTM1LjczMzMzMzMzMzMzMzMyLCAxNjkuNjY2NjY2NjY2NjY2NjYsIDE0NDQuMF0sIFsxNjkuNjY2NjY2NjY2NjY2NjYsIDIwMy41OTk5OTk5OTk5OTk5NywgMjg5LjBdLCBbMjAzLjU5OTk5OTk5OTk5OTk3LCAyMzcuNTMzMzMzMzMzMzMzMywgNzMyLjBdLCBbMjM3LjUzMzMzMzMzMzMzMzMsIDI3MS40NjY2NjY2NjY2NjY2NCwgNzY1LjBdLCBbMjcxLjQ2NjY2NjY2NjY2NjY0LCAzMDUuNCwgMTYwLjBdLCBbMzA1LjQsIDMzOS4zMzMzMzMzMzMzMzMzLCA3MS4wXSwgWzMzOS4zMzMzMzMzMzMzMzMzLCAzNzMuMjY2NjY2NjY2NjY2NjUsIDExMC4wXSwgWzM3My4yNjY2NjY2NjY2NjY2NSwgNDA3LjE5OTk5OTk5OTk5OTkzLCAxOS4wXSwgWzQwNy4xOTk5OTk5OTk5OTk5MywgNDQxLjEzMzMzMzMzMzMzMzI3LCA4LjBdLCBbNDQxLjEzMzMzMzMzMzMzMzI3LCA0NzUuMDY2NjY2NjY2NjY2NiwgNC4wXSwgWzQ3NS4wNjY2NjY2NjY2NjY2LCA1MDguOTk5OTk5OTk5OTk5OTQsIDYuMF0sIFs1MDguOTk5OTk5OTk5OTk5OTQsIDU0Mi45MzMzMzMzMzMzMzMzLCAxNjcuMF0sIFs1NDIuOTMzMzMzMzMzMzMzMywgNTc2Ljg2NjY2NjY2NjY2NjYsIDEzNy4wXSwgWzU3Ni44NjY2NjY2NjY2NjY2LCA2MTAuOCwgOTkuMF0sIFs2MTAuOCwgNjQ0LjczMzMzMzMzMzMzMzIsIDExOS4wXSwgWzY0NC43MzMzMzMzMzMzMzMyLCA2NzguNjY2NjY2NjY2NjY2NiwgMzcuMF0sIFs2NzguNjY2NjY2NjY2NjY2NiwgNzEyLjU5OTk5OTk5OTk5OTksIDEwLjBdLCBbNzEyLjU5OTk5OTk5OTk5OTksIDc0Ni41MzMzMzMzMzMzMzMzLCAxMS4wXSwgWzc0Ni41MzMzMzMzMzMzMzMzLCA3ODAuNDY2NjY2NjY2NjY2NiwgNTk5OS4wXSwgWzc4MC40NjY2NjY2NjY2NjY2LCA4MTQuMzk5OTk5OTk5OTk5OSwgOTQ4Mi4wXSwgWzgxNC4zOTk5OTk5OTk5OTk5LCA4NDguMzMzMzMzMzMzMzMzMywgMjMwMS4wXSwgWzg0OC4zMzMzMzMzMzMzMzMzLCA4ODIuMjY2NjY2NjY2NjY2NSwgODQzMC4wXSwgWzg4Mi4yNjY2NjY2NjY2NjY1LCA5MTYuMTk5OTk5OTk5OTk5OSwgMTM2OC4wXSwgWzkxNi4xOTk5OTk5OTk5OTk5LCA5NTAuMTMzMzMzMzMzMzMzMiwgNTEyLjBdLCBbOTUwLjEzMzMzMzMzMzMzMzIsIDk4NC4wNjY2NjY2NjY2NjY2LCAxMzIuMF0sIFs5ODQuMDY2NjY2NjY2NjY2NiwgMTAxOC4wLCA5Mi4wXV1dLCBbMTYwNTc1ODIwOS4xMTAxODgsIDI1LCBbWzAuMCwgMzMuNiwgMTQ1NjkuMF0sIFszMy42LCA2Ny4yLCAzODA1LjBdLCBbNjcuMiwgMTAwLjgwMDAwMDAwMDAwMDAxLCA5NTM3LjBdLCBbMTAwLjgwMDAwMDAwMDAwMDAxLCAxMzQuNCwgNDkwNS4wXSwgWzEzNC40LCAxNjguMCwgOTMuMF0sIFsxNjguMCwgMjAxLjYwMDAwMDAwMDAwMDAyLCAzOC4wXSwgWzIwMS42MDAwMDAwMDAwMDAwMiwgMjM1LjIwMDAwMDAwMDAwMDAyLCAxMzAuMF0sIFsyMzUuMjAwMDAwMDAwMDAwMDIsIDI2OC44LCAxMTguMF0sIFsyNjguOCwgMzAyLjQwMDAwMDAwMDAwMDAzLCAyOS4wXSwgWzMwMi40MDAwMDAwMDAwMDAwMywgMzM2LjAsIDE3LjBdLCBbMzM2LjAsIDM2OS42LCA5OS4wXSwgWzM2OS42LCA0MDMuMjAwMDAwMDAwMDAwMDUsIDE3LjBdLCBbNDAzLjIwMDAwMDAwMDAwMDA1LCA0MzYuOCwgMS4wXSwgWzQzNi44LCA0NzAuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzAuNDAwMDAwMDAwMDAwMDMsIDUwNC4wLCAwLjBdLCBbNTA0LjAsIDUzNy42LCA1NDguMF0sIFs1MzcuNiwgNTcxLjIsIDgzLjBdLCBbNTcxLjIsIDYwNC44MDAwMDAwMDAwMDAxLCAyMzcuMF0sIFs2MDQuODAwMDAwMDAwMDAwMSwgNjM4LjQsIDc1LjBdLCBbNjM4LjQsIDY3Mi4wLCAxNC4wXSwgWzY3Mi4wLCA3MDUuNiwgMC4wXSwgWzcwNS42LCA3MzkuMiwgMS4wXSwgWzczOS4yLCA3NzIuODAwMDAwMDAwMDAwMSwgNDcyOC4wXSwgWzc3Mi44MDAwMDAwMDAwMDAxLCA4MDYuNDAwMDAwMDAwMDAwMSwgOTkzNS4wXSwgWzgwNi40MDAwMDAwMDAwMDAxLCA4NDAuMCwgMTkzMC4wXSwgWzg0MC4wLCA4NzMuNiwgNzIwNC4wXSwgWzg3My42LCA5MDcuMiwgMTg2Mi4wXSwgWzkwNy4yLCA5NDAuODAwMDAwMDAwMDAwMSwgMTMuMF0sIFs5NDAuODAwMDAwMDAwMDAwMSwgOTc0LjQwMDAwMDAwMDAwMDEsIDIuMF0sIFs5NzQuNDAwMDAwMDAwMDAwMSwgMTAwOC4wLCAxMC4wXV1dLCBbMTYwNTc1ODIxMC45MzQzNTIsIDI2LCBbWzAuMCwgMzQuMDY2NjY2NjY2NjY2NjcsIDc2ODUuMF0sIFszNC4wNjY2NjY2NjY2NjY2NywgNjguMTMzMzMzMzMzMzMzMzQsIDI4MjYuMF0sIFs2OC4xMzMzMzMzMzMzMzMzNCwgMTAyLjIwMDAwMDAwMDAwMDAyLCA2NDU0LjBdLCBbMTAyLjIwMDAwMDAwMDAwMDAyLCAxMzYuMjY2NjY2NjY2NjY2NjgsIDc3NTcuMF0sIFsxMzYuMjY2NjY2NjY2NjY2NjgsIDE3MC4zMzMzMzMzMzMzMzMzNCwgMTk0MS4wXSwgWzE3MC4zMzMzMzMzMzMzMzMzNCwgMjA0LjQwMDAwMDAwMDAwMDAzLCAxNDczLjBdLCBbMjA0LjQwMDAwMDAwMDAwMDAzLCAyMzguNDY2NjY2NjY2NjY2NywgMjYyNy4wXSwgWzIzOC40NjY2NjY2NjY2NjY3LCAyNzIuNTMzMzMzMzMzMzMzMzYsIDEwODUuMF0sIFsyNzIuNTMzMzMzMzMzMzMzMzYsIDMwNi42LCAxNS4wXSwgWzMwNi42LCAzNDAuNjY2NjY2NjY2NjY2NywgMTkuMF0sIFszNDAuNjY2NjY2NjY2NjY2NywgMzc0LjczMzMzMzMzMzMzMzM1LCA5LjBdLCBbMzc0LjczMzMzMzMzMzMzMzM1LCA0MDguODAwMDAwMDAwMDAwMDcsIDE3LjBdLCBbNDA4LjgwMDAwMDAwMDAwMDA3LCA0NDIuODY2NjY2NjY2NjY2NzMsIDEzLjBdLCBbNDQyLjg2NjY2NjY2NjY2NjczLCA0NzYuOTMzMzMzMzMzMzMzNCwgNS4wXSwgWzQ3Ni45MzMzMzMzMzMzMzM0LCA1MTEuMDAwMDAwMDAwMDAwMDYsIDIuMF0sIFs1MTEuMDAwMDAwMDAwMDAwMDYsIDU0NS4wNjY2NjY2NjY2NjY3LCAzMjQuMF0sIFs1NDUuMDY2NjY2NjY2NjY2NywgNTc5LjEzMzMzMzMzMzMzMzQsIDkwLjBdLCBbNTc5LjEzMzMzMzMzMzMzMzQsIDYxMy4yLCA0NDcuMF0sIFs2MTMuMiwgNjQ3LjI2NjY2NjY2NjY2NjgsIDI2MS4wXSwgWzY0Ny4yNjY2NjY2NjY2NjY4LCA2ODEuMzMzMzMzMzMzMzMzNCwgMjIuMF0sIFs2ODEuMzMzMzMzMzMzMzMzNCwgNzE1LjQwMDAwMDAwMDAwMDEsIDQxLjBdLCBbNzE1LjQwMDAwMDAwMDAwMDEsIDc0OS40NjY2NjY2NjY2NjY3LCAzNy4wXSwgWzc0OS40NjY2NjY2NjY2NjY3LCA3ODMuNTMzMzMzMzMzMzMzNCwgNjU2My4wXSwgWzc4My41MzMzMzMzMzMzMzM0LCA4MTcuNjAwMDAwMDAwMDAwMSwgMzY5Ny4wXSwgWzgxNy42MDAwMDAwMDAwMDAxLCA4NTEuNjY2NjY2NjY2NjY2NywgNjczOS4wXSwgWzg1MS42NjY2NjY2NjY2NjY3LCA4ODUuNzMzMzMzMzMzMzMzNSwgNTk0OC4wXSwgWzg4NS43MzMzMzMzMzMzMzM1LCA5MTkuODAwMDAwMDAwMDAwMSwgMjMzMy4wXSwgWzkxOS44MDAwMDAwMDAwMDAxLCA5NTMuODY2NjY2NjY2NjY2OCwgNjcwLjBdLCBbOTUzLjg2NjY2NjY2NjY2NjgsIDk4Ny45MzMzMzMzMzMzMzM0LCA3NDAuMF0sIFs5ODcuOTMzMzMzMzMzMzMzNCwgMTAyMi4wLCAxNjAuMF1dXSwgWzE2MDU3NTgyMTIuODg4MTQ3LCAyNywgW1swLjAsIDMzLjczMzMzMzMzMzMzMzMzNCwgMTI5MTUuMF0sIFszMy43MzMzMzMzMzMzMzMzMzQsIDY3LjQ2NjY2NjY2NjY2NjY3LCA3MDYzLjBdLCBbNjcuNDY2NjY2NjY2NjY2NjcsIDEwMS4yLCA0ODY2LjBdLCBbMTAxLjIsIDEzNC45MzMzMzMzMzMzMzMzNCwgNDIwOS4wXSwgWzEzNC45MzMzMzMzMzMzMzMzNCwgMTY4LjY2NjY2NjY2NjY2NjY5LCAzODMuMF0sIFsxNjguNjY2NjY2NjY2NjY2NjksIDIwMi40LCAzMi4wXSwgWzIwMi40LCAyMzYuMTMzMzMzMzMzMzMzMzMsIDkyLjBdLCBbMjM2LjEzMzMzMzMzMzMzMzMzLCAyNjkuODY2NjY2NjY2NjY2NywgMjk1LjBdLCBbMjY5Ljg2NjY2NjY2NjY2NjcsIDMwMy42LCAxODYuMF0sIFszMDMuNiwgMzM3LjMzMzMzMzMzMzMzMzM3LCA2NS4wXSwgWzMzNy4zMzMzMzMzMzMzMzMzNywgMzcxLjA2NjY2NjY2NjY2NjY2LCAxMjIuMF0sIFszNzEuMDY2NjY2NjY2NjY2NjYsIDQwNC44LCA0OS4wXSwgWzQwNC44LCA0MzguNTMzMzMzMzMzMzMzMzYsIDMuMF0sIFs0MzguNTMzMzMzMzMzMzMzMzYsIDQ3Mi4yNjY2NjY2NjY2NjY2NSwgMS4wXSwgWzQ3Mi4yNjY2NjY2NjY2NjY2NSwgNTA2LjAsIDAuMF0sIFs1MDYuMCwgNTM5LjczMzMzMzMzMzMzMzMsIDg2LjBdLCBbNTM5LjczMzMzMzMzMzMzMzMsIDU3My40NjY2NjY2NjY2NjY3LCAzMi4wXSwgWzU3My40NjY2NjY2NjY2NjY3LCA2MDcuMiwgNTguMF0sIFs2MDcuMiwgNjQwLjkzMzMzMzMzMzMzMzQsIDEwLjBdLCBbNjQwLjkzMzMzMzMzMzMzMzQsIDY3NC42NjY2NjY2NjY2NjY3LCAwLjBdLCBbNjc0LjY2NjY2NjY2NjY2NjcsIDcwOC40LCAwLjBdLCBbNzA4LjQsIDc0Mi4xMzMzMzMzMzMzMzMzLCAxLjBdLCBbNzQyLjEzMzMzMzMzMzMzMzMsIDc3NS44NjY2NjY2NjY2NjY3LCA4NTA0LjBdLCBbNzc1Ljg2NjY2NjY2NjY2NjcsIDgwOS42LCAxMDAyNy4wXSwgWzgwOS42LCA4NDMuMzMzMzMzMzMzMzMzNCwgMTU4Ny4wXSwgWzg0My4zMzMzMzMzMzMzMzM0LCA4NzcuMDY2NjY2NjY2NjY2NywgNjQzOC4wXSwgWzg3Ny4wNjY2NjY2NjY2NjY3LCA5MTAuODAwMDAwMDAwMDAwMSwgMjg0Mi4wXSwgWzkxMC44MDAwMDAwMDAwMDAxLCA5NDQuNTMzMzMzMzMzMzMzMywgMTI0LjBdLCBbOTQ0LjUzMzMzMzMzMzMzMzMsIDk3OC4yNjY2NjY2NjY2NjY3LCA2LjBdLCBbOTc4LjI2NjY2NjY2NjY2NjcsIDEwMTIuMCwgNC4wXV1dLCBbMTYwNTc1ODIxNC43NDA4NzYsIDI4LCBbWzAuMCwgMzMuOTMzMzMzMzMzMzMzMzMsIDEwNTMxLjBdLCBbMzMuOTMzMzMzMzMzMzMzMzMsIDY3Ljg2NjY2NjY2NjY2NjY2LCA1MTk1LjBdLCBbNjcuODY2NjY2NjY2NjY2NjYsIDEwMS43OTk5OTk5OTk5OTk5OCwgNDU5OC4wXSwgWzEwMS43OTk5OTk5OTk5OTk5OCwgMTM1LjczMzMzMzMzMzMzMzMyLCA3MTk5LjBdLCBbMTM1LjczMzMzMzMzMzMzMzMyLCAxNjkuNjY2NjY2NjY2NjY2NjYsIDIyNzguMF0sIFsxNjkuNjY2NjY2NjY2NjY2NjYsIDIwMy41OTk5OTk5OTk5OTk5NywgMTgzLjBdLCBbMjAzLjU5OTk5OTk5OTk5OTk3LCAyMzcuNTMzMzMzMzMzMzMzMywgOTQ2LjBdLCBbMjM3LjUzMzMzMzMzMzMzMzMsIDI3MS40NjY2NjY2NjY2NjY2NCwgOTY3LjBdLCBbMjcxLjQ2NjY2NjY2NjY2NjY0LCAzMDUuNCwgNzEuMF0sIFszMDUuNCwgMzM5LjMzMzMzMzMzMzMzMzMsIDU4LjBdLCBbMzM5LjMzMzMzMzMzMzMzMzMsIDM3My4yNjY2NjY2NjY2NjY2NSwgNDMuMF0sIFszNzMuMjY2NjY2NjY2NjY2NjUsIDQwNy4xOTk5OTk5OTk5OTk5MywgMjIuMF0sIFs0MDcuMTk5OTk5OTk5OTk5OTMsIDQ0MS4xMzMzMzMzMzMzMzMyNywgNS4wXSwgWzQ0MS4xMzMzMzMzMzMzMzMyNywgNDc1LjA2NjY2NjY2NjY2NjYsIDUuMF0sIFs0NzUuMDY2NjY2NjY2NjY2NiwgNTA4Ljk5OTk5OTk5OTk5OTk0LCAyLjBdLCBbNTA4Ljk5OTk5OTk5OTk5OTk0LCA1NDIuOTMzMzMzMzMzMzMzMywgMjA4LjBdLCBbNTQyLjkzMzMzMzMzMzMzMzMsIDU3Ni44NjY2NjY2NjY2NjY2LCAxMTQuMF0sIFs1NzYuODY2NjY2NjY2NjY2NiwgNjEwLjgsIDY2LjBdLCBbNjEwLjgsIDY0NC43MzMzMzMzMzMzMzMyLCA3NC4wXSwgWzY0NC43MzMzMzMzMzMzMzMyLCA2NzguNjY2NjY2NjY2NjY2NiwgMzMuMF0sIFs2NzguNjY2NjY2NjY2NjY2NiwgNzEyLjU5OTk5OTk5OTk5OTksIDQuMF0sIFs3MTIuNTk5OTk5OTk5OTk5OSwgNzQ2LjUzMzMzMzMzMzMzMzMsIDQuMF0sIFs3NDYuNTMzMzMzMzMzMzMzMywgNzgwLjQ2NjY2NjY2NjY2NjYsIDc2NzcuMF0sIFs3ODAuNDY2NjY2NjY2NjY2NiwgODE0LjM5OTk5OTk5OTk5OTksIDg5MDUuMF0sIFs4MTQuMzk5OTk5OTk5OTk5OSwgODQ4LjMzMzMzMzMzMzMzMzMsIDIwMzAuMF0sIFs4NDguMzMzMzMzMzMzMzMzMywgODgyLjI2NjY2NjY2NjY2NjUsIDUyMzIuMF0sIFs4ODIuMjY2NjY2NjY2NjY2NSwgOTE2LjE5OTk5OTk5OTk5OTksIDI0NTMuMF0sIFs5MTYuMTk5OTk5OTk5OTk5OSwgOTUwLjEzMzMzMzMzMzMzMzIsIDkwNi4wXSwgWzk1MC4xMzMzMzMzMzMzMzMyLCA5ODQuMDY2NjY2NjY2NjY2NiwgMTQwLjBdLCBbOTg0LjA2NjY2NjY2NjY2NjYsIDEwMTguMCwgNTEuMF1dXSwgWzE2MDU3NTgyMTYuODk2MjkzLCAyOSwgW1swLjAsIDMzLjk2NjY2NjY2NjY2NjY3LCA3NTY0LjBdLCBbMzMuOTY2NjY2NjY2NjY2NjcsIDY3LjkzMzMzMzMzMzMzMzM0LCA3MDY1LjBdLCBbNjcuOTMzMzMzMzMzMzMzMzQsIDEwMS45LCA0NzEwLjBdLCBbMTAxLjksIDEzNS44NjY2NjY2NjY2NjY2NywgODU2NC4wXSwgWzEzNS44NjY2NjY2NjY2NjY2NywgMTY5LjgzMzMzMzMzMzMzMzM0LCAxMTU5LjBdLCBbMTY5LjgzMzMzMzMzMzMzMzM0LCAyMDMuOCwgMTU2LjBdLCBbMjAzLjgsIDIzNy43NjY2NjY2NjY2NjY2OCwgNTgxLjBdLCBbMjM3Ljc2NjY2NjY2NjY2NjY4LCAyNzEuNzMzMzMzMzMzMzMzMzUsIDY4MS4wXSwgWzI3MS43MzMzMzMzMzMzMzMzNSwgMzA1LjcwMDAwMDAwMDAwMDA1LCA2NC4wXSwgWzMwNS43MDAwMDAwMDAwMDAwNSwgMzM5LjY2NjY2NjY2NjY2NjcsIDQwLjBdLCBbMzM5LjY2NjY2NjY2NjY2NjcsIDM3My42MzMzMzMzMzMzMzMzLCA3Mi4wXSwgWzM3My42MzMzMzMzMzMzMzMzLCA0MDcuNiwgMjkuMF0sIFs0MDcuNiwgNDQxLjU2NjY2NjY2NjY2NjcsIDE2LjBdLCBbNDQxLjU2NjY2NjY2NjY2NjcsIDQ3NS41MzMzMzMzMzMzMzMzNiwgMS4wXSwgWzQ3NS41MzMzMzMzMzMzMzMzNiwgNTA5LjUsIDMuMF0sIFs1MDkuNSwgNTQzLjQ2NjY2NjY2NjY2NjcsIDk4LjBdLCBbNTQzLjQ2NjY2NjY2NjY2NjcsIDU3Ny40MzMzMzMzMzMzMzM0LCA3MC4wXSwgWzU3Ny40MzMzMzMzMzMzMzM0LCA2MTEuNDAwMDAwMDAwMDAwMSwgNzMuMF0sIFs2MTEuNDAwMDAwMDAwMDAwMSwgNjQ1LjM2NjY2NjY2NjY2NjcsIDQ0LjBdLCBbNjQ1LjM2NjY2NjY2NjY2NjcsIDY3OS4zMzMzMzMzMzMzMzM0LCA1LjBdLCBbNjc5LjMzMzMzMzMzMzMzMzQsIDcxMy4zMDAwMDAwMDAwMDAxLCAwLjBdLCBbNzEzLjMwMDAwMDAwMDAwMDEsIDc0Ny4yNjY2NjY2NjY2NjY3LCAyLjBdLCBbNzQ3LjI2NjY2NjY2NjY2NjcsIDc4MS4yMzMzMzMzMzMzMzMzLCA2MTU1LjBdLCBbNzgxLjIzMzMzMzMzMzMzMzMsIDgxNS4yLCA4OTE2LjBdLCBbODE1LjIsIDg0OS4xNjY2NjY2NjY2NjY3LCAzNjYwLjBdLCBbODQ5LjE2NjY2NjY2NjY2NjcsIDg4My4xMzMzMzMzMzMzMzM0LCA2Nzk4LjBdLCBbODgzLjEzMzMzMzMzMzMzMzQsIDkxNy4xLCAyMjUwLjBdLCBbOTE3LjEsIDk1MS4wNjY2NjY2NjY2NjY3LCA5MzguMF0sIFs5NTEuMDY2NjY2NjY2NjY2NywgOTg1LjAzMzMzMzMzMzMzMzQsIDIwMC4wXSwgWzk4NS4wMzMzMzMzMzMzMzM0LCAxMDE5LjAsIDg2LjBdXV0sIFsxNjA1NzU4MjIwLjc3MTU3LCAzMSwgW1swLjAsIDM0LjA2NjY2NjY2NjY2NjY3LCAxMjcxMS4wXSwgWzM0LjA2NjY2NjY2NjY2NjY3LCA2OC4xMzMzMzMzMzMzMzMzNCwgMzg3NS4wXSwgWzY4LjEzMzMzMzMzMzMzMzM0LCAxMDIuMjAwMDAwMDAwMDAwMDIsIDQ4NzEuMF0sIFsxMDIuMjAwMDAwMDAwMDAwMDIsIDEzNi4yNjY2NjY2NjY2NjY2OCwgNTY1Mi4wXSwgWzEzNi4yNjY2NjY2NjY2NjY2OCwgMTcwLjMzMzMzMzMzMzMzMzM0LCAxNDExLjBdLCBbMTcwLjMzMzMzMzMzMzMzMzM0LCAyMDQuNDAwMDAwMDAwMDAwMDMsIDE4Mi4wXSwgWzIwNC40MDAwMDAwMDAwMDAwMywgMjM4LjQ2NjY2NjY2NjY2NjcsIDgxNy4wXSwgWzIzOC40NjY2NjY2NjY2NjY3LCAyNzIuNTMzMzMzMzMzMzMzMzYsIDEwNzQuMF0sIFsyNzIuNTMzMzMzMzMzMzMzMzYsIDMwNi42LCAwLjBdLCBbMzA2LjYsIDM0MC42NjY2NjY2NjY2NjY3LCAwLjBdLCBbMzQwLjY2NjY2NjY2NjY2NjcsIDM3NC43MzMzMzMzMzMzMzMzNSwgMC4wXSwgWzM3NC43MzMzMzMzMzMzMzMzNSwgNDA4LjgwMDAwMDAwMDAwMDA3LCAwLjBdLCBbNDA4LjgwMDAwMDAwMDAwMDA3LCA0NDIuODY2NjY2NjY2NjY2NzMsIDAuMF0sIFs0NDIuODY2NjY2NjY2NjY2NzMsIDQ3Ni45MzMzMzMzMzMzMzM0LCAwLjBdLCBbNDc2LjkzMzMzMzMzMzMzMzQsIDUxMS4wMDAwMDAwMDAwMDAwNiwgMC4wXSwgWzUxMS4wMDAwMDAwMDAwMDAwNiwgNTQ1LjA2NjY2NjY2NjY2NjcsIDkyNC4wXSwgWzU0NS4wNjY2NjY2NjY2NjY3LCA1NzkuMTMzMzMzMzMzMzMzNCwgMjAwLjBdLCBbNTc5LjEzMzMzMzMzMzMzMzQsIDYxMy4yLCAyODUuMF0sIFs2MTMuMiwgNjQ3LjI2NjY2NjY2NjY2NjgsIDIyMC4wXSwgWzY0Ny4yNjY2NjY2NjY2NjY4LCA2ODEuMzMzMzMzMzMzMzMzNCwgOTAuMF0sIFs2ODEuMzMzMzMzMzMzMzMzNCwgNzE1LjQwMDAwMDAwMDAwMDEsIDcuMF0sIFs3MTUuNDAwMDAwMDAwMDAwMSwgNzQ5LjQ2NjY2NjY2NjY2NjcsIDMxLjBdLCBbNzQ5LjQ2NjY2NjY2NjY2NjcsIDc4My41MzMzMzMzMzMzMzM0LCA4MjQzLjBdLCBbNzgzLjUzMzMzMzMzMzMzMzQsIDgxNy42MDAwMDAwMDAwMDAxLCA3MjE0LjBdLCBbODE3LjYwMDAwMDAwMDAwMDEsIDg1MS42NjY2NjY2NjY2NjY3LCAzNjM5LjBdLCBbODUxLjY2NjY2NjY2NjY2NjcsIDg4NS43MzMzMzMzMzMzMzM1LCA1NTQxLjBdLCBbODg1LjczMzMzMzMzMzMzMzUsIDkxOS44MDAwMDAwMDAwMDAxLCAxMzk3LjBdLCBbOTE5LjgwMDAwMDAwMDAwMDEsIDk1My44NjY2NjY2NjY2NjY4LCAxMjA4LjBdLCBbOTUzLjg2NjY2NjY2NjY2NjgsIDk4Ny45MzMzMzMzMzMzMzM0LCAyMjUuMF0sIFs5ODcuOTMzMzMzMzMzMzMzNCwgMTAyMi4wLCAxODMuMF1dXSwgWzE2MDU3NTgyMjIuNjM2MzI0LCAzMiwgW1swLjAsIDM0LjEsIDE0Njk4LjBdLCBbMzQuMSwgNjguMiwgMzc3My4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNDgzOS4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDUxOTMuMF0sIFsxMzYuNCwgMTcwLjUsIDk0OC4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDE1Ny4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA4MDMuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA4OTAuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAxNy4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDMuMF0sIFszNDEuMCwgMzc1LjEsIDEyLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMi4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAyLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMi4wXSwgWzUxMS41LCA1NDUuNiwgMjU2LjBdLCBbNTQ1LjYsIDU3OS43LCA2OC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMTExLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA2Ni4wXSwgWzY0Ny45LCA2ODIuMCwgMjAuMF0sIFs2ODIuMCwgNzE2LjEsIDQuMF0sIFs3MTYuMSwgNzUwLjIsIDExLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA4NTkyLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTM5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA1MDQ4LjBdLCBbODUyLjUsIDg4Ni42LCA1MzQyLjBdLCBbODg2LjYsIDkyMC43LCA5MjEuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMTEuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDM1OS4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDIxMy4wXV1dLCBbMTYwNTc1ODIyNC45MzA2OTksIDMzLCBbWzAuMCwgMzQuMSwgMTYyNDIuMF0sIFszNC4xLCA2OC4yLCAzNjEwLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MDM1LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNDU3NC4wXSwgWzEzNi40LCAxNzAuNSwgMTAzOS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDI0Ni4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA3MTEuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCAxMzA5LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMjE2LjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMTE2LjBdLCBbMzQxLjAsIDM3NS4xLCAxMDMuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCA1Ni4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDQzLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMjcuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAyNS4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMy4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMS4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgODI3Ni4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNzY1NS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDU2Ni4wXSwgWzg1Mi41LCA4ODYuNiwgNDQ0MC4wXSwgWzg4Ni42LCA5MjAuNywgMTAzNi4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTE3NC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMjgwLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMjE3LjBdXV0sIFsxNjA1NzU4MjI4LjkzMDMwOCwgMzUsIFtbMC4wLCAzNC4xLCAxNjI3NS4wXSwgWzM0LjEsIDY4LjIsIDI4NTYuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDUxNDguMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA0Mzc2LjBdLCBbMTM2LjQsIDE3MC41LCA2NzYuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAyNDMuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTA5NC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDcwNS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDIuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAxLjBdLCBbMzQxLjAsIDM3NS4xLCAzLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDEuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMzUyLjBdLCBbNTQ1LjYsIDU3OS43LCA1OC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMTQ3LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA5My4wXSwgWzY0Ny45LCA2ODIuMCwgMjguMF0sIFs2ODIuMCwgNzE2LjEsIDkuMF0sIFs3MTYuMSwgNzUwLjIsIDI5LjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA4MzM2LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1Nzk4LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0ODAzLjBdLCBbODUyLjUsIDg4Ni42LCA1Mzc2LjBdLCBbODg2LjYsIDkyMC43LCAxNDgxLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTk2LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA1ODkuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAzMjUuMF1dXSwgWzE2MDU3NTgyMzAuODY2MTg4LCAzNiwgW1swLjAsIDM0LjEsIDE3ODg2LjBdLCBbMzQuMSwgNjguMiwgMjY1Ni4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNDk1Ny4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDM4MjIuMF0sIFsxMzYuNCwgMTcwLjUsIDQ3MS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDE1OC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA5MjYuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA1OTMuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCA0NS4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDQ1LjBdLCBbMzQxLjAsIDM3NS4xLCA5Ny4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDIzLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMTQuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAxMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDkuMF0sIFs1MTEuNSwgNTQ1LjYsIDExLjBdLCBbNTQ1LjYsIDU3OS43LCAxLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCA1LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAxLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA5NzUzLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1NDE4LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NjgyLjBdLCBbODUyLjUsIDg4Ni42LCA1MjMyLjBdLCBbODg2LjYsIDkyMC43LCAxNjUyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA4MjkuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDUwNC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDIwMC4wXV1dLCBbMTYwNTc1ODIzNC42NzA3MTEsIDM4LCBbWzAuMCwgMzQuMSwgMTc0NzcuMF0sIFszNC4xLCA2OC4yLCAzMTQyLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MzcxLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNDM1OC4wXSwgWzEzNi40LCAxNzAuNSwgNjQ0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMTY5LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDk3Ny4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDU0OS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDIwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMTMuMF0sIFszNDEuMCwgMzc1LjEsIDMxLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgNy4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDIuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCA4LjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMi4wXSwgWzUxMS41LCA1NDUuNiwgMzMuMF0sIFs1NDUuNiwgNTc5LjcsIDQuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDI2LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAxMC4wXSwgWzY0Ny45LCA2ODIuMCwgNC4wXSwgWzY4Mi4wLCA3MTYuMSwgMS4wXSwgWzcxNi4xLCA3NTAuMiwgMS4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgOTA4OC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNTc0MC4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDIyNi4wXSwgWzg1Mi41LCA4ODYuNiwgNTk2OS4wXSwgWzg4Ni42LCA5MjAuNywgMTU5My4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgODgxLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA0NjEuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxOTMuMF1dXSwgWzE2MDU3NTgyMzYuNjA4Njg5LCAzOSwgW1swLjAsIDM0LjEsIDE2OTc2LjBdLCBbMzQuMSwgNjguMiwgMzEzNC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNDM0MC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDQzMTEuMF0sIFsxMzYuNCwgMTcwLjUsIDU5MC4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDEyNS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA5NDQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA2MzguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCA0OS4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDUyLjBdLCBbMzQxLjAsIDM3NS4xLCA3MS4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDQyLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgNC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDE1LjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgOC4wXSwgWzUxMS41LCA1NDUuNiwgNy4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgNi4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgOTYyMS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNTQ1MC4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDIwNy4wXSwgWzg1Mi41LCA4ODYuNiwgNjM1Mi4wXSwgWzg4Ni42LCA5MjAuNywgMTcwNS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgNjg1LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA0NzEuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxOTcuMF1dXSwgWzE2MDU3NTgyMzguNDIxMDcyLCA0MCwgW1swLjAsIDM0LjEsIDE3MDg3LjBdLCBbMzQuMSwgNjguMiwgMzA3My4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNDU4Ny4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDQwNTIuMF0sIFsxMzYuNCwgMTcwLjUsIDU4Ni4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDEyMC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA5MjIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCAzNzMuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAyLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMi4wXSwgWzM0MS4wLCAzNzUuMSwgNS4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDE3My4wXSwgWzU0NS42LCA1NzkuNywgNDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDY3LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA0Ni4wXSwgWzY0Ny45LCA2ODIuMCwgNy4wXSwgWzY4Mi4wLCA3MTYuMSwgMS4wXSwgWzcxNi4xLCA3NTAuMiwgOS4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgOTA1OS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNTYyOS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUyMC4wXSwgWzg1Mi41LCA4ODYuNiwgNjIzMi4wXSwgWzg4Ni42LCA5MjAuNywgMTgzNS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgODEzLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA1NjIuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxOTguMF1dXSwgWzE2MDU3NTgyNDAuMjYyMjMsIDQxLCBbWzAuMCwgMzQuMSwgMTcxODguMF0sIFszNC4xLCA2OC4yLCAzNDU4LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MzAwLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNDA3NS4wXSwgWzEzNi40LCAxNzAuNSwgNTYzLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMTM3LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDY0Ni4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDQzOS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDIzLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMTEuMF0sIFszNDEuMCwgMzc1LjEsIDMyLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgNy4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDMuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAyLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMS4wXSwgWzUxMS41LCA1NDUuNiwgMjcuMF0sIFs1NDUuNiwgNTc5LjcsIDcuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDEyLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA2LjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA5MDA4LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1OTU1LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDU3LjBdLCBbODUyLjUsIDg4Ni42LCA2NTUwLjBdLCBbODg2LjYsIDkyMC43LCAxNjE5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA3NjcuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDUyMC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDE4Ny4wXV1dLCBbMTYwNTc1ODI0NC4xOTU0NjUsIDQzLCBbWzAuMCwgMzQuMSwgMTc3NDIuMF0sIFszNC4xLCA2OC4yLCAzNjEwLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MjY4LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzgwOS4wXSwgWzEzNi40LCAxNzAuNSwgNTk2LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMTA4LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDY1Mi4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDM5NC4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDkuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAyMS4wXSwgWzM0MS4wLCAzNzUuMSwgMzMuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCA2LjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMi4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDQuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAxLjBdLCBbNTExLjUsIDU0NS42LCA5LjBdLCBbNTQ1LjYsIDU3OS43LCA2LjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCA3LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA0LjBdLCBbNjQ3LjksIDY4Mi4wLCAxLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAyLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA4ODQyLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1ODQyLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0Mzc4LjBdLCBbODUyLjUsIDg4Ni42LCA2NTA1LjBdLCBbODg2LjYsIDkyMC43LCAxNjgxLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA3ODcuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDQ3Ny4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDIwNC4wXV1dLCBbMTYwNTc1ODI0OC4yNDUwNjIsIDQ1LCBbWzAuMCwgMzQuMSwgMTY3MDguMF0sIFszNC4xLCA2OC4yLCAzNzYwLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0NzM2LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzY4NC4wXSwgWzEzNi40LCAxNzAuNSwgNTczLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMTEwLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDY1MC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDU5MC4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDU0LjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMzMuMF0sIFszNDEuMCwgMzc1LjEsIDQyLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMTguMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAxMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDcuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCA3LjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAzLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA1LjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA4ODk1LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2MDk5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NTY0LjBdLCBbODUyLjUsIDg4Ni42LCA2NDM3LjBdLCBbODg2LjYsIDkyMC43LCAxNDYyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA3NjEuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDUwNy4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDI4NS4wXV1dLCBbMTYwNTc1ODI1MC4wOTQ0MjIsIDQ2LCBbWzAuMCwgMzQuMSwgMTc2MTEuMF0sIFszNC4xLCA2OC4yLCAzNDAwLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MjA2LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzkyMy4wXSwgWzEzNi40LCAxNzAuNSwgNTg3LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMTA2LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDU1NS4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDQ5Ni4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDEuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAxLjBdLCBbMzQxLjAsIDM3NS4xLCAyLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMS4wXSwgWzUxMS41LCA1NDUuNiwgMTAxLjBdLCBbNTQ1LjYsIDU3OS43LCAyMy4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMjguMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDM3LjBdLCBbNjQ3LjksIDY4Mi4wLCAxMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMi4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgODkxNS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNTcxMi4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDE1Ny4wXSwgWzg1Mi41LCA4ODYuNiwgNjcwMS4wXSwgWzg4Ni42LCA5MjAuNywgMTc5NC4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgODY0LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA1MTMuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAyNTQuMF1dXSwgWzE2MDU3NTgyNTMuODczNTYzLCA0OCwgW1swLjAsIDM0LjEsIDE2ODYzLjBdLCBbMzQuMSwgNjguMiwgNDI5NS4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNDAxMi4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDM2OTMuMF0sIFsxMzYuNCwgMTcwLjUsIDU4Ni4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDEwMi4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0NzkuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA0OTkuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgNC4wXSwgWzM0MS4wLCAzNzUuMSwgMTEuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAxLjBdLCBbNTExLjUsIDU0NS42LCA0Mi4wXSwgWzU0NS42LCA1NzkuNywgMTcuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDIxLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAxOC4wXSwgWzY0Ny45LCA2ODIuMCwgMS4wXSwgWzY4Mi4wLCA3MTYuMSwgMS4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgODU5MS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjAyNS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDY4Mi4wXSwgWzg1Mi41LCA4ODYuNiwgNjYxMS4wXSwgWzg4Ni42LCA5MjAuNywgMTczMy4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgNzkwLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCA1NTUuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAzNjguMF1dXSwgWzE2MDU3NTgyNTUuNzI2MTA2LCA0OSwgW1swLjAsIDM0LjEsIDE4MDY5LjBdLCBbMzQuMSwgNjguMiwgMzQwNS4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgMzk1MC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDM0NTMuMF0sIFsxMzYuNCwgMTcwLjUsIDUwMS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDg2LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDQ5Mi4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDQ1Mi4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDMuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCA1LjBdLCBbMzQxLjAsIDM3NS4xLCAxNC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDIuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAxLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMS4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDI3LjBdLCBbNTQ1LjYsIDU3OS43LCAxMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMTQuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDguMF0sIFs2NDcuOSwgNjgyLjAsIDEuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDEuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg4MDQuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDU4NTIuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0MjEuMF0sIFs4NTIuNSwgODg2LjYsIDY5MDQuMF0sIFs4ODYuNiwgOTIwLjcsIDE4MTkuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDc1My4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNTc3LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMzc1LjBdXV0sIFsxNjA1NzU4MjU3Ljk1ODQyNCwgNTAsIFtbMC4wLCAzNC4xLCAxNzA4OC4wXSwgWzM0LjEsIDY4LjIsIDM4MjUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM4ODEuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNTM3LjBdLCBbMTM2LjQsIDE3MC41LCA1NDcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA5MS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0NjIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA1MTQuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMi4wXSwgWzM0MS4wLCAzNzUuMSwgOC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDY4LjBdLCBbNTQ1LjYsIDU3OS43LCAyMi4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMjAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDE5LjBdLCBbNjQ3LjksIDY4Mi4wLCAzLjBdLCBbNjgyLjAsIDcxNi4xLCAxLjBdLCBbNzE2LjEsIDc1MC4yLCA4LjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA5MzY4LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1ODA2LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NTI5LjBdLCBbODUyLjUsIDg4Ni42LCA2ODE4LjBdLCBbODg2LjYsIDkyMC43LCAxODE5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA2NjkuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDUzNC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDM2MS4wXV1dLCBbMTYwNTc1ODI2MS4wMzUwMDQsIDUwLCBbWzAuMCwgMzQuMSwgMTg2MjEuMF0sIFszNC4xLCA2OC4yLCAyNjcyLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCAzODc5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzM4My4wXSwgWzEzNi40LCAxNzAuNSwgNDgzLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNjQuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMzg1LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgNDE1LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgNC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDEzLjBdLCBbMzQxLjAsIDM3NS4xLCAxMy4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMS4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDIuMF0sIFs1MTEuNSwgNTQ1LjYsIDI0LjBdLCBbNTQ1LjYsIDU3OS43LCA5LjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAxNC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTIuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDEuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDkyOTYuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDU3ODguMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQxOTAuMF0sIFs4NTIuNSwgODg2LjYsIDcxMDAuMF0sIFs4ODYuNiwgOTIwLjcsIDE5NjEuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDY5MS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNTk2LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMzgzLjBdXV0sIFsxNjA1NzU4MjYzLjk2MDQ2NywgNTEsIFtbMC4wLCAzNC4xLCAxNzU4NS4wXSwgWzM0LjEsIDY4LjIsIDMwNjUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM5NzguMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNzE4LjBdLCBbMTM2LjQsIDE3MC41LCA1MzAuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA2Mi4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0MjIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA1MDIuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAxMS4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDIuMF0sIFszNDEuMCwgMzc1LjEsIDcuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAxLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMi4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAxLjBdLCBbNTExLjUsIDU0NS42LCAxNS4wXSwgWzU0NS42LCA1NzkuNywgMi4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMTkuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDEzLjBdLCBbNjQ3LjksIDY4Mi4wLCAyLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAzLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA5MTk0LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1NzEwLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDkxLjBdLCBbODUyLjUsIDg4Ni42LCA2NzQ3LjBdLCBbODg2LjYsIDkyMC43LCAyMDI1LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA3NjcuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDY4OC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDQzOC4wXV1dLCBbMTYwNTc1ODI2Ni43OTkzMjEsIDUyLCBbWzAuMCwgMzQuMSwgMTcyMjkuMF0sIFszNC4xLCA2OC4yLCAzMzU0LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA0MjE4LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzU3OC4wXSwgWzEzNi40LCAxNzAuNSwgNDU3LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNjkuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgNTAyLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgNTAyLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgOC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDYuMF0sIFszNDEuMCwgMzc1LjEsIDE3LjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMi4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMS4wXSwgWzUxMS41LCA1NDUuNiwgMTYuMF0sIFs1NDUuNiwgNTc5LjcsIDguMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDguMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDcuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDMuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg5NDIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDYwMzMuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzMjkuMF0sIFs4NTIuNSwgODg2LjYsIDY5NjEuMF0sIFs4ODYuNiwgOTIwLjcsIDE5NjEuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDY4MC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNjI4LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNDgxLjBdXV0sIFsxNjA1NzU4MjY5LjY0OTE1NywgNTMsIFtbMC4wLCAzNC4xLCAxNzY1OC4wXSwgWzM0LjEsIDY4LjIsIDI4ODQuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDQzNzIuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNjUyLjBdLCBbMTM2LjQsIDE3MC41LCA0ODUuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA1OC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0MjAuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA0NzcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCA0LjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgNy4wXSwgWzM0MS4wLCAzNzUuMSwgNC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDEuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDEuMF0sIFs1MTEuNSwgNTQ1LjYsIDEwLjBdLCBbNTQ1LjYsIDU3OS43LCAzLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAxOC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTEuMF0sIFs2NDcuOSwgNjgyLjAsIDEuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDEuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDk1NTIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDUyMTYuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzNjUuMF0sIFs4NTIuNSwgODg2LjYsIDcwODAuMF0sIFs4ODYuNiwgOTIwLjcsIDE5NzQuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDYxOC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNjYyLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNDY2LjBdXV0sIFsxNjA1NzU4MjcyLjMxNjE1MSwgNTQsIFtbMC4wLCAzNC4xLCAxNjY1Ni4wXSwgWzM0LjEsIDY4LjIsIDQwMTUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM4MDQuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNzYwLjBdLCBbMTM2LjQsIDE3MC41LCA2NTEuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA3OC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0NDguMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA1MDguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCA0LjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMi4wXSwgWzM0MS4wLCAzNzUuMSwgMTIuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAxLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDEuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCA4LjBdLCBbNTQ1LjYsIDU3OS43LCA1LjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAxNi4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTYuMF0sIFs2NDcuOSwgNjgyLjAsIDIuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg1NjIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDYwMzQuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzMjEuMF0sIFs4NTIuNSwgODg2LjYsIDY5MjEuMF0sIFs4ODYuNiwgOTIwLjcsIDIwMjIuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDkxOC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNzIyLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNTEzLjBdXV0sIFsxNjA1NzU4Mjc1LjE2ODMxNywgNTUsIFtbMC4wLCAzNC4xLCAxNzY0Ni4wXSwgWzM0LjEsIDY4LjIsIDM1NzUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM3ODAuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNTE5LjBdLCBbMTM2LjQsIDE3MC41LCA0OTkuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0Ni4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAzNzYuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCAzOTUuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAyLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMy4wXSwgWzM0MS4wLCAzNzUuMSwgMTAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAyLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAxLjBdLCBbNTExLjUsIDU0NS42LCAzLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCA3LjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCA1LjBdLCBbNjQ3LjksIDY4Mi4wLCA0LjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAzLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA4NTYzLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA1OTkwLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0MjUxLjBdLCBbODUyLjUsIDg4Ni42LCA3MTgzLjBdLCBbODg2LjYsIDkyMC43LCAyMTUwLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCA3NjEuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDcyNy4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDQ5OS4wXV1dLCBbMTYwNTc1ODI3OC4xNzk5MTcsIDU2LCBbWzAuMCwgMzQuMSwgMTc4MzguMF0sIFszNC4xLCA2OC4yLCAzMTA2LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCAzNjc2LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgMzQ0Ni4wXSwgWzEzNi40LCAxNzAuNSwgNTExLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNzAuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMzg3LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgNDc3LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgNS4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDEuMF0sIFszNDEuMCwgMzc1LjEsIDEzLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMi4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAxLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgNC4wXSwgWzU0NS42LCA1NzkuNywgMS4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMTIuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDkuMF0sIFs2NDcuOSwgNjgyLjAsIDEuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg4MDkuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDU5MjkuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzOTkuMF0sIFs4NTIuNSwgODg2LjYsIDcyMTAuMF0sIFs4ODYuNiwgOTIwLjcsIDIwOTQuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDcwNS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNzM4LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNTU2LjBdXV0sIFsxNjA1NzU4MjgxLjAxMDU1MywgNTcsIFtbMC4wLCAzNC4xLCAxNzIwMy4wXSwgWzM0LjEsIDY4LjIsIDM0NzUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM3ODIuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzNjY4LjBdLCBbMTM2LjQsIDE3MC41LCA0OTEuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA2MS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAzODEuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA0NjcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAzLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgNi4wXSwgWzM0MS4wLCAzNzUuMSwgNS4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDEuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDEwLjBdLCBbNTQ1LjYsIDU3OS43LCAzLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAxOC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTcuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg4NDkuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDU5OTYuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQxNDAuMF0sIFs4NTIuNSwgODg2LjYsIDc0MTEuMF0sIFs4ODYuNiwgOTIwLjcsIDIxMzAuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDYzMC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNjk2LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNTU3LjBdXV0sIFsxNjA1NzU4MjgzLjk1MTkxMiwgNTgsIFtbMC4wLCAzNC4xLCAxNjg1MC4wXSwgWzM0LjEsIDY4LjIsIDM2MDguMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDM1NzMuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCAzODc2LjBdLCBbMTM2LjQsIDE3MC41LCA2OTQuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA1OC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCA0MzUuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA1MjQuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCA5LjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgOS4wXSwgWzM0MS4wLCAzNzUuMSwgMTEuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAxLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAxLjBdLCBbNTQ1LjYsIDU3OS43LCAyLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAxMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMTAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDEuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDg2MjguMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDYxMTMuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQxNTcuMF0sIFs4NTIuNSwgODg2LjYsIDcxNDAuMF0sIFs4ODYuNiwgOTIwLjcsIDIyMTcuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDY2Ni4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgNzkzLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgNjE0LjBdXV1d",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/histograms/histograms?run=20201119-035554%2Fmetrics&tag=New%20round%20of%20True%20samples": {
"data": "W1sxNjA1NzU4MTYyLjU2MDQ5LCAxLCBbWzAuMCwgMzQuMSwgODEzMC4wXSwgWzM0LjEsIDY4LjIsIDUxMjIuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1MjguMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTg3LjBdLCBbMTM2LjQsIDE3MC41LCAxMDk5LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE1LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExMzguMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NzcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU2NDQuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2NTUuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ1NjYuMF0sIFs4NTIuNSwgODg2LjYsIDczNjkuMF0sIFs4ODYuNiwgOTIwLjcsIDI0MzcuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwODQuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwODguMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTYxLjBdXV0sIFsxNjA1NzU4MTY0LjQ3NTA0OSwgMiwgW1swLjAsIDM0LjEsIDgwOTYuMF0sIFszNC4xLCA2OC4yLCA1MTg0LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjQ0LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjU4Mi4wXSwgWzEzNi40LCAxNzAuNSwgMTE2My4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQwNS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDc5LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTMyLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NDcxLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NjU3LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDU2LjBdLCBbODUyLjUsIDg4Ni42LCA3NTQ1LjBdLCBbODg2LjYsIDkyMC43LCAyNDk0LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMDU0LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDUwLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE4OC4wXV1dLCBbMTYwNTc1ODE2Ni4zMzg2NjUsIDMsIFtbMC4wLCAzNC4xLCA4MzY4LjBdLCBbMzQuMSwgNjguMiwgNTE2OS4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU1NC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY0NjIuMF0sIFsxMzYuNCwgMTcwLjUsIDExMDMuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODkuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTE2MC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk4NC4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU3OS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjUyNy4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDQ3Ny4wXSwgWzg1Mi41LCA4ODYuNiwgNzQ4Ni4wXSwgWzg4Ni42LCA5MjAuNywgMjM5NS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA4Ny4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA5OC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNjIuMF1dXSwgWzE2MDU3NTgxNjguMjA1OTU5LCA0LCBbWzAuMCwgMzQuMSwgODEzNy4wXSwgWzM0LjEsIDY4LjIsIDUxNjcuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY3MjMuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NDEyLjBdLCBbMTM2LjQsIDE3MC41LCAxMDg0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDI2LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwODAuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MTkuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1MTAuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY3MDAuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ1NTYuMF0sIFs4NTIuNSwgODg2LjYsIDc0NTcuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NjguMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExNDQuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwODkuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTI4LjBdXV0sIFsxNjA1NzU4MTcwLjE4NDA4MiwgNSwgW1swLjAsIDM0LjEsIDgwODQuMF0sIFszNC4xLCA2OC4yLCA1MTgwLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NTc5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjUzOC4wXSwgWzEzNi40LCAxNzAuNSwgMTEyNy4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQwNC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDgxLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTI3LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTkzLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NjI5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NTY0LjBdLCBbODUyLjUsIDg4Ni42LCA3NTQyLjBdLCBbODg2LjYsIDkyMC43LCAyNDg2LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTA2LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDQwLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEyMC4wXV1dLCBbMTYwNTc1ODE3My45MDU1MTgsIDcsIFtbMC4wLCAzNC4xLCA4MTM3LjBdLCBbMzQuMSwgNjguMiwgNTE5NC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU2Ny4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1ODAuMF0sIFsxMzYuNCwgMTcwLjUsIDEwODAuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzOTYuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTA5Ny4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkyNi4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU5Ny4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjU1My4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDU1NS4wXSwgWzg1Mi41LCA4ODYuNiwgNzU2My4wXSwgWzg4Ni42LCA5MjAuNywgMjQxNy4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTE2NS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTAzMi4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNDEuMF1dXSwgWzE2MDU3NTgxNzUuODI5MDQ3LCA4LCBbWzAuMCwgMzQuMSwgODEyNC4wXSwgWzM0LjEsIDY4LjIsIDUxMDUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1OTcuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjY2LjBdLCBbMTM2LjQsIDE3MC41LCAxMTQxLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzkwLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExMDkuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NDMuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU2NDEuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1MDUuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NjguMF0sIFs4NTIuNSwgODg2LjYsIDc0NTkuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NTguMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMjcuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDExMDQuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTYzLjBdXV0sIFsxNjA1NzU4MTc3LjY0NTAzNCwgOSwgW1swLjAsIDM0LjEsIDgzMzQuMF0sIFszNC4xLCA2OC4yLCA1MjIxLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NDkxLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjU2NS4wXSwgWzEzNi40LCAxNzAuNSwgMTE2NS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM3OS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDM4LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTUwLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTI0LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTY0LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDQ5LjBdLCBbODUyLjUsIDg4Ni42LCA3NTM4LjBdLCBbODg2LjYsIDkyMC43LCAyNDkyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMDgzLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDY5LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEzOC4wXV1dLCBbMTYwNTc1ODE4MC4xMDQ3NiwgMTAsIFtbMC4wLCAzNC4xLCA4MDQyLjBdLCBbMzQuMSwgNjguMiwgNTEwNC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjY3Mi4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY0MTQuMF0sIFsxMzYuNCwgMTcwLjUsIDExNTUuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzNzMuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTE1Ny4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk1MC4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTQ4NS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjU2My4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUyMi4wXSwgWzg1Mi41LCA4ODYuNiwgNzczMi4wXSwgWzg4Ni42LCA5MjAuNywgMjUwMy4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTExOC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTAzNC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNzYuMF1dXSwgWzE2MDU3NTgxODIuMzM0NjI1LCAxMSwgW1swLjAsIDM0LjEsIDgxODguMF0sIFszNC4xLCA2OC4yLCA1MDM5LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjQzLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjUzMi4wXSwgWzEzNi40LCAxNzAuNSwgMTEyMi4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM5MC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDk4LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTQxLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTE5LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTUyLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDI2LjBdLCBbODUyLjUsIDg4Ni42LCA3NjA0LjBdLCBbODg2LjYsIDkyMC43LCAyNTEyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTY4LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDk5LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE2Ny4wXV1dLCBbMTYwNTc1ODE4NC4xOTM0MTgsIDEyLCBbWzAuMCwgMzQuMSwgODExMS4wXSwgWzM0LjEsIDY4LjIsIDUxMTAuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1NzIuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTY2LjBdLCBbMTM2LjQsIDE3MC41LCAxMTI3LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzkwLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNDguMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NzUuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1NzYuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2NzguMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NjkuMF0sIFs4NTIuNSwgODg2LjYsIDc1MDQuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NzUuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwOTAuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwOTcuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTEyLjBdXV0sIFsxNjA1NzU4MTg4LjEyOTAzMiwgMTQsIFtbMC4wLCAzNC4xLCA4MjExLjBdLCBbMzQuMSwgNjguMiwgNTIzMy4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjUwNy4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1MjkuMF0sIFsxMzYuNCwgMTcwLjUsIDEwODQuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MDMuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEwMC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkyMS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU1Ni4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjY0My4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUwNS4wXSwgWzg1Mi41LCA4ODYuNiwgNzYyNC4wXSwgWzg4Ni42LCA5MjAuNywgMjM2NC4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA5MS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTAyMC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDEyMDkuMF1dXSwgWzE2MDU3NTgxODkuOTg1OTc3LCAxNSwgW1swLjAsIDM0LjEsIDgzNDUuMF0sIFszNC4xLCA2OC4yLCA1MTc2LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NDY5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjU1Ni4wXSwgWzEzNi40LCAxNzAuNSwgMTExOS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQwMS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDc3LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTQ4LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTI5LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTAxLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDk0LjBdLCBbODUyLjUsIDg4Ni42LCA3NTg1LjBdLCBbODg2LjYsIDkyMC43LCAyNDI5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTIzLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDgyLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE2Ni4wXV1dLCBbMTYwNTc1ODE5MS44NTgwNjUsIDE2LCBbWzAuMCwgMzQuMSwgNzk4Mi4wXSwgWzM0LjEsIDY4LjIsIDUwNDYuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1OTAuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjcwLjBdLCBbMTM2LjQsIDE3MC41LCAxMTYwLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzg3LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwODkuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5ODQuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU2ODkuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1NzIuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NzEuMF0sIFs4NTIuNSwgODg2LjYsIDc1MzIuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NTUuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMzguMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNzAuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTY1LjBdXV0sIFsxNjA1NzU4MTkzLjc1ODk1NSwgMTcsIFtbMC4wLCAzNC4xLCA4MTMwLjBdLCBbMzQuMSwgNjguMiwgNTI3My4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjYxOC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDYzMTQuMF0sIFsxMzYuNCwgMTcwLjUsIDExMTQuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MDQuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTA5OS4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk2My4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU2Ni4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjYyMi4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDU0Ny4wXSwgWzg1Mi41LCA4ODYuNiwgNzQ4OC4wXSwgWzg4Ni42LCA5MjAuNywgMjUzNi4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTEyNC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTAzNC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNjguMF1dXSwgWzE2MDU3NTgxOTUuNzUwODEsIDE4LCBbWzAuMCwgMzQuMSwgODAwNy4wXSwgWzM0LjEsIDY4LjIsIDUxNDMuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY3NTguMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjQzLjBdLCBbMTM2LjQsIDE3MC41LCAxMTQwLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDEzLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwOTQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NDcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU0ODkuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1MDguMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ1MDMuMF0sIFs4NTIuNSwgODg2LjYsIDc2NTAuMF0sIFs4ODYuNiwgOTIwLjcsIDIzNTcuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMTIuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwODkuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTQ3LjBdXV0sIFsxNjA1NzU4MTk3LjU5NTMxOSwgMTksIFtbMC4wLCAzNC4xLCA3OTk2LjBdLCBbMzQuMSwgNjguMiwgNTA5My4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjc1OS4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY2NTcuMF0sIFsxMzYuNCwgMTcwLjUsIDExNDAuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MzUuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTE1Ny4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDg5NS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTYzMS4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjU4Ny4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDM5MC4wXSwgWzg1Mi41LCA4ODYuNiwgNzUxNC4wXSwgWzg4Ni42LCA5MjAuNywgMjQ2NC4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTEyMS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA0My4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExMTguMF1dXSwgWzE2MDU3NTgxOTkuNDM4Njk2LCAyMCwgW1swLjAsIDM0LjEsIDc5NTEuMF0sIFszNC4xLCA2OC4yLCA1MjI4LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NTU3LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjU2Ni4wXSwgWzEzNi40LCAxNzAuNSwgMTE0Ni4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQzMS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTA1LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTE5LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTMyLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NzYxLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDg4LjBdLCBbODUyLjUsIDg4Ni42LCA3NTgxLjBdLCBbODg2LjYsIDkyMC43LCAyNDM1LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTAzLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDU4LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEzOS4wXV1dLCBbMTYwNTc1ODIwMS4yNzk4OTMsIDIxLCBbWzAuMCwgMzQuMSwgODE4NS4wXSwgWzM0LjEsIDY4LjIsIDUwODYuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2NzIuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTM2LjBdLCBbMTM2LjQsIDE3MC41LCAxMDg0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzgwLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwODMuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA4NzcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU2OTMuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2NDMuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzMjIuMF0sIFs4NTIuNSwgODg2LjYsIDc2NjIuMF0sIFs4ODYuNiwgOTIwLjcsIDI1MjcuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwNzQuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjQuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTUyLjBdXV0sIFsxNjA1NzU4MjAzLjEwMzAwOCwgMjIsIFtbMC4wLCAzNC4xLCA4MjA0LjBdLCBbMzQuMSwgNjguMiwgNTA3OC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjYyMy4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1MDEuMF0sIFsxMzYuNCwgMTcwLjUsIDExMTcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODQuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEwMy4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDg5NS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU1NC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjYzOS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDQzOC4wXSwgWzg1Mi41LCA4ODYuNiwgNzU4OC4wXSwgWzg4Ni42LCA5MjAuNywgMjU2Mi4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA3Ny4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA4Mi4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNTUuMF1dXSwgWzE2MDU3NTgyMDUuMjgzNDU3LCAyMywgW1swLjAsIDM0LjEsIDgxMTcuMF0sIFszNC4xLCA2OC4yLCA1MTc2LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NTc1LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjQ0OS4wXSwgWzEzNi40LCAxNzAuNSwgMTA4OS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM5MC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTI3LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTk4LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NDU5LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTcxLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NjI2LjBdLCBbODUyLjUsIDg4Ni42LCA3NjI0LjBdLCBbODg2LjYsIDkyMC43LCAyNDI5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTA0LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDgzLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE4My4wXV1dLCBbMTYwNTc1ODIwNy4wODk4NzEsIDI0LCBbWzAuMCwgMzQuMSwgODIyNy4wXSwgWzM0LjEsIDY4LjIsIDUyMjcuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY0MjUuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTU1LjBdLCBbMTM2LjQsIDE3MC41LCAxMDg5LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzc1LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNjIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MjQuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1MzMuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1ODYuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NDkuMF0sIFs4NTIuNSwgODg2LjYsIDc2NDUuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NjQuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExNDYuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNzMuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTIwLjBdXV0sIFsxNjA1NzU4MjA5LjE1OTEwNCwgMjUsIFtbMC4wLCAzNC4xLCA3ODg5LjBdLCBbMzQuMSwgNjguMiwgNTA5My4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjYxOC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1NzQuMF0sIFsxMzYuNCwgMTcwLjUsIDExNDcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MTIuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEwNS4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk4MS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU5MC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjY1My4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDQ5NS4wXSwgWzg1Mi41LCA4ODYuNiwgNzYyNy4wXSwgWzg4Ni42LCA5MjAuNywgMjUxNi4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTExMC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTAyOS4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNjEuMF1dXSwgWzE2MDU3NTgyMTAuOTgzNDk0LCAyNiwgW1swLjAsIDM0LjEsIDgzMDkuMF0sIFszNC4xLCA2OC4yLCA1MDQ3LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjAxLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjYwMi4wXSwgWzEzNi40LCAxNzAuNSwgMTIwMy4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM4MC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDk3LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTIzLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NjE4LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NDI5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NTU4LjBdLCBbODUyLjUsIDg4Ni42LCA3NTIzLjBdLCBbODg2LjYsIDkyMC43LCAyNDQ1LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTA1LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDIwLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE0MC4wXV1dLCBbMTYwNTc1ODIxMi45MzYyNTQsIDI3LCBbWzAuMCwgMzQuMSwgNzkyOC4wXSwgWzM0LjEsIDY4LjIsIDUwNTMuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1OTcuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjgwLjBdLCBbMTM2LjQsIDE3MC41LCAxMTU0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzkyLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwNzIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5ODAuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1ODIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY3ODAuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ1NDIuMF0sIFs4NTIuNSwgODg2LjYsIDc1ODEuMF0sIFs4ODYuNiwgOTIwLjcsIDIzNTIuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMDMuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwMzkuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTY1LjBdXV0sIFsxNjA1NzU4MjE0Ljc5MTgyMywgMjgsIFtbMC4wLCAzNC4xLCA4MDU0LjBdLCBbMzQuMSwgNjguMiwgNTIzOC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjc0Ni4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDYzNDYuMF0sIFsxMzYuNCwgMTcwLjUsIDExMjAuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzNzIuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTExMi4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDg4NS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTYyNy4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjYwNS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUxNy4wXSwgWzg1Mi41LCA4ODYuNiwgNzYzNC4wXSwgWzg4Ni42LCA5MjAuNywgMjM4OC4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTEyNS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA3Ni4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNTUuMF1dXSwgWzE2MDU3NTgyMTYuOTQ1MDA5LCAyOSwgW1swLjAsIDM0LjEsIDgxMjIuMF0sIFszNC4xLCA2OC4yLCA1MTA2LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjI5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjUwMC4wXSwgWzEzNi40LCAxNzAuNSwgMTE2Mi4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM4MS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDgwLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTA3LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTkzLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NzQwLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDkzLjBdLCBbODUyLjUsIDg4Ni42LCA3NTEwLjBdLCBbODg2LjYsIDkyMC43LCAyNDQwLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTUxLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDQxLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE0NS4wXV1dLCBbMTYwNTc1ODIyMC44MjA0MzMsIDMxLCBbWzAuMCwgMzQuMSwgODIwMS4wXSwgWzM0LjEsIDY4LjIsIDUyMzMuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2ODMuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NDg4LjBdLCBbMTM2LjQsIDE3MC41LCAxMDc1LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE0LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwODkuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MDguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU0MjMuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2ODEuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzNzMuMF0sIFs4NTIuNSwgODg2LjYsIDc1MTkuMF0sIFs4ODYuNiwgOTIwLjcsIDI0ODYuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExNDQuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDExMDMuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTgwLjBdXV0sIFsxNjA1NzU4MjIyLjY4NDA3NiwgMzIsIFtbMC4wLCAzNC4xLCA4MDcxLjBdLCBbMzQuMSwgNjguMiwgNTA1Ni4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU5My4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY2MjguMF0sIFsxMzYuNCwgMTcwLjUsIDExMTcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MzcuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTA0NC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDEwMDYuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1NDQuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1NjAuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzNzUuMF0sIFs4NTIuNSwgODg2LjYsIDc2ODcuMF0sIFs4ODYuNiwgOTIwLjcsIDI1MzYuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMTguMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNjUuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTYzLjBdXV0sIFsxNjA1NzU4MjI0Ljk4Mjk3MywgMzMsIFtbMC4wLCAzNC4xLCA4MTg5LjBdLCBbMzQuMSwgNjguMiwgNTIwMS4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjYzMC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY0MTQuMF0sIFsxMzYuNCwgMTcwLjUsIDEwOTcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODguMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTExMC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkxOS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU3NC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjYyMi4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDQ2NS4wXSwgWzg1Mi41LCA4ODYuNiwgNzYzOS4wXSwgWzg4Ni42LCA5MjAuNywgMjM5Ny4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTEwOC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA4My4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNjQuMF1dXSwgWzE2MDU3NTgyMjguOTkyOTMsIDM1LCBbWzAuMCwgMzQuMSwgODE0Mi4wXSwgWzM0LjEsIDY4LjIsIDUxMjQuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2NzcuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTQ3LjBdLCBbMTM2LjQsIDE3MC41LCAxMTYzLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE4LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExMTQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MzQuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1NzQuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2NDUuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NTkuMF0sIFs4NTIuNSwgODg2LjYsIDc0MzAuMF0sIFs4ODYuNiwgOTIwLjcsIDI0MTYuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMjIuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNzYuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTU5LjBdXV0sIFsxNjA1NzU4MjMwLjkxNDg1OCwgMzYsIFtbMC4wLCAzNC4xLCA4MDY2LjBdLCBbMzQuMSwgNjguMiwgNTI1Ni4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjQ1OC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1OTAuMF0sIFsxMzYuNCwgMTcwLjUsIDExMTMuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODYuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEyNi4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk0NC4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTc0Mi4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjU1NS4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDQzNy4wXSwgWzg1Mi41LCA4ODYuNiwgNzU3Ny4wXSwgWzg4Ni42LCA5MjAuNywgMjQ0OS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTEwMC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA2NS4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExMzYuMF1dXSwgWzE2MDU3NTgyMzQuNzIwODEyLCAzOCwgW1swLjAsIDM0LjEsIDgzMzYuMF0sIFszNC4xLCA2OC4yLCA1MjA1LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjI4LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjQzNC4wXSwgWzEzNi40LCAxNzAuNSwgMTA4MS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM4Mi4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDc5LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTQ1LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTI3LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NjQxLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDM3LjBdLCBbODUyLjUsIDg4Ni42LCA3NTUyLjBdLCBbODg2LjYsIDkyMC43LCAyNDU0LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTAxLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDU3LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE0MS4wXV1dLCBbMTYwNTc1ODIzNi42NTczNDksIDM5LCBbWzAuMCwgMzQuMSwgODEzMy4wXSwgWzM0LjEsIDY4LjIsIDUxMTguMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1MTEuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NDIzLjBdLCBbMTM2LjQsIDE3MC41LCAxMTMwLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE3LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNzQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MzguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU3MTEuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1NjguMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NjAuMF0sIFs4NTIuNSwgODg2LjYsIDc2NDQuMF0sIFs4ODYuNiwgOTIwLjcsIDI0NDguMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMjAuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNjIuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTQzLjBdXV0sIFsxNjA1NzU4MjM4LjQ3MTAxMSwgNDAsIFtbMC4wLCAzNC4xLCA4MTYzLjBdLCBbMzQuMSwgNjguMiwgNTE1Ny4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjQ4NC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY2NDIuMF0sIFsxMzYuNCwgMTcwLjUsIDExNDAuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODkuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTA4OC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkyMi4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU4My4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjYyMC4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUyMS4wXSwgWzg1Mi41LCA4ODYuNiwgNzU5MC4wXSwgWzg4Ni42LCA5MjAuNywgMjQ2NS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA3NS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA2NC4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDEwOTcuMF1dXSwgWzE2MDU3NTgyNDAuMzEwMjM0LCA0MSwgW1swLjAsIDM0LjEsIDgxMTYuMF0sIFszNC4xLCA2OC4yLCA1MTY3LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjI2LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjM4OC4wXSwgWzEzNi40LCAxNzAuNSwgMTEyOS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQzMC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTAwLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTMzLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NzU4LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTMzLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDM1LjBdLCBbODUyLjUsIDg4Ni42LCA3NTcyLjBdLCBbODg2LjYsIDkyMC43LCAyNDM1LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMDg0LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDg4LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTIwNi4wXV1dLCBbMTYwNTc1ODI0NC4yNDczNjQsIDQzLCBbWzAuMCwgMzQuMSwgODA3NC4wXSwgWzM0LjEsIDY4LjIsIDUxNDAuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2MjQuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTAyLjBdLCBbMTM2LjQsIDE3MC41LCAxMTI3LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzkwLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExMTUuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MDcuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1MTYuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2MjQuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ1MDMuMF0sIFs4NTIuNSwgODg2LjYsIDc2NTguMF0sIFs4ODYuNiwgOTIwLjcsIDI0NzYuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExNTguMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwMzIuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTU0LjBdXV0sIFsxNjA1NzU4MjQ4LjI5NTEyLCA0NSwgW1swLjAsIDM0LjEsIDgwMjQuMF0sIFszNC4xLCA2OC4yLCA1MTY1LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjQwLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjYwOC4wXSwgWzEzNi40LCAxNzAuNSwgMTEzOC4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDQzNS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTM2LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgODk1LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NzAyLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2Njk0LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDIxLjBdLCBbODUyLjUsIDg4Ni42LCA3NTAyLjBdLCBbODg2LjYsIDkyMC43LCAyNDAyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMDc3LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDM5LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEyMi4wXV1dLCBbMTYwNTc1ODI1MC4xNDI5NDMsIDQ2LCBbWzAuMCwgMzQuMSwgNzk4Mi4wXSwgWzM0LjEsIDY4LjIsIDUxNjIuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2MTQuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NDU4LjBdLCBbMTM2LjQsIDE3MC41LCAxMTY0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE4LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNjEuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MjguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1ODQuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY3MDkuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzNjcuMF0sIFs4NTIuNSwgODg2LjYsIDc2NTguMF0sIFs4ODYuNiwgOTIwLjcsIDI1MTEuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwODguMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNTIuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTQ0LjBdXV0sIFsxNjA1NzU4MjUzLjkyMjI3LCA0OCwgW1swLjAsIDM0LjEsIDgxMzguMF0sIFszNC4xLCA2OC4yLCA1MTA3LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjEwLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjU3Mi4wXSwgWzEzNi40LCAxNzAuNSwgMTE3Mi4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM5MS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTIyLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTYxLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTI1LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NDY5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NTQ1LjBdLCBbODUyLjUsIDg4Ni42LCA3NDY5LjBdLCBbODg2LjYsIDkyMC43LCAyNTQ4LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTc3LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDg1LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEwOS4wXV1dLCBbMTYwNTc1ODI1NS43NzUzMjksIDQ5LCBbWzAuMCwgMzQuMSwgODEzMi4wXSwgWzM0LjEsIDY4LjIsIDUxNDUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2MjMuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjE4LjBdLCBbMTM2LjQsIDE3MC41LCAxMTMyLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzU4LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNjIuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NzguMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1NjYuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY3ODQuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzMTguMF0sIFs4NTIuNSwgODg2LjYsIDc1MDguMF0sIFs4ODYuNiwgOTIwLjcsIDI0MTUuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwNTAuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwODkuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTIyLjBdXV0sIFsxNjA1NzU4MjU4LjAwNzg4LCA1MCwgW1swLjAsIDM0LjEsIDgyMDcuMF0sIFszNC4xLCA2OC4yLCA1MTkxLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjU5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjUwMy4wXSwgWzEzNi40LCAxNzAuNSwgMTE2OC4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM4MC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTExLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTIwLjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTc5LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTQxLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDc1LjBdLCBbODUyLjUsIDg4Ni42LCA3NTAyLjBdLCBbODg2LjYsIDkyMC43LCAyNDc4LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTExLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDI4LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE0Ny4wXV1dLCBbMTYwNTc1ODI2MS4wODg1MzUsIDUwLCBbWzAuMCwgMzQuMSwgODA0Ny4wXSwgWzM0LjEsIDY4LjIsIDUyMDUuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1NzUuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NDk2LjBdLCBbMTM2LjQsIDE3MC41LCAxMTY0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzg5LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwODMuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCAxMDU5LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NTE1LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NjU5LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDc5LjBdLCBbODUyLjUsIDg4Ni42LCA3NDk3LjBdLCBbODg2LjYsIDkyMC43LCAyNDU5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTQ1LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMTA2LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEyMi4wXV1dLCBbMTYwNTc1ODI2NC4wMTA4MzEsIDUxLCBbWzAuMCwgMzQuMSwgODIzNS4wXSwgWzM0LjEsIDY4LjIsIDUxODQuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2MzQuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2Mzg2LjBdLCBbMTM2LjQsIDE3MC41LCAxMTA0LjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzY0LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExMTQuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5MjUuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1ODIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1NjYuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQzMjUuMF0sIFs4NTIuNSwgODg2LjYsIDc3NTAuMF0sIFs4ODYuNiwgOTIwLjcsIDI0ODguMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwODYuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDExMzEuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTI2LjBdXV0sIFsxNjA1NzU4MjY2Ljg0Nzk1MSwgNTIsIFtbMC4wLCAzNC4xLCA4MTUwLjBdLCBbMzQuMSwgNjguMiwgNTI2OS4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU0OC4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1MjAuMF0sIFsxMzYuNCwgMTcwLjUsIDExMTIuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODcuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEyMC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkzMS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTQ5Ni4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjcwMy4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDUxMC4wXSwgWzg1Mi41LCA4ODYuNiwgNzQ5OC4wXSwgWzg4Ni42LCA5MjAuNywgMjQ5MS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA3Mi4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA1Mi4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNDEuMF1dXSwgWzE2MDU3NTgyNjkuNjk4Mjc3LCA1MywgW1swLjAsIDM0LjEsIDgxNzkuMF0sIFszNC4xLCA2OC4yLCA1MTM5LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjM5LjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjQ0MS4wXSwgWzEzNi40LCAxNzAuNSwgMTA5OS4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM5MS4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDk0LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTQ4LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NjU5LjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTM4LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDY2LjBdLCBbODUyLjUsIDg4Ni42LCA3NjEyLjBdLCBbODg2LjYsIDkyMC43LCAyNDcyLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTMzLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDU1LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTEzNS4wXV1dLCBbMTYwNTc1ODI3Mi4zNjM5NTMsIDU0LCBbWzAuMCwgMzQuMSwgODA5NC4wXSwgWzM0LjEsIDY4LjIsIDUyNjEuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY2MTkuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NTkxLjBdLCBbMTM2LjQsIDE3MC41LCAxMDkwLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgMzcxLjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDExNTAuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NzIuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU1NzIuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY1NjMuMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0OTUuMF0sIFs4NTIuNSwgODg2LjYsIDc0MjMuMF0sIFs4ODYuNiwgOTIwLjcsIDI0ODQuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDExMzcuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwNjUuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTEzLjBdXV0sIFsxNjA1NzU4Mjc1LjIxMzM3NCwgNTUsIFtbMC4wLCAzNC4xLCA4MjIwLjBdLCBbMzQuMSwgNjguMiwgNTE3NC4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU2Mi4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1OTIuMF0sIFsxMzYuNCwgMTcwLjUsIDExMTcuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCA0MDAuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTE2Ny4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDkxOS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU2MC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjQ4NC4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDM5NS4wXSwgWzg1Mi41LCA4ODYuNiwgNzU0OC4wXSwgWzg4Ni42LCA5MjAuNywgMjU1Mi4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA4OC4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA2Ny4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNTUuMF1dXSwgWzE2MDU3NTgyNzguMjI4ODI3LCA1NiwgW1swLjAsIDM0LjEsIDgxODUuMF0sIFszNC4xLCA2OC4yLCA1MDMxLjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjAzLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjYyOC4wXSwgWzEzNi40LCAxNzAuNSwgMTA3NC4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM4NC4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMDg4LjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTc3LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NjIwLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTAzLjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0NDQ4LjBdLCBbODUyLjUsIDg4Ni42LCA3NTcyLjBdLCBbODg2LjYsIDkyMC43LCAyNTQzLjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMDczLjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMTIyLjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTE0OS4wXV1dLCBbMTYwNTc1ODI4MS4wNTgzMTgsIDU3LCBbWzAuMCwgMzQuMSwgODEwMy4wXSwgWzM0LjEsIDY4LjIsIDUxMDkuMF0sIFs2OC4yLCAxMDIuMzAwMDAwMDAwMDAwMDEsIDY1ODMuMF0sIFsxMDIuMzAwMDAwMDAwMDAwMDEsIDEzNi40LCA2NjAxLjBdLCBbMTM2LjQsIDE3MC41LCAxMTMyLjBdLCBbMTcwLjUsIDIwNC42MDAwMDAwMDAwMDAwMiwgNDE2LjBdLCBbMjA0LjYwMDAwMDAwMDAwMDAyLCAyMzguNzAwMDAwMDAwMDAwMDIsIDEwNDYuMF0sIFsyMzguNzAwMDAwMDAwMDAwMDIsIDI3Mi44LCA5NTYuMF0sIFsyNzIuOCwgMzA2LjkwMDAwMDAwMDAwMDAzLCAwLjBdLCBbMzA2LjkwMDAwMDAwMDAwMDAzLCAzNDEuMCwgMC4wXSwgWzM0MS4wLCAzNzUuMSwgMC4wXSwgWzM3NS4xLCA0MDkuMjAwMDAwMDAwMDAwMDUsIDAuMF0sIFs0MDkuMjAwMDAwMDAwMDAwMDUsIDQ0My4zLCAwLjBdLCBbNDQzLjMsIDQ3Ny40MDAwMDAwMDAwMDAwMywgMC4wXSwgWzQ3Ny40MDAwMDAwMDAwMDAwMywgNTExLjUsIDAuMF0sIFs1MTEuNSwgNTQ1LjYsIDAuMF0sIFs1NDUuNiwgNTc5LjcsIDAuMF0sIFs1NzkuNywgNjEzLjgwMDAwMDAwMDAwMDEsIDAuMF0sIFs2MTMuODAwMDAwMDAwMDAwMSwgNjQ3LjksIDAuMF0sIFs2NDcuOSwgNjgyLjAsIDAuMF0sIFs2ODIuMCwgNzE2LjEsIDAuMF0sIFs3MTYuMSwgNzUwLjIsIDAuMF0sIFs3NTAuMiwgNzg0LjMwMDAwMDAwMDAwMDEsIDU2NjUuMF0sIFs3ODQuMzAwMDAwMDAwMDAwMSwgODE4LjQwMDAwMDAwMDAwMDEsIDY2MTguMF0sIFs4MTguNDAwMDAwMDAwMDAwMSwgODUyLjUsIDQ0NTcuMF0sIFs4NTIuNSwgODg2LjYsIDc1NTcuMF0sIFs4ODYuNiwgOTIwLjcsIDI1MjcuMF0sIFs5MjAuNywgOTU0LjgwMDAwMDAwMDAwMDEsIDEwNDYuMF0sIFs5NTQuODAwMDAwMDAwMDAwMSwgOTg4LjkwMDAwMDAwMDAwMDEsIDEwODEuMF0sIFs5ODguOTAwMDAwMDAwMDAwMSwgMTAyMy4wLCAxMTAzLjBdXV0sIFsxNjA1NzU4MjgzLjk5ODAxNCwgNTgsIFtbMC4wLCAzNC4xLCA4MDc0LjBdLCBbMzQuMSwgNjguMiwgNTE5Ni4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjU4Ny4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1MzcuMF0sIFsxMzYuNCwgMTcwLjUsIDExMjguMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzODEuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTExNS4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk4MS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTU2MC4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjU2OC4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDU2My4wXSwgWzg1Mi41LCA4ODYuNiwgNzYyMC4wXSwgWzg4Ni42LCA5MjAuNywgMjQxMy4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTA2Mi4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA3MS4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExNDQuMF1dXV0=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/histograms/histograms?run=20201119-035554%2Fmetrics&tag=Training%20Distribution": {
"data": "W1sxNjA1NzU4MTU5LjA1MDcwOSwgMCwgW1swLjAsIDM0LjEsIDgyMjguMF0sIFszNC4xLCA2OC4yLCA1MTY2LjBdLCBbNjguMiwgMTAyLjMwMDAwMDAwMDAwMDAxLCA2NjMxLjBdLCBbMTAyLjMwMDAwMDAwMDAwMDAxLCAxMzYuNCwgNjUwMS4wXSwgWzEzNi40LCAxNzAuNSwgMTEyMi4wXSwgWzE3MC41LCAyMDQuNjAwMDAwMDAwMDAwMDIsIDM5Ny4wXSwgWzIwNC42MDAwMDAwMDAwMDAwMiwgMjM4LjcwMDAwMDAwMDAwMDAyLCAxMTAwLjBdLCBbMjM4LjcwMDAwMDAwMDAwMDAyLCAyNzIuOCwgOTU1LjBdLCBbMjcyLjgsIDMwNi45MDAwMDAwMDAwMDAwMywgMC4wXSwgWzMwNi45MDAwMDAwMDAwMDAwMywgMzQxLjAsIDAuMF0sIFszNDEuMCwgMzc1LjEsIDAuMF0sIFszNzUuMSwgNDA5LjIwMDAwMDAwMDAwMDA1LCAwLjBdLCBbNDA5LjIwMDAwMDAwMDAwMDA1LCA0NDMuMywgMC4wXSwgWzQ0My4zLCA0NzcuNDAwMDAwMDAwMDAwMDMsIDAuMF0sIFs0NzcuNDAwMDAwMDAwMDAwMDMsIDUxMS41LCAwLjBdLCBbNTExLjUsIDU0NS42LCAwLjBdLCBbNTQ1LjYsIDU3OS43LCAwLjBdLCBbNTc5LjcsIDYxMy44MDAwMDAwMDAwMDAxLCAwLjBdLCBbNjEzLjgwMDAwMDAwMDAwMDEsIDY0Ny45LCAwLjBdLCBbNjQ3LjksIDY4Mi4wLCAwLjBdLCBbNjgyLjAsIDcxNi4xLCAwLjBdLCBbNzE2LjEsIDc1MC4yLCAwLjBdLCBbNzUwLjIsIDc4NC4zMDAwMDAwMDAwMDAxLCA1NzAyLjBdLCBbNzg0LjMwMDAwMDAwMDAwMDEsIDgxOC40MDAwMDAwMDAwMDAxLCA2NTE3LjBdLCBbODE4LjQwMDAwMDAwMDAwMDEsIDg1Mi41LCA0Mzg0LjBdLCBbODUyLjUsIDg4Ni42LCA3NDI1LjBdLCBbODg2LjYsIDkyMC43LCAyNTU5LjBdLCBbOTIwLjcsIDk1NC44MDAwMDAwMDAwMDAxLCAxMTQ1LjBdLCBbOTU0LjgwMDAwMDAwMDAwMDEsIDk4OC45MDAwMDAwMDAwMDAxLCAxMDQ5LjBdLCBbOTg4LjkwMDAwMDAwMDAwMDEsIDEwMjMuMCwgMTExOS4wXV1dLCBbMTYwNTc1ODI1OC4wNDgwNTksIDAsIFtbMC4wLCAzNC4xLCA4MjI4LjBdLCBbMzQuMSwgNjguMiwgNTE2Ni4wXSwgWzY4LjIsIDEwMi4zMDAwMDAwMDAwMDAwMSwgNjYzMS4wXSwgWzEwMi4zMDAwMDAwMDAwMDAwMSwgMTM2LjQsIDY1MDEuMF0sIFsxMzYuNCwgMTcwLjUsIDExMjIuMF0sIFsxNzAuNSwgMjA0LjYwMDAwMDAwMDAwMDAyLCAzOTcuMF0sIFsyMDQuNjAwMDAwMDAwMDAwMDIsIDIzOC43MDAwMDAwMDAwMDAwMiwgMTEwMC4wXSwgWzIzOC43MDAwMDAwMDAwMDAwMiwgMjcyLjgsIDk1NS4wXSwgWzI3Mi44LCAzMDYuOTAwMDAwMDAwMDAwMDMsIDAuMF0sIFszMDYuOTAwMDAwMDAwMDAwMDMsIDM0MS4wLCAwLjBdLCBbMzQxLjAsIDM3NS4xLCAwLjBdLCBbMzc1LjEsIDQwOS4yMDAwMDAwMDAwMDAwNSwgMC4wXSwgWzQwOS4yMDAwMDAwMDAwMDAwNSwgNDQzLjMsIDAuMF0sIFs0NDMuMywgNDc3LjQwMDAwMDAwMDAwMDAzLCAwLjBdLCBbNDc3LjQwMDAwMDAwMDAwMDAzLCA1MTEuNSwgMC4wXSwgWzUxMS41LCA1NDUuNiwgMC4wXSwgWzU0NS42LCA1NzkuNywgMC4wXSwgWzU3OS43LCA2MTMuODAwMDAwMDAwMDAwMSwgMC4wXSwgWzYxMy44MDAwMDAwMDAwMDAxLCA2NDcuOSwgMC4wXSwgWzY0Ny45LCA2ODIuMCwgMC4wXSwgWzY4Mi4wLCA3MTYuMSwgMC4wXSwgWzcxNi4xLCA3NTAuMiwgMC4wXSwgWzc1MC4yLCA3ODQuMzAwMDAwMDAwMDAwMSwgNTcwMi4wXSwgWzc4NC4zMDAwMDAwMDAwMDAxLCA4MTguNDAwMDAwMDAwMDAwMSwgNjUxNy4wXSwgWzgxOC40MDAwMDAwMDAwMDAxLCA4NTIuNSwgNDM4NC4wXSwgWzg1Mi41LCA4ODYuNiwgNzQyNS4wXSwgWzg4Ni42LCA5MjAuNywgMjU1OS4wXSwgWzkyMC43LCA5NTQuODAwMDAwMDAwMDAwMSwgMTE0NS4wXSwgWzk1NC44MDAwMDAwMDAwMDAxLCA5ODguOTAwMDAwMDAwMDAwMSwgMTA0OS4wXSwgWzk4OC45MDAwMDAwMDAwMDAxLCAxMDIzLjAsIDExMTkuMF1dXV0=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/histograms/tags": {
"data": "eyIyMDIwMTExOS0wMzU1NTQvbWV0cmljcyI6IHsiVHJhaW5pbmcgRGlzdHJpYnV0aW9uIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJHZW5lcmF0b3IgZGlzdHJpYnV0aW9uIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJOZXcgcm91bmQgb2YgVHJ1ZSBzYW1wbGVzIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/bundle.js": {
"data": "LyoKCiBDb3B5cmlnaHQgVGhlIENsb3N1cmUgTGlicmFyeSBBdXRob3JzLgogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKKi8KdmFyIGgsYWE9ZnVuY3Rpb24oYSl7dmFyIGI9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX19LGNhPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PUFycmF5LnByb3RvdHlwZXx8YT09T2JqZWN0LnByb3RvdHlwZSlyZXR1cm4gYTthW2JdPWMudmFsdWU7cmV0dXJuIGF9LGVhPWZ1bmN0aW9uKGEpe2E9WyJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyxhLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3csIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmLCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWxdO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgYz1hW2JdO2lmKGMmJmMuTWF0aD09TWF0aClyZXR1cm4gY310aHJvdyBFcnJvcigiQ2Fubm90IGZpbmQgZ2xvYmFsIG9iamVjdCIpOwp9LGs9ZWEodGhpcyksZmE9ZnVuY3Rpb24oYSxiKXtpZihiKWE6e3ZhciBjPWs7YT1hLnNwbGl0KCIuIik7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aC0xO2QrKyl7dmFyIGU9YVtkXTtpZighKGUgaW4gYykpYnJlYWsgYTtjPWNbZV19YT1hW2EubGVuZ3RoLTFdO2Q9Y1thXTtiPWIoZCk7YiE9ZCYmbnVsbCE9YiYmY2EoYyxhLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Yn0pfX07CmZhKCJTeW1ib2wiLGZ1bmN0aW9uKGEpe2lmKGEpcmV0dXJuIGE7dmFyIGI9ZnVuY3Rpb24oZSxmKXt0aGlzLkhJPWU7Y2EodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6Zn0pfTtiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkhJfTt2YXIgYz0wLGQ9ZnVuY3Rpb24oZSl7aWYodGhpcyBpbnN0YW5jZW9mIGQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBiKCJqc2NvbXBfc3ltYm9sXyIrKGV8fCIiKSsiXyIrYysrLGUpfTtyZXR1cm4gZH0pOwpmYSgiU3ltYm9sLml0ZXJhdG9yIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO2E9U3ltYm9sKCJTeW1ib2wuaXRlcmF0b3IiKTtmb3IodmFyIGI9IkFycmF5IEludDhBcnJheSBVaW50OEFycmF5IFVpbnQ4Q2xhbXBlZEFycmF5IEludDE2QXJyYXkgVWludDE2QXJyYXkgSW50MzJBcnJheSBVaW50MzJBcnJheSBGbG9hdDMyQXJyYXkgRmxvYXQ2NEFycmF5Ii5zcGxpdCgiICIpLGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9a1tiW2NdXTsiZnVuY3Rpb24iPT09dHlwZW9mIGQmJiJmdW5jdGlvbiIhPXR5cGVvZiBkLnByb3RvdHlwZVthXSYmY2EoZC5wcm90b3R5cGUsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGhhKGFhKHRoaXMpKX19KX1yZXR1cm4gYX0pO2ZhKCJTeW1ib2wuYXN5bmNJdGVyYXRvciIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpTeW1ib2woIlN5bWJvbC5hc3luY0l0ZXJhdG9yIil9KTsKdmFyIGhhPWZ1bmN0aW9uKGEpe2E9e25leHQ6YX07YVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3JldHVybiBhfSxuPWZ1bmN0aW9uKGEpe3ZhciBiPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6e25leHQ6YWEoYSl9fSxpYT1mdW5jdGlvbihhKXtmb3IodmFyIGIsYz1bXTshKGI9YS5uZXh0KCkpLmRvbmU7KWMucHVzaChiLnZhbHVlKTtyZXR1cm4gY30samE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheT9hOmlhKG4oYSkpfSxsYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT9PYmplY3QuY3JlYXRlOmZ1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKCl7fTtiLnByb3RvdHlwZT1hO3JldHVybiBuZXcgYn0sbmE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZnVuY3Rpb24gYygpe31uZXcgYztSZWZsZWN0LmNvbnN0cnVjdChjLApbXSxmdW5jdGlvbigpe30pO3JldHVybiBuZXcgYyBpbnN0YW5jZW9mIGN9aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmNvbnN0cnVjdCl7aWYoYSgpKXJldHVybiBSZWZsZWN0LmNvbnN0cnVjdDt2YXIgYj1SZWZsZWN0LmNvbnN0cnVjdDtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe2M9YihjLGQpO2UmJlJlZmxlY3Quc2V0UHJvdG90eXBlT2YoYyxlLnByb3RvdHlwZSk7cmV0dXJuIGN9fXJldHVybiBmdW5jdGlvbihjLGQsZSl7dm9pZCAwPT09ZSYmKGU9Yyk7ZT1sYShlLnByb3RvdHlwZXx8T2JqZWN0LnByb3RvdHlwZSk7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGMsZSxkKXx8ZX19KCksb2E7CmlmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2Ypb2E9T2JqZWN0LnNldFByb3RvdHlwZU9mO2Vsc2V7dmFyIHBhO2E6e3ZhciBxYT17eE86ITB9LHNhPXt9O3RyeXtzYS5fX3Byb3RvX189cWE7cGE9c2EueE87YnJlYWsgYX1jYXRjaChhKXt9cGE9ITF9b2E9cGE/ZnVuY3Rpb24oYSxiKXthLl9fcHJvdG9fXz1iO2lmKGEuX19wcm90b19fIT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgZXh0ZW5zaWJsZSIpO3JldHVybiBhfTpudWxsfQp2YXIgdmE9b2EsdD1mdW5jdGlvbihhLGIpe2EucHJvdG90eXBlPWxhKGIucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2lmKHZhKXZhKGEsYik7ZWxzZSBmb3IodmFyIGMgaW4gYilpZigicHJvdG90eXBlIiE9YylpZihPYmplY3QuZGVmaW5lUHJvcGVydGllcyl7dmFyIGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiLGMpO2QmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGMsZCl9ZWxzZSBhW2NdPWJbY119LHhhPWZ1bmN0aW9uKCl7dGhpcy5Ebz0hMTt0aGlzLk5pPW51bGw7dGhpcy5PaT12b2lkIDA7dGhpcy5LZT0xO3RoaXMuYWk9dGhpcy5LbD0wO3RoaXMuYnk9dGhpcy54ZT1udWxsfSx5YT1mdW5jdGlvbihhKXtpZihhLkRvKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTthLkRvPSEwfTt4YS5wcm90b3R5cGUuUG89ZnVuY3Rpb24oYSl7dGhpcy5PaT1hfTsKeGEucHJvdG90eXBlLnhwPWZ1bmN0aW9uKGEpe3RoaXMueGU9e3hGOmEsZUc6ITB9O3RoaXMuS2U9dGhpcy5LbHx8dGhpcy5haX07eGEucHJvdG90eXBlLnJldHVybj1mdW5jdGlvbihhKXt0aGlzLnhlPXtyZXR1cm46YX07dGhpcy5LZT10aGlzLmFpfTt2YXIgemE9ZnVuY3Rpb24oYSxiLGMpe2EuS2U9YztyZXR1cm57dmFsdWU6Yn19O3hhLnByb3RvdHlwZS5Qaj1mdW5jdGlvbihhKXt0aGlzLktlPWF9Owp2YXIgQWE9ZnVuY3Rpb24oYSl7YS5LbD0yO2EuYWk9M30sQmE9ZnVuY3Rpb24oYSl7YS5LbD0wO3ZhciBiPWEueGUueEY7YS54ZT1udWxsO3JldHVybiBifSxDYT1mdW5jdGlvbihhLGIsYyxkKXtkP2EuYnlbZF09YS54ZTphLmJ5PVthLnhlXTthLktsPWJ8fDA7YS5haT1jfHwwfSxEYT1mdW5jdGlvbihhLGIsYyl7Yz1hLmJ5LnNwbGljZShjfHwwKVswXTsoYz1hLnhlPWEueGV8fGMpP2MuZUc/YS5LZT1hLktsfHxhLmFpOnZvaWQgMCE9Yy5QaiYmYS5haTxjLlBqPyhhLktlPWMuUGosYS54ZT1udWxsKTphLktlPWEuYWk6YS5LZT1ifSxGYT1mdW5jdGlvbihhKXt0aGlzLkphPW5ldyB4YTt0aGlzLldRPWF9O0ZhLnByb3RvdHlwZS5Qbz1mdW5jdGlvbihhKXt5YSh0aGlzLkphKTtpZih0aGlzLkphLk5pKXJldHVybiBHYSh0aGlzLHRoaXMuSmEuTmkubmV4dCxhLHRoaXMuSmEuUG8pO3RoaXMuSmEuUG8oYSk7cmV0dXJuIEhhKHRoaXMpfTsKdmFyIElhPWZ1bmN0aW9uKGEsYil7eWEoYS5KYSk7dmFyIGM9YS5KYS5OaTtpZihjKXJldHVybiBHYShhLCJyZXR1cm4iaW4gYz9jWyJyZXR1cm4iXTpmdW5jdGlvbihkKXtyZXR1cm57dmFsdWU6ZCxkb25lOiEwfX0sYixhLkphLnJldHVybik7YS5KYS5yZXR1cm4oYik7cmV0dXJuIEhhKGEpfTtGYS5wcm90b3R5cGUueHA9ZnVuY3Rpb24oYSl7eWEodGhpcy5KYSk7aWYodGhpcy5KYS5OaSlyZXR1cm4gR2EodGhpcyx0aGlzLkphLk5pWyJ0aHJvdyJdLGEsdGhpcy5KYS5Qbyk7dGhpcy5KYS54cChhKTtyZXR1cm4gSGEodGhpcyl9Owp2YXIgR2E9ZnVuY3Rpb24oYSxiLGMsZCl7dHJ5e3ZhciBlPWIuY2FsbChhLkphLk5pLGMpO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSXRlcmF0b3IgcmVzdWx0ICIrZSsiIGlzIG5vdCBhbiBvYmplY3QiKTtpZighZS5kb25lKXJldHVybiBhLkphLkRvPSExLGU7dmFyIGY9ZS52YWx1ZX1jYXRjaChnKXtyZXR1cm4gYS5KYS5OaT1udWxsLGEuSmEueHAoZyksSGEoYSl9YS5KYS5OaT1udWxsO2QuY2FsbChhLkphLGYpO3JldHVybiBIYShhKX0sSGE9ZnVuY3Rpb24oYSl7Zm9yKDthLkphLktlOyl0cnl7dmFyIGI9YS5XUShhLkphKTtpZihiKXJldHVybiBhLkphLkRvPSExLHt2YWx1ZTpiLnZhbHVlLGRvbmU6ITF9fWNhdGNoKGMpe2EuSmEuT2k9dm9pZCAwLGEuSmEueHAoYyl9YS5KYS5Ebz0hMTtpZihhLkphLnhlKXtiPWEuSmEueGU7YS5KYS54ZT1udWxsO2lmKGIuZUcpdGhyb3cgYi54RjtyZXR1cm57dmFsdWU6Yi5yZXR1cm4sZG9uZTohMH19cmV0dXJue3ZhbHVlOnZvaWQgMCwKZG9uZTohMH19LEthPWZ1bmN0aW9uKGEpe3RoaXMubmV4dD1mdW5jdGlvbihiKXtyZXR1cm4gYS5QbyhiKX07dGhpcy50aHJvdz1mdW5jdGlvbihiKXtyZXR1cm4gYS54cChiKX07dGhpcy5yZXR1cm49ZnVuY3Rpb24oYil7cmV0dXJuIElhKGEsYil9O3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX0sTGE9ZnVuY3Rpb24oYSxiKXtiPW5ldyBLYShuZXcgRmEoYikpO3ZhJiZhLnByb3RvdHlwZSYmdmEoYixhLnByb3RvdHlwZSk7cmV0dXJuIGJ9O2ZhKCJSZWZsZWN0IixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOnt9fSk7ZmEoIlJlZmxlY3QuY29uc3RydWN0IixmdW5jdGlvbigpe3JldHVybiBuYX0pO2ZhKCJSZWZsZWN0LnNldFByb3RvdHlwZU9mIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOnZhP2Z1bmN0aW9uKGIsYyl7dHJ5e3JldHVybiB2YShiLGMpLCEwfWNhdGNoKGQpe3JldHVybiExfX06bnVsbH0pOwpmYSgiT2JqZWN0LnNldFByb3RvdHlwZU9mIixmdW5jdGlvbihhKXtyZXR1cm4gYXx8dmF9KTt2YXIgTWE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9LE5hPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ246ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXt2YXIgZD1hcmd1bWVudHNbY107aWYoZClmb3IodmFyIGUgaW4gZClNYShkLGUpJiYoYVtlXT1kW2VdKX1yZXR1cm4gYX07ZmEoIk9iamVjdC5hc3NpZ24iLGZ1bmN0aW9uKGEpe3JldHVybiBhfHxOYX0pOwpmYSgiUHJvbWlzZSIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3RoaXMuUGg9bnVsbH1mdW5jdGlvbiBjKGcpe3JldHVybiBnIGluc3RhbmNlb2YgZT9nOm5ldyBlKGZ1bmN0aW9uKGwpe2woZyl9KX1pZihhKXJldHVybiBhO2IucHJvdG90eXBlLk1FPWZ1bmN0aW9uKGcpe2lmKG51bGw9PXRoaXMuUGgpe3RoaXMuUGg9W107dmFyIGw9dGhpczt0aGlzLk5FKGZ1bmN0aW9uKCl7bC56UCgpfSl9dGhpcy5QaC5wdXNoKGcpfTt2YXIgZD1rLnNldFRpbWVvdXQ7Yi5wcm90b3R5cGUuTkU9ZnVuY3Rpb24oZyl7ZChnLDApfTtiLnByb3RvdHlwZS56UD1mdW5jdGlvbigpe2Zvcig7dGhpcy5QaCYmdGhpcy5QaC5sZW5ndGg7KXt2YXIgZz10aGlzLlBoO3RoaXMuUGg9W107Zm9yKHZhciBsPTA7bDxnLmxlbmd0aDsrK2wpe3ZhciBtPWdbbF07Z1tsXT1udWxsO3RyeXttKCl9Y2F0Y2gocCl7dGhpcy5MTyhwKX19fXRoaXMuUGg9bnVsbH07Yi5wcm90b3R5cGUuTE89ZnVuY3Rpb24oZyl7dGhpcy5ORShmdW5jdGlvbigpe3Rocm93IGc7Cn0pfTt2YXIgZT1mdW5jdGlvbihnKXt0aGlzLnVwPTA7dGhpcy5vej12b2lkIDA7dGhpcy5mbT1bXTt2YXIgbD10aGlzLk14KCk7dHJ5e2cobC5yZXNvbHZlLGwucmVqZWN0KX1jYXRjaChtKXtsLnJlamVjdChtKX19O2UucHJvdG90eXBlLk14PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhwKXtyZXR1cm4gZnVuY3Rpb24ocSl7bXx8KG09ITAscC5jYWxsKGwscSkpfX12YXIgbD10aGlzLG09ITE7cmV0dXJue3Jlc29sdmU6Zyh0aGlzLmJSKSxyZWplY3Q6Zyh0aGlzLmh6KX19O2UucHJvdG90eXBlLmJSPWZ1bmN0aW9uKGcpe2lmKGc9PT10aGlzKXRoaXMuaHoobmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTtlbHNlIGlmKGcgaW5zdGFuY2VvZiBlKXRoaXMuaVIoZyk7ZWxzZXthOnN3aXRjaCh0eXBlb2YgZyl7Y2FzZSAib2JqZWN0Ijp2YXIgbD1udWxsIT1nO2JyZWFrIGE7Y2FzZSAiZnVuY3Rpb24iOmw9ITA7YnJlYWsgYTtkZWZhdWx0Omw9ITF9bD8KdGhpcy5hUihnKTp0aGlzLkhGKGcpfX07ZS5wcm90b3R5cGUuYVI9ZnVuY3Rpb24oZyl7dmFyIGw9dm9pZCAwO3RyeXtsPWcudGhlbn1jYXRjaChtKXt0aGlzLmh6KG0pO3JldHVybn0iZnVuY3Rpb24iPT10eXBlb2YgbD90aGlzLmpSKGwsZyk6dGhpcy5IRihnKX07ZS5wcm90b3R5cGUuaHo9ZnVuY3Rpb24oZyl7dGhpcy5PSCgyLGcpfTtlLnByb3RvdHlwZS5IRj1mdW5jdGlvbihnKXt0aGlzLk9IKDEsZyl9O2UucHJvdG90eXBlLk9IPWZ1bmN0aW9uKGcsbCl7aWYoMCE9dGhpcy51cCl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK2crIiwgIitsKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy51cCk7dGhpcy51cD1nO3RoaXMub3o9bDt0aGlzLkFQKCl9O2UucHJvdG90eXBlLkFQPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5mbSl7Zm9yKHZhciBnPTA7Zzx0aGlzLmZtLmxlbmd0aDsrK2cpZi5NRSh0aGlzLmZtW2ddKTt0aGlzLmZtPW51bGx9fTt2YXIgZj0KbmV3IGI7ZS5wcm90b3R5cGUuaVI9ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcy5NeCgpO2cuVnIobC5yZXNvbHZlLGwucmVqZWN0KX07ZS5wcm90b3R5cGUualI9ZnVuY3Rpb24oZyxsKXt2YXIgbT10aGlzLk14KCk7dHJ5e2cuY2FsbChsLG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gocCl7bS5yZWplY3QocCl9fTtlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKGcsbCl7ZnVuY3Rpb24gbSh2LHcpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB2P2Z1bmN0aW9uKHgpe3RyeXtwKHYoeCkpfWNhdGNoKHUpe3EodSl9fTp3fXZhciBwLHEscj1uZXcgZShmdW5jdGlvbih2LHcpe3A9djtxPXd9KTt0aGlzLlZyKG0oZyxwKSxtKGwscSkpO3JldHVybiByfTtlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihnKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxnKX07ZS5wcm90b3R5cGUuVnI9ZnVuY3Rpb24oZyxsKXtmdW5jdGlvbiBtKCl7c3dpdGNoKHAudXApe2Nhc2UgMTpnKHAub3opO2JyZWFrO2Nhc2UgMjpsKHAub3opOwpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIHN0YXRlOiAiK3AudXApO319dmFyIHA9dGhpcztudWxsPT10aGlzLmZtP2YuTUUobSk6dGhpcy5mbS5wdXNoKG0pfTtlLnJlc29sdmU9YztlLnJlamVjdD1mdW5jdGlvbihnKXtyZXR1cm4gbmV3IGUoZnVuY3Rpb24obCxtKXttKGcpfSl9O2UucmFjZT1mdW5jdGlvbihnKXtyZXR1cm4gbmV3IGUoZnVuY3Rpb24obCxtKXtmb3IodmFyIHA9bihnKSxxPXAubmV4dCgpOyFxLmRvbmU7cT1wLm5leHQoKSljKHEudmFsdWUpLlZyKGwsbSl9KX07ZS5hbGw9ZnVuY3Rpb24oZyl7dmFyIGw9bihnKSxtPWwubmV4dCgpO3JldHVybiBtLmRvbmU/YyhbXSk6bmV3IGUoZnVuY3Rpb24ocCxxKXtmdW5jdGlvbiByKHgpe3JldHVybiBmdW5jdGlvbih1KXt2W3hdPXU7dy0tOzA9PXcmJnAodil9fXZhciB2PVtdLHc9MDtkbyB2LnB1c2godm9pZCAwKSx3KyssYyhtLnZhbHVlKS5WcihyKHYubGVuZ3RoLTEpLHEpLG09bC5uZXh0KCk7d2hpbGUoIW0uZG9uZSl9KX07CnJldHVybiBlfSk7dmFyIE9hPWZ1bmN0aW9uKGEsYil7YSBpbnN0YW5jZW9mIFN0cmluZyYmKGErPSIiKTt2YXIgYz0wLGQ9e25leHQ6ZnVuY3Rpb24oKXtpZihjPGEubGVuZ3RoKXt2YXIgZT1jKys7cmV0dXJue3ZhbHVlOmIoZSxhW2VdKSxkb25lOiExfX1kLm5leHQ9ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTtyZXR1cm4gZC5uZXh0KCl9fTtkW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gZH07cmV0dXJuIGR9O2ZhKCJBcnJheS5wcm90b3R5cGUua2V5cyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbigpe3JldHVybiBPYSh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBifSl9fSk7CmZhKCJXZWFrTWFwIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMobSl7dmFyIHA9dHlwZW9mIG07cmV0dXJuIm9iamVjdCI9PT1wJiZudWxsIT09bXx8ImZ1bmN0aW9uIj09PXB9ZnVuY3Rpb24gZChtKXtpZighTWEobSxmKSl7dmFyIHA9bmV3IGI7Y2EobSxmLHt2YWx1ZTpwfSl9fWZ1bmN0aW9uIGUobSl7dmFyIHA9T2JqZWN0W21dO3AmJihPYmplY3RbbV09ZnVuY3Rpb24ocSl7aWYocSBpbnN0YW5jZW9mIGIpcmV0dXJuIHE7T2JqZWN0LmlzRXh0ZW5zaWJsZShxKSYmZChxKTtyZXR1cm4gcChxKX0pfWlmKGZ1bmN0aW9uKCl7aWYoIWF8fCFPYmplY3Quc2VhbClyZXR1cm4hMTt0cnl7dmFyIG09T2JqZWN0LnNlYWwoe30pLHA9T2JqZWN0LnNlYWwoe30pLHE9bmV3IGEoW1ttLDJdLFtwLDNdXSk7aWYoMiE9cS5nZXQobSl8fDMhPXEuZ2V0KHApKXJldHVybiExO3EuZGVsZXRlKG0pO3Euc2V0KHAsNCk7cmV0dXJuIXEuaGFzKG0pJiY0PT1xLmdldChwKX1jYXRjaChyKXtyZXR1cm4hMX19KCkpcmV0dXJuIGE7CnZhciBmPSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCk7ZSgiZnJlZXplIik7ZSgicHJldmVudEV4dGVuc2lvbnMiKTtlKCJzZWFsIik7dmFyIGc9MCxsPWZ1bmN0aW9uKG0pe3RoaXMueG89KGcrPU1hdGgucmFuZG9tKCkrMSkudG9TdHJpbmcoKTtpZihtKXttPW4obSk7Zm9yKHZhciBwOyEocD1tLm5leHQoKSkuZG9uZTspcD1wLnZhbHVlLHRoaXMuc2V0KHBbMF0scFsxXSl9fTtsLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24obSxwKXtpZighYyhtKSl0aHJvdyBFcnJvcigiSW52YWxpZCBXZWFrTWFwIGtleSIpO2QobSk7aWYoIU1hKG0sZikpdGhyb3cgRXJyb3IoIldlYWtNYXAga2V5IGZhaWw6ICIrbSk7bVtmXVt0aGlzLnhvXT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24obSl7cmV0dXJuIGMobSkmJk1hKG0sZik/bVtmXVt0aGlzLnhvXTp2b2lkIDB9O2wucHJvdG90eXBlLmhhcz1mdW5jdGlvbihtKXtyZXR1cm4gYyhtKSYmTWEobSxmKSYmTWEobVtmXSwKdGhpcy54byl9O2wucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihtKXtyZXR1cm4gYyhtKSYmTWEobSxmKSYmTWEobVtmXSx0aGlzLnhvKT9kZWxldGUgbVtmXVt0aGlzLnhvXTohMX07cmV0dXJuIGx9KTsKZmEoIk1hcCIsZnVuY3Rpb24oYSl7aWYoZnVuY3Rpb24oKXtpZighYXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGF8fCFhLnByb3RvdHlwZS5lbnRyaWVzfHwiZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LnNlYWwpcmV0dXJuITE7dHJ5e3ZhciBsPU9iamVjdC5zZWFsKHt4OjR9KSxtPW5ldyBhKG4oW1tsLCJzIl1dKSk7aWYoInMiIT1tLmdldChsKXx8MSE9bS5zaXplfHxtLmdldCh7eDo0fSl8fG0uc2V0KHt4OjR9LCJ0IikhPW18fDIhPW0uc2l6ZSlyZXR1cm4hMTt2YXIgcD1tLmVudHJpZXMoKSxxPXAubmV4dCgpO2lmKHEuZG9uZXx8cS52YWx1ZVswXSE9bHx8InMiIT1xLnZhbHVlWzFdKXJldHVybiExO3E9cC5uZXh0KCk7cmV0dXJuIHEuZG9uZXx8NCE9cS52YWx1ZVswXS54fHwidCIhPXEudmFsdWVbMV18fCFwLm5leHQoKS5kb25lPyExOiEwfWNhdGNoKHIpe3JldHVybiExfX0oKSlyZXR1cm4gYTt2YXIgYj1uZXcgV2Vha01hcCxjPWZ1bmN0aW9uKGwpe3RoaXMuaG89e307dGhpcy5QZz0KZigpO3RoaXMuc2l6ZT0wO2lmKGwpe2w9bihsKTtmb3IodmFyIG07IShtPWwubmV4dCgpKS5kb25lOyltPW0udmFsdWUsdGhpcy5zZXQobVswXSxtWzFdKX19O2MucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLG0pe2w9MD09PWw/MDpsO3ZhciBwPWQodGhpcyxsKTtwLmxpc3R8fChwLmxpc3Q9dGhpcy5ob1twLmlkXT1bXSk7cC5iZD9wLmJkLnZhbHVlPW06KHAuYmQ9e25leHQ6dGhpcy5QZyxhaDp0aGlzLlBnLmFoLGhlYWQ6dGhpcy5QZyxrZXk6bCx2YWx1ZTptfSxwLmxpc3QucHVzaChwLmJkKSx0aGlzLlBnLmFoLm5leHQ9cC5iZCx0aGlzLlBnLmFoPXAuYmQsdGhpcy5zaXplKyspO3JldHVybiB0aGlzfTtjLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24obCl7bD1kKHRoaXMsbCk7cmV0dXJuIGwuYmQmJmwubGlzdD8obC5saXN0LnNwbGljZShsLmluZGV4LDEpLGwubGlzdC5sZW5ndGh8fGRlbGV0ZSB0aGlzLmhvW2wuaWRdLGwuYmQuYWgubmV4dD1sLmJkLm5leHQsbC5iZC5uZXh0LmFoPQpsLmJkLmFoLGwuYmQuaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Yy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhvPXt9O3RoaXMuUGc9dGhpcy5QZy5haD1mKCk7dGhpcy5zaXplPTB9O2MucHJvdG90eXBlLmhhcz1mdW5jdGlvbihsKXtyZXR1cm4hIWQodGhpcyxsKS5iZH07Yy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGwpe3JldHVybihsPWQodGhpcyxsKS5iZCkmJmwudmFsdWV9O2MucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGZ1bmN0aW9uKGwpe3JldHVybltsLmtleSxsLnZhbHVlXX0pfTtjLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcyxmdW5jdGlvbihsKXtyZXR1cm4gbC5rZXl9KX07Yy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcyxmdW5jdGlvbihsKXtyZXR1cm4gbC52YWx1ZX0pfTtjLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGwsbSl7Zm9yKHZhciBwPXRoaXMuZW50cmllcygpLApxOyEocT1wLm5leHQoKSkuZG9uZTspcT1xLnZhbHVlLGwuY2FsbChtLHFbMV0scVswXSx0aGlzKX07Yy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1jLnByb3RvdHlwZS5lbnRyaWVzO3ZhciBkPWZ1bmN0aW9uKGwsbSl7dmFyIHA9bSYmdHlwZW9mIG07Im9iamVjdCI9PXB8fCJmdW5jdGlvbiI9PXA/Yi5oYXMobSk/cD1iLmdldChtKToocD0iIisgKytnLGIuc2V0KG0scCkpOnA9InBfIittO3ZhciBxPWwuaG9bcF07aWYocSYmTWEobC5obyxwKSlmb3IobD0wO2w8cS5sZW5ndGg7bCsrKXt2YXIgcj1xW2xdO2lmKG0hPT1tJiZyLmtleSE9PXIua2V5fHxtPT09ci5rZXkpcmV0dXJue2lkOnAsbGlzdDpxLGluZGV4OmwsYmQ6cn19cmV0dXJue2lkOnAsbGlzdDpxLGluZGV4Oi0xLGJkOnZvaWQgMH19LGU9ZnVuY3Rpb24obCxtKXt2YXIgcD1sLlBnO3JldHVybiBoYShmdW5jdGlvbigpe2lmKHApe2Zvcig7cC5oZWFkIT1sLlBnOylwPXAuYWg7Zm9yKDtwLm5leHQhPXAuaGVhZDspcmV0dXJuIHA9CnAubmV4dCx7ZG9uZTohMSx2YWx1ZTptKHApfTtwPW51bGx9cmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfX0pfSxmPWZ1bmN0aW9uKCl7dmFyIGw9e307cmV0dXJuIGwuYWg9bC5uZXh0PWwuaGVhZD1sfSxnPTA7cmV0dXJuIGN9KTt2YXIgUGE9ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlICd0aGlzJyB2YWx1ZSBmb3IgU3RyaW5nLnByb3RvdHlwZS4iK2MrIiBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCIpO2lmKGIgaW5zdGFuY2VvZiBSZWdFeHApdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgdG8gU3RyaW5nLnByb3RvdHlwZS4iK2MrIiBtdXN0IG5vdCBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiIpO3JldHVybiBhKyIifTsKZmEoIlN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3ZhciBkPVBhKHRoaXMsYiwic3RhcnRzV2l0aCIpO2IrPSIiO3ZhciBlPWQubGVuZ3RoLGY9Yi5sZW5ndGg7Yz1NYXRoLm1heCgwLE1hdGgubWluKGN8MCxkLmxlbmd0aCkpO2Zvcih2YXIgZz0wO2c8ZiYmYzxlOylpZihkW2MrK10hPWJbZysrXSlyZXR1cm4hMTtyZXR1cm4gZz49Zn19KTtmYSgiQXJyYXkucHJvdG90eXBlLmZpbGwiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPXRoaXMubGVuZ3RofHwwOzA+YyYmKGM9TWF0aC5tYXgoMCxlK2MpKTtpZihudWxsPT1kfHxkPmUpZD1lO2Q9TnVtYmVyKGQpOzA+ZCYmKGQ9TWF0aC5tYXgoMCxlK2QpKTtmb3IoYz1OdW1iZXIoY3x8MCk7YzxkO2MrKyl0aGlzW2NdPWI7cmV0dXJuIHRoaXN9fSk7CmZhKCJTZXQiLGZ1bmN0aW9uKGEpe2lmKGZ1bmN0aW9uKCl7aWYoIWF8fCJmdW5jdGlvbiIhPXR5cGVvZiBhfHwhYS5wcm90b3R5cGUuZW50cmllc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgYz1PYmplY3Quc2VhbCh7eDo0fSksZD1uZXcgYShuKFtjXSkpO2lmKCFkLmhhcyhjKXx8MSE9ZC5zaXplfHxkLmFkZChjKSE9ZHx8MSE9ZC5zaXplfHxkLmFkZCh7eDo0fSkhPWR8fDIhPWQuc2l6ZSlyZXR1cm4hMTt2YXIgZT1kLmVudHJpZXMoKSxmPWUubmV4dCgpO2lmKGYuZG9uZXx8Zi52YWx1ZVswXSE9Y3x8Zi52YWx1ZVsxXSE9YylyZXR1cm4hMTtmPWUubmV4dCgpO3JldHVybiBmLmRvbmV8fGYudmFsdWVbMF09PWN8fDQhPWYudmFsdWVbMF0ueHx8Zi52YWx1ZVsxXSE9Zi52YWx1ZVswXT8hMTplLm5leHQoKS5kb25lfWNhdGNoKGcpe3JldHVybiExfX0oKSlyZXR1cm4gYTt2YXIgYj1mdW5jdGlvbihjKXt0aGlzLlhmPW5ldyBNYXA7aWYoYyl7Yz0KbihjKTtmb3IodmFyIGQ7IShkPWMubmV4dCgpKS5kb25lOyl0aGlzLmFkZChkLnZhbHVlKX10aGlzLnNpemU9dGhpcy5YZi5zaXplfTtiLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYyl7Yz0wPT09Yz8wOmM7dGhpcy5YZi5zZXQoYyxjKTt0aGlzLnNpemU9dGhpcy5YZi5zaXplO3JldHVybiB0aGlzfTtiLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oYyl7Yz10aGlzLlhmLmRlbGV0ZShjKTt0aGlzLnNpemU9dGhpcy5YZi5zaXplO3JldHVybiBjfTtiLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuWGYuY2xlYXIoKTt0aGlzLnNpemU9MH07Yi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGMpe3JldHVybiB0aGlzLlhmLmhhcyhjKX07Yi5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLlhmLmVudHJpZXMoKX07Yi5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGYudmFsdWVzKCl9O2IucHJvdG90eXBlLmtleXM9Yi5wcm90b3R5cGUudmFsdWVzOwpiLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWIucHJvdG90eXBlLnZhbHVlcztiLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGMsZCl7dmFyIGU9dGhpczt0aGlzLlhmLmZvckVhY2goZnVuY3Rpb24oZil7cmV0dXJuIGMuY2FsbChkLGYsZixlKX0pfTtyZXR1cm4gYn0pO2ZhKCJBcnJheS5mcm9tIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKGIsYyxkKXtjPW51bGwhPWM/YzpmdW5jdGlvbihsKXtyZXR1cm4gbH07dmFyIGU9W10sZj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07aWYoImZ1bmN0aW9uIj09dHlwZW9mIGYpe2I9Zi5jYWxsKGIpO2Zvcih2YXIgZz0wOyEoZj1iLm5leHQoKSkuZG9uZTspZS5wdXNoKGMuY2FsbChkLGYudmFsdWUsZysrKSl9ZWxzZSBmb3IoZj1iLmxlbmd0aCxnPTA7ZzxmO2crKyllLnB1c2goYy5jYWxsKGQsYltnXSxnKSk7cmV0dXJuIGV9fSk7CmZhKCJBcnJheS5wcm90b3R5cGUudmFsdWVzIixmdW5jdGlvbihhKXtyZXR1cm4gYT9hOmZ1bmN0aW9uKCl7cmV0dXJuIE9hKHRoaXMsZnVuY3Rpb24oYixjKXtyZXR1cm4gY30pfX0pO2ZhKCJPYmplY3QuaXMiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYj09PWM/MCE9PWJ8fDEvYj09PTEvYzpiIT09YiYmYyE9PWN9fSk7ZmEoIlN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYixjKXt2YXIgZD1QYSh0aGlzLGIsImVuZHNXaXRoIik7Yis9IiI7dm9pZCAwPT09YyYmKGM9ZC5sZW5ndGgpO2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjfDAsZC5sZW5ndGgpKTtmb3IodmFyIGU9Yi5sZW5ndGg7MDxlJiYwPGM7KWlmKGRbLS1jXSE9YlstLWVdKXJldHVybiExO3JldHVybiAwPj1lfX0pOwp2YXIgUWE9ZnVuY3Rpb24oYSxiLGMpe2EgaW5zdGFuY2VvZiBTdHJpbmcmJihhPVN0cmluZyhhKSk7Zm9yKHZhciBkPWEubGVuZ3RoLGU9MDtlPGQ7ZSsrKXt2YXIgZj1hW2VdO2lmKGIuY2FsbChjLGYsZSxhKSlyZXR1cm57VkY6ZSx2OmZ9fXJldHVybntWRjotMSx2OnZvaWQgMH19O2ZhKCJBcnJheS5wcm90b3R5cGUuZmluZCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3JldHVybiBRYSh0aGlzLGIsYykudn19KTtmYSgiQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3JldHVybiBRYSh0aGlzLGIsYykuVkZ9fSk7CmZhKCJTdHJpbmcucHJvdG90eXBlLnJlcGVhdCIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiKXt2YXIgYz1QYSh0aGlzLG51bGwsInJlcGVhdCIpO2lmKDA+Ynx8MTM0MjE3NzI3OTxiKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIGNvdW50IHZhbHVlIik7Ynw9MDtmb3IodmFyIGQ9IiI7YjspaWYoYiYxJiYoZCs9YyksYj4+Pj0xKWMrPWM7cmV0dXJuIGR9fSk7ZmEoIk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oKXtyZXR1cm5bXX19KTsKZmEoIlJlZmxlY3Qub3duS2V5cyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiKXt2YXIgYz1bXSxkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpO2I9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhiKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKykoImpzY29tcF9zeW1ib2xfIj09ZFtlXS5zdWJzdHJpbmcoMCwxNCk/YjpjKS5wdXNoKGRbZV0pO3JldHVybiBjLmNvbmNhdChiKX19KTtmYSgiT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYil7Zm9yKHZhciBjPXt9LGQ9UmVmbGVjdC5vd25LZXlzKGIpLGU9MDtlPGQubGVuZ3RoO2UrKyljW2RbZV1dPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYixkW2VdKTtyZXR1cm4gY319KTsKZmEoIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXM7ZCBpbnN0YW5jZW9mIFN0cmluZyYmKGQ9U3RyaW5nKGQpKTt2YXIgZT1kLmxlbmd0aDtjPWN8fDA7Zm9yKDA+YyYmKGM9TWF0aC5tYXgoYytlLDApKTtjPGU7YysrKXt2YXIgZj1kW2NdO2lmKGY9PT1ifHxPYmplY3QuaXMoZixiKSlyZXR1cm4hMH1yZXR1cm4hMX19KTtmYSgiU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiLGMpe3JldHVybi0xIT09UGEodGhpcyxiLCJpbmNsdWRlcyIpLmluZGV4T2YoYixjfHwwKX19KTtmYSgiT2JqZWN0LnZhbHVlcyIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihiKXt2YXIgYz1bXSxkO2ZvcihkIGluIGIpTWEoYixkKSYmYy5wdXNoKGJbZF0pO3JldHVybiBjfX0pOwpmYSgiT2JqZWN0LmVudHJpZXMiLGZ1bmN0aW9uKGEpe3JldHVybiBhP2E6ZnVuY3Rpb24oYil7dmFyIGM9W10sZDtmb3IoZCBpbiBiKU1hKGIsZCkmJmMucHVzaChbZCxiW2RdXSk7cmV0dXJuIGN9fSk7LyoKCiBUaGUgTUlUIExpY2Vuc2UKCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBHb29nbGUsIEluYy4gaHR0cDovL2FuZ3VsYXIuaW8KCiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiBUSEUgU09GVFdBUkUuCiovCnZhciBfX3NlbGYsX193aW5kb3csX19nbG9iYWxUaGlzO3ZhciBSYT1mdW5jdGlvbihhLGIpe3ZhciBjPXZvaWQgMDtyZXR1cm4gbmV3IChjfHwoYz1Qcm9taXNlKSkoZnVuY3Rpb24oZCxlKXtmdW5jdGlvbiBmKG0pe3RyeXtsKGIubmV4dChtKSl9Y2F0Y2gocCl7ZShwKX19ZnVuY3Rpb24gZyhtKXt0cnl7bChiWyJ0aHJvdyJdKG0pKX1jYXRjaChwKXtlKHApfX1mdW5jdGlvbiBsKG0pe20uZG9uZT9kKG0udmFsdWUpOihuZXcgYyhmdW5jdGlvbihwKXtwKG0udmFsdWUpfSkpLnRoZW4oZixnKX1sKChiPWIuYXBwbHkoYSx2b2lkIDApKS5uZXh0KCkpfSl9LFNhPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgU2E/KHRoaXMudj1hLHRoaXMpOm5ldyBTYShhKX0sVmE9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQocil7bVtyXSYmKHBbcl09ZnVuY3Rpb24odil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHcseCl7MTxxLnB1c2goW3Isdix3LHhdKXx8ZShyLHYpfSl9KX1mdW5jdGlvbiBlKHIsdil7dHJ5e3ZhciB3PW1bcl0odik7CncudmFsdWUgaW5zdGFuY2VvZiBTYT9Qcm9taXNlLnJlc29sdmUody52YWx1ZS52KS50aGVuKGYsZyk6bChxWzBdWzJdLHcpfWNhdGNoKHgpe2wocVswXVszXSx4KX19ZnVuY3Rpb24gZihyKXtlKCJuZXh0IixyKX1mdW5jdGlvbiBnKHIpe2UoInRocm93IixyKX1mdW5jdGlvbiBsKHIsdil7KHIodikscS5zaGlmdCgpLHEubGVuZ3RoKSYmZShxWzBdWzBdLHFbMF1bMV0pfWlmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgbT1jLmFwcGx5KGEsYnx8W10pLHAscT1bXTtyZXR1cm4gcD17fSxkKCJuZXh0IiksZCgidGhyb3ciKSxkKCJyZXR1cm4iKSxwW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxwfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoQil7bCYmbC5tYXJrJiZsLm1hcmsoQil9ZnVuY3Rpb24gYyhCLEcpe2wmJmwubWVhc3VyZSYmbC5tZWFzdXJlKEIsRyl9ZnVuY3Rpb24gZChCKXtyZXR1cm4gbStCfWZ1bmN0aW9uIGUoQil7aWYoMD09PUVhJiYwPT09SC5sZW5ndGgpaWYoTnx8YVt1XSYmKE49YVt1XS5yZXNvbHZlKDApKSxOKXt2YXIgRz1OW0RdO0d8fChHPU4udGhlbik7Ry5jYWxsKE4sZil9ZWxzZSBhW3hdKGYsMCk7QiYmSC5wdXNoKEIpfWZ1bmN0aW9uIGYoKXtpZighRSl7Zm9yKEU9ITA7SC5sZW5ndGg7KXt2YXIgQj1IO0g9W107Zm9yKHZhciBHPTA7RzxCLmxlbmd0aDtHKyspe3ZhciBLPUJbR107dHJ5e0subGEucnQoSyxudWxsLG51bGwpfWNhdGNoKG1hKXtRLlF5KG1hKX19fVEuekcoKTtFPSExfX1mdW5jdGlvbiBnKCl7fXZhciBsPWEucGVyZm9ybWFuY2U7YigiWm9uZSIpO3ZhciBtPWEuX19ab25lX3N5bWJvbF9wcmVmaXh8fCJfX3pvbmVfc3ltYm9sX18iLHA9CiEwPT09YVtkKCJmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjayIpXTtpZihhLlpvbmUpe2lmKHB8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5ab25lLnNjKXRocm93IEVycm9yKCJab25lIGFscmVhZHkgbG9hZGVkLiIpO3JldHVybiBhLlpvbmV9dmFyIHE9ZnVuY3Rpb24oQixHKXt0aGlzLiQ9Qjt0aGlzLiRlPUc/Ry5uYW1lfHwidW5uYW1lZCI6Ijxyb290PiI7dGhpcy5oRD1HJiZHLnByb3BlcnRpZXN8fHt9O3RoaXMud2U9bmV3IHYodGhpcyx0aGlzLiQmJnRoaXMuJC53ZSxHKX07cS5LTz1mdW5jdGlvbigpe2lmKGEuUHJvbWlzZSE9PUouWm9uZUF3YXJlUHJvbWlzZSl0aHJvdyBFcnJvcigiWm9uZS5qcyBoYXMgZGV0ZWN0ZWQgdGhhdCBab25lQXdhcmVQcm9taXNlIGAod2luZG93fGdsb2JhbCkuUHJvbWlzZWAgaGFzIGJlZW4gb3ZlcndyaXR0ZW4uXG5Nb3N0IGxpa2VseSBjYXVzZSBpcyB0aGF0IGEgUHJvbWlzZSBwb2x5ZmlsbCBoYXMgYmVlbiBsb2FkZWQgYWZ0ZXIgWm9uZS5qcyAoUG9seWZpbGxpbmcgUHJvbWlzZSBhcGkgaXMgbm90IG5lY2Vzc2FyeSB3aGVuIHpvbmUuanMgaXMgbG9hZGVkLiBJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pIik7Cn07cS5sYz1mdW5jdGlvbihCLEcpe2lmKEouaGFzT3duUHJvcGVydHkoQikpe2lmKHApdGhyb3cgRXJyb3IoIkFscmVhZHkgbG9hZGVkIHBhdGNoOiAiK0IpO31lbHNlIGlmKCFhWyJfX1pvbmVfZGlzYWJsZV8iK0JdKXt2YXIgSz0iWm9uZToiK0I7YihLKTtKW0JdPUcoYSxxLFEpO2MoSyxLKX19O3EucHJvdG90eXBlLmdldD1mdW5jdGlvbihCKXt2YXIgRz10aGlzLlNQKEIpO2lmKEcpcmV0dXJuIEcuaERbQl19O3EucHJvdG90eXBlLlNQPWZ1bmN0aW9uKEIpe2Zvcih2YXIgRz10aGlzO0c7KXtpZihHLmhELmhhc093blByb3BlcnR5KEIpKXJldHVybiBHO0c9Ry4kfXJldHVybiBudWxsfTtxLnByb3RvdHlwZS5DZT1mdW5jdGlvbihCKXtpZighQil0aHJvdyBFcnJvcigiWm9uZVNwZWMgcmVxdWlyZWQhIik7cmV0dXJuIHRoaXMud2UuQ2UodGhpcyxCKX07cS5wcm90b3R5cGUuSFI9ZnVuY3Rpb24oQixHKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIEIpdGhyb3cgRXJyb3IoIkV4cGVjdGluZyBmdW5jdGlvbiBnb3Q6ICIrCkIpO3ZhciBLPXRoaXMud2UudHkodGhpcyxCLEcpLG1hPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG1hLnJrKEssdGhpcyxhcmd1bWVudHMsRyl9fTtxLnByb3RvdHlwZS5nYT1mdW5jdGlvbihCLEcsSyxtYSl7VT17cGFyZW50OlUsbGE6dGhpc307dHJ5e3JldHVybiB0aGlzLndlLkJiKHRoaXMsQixHLEssbWEpfWZpbmFsbHl7VT1VLnBhcmVudH19O3EucHJvdG90eXBlLnJrPWZ1bmN0aW9uKEIsRyxLLG1hKXtVPXtwYXJlbnQ6VSxsYTp0aGlzfTt0cnl7dHJ5e3JldHVybiB0aGlzLndlLkJiKHRoaXMsQix2b2lkIDA9PT1HP251bGw6RyxLLG1hKX1jYXRjaChrYSl7aWYodGhpcy53ZS5oYW5kbGVFcnJvcih0aGlzLGthKSl0aHJvdyBrYTt9fWZpbmFsbHl7VT1VLnBhcmVudH19O3EucHJvdG90eXBlLnJ0PWZ1bmN0aW9uKEIsRyxLKXtpZihCLmxhIT10aGlzKXRocm93IEVycm9yKCJBIHRhc2sgY2FuIG9ubHkgYmUgcnVuIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICIrCihCLmxhfHxNKS5uYW1lKyI7IEV4ZWN1dGlvbjogIit0aGlzLm5hbWUrIikiKTtpZigibm90U2NoZWR1bGVkIiE9PUIuc3RhdGV8fCJldmVudFRhc2siIT09Qi50eXBlJiYibWFjcm9UYXNrIiE9PUIudHlwZSl7dmFyIG1hPSJydW5uaW5nIiE9Qi5zdGF0ZTttYSYmQi5XZCgicnVubmluZyIsInNjaGVkdWxlZCIpO0IucWsrKzt2YXIga2E9cmE7cmE9QjtVPXtwYXJlbnQ6VSxsYTp0aGlzfTt0cnl7Im1hY3JvVGFzayI9PUIudHlwZSYmQi5kYXRhJiYhQi5kYXRhLkNvJiYoQi5Sbj12b2lkIDApO3RyeXtyZXR1cm4gdGhpcy53ZS5maSh0aGlzLEIsRyxLKX1jYXRjaCgkYSl7aWYodGhpcy53ZS5oYW5kbGVFcnJvcih0aGlzLCRhKSl0aHJvdyAkYTt9fWZpbmFsbHl7Im5vdFNjaGVkdWxlZCIhPT1CLnN0YXRlJiYidW5rbm93biIhPT1CLnN0YXRlJiYoImV2ZW50VGFzayI9PUIudHlwZXx8Qi5kYXRhJiZCLmRhdGEuQ28/bWEmJkIuV2QoInNjaGVkdWxlZCIsInJ1bm5pbmciKTooQi5xaz0wLAp0aGlzLkluKEIsLTEpLG1hJiZCLldkKCJub3RTY2hlZHVsZWQiLCJydW5uaW5nIiwibm90U2NoZWR1bGVkIikpKSxVPVUucGFyZW50LHJhPWthfX19O3EucHJvdG90eXBlLmZoPWZ1bmN0aW9uKEIpe2lmKEIubGEmJkIubGEhPT10aGlzKWZvcih2YXIgRz10aGlzO0c7KXtpZihHPT09Qi5sYSl0aHJvdyBFcnJvcigiY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gIit0aGlzLm5hbWUrIiB3aGljaCBpcyBkZXNjZW5kYW50cyBvZiB0aGUgb3JpZ2luYWwgem9uZSAiK0IubGEubmFtZSk7Rz1HLnBhcmVudH1CLldkKCJzY2hlZHVsaW5nIiwibm90U2NoZWR1bGVkIik7Rz1bXTtCLkVsPUc7Qi5iYj10aGlzO3RyeXtCPXRoaXMud2UuZmgodGhpcyxCKX1jYXRjaChLKXt0aHJvdyBCLldkKCJ1bmtub3duIiwic2NoZWR1bGluZyIsIm5vdFNjaGVkdWxlZCIpLHRoaXMud2UuaGFuZGxlRXJyb3IodGhpcyxLKSxLO31CLkVsPT09RyYmdGhpcy5JbihCLDEpOyJzY2hlZHVsaW5nIj09Qi5zdGF0ZSYmCkIuV2QoInNjaGVkdWxlZCIsInNjaGVkdWxpbmciKTtyZXR1cm4gQn07cS5wcm90b3R5cGUucG09ZnVuY3Rpb24oQixHLEssbWEpe3JldHVybiB0aGlzLmZoKG5ldyB3KCJtaWNyb1Rhc2siLEIsRyxLLG1hLHZvaWQgMCkpfTtxLnByb3RvdHlwZS51dD1mdW5jdGlvbihCLEcsSyxtYSxrYSl7cmV0dXJuIHRoaXMuZmgobmV3IHcoIm1hY3JvVGFzayIsQixHLEssbWEsa2EpKX07cS5wcm90b3R5cGUudHQ9ZnVuY3Rpb24oQixHLEssbWEsa2Epe3JldHVybiB0aGlzLmZoKG5ldyB3KCJldmVudFRhc2siLEIsRyxLLG1hLGthKSl9O3EucHJvdG90eXBlLkdnPWZ1bmN0aW9uKEIpe2lmKEIubGEhPXRoaXMpdGhyb3cgRXJyb3IoIkEgdGFzayBjYW4gb25seSBiZSBjYW5jZWxsZWQgaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogIisoQi5sYXx8TSkubmFtZSsiOyBFeGVjdXRpb246ICIrdGhpcy5uYW1lKyIpIik7Qi5XZCgiY2FuY2VsaW5nIiwic2NoZWR1bGVkIiwicnVubmluZyIpOwp0cnl7dGhpcy53ZS5HZyh0aGlzLEIpfWNhdGNoKEcpe3Rocm93IEIuV2QoInVua25vd24iLCJjYW5jZWxpbmciKSx0aGlzLndlLmhhbmRsZUVycm9yKHRoaXMsRyksRzt9dGhpcy5JbihCLC0xKTtCLldkKCJub3RTY2hlZHVsZWQiLCJjYW5jZWxpbmciKTtCLnFrPTA7cmV0dXJuIEJ9O3EucHJvdG90eXBlLkluPWZ1bmN0aW9uKEIsRyl7dmFyIEs9Qi5FbDstMT09RyYmKEIuRWw9bnVsbCk7Zm9yKHZhciBtYT0wO21hPEsubGVuZ3RoO21hKyspS1ttYV0uSW4oQi50eXBlLEcpfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHEucHJvdG90eXBlLHtwYXJlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR9fSxuYW1lOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZX19fSk7ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhxLHtyb290Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCwKZ2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBCPXEuY3VycmVudDtCLnBhcmVudDspQj1CLnBhcmVudDtyZXR1cm4gQn19LGN1cnJlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBVLmxhfX0sUWw6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiByYX19fSk7cS5zYz1kO3ZhciByPXtuYW1lOiIiLE95OmZ1bmN0aW9uKEIsRyxLLG1hKXtyZXR1cm4gQi5qeShLLG1hKX0seGk6ZnVuY3Rpb24oQixHLEssbWEpe3JldHVybiBCLmZoKEssbWEpfSx3aTpmdW5jdGlvbihCLEcsSyxtYSxrYSwkYSl7cmV0dXJuIEIuZmkoSyxtYSxrYSwkYSl9LFlqOmZ1bmN0aW9uKEIsRyxLLG1hKXtyZXR1cm4gQi5HZyhLLG1hKX19LHY9ZnVuY3Rpb24oQixHLEspe3RoaXMuRk49e21pY3JvVGFzazowLG1hY3JvVGFzazowLGV2ZW50VGFzazowfTt0aGlzLmxhPUI7dGhpcy5nUz1HO3RoaXMuUnU9SyYmKEsmJksuV3M/Cks6Ry5SdSk7dGhpcy5BQj1LJiYoSy5Xcz9HOkcuQUIpO3RoaXMuUks9SyYmKEsuV3M/dGhpcy5sYTpHLlJLKTt0aGlzLm92PUsmJihLLlB5P0s6Ry5vdik7dGhpcy5qQz1LJiYoSy5QeT9HOkcuakMpO3RoaXMuaUM9SyYmKEsuUHk/dGhpcy5sYTpHLmlDKTt0aGlzLnJ2PUsmJihLLmVtP0s6Ry5ydik7dGhpcy5vQz1LJiYoSy5lbT9HOkcub0MpO3RoaXMubUM9SyYmKEsuZW0/dGhpcy5sYTpHLm1DKTt0aGlzLlp1PUsmJihLLlpqP0s6Ry5adSk7dGhpcy5PQj1LJiYoSy5aaj9HOkcuT0IpO3RoaXMuTkI9SyYmKEsuWmo/dGhpcy5sYTpHLk5CKTt0aGlzLnRyPUsmJihLLnhpP0s6Ry50cik7dGhpcy53dz1LJiYoSy54aT9HOkcud3cpO3RoaXMudnc9SyYmKEsueGk/dGhpcy5sYTpHLnZ3KTt0aGlzLkpxPUsmJihLLndpP0s6Ry5KcSk7dGhpcy5xdj1LJiYoSy53aT9HOkcucXYpO3RoaXMucHY9SyYmKEsud2k/dGhpcy5sYTpHLnB2KTt0aGlzLmdxPUsmJihLLllqP0s6Ry5ncSk7dGhpcy5vdT0KSyYmKEsuWWo/RzpHLm91KTt0aGlzLm51PUsmJihLLllqP3RoaXMubGE6Ry5udSk7dGhpcy5XQj10aGlzLllCPXRoaXMuWEI9dGhpcy5abT1udWxsO3ZhciBtYT1LJiZLLk95LGthPUcmJkcuWm07aWYobWF8fGthKXRoaXMuWm09bWE/SzpyLHRoaXMuWEI9Ryx0aGlzLllCPXRoaXMsdGhpcy5XQj1CLEsueGl8fCh0aGlzLnRyPXIsdGhpcy53dz1HLHRoaXMudnc9dGhpcy5sYSksSy53aXx8KHRoaXMuSnE9cix0aGlzLnF2PUcsdGhpcy5wdj10aGlzLmxhKSxLLllqfHwodGhpcy5ncT1yLHRoaXMub3U9Ryx0aGlzLm51PXRoaXMubGEpfTt2LnByb3RvdHlwZS5DZT1mdW5jdGlvbihCLEcpe3JldHVybiB0aGlzLlJ1P3RoaXMuUnUuV3ModGhpcy5BQix0aGlzLmxhLEIsRyk6bmV3IHEoQixHKX07di5wcm90b3R5cGUudHk9ZnVuY3Rpb24oQixHLEspe3JldHVybiB0aGlzLm92P3RoaXMub3YuUHkodGhpcy5qQyx0aGlzLmlDLEIsRyxLKTpHfTt2LnByb3RvdHlwZS5CYj1mdW5jdGlvbihCLEcsCkssbWEsa2Epe3JldHVybiB0aGlzLnJ2P3RoaXMucnYuZW0odGhpcy5vQyx0aGlzLm1DLEIsRyxLLG1hLGthKTpHLmFwcGx5KEssbWEpfTt2LnByb3RvdHlwZS5oYW5kbGVFcnJvcj1mdW5jdGlvbihCLEcpe3JldHVybiB0aGlzLlp1P3RoaXMuWnUuWmoodGhpcy5PQix0aGlzLk5CLEIsRyk6ITB9O3YucHJvdG90eXBlLmZoPWZ1bmN0aW9uKEIsRyl7dmFyIEs9RztpZih0aGlzLnRyKXRoaXMuWm0mJksuRWwucHVzaCh0aGlzLllCKSwoSz10aGlzLnRyLnhpKHRoaXMud3csdGhpcy52dyxCLEcpKXx8KEs9Ryk7ZWxzZSBpZihHLkNIKUcuQ0goRyk7ZWxzZSBpZigibWljcm9UYXNrIj09Ry50eXBlKWUoRyk7ZWxzZSB0aHJvdyBFcnJvcigiVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uIik7cmV0dXJuIEt9O3YucHJvdG90eXBlLmZpPWZ1bmN0aW9uKEIsRyxLLG1hKXtyZXR1cm4gdGhpcy5KcT90aGlzLkpxLndpKHRoaXMucXYsdGhpcy5wdixCLEcsSyxtYSk6Ry5aZC5hcHBseShLLG1hKX07CnYucHJvdG90eXBlLkdnPWZ1bmN0aW9uKEIsRyl7aWYodGhpcy5ncSlCPXRoaXMuZ3EuWWoodGhpcy5vdSx0aGlzLm51LEIsRyk7ZWxzZXtpZighRy5Sbil0aHJvdyBFcnJvcigiVGFzayBpcyBub3QgY2FuY2VsYWJsZSIpO0I9Ry5SbihHKX1yZXR1cm4gQn07di5wcm90b3R5cGUuank9ZnVuY3Rpb24oQixHKXt0cnl7dGhpcy5abSYmdGhpcy5abS5PeSh0aGlzLlhCLHRoaXMuV0IsQixHKX1jYXRjaChLKXt0aGlzLmhhbmRsZUVycm9yKEIsSyl9fTt2LnByb3RvdHlwZS5Jbj1mdW5jdGlvbihCLEcpe3ZhciBLPXRoaXMuRk4sbWE9S1tCXTtHPUtbQl09bWErRztpZigwPkcpdGhyb3cgRXJyb3IoIk1vcmUgdGFza3MgZXhlY3V0ZWQgdGhlbiB3ZXJlIHNjaGVkdWxlZC4iKTswIT1tYSYmMCE9R3x8dGhpcy5qeSh0aGlzLmxhLHt1UTowPEsubWljcm9UYXNrLHFROjA8Sy5tYWNyb1Rhc2ssdFM6MDxLLmV2ZW50VGFzayxRYTpCfSl9O3ZhciB3PWZ1bmN0aW9uKEIsRyxLLG1hLGthLCRhKXt0aGlzLmJiPQpudWxsO3RoaXMucWs9MDt0aGlzLkVsPW51bGw7dGhpcy50YT0ibm90U2NoZWR1bGVkIjt0aGlzLnR5cGU9Qjt0aGlzLnNvdXJjZT1HO3RoaXMuZGF0YT1tYTt0aGlzLkNIPWthO3RoaXMuUm49JGE7aWYoIUspdGhyb3cgRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBkZWZpbmVkIik7dGhpcy5aZD1LO3ZhciBPPXRoaXM7dGhpcy5CYj0iZXZlbnRUYXNrIj09PUImJm1hJiZtYS5Qej93LmZpOmZ1bmN0aW9uKCl7cmV0dXJuIHcuZmkuY2FsbChhLE8sdGhpcyxhcmd1bWVudHMpfX07dy5maT1mdW5jdGlvbihCLEcsSyl7Qnx8KEI9dGhpcyk7RWErKzt0cnl7cmV0dXJuIEIucWsrKyxCLmxhLnJ0KEIsRyxLKX1maW5hbGx5ezE9PUVhJiZmKCksRWEtLX19O3cucHJvdG90eXBlLldkPWZ1bmN0aW9uKEIsRyxLKXtpZih0aGlzLnRhPT09R3x8dGhpcy50YT09PUspdGhpcy50YT1CLCJub3RTY2hlZHVsZWQiPT1CJiYodGhpcy5FbD1udWxsKTtlbHNlIHRocm93IEVycm9yKHRoaXMudHlwZSsiICciK3RoaXMuc291cmNlKwoiJzogY2FuIG5vdCB0cmFuc2l0aW9uIHRvICciK0IrIicsIGV4cGVjdGluZyBzdGF0ZSAnIitHKyInIisoSz8iIG9yICciK0srIiciOiIiKSsiLCB3YXMgJyIrdGhpcy50YSsiJy4iKTt9O3cucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YSYmInVuZGVmaW5lZCIhPT10eXBlb2YgdGhpcy5kYXRhLmNpP3RoaXMuZGF0YS5jaS50b1N0cmluZygpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX07dy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHN0YXRlOnRoaXMuc3RhdGUsc291cmNlOnRoaXMuc291cmNlLGxhOnRoaXMubGEubmFtZSxxazp0aGlzLnFrfX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh3LnByb3RvdHlwZSx7bGE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJifX0sc3RhdGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YX19fSk7dmFyIHg9ZCgic2V0VGltZW91dCIpLHU9ZCgiUHJvbWlzZSIpLEQ9ZCgidGhlbiIpLEg9W10sRT0hMSxOLE09e25hbWU6Ik5PIFpPTkUifSxKPXt9LFE9e2tlOmQsaVA6ZnVuY3Rpb24oKXtyZXR1cm4gVX0sUXk6Zyx6RzpnLHBtOmUsbFI6ZnVuY3Rpb24oKXtyZXR1cm4hcVtkKCJpZ25vcmVDb25zb2xlRXJyb3JVbmNhdWdodEVycm9yIildfSxabzpmdW5jdGlvbigpe3JldHVybltdfSxmSDpnLGVIOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LE9POmZ1bmN0aW9uKCl7cmV0dXJuW119LFFROmZ1bmN0aW9uKCl7cmV0dXJuIGd9LGRIOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LGNIOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LGdHOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE9nOmZ1bmN0aW9uKCl7fSxLazpmdW5jdGlvbigpe3JldHVybiBnfSxMazpmdW5jdGlvbigpe30sVno6ZnVuY3Rpb24oKXt9LFR6OmZ1bmN0aW9uKCl7cmV0dXJuW119LGJIOmZ1bmN0aW9uKCl7cmV0dXJuIGd9LApLcDpmdW5jdGlvbigpe3JldHVybiBnfSxFUDpmdW5jdGlvbigpe3JldHVybltdfSxPRTpmdW5jdGlvbigpe3JldHVybiBnfSxtdzpmdW5jdGlvbigpe3JldHVybiBnfSxZeTpmdW5jdGlvbigpe3JldHVybiBnfX0sVT17cGFyZW50Om51bGwsbGE6bmV3IHEobnVsbCxudWxsKX0scmE9bnVsbCxFYT0wO2MoIlpvbmUiLCJab25lIik7cmV0dXJuIGEuWm9uZT1xfSkoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ3aW5kb3d8fCJ1bmRlZmluZWQiIT09dHlwZW9mIHNlbGYmJnNlbGZ8fGdsb2JhbCk7Wm9uZS5sYygiRXJyb3IiLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKEUpe2Zvcih2YXIgTj17Rkk6RS5sYS5uYW1lfSxNPU47RS5wYXJlbnQ7KXtFPUUucGFyZW50O3ZhciBKPXtGSTpFLmxhLm5hbWV9O049Ti5wYXJlbnQ9Sn1yZXR1cm4gTX1mdW5jdGlvbiBlKEUsTixNKXtNPXZvaWQgMD09PU0/ITA6TTtFPUUuc3BsaXQoIlxuIik7Zm9yKHZhciBKPTA7RVtKXSE9PXAmJkVbSl0hPT1xJiZFW0pdIT09ciYmRVtKXSE9PXYmJkVbSl0hPT13JiZKPEUubGVuZ3RoOylKKys7Zm9yKDtKPEUubGVuZ3RoJiZOO0orKyl7dmFyIFE9RVtKXTtpZihRLnRyaW0oKSlzd2l0Y2gobVtRXSl7Y2FzZSAwOkUuc3BsaWNlKEosMSk7Si0tO2JyZWFrO2Nhc2UgMTpOPU4ucGFyZW50P04ucGFyZW50Om51bGw7RS5zcGxpY2UoSiwxKTtKLS07YnJlYWs7ZGVmYXVsdDpFW0pdKz1NPyIgWyIrTi5sYS5uYW1lKyJdIjoiIFsiK04uRkkrIl0ifX1yZXR1cm4gRS5qb2luKCJcbiIpfWZ1bmN0aW9uIGYoKXt2YXIgRT0KdGhpcyxOPWwuYXBwbHkodGhpcyxhcmd1bWVudHMpLE09Ti5vcmlnaW5hbFN0YWNrPU4uc3RhY2s7aWYoZi5zdGFja1Jld3JpdGUmJk0pe3ZhciBKPWMuaVAoKTtpZigibGF6eSI9PT14KU5bYy5rZSgiem9uZUZyYW1lTmFtZXMiKV09ZChKKTtlbHNlIGlmKCJkZWZhdWx0Ij09PXgpdHJ5e04uc3RhY2s9Ti5aUz1lKE0sSil9Y2F0Y2goUSl7fX1yZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGwmJnRoaXMuY29uc3RydWN0b3IhPWw/KE9iamVjdC5rZXlzKE4pLmNvbmNhdCgic3RhY2siLCJtZXNzYWdlIikuZm9yRWFjaChmdW5jdGlvbihRKXt2YXIgVT1OW1FdO2lmKHZvaWQgMCE9PVUpdHJ5e0VbUV09VX1jYXRjaChyYSl7fX0pLHRoaXMpOk59dmFyIGc9Yy5rZSgiYmxhY2tsaXN0ZWRTdGFja0ZyYW1lcyIpLGw9YVtjLmtlKCJFcnJvciIpXT1hLkVycm9yLG09e30scCxxLHIsdix3O2EuRXJyb3I9Zjt2YXIgeD1hLl9fWm9uZV9FcnJvcl9CbGFja2xpc3RlZFN0YWNrRnJhbWVzX3BvbGljeXx8CiJkZWZhdWx0IjtmLnByb3RvdHlwZT1sLnByb3RvdHlwZTtmW2ddPW07Zi5zdGFja1Jld3JpdGU9ITE7dmFyIHU9Yy5rZSgiem9uZUF3YXJlU3RhY2siKTsibGF6eSI9PT14JiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZi5wcm90b3R5cGUsInpvbmVBd2FyZVN0YWNrIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dGhpc1t1XXx8KHRoaXNbdV09ZSh0aGlzLlpzLHRoaXNbYy5rZSgiem9uZUZyYW1lTmFtZXMiKV0sITEpKTtyZXR1cm4gdGhpc1t1XX0sc2V0OmZ1bmN0aW9uKEUpe3RoaXMuWnM9RTt0aGlzW3VdPWUodGhpcy5acyx0aGlzW2Mua2UoInpvbmVGcmFtZU5hbWVzIildLCExKX19KTt2YXIgRD1bInN0YWNrVHJhY2VMaW1pdCIsImNhcHR1cmVTdGFja1RyYWNlIiwicHJlcGFyZVN0YWNrVHJhY2UiXTsoYT1PYmplY3Qua2V5cyhsKSkmJmEuZm9yRWFjaChmdW5jdGlvbihFKXswPT09RC5maWx0ZXIoZnVuY3Rpb24oTil7cmV0dXJuIE49PT1FfSkubGVuZ3RoJiYKT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsRSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGxbRV19LHNldDpmdW5jdGlvbihOKXtsW0VdPU59fSl9KTtsLmhhc093blByb3BlcnR5KCJzdGFja1RyYWNlTGltaXQiKSYmKGwuc3RhY2tUcmFjZUxpbWl0PU1hdGgubWF4KGwuc3RhY2tUcmFjZUxpbWl0LDE1KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwic3RhY2tUcmFjZUxpbWl0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGwuc3RhY2tUcmFjZUxpbWl0fSxzZXQ6ZnVuY3Rpb24oRSl7cmV0dXJuIGwuc3RhY2tUcmFjZUxpbWl0PUV9fSkpO2wuaGFzT3duUHJvcGVydHkoImNhcHR1cmVTdGFja1RyYWNlIikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJjYXB0dXJlU3RhY2tUcmFjZSIse3ZhbHVlOmZ1bmN0aW9uKEUsTil7bC5jYXB0dXJlU3RhY2tUcmFjZShFLE4pfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCJwcmVwYXJlU3RhY2tUcmFjZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBsLnBIfSwKc2V0OmZ1bmN0aW9uKEUpe3JldHVybiBFJiYiZnVuY3Rpb24iPT09dHlwZW9mIEU/bC5wSD1mdW5jdGlvbihOLE0pe2lmKE0pZm9yKHZhciBKPTA7SjxNLmxlbmd0aDtKKyspaWYoInpvbmVDYXB0dXJlU3RhY2tUcmFjZSI9PT1NW0pdLmdldEZ1bmN0aW9uTmFtZSgpKXtNLnNwbGljZShKLDEpO2JyZWFrfXJldHVybiBFLmNhbGwodGhpcyxOLE0pfTpsLnBIPUV9fSk7aWYoImRpc2FibGUiIT09eCl7dmFyIEg9Yi5jdXJyZW50LkNlKHtuYW1lOiJkZXRlY3QiLFpqOmZ1bmN0aW9uKEUsTixNLEope2lmKEouWnMmJkVycm9yPT09Zilmb3IoRT1KLlpzLnNwbGl0KC9cbi8pLEo9TT1OPSExO0UubGVuZ3RoOyl7dmFyIFE9RS5zaGlmdCgpO2lmKC86XGQrOlxkKy8udGVzdChRKXx8IlpvbmVBd2FyZUVycm9yIj09PVEpe3ZhciBVPVEuc3BsaXQoIigiKVswXS5zcGxpdCgiQCIpWzBdLHJhPTE7LTEhPT1VLmluZGV4T2YoIlpvbmVBd2FyZUVycm9yIikmJigtMSE9PVUuaW5kZXhPZigibmV3IFpvbmVBd2FyZUVycm9yIik/CihwPVEscT1RLnJlcGxhY2UoIm5ldyBab25lQXdhcmVFcnJvciIsIm5ldyBFcnJvci5ab25lQXdhcmVFcnJvciIpKToocj1RLHY9US5yZXBsYWNlKCJFcnJvci4iLCIiKSwtMT09PVEuaW5kZXhPZigiRXJyb3IuWm9uZUF3YXJlRXJyb3IiKSYmKHc9US5yZXBsYWNlKCJab25lQXdhcmVFcnJvciIsIkVycm9yLlpvbmVBd2FyZUVycm9yIikpKSxtW3FdPTApOy0xIT09VS5pbmRleE9mKCJydW5HdWFyZGVkIik/TT0hMDotMSE9PVUuaW5kZXhPZigicnVuVGFzayIpP0o9ITA6LTEhPT1VLmluZGV4T2YoInJ1biIpP049ITA6cmE9MDttW1FdPXJhO2lmKE4mJk0mJkope2Yuc3RhY2tSZXdyaXRlPSEwO2JyZWFrfX19cmV0dXJuITF9fSkuQ2Uoe25hbWU6ImNoaWxkIix4aTpmdW5jdGlvbihFLE4sTSxKKXtyZXR1cm4gRS5maChNLEopfSx3aTpmdW5jdGlvbihFLE4sTSxKLFEsVSl7cmV0dXJuIEUuZmkoTSxKLFEsVSl9LFlqOmZ1bmN0aW9uKEUsTixNLEope3JldHVybiBFLkdnKE0sSil9LGVtOmZ1bmN0aW9uKEUsCk4sTSxKLFEsVSxyYSl7cmV0dXJuIEUuQmIoTSxKLFEsVSxyYSl9fSk7Yj1FcnJvci5zdGFja1RyYWNlTGltaXQ7RXJyb3Iuc3RhY2tUcmFjZUxpbWl0PTEwMDtILmdhKGZ1bmN0aW9uKCl7SC5yayhmdW5jdGlvbigpe3ZhciBFPWZ1bmN0aW9uKCl7fTtILnR0KGcsZnVuY3Rpb24oKXtILnV0KGcsZnVuY3Rpb24oKXtILnBtKGcsZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO30sdm9pZCAwLGZ1bmN0aW9uKE4pe04uV2Q9RTtOLkJiKCl9KTtILnBtKGcsZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO30sdm9pZCAwLGZ1bmN0aW9uKE4pe04uV2Q9RTtOLkJiKCl9KX0sdm9pZCAwLGZ1bmN0aW9uKE4pe04uV2Q9RTtOLkJiKCl9LGZ1bmN0aW9uKCl7fSl9LHZvaWQgMCxmdW5jdGlvbihOKXtOLldkPUU7Ti5CYigpfSxmdW5jdGlvbigpe30pfSl9KTtFcnJvci5zdGFja1RyYWNlTGltaXQ9Yn19KTt2YXIgV2E9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixYYT1PYmplY3QuZGVmaW5lUHJvcGVydHksWWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLFphPU9iamVjdC5jcmVhdGUsYWI9QXJyYXkucHJvdG90eXBlLnNsaWNlLGJiPVpvbmUuc2MoImFkZEV2ZW50TGlzdGVuZXIiKSxjYj1ab25lLnNjKCJyZW1vdmVFdmVudExpc3RlbmVyIiksZGI9Wm9uZS5zYygiIik7ZnVuY3Rpb24gZWIoYSxiKXtyZXR1cm4gWm9uZS5jdXJyZW50LkhSKGEsYil9dmFyIGZiPVpvbmUuc2MsZ2I9InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LGhiPWdiP3dpbmRvdzp2b2lkIDAsaWI9Z2ImJmhifHwib2JqZWN0Ij09PXR5cGVvZiBzZWxmJiZzZWxmfHxnbG9iYWwsamI9W251bGxdO2Z1bmN0aW9uIGtiKGEsYil7Zm9yKHZhciBjPWEubGVuZ3RoLTE7MDw9YztjLS0pImZ1bmN0aW9uIj09PXR5cGVvZiBhW2NdJiYoYVtjXT1lYihhW2NdLGIrIl8iK2MpKTtyZXR1cm4gYX0KZnVuY3Rpb24gbGIoYSl7Zm9yKHZhciBiPVsiZ2V0Q3VycmVudFBvc2l0aW9uIiwid2F0Y2hQb3NpdGlvbiJdLGM9YS5jb25zdHJ1Y3Rvci5uYW1lLGQ9e30sZT0wO2U8Yi5sZW5ndGg7ZD17SWs6ZC5Ja30sZSsrKXtkLklrPWJbZV07dmFyIGY9YVtkLklrXTtpZihmKXt2YXIgZz1XYShhLGQuSWspO21iKGcpJiYoYVtkLklrXT1mdW5jdGlvbihsKXtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIHA9ZnVuY3Rpb24oKXtyZXR1cm4gbS5hcHBseSh0aGlzLGtiKGFyZ3VtZW50cyxjKyIuIitsLklrKSl9O25iKHAsbSk7cmV0dXJuIHB9fShkKShmKSl9fX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gYT8hMT09PWEud3JpdGFibGU/ITE6ISgiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0JiYidW5kZWZpbmVkIj09PXR5cGVvZiBhLnNldCk6ITB9CnZhciBvYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlLHBiPSEoIm53ImluIGliKSYmInVuZGVmaW5lZCIhPT10eXBlb2YgaWIucHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChpYi5wcm9jZXNzKSxxYj0hcGImJiFvYiYmISghZ2J8fCFoYi5IVE1MRWxlbWVudCkscmI9InVuZGVmaW5lZCIhPT10eXBlb2YgaWIucHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChpYi5wcm9jZXNzKSYmIW9iJiYhKCFnYnx8IWhiLkhUTUxFbGVtZW50KSxzYj17fSx0Yj1mdW5jdGlvbihhKXtpZihhPWF8fGliLmV2ZW50KXt2YXIgYj1zYlthLnR5cGVdO2J8fChiPXNiW2EudHlwZV09ZmIoIk9OX1BST1BFUlRZIithLnR5cGUpKTt2YXIgYz10aGlzfHxhLnRhcmdldHx8aWI7Yj1jW2JdO3FiJiZjPT09aGImJiJlcnJvciI9PT1hLnR5cGU/KGM9YSxjPQpiJiZiLmNhbGwodGhpcyxjLm1lc3NhZ2UsYy5maWxlbmFtZSxjLmxpbmVubyxjLmNvbG5vLGMuZXJyb3IpLCEwPT09YyYmYS5wcmV2ZW50RGVmYXVsdCgpKTooYz1iJiZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx2b2lkIDA9PWN8fGN8fGEucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGN9fTsKZnVuY3Rpb24gdWIoYSxiLGMpe3ZhciBkPVdhKGEsYik7IWQmJmMmJldhKGMsYikmJihkPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO2lmKGQmJmQuY29uZmlndXJhYmxlJiYoYz1mYigib24iK2IrInBhdGNoZWQiKSwhYS5oYXNPd25Qcm9wZXJ0eShjKXx8IWFbY10pKXtkZWxldGUgZC53cml0YWJsZTtkZWxldGUgZC52YWx1ZTt2YXIgZT1kLmdldCxmPWQuc2V0LGc9Yi5zdWJzdHIoMiksbD1zYltnXTtsfHwobD1zYltnXT1mYigiT05fUFJPUEVSVFkiK2cpKTtkLnNldD1mdW5jdGlvbihtKXt2YXIgcD10aGlzO3B8fGEhPT1pYnx8KHA9aWIpO3AmJihwW2xdJiZwLnJlbW92ZUV2ZW50TGlzdGVuZXIoZyx0YiksZiYmZi5hcHBseShwLGpiKSwiZnVuY3Rpb24iPT09dHlwZW9mIG0/KHBbbF09bSxwLmFkZEV2ZW50TGlzdGVuZXIoZyx0YiwhMSkpOnBbbF09bnVsbCl9O2QuZ2V0PWZ1bmN0aW9uKCl7dmFyIG09dGhpczttfHxhIT09aWJ8fChtPWliKTtpZighbSlyZXR1cm4gbnVsbDsKdmFyIHA9bVtsXTtyZXR1cm4gcD9wOmUmJihwPWUmJmUuY2FsbCh0aGlzKSk/KGQuc2V0LmNhbGwodGhpcyxwKSwiZnVuY3Rpb24iPT09dHlwZW9mIG0ucmVtb3ZlQXR0cmlidXRlJiZtLnJlbW92ZUF0dHJpYnV0ZShiKSxwKTpudWxsfTtYYShhLGIsZCk7YVtjXT0hMH19ZnVuY3Rpb24gdmIoYSxiLGMpe2lmKGIpZm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdWIoYSwib24iK2JbZF0sYyk7ZWxzZXtiPVtdO2ZvcihkIGluIGEpIm9uIj09ZC5zdWJzdHIoMCwyKSYmYi5wdXNoKGQpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspdWIoYSxiW2RdLGMpfX12YXIgd2I9ZmIoIm9yaWdpbmFsSW5zdGFuY2UiKTsKZnVuY3Rpb24geGIoYSl7dmFyIGI9aWJbYV07aWYoYil7aWJbZmIoYSldPWI7aWJbYV09ZnVuY3Rpb24oKXt2YXIgZT1rYihhcmd1bWVudHMsYSk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6dGhpc1t3Yl09bmV3IGI7YnJlYWs7Y2FzZSAxOnRoaXNbd2JdPW5ldyBiKGVbMF0pO2JyZWFrO2Nhc2UgMjp0aGlzW3diXT1uZXcgYihlWzBdLGVbMV0pO2JyZWFrO2Nhc2UgMzp0aGlzW3diXT1uZXcgYihlWzBdLGVbMV0sZVsyXSk7YnJlYWs7Y2FzZSA0OnRoaXNbd2JdPW5ldyBiKGVbMF0sZVsxXSxlWzJdLGVbM10pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIkFyZyBsaXN0IHRvbyBsb25nLiIpO319O25iKGliW2FdLGIpO3ZhciBjPW5ldyBiKGZ1bmN0aW9uKCl7fSksZDtmb3IoZCBpbiBjKSJYTUxIdHRwUmVxdWVzdCI9PT1hJiYicmVzcG9uc2VCbG9iIj09PWR8fGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PT10eXBlb2YgY1tlXT9pYlthXS5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t3Yl1bZV0uYXBwbHkodGhpc1t3Yl0sCmFyZ3VtZW50cyl9OlhhKGliW2FdLnByb3RvdHlwZSxlLHtzZXQ6ZnVuY3Rpb24oZil7ImZ1bmN0aW9uIj09PXR5cGVvZiBmPyh0aGlzW3diXVtlXT1lYihmLGErIi4iK2UpLG5iKHRoaXNbd2JdW2VdLGYpKTp0aGlzW3diXVtlXT1mfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t3Yl1bZV19fSl9KGQpO2ZvcihkIGluIGIpInByb3RvdHlwZSIhPT1kJiZiLmhhc093blByb3BlcnR5KGQpJiYoaWJbYV1bZF09YltkXSl9fWZ1bmN0aW9uIHpiKGEsYixjKXtmb3IodmFyIGQ9YTtkJiYhZC5oYXNPd25Qcm9wZXJ0eShiKTspZD1ZYShkKTshZCYmYVtiXSYmKGQ9YSk7YT1mYihiKTt2YXIgZT1udWxsO2lmKGQmJiEoZT1kW2FdKSl7ZT1kW2FdPWRbYl07dmFyIGY9ZCYmV2EoZCxiKTtpZihtYihmKSl7dmFyIGc9YyhlLGEsYik7ZFtiXT1mdW5jdGlvbigpe3JldHVybiBnKHRoaXMsYXJndW1lbnRzKX07bmIoZFtiXSxlKX19cmV0dXJuIGV9CmZ1bmN0aW9uIEFiKGEsYixjKXtmdW5jdGlvbiBkKGYpe3ZhciBnPWYuZGF0YTtnLktoW2cuWHJdPWZ1bmN0aW9uKCl7Zi5CYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2UuYXBwbHkoZy50YXJnZXQsZy5LaCk7cmV0dXJuIGZ9dmFyIGU9bnVsbDtlPXpiKGEsYixmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oZyxsKXt2YXIgbT1jKGcsbCk7cmV0dXJuIDA8PW0uWHImJiJmdW5jdGlvbiI9PT10eXBlb2YgbFttLlhyXT9ab25lLmN1cnJlbnQudXQobS5uYW1lLGxbbS5Ycl0sbSxkLHZvaWQgMCk6Zi5hcHBseShnLGwpfX0pfWZ1bmN0aW9uIG5iKGEsYil7YVtmYigiT3JpZ2luYWxEZWxlZ2F0ZSIpXT1ifXZhciBCYj0hMSxDYj0hMTsKZnVuY3Rpb24gRGIoKXtpZihCYilyZXR1cm4gQ2I7QmI9ITA7dHJ5e3ZhciBhPWhiLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoLTEhPT1hLmluZGV4T2YoIk1TSUUgIil8fC0xIT09YS5pbmRleE9mKCJUcmlkZW50LyIpfHwtMSE9PWEuaW5kZXhPZigiRWRnZS8iKSlDYj0hMH1jYXRjaChiKXt9cmV0dXJuIENifTt2YXIgRWI9ITE7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93KXRyeXt2YXIgRmI9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7RWI9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLEZiLEZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsRmIsRmIpfWNhdGNoKGEpe0ViPSExfXZhciBHYj17UHo6ITB9LEhiPXt9LEliPXt9LEpiPW5ldyBSZWdFeHAoIl4iK2RiKyIoXFx3KykodHJ1ZXxmYWxzZSkkIiksS2I9ZmIoInByb3BhZ2F0aW9uU3RvcHBlZCIpO2Z1bmN0aW9uIExiKGEsYil7dmFyIGM9KGI/YihhKTphKSsiZmFsc2UiO2I9KGI/YihhKTphKSsidHJ1ZSI7Yz1kYitjO2I9ZGIrYjtIYlthXT17fTtIYlthXVsiZmFsc2UiXT1jO0hiW2FdWyJ0cnVlIl09Yn0KZnVuY3Rpb24gTWIoYSxiLGMpe2Z1bmN0aW9uIGQodSxEKXtpZighdSlyZXR1cm4hMTt2YXIgSD0hMDtEJiZ2b2lkIDAhPT1ELlB6JiYoSD1ELlB6KTt2YXIgRT1EJiZELkRSLE49ITA7RCYmdm9pZCAwIT09RC5XTyYmKE49RC5XTyk7dmFyIE09ITE7RCYmdm9pZCAwIT09RC5jUiYmKE09RC5jUik7Zm9yKHZhciBKPXU7SiYmIUouaGFzT3duUHJvcGVydHkoZSk7KUo9WWEoSik7IUomJnVbZV0mJihKPXUpO2lmKCFKfHxKW21dKXJldHVybiExO3ZhciBRPUQmJkQuc1MsVT17fSxyYT1KW21dPUpbZV0sRWE9SltmYihmKV09SltmXTt1PUpbZmIoZyldPUpbZ107dmFyIEI9SltmYihsKV09SltsXSxHO0QmJkQucHJlcGVuZCYmKEc9SltmYihELnByZXBlbmQpXT1KW0QucHJlcGVuZF0pO3ZhciBLPWZ1bmN0aW9uKEMpe2lmKCFDLnV5KXt2YXIgUD1IYltDLkJlXSxSO1AmJihSPVBbQy5jYXB0dXJlPyJ0cnVlIjoiZmFsc2UiXSk7aWYoUD1SJiZDLnRhcmdldFtSXSlmb3IodmFyIGJhPTA7YmE8ClAubGVuZ3RoO2JhKyspaWYoUFtiYV09PT1DKXtQLnNwbGljZShiYSwxKTtDLnV5PSEwOzA9PT1QLmxlbmd0aCYmKEMuSEU9ITAsQy50YXJnZXRbUl09bnVsbCk7YnJlYWt9fWlmKEMuSEUpcmV0dXJuIEVhLmNhbGwoQy50YXJnZXQsQy5CZSxDLmNhcHR1cmU/djpyLEMub3B0aW9ucyl9LG1hPWZ1bmN0aW9uKEMpe3JldHVybiByYS5jYWxsKFUudGFyZ2V0LFUuQmUsQy5CYixVLm9wdGlvbnMpfSxrYT1mdW5jdGlvbihDKXtyZXR1cm4gRy5jYWxsKFUudGFyZ2V0LFUuQmUsQy5CYixVLm9wdGlvbnMpfSwkYT1mdW5jdGlvbihDKXtyZXR1cm4gRWEuY2FsbChDLnRhcmdldCxDLkJlLEMuQmIsQy5vcHRpb25zKX07bWE9SD9mdW5jdGlvbigpe2lmKCFVLmpRKXJldHVybiByYS5jYWxsKFUudGFyZ2V0LFUuQmUsVS5jYXB0dXJlP3Y6cixVLm9wdGlvbnMpfTptYTtLPUg/SzokYTskYT1mdW5jdGlvbihDLFApe3ZhciBSPXR5cGVvZiBQO3JldHVybiJmdW5jdGlvbiI9PT1SJiZDLlpkPT09UHx8Im9iamVjdCI9PT0KUiYmQy5iZz09PVB9O3ZhciBPPUQmJkQuR2o/RC5HajokYSxTPVpvbmVbZmIoIkJMQUNLX0xJU1RFRF9FVkVOVFMiKV0sZGE9YVtmYigiUEFTU0lWRV9FVkVOVFMiKV07JGE9ZnVuY3Rpb24oQyxQLFIsYmEsdWEsSmEpe3VhPXZvaWQgMD09PXVhPyExOnVhO0phPXZvaWQgMD09PUphPyExOkphO3JldHVybiBmdW5jdGlvbigpe3ZhciB0YT10aGlzfHxhLHdhPWFyZ3VtZW50c1swXTtEJiZELktpJiYod2E9RC5LaSh3YSkpO3ZhciBUYT1hcmd1bWVudHNbMV07aWYoIVRhfHxwYiYmInVuY2F1Z2h0RXhjZXB0aW9uIj09PXdhKXJldHVybiBDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgUWI9ITE7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBUYSl7aWYoIVRhLmhhbmRsZUV2ZW50KXJldHVybiBDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtRYj0hMH1pZighRXx8RShDLFRhLHRhLGFyZ3VtZW50cykpe3ZhciBSYj1FYiYmISFkYSYmLTEhPT1kYS5pbmRleE9mKHdhKTt2YXIgVWE9YXJndW1lbnRzWzJdOwpVYT0hRWImJiJvYmplY3QiPT09dHlwZW9mIFVhJiZVYT8hIVVhLmNhcHR1cmU6RWImJlJiPyJib29sZWFuIj09PXR5cGVvZiBVYT97Y2FwdHVyZTpVYSxwYXNzaXZlOiEwfTpVYT8ib2JqZWN0Ij09PXR5cGVvZiBVYSYmITEhPT1VYS5wYXNzaXZlP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxVYSkse3Bhc3NpdmU6ITB9KTpVYTp7cGFzc2l2ZTohMH06VWE7aWYoUylmb3IodmFyIHNjPTA7c2M8Uy5sZW5ndGg7c2MrKylpZih3YT09PVNbc2NdKXJldHVybiBSYj9DLmNhbGwodGEsd2EsVGEsVWEpOkMuYXBwbHkodGhpcyxhcmd1bWVudHMpO1JiPVVhPyJib29sZWFuIj09PXR5cGVvZiBVYT8hMDpVYS5jYXB0dXJlOiExO3NjPVVhJiYib2JqZWN0Ij09PXR5cGVvZiBVYT9VYS5vbmNlOiExO3ZhciBCZT1ab25lLmN1cnJlbnQsU2I9SGJbd2FdO1NifHwoTGIod2EsUSksU2I9SGJbd2FdKTt2YXIgWWI9U2JbUmI/InRydWUiOiJmYWxzZSJdO1NiPXRhW1liXTt2YXIgaWM9ITE7aWYoU2Ipe2lmKGljPQohMCxOKWZvcihZYj0wO1liPFNiLmxlbmd0aDtZYisrKWlmKE8oU2JbWWJdLFRhKSlyZXR1cm59ZWxzZSBTYj10YVtZYl09W107dmFyIHliO1liPXRhLmNvbnN0cnVjdG9yLm5hbWU7dmFyIFNkPUliW1liXTtTZCYmKHliPVNkW3dhXSk7eWJ8fCh5Yj1ZYitQKyhRP1Eod2EpOndhKSk7VS5vcHRpb25zPVVhO3NjJiYoVS5vcHRpb25zLm9uY2U9ITEpO1UudGFyZ2V0PXRhO1UuY2FwdHVyZT1SYjtVLkJlPXdhO1UualE9aWM7aWYoaWM9SD9HYjp2b2lkIDApaWMudVI9VTt5Yj1CZS50dCh5YixUYSxpYyxSLGJhKTtVLnRhcmdldD1udWxsO2ljJiYoaWMudVI9bnVsbCk7c2MmJihVYS5vbmNlPSEwKTtpZihFYnx8ImJvb2xlYW4iIT09dHlwZW9mIHliLm9wdGlvbnMpeWIub3B0aW9ucz1VYTt5Yi50YXJnZXQ9dGE7eWIuY2FwdHVyZT1SYjt5Yi5CZT13YTtRYiYmKHliLmJnPVRhKTtKYT9TYi51bnNoaWZ0KHliKTpTYi5wdXNoKHliKTtpZih1YSlyZXR1cm4gdGF9fX07SltlXT0kYShyYSxwLG1hLApLLE0pO0cmJihKLnByZXBlbmRMaXN0ZW5lcj0kYShHLCIucHJlcGVuZExpc3RlbmVyOiIsa2EsSyxNLCEwKSk7SltmXT1mdW5jdGlvbigpe3ZhciBDPXRoaXN8fGEsUD1hcmd1bWVudHNbMF07RCYmRC5LaSYmKFA9RC5LaShQKSk7dmFyIFI9YXJndW1lbnRzWzJdLGJhPVI/ImJvb2xlYW4iPT09dHlwZW9mIFI/ITA6Ui5jYXB0dXJlOiExO1I9YXJndW1lbnRzWzFdO2lmKCFSKXJldHVybiBFYS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIUV8fEUoRWEsUixDLGFyZ3VtZW50cykpe3ZhciB1YT1IYltQXSxKYTt1YSYmKEphPXVhW2JhPyJ0cnVlIjoiZmFsc2UiXSk7aWYoYmE9SmEmJkNbSmFdKWZvcih1YT0wO3VhPGJhLmxlbmd0aDt1YSsrKXt2YXIgdGE9YmFbdWFdO2lmKE8odGEsUikpe2JhLnNwbGljZSh1YSwxKTt0YS51eT0hMDswPT09YmEubGVuZ3RoJiYodGEuSEU9ITAsQ1tKYV09bnVsbCwic3RyaW5nIj09PXR5cGVvZiBQJiYoQ1tkYisiT05fUFJPUEVSVFkiK1BdPW51bGwpKTsKdGEubGEuR2codGEpO2lmKE0pcmV0dXJuIEM7cmV0dXJufX1yZXR1cm4gRWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07SltnXT1mdW5jdGlvbihDKXt2YXIgUD10aGlzfHxhLFI9QztEJiZELktpJiYoUj1ELktpKFIpKTtDPVtdO1A9TmIoUCxRP1EoUik6Uik7Zm9yKFI9MDtSPFAubGVuZ3RoO1IrKyl7dmFyIGJhPVBbUl07Qy5wdXNoKGJhLmJnP2JhLmJnOmJhLlpkKX1yZXR1cm4gQ307SltsXT1mdW5jdGlvbihDKXt2YXIgUD10aGlzfHxhO2lmKEMpe0QmJkQuS2kmJihDPUQuS2koQykpO3ZhciBSPUhiW0NdO2lmKFIpe3ZhciBiYT1QW1JbImZhbHNlIl1dO1A9UFtSWyJ0cnVlIl1dO2lmKGJhKWZvcihiYT1iYS5zbGljZSgpLFI9MDtSPGJhLmxlbmd0aDtSKyspe3ZhciB1YT1iYVtSXTt0aGlzW2ZdLmNhbGwodGhpcyxDLHVhLmJnP3VhLmJnOnVhLlpkLHVhLm9wdGlvbnMpfWlmKFApZm9yKFA9UC5zbGljZSgpLGJhPTA7YmE8UC5sZW5ndGg7YmErKylSPVBbYmFdLHRoaXNbZl0uY2FsbCh0aGlzLApDLFIuYmc/Ui5iZzpSLlpkLFIub3B0aW9ucyl9fWVsc2V7Qz1PYmplY3Qua2V5cyhQKTtmb3IoUD0wO1A8Qy5sZW5ndGg7UCsrKShiYT0oYmE9SmIuZXhlYyhDW1BdKSkmJmJhWzFdKSYmInJlbW92ZUxpc3RlbmVyIiE9PWJhJiZ0aGlzW2xdLmNhbGwodGhpcyxiYSk7dGhpc1tsXS5jYWxsKHRoaXMsInJlbW92ZUxpc3RlbmVyIil9aWYoTSlyZXR1cm4gdGhpc307bmIoSltlXSxyYSk7bmIoSltmXSxFYSk7QiYmbmIoSltsXSxCKTt1JiZuYihKW2ddLHUpO3JldHVybiEwfWZvcih2YXIgZT1jJiZjLmFkZHx8ImFkZEV2ZW50TGlzdGVuZXIiLGY9YyYmYy5QU3x8InJlbW92ZUV2ZW50TGlzdGVuZXIiLGc9YyYmYy5CeXx8ImV2ZW50TGlzdGVuZXJzIixsPWMmJmMuUVN8fCJyZW1vdmVBbGxMaXN0ZW5lcnMiLG09ZmIoZSkscD0iLiIrZSsiOiIscT1mdW5jdGlvbih1LEQsSCl7aWYoIXUudXkpe3ZhciBFPXUuWmQ7Im9iamVjdCI9PT10eXBlb2YgRSYmRS5oYW5kbGVFdmVudCYmKHUuWmQ9ZnVuY3Rpb24oTSl7cmV0dXJuIEUuaGFuZGxlRXZlbnQoTSl9LAp1LmJnPUUpO3UuQmIodSxELFtIXSk7dmFyIE49dS5vcHRpb25zO04mJiJvYmplY3QiPT09dHlwZW9mIE4mJk4ub25jZSYmRFtmXS5jYWxsKEQsSC50eXBlLHUuYmc/dS5iZzp1LlpkLE4pfX0scj1mdW5jdGlvbih1KXtpZih1PXV8fGEuZXZlbnQpe3ZhciBEPXRoaXN8fHUudGFyZ2V0fHxhLEg9RFtIYlt1LnR5cGVdWyJmYWxzZSJdXTtpZihIKWlmKDE9PT1ILmxlbmd0aClxKEhbMF0sRCx1KTtlbHNle0g9SC5zbGljZSgpO2Zvcih2YXIgRT0wO0U8SC5sZW5ndGgmJighdXx8ITAhPT11W0tiXSk7RSsrKXEoSFtFXSxELHUpfX19LHY9ZnVuY3Rpb24odSl7aWYodT11fHxhLmV2ZW50KXt2YXIgRD10aGlzfHx1LnRhcmdldHx8YSxIPURbSGJbdS50eXBlXVsidHJ1ZSJdXTtpZihIKWlmKDE9PT1ILmxlbmd0aClxKEhbMF0sRCx1KTtlbHNle0g9SC5zbGljZSgpO2Zvcih2YXIgRT0wO0U8SC5sZW5ndGgmJighdXx8ITAhPT11W0tiXSk7RSsrKXEoSFtFXSxELHUpfX19LHc9W10seD0wO3g8Yi5sZW5ndGg7eCsrKXdbeF09CmQoYlt4XSxjKTtyZXR1cm4gd31mdW5jdGlvbiBOYihhLGIpe2lmKCFiKXt2YXIgYz1bXSxkO2ZvcihkIGluIGEpe3ZhciBlPUpiLmV4ZWMoZCk7aWYoKGU9ZSYmZVsxXSkmJighYnx8ZT09PWIpJiYoZT1hW2RdKSlmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyljLnB1c2goZVtmXSl9cmV0dXJuIGN9Yz1IYltiXTtjfHwoTGIoYiksYz1IYltiXSk7Yj1hW2NbImZhbHNlIl1dO2E9YVtjWyJ0cnVlIl1dO3JldHVybiBiP2E/Yi5jb25jYXQoYSk6Yi5zbGljZSgpOmE/YS5zbGljZSgpOltdfWZ1bmN0aW9uIE9iKGEsYil7KGE9YS5FdmVudCkmJmEucHJvdG90eXBlJiZiLmVIKGEucHJvdG90eXBlLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLGZ1bmN0aW9uKGMpe3JldHVybiBmdW5jdGlvbihkLGUpe2RbS2JdPSEwO2MmJmMuYXBwbHkoZCxlKX19KX07Wm9uZS5sYygiWm9uZUF3YXJlUHJvbWlzZSIsZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoTyl7aWYoTyYmTy50b1N0cmluZz09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpe3ZhciBTPU8uY29uc3RydWN0b3ImJk8uY29uc3RydWN0b3IubmFtZTtyZXR1cm4oUz9TOiIiKSsiOiAiK0pTT04uc3RyaW5naWZ5KE8pfXJldHVybiBPP08udG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoTyl9ZnVuY3Rpb24gZShPKXtjLlF5KE8pO3RyeXt2YXIgUz1iW01dOyJmdW5jdGlvbiI9PT10eXBlb2YgUyYmUy5jYWxsKHRoaXMsTyl9Y2F0Y2goZGEpe319ZnVuY3Rpb24gZihPKXtyZXR1cm4gT31mdW5jdGlvbiBnKE8pe3JldHVybiBrYS5yZWplY3QoTyl9ZnVuY3Rpb24gbChPLFMpe3JldHVybiBmdW5jdGlvbihkYSl7dHJ5e20oTyxTLGRhKX1jYXRjaChDKXttKE8sITEsQyl9fX1mdW5jdGlvbiBtKE8sUyxkYSl7dmFyIEM9QigpO2lmKE89PT1kYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmIik7CmlmKG51bGw9PT1PW0pdKXt2YXIgUD1udWxsO3RyeXtpZigib2JqZWN0Ij09PXR5cGVvZiBkYXx8ImZ1bmN0aW9uIj09PXR5cGVvZiBkYSlQPWRhJiZkYS50aGVufWNhdGNoKFIpe3JldHVybiBDKGZ1bmN0aW9uKCl7bShPLCExLFIpfSkoKSxPfWlmKCExIT09UyYmZGEgaW5zdGFuY2VvZiBrYSYmZGEuaGFzT3duUHJvcGVydHkoSikmJmRhLmhhc093blByb3BlcnR5KFEpJiZudWxsIT09ZGFbSl0pcChkYSksbShPLGRhW0pdLGRhW1FdKTtlbHNlIGlmKCExIT09UyYmImZ1bmN0aW9uIj09PXR5cGVvZiBQKXRyeXtQLmNhbGwoZGEsQyhsKE8sUykpLEMobChPLCExKSkpfWNhdGNoKFIpe0MoZnVuY3Rpb24oKXttKE8sITEsUil9KSgpfWVsc2V7T1tKXT1TO0M9T1tRXTtPW1FdPWRhO09bVV09PT1VJiYhMD09PVMmJihPW0pdPU9bRWFdLE9bUV09T1tyYV0pOyExPT09UyYmZGEgaW5zdGFuY2VvZiBFcnJvciYmKFA9Yi5RbCYmYi5RbC5kYXRhJiZiLlFsLmRhdGEuX19jcmVhdGlvblRyYWNlX18pJiYKeChkYSxHLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCx2YWx1ZTpQfSk7Zm9yKFA9MDtQPEMubGVuZ3RoOylxKE8sQ1tQKytdLENbUCsrXSxDW1ArK10sQ1tQKytdKTtpZigwPT1DLmxlbmd0aCYmMD09Uyl7T1tKXT0wO1M9ZGE7aWYoIUgpdHJ5e3Rocm93IEVycm9yKCJVbmNhdWdodCAoaW4gcHJvbWlzZSk6ICIrZChkYSkrKGRhJiZkYS5zdGFjaz8iXG4iK2RhLnN0YWNrOiIiKSk7fWNhdGNoKFIpe1M9Un1TLml6PWRhO1MuZmU9TztTLmxhPWIuY3VycmVudDtTLndwPWIuUWw7RC5wdXNoKFMpO2MucG0oKX19fXJldHVybiBPfWZ1bmN0aW9uIHAoTyl7aWYoMD09PU9bSl0pe3RyeXt2YXIgUz1iW0tdO1MmJiJmdW5jdGlvbiI9PT10eXBlb2YgUyYmUy5jYWxsKHRoaXMse2l6Ok9bUV0sZmU6T30pfWNhdGNoKGRhKXt9T1tKXT0hMTtmb3IoUz0wO1M8RC5sZW5ndGg7UysrKU89PT1EW1NdLmZlJiZELnNwbGljZShTLDEpfX1mdW5jdGlvbiBxKE8sUyxkYSxDLApQKXtwKE8pO3ZhciBSPU9bSl0sYmE9Uj8iZnVuY3Rpb24iPT09dHlwZW9mIEM/QzpmOiJmdW5jdGlvbiI9PT10eXBlb2YgUD9QOmc7Uy5wbSgiUHJvbWlzZS50aGVuIixmdW5jdGlvbigpe3RyeXt2YXIgdWE9T1tRXSxKYT0hIWRhJiZVPT09ZGFbVV07SmEmJihkYVtyYV09dWEsZGFbRWFdPVIpO3ZhciB0YT1TLmdhKGJhLHZvaWQgMCxKYSYmYmEhPT1nJiZiYSE9PWY/W106W3VhXSk7bShkYSwhMCx0YSl9Y2F0Y2god2Epe20oZGEsITEsd2EpfX0sZGEpfWZ1bmN0aW9uIHIoTyl7dmFyIFM9Ty5wcm90b3R5cGUsZGE9dyhTLCJ0aGVuIik7aWYoIWRhfHwhMSE9PWRhLndyaXRhYmxlJiZkYS5jb25maWd1cmFibGUpe3ZhciBDPVMudGhlbjtTW05dPUM7Ty5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihQLFIpe3ZhciBiYT10aGlzO3JldHVybihuZXcga2EoZnVuY3Rpb24odWEsSmEpe0MuY2FsbChiYSx1YSxKYSl9KSkudGhlbihQLFIpfTtPWyRhXT0hMH19ZnVuY3Rpb24gdihPKXtyZXR1cm4gZnVuY3Rpb24oUywKZGEpe1M9Ty5hcHBseShTLGRhKTtpZihTIGluc3RhbmNlb2Yga2EpcmV0dXJuIFM7ZGE9Uy5jb25zdHJ1Y3RvcjtkYVskYV18fHIoZGEpO3JldHVybiBTfX12YXIgdz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHg9T2JqZWN0LmRlZmluZVByb3BlcnR5LHU9Yy5rZSxEPVtdLEg9ITA9PT1hW3UoIkRJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04iKV0sRT11KCJQcm9taXNlIiksTj11KCJ0aGVuIik7Yy5ReT1mdW5jdGlvbihPKXtpZihjLmxSKCkpe3ZhciBTPU8mJk8uaXo7Uz9jb25zb2xlLmVycm9yKCJVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246IixTIGluc3RhbmNlb2YgRXJyb3I/Uy5tZXNzYWdlOlMsIjsgWm9uZToiLE8ubGEubmFtZSwiOyBUYXNrOiIsTy53cCYmTy53cC5zb3VyY2UsIjsgVmFsdWU6IixTLFMgaW5zdGFuY2VvZiBFcnJvcj9TLnN0YWNrOnZvaWQgMCk6Y29uc29sZS5lcnJvcihPKX19O2Muekc9ZnVuY3Rpb24oKXtmb3IodmFyIE89Cnt9O0QubGVuZ3RoOyl7Ty5OcD1ELnNoaWZ0KCk7dHJ5e08uTnAubGEucmsoZnVuY3Rpb24oUyl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgUy5OcDt9fShPKSl9Y2F0Y2goUyl7ZShTKX1PPXtOcDpPLk5wfX19O3ZhciBNPXUoInVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyIiksSj11KCJzdGF0ZSIpLFE9dSgidmFsdWUiKSxVPXUoImZpbmFsbHkiKSxyYT11KCJwYXJlbnRQcm9taXNlVmFsdWUiKSxFYT11KCJwYXJlbnRQcm9taXNlU3RhdGUiKSxCPWZ1bmN0aW9uKCl7dmFyIE89ITE7cmV0dXJuIGZ1bmN0aW9uKFMpe3JldHVybiBmdW5jdGlvbigpe098fChPPSEwLFMuYXBwbHkobnVsbCxhcmd1bWVudHMpKX19fSxHPXUoImN1cnJlbnRUYXNrVHJhY2UiKSxLPXUoInJlamVjdGlvbkhhbmRsZWRIYW5kbGVyIiksbWE9ZnVuY3Rpb24oKXt9LGthPWZ1bmN0aW9uKE8pe2lmKCEodGhpcyBpbnN0YW5jZW9mIGthKSl0aHJvdyBFcnJvcigiTXVzdCBiZSBhbiBpbnN0YW5jZW9mIFByb21pc2UuIik7CnRoaXNbSl09bnVsbDt0aGlzW1FdPVtdO3RyeXtPJiZPKGwodGhpcywhMCksbCh0aGlzLCExKSl9Y2F0Y2goUyl7bSh0aGlzLCExLFMpfX07a2EudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9In07a2EucmVzb2x2ZT1mdW5jdGlvbihPKXtyZXR1cm4gbShuZXcgdGhpcyhudWxsKSwhMCxPKX07a2EucmVqZWN0PWZ1bmN0aW9uKE8pe3JldHVybiBtKG5ldyB0aGlzKG51bGwpLCExLE8pfTtrYS5yYWNlPWZ1bmN0aW9uKE8pe2Z1bmN0aW9uIFModWEpe0ModWEpfWZ1bmN0aW9uIGRhKHVhKXtQKHVhKX12YXIgQyxQLFI9bmV3IHRoaXMoZnVuY3Rpb24odWEsSmEpe0M9dWE7UD1KYX0pO089bihPKTtmb3IodmFyIGJhPU8ubmV4dCgpOyFiYS5kb25lO2JhPU8ubmV4dCgpKShiYT1iYS52YWx1ZSkmJmJhLnRoZW58fChiYT10aGlzLnJlc29sdmUoYmEpKSxiYS50aGVuKFMsZGEpO3JldHVybiBSfTtrYS5hbGw9ZnVuY3Rpb24oTyl7cmV0dXJuIGthLklFKE8pfTsKa2EuYWxsU2V0dGxlZD1mdW5jdGlvbihPKXtyZXR1cm4odGhpcyYmdGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiBrYT90aGlzOmthKS5JRShPLHt4UjpmdW5jdGlvbihTKXtyZXR1cm57c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOlN9fSx5UDpmdW5jdGlvbihTKXtyZXR1cm57c3RhdHVzOiJyZWplY3RlZCIscmVhc29uOlN9fX0pfTtrYS5JRT1mdW5jdGlvbihPLFMpe3ZhciBkYSxDLFA9bmV3IHRoaXMoZnVuY3Rpb24od2EsVGEpe2RhPXdhO0M9VGF9KSxSPTIsYmE9MCx1YT1bXSxKYT17fTtPPW4oTyk7Zm9yKHZhciB0YT1PLm5leHQoKTshdGEuZG9uZTtKYT17TXA6SmEuTXB9LHRhPU8ubmV4dCgpKXsodGE9dGEudmFsdWUpJiZ0YS50aGVufHwodGE9dGhpcy5yZXNvbHZlKHRhKSk7SmEuTXA9YmE7dHJ5e3RhLnRoZW4oZnVuY3Rpb24od2Epe3JldHVybiBmdW5jdGlvbihUYSl7dWFbd2EuTXBdPVM/Uy54UihUYSk6VGE7Ui0tOzA9PT1SJiZkYSh1YSl9fShKYSksZnVuY3Rpb24od2Epe3JldHVybiBmdW5jdGlvbihUYSl7Uz8KKHVhW3dhLk1wXT1TLnlQKFRhKSxSLS0sMD09PVImJmRhKHVhKSk6QyhUYSl9fShKYSkpfWNhdGNoKHdhKXtDKHdhKX1SKys7YmErK31SLT0yOzA9PT1SJiZkYSh1YSk7cmV0dXJuIFB9O2suT2JqZWN0LmRlZmluZVByb3BlcnR5KGthLnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJQcm9taXNlIn19KTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrYS5wcm90b3R5cGUsU3ltYm9sLnNwZWNpZXMse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBrYX19KTtrYS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihPLFMpe3ZhciBkYT10aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTtkYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBkYXx8KGRhPXRoaXMuY29uc3RydWN0b3J8fGthKTtkYT1uZXcgZGEobWEpO3ZhciBDPWIuY3VycmVudDtudWxsPT10aGlzW0pdPwp0aGlzW1FdLnB1c2goQyxkYSxPLFMpOnEodGhpcyxDLGRhLE8sUyk7cmV0dXJuIGRhfTtrYS5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24oTyl7cmV0dXJuIHRoaXMudGhlbihudWxsLE8pfTtrYS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbihPKXt2YXIgUz10aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTtTJiYiZnVuY3Rpb24iPT09dHlwZW9mIFN8fChTPWthKTtTPW5ldyBTKG1hKTtTW1VdPVU7dmFyIGRhPWIuY3VycmVudDtudWxsPT10aGlzW0pdP3RoaXNbUV0ucHVzaChkYSxTLE8sTyk6cSh0aGlzLGRhLFMsTyxPKTtyZXR1cm4gU307a2EucmVzb2x2ZT1rYS5yZXNvbHZlO2thLnJlamVjdD1rYS5yZWplY3Q7a2EucmFjZT1rYS5yYWNlO2thLmFsbD1rYS5hbGw7RT1hW0VdPWEuUHJvbWlzZTthLlByb21pc2U9a2E7dmFyICRhPXUoInRoZW5QYXRjaGVkIik7Yy5RUT1yO0UmJihyKEUpLHpiKGEsImZldGNoIixmdW5jdGlvbihPKXtyZXR1cm4gdihPKX0pKTtQcm9taXNlW2Iuc2MoInVuY2F1Z2h0UHJvbWlzZUVycm9ycyIpXT0KRDtyZXR1cm4ga2F9KTt2YXIgUGI9ZmIoInpvbmVUYXNrIik7CmZ1bmN0aW9uIFRiKGEsYixjLGQpe2Z1bmN0aW9uIGUocCl7dmFyIHE9cC5kYXRhO3EuS2hbMF09ZnVuY3Rpb24oKXt0cnl7cC5CYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtwLmRhdGEmJnAuZGF0YS5Db3x8KCJudW1iZXIiPT09dHlwZW9mIHEuY2k/ZGVsZXRlIG1bcS5jaV06cS5jaSYmKHEuY2lbUGJdPW51bGwpKX19O3EuY2k9Zy5hcHBseShhLHEuS2gpO3JldHVybiBwfWZ1bmN0aW9uIGYocCl7cmV0dXJuIGwocC5kYXRhLmNpKX12YXIgZz1udWxsLGw9bnVsbDtiKz1kO2MrPWQ7dmFyIG09e307Zz16YihhLGIsZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKHEscil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiByWzBdKXtxPVpvbmUuY3VycmVudC51dChiLHJbMF0se0NvOiJJbnRlcnZhbCI9PT1kLGRlbGF5OiJUaW1lb3V0Ij09PWR8fCJJbnRlcnZhbCI9PT1kP3JbMV18fDA6dm9pZCAwLEtoOnJ9LGUsZik7aWYoIXEpcmV0dXJuIHE7cj1xLmRhdGEuY2k7Im51bWJlciI9PT0KdHlwZW9mIHI/bVtyXT1xOnImJihyW1BiXT1xKTtyJiZyLmZ6JiZyLkt6JiYiZnVuY3Rpb24iPT09dHlwZW9mIHIuZnomJiJmdW5jdGlvbiI9PT10eXBlb2Ygci5LeiYmKHEuZno9ci5mei5iaW5kKHIpLHEuS3o9ci5Lei5iaW5kKHIpKTtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiByfHxyP3I6cX1yZXR1cm4gcC5hcHBseShhLHIpfX0pO2w9emIoYSxjLGZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihxLHIpe3E9clswXTtpZigibnVtYmVyIj09PXR5cGVvZiBxKXZhciB2PW1bcV07ZWxzZSh2PXEmJnFbUGJdKXx8KHY9cSk7diYmInN0cmluZyI9PT10eXBlb2Ygdi50eXBlPyJub3RTY2hlZHVsZWQiIT09di5zdGF0ZSYmKHYuUm4mJnYuZGF0YS5Db3x8MD09PXYucWspJiYoIm51bWJlciI9PT10eXBlb2YgcT9kZWxldGUgbVtxXTpxJiYocVtQYl09bnVsbCksdi5sYS5HZyh2KSk6cC5hcHBseShhLHIpfX0pfTtab25lLmxjKCJ0b1N0cmluZyIsZnVuY3Rpb24oYSl7dmFyIGI9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLGM9ZmIoIk9yaWdpbmFsRGVsZWdhdGUiKSxkPWZiKCJQcm9taXNlIiksZT1mYigiRXJyb3IiKSxmPWZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzKXt2YXIgbD10aGlzW2NdO2lmKGwpcmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBsP2IuY2FsbChsKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobCk7aWYodGhpcz09PVByb21pc2UmJihsPWFbZF0pfHx0aGlzPT09RXJyb3ImJihsPWFbZV0pKXJldHVybiBiLmNhbGwobCl9cmV0dXJuIGIuY2FsbCh0aGlzKX07ZltjXT1iO0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1mO3ZhciBnPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgUHJvbWlzZT8iW29iamVjdCBQcm9taXNlXSI6Zy5jYWxsKHRoaXMpfX0pOy8qCgogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogQHBhcmFtIHshX1pvbmVQcml2YXRlfSBhcGkKIEBwYXJhbSB7P30gdGFyZ2V0CiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0TmFtZQogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZAogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gY2FsbGJhY2tzCiBAcmV0dXJuIHt2b2lkfQoqLwpmdW5jdGlvbiBVYihhLGIsYyxkLGUpe3ZhciBmPVpvbmUuc2MoZCk7aWYoIWJbZl0pe3ZhciBnPWJbZl09YltkXTtiW2RdPWZ1bmN0aW9uKGwsbSxwKXttJiZtLnByb3RvdHlwZSYmZS5mb3JFYWNoKGZ1bmN0aW9uKHEpe3ZhciByPWMrIi4iK2QrIjo6IitxLHY9bS5wcm90b3R5cGU7aWYodi5oYXNPd25Qcm9wZXJ0eShxKSl7dmFyIHc9YS5Mayh2LHEpO3cmJncudmFsdWU/KHcudmFsdWU9YS5LcCh3LnZhbHVlLHIpLGEubXcobS5wcm90b3R5cGUscSx3KSk6dltxXSYmKHZbcV09YS5LcCh2W3FdLHIpKX1lbHNlIHZbcV0mJih2W3FdPWEuS3AodltxXSxyKSl9KTtyZXR1cm4gZy5jYWxsKGIsbCxtLHApfTthLk9FKGJbZF0sZyl9fTt2YXIgVmI9ImFic29sdXRlZGV2aWNlb3JpZW50YXRpb24gYWZ0ZXJpbnB1dCBhZnRlcnByaW50IGFwcGluc3RhbGxlZCBiZWZvcmVpbnN0YWxscHJvbXB0IGJlZm9yZXByaW50IGJlZm9yZXVubG9hZCBkZXZpY2VsaWdodCBkZXZpY2Vtb3Rpb24gZGV2aWNlb3JpZW50YXRpb24gZGV2aWNlb3JpZW50YXRpb25hYnNvbHV0ZSBkZXZpY2Vwcm94aW1pdHkgaGFzaGNoYW5nZSBsYW5ndWFnZWNoYW5nZSBtZXNzYWdlIG1vemJlZm9yZXBhaW50IG9mZmxpbmUgb25saW5lIHBhaW50IHBhZ2VzaG93IHBhZ2VoaWRlIHBvcHN0YXRlIHJlamVjdGlvbmhhbmRsZWQgc3RvcmFnZSB1bmhhbmRsZWRyZWplY3Rpb24gdW5sb2FkIHVzZXJwcm94aW1pdHkgdnJkaXNwbGF5Y29ubmVjdGVkIHZyZGlzcGxheWRpc2Nvbm5lY3RlZCB2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIi5zcGxpdCgiICIpLFdiPVsiZW5jcnlwdGVkIiwid2FpdGluZ2ZvcmtleSIsIm1zbmVlZGtleSIsIm1vemludGVycnVwdGJlZ2luIiwKIm1vemludGVycnVwdGVuZCJdLFhiPVsibG9hZCJdLFpiPSJibHVyIGVycm9yIGZvY3VzIGxvYWQgcmVzaXplIHNjcm9sbCBtZXNzYWdlZXJyb3IiLnNwbGl0KCIgIiksJGI9WyJib3VuY2UiLCJmaW5pc2giLCJzdGFydCJdLGFjPSJsb2Fkc3RhcnQgcHJvZ3Jlc3MgYWJvcnQgZXJyb3IgbG9hZCBwcm9ncmVzcyB0aW1lb3V0IGxvYWRlbmQgcmVhZHlzdGF0ZWNoYW5nZSIuc3BsaXQoIiAiKSxiYz0idXBncmFkZW5lZWRlZCBjb21wbGV0ZSBhYm9ydCBzdWNjZXNzIGVycm9yIGJsb2NrZWQgdmVyc2lvbmNoYW5nZSBjbG9zZSIuc3BsaXQoIiAiKSxjYz1bImNsb3NlIiwiZXJyb3IiLCJvcGVuIiwibWVzc2FnZSJdLGRjPVsiZXJyb3IiLCJtZXNzYWdlIl0sZWM9ImFib3J0IGFuaW1hdGlvbmNhbmNlbCBhbmltYXRpb25lbmQgYW5pbWF0aW9uaXRlcmF0aW9uIGF1eGNsaWNrIGJlZm9yZWlucHV0IGJsdXIgY2FuY2VsIGNhbnBsYXkgY2FucGxheXRocm91Z2ggY2hhbmdlIGNvbXBvc2l0aW9uc3RhcnQgY29tcG9zaXRpb251cGRhdGUgY29tcG9zaXRpb25lbmQgY3VlY2hhbmdlIGNsaWNrIGNsb3NlIGNvbnRleHRtZW51IGN1cmVjaGFuZ2UgZGJsY2xpY2sgZHJhZyBkcmFnZW5kIGRyYWdlbnRlciBkcmFnZXhpdCBkcmFnbGVhdmUgZHJhZ292ZXIgZHJvcCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuZGVkIGVycm9yIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgZ290cG9pbnRlcmNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlkb3duIGtleXByZXNzIGtleXVwIGxvYWQgbG9hZHN0YXJ0IGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9zdHBvaW50ZXJjYXB0dXJlIG1vdXNlZG93biBtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlIG1vdXNlb3V0IG1vdXNlb3ZlciBtb3VzZXVwIG1vdXNld2hlZWwgb3JpZW50YXRpb25jaGFuZ2UgcGF1c2UgcGxheSBwbGF5aW5nIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcmVudGVyIHBvaW50ZXJsZWF2ZSBwb2ludGVybG9ja2NoYW5nZSBtb3pwb2ludGVybG9ja2NoYW5nZSB3ZWJraXRwb2ludGVybG9ja2VyY2hhbmdlIHBvaW50ZXJsb2NrZXJyb3IgbW96cG9pbnRlcmxvY2tlcnJvciB3ZWJraXRwb2ludGVybG9ja2Vycm9yIHBvaW50ZXJtb3ZlIHBvaW50b3V0IHBvaW50ZXJvdmVyIHBvaW50ZXJ1cCBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2V0IHJlc2l6ZSBzY3JvbGwgc2Vla2VkIHNlZWtpbmcgc2VsZWN0IHNlbGVjdGlvbmNoYW5nZSBzZWxlY3RzdGFydCBzaG93IHNvcnQgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB0b3VjaGNhbmNlbCB0b3VjaG1vdmUgdG91Y2hzdGFydCB0b3VjaGVuZCB0cmFuc2l0aW9uY2FuY2VsIHRyYW5zaXRpb25lbmQgd2FpdGluZyB3aGVlbCIuc3BsaXQoIiAiKS5jb25jYXQoWyJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsCiJ3ZWJnbGNvbnRleHRsb3N0Iiwid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciJdLFsiYXV0b2NvbXBsZXRlIiwiYXV0b2NvbXBsZXRlZXJyb3IiXSxbInRvZ2dsZSJdLCJhZnRlcnNjcmlwdGV4ZWN1dGUgYmVmb3Jlc2NyaXB0ZXhlY3V0ZSBET01Db250ZW50TG9hZGVkIGZyZWV6ZSBmdWxsc2NyZWVuY2hhbmdlIG1vemZ1bGxzY3JlZW5jaGFuZ2Ugd2Via2l0ZnVsbHNjcmVlbmNoYW5nZSBtc2Z1bGxzY3JlZW5jaGFuZ2UgZnVsbHNjcmVlbmVycm9yIG1vemZ1bGxzY3JlZW5lcnJvciB3ZWJraXRmdWxsc2NyZWVuZXJyb3IgbXNmdWxsc2NyZWVuZXJyb3IgcmVhZHlzdGF0ZWNoYW5nZSB2aXNpYmlsaXR5Y2hhbmdlIHJlc3VtZSIuc3BsaXQoIiAiKSxWYiwiYmVmb3JlY29weSBiZWZvcmVjdXQgYmVmb3JlcGFzdGUgY29weSBjdXQgcGFzdGUgZHJhZ3N0YXJ0IGxvYWRlbmQgYW5pbWF0aW9uc3RhcnQgc2VhcmNoIHRyYW5zaXRpb25ydW4gdHJhbnNpdGlvbnN0YXJ0IHdlYmtpdGFuaW1hdGlvbmVuZCB3ZWJraXRhbmltYXRpb25pdGVyYXRpb24gd2Via2l0YW5pbWF0aW9uc3RhcnQgd2Via2l0dHJhbnNpdGlvbmVuZCIuc3BsaXQoIiAiKSwKImFjdGl2YXRlIGFmdGVydXBkYXRlIGFyaWFyZXF1ZXN0IGJlZm9yZWFjdGl2YXRlIGJlZm9yZWRlYWN0aXZhdGUgYmVmb3JlZWRpdGZvY3VzIGJlZm9yZXVwZGF0ZSBjZWxsY2hhbmdlIGNvbnRyb2xzZWxlY3QgZGF0YWF2YWlsYWJsZSBkYXRhc2V0Y2hhbmdlZCBkYXRhc2V0Y29tcGxldGUgZXJyb3J1cGRhdGUgZmlsdGVyY2hhbmdlIGxheW91dGNvbXBsZXRlIGxvc2VjYXB0dXJlIG1vdmUgbW92ZWVuZCBtb3Zlc3RhcnQgcHJvcGVydHljaGFuZ2UgcmVzaXplZW5kIHJlc2l6ZXN0YXJ0IHJvd2VudGVyIHJvd2V4aXQgcm93c2RlbGV0ZSByb3dzaW5zZXJ0ZWQgY29tbWFuZCBjb21wYXNzbmVlZHNjYWxpYnJhdGlvbiBkZWFjdGl2YXRlIGhlbHAgbXNjb250ZW50em9vbSBtc21hbmlwdWxhdGlvbnN0YXRlY2hhbmdlZCBtc2dlc3R1cmVjaGFuZ2UgbXNnZXN0dXJlZG91YmxldGFwIG1zZ2VzdHVyZWVuZCBtc2dlc3R1cmVob2xkIG1zZ2VzdHVyZXN0YXJ0IG1zZ2VzdHVyZXRhcCBtc2dvdHBvaW50ZXJjYXB0dXJlIG1zaW5lcnRpYXN0YXJ0IG1zbG9zdHBvaW50ZXJjYXB0dXJlIG1zcG9pbnRlcmNhbmNlbCBtc3BvaW50ZXJkb3duIG1zcG9pbnRlcmVudGVyIG1zcG9pbnRlcmhvdmVyIG1zcG9pbnRlcmxlYXZlIG1zcG9pbnRlcm1vdmUgbXNwb2ludGVyb3V0IG1zcG9pbnRlcm92ZXIgbXNwb2ludGVydXAgcG9pbnRlcm91dCBtc3NpdGVtb2RlanVtcGxpc3RpdGVtcmVtb3ZlZCBtc3RodW1ibmFpbGNsaWNrIHN0b3Agc3RvcmFnZWNvbW1pdCIuc3BsaXQoIiAiKSk7CmZ1bmN0aW9uIGZjKGEsYixjKXtpZighY3x8MD09PWMubGVuZ3RoKXJldHVybiBiO2M9Yy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFyZ2V0PT09YX0pO2lmKCFjfHwwPT09Yy5sZW5ndGgpcmV0dXJuIGI7dmFyIGQ9Y1swXS5hUTtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuLTE9PT1kLmluZGV4T2YoZSl9KX1mdW5jdGlvbiBnYyhhLGIsYyxkKXthJiYoYj1mYyhhLGIsYyksdmIoYSxiLGQpKX07Wm9uZS5sYygidXRpbCIsZnVuY3Rpb24oYSxiLGMpe2MuZkg9dmI7Yy5lSD16YjtjLk9PPWtiO2MuZEg9QWI7dmFyIGQ9Yi5zYygiQkxBQ0tfTElTVEVEX0VWRU5UUyIpLGU9Yi5zYygiVU5QQVRDSEVEX0VWRU5UUyIpO2FbZV0mJihhW2RdPWFbZV0pO2FbZF0mJihiW2RdPWJbZV09YVtkXSk7Yy5jSD1PYjtjLlpvPU1iO2MuZ0c9RGI7Yy5Laz1YYTtjLkxrPVdhO2MuVno9WmE7Yy5Uej1hYjtjLmJIPXhiO2MuS3A9ZWI7Yy5FUD1mYztjLk9FPW5iO2MubXc9T2JqZWN0LmRlZmluZVByb3BlcnR5O2MuWXk9VWI7Yy5PZz1mdW5jdGlvbigpe3JldHVybntUUDpJYixHSTpIYixZeDplYyx5YTpxYixLczpyYixrUTpwYixXejoidHJ1ZSIsVXo6ImZhbHNlIixYejpkYixJSToiYWRkRXZlbnRMaXN0ZW5lciIsTEk6InJlbW92ZUV2ZW50TGlzdGVuZXIifX19KTt2YXIgaGMsamMsa2MsbGMsbWM7CmZ1bmN0aW9uIG5jKCl7aGM9Wm9uZS5zYztqYz1PYmplY3RbaGMoImRlZmluZVByb3BlcnR5IildPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtrYz1PYmplY3RbaGMoImdldE93blByb3BlcnR5RGVzY3JpcHRvciIpXT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2xjPU9iamVjdC5jcmVhdGU7bWM9aGMoInVuY29uZmlndXJhYmxlcyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbihhLGIsYyl7aWYoYSYmYVttY10mJmFbbWNdW2JdKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICciK2IrIicgb2YgIithKTt2YXIgZD1jLmNvbmZpZ3VyYWJsZTsicHJvdG90eXBlIiE9PWImJihjPW9jKGEsYixjKSk7cmV0dXJuIHBjKGEsYixjLGQpfTtPYmplY3QuZGVmaW5lUHJvcGVydGllcz1mdW5jdGlvbihhLGIpe09iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYyxiW2NdKX0pOwpyZXR1cm4gYX07T2JqZWN0LmNyZWF0ZT1mdW5jdGlvbihhLGIpeyJvYmplY3QiIT09dHlwZW9mIGJ8fE9iamVjdC5pc0Zyb3plbihiKXx8T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihjKXtiW2NdPW9jKGEsYyxiW2NdKX0pO3JldHVybiBsYyhhLGIpfTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yPWZ1bmN0aW9uKGEsYil7dmFyIGM9a2MoYSxiKTtjJiZhJiZhW21jXSYmYVttY11bYl0mJihjLmNvbmZpZ3VyYWJsZT0hMSk7cmV0dXJuIGN9fWZ1bmN0aW9uIHFjKGEsYixjKXt2YXIgZD1jLmNvbmZpZ3VyYWJsZTtjPW9jKGEsYixjKTtyZXR1cm4gcGMoYSxiLGMsZCl9ZnVuY3Rpb24gb2MoYSxiLGMpe09iamVjdC5pc0Zyb3plbihjKXx8KGMuY29uZmlndXJhYmxlPSEwKTtjLmNvbmZpZ3VyYWJsZXx8KGFbbWNdfHxPYmplY3QuaXNGcm96ZW4oYSl8fGpjKGEsbWMse3dyaXRhYmxlOiEwLHZhbHVlOnt9fSksYVttY10mJihhW21jXVtiXT0hMCkpO3JldHVybiBjfQpmdW5jdGlvbiBwYyhhLGIsYyxkKXt0cnl7cmV0dXJuIGpjKGEsYixjKX1jYXRjaChlKXtpZihjLmNvbmZpZ3VyYWJsZSl7InVuZGVmaW5lZCI9PXR5cGVvZiBkP2RlbGV0ZSBjLmNvbmZpZ3VyYWJsZTpjLmNvbmZpZ3VyYWJsZT1kO3RyeXtyZXR1cm4gamMoYSxiLGMpfWNhdGNoKGYpe2Q9bnVsbDt0cnl7ZD1KU09OLnN0cmluZ2lmeShjKX1jYXRjaChnKXtkPWMudG9TdHJpbmcoKX1jb25zb2xlLmxvZygiQXR0ZW1wdGluZyB0byBjb25maWd1cmUgJyIrYisiJyB3aXRoIGRlc2NyaXB0b3IgJyIrZCsiJyBvbiBvYmplY3QgJyIrYSsiJyBhbmQgZ290IGVycm9yLCBnaXZpbmcgdXA6ICIrZil9fWVsc2UgdGhyb3cgZTt9fTtmdW5jdGlvbiByYyhhLGIpe3ZhciBjPWIuT2coKSxkPWMuWXgsZT1jLlRQLGY9Yy5HSSxnPWMuV3osbD1jLlV6LG09Yy5YeixwPSJBcHBsaWNhdGlvbkNhY2hlIEV2ZW50U291cmNlIEZpbGVSZWFkZXIgSW5wdXRNZXRob2RDb250ZXh0IE1lZGlhQ29udHJvbGxlciBNZXNzYWdlUG9ydCBOb2RlIFBlcmZvcm1hbmNlIFNWR0VsZW1lbnRJbnN0YW5jZSBTaGFyZWRXb3JrZXIgVGV4dFRyYWNrIFRleHRUcmFja0N1ZSBUZXh0VHJhY2tMaXN0IFdlYktpdE5hbWVkRmxvdyBXaW5kb3cgV29ya2VyIFdvcmtlckdsb2JhbFNjb3BlIFhNTEh0dHBSZXF1ZXN0IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgWE1MSHR0cFJlcXVlc3RVcGxvYWQgSURCUmVxdWVzdCBJREJPcGVuREJSZXF1ZXN0IElEQkRhdGFiYXNlIElEQlRyYW5zYWN0aW9uIElEQkN1cnNvciBEQkluZGV4IFdlYlNvY2tldCIuc3BsaXQoIiAiKTtjPVtdO3ZhciBxPSJBbmNob3IgQXJlYSBBdWRpbyBCUiBCYXNlIEJhc2VGb250IEJvZHkgQnV0dG9uIENhbnZhcyBDb250ZW50IERMaXN0IERpcmVjdG9yeSBEaXYgRW1iZWQgRmllbGRTZXQgRm9udCBGb3JtIEZyYW1lIEZyYW1lU2V0IEhSIEhlYWQgSGVhZGluZyBIdG1sIElGcmFtZSBJbWFnZSBJbnB1dCBLZXlnZW4gTEkgTGFiZWwgTGVnZW5kIExpbmsgTWFwIE1hcnF1ZWUgTWVkaWEgTWVudSBNZXRhIE1ldGVyIE1vZCBPTGlzdCBPYmplY3QgT3B0R3JvdXAgT3B0aW9uIE91dHB1dCBQYXJhZ3JhcGggUHJlIFByb2dyZXNzIFF1b3RlIFNjcmlwdCBTZWxlY3QgU291cmNlIFNwYW4gU3R5bGUgVGFibGVDYXB0aW9uIFRhYmxlQ2VsbCBUYWJsZUNvbCBUYWJsZSBUYWJsZVJvdyBUYWJsZVNlY3Rpb24gVGV4dEFyZWEgVGl0bGUgVHJhY2sgVUxpc3QgVW5rbm93biBWaWRlbyIuc3BsaXQoIiAiKTsKYS53dGY/Yz1xLm1hcChmdW5jdGlvbihFKXtyZXR1cm4iSFRNTCIrRSsiRWxlbWVudCJ9KS5jb25jYXQocCk6YS5FdmVudFRhcmdldD9jLnB1c2goIkV2ZW50VGFyZ2V0Iik6Yz1wO3ZhciByPWEuX19ab25lX2Rpc2FibGVfSUVfY2hlY2t8fCExLHY9YS5fX1pvbmVfZW5hYmxlX2Nyb3NzX2NvbnRleHRfY2hlY2t8fCExLHc9Yi5nRygpLHg9e01TUG9pbnRlckNhbmNlbDoicG9pbnRlcmNhbmNlbCIsTVNQb2ludGVyRG93bjoicG9pbnRlcmRvd24iLE1TUG9pbnRlckVudGVyOiJwb2ludGVyZW50ZXIiLE1TUG9pbnRlckhvdmVyOiJwb2ludGVyaG92ZXIiLE1TUG9pbnRlckxlYXZlOiJwb2ludGVybGVhdmUiLE1TUG9pbnRlck1vdmU6InBvaW50ZXJtb3ZlIixNU1BvaW50ZXJPdXQ6InBvaW50ZXJvdXQiLE1TUG9pbnRlck92ZXI6InBvaW50ZXJvdmVyIixNU1BvaW50ZXJVcDoicG9pbnRlcnVwIn07Zm9yKHA9MDtwPGQubGVuZ3RoO3ArKyl7dmFyIHU9ZFtwXSxEPW0rKHUrbCksSD1tKyh1KwpnKTtmW3VdPXt9O2ZbdV1bbF09RDtmW3VdW2ddPUh9Zm9yKGY9MDtmPHEubGVuZ3RoO2YrKylmb3IoZz1xW2ZdLGw9ZVtnXT17fSxtPTA7bTxkLmxlbmd0aDttKyspcD1kW21dLGxbcF09ZysiLmFkZEV2ZW50TGlzdGVuZXI6IitwO2Q9W107Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylxPWFbY1tlXV0sZC5wdXNoKHEmJnEucHJvdG90eXBlKTtiLlpvKGEsZCx7RFI6ZnVuY3Rpb24oRSxOLE0sSil7aWYoIXImJncpaWYodil0cnl7dmFyIFE9Ti50b1N0cmluZygpO2lmKCJbb2JqZWN0IEZ1bmN0aW9uV3JhcHBlcl0iPT09UXx8ImZ1bmN0aW9uIF9fQlJPV1NFUlRPT0xTX0NPTlNPTEVfU0FGRUZVTkMoKSB7IFtuYXRpdmUgY29kZV0gfSI9PVEpcmV0dXJuIEUuYXBwbHkoTSxKKSwhMX1jYXRjaChVKXtyZXR1cm4gRS5hcHBseShNLEopLCExfWVsc2V7aWYoTj1OLnRvU3RyaW5nKCksIltvYmplY3QgRnVuY3Rpb25XcmFwcGVyXSI9PT1OfHwiZnVuY3Rpb24gX19CUk9XU0VSVE9PTFNfQ09OU09MRV9TQUZFRlVOQygpIHsgW25hdGl2ZSBjb2RlXSB9Ij09Ck4pcmV0dXJuIEUuYXBwbHkoTSxKKSwhMX1lbHNlIGlmKHYpdHJ5e04udG9TdHJpbmcoKX1jYXRjaChVKXtyZXR1cm4gRS5hcHBseShNLEopLCExfXJldHVybiEwfSxLaTpmdW5jdGlvbihFKXtyZXR1cm4geFtFXXx8RX19KTtab25lW2Iua2UoInBhdGNoRXZlbnRUYXJnZXQiKV09ISFhLkV2ZW50VGFyZ2V0fTtmdW5jdGlvbiB0YyhhLGIpe3ZhciBjPWEuT2coKSxkPWMuSUksZT1jLkxJLGY9Yi5XZWJTb2NrZXQ7Yi5FdmVudFRhcmdldHx8YS5abyhiLFtmLnByb3RvdHlwZV0pO2IuV2ViU29ja2V0PWZ1bmN0aW9uKGwsbSl7dmFyIHA9MTxhcmd1bWVudHMubGVuZ3RoP25ldyBmKGwsbSk6bmV3IGYobCkscT1hLkxrKHAsIm9ubWVzc2FnZSIpO2lmKHEmJiExPT09cS5jb25maWd1cmFibGUpe3ZhciByPWEuVnoocCk7dmFyIHY9cDtbZCxlLCJzZW5kIiwiY2xvc2UiXS5mb3JFYWNoKGZ1bmN0aW9uKHcpe3Jbd109ZnVuY3Rpb24oKXt2YXIgeD1hLlR6LmNhbGwoYXJndW1lbnRzKTtpZih3PT09ZHx8dz09PWUpe3ZhciB1PTA8eC5sZW5ndGg/eFswXTp2b2lkIDA7dSYmKHU9Wm9uZS5zYygiT05fUFJPUEVSVFkiK3UpLHBbdV09clt1XSl9cmV0dXJuIHBbd10uYXBwbHkocCx4KX19KX1lbHNlIHI9cDthLmZIKHIsWyJjbG9zZSIsImVycm9yIiwibWVzc2FnZSIsIm9wZW4iXSx2KTtyZXR1cm4gcn07Yz0KYi5XZWJTb2NrZXQ7Zm9yKHZhciBnIGluIGYpY1tnXT1mW2ddfTtmdW5jdGlvbiB1YyhhLGIpe3ZhciBjPWEuT2coKSxkPWMuS3M7aWYoKGMueWF8fGQpJiYhYS5MayhIVE1MRWxlbWVudC5wcm90b3R5cGUsIm9uY2xpY2siKSYmInVuZGVmaW5lZCIhPT10eXBlb2YgRWxlbWVudCl7aWYoKGM9YS5MayhFbGVtZW50LnByb3RvdHlwZSwib25jbGljayIpKSYmIWMuY29uZmlndXJhYmxlKXJldHVybiExO2lmKGMpcmV0dXJuIGEuS2soRWxlbWVudC5wcm90b3R5cGUsIm9uY2xpY2siLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KSxkPSEhZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikub25jbGljayxhLktrKEVsZW1lbnQucHJvdG90eXBlLCJvbmNsaWNrIixjKSxkfXZhciBlPWIuWE1MSHR0cFJlcXVlc3Q7aWYoIWUpcmV0dXJuITE7Yz1lLnByb3RvdHlwZTtpZihkPWEuTGsoYywib25yZWFkeXN0YXRlY2hhbmdlIikpcmV0dXJuIGEuS2soYywib25yZWFkeXN0YXRlY2hhbmdlIix7ZW51bWVyYWJsZTohMCwKY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiEwfX0pLGU9ISEobmV3IGUpLm9ucmVhZHlzdGF0ZWNoYW5nZSxhLktrKGMsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsZHx8e30pLGU7dmFyIGY9YS5rZSgiZmFrZSIpO2EuS2soYywib25yZWFkeXN0YXRlY2hhbmdlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZl19LHNldDpmdW5jdGlvbihnKXt0aGlzW2ZdPWd9fSk7YT1uZXcgZTtjPWZ1bmN0aW9uKCl7fTthLm9ucmVhZHlzdGF0ZWNoYW5nZT1jO2M9YVtmXT09PWM7YS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDtyZXR1cm4gY30KZnVuY3Rpb24gdmMoYSl7Zm9yKHZhciBiPWEuT2coKS5ZeCxjPWEua2UoInVuYm91bmQiKSxkPXt9LGU9MDtlPGIubGVuZ3RoO2Q9e2xnOmQubGd9LGUrKyl7dmFyIGY9YltlXTtkLmxnPSJvbiIrZjtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbihnKXtyZXR1cm4gZnVuY3Rpb24obCl7bD1sLnRhcmdldDt2YXIgbTtmb3IobT1sP2wuY29uc3RydWN0b3IubmFtZSsiLiIrZy5sZzoidW5rbm93bi4iK2cubGc7bDspe2lmKGxbZy5sZ10mJiFsW2cubGddW2NdKXt2YXIgcD1hLktwKGxbZy5sZ10sbSk7cFtjXT1sW2cubGddO2xbZy5sZ109cH1sPWwucGFyZW50RWxlbWVudH19fShkKSwhMCl9fTsoZnVuY3Rpb24oYSl7YVsoYS5fX1pvbmVfc3ltYm9sX3ByZWZpeHx8Il9fem9uZV9zeW1ib2xfXyIpKyJsZWdhY3lQYXRjaCJdPWZ1bmN0aW9uKCl7dmFyIGI9YS5ab25lO2IubGMoImRlZmluZVByb3BlcnR5IixmdW5jdGlvbihjLGQsZSl7ZS5tdz1xYztuYygpfSk7Yi5sYygicmVnaXN0ZXJFbGVtZW50IixmdW5jdGlvbihjLGQsZSl7ZD1lLk9nKCk7dmFyIGY9ZC5LczsoZC55YXx8ZikmJiJyZWdpc3RlckVsZW1lbnQiaW4gYy5kb2N1bWVudCYmZS5ZeShlLGRvY3VtZW50LCJEb2N1bWVudCIsInJlZ2lzdGVyRWxlbWVudCIsWyJjcmVhdGVkQ2FsbGJhY2siLCJhdHRhY2hlZENhbGxiYWNrIiwiZGV0YWNoZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayJdKX0pO2IubGMoIkV2ZW50VGFyZ2V0TGVnYWN5IixmdW5jdGlvbihjLGQsZSl7cmMoYyxlKTtkPWUuT2coKTt2YXIgZj1kLktzO2Qua1EmJiFmfHx1YyhlLGMpfHwoZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBXZWJTb2NrZXQsCnZjKGUpLGUuYkgoIlhNTEh0dHBSZXF1ZXN0IiksZCYmdGMoZSxjKSxab25lW2Uua2UoInBhdGNoRXZlbnRzIildPSEwKX0pfX0pKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9PXR5cGVvZiBzZWxmP3NlbGY6e30pO1pvbmUubGMoImxlZ2FjeSIsZnVuY3Rpb24oYSl7KGE9YVtab25lLnNjKCJsZWdhY3lQYXRjaCIpXSkmJmEoKX0pO1pvbmUubGMoInRpbWVycyIsZnVuY3Rpb24oYSl7VGIoYSwic2V0IiwiY2xlYXIiLCJUaW1lb3V0Iik7VGIoYSwic2V0IiwiY2xlYXIiLCJJbnRlcnZhbCIpO1RiKGEsInNldCIsImNsZWFyIiwiSW1tZWRpYXRlIil9KTtab25lLmxjKCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLGZ1bmN0aW9uKGEpe1RiKGEsInJlcXVlc3QiLCJjYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpO1RiKGEsIm1velJlcXVlc3QiLCJtb3pDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpO1RiKGEsIndlYmtpdFJlcXVlc3QiLCJ3ZWJraXRDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpfSk7ClpvbmUubGMoImJsb2NraW5nIixmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bImFsZXJ0IiwicHJvbXB0IiwiY29uZmlybSJdLGQ9MDtkPGMubGVuZ3RoO2QrKyl6YihhLGNbZF0sZnVuY3Rpb24oZSxmLGcpe3JldHVybiBmdW5jdGlvbihsLG0pe3JldHVybiBiLmN1cnJlbnQuZ2EoZSxhLG0sZyl9fSl9KTsKWm9uZS5sYygiRXZlbnRUYXJnZXQiLGZ1bmN0aW9uKGEsYixjKXtjLmNIKGEsYyk7aWYoIVpvbmVbYy5rZSgicGF0Y2hFdmVudFRhcmdldCIpXSl7dmFyIGQ9Yy5PZygpO2I9ZC5ZeDt2YXIgZT1kLkdJLGY9ZC5XeixnPWQuVXo7ZD1kLlh6O2Zvcih2YXIgbD0wO2w8Yi5sZW5ndGg7bCsrKXt2YXIgbT1iW2xdLHA9ZCsobStnKSxxPWQrKG0rZik7ZVttXT17fTtlW21dW2ddPXA7ZVttXVtmXT1xfShiPWEuRXZlbnRUYXJnZXQpJiZiLnByb3RvdHlwZSYmYy5abyhhLFtiJiZiLnByb3RvdHlwZV0pfShiPWEuWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCkmJmIucHJvdG90eXBlJiZjLlpvKGEsW2IucHJvdG90eXBlXSk7eGIoIk11dGF0aW9uT2JzZXJ2ZXIiKTt4YigiV2ViS2l0TXV0YXRpb25PYnNlcnZlciIpO3hiKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIpO3hiKCJGaWxlUmVhZGVyIil9KTsKWm9uZS5sYygib25fcHJvcGVydHkiLGZ1bmN0aW9uKGEsYixjKXtpZigoIXBifHxyYikmJiFab25lW2Mua2UoInBhdGNoRXZlbnRzIildKXtiPSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYlNvY2tldDtjPWEuX19ab25lX2lnbm9yZV9vbl9wcm9wZXJ0aWVzO2lmKHFiKXt2YXIgZD13aW5kb3c7YTp7dHJ5e3ZhciBlPWhiLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoLTEhPT1lLmluZGV4T2YoIk1TSUUgIil8fC0xIT09ZS5pbmRleE9mKCJUcmlkZW50LyIpKXt2YXIgZj0hMDticmVhayBhfX1jYXRjaChnKXt9Zj0hMX1mPWY/W3t0YXJnZXQ6ZCxhUTpbImVycm9yIl19XTpbXTtnYyhkLGVjLmNvbmNhdChbIm1lc3NhZ2VlcnJvciJdKSxjP2MuY29uY2F0KGYpOmMsWWEoZCkpO2djKERvY3VtZW50LnByb3RvdHlwZSxlYyxjKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBkLlNWR0VsZW1lbnQmJmdjKGQuU1ZHRWxlbWVudC5wcm90b3R5cGUsZWMsYyk7Z2MoRWxlbWVudC5wcm90b3R5cGUsZWMsYyk7CmdjKEhUTUxFbGVtZW50LnByb3RvdHlwZSxlYyxjKTtnYyhIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSxXYixjKTtnYyhIVE1MRnJhbWVTZXRFbGVtZW50LnByb3RvdHlwZSxWYi5jb25jYXQoWmIpLGMpO2djKEhUTUxCb2R5RWxlbWVudC5wcm90b3R5cGUsVmIuY29uY2F0KFpiKSxjKTtnYyhIVE1MRnJhbWVFbGVtZW50LnByb3RvdHlwZSxYYixjKTtnYyhIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsWGIsYyk7KGY9ZC5IVE1MTWFycXVlZUVsZW1lbnQpJiZnYyhmLnByb3RvdHlwZSwkYixjKTsoZD1kLldvcmtlcikmJmdjKGQucHJvdG90eXBlLGRjLGMpfShkPWEuWE1MSHR0cFJlcXVlc3QpJiZnYyhkLnByb3RvdHlwZSxhYyxjKTsoYT1hLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQpJiZnYyhhJiZhLnByb3RvdHlwZSxhYyxjKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBJREJJbmRleCYmKGdjKElEQkluZGV4LnByb3RvdHlwZSxiYyxjKSxnYyhJREJSZXF1ZXN0LnByb3RvdHlwZSwKYmMsYyksZ2MoSURCT3BlbkRCUmVxdWVzdC5wcm90b3R5cGUsYmMsYyksZ2MoSURCRGF0YWJhc2UucHJvdG90eXBlLGJjLGMpLGdjKElEQlRyYW5zYWN0aW9uLnByb3RvdHlwZSxiYyxjKSxnYyhJREJDdXJzb3IucHJvdG90eXBlLGJjLGMpKTtiJiZnYyhXZWJTb2NrZXQucHJvdG90eXBlLGNjLGMpfX0pO1pvbmUubGMoImN1c3RvbUVsZW1lbnRzIixmdW5jdGlvbihhLGIsYyl7Yj1jLk9nKCk7dmFyIGQ9Yi5LczsoYi55YXx8ZCkmJmEuY3VzdG9tRWxlbWVudHMmJiJjdXN0b21FbGVtZW50cyJpbiBhJiZjLll5KGMsYS5jdXN0b21FbGVtZW50cywiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLFsiY29ubmVjdGVkQ2FsbGJhY2siLCJkaXNjb25uZWN0ZWRDYWxsYmFjayIsImFkb3B0ZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayJdKX0pOwpab25lLmxjKCJYSFIiLGZ1bmN0aW9uKGEsYil7KGZ1bmN0aW9uKG0pe2Z1bmN0aW9uIHAoTSl7dmFyIEo9TS5kYXRhLFE9Si50YXJnZXQ7UVtmXT0hMTtRW2xdPSExO3ZhciBVPVFbZV07d3x8KHc9UVtiYl0seD1RW2NiXSk7VSYmeC5jYWxsKFEsInJlYWR5c3RhdGVjaGFuZ2UiLFUpO1U9UVtlXT1mdW5jdGlvbigpe2lmKFEucmVhZHlTdGF0ZT09PVEuRE9ORSlpZighSi5hYm9ydGVkJiZRW2ZdJiYic2NoZWR1bGVkIj09PU0uc3RhdGUpe3ZhciByYT1RW2Iuc2MoImxvYWRmYWxzZSIpXTtpZihyYSYmMDxyYS5sZW5ndGgpe3ZhciBFYT1NLkJiO00uQmI9ZnVuY3Rpb24oKXtmb3IodmFyIEI9UVtiLnNjKCJsb2FkZmFsc2UiKV0sRz0wO0c8Qi5sZW5ndGg7RysrKUJbR109PT1NJiZCLnNwbGljZShHLDEpO0ouYWJvcnRlZHx8InNjaGVkdWxlZCIhPT1NLnN0YXRlfHxFYS5jYWxsKE0pfTtyYS5wdXNoKE0pfWVsc2UgTS5CYigpfWVsc2UgSi5hYm9ydGVkfHwhMSE9PVFbZl18fChRW2xdPSEwKX07CncuY2FsbChRLCJyZWFkeXN0YXRlY2hhbmdlIixVKTtRW2NdfHwoUVtjXT1NKTtFLmFwcGx5KFEsSi5LaCk7UVtmXT0hMDtyZXR1cm4gTX1mdW5jdGlvbiBxKCl7fWZ1bmN0aW9uIHIoTSl7TT1NLmRhdGE7TS5hYm9ydGVkPSEwO3JldHVybiBOLmFwcGx5KE0udGFyZ2V0LE0uS2gpfXZhciB2PW0uWE1MSHR0cFJlcXVlc3Q7aWYodil7dj12LnByb3RvdHlwZTt2YXIgdz12W2JiXSx4PXZbY2JdOyF3JiYobT1tLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQpJiYobT1tLnByb3RvdHlwZSx3PW1bYmJdLHg9bVtjYl0pO3ZhciB1PXpiKHYsIm9wZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKE0sSil7TVtkXT0wPT1KWzJdO01bZ109SlsxXTtyZXR1cm4gdS5hcHBseShNLEopfX0pLEQ9ZmIoImZldGNoVGFza0Fib3J0aW5nIiksSD1mYigiZmV0Y2hUYXNrU2NoZWR1bGluZyIpLEU9emIodiwic2VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oTSxKKXtpZighMD09PWIuY3VycmVudFtIXXx8Ck1bZF0pcmV0dXJuIEUuYXBwbHkoTSxKKTtKPXt0YXJnZXQ6TSx1cmw6TVtnXSxDbzohMSxLaDpKLGFib3J0ZWQ6ITF9O3ZhciBRPVpvbmUuY3VycmVudC51dCgiWE1MSHR0cFJlcXVlc3Quc2VuZCIscSxKLHAscik7TSYmITA9PT1NW2xdJiYhSi5hYm9ydGVkJiYic2NoZWR1bGVkIj09PVEuc3RhdGUmJlEuQmIoKX19KSxOPXpiKHYsImFib3J0IixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihNLEope3ZhciBRPU1bY107aWYoUSYmInN0cmluZyI9PXR5cGVvZiBRLnR5cGUpbnVsbD09US5Sbnx8US5kYXRhJiZRLmRhdGEuYWJvcnRlZHx8US5sYS5HZyhRKTtlbHNlIGlmKCEwPT09Yi5jdXJyZW50W0RdKXJldHVybiBOLmFwcGx5KE0sSil9fSl9fSkoYSk7dmFyIGM9ZmIoInhoclRhc2siKSxkPWZiKCJ4aHJTeW5jIiksZT1mYigieGhyTGlzdGVuZXIiKSxmPWZiKCJ4aHJTY2hlZHVsZWQiKSxnPWZiKCJ4aHJVUkwiKSxsPWZiKCJ4aHJFcnJvckJlZm9yZVNjaGVkdWxlZCIpfSk7ClpvbmUubGMoImdlb2xvY2F0aW9uIixmdW5jdGlvbihhKXthLm5hdmlnYXRvciYmYS5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJmxiKGEubmF2aWdhdG9yLmdlb2xvY2F0aW9uKX0pO1pvbmUubGMoIlByb21pc2VSZWplY3Rpb25FdmVudCIsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGQpe3JldHVybiBmdW5jdGlvbihlKXtOYihhLGQpLmZvckVhY2goZnVuY3Rpb24oZil7dmFyIGc9YS5Qcm9taXNlUmVqZWN0aW9uRXZlbnQ7ZyYmKGc9bmV3IGcoZCx7ZmU6ZS5mZSxyZWFzb246ZS5pen0pLGYuQmIoZykpfSl9fWEuUHJvbWlzZVJlamVjdGlvbkV2ZW50JiYoYltmYigidW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIiKV09YygidW5oYW5kbGVkcmVqZWN0aW9uIiksYltmYigicmVqZWN0aW9uSGFuZGxlZEhhbmRsZXIiKV09YygicmVqZWN0aW9uaGFuZGxlZCIpKX0pO1pvbmUubGMoImNhbnZhcyIsZnVuY3Rpb24oYSxiLGMpe2E9YS5IVE1MQ2FudmFzRWxlbWVudDsidW5kZWZpbmVkIiE9PXR5cGVvZiBhJiZhLnByb3RvdHlwZSYmYS5wcm90b3R5cGUudG9CbG9iJiZjLmRIKGEucHJvdG90eXBlLCJ0b0Jsb2IiLGZ1bmN0aW9uKGQsZSl7cmV0dXJue25hbWU6IkhUTUxDYW52YXNFbGVtZW50LnRvQmxvYiIsdGFyZ2V0OmQsWHI6MCxLaDplfX0pfSk7dmFyIHdjPXt9LHhjPSJfX1NFUF9UQUdfX0BbbmF0aXZlXSIsemM9ZnVuY3Rpb24oKXt0aGlzLmVycm9yPXljKCk7dGhpcy50aW1lc3RhbXA9bmV3IERhdGV9O2Z1bmN0aW9uIEFjKCl7cmV0dXJuIEVycm9yKCJTVEFDS1RSQUNFIFRSQUNLSU5HIil9ZnVuY3Rpb24gQmMoKXt0cnl7dGhyb3cgQWMoKTt9Y2F0Y2goYSl7cmV0dXJuIGF9fXZhciBDYz1CYygpLHljPUFjKCkuc3RhY2s/QWM6Q2Muc3RhY2s/QmM6QWM7ZnVuY3Rpb24gRGMoYSl7cmV0dXJuIGEuc3RhY2s/YS5zdGFjay5zcGxpdCgiXG4iKTpbXX0KZnVuY3Rpb24gRWMoYSxiKXtiPVtiP2IudHJpbSgpOiIiXTtpZihhKWZvcih2YXIgYz0obmV3IERhdGUpLmdldFRpbWUoKSxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBlPWFbZF0sZj1lLnRpbWVzdGFtcDtjPSJfX19fX19fX19fX19fX19fX19fX0VsYXBzZWQgIisoYy1mLmdldFRpbWUoKSkrIiBtczsgQXQ6ICIrZjtjPWMucmVwbGFjZSgvW15cd1xkXS9nLCJfIik7Yi5wdXNoKHhjLnJlcGxhY2UoIl9fU0VQX1RBR19fIixjKSk7ZT1EYyhlLmVycm9yKTtmb3IoYz0wO2M8ZS5sZW5ndGg7YysrKXdjLmhhc093blByb3BlcnR5KGVbY10pfHxiLnB1c2goZVtjXSk7Yz1mLmdldFRpbWUoKX1yZXR1cm4gYi5qb2luKCJcbiIpfQpab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWM9e25hbWU6Imxvbmctc3RhY2stdHJhY2UiLHNHOjEwLHdTOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPWFbWm9uZS5zYygiY3VycmVudFRhc2tUcmFjZSIpXTtyZXR1cm4gYj9FYyhiLGEuc3RhY2spOmEuc3RhY2t9fSx4aTpmdW5jdGlvbihhLGIsYyxkKXswPEVycm9yLnN0YWNrVHJhY2VMaW1pdCYmKGI9KGI9Wm9uZS5RbCkmJmIuZGF0YSYmYi5kYXRhLl9fY3JlYXRpb25UcmFjZV9ffHxbXSxiPVtuZXcgemNdLmNvbmNhdChiKSxiLmxlbmd0aD50aGlzLnNHJiYoYi5sZW5ndGg9dGhpcy5zRyksZC5kYXRhfHwoZC5kYXRhPXt9KSwiZXZlbnRUYXNrIj09PWQudHlwZSYmKGQuZGF0YT1PYmplY3QuYXNzaWduKHt9LGQuZGF0YSkpLGQuZGF0YS5fX2NyZWF0aW9uVHJhY2VfXz1iKTtyZXR1cm4gYS5maChjLGQpfSxaajpmdW5jdGlvbihhLGIsYyxkKXtpZigwPEVycm9yLnN0YWNrVHJhY2VMaW1pdCYmKGI9Wm9uZS5RbHx8ZC53cCxkIGluc3RhbmNlb2YKRXJyb3ImJmIpKXtiPUVjKGIuZGF0YSYmYi5kYXRhLl9fY3JlYXRpb25UcmFjZV9fLGQuc3RhY2spO3RyeXtkLnN0YWNrPWQuQlM9Yn1jYXRjaChlKXt9fXJldHVybiBhLmhhbmRsZUVycm9yKGMsZCl9fTtmdW5jdGlvbiBGYyhhLGIpezA8YiYmKGEucHVzaChEYygobmV3IHpjKS5lcnJvcikpLEZjKGEsYi0xKSl9aWYoMDxFcnJvci5zdGFja1RyYWNlTGltaXQpe3ZhciBHYz1bXTtGYyhHYywyKTtmb3IodmFyIEhjPUdjWzBdLEljPUdjWzFdLEpjPTA7SmM8SGMubGVuZ3RoO0pjKyspe3ZhciBLYz1IY1tKY107aWYoLTE9PUtjLmluZGV4T2YoIlNUQUNLVFJBQ0UgVFJBQ0tJTkciKSl7dmFyIExjPUtjLm1hdGNoKC9eXHMqYXRccysvKTtpZihMYyl7eGM9TGNbMF0rIl9fU0VQX1RBR19fIChodHRwOi8vbG9jYWxob3N0KSI7YnJlYWt9fX1mb3IodmFyIE1jPTA7TWM8SGMubGVuZ3RoO01jKyspe3ZhciBOYz1IY1tNY107aWYoTmM9PT1JY1tNY10pd2NbTmNdPSEwO2Vsc2UgYnJlYWt9fTsoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihsLG0pe2lmKCFsfHwhbSlyZXR1cm4gbnVsbDt2YXIgcD17fSxxO2ZvcihxIGluIGwpaWYobC5oYXNPd25Qcm9wZXJ0eShxKSl7dmFyIHI9bFtxXTtzd2l0Y2godHlwZW9mIHIpe2Nhc2UgIm9iamVjdCI6dmFyIHY9ciYmci5jb25zdHJ1Y3RvciYmci5jb25zdHJ1Y3Rvci5uYW1lO3I9dj09T2JqZWN0Lm5hbWU/YihyLG0tMSk6djticmVhaztjYXNlICJmdW5jdGlvbiI6cj1yLm5hbWV8fHZvaWQgMH1wW3FdPXJ9cmV0dXJuIHB9ZnVuY3Rpb24gYyhsKXt2YXIgbT1sLm5hbWU7Zm9yKGw9bC5wYXJlbnQ7bnVsbCE9bDspbT1sLm5hbWUrIjo6IittLGw9bC5wYXJlbnQ7cmV0dXJuIG19dmFyIGQ9bnVsbCxlPW51bGwsZj1mdW5jdGlvbigpe3ZhciBsPWEud3RmO3JldHVybiBsJiYoZD1sLnRyYWNlKT8oZT1kLmV2ZW50cywhMCk6ITF9KCksZz1mdW5jdGlvbigpe3RoaXMubmFtZT0iV1RGIn07Zy5wcm90b3R5cGUuV3M9ZnVuY3Rpb24obCxtLHAscSl7bD0KbC5DZShwLHEpO2cuTlAoYyhwKSxsLm5hbWUpO3JldHVybiBsfTtnLnByb3RvdHlwZS5lbT1mdW5jdGlvbihsLG0scCxxLHIsdix3KXttPXd8fCJ1bmtub3duIjt2YXIgeD1nLiRGW21dO3h8fCh4PWcuJEZbbV09ZS5nUCgiWm9uZTppbnZva2U6Iit3KyIoYXNjaWkgem9uZSkiKSk7cmV0dXJuIGQublEoeChjKHApKSxsLkJiKHAscSxyLHYsdykpfTtnLnByb3RvdHlwZS5aaj1mdW5jdGlvbihsLG0scCxxKXtyZXR1cm4gbC5oYW5kbGVFcnJvcihwLHEpfTtnLnByb3RvdHlwZS54aT1mdW5jdGlvbihsLG0scCxxKXt2YXIgcj1xLnR5cGUrIjoiK3Euc291cmNlOyhtPWcuREhbcl0pfHwobT1nLkRIW3JdPWUuaEYoIlpvbmU6c2NoZWR1bGU6IityKyIoYXNjaWkgem9uZSwgYW55IGRhdGEpIikpO2w9bC5maChwLHEpO20oYyhwKSxiKHEuZGF0YSwyKSk7cmV0dXJuIGx9O2cucHJvdG90eXBlLndpPWZ1bmN0aW9uKGwsbSxwLHEscix2KXttPXEuc291cmNlO3ZhciB3PWcuYUdbbV07d3x8KHc9CmcuYUdbbV09ZS5nUCgiWm9uZTppbnZva2VUYXNrOiIrbSsiKGFzY2lpIHpvbmUpIikpO3JldHVybiBkLm5RKHcoYyhwKSksbC5maShwLHEscix2KSl9O2cucHJvdG90eXBlLllqPWZ1bmN0aW9uKGwsbSxwLHEpe3ZhciByPXEuc291cmNlOyhtPWcuVkVbcl0pfHwobT1nLlZFW3JdPWUuaEYoIlpvbmU6Y2FuY2VsOiIrcisiKGFzY2lpIHpvbmUsIGFueSBvcHRpb25zKSIpKTtsPWwuR2cocCxxKTttKGMocCksYihxLmRhdGEsMikpO3JldHVybiBsfTtnLk5QPWY/ZS5oRigiWm9uZTpmb3JrKGFzY2lpIHpvbmUsIGFzY2lpIG5ld1pvbmUpIik6bnVsbDtnLkRIPXt9O2cuVkU9e307Zy4kRj17fTtnLmFHPXt9O1pvbmUud3RmWm9uZVNwZWM9Zj9uZXcgZzpudWxsfSkoIm9iamVjdCI9PT10eXBlb2Ygd2luZG93JiZ3aW5kb3d8fCJvYmplY3QiPT09dHlwZW9mIHNlbGYmJnNlbGZ8fGdsb2JhbCk7ZnVuY3Rpb24gT2MoYSl7Zm9yKHZhciBiIGluIGEpaWYoYVtiXT09PU9jKXJldHVybiBiO3Rocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCByZW5hbWVkIHByb3BlcnR5IG9uIHRhcmdldCBvYmplY3QuIik7fTtmdW5jdGlvbiBQYyhhKXtpZigic3RyaW5nIj09PXR5cGVvZiBhKXJldHVybiBhO2lmKEFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIlsiK2EubWFwKFBjKS5qb2luKCIsICIpKyJdIjtpZihudWxsPT1hKXJldHVybiIiK2E7aWYoYS5NUSlyZXR1cm4iIithLk1RO2lmKGEubmFtZSlyZXR1cm4iIithLm5hbWU7YT1hLnRvU3RyaW5nKCk7aWYobnVsbD09YSlyZXR1cm4iIithO3ZhciBiPWEuaW5kZXhPZigiXG4iKTtyZXR1cm4tMT09PWI/YTphLnN1YnN0cmluZygwLGIpfTt2YXIgUWM9T2Moe1l6Ok9jfSk7ZnVuY3Rpb24gUmMoYSl7YS5Zej1SYzthLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFBjKHRoaXMoKSl9O3JldHVybiBhfWZ1bmN0aW9uIFNjKGEpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYSYmYS5oYXNPd25Qcm9wZXJ0eShRYykmJmEuWXo9PT1SYz9hKCk6YX07ZnVuY3Rpb24gVGMoYSl7cmV0dXJue0w6YS5MLFk6YS5ZfHxudWxsLFY6YS5WLHZhbHVlOnZvaWQgMH19ZnVuY3Rpb24gVWMoYSl7dmFyIGI9YVtWY107KGI9YiYmYi5MPT09YT9iOm51bGwpfHwoYj0oYj1hW1djXSkmJmIuTD09PWE/YjpudWxsKTtyZXR1cm4gYn12YXIgVmM9T2Moe2hhOk9jfSk7T2Moe2NUOk9jfSk7T2Moe2dUOk9jfSk7dmFyIFdjPU9jKHtGUzpPY30pO09jKHtHUzpPY30pO3ZhciBYYz0idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyxZYz0idW5kZWZpbmVkIiE9PXR5cGVvZiBzZWxmJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZzZWxmLFpjPSJ1bmRlZmluZWQiIT09dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLCRjPSJ1bmRlZmluZWQiIT09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXN8fFpjfHxYY3x8WWM7dmFyIHk9ZnVuY3Rpb24oYSxiKXt0aGlzLnNLPWE7dGhpcy5oYT12b2lkIDA7Im51bWJlciI9PXR5cGVvZiBiP3RoaXMubWc9Yjp2b2lkIDAhPT1iJiYodGhpcy5oYT1UYyh7TDp0aGlzLFk6Yi5ZfHwicm9vdCIsVjpiLlZ9KSl9O3kucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkluamVjdGlvblRva2VuICIrdGhpcy5zS307ZnVuY3Rpb24gYWQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2QtMF09YXJndW1lbnRzW2RdO2lmKGEpe2M9YS5hcHBseShudWxsLGphKGMpKTtmb3IodmFyIGUgaW4gYyl0aGlzW2VdPWNbZV19fX0KZnVuY3Rpb24gYmQoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkKXtmb3IodmFyIGU9W10sZj0wO2Y8YXJndW1lbnRzLmxlbmd0aDsrK2YpZVtmLTBdPWFyZ3VtZW50c1tmXTtmPWZ1bmN0aW9uKGwsbSxwKXtmb3IobT1sLmhhc093blByb3BlcnR5KCJfX3BhcmFtZXRlcnNfXyIpP2wuX19wYXJhbWV0ZXJzX186T2JqZWN0LmRlZmluZVByb3BlcnR5KGwsIl9fcGFyYW1ldGVyc19fIix7dmFsdWU6W119KS5fX3BhcmFtZXRlcnNfXzttLmxlbmd0aDw9cDspbS5wdXNoKG51bGwpOyhtW3BdPW1bcF18fFtdKS5wdXNoKGcpO3JldHVybiBsfTtpZih0aGlzIGluc3RhbmNlb2YgYilyZXR1cm4gYy5hcHBseSh0aGlzLGUpLHRoaXM7dmFyIGc9bmV3IChGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5hcHBseShiLFtudWxsXS5jb25jYXQoamEoZSkpKSk7Zi5rUz1nO3JldHVybiBmfXZhciBjPWFkKGEpO3JldHVybiBiLmxTPWJ9KCl9O3ZhciBjZD1iZChmdW5jdGlvbihhKXtyZXR1cm57TDphfX0pLGRkPWJkKCksZWQ9YmQoKSxmZD1iZCgpO3ZhciBnZD1uZXcgeSgiSU5KRUNUT1IiLC0xKSxoZD17fSxpZD0vXG4vZ20samQ9T2Moe1lhOlN0cmluZyxrZDpPY30pLGtkPXZvaWQgMDtmdW5jdGlvbiBsZChhKXt2YXIgYj1rZDtrZD1hO3JldHVybiBifWZ1bmN0aW9uIG1kKGEsYil7Yj12b2lkIDA9PT1iPzA6YjthPVNjKGEpO2I9dm9pZCAwPT09Yj8wOmI7aWYodm9pZCAwPT09a2QpdGhyb3cgRXJyb3IoImluamVjdCgpIG11c3QgYmUgY2FsbGVkIGZyb20gYW4gaW5qZWN0aW9uIGNvbnRleHQiKTtpZihudWxsPT09a2Qpe3ZhciBjPVVjKGEpO2lmKGMmJiJyb290Ij09Yy5ZKWE9dm9pZCAwPT09Yy52YWx1ZT9jLnZhbHVlPWMuVigpOmMudmFsdWU7ZWxzZSBpZihiJjgpYT1udWxsO2Vsc2UgdGhyb3cgRXJyb3IoIkluamVjdG9yOiBOT1RfRk9VTkQgWyIrUGMoYSkrIl0iKTt9ZWxzZSBhPWtkLmdldChhLGImOD9udWxsOnZvaWQgMCxiKTtyZXR1cm4gYX12YXIgbmQ9ZnVuY3Rpb24oKXt9OwpuZC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP2hkOmI7aWYoYj09PWhkKXRocm93IGE9RXJyb3IoIk51bGxJbmplY3RvckVycm9yOiBObyBwcm92aWRlciBmb3IgIitQYyhhKSsiISIpLGEubmFtZT0iTnVsbEluamVjdG9yRXJyb3IiLGE7cmV0dXJuIGJ9OwpmdW5jdGlvbiBvZChhLGIsYyl7Yz12b2lkIDA9PT1jP251bGw6YzthPWEmJiJcbiI9PT1hLmNoYXJBdCgwKSYmIlx1MDI3NSI9PWEuY2hhckF0KDEpP2Euc3Vic3RyKDIpOmE7dmFyIGQ9UGMoYik7aWYoQXJyYXkuaXNBcnJheShiKSlkPWIubWFwKFBjKS5qb2luKCIgLT4gIik7ZWxzZSBpZigib2JqZWN0Ij09PXR5cGVvZiBiKXtkPVtdO2Zvcih2YXIgZSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBmPWJbZV07ZC5wdXNoKGUrIjoiKygic3RyaW5nIj09PXR5cGVvZiBmP0pTT04uc3RyaW5naWZ5KGYpOlBjKGYpKSl9ZD0ieyIrZC5qb2luKCIsICIpKyJ9In1yZXR1cm4iU3RhdGljSW5qZWN0b3JFcnJvciIrKGM/IigiK2MrIikiOiIiKSsiWyIrZCsiXTogIithLnJlcGxhY2UoaWQsIlxuICAiKX07dmFyIHBkPWZ1bmN0aW9uKCl7fSxxZD1mdW5jdGlvbigpe307T2MoeyRTOk9jfSk7T2Moe2FUOk9jfSk7T2Moe2ZUOk9jfSk7T2Moe2VUOk9jfSk7T2Moe2RUOk9jfSk7T2Moe2JUOk9jfSk7T2Moe21nOk9jfSk7dmFyIHJkPSgidW5kZWZpbmVkIiE9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJnJlcXVlc3RBbmltYXRpb25GcmFtZXx8c2V0VGltZW91dCkuYmluZCgkYyk7ZnVuY3Rpb24gc2QoYSl7cmV0dXJuIGEubmdPcmlnaW5hbEVycm9yfWZ1bmN0aW9uIHRkKGEsYil7Zm9yKHZhciBjPVtdLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0xXT1hcmd1bWVudHNbZF07YS5lcnJvci5hcHBseShhLGphKGMpKX07dmFyIHVkPWZ1bmN0aW9uKCl7dGhpcy5RbT1jb25zb2xlfTt1ZC5wcm90b3R5cGUuaGFuZGxlRXJyb3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5LSyhhKSxjPXRoaXMuckIoYSksZD1hLm5nRXJyb3JMb2dnZXJ8fHRkO2QodGhpcy5RbSwiRVJST1IiLGEpO2ImJmQodGhpcy5RbSwiT1JJR0lOQUwgRVJST1IiLGIpO2MmJmQodGhpcy5RbSwiRVJST1IgQ09OVEVYVCIsYyl9O3VkLnByb3RvdHlwZS5yQj1mdW5jdGlvbihhKXtyZXR1cm4gYT9hLm5nRGVidWdDb250ZXh0P2EubmdEZWJ1Z0NvbnRleHQ6dGhpcy5yQihzZChhKSk6bnVsbH07dWQucHJvdG90eXBlLktLPWZ1bmN0aW9uKGEpe2ZvcihhPXNkKGEpO2EmJnNkKGEpOylhPXNkKGEpO3JldHVybiBhfTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKIEBwYXJhbSB7P30gb2JqCiBAcGFyYW0gez99IGRlYnVnCiBAcmV0dXJuIHt2b2lkfQoqLwp2YXIgdmQ9ZnVuY3Rpb24oYSl7dGhpcy55ZD1hfTt2ZC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzogIit0aGlzLnlkKyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIn07dmFyIHdkPWZ1bmN0aW9uKCl7dmQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0KHdkLHZkKTt3ZC5wcm90b3R5cGUuZ2V0VHlwZU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4iSFRNTCJ9O3ZhciB4ZD1mdW5jdGlvbigpe3ZkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dCh4ZCx2ZCk7eGQucHJvdG90eXBlLmdldFR5cGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIlN0eWxlIn07dmFyIHlkPWZ1bmN0aW9uKCl7dmQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0KHlkLHZkKTt5ZC5wcm90b3R5cGUuZ2V0VHlwZU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4iVVJMIn07dmFyIHpkPWZ1bmN0aW9uKCl7dmQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTsKdCh6ZCx2ZCk7emQucHJvdG90eXBlLmdldFR5cGVOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIlJlc291cmNlVVJMIn07ZnVuY3Rpb24gQWQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiB2ZD9hLnlkOmF9ZnVuY3Rpb24gQmQoYSxiKXthPWEgaW5zdGFuY2VvZiB2ZCYmYS5nZXRUeXBlTmFtZSgpfHxudWxsO2lmKG51bGwhPWEmJmEhPT1iKXtpZigiUmVzb3VyY2VVUkwiPT09YSYmIlVSTCI9PT1iKXJldHVybiEwO3Rocm93IEVycm9yKCJSZXF1aXJlZCBhIHNhZmUgIitiKyIsIGdvdCBhICIrYSsiIChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpO31yZXR1cm4gYT09PWJ9O3ZhciBDZD1mdW5jdGlvbihhKXt0aGlzLnBGPWE7dGhpcy5hbT10aGlzLnBGLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgic2FuaXRpemF0aW9uLWluZXJ0Iik7YT10aGlzLmFtLmJvZHk7aWYobnVsbD09YSl7dmFyIGI9dGhpcy5hbS5jcmVhdGVFbGVtZW50KCJodG1sIik7dGhpcy5hbS5hcHBlbmRDaGlsZChiKTthPXRoaXMuYW0uY3JlYXRlRWxlbWVudCgiYm9keSIpO2IuYXBwZW5kQ2hpbGQoYSl9YS5pbm5lckhUTUw9Jzxzdmc+PGcgb25sb2FkPSJ0aGlzLnBhcmVudE5vZGUucmVtb3ZlKCkiPjwvZz48L3N2Zz4nO2lmKGEucXVlcnlTZWxlY3RvciYmIWEucXVlcnlTZWxlY3Rvcigic3ZnIikpdGhpcy5meT10aGlzLlJQO2Vsc2V7YS5pbm5lckhUTUw9Jzxzdmc+PHA+PHN0eWxlPjxpbWcgc3JjPSI8L3N0eWxlPjxpbWcgc3JjPXggb25lcnJvcj1hbGVydCgxKS8vIj4nO2lmKGE9YS5xdWVyeVNlbGVjdG9yJiZhLnF1ZXJ5U2VsZWN0b3IoInN2ZyBpbWciKSl0cnl7YT0KISF3aW5kb3cuRE9NUGFyc2VyfWNhdGNoKGMpe2E9ITF9dGhpcy5meT1hP3RoaXMuUFA6dGhpcy5RUH19O0NkLnByb3RvdHlwZS5SUD1mdW5jdGlvbihhKXthPSI8Ym9keT48cmVtb3ZlPjwvcmVtb3ZlPiIrYSsiPC9ib2R5PiI7dHJ5e2E9ZW5jb2RlVVJJKGEpfWNhdGNoKGMpe3JldHVybiBudWxsfXZhciBiPW5ldyBYTUxIdHRwUmVxdWVzdDtiLnJlc3BvbnNlVHlwZT0iZG9jdW1lbnQiO2Iub3BlbigiR0VUIiwiZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCwiK2EsITEpO2Iuc2VuZCh2b2lkIDApO2E9Yi5yZXNwb25zZS5ib2R5O2EucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtyZXR1cm4gYX07CkNkLnByb3RvdHlwZS5QUD1mdW5jdGlvbihhKXthPSI8Ym9keT48cmVtb3ZlPjwvcmVtb3ZlPiIrYSsiPC9ib2R5PiI7dHJ5e3ZhciBiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQvaHRtbCIpLmJvZHk7Yi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO3JldHVybiBifWNhdGNoKGMpe3JldHVybiBudWxsfX07Q2QucHJvdG90eXBlLlFQPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYW0uY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtpZigiY29udGVudCJpbiBiKXJldHVybiBiLmlubmVySFRNTD1hLGI7Yj10aGlzLmFtLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTtiLmlubmVySFRNTD1hO3RoaXMucEYuZG9jdW1lbnRNb2RlJiZEZCh0aGlzLGIpO3JldHVybiBifTsKdmFyIERkPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWIuYXR0cmlidXRlcyxkPWMubGVuZ3RoLTE7MDxkO2QtLSl7dmFyIGU9Yy5pdGVtKGQpLm5hbWU7InhtbG5zOm5zMSIhPT1lJiYwIT09ZS5pbmRleE9mKCJuczE6Iil8fGIucmVtb3ZlQXR0cmlidXRlKGUpfWZvcihiPWIuZmlyc3RDaGlsZDtiOyliLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJkRkKGEsYiksYj1iLm5leHRTaWJsaW5nfTt2YXIgRWQ9ITAsRmQ9ITE7ZnVuY3Rpb24gR2QoKXtGZD0hMDtyZXR1cm4gRWR9O3ZhciBIZD0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlfHNtcyk6fFteJjovPyNdKig/OlsvPyNdfCQpKS9naSxJZD0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbYS16MC05K1wvXSs9KiQvaTtmdW5jdGlvbiBKZChhKXthPVN0cmluZyhhKTtpZihhLm1hdGNoKEhkKXx8YS5tYXRjaChJZCkpcmV0dXJuIGE7R2QoKSYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBVUkwgdmFsdWUgIithKyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIik7cmV0dXJuInVuc2FmZToiK2F9ZnVuY3Rpb24gS2QoYSl7YT1TdHJpbmcoYSk7cmV0dXJuIGEuc3BsaXQoIiwiKS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIEpkKGIudHJpbSgpKX0pLmpvaW4oIiwgIil9O2Z1bmN0aW9uIExkKGEpe3ZhciBiPXt9O2E9bihhLnNwbGl0KCIsIikpO2Zvcih2YXIgYz1hLm5leHQoKTshYy5kb25lO2M9YS5uZXh0KCkpYltjLnZhbHVlXT0hMDtyZXR1cm4gYn1mdW5jdGlvbiBNZChhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTtjPXt9O2I9bihiKTtmb3IodmFyIGQ9Yi5uZXh0KCk7IWQuZG9uZTtkPWIubmV4dCgpKXtkPWQudmFsdWU7Zm9yKHZhciBlIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShlKSYmKGNbZV09ITApfXJldHVybiBjfQp2YXIgTmQ9TGQoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKSxPZD1MZCgiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLFBkPUxkKCJycCxydCIpLFFkPU1kKFBkLE9kKSxSZD1NZChPZCxMZCgiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRldGFpbHMsZGlhbG9nLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1haW4sbWFwLG1lbnUsbmF2LG9sLHByZSxzZWN0aW9uLHN1bW1hcnksdGFibGUsdWwiKSksVGQ9TWQoUGQsTGQoImEsYWJicixhY3JvbnltLGF1ZGlvLGIsYmRpLGJkbyxiaWcsYnIsY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGltZyxpbnMsa2JkLGxhYmVsLG1hcCxtYXJrLHBpY3R1cmUscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzb3VyY2Usc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGltZSx0cmFjayx0dCx1LHZhcix2aWRlbyIpKSwKVWQ9TWQoTmQsUmQsVGQsUWQpLFZkPUxkKCJiYWNrZ3JvdW5kLGNpdGUsaHJlZixpdGVtdHlwZSxsb25nZGVzYyxwb3N0ZXIsc3JjLHhsaW5rOmhyZWYiKSxXZD1MZCgic3Jjc2V0IiksWGQ9TGQoImFiYnIsYWNjZXNza2V5LGFsaWduLGFsdCxhdXRvcGxheSxheGlzLGJnY29sb3IsYm9yZGVyLGNlbGxwYWRkaW5nLGNlbGxzcGFjaW5nLGNsYXNzLGNsZWFyLGNvbG9yLGNvbHMsY29sc3Bhbixjb21wYWN0LGNvbnRyb2xzLGNvb3JkcyxkYXRldGltZSxkZWZhdWx0LGRpcixkb3dubG9hZCxmYWNlLGhlYWRlcnMsaGVpZ2h0LGhpZGRlbixocmVmbGFuZyxoc3BhY2UsaXNtYXAsaXRlbXNjb3BlLGl0ZW1wcm9wLGtpbmQsbGFiZWwsbGFuZyxsYW5ndWFnZSxsb29wLG1lZGlhLG11dGVkLG5vaHJlZixub3dyYXAsb3BlbixwcmVsb2FkLHJlbCxyZXYscm9sZSxyb3dzLHJvd3NwYW4scnVsZXMsc2NvcGUsc2Nyb2xsaW5nLHNoYXBlLHNpemUsc2l6ZXMsc3BhbixzcmNsYW5nLHN0YXJ0LHN1bW1hcnksdGFiaW5kZXgsdGFyZ2V0LHRpdGxlLHRyYW5zbGF0ZSx0eXBlLHVzZW1hcCx2YWxpZ24sdmFsdWUsdnNwYWNlLHdpZHRoIiksCllkPUxkKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsYXJpYS1hdG9taWMsYXJpYS1hdXRvY29tcGxldGUsYXJpYS1idXN5LGFyaWEtY2hlY2tlZCxhcmlhLWNvbGNvdW50LGFyaWEtY29saW5kZXgsYXJpYS1jb2xzcGFuLGFyaWEtY29udHJvbHMsYXJpYS1jdXJyZW50LGFyaWEtZGVzY3JpYmVkYnksYXJpYS1kZXRhaWxzLGFyaWEtZGlzYWJsZWQsYXJpYS1kcm9wZWZmZWN0LGFyaWEtZXJyb3JtZXNzYWdlLGFyaWEtZXhwYW5kZWQsYXJpYS1mbG93dG8sYXJpYS1ncmFiYmVkLGFyaWEtaGFzcG9wdXAsYXJpYS1oaWRkZW4sYXJpYS1pbnZhbGlkLGFyaWEta2V5c2hvcnRjdXRzLGFyaWEtbGFiZWwsYXJpYS1sYWJlbGxlZGJ5LGFyaWEtbGV2ZWwsYXJpYS1saXZlLGFyaWEtbW9kYWwsYXJpYS1tdWx0aWxpbmUsYXJpYS1tdWx0aXNlbGVjdGFibGUsYXJpYS1vcmllbnRhdGlvbixhcmlhLW93bnMsYXJpYS1wbGFjZWhvbGRlcixhcmlhLXBvc2luc2V0LGFyaWEtcHJlc3NlZCxhcmlhLXJlYWRvbmx5LGFyaWEtcmVsZXZhbnQsYXJpYS1yZXF1aXJlZCxhcmlhLXJvbGVkZXNjcmlwdGlvbixhcmlhLXJvd2NvdW50LGFyaWEtcm93aW5kZXgsYXJpYS1yb3dzcGFuLGFyaWEtc2VsZWN0ZWQsYXJpYS1zZXRzaXplLGFyaWEtc29ydCxhcmlhLXZhbHVlbWF4LGFyaWEtdmFsdWVtaW4sYXJpYS12YWx1ZW5vdyxhcmlhLXZhbHVldGV4dCIpLApaZD1NZChWZCxXZCxYZCxZZCksJGQ9TGQoInNjcmlwdCxzdHlsZSx0ZW1wbGF0ZSIpLGFlPWZ1bmN0aW9uKCl7dGhpcy5zdD0hMTt0aGlzLkZnPVtdfSxiZT1mdW5jdGlvbihhLGIpe2lmKGImJihhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKXRocm93IEVycm9yKCJGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogIithLm91dGVySFRNTCk7cmV0dXJuIGJ9LGNlPS9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZyxkZT0vKFteIy1+IHwhXSkvZzsKZnVuY3Rpb24gZWUoYSl7cmV0dXJuIGEucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoY2UsZnVuY3Rpb24oYil7cmV0dXJuIiYjIisoMTAyNCooYi5jaGFyQ29kZUF0KDApLTU1Mjk2KSsoYi5jaGFyQ29kZUF0KDEpLTU2MzIwKSs2NTUzNikrIjsifSkucmVwbGFjZShkZSxmdW5jdGlvbihiKXtyZXR1cm4iJiMiK2IuY2hhckNvZGVBdCgwKSsiOyJ9KS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX12YXIgZmU7ZnVuY3Rpb24gZ2UoYSl7cmV0dXJuImNvbnRlbnQiaW4gYSYmYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYiVEVNUExBVEUiPT09YS5ub2RlTmFtZT9hLmNvbnRlbnQ6bnVsbH07dmFyIGhlPXtOT05FOjAsS1I6MSxOUjoyLE1SOjMsVVJMOjQsTFI6NSwwOiJOT05FIiwxOiJIVE1MIiwyOiJTVFlMRSIsMzoiU0NSSVBUIiw0OiJVUkwiLDU6IlJFU09VUkNFX1VSTCJ9O3ZhciBpZT0vKFtBLVpdKS9nO2Z1bmN0aW9uIGplKGEpe3JldHVybiBhLnJlcGxhY2UoaWUsZnVuY3Rpb24oYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0wXT1hcmd1bWVudHNbZF07cmV0dXJuIi0iK2NbMV0udG9Mb3dlckNhc2UoKX0pfTtQcm9taXNlLnJlc29sdmUobnVsbCk7ZnVuY3Rpb24ga2UoYSxiKXt2b2lkIDA9PT1iJiYoYj1hKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpPyhiPT09YSYmKGI9YS5zbGljZSgwLGMpKSxrZShkLGIpKTpiIT09YSYmYi5wdXNoKGQpfXJldHVybiBifWZ1bmN0aW9uIGxlKGEsYil7Yj49YS5sZW5ndGgtMT9hLnBvcCgpOmEuc3BsaWNlKGIsMSl9ZnVuY3Rpb24gbWUoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGE7YysrKWIucHVzaCh2b2lkIDApO3JldHVybiBifTt2YXIgbmU9ZnVuY3Rpb24oKXt9O25lLm1nPWZ1bmN0aW9uKCl7fTtPYyh7WWE6U3RyaW5nLGtkOk9jfSk7T2Moe1lhOlN0cmluZyxrZDpPY30pO3ZhciBvZT1uZXcgeSgiU2V0IEluamVjdG9yIHNjb3BlLiIpO3ZhciBwZT1mdW5jdGlvbigpe30scmU9ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/bmV3IHFlKGEsdm9pZCAwLCIiKTpuZXcgcWUoYS5yYyxhLnBhcmVudCxhLm5hbWV8fCIiKX0sc2U9bmV3IG5kO3BlLmhhPVRjKHtMOnBlLFk6ImFueSIsVjpmdW5jdGlvbigpe3JldHVybiBtZChnZCl9fSk7cGUubWc9LTE7dmFyIHRlPWZ1bmN0aW9uKGEpe3JldHVybiBhfSx1ZT1bXSx2ZT1mdW5jdGlvbigpe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpfSxxZT1mdW5jdGlvbihhLGIsYyl7dGhpcy5wYXJlbnQ9Yj12b2lkIDA9PT1iP3NlOmI7dGhpcy5zb3VyY2U9dm9pZCAwPT09Yz9udWxsOmM7Yj10aGlzLnBqPW5ldyBNYXA7Yi5zZXQocGUse0w6cGUsWGw6dGUsS2E6dWUsdmFsdWU6dGhpcyxMdDohMX0pO2Iuc2V0KGdkLHtMOmdkLFhsOnRlLEthOnVlLHZhbHVlOnRoaXMsTHQ6ITF9KTt0aGlzLnNjb3BlPXdlKGIsYSl9OwpxZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEsYixjKXtjPXZvaWQgMD09PWM/MDpjO3ZhciBkPXRoaXMucGosZT1kLmdldChhKTtpZih2b2lkIDA9PT1lKXt2YXIgZj1VYyhhKTtpZihmKXt2YXIgZz1mJiZmLlk7KCJhbnkiPT09Z3x8bnVsbCE9ZyYmZz09PXRoaXMuc2NvcGUpJiZkLnNldChhLGU9eGUoe1lhOmEsR3A6Zi5WLEthOnVlfSkpfXZvaWQgMD09PWUmJmQuc2V0KGEsbnVsbCl9Zj1sZCh0aGlzKTt0cnl7cmV0dXJuIHllKGEsZSxkLHRoaXMucGFyZW50LGIsYyl9Y2F0Y2gocCl7Yj1wO3ZhciBsPXRoaXMuc291cmNlLG09Yi5uZ1RlbXBUb2tlblBhdGg7YS5fX3NvdXJjZSYmbS51bnNoaWZ0KGEuX19zb3VyY2UpO2IubWVzc2FnZT1vZCgiXG4iK2IubWVzc2FnZSxtLGwpO2IubmdUb2tlblBhdGg9bTtiLm5nVGVtcFRva2VuUGF0aD1udWxsO3Rocm93IGI7fWZpbmFsbHl7bGQoZil9fTsKcWUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9W107dGhpcy5wai5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEucHVzaChQYyhjKSl9KTtyZXR1cm4iU3RhdGljSW5qZWN0b3JbIithLmpvaW4oIiwgIikrIl0ifTsKZnVuY3Rpb24geGUoYSl7dmFyIGI9dWU7dmFyIGM9YS5LYTtpZihjJiZjLmxlbmd0aCl7Yj1bXTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9NixmPVNjKGNbZF0pO2lmKEFycmF5LmlzQXJyYXkoZikpZm9yKHZhciBnPTAsbD1mO2c8bC5sZW5ndGg7ZysrKXt2YXIgbT1sW2ddO20gaW5zdGFuY2VvZiBkZHx8bT09ZGQ/ZXw9MTptIGluc3RhbmNlb2YgZmR8fG09PWZkP2UmPS0zOm0gaW5zdGFuY2VvZiBlZHx8bT09ZWQ/ZSY9LTU6Zj1tIGluc3RhbmNlb2YgY2Q/bS5MOlNjKG0pfWIucHVzaCh7TDpmLG9wdGlvbnM6ZX0pfX1lbHNlIGlmKGEucUkpYj1be0w6U2MoYS5xSSksb3B0aW9uczo2fV07ZWxzZSBpZighKGN8fGpkIGluIGEpKXRocm93IEVycm9yKG9kKCInZGVwcycgcmVxdWlyZWQiLGEpKTtjPXRlO2Q9dWU7ZT0hMTtmPVNjKGEuWWEpO2lmKGpkIGluIGEpZD1hLmtkO2Vsc2UgaWYoYS5HcCljPWEuR3A7ZWxzZSBpZighYS5xSSlpZihhLk56KWU9ITAsYz1TYyhhLk56KTsKZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZillPSEwLGM9ZjtlbHNlIHRocm93IEVycm9yKG9kKCJTdGF0aWNQcm92aWRlciBkb2VzIG5vdCBoYXZlIFt1c2VWYWx1ZXx1c2VGYWN0b3J5fHVzZUV4aXN0aW5nfHVzZUNsYXNzXSBvciBbcHJvdmlkZV0gaXMgbm90IG5ld2FibGUiLGEpKTtyZXR1cm57S2E6YixYbDpjLEx0OmUsdmFsdWU6ZH19ZnVuY3Rpb24gemUoYSl7cmV0dXJuIEVycm9yKG9kKCJDYW5ub3QgbWl4IG11bHRpIHByb3ZpZGVycyBhbmQgcmVndWxhciBwcm92aWRlcnMiLGEpKX0KZnVuY3Rpb24gd2UoYSxiKXt2YXIgYz1udWxsO2lmKGIpaWYoYj1TYyhiKSxBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWM9d2UoYSxiW2RdKXx8YztlbHNle2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYil0aHJvdyBFcnJvcihvZCgiRnVuY3Rpb24vQ2xhc3Mgbm90IHN1cHBvcnRlZCIsYikpO2lmKGImJiJvYmplY3QiPT09dHlwZW9mIGImJmIuWWEpe2Q9U2MoYi5ZYSk7dmFyIGU9eGUoYik7aWYoITA9PT1iLkNHKXt2YXIgZj1hLmdldChkKTtpZihmKXtpZihmLlhsIT09dmUpdGhyb3cgemUoZCk7fWVsc2UgYS5zZXQoZCxmPXtMOmIuWWEsS2E6W10sTHQ6ITEsWGw6dmUsdmFsdWU6dWV9KTtkPWI7Zi5LYS5wdXNoKHtMOmQsb3B0aW9uczo2fSl9aWYoKGI9YS5nZXQoZCkpJiZiLlhsPT12ZSl0aHJvdyB6ZShkKTtkPT09b2UmJihjPWUudmFsdWUpO2Euc2V0KGQsZSl9ZWxzZSB0aHJvdyBFcnJvcihvZCgiVW5leHBlY3RlZCBwcm92aWRlciIsYikpO31yZXR1cm4gY30KZnVuY3Rpb24geWUoYSxiLGMsZCxlLGYpe3RyeXtpZighYnx8ZiY0KXZhciBnPWYmMj9mJjg/c2UuZ2V0KGEsInVuZGVmaW5lZCIhPT10eXBlb2YgZT9lOm51bGwpOnNlLmdldChhLGUpOmQuZ2V0KGEsZSwwKTtlbHNle2c9Yi52YWx1ZTtpZihnPT10ZSl0aHJvdyBFcnJvcigiXHUwMjc1Q2lyY3VsYXIgZGVwZW5kZW5jeSIpO2lmKGc9PT11ZSl7Yi52YWx1ZT10ZTt2YXIgbD1iLkx0LG09Yi5YbCxwPWIuS2E7ZT11ZTtpZihwLmxlbmd0aClmb3IoZT1bXSxmPTA7ZjxwLmxlbmd0aDtmKyspe3ZhciBxPXBbZl0scj1xLm9wdGlvbnMsdj1yJjI/Yy5nZXQocS5MKTp2b2lkIDA7ZS5wdXNoKHllKHEuTCx2LGMsdnx8ciY0P2Q6c2UsciYxP251bGw6aGQsMCkpfWIudmFsdWU9Zz1sP25ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkobSxbbnVsbF0uY29uY2F0KGphKGUpKSkpOm0uYXBwbHkodm9pZCAwLGUpfX1yZXR1cm4gZ31jYXRjaCh3KXt0aHJvdyB3IGluc3RhbmNlb2YgRXJyb3J8fAoodz1FcnJvcih3KSksKHcubmdUZW1wVG9rZW5QYXRoPXcubmdUZW1wVG9rZW5QYXRofHxbXSkudW5zaGlmdChhKSxiJiZiLnZhbHVlPT10ZSYmKGIudmFsdWU9dWUpLHc7fX07dmFyIEFlPWZ1bmN0aW9uKGEsYil7dGhpcy5MPWE7dGhpcy5pZD1iO2lmKCFhKXRocm93IEVycm9yKCJUb2tlbiBtdXN0IGJlIGRlZmluZWQhIik7dGhpcy5kaXNwbGF5TmFtZT1QYyh0aGlzLkwpfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFlLHtNeTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIENlLk15fX19KTt2YXIgRGU9ZnVuY3Rpb24oKXt0aGlzLldwPW5ldyBNYXB9O0RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIEFlKXJldHVybiBhO2lmKHRoaXMuV3AuaGFzKGEpKXJldHVybiB0aGlzLldwLmdldChhKTt2YXIgYj1uZXcgQWUoYSxBZS5NeSk7dGhpcy5XcC5zZXQoYSxiKTtyZXR1cm4gYn07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhEZS5wcm90b3R5cGUse015Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XcC5zaXplfX19KTsKdmFyIENlPW5ldyBEZTtDZS5nZXQoU2MocGUpKTtmdW5jdGlvbiBFZShhKXtyZXR1cm4hIWEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS50aGVufWZ1bmN0aW9uIEZlKGEpe3JldHVybiEhYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLnN1YnNjcmliZX07dmFyIEdlPW5ldyB5KCJBcHBsaWNhdGlvbiBJbml0aWFsaXplciIpLEhlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5veD1hO3RoaXMuZG9uZT10aGlzLlhGPSExO3RoaXMudVA9bmV3IFByb21pc2UoZnVuY3Rpb24oYyxkKXtiLnJlc29sdmU9YztiLnJlamVjdD1kfSl9LEllPWZ1bmN0aW9uKGEpe2lmKCFhLlhGKXt2YXIgYj1bXTtpZihhLm94KWZvcih2YXIgYz0wO2M8YS5veC5sZW5ndGg7YysrKXt2YXIgZD1hLm94W2NdKCk7RWUoZCkmJmIucHVzaChkKX1Qcm9taXNlLmFsbChiKS50aGVuKGZ1bmN0aW9uKCl7YS5kb25lPSEwO2EucmVzb2x2ZSgpfSkuY2F0Y2goZnVuY3Rpb24oZSl7YS5yZWplY3QoZSl9KTswPT09Yi5sZW5ndGgmJihhLmRvbmU9ITAsYS5yZXNvbHZlKCkpO2EuWEY9ITB9fTt2YXIgSmU9bmV3IHkoIkFwcElkIik7ZnVuY3Rpb24gS2UoKXtyZXR1cm4iIitMZSgpK0xlKCkrTGUoKX1mdW5jdGlvbiBMZSgpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3K01hdGguZmxvb3IoMjUqTWF0aC5yYW5kb20oKSkpfXZhciBNZT1uZXcgeSgiUGxhdGZvcm0gSW5pdGlhbGl6ZXIiKSxOZT1uZXcgeSgiUGxhdGZvcm0gSUQiKSxPZT1uZXcgeSgiYXBwQm9vdHN0cmFwTGlzdGVuZXIiKTt2YXIgUGU9ZnVuY3Rpb24oKXt9O1BlLnByb3RvdHlwZS5sb2c9ZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coYSl9O1BlLnByb3RvdHlwZS53YXJuPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybihhKX07dmFyIFFlPW5ldyB5KCJMb2NhbGVJZCIpLFJlPW5ldyB5KCJEZWZhdWx0Q3VycmVuY3lDb2RlIik7dmFyIFNlPWZ1bmN0aW9uKCl7fSxUZT1mdW5jdGlvbigpe307dmFyIFVlPWZ1bmN0aW9uKCl7fSxWZT1mdW5jdGlvbihhLGIsYyl7dGhpcy4kPWI7dGhpcy5iTT1jO3RoaXMubUI9bmV3IE1hcDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTt0aGlzLm1CLnNldChlLlluLGUpfX0sV2U9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm1CLmdldChiKTshYyYmYS4kJiYoYz1XZShhLiQsYikpO2lmKCFjKXRocm93IGE9RXJyb3IoIk5vIGNvbXBvbmVudCBmYWN0b3J5IGZvdW5kIGZvciAiK1BjKGIpKyIuIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/IiksYS5uZ0NvbXBvbmVudD1iLGE7cmV0dXJuIG5ldyBYZShjLGEuYk0pfSxYZT1mdW5jdGlvbihhLGIpe3RoaXMuVj1hO3RoaXMuWmY9Yjt0aGlzLmllPWEuaWU7dGhpcy5Zbj1hLlluO3RoaXMuaW5wdXRzPWEuaW5wdXRzO3RoaXMub3V0cHV0cz1hLm91dHB1dHN9O3QoWGUsVGUpOwpYZS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLlYuY3JlYXRlKGEsYixjLGR8fHRoaXMuWmYpfTt2YXIgej1mdW5jdGlvbihhKXt0aGlzLmk9YX07ei5tZz1mdW5jdGlvbigpe307dmFyIFllPWZ1bmN0aW9uKCl7fSxaZT1mdW5jdGlvbigpe307WmUubWc9ZnVuY3Rpb24oKXt9O3ZhciAkZT1udWxsO2Z1bmN0aW9uIGFmKCl7aWYoISRlKXt2YXIgYT0kYy5TeW1ib2w7aWYoYSYmYS5pdGVyYXRvcikkZT1hLml0ZXJhdG9yO2Vsc2V7YT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhNYXAucHJvdG90eXBlKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoOysrYil7dmFyIGM9YVtiXTsiZW50cmllcyIhPT1jJiYic2l6ZSIhPT1jJiZNYXAucHJvdG90eXBlW2NdPT09TWFwLnByb3RvdHlwZS5lbnRyaWVzJiYoJGU9Yyl9fX1yZXR1cm4gJGV9O2Z1bmN0aW9uIGJmKGEsYil7dmFyIGM9Y2YoYSksZD1jZihiKTtpZihjJiZkKXthOmZvcihhPWFbYWYoKV0oKSxiPWJbYWYoKV0oKTs7KXtjPWEubmV4dCgpO2Q9Yi5uZXh0KCk7aWYoYy5kb25lJiZkLmRvbmUpe2I9ITA7YnJlYWsgYX1pZihjLmRvbmV8fGQuZG9uZXx8IWJmKGMudmFsdWUsZC52YWx1ZSkpe2I9ITE7YnJlYWsgYX19cmV0dXJuIGJ9cmV0dXJuIGN8fCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhJiYiZnVuY3Rpb24iIT09dHlwZW9mIGF8fGR8fCFifHwib2JqZWN0IiE9PXR5cGVvZiBiJiYiZnVuY3Rpb24iIT09dHlwZW9mIGI/T2JqZWN0LmlzKGEsYik6ITB9dmFyIGRmPWZ1bmN0aW9uKGEpe3RoaXMuSVI9YX0sZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBkZj9hLklSOmF9O2Z1bmN0aW9uIGNmKGEpe3JldHVybiBmZihhKT9BcnJheS5pc0FycmF5KGEpfHwhKGEgaW5zdGFuY2VvZiBNYXApJiZhZigpaW4gYTohMX0KZnVuY3Rpb24gZ2YoYSxiKXtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWIoYVtjXSk7ZWxzZSBmb3IoYT1hW2FmKCldKCk7IShjPWEubmV4dCgpKS5kb25lOyliKGMudmFsdWUpfWZ1bmN0aW9uIGZmKGEpe3JldHVybiBudWxsIT09YSYmKCJmdW5jdGlvbiI9PT10eXBlb2YgYXx8Im9iamVjdCI9PT10eXBlb2YgYSl9O3ZhciBoZj1mdW5jdGlvbigpe307aGYuaGE9VGMoe0w6aGYsWToicm9vdCIsVjpmdW5jdGlvbigpe3JldHVybiBudWxsfX0pO3ZhciBqZj1mdW5jdGlvbigpe3RoaXMub289IjAuMC4wLVBMQUNFSE9MREVSIjtbIjAiLCIwIiwiMC1QTEFDRUhPTERFUiJdLnNsaWNlKDIpfSxrZj1uZXcgamY7dmFyIGxmPWZ1bmN0aW9uKCl7fTtsZi5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGNmKGEpfTtsZi5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgbWYoYSl9Owp2YXIgbmY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0sbWY9ZnVuY3Rpb24oYSl7dGhpcy5sZW5ndGg9MDt0aGlzLmFsPXRoaXMuSHE9dGhpcy5MZj10aGlzLmdmPXRoaXMubWw9dGhpcy5WcT10aGlzLkpkPXRoaXMubmU9dGhpcy5jbj10aGlzLmVsPXRoaXMuRE09dGhpcy5oZj10aGlzLmlqPW51bGw7dGhpcy5Icj1hfHxuZn0scGY9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmVsO2E9YS5nZjtmb3IodmFyIGQ9MCxlPW51bGw7Y3x8YTspe3ZhciBmPSFhfHxjJiZjLlFmPG9mKGEsZCxlKT9jOmEsZz1vZihmLGQsZSksbD1mLlFmO2lmKGY9PT1hKWQtLSxhPWEuYWY7ZWxzZSBpZihjPWMuZGEsbnVsbD09Zi5oaylkKys7ZWxzZXtlfHwoZT1bXSk7dmFyIG09Zy1kLHA9bC1kO2lmKG0hPXApe2Zvcih2YXIgcT0wO3E8bTtxKyspe3ZhciByPXE8ZS5sZW5ndGg/ZVtxXTplW3FdPTAsdj1yK3E7cDw9diYmdjxtJiYoZVtxXT1yKzEpfWVbZi5oa109cC1tfX1nIT09bCYmYihmLGcsbCl9fTsKbWYucHJvdG90eXBlLnRzPWZ1bmN0aW9uKGEpe3ZhciBiO2ZvcihiPXRoaXMubmU7bnVsbCE9PWI7Yj1iLnVnKWEoYil9O21mLnByb3RvdHlwZS51cz1mdW5jdGlvbihhKXt2YXIgYjtmb3IoYj10aGlzLmdmO251bGwhPT1iO2I9Yi5hZilhKGIpfTt2YXIgcWY9ZnVuY3Rpb24oYSxiKXtmb3IoYT1hLkhxO251bGwhPT1hO2E9YS5OdiliKGEpfTtoPW1mLnByb3RvdHlwZTtoLkdqPWZ1bmN0aW9uKGEpe251bGw9PWEmJihhPVtdKTtpZighY2YoYSkpdGhyb3cgRXJyb3IoIkVycm9yIHRyeWluZyB0byBkaWZmICciK1BjKGEpKyInLiBPbmx5IGFycmF5cyBhbmQgaXRlcmFibGVzIGFyZSBhbGxvd2VkIik7cmV0dXJuIHRoaXMuY2hlY2soYSk/dGhpczpudWxsfTtoLlZhPWZ1bmN0aW9uKCl7fTsKaC5jaGVjaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMucHcoKTt2YXIgYz10aGlzLmVsLGQ9ITE7aWYoQXJyYXkuaXNBcnJheShhKSl7dGhpcy5sZW5ndGg9YS5sZW5ndGg7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspe3ZhciBmPWFbZV07dmFyIGc9dGhpcy5IcihlLGYpO251bGwhPT1jJiZPYmplY3QuaXMoYy5CcCxnKT8oZCYmKGM9dGhpcy53RShjLGYsZyxlKSksT2JqZWN0LmlzKGMuaXRlbSxmKXx8dGhpcy5ScChjLGYpKTooYz10aGlzLkVDKGMsZixnLGUpLGQ9ITApO2M9Yy5kYX19ZWxzZXt2YXIgbD0wO2dmKGEsZnVuY3Rpb24obSl7Zz1iLkhyKGwsbSk7bnVsbCE9PWMmJk9iamVjdC5pcyhjLkJwLGcpPyhkJiYoYz1iLndFKGMsbSxnLGwpKSxPYmplY3QuaXMoYy5pdGVtLG0pfHxiLlJwKGMsbSkpOihjPWIuRUMoYyxtLGcsbCksZD0hMCk7Yz1jLmRhO2wrK30pO3RoaXMubGVuZ3RoPWx9dGhpcy5VTihjKTtyZXR1cm4gdGhpcy5Bb307CmgucHc9ZnVuY3Rpb24oKXtpZih0aGlzLkFvKXt2YXIgYTtmb3IoYT10aGlzLkRNPXRoaXMuZWw7bnVsbCE9PWE7YT1hLmRhKWEuUHY9YS5kYTtmb3IoYT10aGlzLm5lO251bGwhPT1hO2E9YS51ZylhLmhrPWEuUWY7dGhpcy5uZT10aGlzLkpkPW51bGw7Zm9yKGE9dGhpcy5WcTtudWxsIT09YTspYS5oaz1hLlFmLGE9YS5Pdjt0aGlzLkhxPXRoaXMuYWw9dGhpcy5nZj10aGlzLkxmPXRoaXMuVnE9dGhpcy5tbD1udWxsfX07CmguRUM9ZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbD09PWEpdmFyIGU9dGhpcy5jbjtlbHNlIGU9YS51Yyx0aGlzLlBNKGEpO2E9bnVsbD09PXRoaXMuaWo/bnVsbDp0aGlzLmlqLmdldChjLGQpO251bGwhPT1hPyhPYmplY3QuaXMoYS5pdGVtLGIpfHx0aGlzLlJwKGEsYiksdGhpcy5aTChhLGUsZCkpOihhPW51bGw9PT10aGlzLmhmP251bGw6dGhpcy5oZi5nZXQoYyxudWxsKSxudWxsIT09YT8oT2JqZWN0LmlzKGEuaXRlbSxiKXx8dGhpcy5ScChhLGIpLHRoaXMucEQoYSxlLGQpKTphPXRoaXMuT0kobmV3IHJmKGIsYyksZSxkKSk7cmV0dXJuIGF9O2gud0U9ZnVuY3Rpb24oYSxiLGMsZCl7Yj1udWxsPT09dGhpcy5oZj9udWxsOnRoaXMuaGYuZ2V0KGMsbnVsbCk7bnVsbCE9PWI/YT10aGlzLnBEKGIsYS51YyxkKTphLlFmIT1kJiYoYS5RZj1kLHRoaXMuWXQoYSxkKSk7cmV0dXJuIGF9OwpoLlVOPWZ1bmN0aW9uKGEpe2Zvcig7bnVsbCE9PWE7KXt2YXIgYj1hLmRhO3RoaXMuYUEodGhpcy5jeChhKSk7YT1ifW51bGwhPT10aGlzLmhmJiZ0aGlzLmhmLmNsZWFyKCk7bnVsbCE9PXRoaXMuSmQmJih0aGlzLkpkLnVnPW51bGwpO251bGwhPT10aGlzLm1sJiYodGhpcy5tbC5Pdj1udWxsKTtudWxsIT09dGhpcy5jbiYmKHRoaXMuY24uZGE9bnVsbCk7bnVsbCE9PXRoaXMuTGYmJih0aGlzLkxmLmFmPW51bGwpO251bGwhPT10aGlzLmFsJiYodGhpcy5hbC5Odj1udWxsKX07aC5wRD1mdW5jdGlvbihhLGIsYyl7bnVsbCE9PXRoaXMuaGYmJnRoaXMuaGYucmVtb3ZlKGEpO3ZhciBkPWEuZnIsZT1hLmFmO251bGw9PT1kP3RoaXMuZ2Y9ZTpkLmFmPWU7bnVsbD09PWU/dGhpcy5MZj1kOmUuZnI9ZDt0aGlzLm52KGEsYixjKTt0aGlzLll0KGEsYyk7cmV0dXJuIGF9O2guWkw9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuY3goYSk7dGhpcy5udihhLGIsYyk7dGhpcy5ZdChhLGMpO3JldHVybiBhfTsKaC5PST1mdW5jdGlvbihhLGIsYyl7dGhpcy5udihhLGIsYyk7dGhpcy5KZD1udWxsPT09dGhpcy5KZD90aGlzLm5lPWE6dGhpcy5KZC51Zz1hO3JldHVybiBhfTtoLm52PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1udWxsPT09Yj90aGlzLmVsOmIuZGE7YS5kYT1kO2EudWM9YjtudWxsPT09ZD90aGlzLmNuPWE6ZC51Yz1hO251bGw9PT1iP3RoaXMuZWw9YTpiLmRhPWE7bnVsbD09PXRoaXMuaWomJih0aGlzLmlqPW5ldyBzZik7dGhpcy5pai5wdXQoYSk7YS5RZj1jO3JldHVybiBhfTtoLlBNPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFBKHRoaXMuY3goYSkpfTtoLmN4PWZ1bmN0aW9uKGEpe251bGwhPT10aGlzLmlqJiZ0aGlzLmlqLnJlbW92ZShhKTt2YXIgYj1hLnVjLGM9YS5kYTtudWxsPT09Yj90aGlzLmVsPWM6Yi5kYT1jO251bGw9PT1jP3RoaXMuY249YjpjLnVjPWI7cmV0dXJuIGF9OwpoLll0PWZ1bmN0aW9uKGEsYil7aWYoYS5oaz09PWIpcmV0dXJuIGE7dGhpcy5tbD1udWxsPT09dGhpcy5tbD90aGlzLlZxPWE6dGhpcy5tbC5Pdj1hO3JldHVybiBhfTtoLmFBPWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLmhmJiYodGhpcy5oZj1uZXcgc2YpO3RoaXMuaGYucHV0KGEpO2EuUWY9bnVsbDthLmFmPW51bGw7bnVsbD09PXRoaXMuTGY/KHRoaXMuTGY9dGhpcy5nZj1hLGEuZnI9bnVsbCk6KGEuZnI9dGhpcy5MZix0aGlzLkxmPXRoaXMuTGYuYWY9YSk7cmV0dXJuIGF9O2guUnA9ZnVuY3Rpb24oYSxiKXthLml0ZW09Yjt0aGlzLmFsPW51bGw9PT10aGlzLmFsP3RoaXMuSHE9YTp0aGlzLmFsLk52PWE7cmV0dXJuIGF9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1mLnByb3RvdHlwZSx7QW86e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5uZXx8bnVsbCE9PXRoaXMuVnF8fG51bGwhPT10aGlzLmdmfHxudWxsIT09dGhpcy5IcX19fSk7dmFyIHJmPWZ1bmN0aW9uKGEsYil7dGhpcy5pdGVtPWE7dGhpcy5CcD1iO3RoaXMuTnY9dGhpcy5Pdj10aGlzLnVnPXRoaXMuYWY9dGhpcy5mcj10aGlzLm9sPXRoaXMuZXI9dGhpcy5kYT10aGlzLnVjPXRoaXMuUHY9dGhpcy5oaz10aGlzLlFmPW51bGx9LHRmPWZ1bmN0aW9uKCl7dGhpcy5Ebj10aGlzLiRrPW51bGx9O3RmLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSl7bnVsbD09PXRoaXMuJGs/KHRoaXMuJGs9dGhpcy5Ebj1hLGEub2w9bnVsbCxhLmVyPW51bGwpOih0aGlzLkRuLm9sPWEsYS5lcj10aGlzLkRuLGEub2w9bnVsbCx0aGlzLkRuPWEpfTsKdGYucHJvdG90eXBlLmdldD1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihjPXRoaXMuJGs7bnVsbCE9PWM7Yz1jLm9sKWlmKChudWxsPT09Ynx8Yjw9Yy5RZikmJk9iamVjdC5pcyhjLkJwLGEpKXJldHVybiBjO3JldHVybiBudWxsfTt0Zi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZXI7YT1hLm9sO251bGw9PT1iP3RoaXMuJGs9YTpiLm9sPWE7bnVsbD09PWE/dGhpcy5Ebj1iOmEuZXI9YjtyZXR1cm4gbnVsbD09PXRoaXMuJGt9O3ZhciBzZj1mdW5jdGlvbigpe3RoaXMubWFwPW5ldyBNYXB9O3NmLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5CcCxjPXRoaXMubWFwLmdldChiKTtjfHwoYz1uZXcgdGYsdGhpcy5tYXAuc2V0KGIsYykpO2MuYWRkKGEpfTtzZi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5tYXAuZ2V0KGEpO3JldHVybiBjP2MuZ2V0KGEsYik6bnVsbH07CnNmLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5CcDt0aGlzLm1hcC5nZXQoYikucmVtb3ZlKGEpJiZ0aGlzLm1hcC5kZWxldGUoYik7cmV0dXJuIGF9O3NmLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwLmNsZWFyKCl9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2YucHJvdG90eXBlLHtPajp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1hcC5zaXplfX19KTtmdW5jdGlvbiBvZihhLGIsYyl7YT1hLmhrO2lmKG51bGw9PT1hKXJldHVybiBhO3ZhciBkPTA7YyYmYTxjLmxlbmd0aCYmKGQ9Y1thXSk7cmV0dXJuIGErYitkfTt2YXIgdWY9ZnVuY3Rpb24oKXt9O3VmLnByb3RvdHlwZS5zdXBwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE1hcHx8ZmYoYSl9O3VmLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHZmfTt2YXIgdmY9ZnVuY3Rpb24oKXt0aGlzLnBqPW5ldyBNYXA7dGhpcy5MZj10aGlzLmdmPXRoaXMuSmQ9dGhpcy5uZT10aGlzLlJrPXRoaXMuUWs9dGhpcy5jRD10aGlzLlJpPXRoaXMua2o9bnVsbH0sd2Y9ZnVuY3Rpb24oYSxiKXtmb3IoYT1hLlFrO251bGwhPT1hO2E9YS5XcSliKGEpfTtoPXZmLnByb3RvdHlwZTtoLnRzPWZ1bmN0aW9uKGEpe3ZhciBiO2ZvcihiPXRoaXMubmU7bnVsbCE9PWI7Yj1iLnVnKWEoYil9O2gudXM9ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGI9dGhpcy5nZjtudWxsIT09YjtiPWIuYWYpYShiKX07CmguR2o9ZnVuY3Rpb24oYSl7aWYoIWEpYT1uZXcgTWFwO2Vsc2UgaWYoIShhIGluc3RhbmNlb2YgTWFwfHxmZihhKSkpdGhyb3cgRXJyb3IoIkVycm9yIHRyeWluZyB0byBkaWZmICciK1BjKGEpKyInLiBPbmx5IG1hcHMgYW5kIG9iamVjdHMgYXJlIGFsbG93ZWQiKTtyZXR1cm4gdGhpcy5jaGVjayhhKT90aGlzOm51bGx9O2guVmE9ZnVuY3Rpb24oKXt9OwpoLmNoZWNrPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5wdygpO3ZhciBjPXRoaXMua2o7dGhpcy5SaT1udWxsO3RoaXMuUUsoYSxmdW5jdGlvbihkLGUpe2MmJmMua2V5PT09ZT8oYi5DQyhjLGQpLGIuUmk9YyxjPWMuZGEpOihkPWIuWUsoZSxkKSxjPWIuekwoYyxkKSl9KTtpZihjKWZvcihjLnVjJiYoYy51Yy5kYT1udWxsKSxhPXRoaXMuZ2Y9YztudWxsIT09YTthPWEuYWYpYT09PXRoaXMua2omJih0aGlzLmtqPW51bGwpLHRoaXMucGouZGVsZXRlKGEua2V5KSxhLmFmPWEuZGEsYS5DaT1hLkpjLGEuSmM9bnVsbCxhLnVjPW51bGwsYS5kYT1udWxsO3RoaXMuUmsmJih0aGlzLlJrLldxPW51bGwpO3RoaXMuSmQmJih0aGlzLkpkLnVnPW51bGwpO3JldHVybiB0aGlzLkFvfTsKaC56TD1mdW5jdGlvbihhLGIpe2lmKGEpe3ZhciBjPWEudWM7Yi5kYT1hO2IudWM9YzthLnVjPWI7YyYmKGMuZGE9Yik7YT09PXRoaXMua2omJih0aGlzLmtqPWIpO3JldHVybiB0aGlzLlJpPWF9dGhpcy5SaT8odGhpcy5SaS5kYT1iLGIudWM9dGhpcy5SaSk6dGhpcy5raj1iO3RoaXMuUmk9YjtyZXR1cm4gbnVsbH07aC5ZSz1mdW5jdGlvbihhLGIpe2lmKHRoaXMucGouaGFzKGEpKXthPXRoaXMucGouZ2V0KGEpO3RoaXMuQ0MoYSxiKTtiPWEudWM7dmFyIGM9YS5kYTtiJiYoYi5kYT1jKTtjJiYoYy51Yz1iKTthLmRhPW51bGw7YS51Yz1udWxsO3JldHVybiBhfWM9bmV3IHhmKGEpO3RoaXMucGouc2V0KGEsYyk7Yy5KYz1iO3RoaXMuVkkoYyk7cmV0dXJuIGN9OwpoLnB3PWZ1bmN0aW9uKCl7aWYodGhpcy5Bbyl7dmFyIGE7Zm9yKGE9dGhpcy5jRD10aGlzLmtqO251bGwhPT1hO2E9YS5kYSlhLlB2PWEuZGE7Zm9yKGE9dGhpcy5RaztudWxsIT09YTthPWEuV3EpYS5DaT1hLkpjO2ZvcihhPXRoaXMubmU7bnVsbCE9YTthPWEudWcpYS5DaT1hLkpjO3RoaXMuZ2Y9dGhpcy5uZT10aGlzLkpkPXRoaXMuUWs9dGhpcy5Saz1udWxsfX07aC5DQz1mdW5jdGlvbihhLGIpe09iamVjdC5pcyhiLGEuSmMpfHwoYS5DaT1hLkpjLGEuSmM9Yix0aGlzLldJKGEpKX07aC5WST1mdW5jdGlvbihhKXtudWxsPT09dGhpcy5uZT90aGlzLm5lPXRoaXMuSmQ9YTp0aGlzLkpkPXRoaXMuSmQudWc9YX07aC5XST1mdW5jdGlvbihhKXtudWxsPT09dGhpcy5Raz90aGlzLlFrPXRoaXMuUms9YTp0aGlzLlJrPXRoaXMuUmsuV3E9YX07CmguUUs9ZnVuY3Rpb24oYSxiKXthIGluc3RhbmNlb2YgTWFwP2EuZm9yRWFjaChiKTpPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBiKGFbY10sYyl9KX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh2Zi5wcm90b3R5cGUse0FvOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMubmV8fG51bGwhPT10aGlzLlFrfHxudWxsIT09dGhpcy5nZn19fSk7dmFyIHhmPWZ1bmN0aW9uKGEpe3RoaXMua2V5PWE7dGhpcy5XcT10aGlzLmFmPXRoaXMudWc9dGhpcy51Yz10aGlzLmRhPXRoaXMuUHY9dGhpcy5KYz10aGlzLkNpPW51bGx9O3ZhciB5Zj1mdW5jdGlvbihhKXt0aGlzLiR4PWF9O3lmLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuJHguZmluZChmdW5jdGlvbihjKXtyZXR1cm4gYy5zdXBwb3J0cyhhKX0pO2lmKG51bGwhPWIpcmV0dXJuIGI7dGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICciK2ErIicgb2YgdHlwZSAnIisoYS5uYW1lfHx0eXBlb2YgYSkrIiciKTt9O3lmLmhhPVRjKHtMOnlmLFk6InJvb3QiLFY6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHlmKFtuZXcgbGZdKX19KTt2YXIgemY9ZnVuY3Rpb24oYSl7dGhpcy4keD1hfTt6Zi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiR4LmZpbmQoZnVuY3Rpb24oYyl7cmV0dXJuIGMuc3VwcG9ydHMoYSl9KTtpZihiKXJldHVybiBiO3Rocm93IEVycm9yKCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnIithKyInIik7fTt6Zi5oYT1UYyh7TDp6ZixZOiJyb290IixWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6ZihbbmV3IHVmXSl9fSk7dmFyIEFmPWZ1bmN0aW9uKGEsYixjKXt0aGlzLkNpPWE7dGhpcy5KYz1iO3RoaXMuRlA9Y307dmFyIEJmPW5ldyB5ZihbbmV3IGxmXSksQ2Y9bmV3IHpmKFtuZXcgdWZdKTt2YXIgRGY9ZnVuY3Rpb24oKXt9O0RmLm1nPWZ1bmN0aW9uKCl7fTt2YXIgRWY9ZnVuY3Rpb24oKXt9O0VmLm1nPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBGZihhLGIpe2EubmdEZWJ1Z0NvbnRleHQ9YjthLm5nRXJyb3JMb2dnZXI9Yi5wUS5iaW5kKGIpfWZ1bmN0aW9uIEdmKCl7cmV0dXJuIEVycm9yKCJWaWV3RGVzdHJveWVkRXJyb3I6IEF0dGVtcHQgdG8gdXNlIGEgZGVzdHJveWVkIHZpZXc6ICIrSGZbSWZdKX07ZnVuY3Rpb24gSmYoYSxiLGMpe3ZhciBkPWEuc3RhdGUsZT1kJjE3OTI7cmV0dXJuIGU9PT1iPyhhLnN0YXRlPWQmLTE3OTN8YyxhLnF5PS0xLCEwKTplPT09Y31mdW5jdGlvbiBLZihhLGIsYyl7cmV0dXJuKGEuc3RhdGUmMTc5Mik9PT1iJiZhLnF5PD1jPyhhLnF5PWMrMSwhMCk6ITF9dmFyIExmPXZvaWQgMCxNZj12b2lkIDAsTmY9dm9pZCAwLE9mPXZvaWQgMCxQZj12b2lkIDAsUWY9dm9pZCAwLFJmPXZvaWQgMCxTZj12b2lkIDAsVGY9dm9pZCAwLFVmPXZvaWQgMCxWZj12b2lkIDAsV2Y9dm9pZCAwLFhmPXZvaWQgMCxZZj12b2lkIDA7dmFyIFpmPWZ1bmN0aW9uKCl7fSwkZj1uZXcgTWFwO2Z1bmN0aW9uIGFnKGEpe3ZhciBiPSRmLmdldChhKTtifHwoYj1QYyhhKSsiXyIrJGYuc2l6ZSwkZi5zZXQoYSxiKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gYmcoYSxiLGMpe2MgaW5zdGFuY2VvZiBkZiYmKGM9ZWYoYyksYj1hLmJhLmpbYl0uWWQrMCxhLlhqW2JdPW5ldyBkZihlZihhLlhqW2JdKSkpO3JldHVybiBjfWZ1bmN0aW9uIGNnKGEpe3JldHVybntpZDoiJCR1bmRlZmluZWQiLGc6YS5nLFQ6YS5ULGRhdGE6YS5kYXRhfX12YXIgZGc9MDtmdW5jdGlvbiBlZyhhKXthJiYiJCR1bmRlZmluZWQiPT09YS5pZCYmKG51bGwhPWEuVCYmMiE9PWEuVHx8YS5nLmxlbmd0aHx8T2JqZWN0LmtleXMoYS5kYXRhKS5sZW5ndGg/YS5pZD0iYyIrZGcrKzphLmlkPSIkJGVtcHR5Iik7YSYmIiQkZW1wdHkiPT09YS5pZCYmKGE9bnVsbCk7cmV0dXJuIGF8fG51bGx9CmZ1bmN0aW9uIGZnKGEsYixjLGQpe3ZhciBlPWEuWGo7cmV0dXJuIGEuc3RhdGUmMnx8IU9iamVjdC5pcyhlW2IuWWQrY10sZCk/ITA6ITF9ZnVuY3Rpb24gZ2coYSxiLGMsZCl7cmV0dXJuIGZnKGEsYixjLGQpPyhhLlhqW2IuWWQrY109ZCwhMCk6ITF9CmZ1bmN0aW9uIGhnKGEsYixjLGQpe3ZhciBlPWEuWGpbYi5ZZCtjXTtpZihhLnN0YXRlJjF8fCFiZihlLGQpKXRocm93IGM9Yi5lYltjXS5uYW1lLGI9VWYoYSxiLlIpLGQ9IkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6IEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIFByZXZpb3VzIHZhbHVlOiAnIisoYysiOiAiK2UpKyInLiBDdXJyZW50IHZhbHVlOiAnIisoYysiOiAiK2QpKyInLiIsMCE9PShhLnN0YXRlJjEpJiYoZCs9IiBJdCBzZWVtcyBsaWtlIHRoZSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgaXRzIHBhcmVudCBhbmQgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXJ0eSBjaGVja2VkLiBIYXMgaXQgYmVlbiBjcmVhdGVkIGluIGEgY2hhbmdlIGRldGVjdGlvbiBob29rID8iKSxhPUVycm9yKGQpLEZmKGEsYiksYTt9CmZ1bmN0aW9uIGlnKGEpe2Zvcig7YTspYS5iYS5mbGFncyYyJiYoYS5zdGF0ZXw9OCksYT1hLk10fHxhLnBhcmVudH1mdW5jdGlvbiBqZyhhLGIsYyxkKXt0cnl7cmV0dXJuIGlnKGEuYmEualtiXS5mbGFncyYzMzU1NDQzMj9hLmpbYl0uJGQ6YSksVmYoYSxiLGMsZCl9Y2F0Y2goZSl7YS5yb290LlpoLmhhbmRsZUVycm9yKGUpfX1mdW5jdGlvbiBrZyhhKXtyZXR1cm4gYS5wYXJlbnQ/YS5wYXJlbnQualthLmJrLlJdOm51bGx9ZnVuY3Rpb24gbGcoYSl7cmV0dXJuIGEucGFyZW50P2EuYmsucGFyZW50Om51bGx9ZnVuY3Rpb24gbWcoYSxiKXtzd2l0Y2goYi5mbGFncyYyMDEzNDcwNjcpe2Nhc2UgMTpyZXR1cm4gYS5qW2IuUl0uaGQ7Y2FzZSAyOnJldHVybiBhLmpbYi5SXS5ncH19ZnVuY3Rpb24gbmcoYSl7cmV0dXJuISFhLnBhcmVudCYmISEoYS5iay5mbGFncyYzMjc2OCl9CmZ1bmN0aW9uIG9nKGEpe3ZhciBiPXt9LGM9MCxkPXt9O2EmJmEuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgZj1uKGUpO2U9Zi5uZXh0KCkudmFsdWU7Zj1mLm5leHQoKS52YWx1ZTsibnVtYmVyIj09PXR5cGVvZiBlPyhiW2VdPWYsY3w9MTw8ZSUzMik6ZFtlXT1mfSk7cmV0dXJue3BmOmIsZ2Q6ZCxJZTpjfX1mdW5jdGlvbiBwZyhhLGIpe3JldHVybiBhLm1hcChmdW5jdGlvbihjKXtpZihBcnJheS5pc0FycmF5KGMpKXtjPW4oYyk7dmFyIGQ9Yy5uZXh0KCkudmFsdWU7Yz1jLm5leHQoKS52YWx1ZX1lbHNlIGQ9MDtjJiYoImZ1bmN0aW9uIj09PXR5cGVvZiBjfHwib2JqZWN0Ij09PXR5cGVvZiBjKSYmYiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fc291cmNlIix7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KTtyZXR1cm57ZmxhZ3M6ZCxMOmMseG06YWcoYyl9fSl9CmZ1bmN0aW9uIHFnKGEsYixjKXt2YXIgZD1jLmRnO2lmKGQpe2lmKDA9PT0oZC5mbGFncyYxKXx8MD09PShkLmZsYWdzJjMzNTU0NDMyKXx8ZC5lbGVtZW50Lk1sJiYxPT09ZC5lbGVtZW50Lk1sLlQpcmV0dXJuIGEualtjLmRnLlJdLmhkfWVsc2UgcmV0dXJuIGJ9dmFyIHJnPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHNnKGEpe3ZhciBiPXJnLmdldChhKTtifHwoYj1hKGZ1bmN0aW9uKCl7cmV0dXJuIFpmfSksYi5WPWEscmcuc2V0KGEsYikpO3JldHVybiBifWZ1bmN0aW9uIHRnKGEsYixjLGQsZSl7Mz09PWImJihjPWEuaGIucGFyZW50Tm9kZShtZyhhLGEuYmEuR28pKSk7dWcoYSxiLDAsYS5iYS5qLmxlbmd0aC0xLGMsZCxlKX1mdW5jdGlvbiB1ZyhhLGIsYyxkLGUsZixnKXtmb3IoO2M8PWQ7YysrKXt2YXIgbD1hLmJhLmpbY107bC5mbGFncyYxMSYmdmcoYSxsLGIsZSxmLGcpO2MrPWwud2F9fQpmdW5jdGlvbiB3ZyhhLGIsYyxkLGUsZil7Zm9yKHZhciBnPWE7ZyYmIW5nKGcpOylnPWcucGFyZW50O3ZhciBsPWcucGFyZW50LG09bGcoZyk7Zz1tLlIrbS53YTtmb3IobT1tLlIrMTttPD1nO20rKyl7dmFyIHA9bC5iYS5qW21dO3AuVGo9PT1iJiZ2ZyhsLHAsYyxkLGUsZik7bSs9cC53YX1pZighbC5wYXJlbnQmJihiPWEucm9vdC5YUVtiXSkpZm9yKGw9MDtsPGIubGVuZ3RoO2wrKyl4ZyhhLGJbbF0sYyxkLGUsZil9CmZ1bmN0aW9uIHZnKGEsYixjLGQsZSxmKXtpZihiLmZsYWdzJjgpd2coYSxiLnNpLmluZGV4LGMsZCxlLGYpO2Vsc2V7dmFyIGc9bWcoYSxiKTszPT09YyYmYi5mbGFncyYzMzU1NDQzMiYmYi5FZyY0OD8oYi5FZyYxNiYmeGcoYSxnLGMsZCxlLGYpLGIuRWcmMzImJnhnKGEualtiLlJdLiRkLGcsYyxkLGUsZikpOnhnKGEsZyxjLGQsZSxmKTtpZihiLmZsYWdzJjE2Nzc3MjE2KXtnPWEualtiLlJdLmpoLlZlO2Zvcih2YXIgbD0wO2w8Zy5sZW5ndGg7bCsrKXRnKGdbbF0sYyxkLGUsZil9Yi5mbGFncyYxJiYhYi5lbGVtZW50Lm5hbWUmJnVnKGEsYyxiLlIrMSxiLlIrYi53YSxkLGUsZil9fWZ1bmN0aW9uIHhnKGEsYixjLGQsZSxmKXthPWEuaGI7c3dpdGNoKGMpe2Nhc2UgMTphLmFwcGVuZENoaWxkKGQsYik7YnJlYWs7Y2FzZSAyOmEuaW5zZXJ0QmVmb3JlKGQsYixlKTticmVhaztjYXNlIDM6YS5yZW1vdmVDaGlsZChkLGIpO2JyZWFrO2Nhc2UgMDpmLnB1c2goYil9fXZhciB5Zz0vXjooW146XSspOiguKykkLzsKZnVuY3Rpb24gemcoYSl7cmV0dXJuIjoiPT09YVswXT8oYT1hLm1hdGNoKHlnKSxbYVsxXSxhWzJdXSk6WyIiLGFdfWZ1bmN0aW9uIEFnKGEpe2Zvcih2YXIgYj0wLGM9MDtjPGEubGVuZ3RoO2MrKylifD1hW2NdLmZsYWdzO3JldHVybiBifWZ1bmN0aW9uIEJnKGEpe3JldHVybiBudWxsIT1hP2EudG9TdHJpbmcoKToiIn07dmFyIENnPXt9LERnPWFnKHBlKSxFZz1hZyhnZCksRmc9YWcocGQpO2Z1bmN0aW9uIEEoYSxiLGMsZCl7Yz1TYyhjKTtyZXR1cm57aW5kZXg6LTEsS2E6cGcoZCxQYyhiKSksZmxhZ3M6YSxMOmIsdmFsdWU6Y319ZnVuY3Rpb24gR2coYSl7Zm9yKHZhciBiPXt9LGM9W10sZD1udWxsLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGY9YVtlXTtmLkw9PT1vZSYmKGQ9Zi52YWx1ZSk7Zi5mbGFncyYxMDczNzQxODI0JiZjLnB1c2goZi5MKTtmLmluZGV4PWU7YlthZyhmLkwpXT1mfXJldHVybntWOm51bGwsa2s6YixyYzphLE9vOmMsc2NvcGU6ZH19CmZ1bmN0aW9uIEhnKGEsYixjKXtjPXZvaWQgMD09PWM/aGQ6Yzt2YXIgZD1sZChhKTt0cnl7aWYoYi5mbGFncyY4KXJldHVybiBiLkw7Yi5mbGFncyYyJiYoYz1udWxsKTtpZihiLmZsYWdzJjEpcmV0dXJuIGEuJC5nZXQoYi5MLGMpO3ZhciBlPWIueG07c3dpdGNoKGUpe2Nhc2UgRGc6Y2FzZSBFZzpjYXNlIEZnOnJldHVybiBhfXZhciBmPWEub2Uua2tbZV0sZztpZihmKXt2YXIgbD1hLnVsW2YuaW5kZXhdO3ZvaWQgMD09PWwmJihsPWEudWxbZi5pbmRleF09SWcoYSxmKSk7cmV0dXJuIGw9PT1DZz92b2lkIDA6bH12YXIgbTtpZihtPWc9VWMoYi5MKSl7dmFyIHA9Zy5ZO209bnVsbCE9cCYmKCJhbnkiPT09cHx8cD09PWEub2Uuc2NvcGV8fC0xPGEub2UuT28uaW5kZXhPZihwKSl9aWYobSl7dmFyIHE9YS51bC5sZW5ndGg7YS5vZS5yY1txXT1hLm9lLmtrW2IueG1dPXtmbGFnczo1MTIwLHZhbHVlOmcuVixLYTpbXSxpbmRleDpxLEw6Yi5MfTthLnVsW3FdPUNnO3JldHVybiBhLnVsW3FdPQpJZyhhLGEub2Uua2tbYi54bV0pfXJldHVybiBiLmZsYWdzJjQ/YzphLiQuZ2V0KGIuTCxjKX1maW5hbGx5e2xkKGQpfX1mdW5jdGlvbiBJZyhhLGIpe3N3aXRjaChiLmZsYWdzJjIwMTM0NzA2Nyl7Y2FzZSA1MTI6dmFyIGM9SmcoYSxiLnZhbHVlLGIuS2EpO2JyZWFrO2Nhc2UgMTAyNDpjPUtnKGEsYi52YWx1ZSxiLkthKTticmVhaztjYXNlIDIwNDg6Yz1IZyhhLGIuS2FbMF0pO2JyZWFrO2Nhc2UgMjU2OmM9Yi52YWx1ZX1jPT09Q2d8fG51bGw9PT1jfHwib2JqZWN0IiE9PXR5cGVvZiBjfHxiLmZsYWdzJjEzMTA3Mnx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBjLlh8fChiLmZsYWdzfD0xMzEwNzIpO3JldHVybiB2b2lkIDA9PT1jP0NnOmN9CmZ1bmN0aW9uIEpnKGEsYixjKXt2YXIgZD1jLmxlbmd0aDtzd2l0Y2goZCl7Y2FzZSAwOnJldHVybiBuZXcgYjtjYXNlIDE6cmV0dXJuIG5ldyBiKEhnKGEsY1swXSkpO2Nhc2UgMjpyZXR1cm4gbmV3IGIoSGcoYSxjWzBdKSxIZyhhLGNbMV0pKTtjYXNlIDM6cmV0dXJuIG5ldyBiKEhnKGEsY1swXSksSGcoYSxjWzFdKSxIZyhhLGNbMl0pKTtkZWZhdWx0OmZvcih2YXIgZT1bXSxmPTA7ZjxkO2YrKyllW2ZdPUhnKGEsY1tmXSk7cmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoYixbbnVsbF0uY29uY2F0KGphKGUpKSkpfX0KZnVuY3Rpb24gS2coYSxiLGMpe3ZhciBkPWMubGVuZ3RoO3N3aXRjaChkKXtjYXNlIDA6cmV0dXJuIGIoKTtjYXNlIDE6cmV0dXJuIGIoSGcoYSxjWzBdKSk7Y2FzZSAyOnJldHVybiBiKEhnKGEsY1swXSksSGcoYSxjWzFdKSk7Y2FzZSAzOnJldHVybiBiKEhnKGEsY1swXSksSGcoYSxjWzFdKSxIZyhhLGNbMl0pKTtkZWZhdWx0OmZvcih2YXIgZT1bXSxmPTA7ZjxkO2YrKyllW2ZdPUhnKGEsY1tmXSk7cmV0dXJuIGIuYXBwbHkobnVsbCxqYShlKSl9fWZ1bmN0aW9uIExnKGEpe2Zvcih2YXIgYj1hLm9lLGM9bmV3IFNldCxkPTA7ZDxiLnJjLmxlbmd0aDtkKyspaWYoYi5yY1tkXS5mbGFncyYxMzEwNzIpe3ZhciBlPWEudWxbZF07aWYoZSYmZSE9PUNnKXt2YXIgZj1lLlg7ImZ1bmN0aW9uIiE9PXR5cGVvZiBmfHxjLmhhcyhlKXx8KGYuYXBwbHkoZSksYy5hZGQoZSkpfX19O2Z1bmN0aW9uIE1nKGEsYil7YT1hLmpoLlZlO2lmKG51bGw9PWJ8fGI+PWEubGVuZ3RoKWI9YS5sZW5ndGgtMTtpZigwPmIpcmV0dXJuIG51bGw7dmFyIGM9YVtiXTtjLk10PW51bGw7bGUoYSxiKTtZZihjKTtOZyhjKTtyZXR1cm4gY31mdW5jdGlvbiBPZyhhLGIsYyl7Yj1iP21nKGIsYi5iYS5Hbyk6YS5oZDthPWMuaGIucGFyZW50Tm9kZShiKTtiPWMuaGIubmV4dFNpYmxpbmcoYik7dGcoYywyLGEsYix2b2lkIDApfWZ1bmN0aW9uIE5nKGEpe3RnKGEsMyxudWxsLG51bGwsdm9pZCAwKX07dmFyIFBnPXt9O2Z1bmN0aW9uIFFnKGEsYixjKXtyZXR1cm4gbmV3IFJnKGEsYixjLHt9LHt9LFtdKX12YXIgUmc9ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLmllPWE7dGhpcy5Zbj1iO3RoaXMueUw9ZDt0aGlzLlJDPWU7dGhpcy52ST1jfTt0KFJnLFRlKTtSZy5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCFkKXRocm93IEVycm9yKCJuZ01vZHVsZSBzaG91bGQgYmUgcHJvdmlkZWQiKTt2YXIgZT1zZyh0aGlzLnZJKSxmPWUualswXS5lbGVtZW50LlhuLlI7YT1NZihhLGJ8fFtdLGMsZSxkLFBnKTtmPWEualtmXS5pbnN0YW5jZTtjJiZhLmhiLnNldEF0dHJpYnV0ZShhLmpbMF0uaGQsIm5nLXZlcnNpb24iLGtmLm9vKTtyZXR1cm4gbmV3IFNnKGEsbmV3IFRnKGEpLGYpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZy5wcm90b3R5cGUse2lucHV0czp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9W10sYj10aGlzLnlMLGM7Zm9yKGMgaW4gYilhLnB1c2goe2prOmMsdlI6YltjXX0pO3JldHVybiBhfX0sb3V0cHV0czp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlJDKWEucHVzaCh7ams6Yix2Ujp0aGlzLlJDW2JdfSk7cmV0dXJuIGF9fX0pO3ZhciBTZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5JYT1hO3RoaXMuSWg9Yjt0aGlzLldKPWM7dGhpcy5WbT10aGlzLklhLmJhLmpbMF07dGhpcy5kaT1iO3RoaXMuaW5zdGFuY2U9Y307dChTZyxTZSk7U2cucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLkloLmRlc3Ryb3koKX07U2cucHJvdG90eXBlLlZhPWZ1bmN0aW9uKGEpe3RoaXMuSWguVmEoYSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNnLnByb3RvdHlwZSx7bG9jYXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuZXcgeih0aGlzLklhLmpbdGhpcy5WbS5SXS5oZCl9fSxaOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFVnKHRoaXMuSWEsdGhpcy5WbSl9fSxZbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV0ouY29uc3RydWN0b3J9fX0pO3ZhciBWZz1mdW5jdGlvbihhLGIsYyl7dGhpcy5JYT1hO3RoaXMuVm09Yjt0aGlzLlhrPWM7dGhpcy5WZT1bXX07VmcucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmUubGVuZ3RoLTE7MDw9YTthLS0pe3ZhciBiPU1nKHRoaXMuWGssYSk7U2YoYil9fTsKVmcucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4oYT10aGlzLlZlW2FdKT8oYT1uZXcgVGcoYSksV2coYSx0aGlzKSxhKTpudWxsfTtWZy5wcm90b3R5cGUuSWM9ZnVuY3Rpb24oYSxiLGMpe2E9YS5JYyhifHx7fSk7dGhpcy5JcyhhLGMpO3JldHVybiBhfTt2YXIgWGc9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7ZD1kfHxhLlBRO2V8fGIgaW5zdGFuY2VvZiBYZXx8KGU9ZC5nZXQocGQpKTtiPWIuY3JlYXRlKGQsdm9pZCAwLHZvaWQgMCxlKTthLklzKGIuZGksYyk7cmV0dXJuIGJ9O2g9VmcucHJvdG90eXBlOwpoLklzPWZ1bmN0aW9uKGEsYil7aWYoYS5hZSl0aHJvdyBFcnJvcigiQ2Fubm90IGluc2VydCBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEiKTt2YXIgYz10aGlzLlhrLGQ9YS5JYSxlPWMuamguVmU7aWYobnVsbD09PWJ8fHZvaWQgMD09PWIpYj1lLmxlbmd0aDtkLk10PXRoaXMuSWE7dmFyIGY9YjtmPj1lLmxlbmd0aD9lLnB1c2goZCk6ZS5zcGxpY2UoZiwwLGQpO2lmKChmPWtnKGQpKSYmZiE9PWMmJiEoZC5zdGF0ZSYxNikpe2Quc3RhdGV8PTE2O3ZhciBnPWYuUWIubHI7Z3x8KGc9Zi5RYi5scj1bXSk7Zy5wdXNoKGQpO2Y9ZC5wYXJlbnQuYmE7Zz1kLmJrO2lmKCEoZy5mbGFncyY0KSlmb3IoZi5XZ3w9NCxnLmZsYWdzfD00LGY9Zy5wYXJlbnQ7ZjspZi5OYnw9NCxmPWYucGFyZW50fVlmKGQpO09nKGMsMDxiP2VbYi0xXTpudWxsLGQpO1dnKGEsdGhpcyl9OwpoLm1vdmU9ZnVuY3Rpb24oYSxiKXtpZihhLmFlKXRocm93IEVycm9yKCJDYW5ub3QgbW92ZSBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEiKTt2YXIgYz10aGlzLlhrLGQ9dGhpcy5WZS5pbmRleE9mKGEuSWEpLGU9Yy5qaC5WZSxmPWVbZF07bGUoZSxkKTtudWxsPT1iJiYoYj1lLmxlbmd0aCk7ZD1iO2Q+PWUubGVuZ3RoP2UucHVzaChmKTplLnNwbGljZShkLDAsZik7WWYoZik7TmcoZik7T2coYywwPGI/ZVtiLTFdOm51bGwsZik7cmV0dXJuIGF9O2guaW5kZXhPZj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5WZS5pbmRleE9mKGEuSWEpfTtoLnJlbW92ZT1mdW5jdGlvbihhKXsoYT1NZyh0aGlzLlhrLGEpKSYmU2YoYSl9O2guZGV0YWNoPWZ1bmN0aW9uKGEpe3JldHVybihhPU1nKHRoaXMuWGssYSkpP25ldyBUZyhhKTpudWxsfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhWZy5wcm90b3R5cGUse2VsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuZXcgeih0aGlzLlhrLmhkKX19LFo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBuZXcgVWcodGhpcy5JYSx0aGlzLlZtKX19LFBROntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5JYSxiPXRoaXMuVm0ucGFyZW50OyFiJiZhOyliPWxnKGEpLGE9YS5wYXJlbnQ7cmV0dXJuIGE/bmV3IFVnKGEsYik6bmV3IFVnKHRoaXMuSWEsbnVsbCl9fSxsZW5ndGg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZlLmxlbmd0aH19fSk7dmFyIFRnPWZ1bmN0aW9uKGEpe3RoaXMuSWE9YTt0aGlzLlRlPXRoaXMuemI9bnVsbH0sWWc9ZnVuY3Rpb24oYSl7aWcoYS5JYSl9OwpoPVRnLnByb3RvdHlwZTtoLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuSWEuc3RhdGUmPS01fTtoLkxnPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5yb290LnZIO2EuUWgmJmEuUWgoKTt0cnl7UWYodGhpcy5JYSl9ZmluYWxseXthLmVuZCYmYS5lbmQoKX19O2guWkU9ZnVuY3Rpb24oKXtSZih0aGlzLklhKX07aC5WYT1mdW5jdGlvbihhKXt0aGlzLklhLlhofHwodGhpcy5JYS5YaD1bXSk7dGhpcy5JYS5YaC5wdXNoKGEpfTtoLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLlRlPyhaZyh0aGlzLlRlLnhqLHRoaXMpLCRnKHRoaXMpKTp0aGlzLnpiJiZ0aGlzLnpiLmRldGFjaCh0aGlzLnpiLmluZGV4T2YodGhpcykpO1NmKHRoaXMuSWEpfTsKdmFyICRnPWZ1bmN0aW9uKGEpe2EuVGU9bnVsbDtOZyhhLklhKTtZZihhLklhKX0sV2c9ZnVuY3Rpb24oYSxiKXtpZihhLlRlKXRocm93IEVycm9yKCJUaGlzIHZpZXcgaXMgYWxyZWFkeSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgQXBwbGljYXRpb25SZWYhIik7YS56Yj1ifTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFRnLnByb3RvdHlwZSx7cHo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBhPVtdO3RnKHRoaXMuSWEsMCx2b2lkIDAsdm9pZCAwLGEpO3JldHVybiBhfX0sY29udGV4dDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEuY29udGV4dH19LGFlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9PSh0aGlzLklhLnN0YXRlJjEyOCl9fX0pO3ZhciBhaD1mdW5jdGlvbihhLGIpe3RoaXMuWUM9YTt0aGlzLm9lPWJ9Owp0KGFoLERmKTthaC5tZz1EZi5tZzthaC5wcm90b3R5cGUuSWM9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBUZyhOZih0aGlzLllDLHRoaXMub2UsdGhpcy5vZS5lbGVtZW50LlFiLGEpKX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhhaC5wcm90b3R5cGUse1VmOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHoodGhpcy5ZQy5qW3RoaXMub2UuUl0uaGQpfX19KTt2YXIgVWc9ZnVuY3Rpb24oYSxiKXt0aGlzLnZpZXc9YTt0aGlzLkFlPWJ9O1VnLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/aGQ6YjtyZXR1cm4gVGYodGhpcy52aWV3LHRoaXMuQWUsdGhpcy5BZT8wIT09KHRoaXMuQWUuZmxhZ3MmMzM1NTQ0MzIpOiExLHtmbGFnczowLEw6YSx4bTphZyhhKX0sYil9OwpmdW5jdGlvbiBGKGEsYil7dmFyIGM9YS5iYS5qW2JdO2lmKGMuZmxhZ3MmMSlyZXR1cm4gYT1hLmpbYy5SXSxjLmVsZW1lbnQuUWI/YS5RYjphLmhkO2lmKGMuZmxhZ3MmMilyZXR1cm4gYS5qW2MuUl0uZ3A7aWYoYy5mbGFncyYyMDI0MClyZXR1cm4gYS5qW2MuUl0uaW5zdGFuY2U7dGhyb3cgRXJyb3IoIklsbGVnYWwgc3RhdGU6IHJlYWQgbm9kZVZhbHVlIGZvciBub2RlIGluZGV4ICIrYik7fWZ1bmN0aW9uIGJoKGEsYixjLGQpe3JldHVybiBuZXcgY2goYSxiLGMsZCl9dmFyIGNoPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuWUw9YTt0aGlzLiQ9Yjt0aGlzLmZxPWM7dGhpcy5vZT1kO3RoaXMuVG09W107dGhpcy5hYT0hMTt0aGlzLlo9dGhpcztmb3IodmFyIGU9dGhpcy5vZSxmPXRoaXMudWw9bWUoZS5yYy5sZW5ndGgpLGc9MDtnPGUucmMubGVuZ3RoO2crKyl7dmFyIGw9ZS5yY1tnXTtsLmZsYWdzJjQwOTZ8fHZvaWQgMD09PWZbZ10mJihmW2ddPUlnKHRoaXMsbCkpfX07CmNoLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSxiLGMpe2I9dm9pZCAwPT09Yj9oZDpiO2M9dm9pZCAwPT09Yz8wOmM7dmFyIGQ9MDtjJjQ/ZHw9MTpjJjImJihkfD00KTtyZXR1cm4gSGcodGhpcyx7TDphLHhtOmFnKGEpLGZsYWdzOmR9LGIpfTtjaC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2lmKHRoaXMuYWEpdGhyb3cgRXJyb3IoIlRoZSBuZyBtb2R1bGUgIitQYyh0aGlzLmluc3RhbmNlLmNvbnN0cnVjdG9yKSsiIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLiIpO3RoaXMuYWE9ITA7TGcodGhpcyk7dGhpcy5UbS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KX07Y2gucHJvdG90eXBlLlZhPWZ1bmN0aW9uKGEpe3RoaXMuVG0ucHVzaChhKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2gucHJvdG90eXBlLHtpbnN0YW5jZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHRoaXMuWUwpfX0sV246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChVZSl9fX0pO3ZhciBkaD1hZyhaZSksZWg9YWcoeiksZmg9YWcoRWYpLGdoPWFnKERmKSxoaD1hZyhuZSksaWg9YWcocGUpLGpoPWFnKGdkKTtmdW5jdGlvbiBJKGEsYixjLGQsZSxmLGcsbCl7dmFyIG09W107aWYoZylmb3IodmFyIHAgaW4gZyl7dmFyIHE9bihnW3BdKSxyPXEubmV4dCgpLnZhbHVlO3E9cS5uZXh0KCkudmFsdWU7bVtyXT17ZmxhZ3M6OCxuYW1lOnAsUm86cSxXajpudWxsLG1wOm51bGwsc3VmZml4Om51bGx9fWc9W107aWYobClmb3IodmFyIHYgaW4gbClnLnB1c2goe3R5cGU6MSxqazp2LHRhcmdldDpudWxsLEJlOmxbdl19KTtyZXR1cm4ga2goYSxifDE2Mzg0LGMsZCxlLGUsZixtLGcpfWZ1bmN0aW9uIGxoKGEsYixjKXtyZXR1cm4ga2goLTEsYXwxNixudWxsLDAsYixiLGMpfWZ1bmN0aW9uIG1oKGEsYixjLGQsZSl7cmV0dXJuIGtoKC0xLGEsYiwwLGMsZCxlKX0KZnVuY3Rpb24ga2goYSxiLGMsZCxlLGYsZyxsLG0pe3ZhciBwPW9nKGMpO2M9cC5wZjt2YXIgcT1wLmdkO3A9cC5JZTttfHwobT1bXSk7bHx8KGw9W10pO2Y9U2MoZik7Zz1wZyhnLFBjKGUpKTtyZXR1cm57UjotMSxwYXJlbnQ6bnVsbCxkZzpudWxsLFlkOi0xLFpnOi0xLExsOmEsZmxhZ3M6YixOYjowLE1nOjAsJGM6MCxwZjpjLEllOnAsZ2Q6cSxUajotMSx3YTpkLGViOmwsRWc6QWcobCksb3V0cHV0czptLGVsZW1lbnQ6bnVsbCxOYzp7TDplLHZhbHVlOmYsS2E6Z30sdGV4dDpudWxsLHF1ZXJ5Om51bGwsc2k6bnVsbH19ZnVuY3Rpb24gbmgoYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gamcoYSxiLGMsZCl9fQpmdW5jdGlvbiBvaChhLGIpe3ZhciBjPTA8KGIuZmxhZ3MmODE5MiksZD1iLk5jO3N3aXRjaChiLmZsYWdzJjIwMTM0NzA2Nyl7Y2FzZSA1MTI6cmV0dXJuIHBoKGEsYi5wYXJlbnQsYyxkLnZhbHVlLGQuS2EpO2Nhc2UgMTAyNDphOntiPWIucGFyZW50O3ZhciBlPWQudmFsdWU7ZD1kLkthO3ZhciBmPWQubGVuZ3RoO3N3aXRjaChmKXtjYXNlIDA6YT1lKCk7YnJlYWsgYTtjYXNlIDE6YT1lKHFoKGEsYixjLGRbMF0pKTticmVhayBhO2Nhc2UgMjphPWUocWgoYSxiLGMsZFswXSkscWgoYSxiLGMsZFsxXSkpO2JyZWFrIGE7Y2FzZSAzOmE9ZShxaChhLGIsYyxkWzBdKSxxaChhLGIsYyxkWzFdKSxxaChhLGIsYyxkWzJdKSk7YnJlYWsgYTtkZWZhdWx0OmZvcih2YXIgZz1bXSxsPTA7bDxmO2wrKylnLnB1c2gocWgoYSxiLGMsZFtsXSkpO2E9ZS5hcHBseShudWxsLGphKGcpKX19cmV0dXJuIGE7Y2FzZSAyMDQ4OnJldHVybiBxaChhLGIucGFyZW50LGMsZC5LYVswXSk7Y2FzZSAyNTY6cmV0dXJuIGQudmFsdWV9fQpmdW5jdGlvbiBwaChhLGIsYyxkLGUpe3ZhciBmPWUubGVuZ3RoO3N3aXRjaChmKXtjYXNlIDA6cmV0dXJuIG5ldyBkO2Nhc2UgMTpyZXR1cm4gbmV3IGQocWgoYSxiLGMsZVswXSkpO2Nhc2UgMjpyZXR1cm4gbmV3IGQocWgoYSxiLGMsZVswXSkscWgoYSxiLGMsZVsxXSkpO2Nhc2UgMzpyZXR1cm4gbmV3IGQocWgoYSxiLGMsZVswXSkscWgoYSxiLGMsZVsxXSkscWgoYSxiLGMsZVsyXSkpO2RlZmF1bHQ6Zm9yKHZhciBnPVtdLGw9MDtsPGY7bCsrKWcucHVzaChxaChhLGIsYyxlW2xdKSk7cmV0dXJuIG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoZCxbbnVsbF0uY29uY2F0KGphKGcpKSkpfX12YXIgcmg9e307CmZ1bmN0aW9uIHFoKGEsYixjLGQsZSl7ZT12b2lkIDA9PT1lP2hkOmU7aWYoZC5mbGFncyY4KXJldHVybiBkLkw7ZC5mbGFncyYyJiYoZT1udWxsKTt2YXIgZj1kLnhtO2Y9PT1oaCYmKGM9ISghYnx8IWIuZWxlbWVudC4kZCkpO2ImJmQuZmxhZ3MmMSYmKGM9ITEsYj1iLnBhcmVudCk7Zm9yKHZhciBnPWE7Zzspe2lmKGIpc3dpdGNoKGYpe2Nhc2UgZGg6cmV0dXJuIHNoKGcsYixjKS5oYjtjYXNlIGVoOnJldHVybiBuZXcgeihnLmpbYi5SXS5oZCk7Y2FzZSBmaDpyZXR1cm4gZy5qW2IuUl0uamg7Y2FzZSBnaDppZihiLmVsZW1lbnQuUWIpcmV0dXJuIGcualtiLlJdLlFiO2JyZWFrO2Nhc2UgaGg6cmV0dXJuIG5ldyBUZyhzaChnLGIsYykpO2Nhc2UgaWg6Y2FzZSBqaDpyZXR1cm4gbmV3IFVnKGcsYik7ZGVmYXVsdDppZihiPShjP2IuZWxlbWVudC5HbDpiLmVsZW1lbnQuY2cpW2ZdKXJldHVybiBhPWcualtiLlJdLGF8fChhPXtpbnN0YW5jZTpvaChnLGIpfSxnLmpbYi5SXT1hKSxhLmluc3RhbmNlfWM9Cm5nKGcpO2I9bGcoZyk7Zz1nLnBhcmVudDtkLmZsYWdzJjQmJihnPW51bGwpfWc9YS5yb290LlouZ2V0KGQuTCxyaCk7cmV0dXJuIGchPT1yaHx8ZT09PXJoP2c6YS5yb290LlpmLlouZ2V0KGQuTCxlKX1mdW5jdGlvbiBzaChhLGIsYyl7aWYoYylhPWEualtiLlJdLiRkO2Vsc2UgZm9yKDthLnBhcmVudCYmIW5nKGEpOylhPWEucGFyZW50O3JldHVybiBhfWZ1bmN0aW9uIHRoKGEsYixjLGQsZSxmKXtpZihjLmZsYWdzJjMyNzY4KXt2YXIgZz1hLmpbYy5wYXJlbnQuUl0uJGQ7Zy5iYS5mbGFncyYyJiYoZy5zdGF0ZXw9OCl9Yi5pbnN0YW5jZVtjLmViW2RdLm5hbWVdPWU7Yy5mbGFncyY1MjQyODgmJihmPWZ8fHt9LGZbYy5lYltkXS5Sb109bmV3IEFmKGVmKGEuWGpbYy5ZZCtkXSksZSwwIT09KGEuc3RhdGUmMikpKTthLlhqW2MuWWQrZF09ZTtyZXR1cm4gZn0KZnVuY3Rpb24gdWgoYSxiKXtpZihhLmJhLldnJmIpZm9yKHZhciBjPWEuYmEuaixkPTAsZT0wO2U8Yy5sZW5ndGg7ZSsrKXt2YXIgZj1jW2VdLGc9Zi5wYXJlbnQ7IWcmJmYuZmxhZ3MmYiYmdmgoYSxlLGYuZmxhZ3MmYixkKyspO2ZvcigwPT09KGYuTmImYikmJihlKz1mLndhKTtnJiZnLmZsYWdzJjEmJmU9PT1nLlIrZy53YTspe2lmKGcuTWcmYil7Zj1hO2Zvcih2YXIgbD1nLG09YixwPWwuUisxO3A8PWwuUitsLndhO3ArKyl7dmFyIHE9Zi5iYS5qW3BdO3EuZmxhZ3MmbSYmdmgoZixwLHEuZmxhZ3MmbSxkKyspO3ArPXEud2F9fWc9Zy5wYXJlbnR9fX1mdW5jdGlvbiB2aChhLGIsYyxkKXt2YXIgZT1hLmpbYl07ZSYmKGU9ZS5pbnN0YW5jZSkmJihMZihhLGIpLGMmMTA0ODU3NiYmS2YoYSw1MTIsZCkmJmUucWYoKSxjJjIwOTcxNTImJmUuSEcoKSxjJjQxOTQzMDQmJktmKGEsNzY4LGQpJiZlLkxjKCksYyY4Mzg4NjA4JiZlLklHKCksYyYxMzEwNzImJmUuWCgpKX07dmFyIHdoPW5ldyB5KCJTQ0hFRFVMRVJfVE9LRU4iLHtZOiJyb290IixWOmZ1bmN0aW9uKCl7cmV0dXJuIHJkfX0pO2Z1bmN0aW9uIHhoKCl7dGhyb3cgRXJyb3IoIlJ1bnRpbWUgY29tcGlsZXIgaXMgbm90IGxvYWRlZCIpO312YXIgeWg9ZnVuY3Rpb24oKXt0aGlzLmNGPXhofTt2YXIgemg9UHJvbWlzZS5yZXNvbHZlKDApO2Z1bmN0aW9uIEFoKGEpeyJ1bmRlZmluZWQiPT09dHlwZW9mIFpvbmU/emgudGhlbihmdW5jdGlvbigpe2EmJmEuYXBwbHkobnVsbCxudWxsKX0pOlpvbmUuY3VycmVudC5wbSgic2NoZWR1bGVNaWNyb3Rhc2siLGEpfTsvKgoKCiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBHb29nbGUsIEluYy4sIE5ldGZsaXgsIEluYy4sIE1pY3Jvc29mdCBDb3JwLiBhbmQgY29udHJpYnV0b3JzCgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiovCnZhciBCaD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5yZWplY3Q9dGhpcy5yZXNvbHZlPW51bGw7dGhpcy5mZT1uZXcgUHJvbWlzZShmdW5jdGlvbihiLGMpe2EucmVzb2x2ZT1iO2EucmVqZWN0PWN9KX07ZnVuY3Rpb24gQ2goYSl7cmV0dXJuIFZhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uIGMoKXt2YXIgZCxlLGYsZyxsLG0scCxxLHI7cmV0dXJuIExhKGMsZnVuY3Rpb24odil7c3dpdGNoKHYuS2Upe2Nhc2UgMTpkPVtdLGU9W10sZj0hMSxnPW51bGwsbD0hMSxtPWEuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKHcpezA8ZC5sZW5ndGg/ZC5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOncsZG9uZTohMX0pOmUucHVzaCh3KX0sZXJyb3I6ZnVuY3Rpb24odyl7Zj0hMDtmb3IoZz13OzA8ZC5sZW5ndGg7KWQuc2hpZnQoKS5yZWplY3Qodyl9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Zm9yKGw9ITA7MDxkLmxlbmd0aDspZC5zaGlmdCgpLnJlc29sdmUoe3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9fSksQWEodik7Y2FzZSA1OmlmKDA8ZS5sZW5ndGgpcmV0dXJuIHphKHYsU2EoZS5zaGlmdCgpKSwyMCk7aWYobClyZXR1cm4gemEodixTYSh2b2lkIDApLDE4KTtpZihmKXRocm93IGc7cD1uZXcgQmg7ZC5wdXNoKHApOwpyZXR1cm4gemEodixTYShwLmZlKSwxMik7Y2FzZSAxMjpyZXR1cm4gcT12Lk9pLHEuZG9uZT96YSh2LFNhKHZvaWQgMCksMTcpOnphKHYsU2EocS52YWx1ZSksMTYpO2Nhc2UgMTY6cmV0dXJuIHphKHYsdi5PaSw1KTtjYXNlIDE3OnJldHVybiB2LnJldHVybih2Lk9pKTtjYXNlIDE4OnJldHVybiB2LnJldHVybih2Lk9pKTtjYXNlIDIwOnJldHVybiB6YSh2LHYuT2ksNSk7Y2FzZSAzOkNhKHYpO20udW5zdWJzY3JpYmUoKTtEYSh2LDApO2JyZWFrO2Nhc2UgMjp0aHJvdyByPUJhKHYpLHI7fX0pfSl9O3ZhciBEaD0hMCxFaD17c2V0IERmKGEpe2E/Y29uc29sZS53YXJuKCJERVBSRUNBVEVEISBSeEpTIHdhcyBzZXQgdG8gdXNlIGRlcHJlY2F0ZWQgc3luY2hyb25vdXMgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IgYnkgY29kZSBhdDogXG4iK0Vycm9yKCkuc3RhY2spOkRoJiZjb25zb2xlLmxvZygiUnhKUzogQmFjayB0byBhIGJldHRlciBlcnJvciBiZWhhdmlvci4gVGhhbmsgeW91LiA8MyIpO0RoPWF9LGdldCBEZigpe3JldHVybiBEaH19O3ZhciBGaD0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLm9ic2VydmFibGV8fCJAQG9ic2VydmFibGUiO2Z1bmN0aW9uIEdoKGEpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBhO30sMCl9O3ZhciBIaD17Y2xvc2VkOiEwLG5leHQ6ZnVuY3Rpb24oKXt9LGVycm9yOmZ1bmN0aW9uKGEpe2lmKEVoLkRmKXRocm93IGE7R2goYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7fX07dmFyIEloPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXt0aGlzLm1lc3NhZ2U9Yj9iLmxlbmd0aCsiIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XG4iK2IubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGQrMSsiKSAiK2MudG9TdHJpbmcoKX0pLmpvaW4oIlxuICAiKToiIjt0aGlzLm5hbWU9IlVuc3Vic2NyaXB0aW9uRXJyb3IiO3RoaXMuZXJyb3JzPWI7cmV0dXJuIHRoaXN9YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO3JldHVybiBhfSgpO3ZhciBKaD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gYSYmIm51bWJlciI9PT10eXBlb2YgYS5sZW5ndGh9O2Z1bmN0aW9uIEtoKGEpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYX07ZnVuY3Rpb24gTGgoYSl7cmV0dXJuIG51bGwhPT1hJiYib2JqZWN0Ij09PXR5cGVvZiBhfTt2YXIgTWg9ZnVuY3Rpb24oYSl7dGhpcy5jbG9zZWQ9ITE7dGhpcy5CbD10aGlzLkFoPW51bGw7YSYmKHRoaXMudWU9YSl9OwpNaC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXtpZighdGhpcy5jbG9zZWQpe3ZhciBhPXRoaXMuQWgsYj10aGlzLnVlLGM9dGhpcy5CbDt0aGlzLmNsb3NlZD0hMDt0aGlzLkJsPXRoaXMuQWg9bnVsbDtpZihhIGluc3RhbmNlb2YgTWgpYS5yZW1vdmUodGhpcyk7ZWxzZSBpZihudWxsIT09YSlmb3IodmFyIGQ9MDtkPGEubGVuZ3RoOysrZClhW2RdLnJlbW92ZSh0aGlzKTtpZihLaChiKSl0cnl7Yi5jYWxsKHRoaXMpfWNhdGNoKGwpe3ZhciBlPWwgaW5zdGFuY2VvZiBJaD9OaChsLmVycm9ycyk6W2xdfWlmKEpoKGMpKXtkPS0xO2Zvcih2YXIgZj1jLmxlbmd0aDsrK2Q8Zjspe3ZhciBnPWNbZF07aWYoTGgoZykpdHJ5e2cudW5zdWJzY3JpYmUoKX1jYXRjaChsKXtlPWV8fFtdLGwgaW5zdGFuY2VvZiBJaD9lPWUuY29uY2F0KE5oKGwuZXJyb3JzKSk6ZS5wdXNoKGwpfX19aWYoZSl0aHJvdyBuZXcgSWgoZSk7fX07Ck1oLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YTtpZighYSlyZXR1cm4gTWguRU1QVFk7c3dpdGNoKHR5cGVvZiBhKXtjYXNlICJmdW5jdGlvbiI6Yj1uZXcgTWgoYSk7Y2FzZSAib2JqZWN0IjppZihiPT09dGhpc3x8Yi5jbG9zZWR8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi51bnN1YnNjcmliZSlyZXR1cm4gYjtpZih0aGlzLmNsb3NlZClyZXR1cm4gYi51bnN1YnNjcmliZSgpLGI7YiBpbnN0YW5jZW9mIE1ofHwoYT1iLGI9bmV3IE1oLGIuQmw9W2FdKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJ1bnJlY29nbml6ZWQgdGVhcmRvd24gIithKyIgYWRkZWQgdG8gU3Vic2NyaXB0aW9uLiIpO312YXIgYz1iLkFoO2lmKG51bGw9PT1jKWIuQWg9dGhpcztlbHNlIGlmKGMgaW5zdGFuY2VvZiBNaCl7aWYoYz09PXRoaXMpcmV0dXJuIGI7Yi5BaD1bYyx0aGlzXX1lbHNlIGlmKC0xPT09Yy5pbmRleE9mKHRoaXMpKWMucHVzaCh0aGlzKTtlbHNlIHJldHVybiBiO2E9dGhpcy5CbDsKbnVsbD09PWE/dGhpcy5CbD1bYl06YS5wdXNoKGIpO3JldHVybiBifTtNaC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuQmw7YiYmKGE9Yi5pbmRleE9mKGEpLC0xIT09YSYmYi5zcGxpY2UoYSwxKSl9O3ZhciBPaD1uZXcgTWg7T2guY2xvc2VkPSEwO01oLkVNUFRZPU9oO2Z1bmN0aW9uIE5oKGEpe3JldHVybiBhLnJlZHVjZShmdW5jdGlvbihiLGMpe3JldHVybiBiLmNvbmNhdChjIGluc3RhbmNlb2YgSWg/Yy5lcnJvcnM6Yyl9LFtdKX07dmFyIFBoPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sP1N5bWJvbCgicnhTdWJzY3JpYmVyIik6IkBAcnhTdWJzY3JpYmVyXyIrTWF0aC5yYW5kb20oKTt2YXIgTD1mdW5jdGlvbihhLGIsYyl7TWguY2FsbCh0aGlzKTt0aGlzLkN0PW51bGw7dGhpcy5DYj10aGlzLlJlPXRoaXMuQnQ9ITE7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDp0aGlzLmRlc3RpbmF0aW9uPUhoO2JyZWFrO2Nhc2UgMTppZighYSl7dGhpcy5kZXN0aW5hdGlvbj1IaDticmVha31pZigib2JqZWN0Ij09PXR5cGVvZiBhKXthIGluc3RhbmNlb2YgTD8odGhpcy5SZT1hLlJlLHRoaXMuZGVzdGluYXRpb249YSxhLmFkZCh0aGlzKSk6KHRoaXMuUmU9ITAsdGhpcy5kZXN0aW5hdGlvbj1uZXcgUWgodGhpcyxhKSk7YnJlYWt9ZGVmYXVsdDp0aGlzLlJlPSEwLHRoaXMuZGVzdGluYXRpb249bmV3IFFoKHRoaXMsYSxiLGMpfX07dChMLE1oKTtMLkVNUFRZPU1oLkVNUFRZO0wucHJvdG90eXBlW1BoXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtMLmNyZWF0ZT1mdW5jdGlvbihhLGIsYyl7YT1uZXcgTChhLGIsYyk7YS5SZT0hMTtyZXR1cm4gYX07aD1MLnByb3RvdHlwZTsKaC5uZXh0PWZ1bmN0aW9uKGEpe3RoaXMuQ2J8fHRoaXMuZGEoYSl9O2guZXJyb3I9ZnVuY3Rpb24oYSl7dGhpcy5DYnx8KHRoaXMuQ2I9ITAsdGhpcy5XZShhKSl9O2guY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLkNifHwodGhpcy5DYj0hMCx0aGlzLlJiKCkpfTtoLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5jbG9zZWR8fCh0aGlzLkNiPSEwLE1oLnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpKX07aC5kYT1mdW5jdGlvbihhKXt0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSl9O2guV2U9ZnVuY3Rpb24oYSl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcihhKTt0aGlzLnVuc3Vic2NyaWJlKCl9O2guUmI9ZnVuY3Rpb24oKXt0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7dGhpcy51bnN1YnNjcmliZSgpfTsKaC4kTj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuQWg7dGhpcy5BaD1udWxsO3RoaXMudW5zdWJzY3JpYmUoKTt0aGlzLkNiPXRoaXMuY2xvc2VkPSExO3RoaXMuQWg9YTtyZXR1cm4gdGhpc307dmFyIFFoPWZ1bmN0aW9uKGEsYixjLGQpe0wuY2FsbCh0aGlzKTt0aGlzLnVuPWE7dmFyIGU9dGhpcztpZihLaChiKSl2YXIgZj1iO2Vsc2UgYiYmKGY9Yi5uZXh0LGM9Yi5lcnJvcixkPWIuY29tcGxldGUsYiE9PUhoJiYoZT1PYmplY3QuY3JlYXRlKGIpLEtoKGUudW5zdWJzY3JpYmUpJiZ0aGlzLmFkZChlLnVuc3Vic2NyaWJlLmJpbmQoZSkpLGUudW5zdWJzY3JpYmU9dGhpcy51bnN1YnNjcmliZS5iaW5kKHRoaXMpKSk7dGhpcy5RYz1lO3RoaXMuZGE9Zjt0aGlzLldlPWM7dGhpcy5SYj1kfTt0KFFoLEwpO1FoLkVNUFRZPUwuRU1QVFk7UWguY3JlYXRlPUwuY3JlYXRlO2g9UWgucHJvdG90eXBlOwpoLm5leHQ9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2ImJnRoaXMuZGEpe3ZhciBiPXRoaXMudW47RWguRGYmJmIuUmU/dGhpcy5XdChiLHRoaXMuZGEsYSkmJnRoaXMudW5zdWJzY3JpYmUoKTp0aGlzLlh0KHRoaXMuZGEsYSl9fTtoLmVycm9yPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLkNiKXt2YXIgYj10aGlzLnVuLGM9RWguRGY7aWYodGhpcy5XZSljJiZiLlJlP3RoaXMuV3QoYix0aGlzLldlLGEpOnRoaXMuWHQodGhpcy5XZSxhKSx0aGlzLnVuc3Vic2NyaWJlKCk7ZWxzZSBpZihiLlJlKWM/KGIuQ3Q9YSxiLkJ0PSEwKTpHaChhKSx0aGlzLnVuc3Vic2NyaWJlKCk7ZWxzZXt0aGlzLnVuc3Vic2NyaWJlKCk7aWYoYyl0aHJvdyBhO0doKGEpfX19OwpoLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZighdGhpcy5DYil7dmFyIGI9dGhpcy51bjtpZih0aGlzLlJiKXt2YXIgYz1mdW5jdGlvbigpe3JldHVybiBhLlJiLmNhbGwoYS5RYyl9O0VoLkRmJiZiLlJlP3RoaXMuV3QoYixjKTp0aGlzLlh0KGMpfXRoaXMudW5zdWJzY3JpYmUoKX19O2guWHQ9ZnVuY3Rpb24oYSxiKXt0cnl7YS5jYWxsKHRoaXMuUWMsYil9Y2F0Y2goYyl7dGhpcy51bnN1YnNjcmliZSgpO2lmKEVoLkRmKXRocm93IGM7R2goYyl9fTtoLld0PWZ1bmN0aW9uKGEsYixjKXtpZighRWguRGYpdGhyb3cgRXJyb3IoImJhZCBjYWxsIik7dHJ5e2IuY2FsbCh0aGlzLlFjLGMpfWNhdGNoKGQpe3JldHVybiBFaC5EZj8oYS5DdD1kLGEuQnQ9ITApOkdoKGQpLCEwfXJldHVybiExfTtoLnVlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51bjt0aGlzLnVuPXRoaXMuUWM9bnVsbDthLnVuc3Vic2NyaWJlKCl9O2Z1bmN0aW9uIFJoKGEpe3JldHVybiBhfTtmdW5jdGlvbiBTaChhKXtyZXR1cm4gMD09PWEubGVuZ3RoP1JoOjE9PT1hLmxlbmd0aD9hWzBdOmZ1bmN0aW9uKGIpe3JldHVybiBhLnJlZHVjZShmdW5jdGlvbihjLGQpe3JldHVybiBkKGMpfSxiKX19O3ZhciBUaD1mdW5jdGlvbihhKXt0aGlzLmJTPSExO2EmJih0aGlzLkZjPWEpfTtoPVRoLnByb3RvdHlwZTtoLmpiPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBUaDtiLnNvdXJjZT10aGlzO2IuWXM9YTtyZXR1cm4gYn07aC5zdWJzY3JpYmU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuWXM7YTp7aWYoYSl7aWYoYSBpbnN0YW5jZW9mIEwpYnJlYWsgYTtpZihhW1BoXSl7YT1hW1BoXSgpO2JyZWFrIGF9fWE9YXx8Ynx8Yz9uZXcgTChhLGIsYyk6bmV3IEwoSGgpfWQ/YS5hZGQoZC5jYWxsKGEsdGhpcy5zb3VyY2UpKTphLmFkZCh0aGlzLnNvdXJjZXx8RWguRGYmJiFhLlJlP3RoaXMuRmMoYSk6dGhpcy4kdyhhKSk7aWYoRWguRGYmJmEuUmUmJihhLlJlPSExLGEuQnQpKXRocm93IGEuQ3Q7cmV0dXJuIGF9OwpoLiR3PWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gdGhpcy5GYyhhKX1jYXRjaChlKXtFaC5EZiYmKGEuQnQ9ITAsYS5DdD1lKTt2YXIgYjthOntmb3IoYj1hO2I7KXt2YXIgYz1iLmRlc3RpbmF0aW9uLGQ9Yi5DYjtpZihiLmNsb3NlZHx8ZCl7Yj0hMTticmVhayBhfWI9YyYmYyBpbnN0YW5jZW9mIEw/YzpudWxsfWI9ITB9Yj9hLmVycm9yKGUpOmNvbnNvbGUud2FybihlKX19O2guZm9yRWFjaD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yj1VaChiKTtyZXR1cm4gbmV3IGIoZnVuY3Rpb24oZCxlKXt2YXIgZj1jLnN1YnNjcmliZShmdW5jdGlvbihnKXt0cnl7YShnKX1jYXRjaChsKXtlKGwpLGYmJmYudW5zdWJzY3JpYmUoKX19LGUsZCl9KX07aC5GYz1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnNvdXJjZTtyZXR1cm4gYiYmYi5zdWJzY3JpYmUoYSl9O1RoLnByb3RvdHlwZVtGaF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ClRoLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2MtMF09YXJndW1lbnRzW2NdO3JldHVybiAwPT09Yi5sZW5ndGg/dGhpczpTaChiKSh0aGlzKX07VGguY3JlYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVGgoYSl9O2Z1bmN0aW9uIFVoKGEpe2F8fChhPVByb21pc2UpO2lmKCFhKXRocm93IEVycm9yKCJubyBQcm9taXNlIGltcGwgZm91bmQiKTtyZXR1cm4gYX1TeW1ib2wmJlN5bWJvbC5hc3luY0l0ZXJhdG9yJiYoVGgucHJvdG90eXBlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBDaCh0aGlzKX0pO3ZhciBWaD1mdW5jdGlvbihhLGIpe01oLmNhbGwodGhpcyk7dGhpcy56Zj1hO3RoaXMuQXo9Yjt0aGlzLmNsb3NlZD0hMX07dChWaCxNaCk7VmguRU1QVFk9TWguRU1QVFk7VmgucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY2xvc2VkKXt0aGlzLmNsb3NlZD0hMDt2YXIgYT10aGlzLnpmLGI9YS5hZzt0aGlzLnpmPW51bGw7IWJ8fDA9PT1iLmxlbmd0aHx8YS5DYnx8YS5jbG9zZWR8fChhPWIuaW5kZXhPZih0aGlzLkF6KSwtMSE9PWEmJmIuc3BsaWNlKGEsMSkpfX07dmFyIFdoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMubWVzc2FnZT0ib2JqZWN0IHVuc3Vic2NyaWJlZCI7dGhpcy5uYW1lPSJPYmplY3RVbnN1YnNjcmliZWRFcnJvciI7cmV0dXJuIHRoaXN9YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO3JldHVybiBhfSgpO3ZhciBYaD1mdW5jdGlvbihhKXtMLmNhbGwodGhpcyxhKTt0aGlzLmRlc3RpbmF0aW9uPWF9O3QoWGgsTCk7WGguRU1QVFk9TC5FTVBUWTtYaC5jcmVhdGU9TC5jcmVhdGU7dmFyIFloPWZ1bmN0aW9uKCl7VGguY2FsbCh0aGlzKTt0aGlzLmFnPVtdO3RoaXMuWmw9dGhpcy5DYj10aGlzLmNsb3NlZD0hMTt0aGlzLkR6PW51bGx9O3QoWWgsVGgpO1loLnByb3RvdHlwZVtQaF09ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhoKHRoaXMpfTtoPVloLnByb3RvdHlwZTtoLmpiPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBaaCh0aGlzLHRoaXMpO2IuWXM9YTtyZXR1cm4gYn07aC5uZXh0PWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBXaDtpZighdGhpcy5DYil7dmFyIGI9dGhpcy5hZyxjPWIubGVuZ3RoO2I9Yi5zbGljZSgpO2Zvcih2YXIgZD0wO2Q8YztkKyspYltkXS5uZXh0KGEpfX07CmguZXJyb3I9ZnVuY3Rpb24oYSl7aWYodGhpcy5jbG9zZWQpdGhyb3cgbmV3IFdoO3RoaXMuWmw9ITA7dGhpcy5Eej1hO3RoaXMuQ2I9ITA7dmFyIGI9dGhpcy5hZyxjPWIubGVuZ3RoO2I9Yi5zbGljZSgpO2Zvcih2YXIgZD0wO2Q8YztkKyspYltkXS5lcnJvcihhKTt0aGlzLmFnLmxlbmd0aD0wfTtoLmNvbXBsZXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5jbG9zZWQpdGhyb3cgbmV3IFdoO3RoaXMuQ2I9ITA7dmFyIGE9dGhpcy5hZyxiPWEubGVuZ3RoO2E9YS5zbGljZSgpO2Zvcih2YXIgYz0wO2M8YjtjKyspYVtjXS5jb21wbGV0ZSgpO3RoaXMuYWcubGVuZ3RoPTB9O2gudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt0aGlzLmNsb3NlZD10aGlzLkNiPSEwO3RoaXMuYWc9bnVsbH07aC4kdz1mdW5jdGlvbihhKXtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgV2g7cmV0dXJuIFRoLnByb3RvdHlwZS4kdy5jYWxsKHRoaXMsYSl9OwpoLkZjPWZ1bmN0aW9uKGEpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyBXaDtpZih0aGlzLlpsKXJldHVybiBhLmVycm9yKHRoaXMuRHopLE1oLkVNUFRZO2lmKHRoaXMuQ2IpcmV0dXJuIGEuY29tcGxldGUoKSxNaC5FTVBUWTt0aGlzLmFnLnB1c2goYSk7cmV0dXJuIG5ldyBWaCh0aGlzLGEpfTt2YXIgJGg9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFRoO2Iuc291cmNlPWE7cmV0dXJuIGJ9O1loLmNyZWF0ZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgWmgoYSxiKX07dmFyIFpoPWZ1bmN0aW9uKGEsYil7WWguY2FsbCh0aGlzKTt0aGlzLmRlc3RpbmF0aW9uPWE7dGhpcy5zb3VyY2U9Yn07dChaaCxZaCk7WmguY3JlYXRlPVloLmNyZWF0ZTtaaC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmRlc3RpbmF0aW9uO2ImJmIubmV4dCYmYi5uZXh0KGEpfTsKWmgucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGVzdGluYXRpb247YiYmYi5lcnJvciYmdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihhKX07WmgucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kZXN0aW5hdGlvbjthJiZhLmNvbXBsZXRlJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9O1poLnByb3RvdHlwZS5GYz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zb3VyY2U/dGhpcy5zb3VyY2Uuc3Vic2NyaWJlKGEpOk1oLkVNUFRZfTt2YXIgYWk9ZnVuY3Rpb24oYSl7WWguY2FsbCh0aGlzKTt0aGlzLm1hPWF9O3QoYWksWWgpO2FpLmNyZWF0ZT1ZaC5jcmVhdGU7YWkucHJvdG90eXBlLkZjPWZ1bmN0aW9uKGEpe3ZhciBiPVloLnByb3RvdHlwZS5GYy5jYWxsKHRoaXMsYSk7YiYmIWIuY2xvc2VkJiZhLm5leHQodGhpcy5tYSk7cmV0dXJuIGJ9O2FpLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbigpe2lmKHRoaXMuWmwpdGhyb3cgdGhpcy5EejtpZih0aGlzLmNsb3NlZCl0aHJvdyBuZXcgV2g7cmV0dXJuIHRoaXMubWF9O2FpLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKGEpe1loLnByb3RvdHlwZS5uZXh0LmNhbGwodGhpcyx0aGlzLm1hPWEpfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFpLnByb3RvdHlwZSx7dmFsdWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFZhbHVlKCl9fX0pO3ZhciBiaT1uZXcgVGgoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29tcGxldGUoKX0pO2Z1bmN0aW9uIGNpKGEsYil7cmV0dXJuIG5ldyBUaChmdW5jdGlvbihjKXt2YXIgZD1uZXcgTWgsZT0wO2QuYWRkKGIuc2NoZWR1bGUoZnVuY3Rpb24oKXtlPT09YS5sZW5ndGg/Yy5jb21wbGV0ZSgpOihjLm5leHQoYVtlKytdKSxjLmNsb3NlZHx8ZC5hZGQodGhpcy5zY2hlZHVsZSgpKSl9KSk7cmV0dXJuIGR9KX07dmFyIGRpPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2M8ZCYmIWIuY2xvc2VkO2MrKyliLm5leHQoYVtjXSk7Yi5jb21wbGV0ZSgpfX07ZnVuY3Rpb24gZWkoYSl7cmV0dXJuIGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5zY2hlZHVsZX07ZnVuY3Rpb24gZmkoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbYy0wXT1hcmd1bWVudHNbY107Yz1iW2IubGVuZ3RoLTFdO3JldHVybiBlaShjKT8oYi5wb3AoKSxjaShiLGMpKTpuZXcgVGgoZGkoYikpfTtmdW5jdGlvbiBnaShhKXtyZXR1cm4gbmV3IFRoKGZ1bmN0aW9uKGIpe3JldHVybiBiLmVycm9yKGEpfSl9O3ZhciBoaT1mdW5jdGlvbihhLGIsYyl7dGhpcy5raW5kPWE7dGhpcy52YWx1ZT1iO3RoaXMuZXJyb3I9Yzt0aGlzLkRlPSJOIj09PWF9O2hpLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGEpe3N3aXRjaCh0aGlzLmtpbmQpe2Nhc2UgIk4iOnJldHVybiBhLm5leHQmJmEubmV4dCh0aGlzLnZhbHVlKTtjYXNlICJFIjpyZXR1cm4gYS5lcnJvciYmYS5lcnJvcih0aGlzLmVycm9yKTtjYXNlICJDIjpyZXR1cm4gYS5jb21wbGV0ZSYmYS5jb21wbGV0ZSgpfX07aGkucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbihhLGIsYyl7aWYoYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLm5leHQpYT10aGlzLm9ic2VydmUoYSk7ZWxzZSBhOntzd2l0Y2godGhpcy5raW5kKXtjYXNlICJOIjphPWEmJmEodGhpcy52YWx1ZSk7YnJlYWsgYTtjYXNlICJFIjphPWImJmIodGhpcy5lcnJvcik7YnJlYWsgYTtjYXNlICJDIjphPWMmJmMoKTticmVhayBhfWE9dm9pZCAwfXJldHVybiBhfTsKdmFyIGppPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIGE/bmV3IGhpKCJOIixhKTppaX0sa2k9bmV3IGhpKCJDIiksaWk9bmV3IGhpKCJOIix2b2lkIDApO3ZhciBsaT1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj9saS5ub3c6Yjt0aGlzLk1JPWE7dGhpcy5ub3c9Yn07bGkucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGEsYixjKXtiPXZvaWQgMD09PWI/MDpiO3JldHVybihuZXcgdGhpcy5NSSh0aGlzLGEpKS5zY2hlZHVsZShjLGIpfTtsaS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIG1pPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMubWVzc2FnZT0ibm8gZWxlbWVudHMgaW4gc2VxdWVuY2UiO3RoaXMubmFtZT0iRW1wdHlFcnJvciI7cmV0dXJuIHRoaXN9YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpO3JldHVybiBhfSgpO2Z1bmN0aW9uIG5pKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmpiKG5ldyBvaShhKSl9fXZhciBvaT1mdW5jdGlvbihhKXt0aGlzLlNoPWF9O29pLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5TaDtjLnhuKys7YT1uZXcgcGkoYSxjKTtiPWIuc3Vic2NyaWJlKGEpO2EuY2xvc2VkfHwoYS5jb25uZWN0aW9uPWMuY29ubmVjdCgpKTtyZXR1cm4gYn07dmFyIHBpPWZ1bmN0aW9uKGEsYil7TC5jYWxsKHRoaXMsYSk7dGhpcy5TaD1iO3RoaXMuY29ubmVjdGlvbj1udWxsfTt0KHBpLEwpO3BpLkVNUFRZPUwuRU1QVFk7cGkuY3JlYXRlPUwuY3JlYXRlOwpwaS5wcm90b3R5cGUudWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNoO2lmKGEpe3RoaXMuU2g9bnVsbDt2YXIgYj1hLnhuOzA+PWI/dGhpcy5jb25uZWN0aW9uPW51bGw6KGEueG49Yi0xLDE8Yj90aGlzLmNvbm5lY3Rpb249bnVsbDooYj10aGlzLmNvbm5lY3Rpb24sYT1hLlVrLHRoaXMuY29ubmVjdGlvbj1udWxsLCFhfHxiJiZhIT09Ynx8YS51bnN1YnNjcmliZSgpKSl9ZWxzZSB0aGlzLmNvbm5lY3Rpb249bnVsbH07dmFyIHFpPWZ1bmN0aW9uKGEsYil7VGguY2FsbCh0aGlzKTt0aGlzLnNvdXJjZT1hO3RoaXMuYUk9Yjt0aGlzLnhuPTA7dGhpcy5LcT0hMX07dChxaSxUaCk7cWkuY3JlYXRlPVRoLmNyZWF0ZTtxaS5wcm90b3R5cGUuRmM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuenMoKS5zdWJzY3JpYmUoYSl9O3FpLnByb3RvdHlwZS56cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMudmo7aWYoIWF8fGEuQ2IpdGhpcy52aj10aGlzLmFJKCk7cmV0dXJuIHRoaXMudmp9O3FpLnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VazthfHwodGhpcy5LcT0hMSxhPXRoaXMuVWs9bmV3IE1oLGEuYWRkKHRoaXMuc291cmNlLnN1YnNjcmliZShuZXcgcmkodGhpcy56cygpLHRoaXMpKSksYS5jbG9zZWQmJih0aGlzLlVrPW51bGwsYT1NaC5FTVBUWSkpO3JldHVybiBhfTtxaS5wcm90b3R5cGUudUg9ZnVuY3Rpb24oKXtyZXR1cm4gbmkoKSh0aGlzKX07dmFyIHNpLHRpPXFpLnByb3RvdHlwZTsKc2k9e1lzOnt2YWx1ZTpudWxsfSx4bjp7dmFsdWU6MCx3cml0YWJsZTohMH0sdmo6e3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9LFVrOnt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSxGYzp7dmFsdWU6dGkuRmN9LEtxOnt2YWx1ZTp0aS5LcSx3cml0YWJsZTohMH0senM6e3ZhbHVlOnRpLnpzfSxjb25uZWN0Ont2YWx1ZTp0aS5jb25uZWN0fSx1SDp7dmFsdWU6dGkudUh9fTt2YXIgcmk9ZnVuY3Rpb24oYSxiKXtYaC5jYWxsKHRoaXMsYSk7dGhpcy5TaD1ifTt0KHJpLFhoKTtyaS5FTVBUWT1YaC5FTVBUWTtyaS5jcmVhdGU9WGguY3JlYXRlO3JpLnByb3RvdHlwZS5XZT1mdW5jdGlvbihhKXt0aGlzLnVlKCk7WGgucHJvdG90eXBlLldlLmNhbGwodGhpcyxhKX07cmkucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5TaC5LcT0hMDt0aGlzLnVlKCk7WGgucHJvdG90eXBlLlJiLmNhbGwodGhpcyl9OwpyaS5wcm90b3R5cGUudWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNoO2lmKGEpe3RoaXMuU2g9bnVsbDt2YXIgYj1hLlVrO2EueG49MDthLnZqPW51bGw7YS5Vaz1udWxsO2ImJmIudW5zdWJzY3JpYmUoKX19O2Z1bmN0aW9uIHVpKGEpe3JldHVybiBmdW5jdGlvbihiKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXJndW1lbnQgaXMgbm90IGEgZnVuY3Rpb24uIEFyZSB5b3UgbG9va2luZyBmb3IgYG1hcFRvKClgPyIpO3JldHVybiBiLmpiKG5ldyB2aShhKSl9fXZhciB2aT1mdW5jdGlvbihhKXt0aGlzLk1jPWE7dGhpcy5TZT12b2lkIDB9O3ZpLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyB3aShhLHRoaXMuTWMsdGhpcy5TZSkpfTt2YXIgd2k9ZnVuY3Rpb24oYSxiLGMpe0wuY2FsbCh0aGlzLGEpO3RoaXMuTWM9Yjt0aGlzLmNvdW50PTA7dGhpcy5TZT1jfHx0aGlzfTt0KHdpLEwpO3dpLkVNUFRZPUwuRU1QVFk7d2kuY3JlYXRlPUwuY3JlYXRlOwp3aS5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPXRoaXMuTWMuY2FsbCh0aGlzLlNlLGEsdGhpcy5jb3VudCsrKX1jYXRjaChjKXt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGMpO3JldHVybn10aGlzLmRlc3RpbmF0aW9uLm5leHQoYil9O3ZhciB4aT1mdW5jdGlvbigpe0wuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0KHhpLEwpO3hpLkVNUFRZPUwuRU1QVFk7eGkuY3JlYXRlPUwuY3JlYXRlO3hpLnByb3RvdHlwZS5Waj1mdW5jdGlvbihhKXt0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSl9O3hpLnByb3RvdHlwZS4kZj1mdW5jdGlvbigpe3RoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKX07dmFyIHlpPWZ1bmN0aW9uKGEsYixjKXtMLmNhbGwodGhpcyk7dGhpcy5wYXJlbnQ9YTt0aGlzLklRPWM7dGhpcy5pbmRleD0wfTt0KHlpLEwpO3lpLkVNUFRZPUwuRU1QVFk7eWkuY3JlYXRlPUwuY3JlYXRlO3lpLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt0aGlzLnBhcmVudC5WaihhLHRoaXMuSVEsdGhpcy5pbmRleCsrKX07eWkucHJvdG90eXBlLldlPWZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmRlc3RpbmF0aW9uLmVycm9yKGEpO3RoaXMudW5zdWJzY3JpYmUoKX07eWkucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQuJGYodGhpcyk7dGhpcy51bnN1YnNjcmliZSgpfTt2YXIgemk9ImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcj9TeW1ib2wuaXRlcmF0b3I6IkBAaXRlcmF0b3IiO2Z1bmN0aW9uIEFpKGEpe3JldHVybiBmdW5jdGlvbihiKXtCaShhLGIpLmNhdGNoKGZ1bmN0aW9uKGMpe3JldHVybiBiLmVycm9yKGMpfSl9fQpmdW5jdGlvbiBCaShhLGIpe3ZhciBjLGQsZSxmO3JldHVybiBSYSh0aGlzLGZ1bmN0aW9uIGwoKXt2YXIgbSxwO3JldHVybiBMYShsLGZ1bmN0aW9uKHEpe3N3aXRjaChxLktlKXtjYXNlIDE6QWEocSk7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciByPWFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO2M9cj9yLmNhbGwoYSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBfX3ZhbHVlcz9fX3ZhbHVlcyhhKTphW1N5bWJvbC5pdGVyYXRvcl0oKTtjYXNlIDU6cmV0dXJuIHphKHEsYy5uZXh0KCksOCk7Y2FzZSA4OmlmKGQ9cS5PaSxkLmRvbmUpe3EuUGooMyk7YnJlYWt9bT1kLnZhbHVlO2IubmV4dChtKTtxLlBqKDUpO2JyZWFrO2Nhc2UgMzpDYShxKTtxLktsPTA7cS5haT05O2lmKCFkfHxkLmRvbmV8fCEoZj1jLnJldHVybikpe3EuUGooOSk7YnJlYWt9cmV0dXJuIHphKHEsZi5jYWxsKGMpLAo5KTtjYXNlIDk6Q2EocSwwLDAsMSk7aWYoZSl0aHJvdyBlLmVycm9yO0RhKHEsMTAsMSk7YnJlYWs7Y2FzZSAxMDpEYShxLDQpO2JyZWFrO2Nhc2UgMjpwPUJhKHEpO2U9e2Vycm9yOnB9O3EuUGooMyk7YnJlYWs7Y2FzZSA0OmIuY29tcGxldGUoKSxxLktlPTB9fSl9KX07dmFyIENpPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1hW3ppXSgpO2Rve3ZhciBkPWMubmV4dCgpO2lmKGQuZG9uZSl7Yi5jb21wbGV0ZSgpO2JyZWFrfWIubmV4dChkLnZhbHVlKTtpZihiLmNsb3NlZClicmVha313aGlsZSgxKTsiZnVuY3Rpb24iPT09dHlwZW9mIGMucmV0dXJuJiZiLmFkZChmdW5jdGlvbigpe2MucmV0dXJuJiZjLnJldHVybigpfSk7cmV0dXJuIGJ9fTtmdW5jdGlvbiBEaShhLGIpe2E9YS5zdWJzY3JpYmUoYik7YSE9PWImJmIuYWRkKGEpO3JldHVybiBifTt2YXIgRWk9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWFbRmhdKCk7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBjLnN1YnNjcmliZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm92aWRlZCBvYmplY3QgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCBTeW1ib2wub2JzZXJ2YWJsZSIpO3JldHVybiBEaShjLGIpfX07dmFyIEZpPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXthLnRoZW4oZnVuY3Rpb24oYyl7Yi5jbG9zZWR8fChiLm5leHQoYyksYi5jb21wbGV0ZSgpKX0sZnVuY3Rpb24oYyl7cmV0dXJuIGIuZXJyb3IoYyl9KS50aGVuKG51bGwsR2gpO3JldHVybiBifX07dmFyIEdpPWZ1bmN0aW9uKGEpe2lmKGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgYVtGaF0pcmV0dXJuIEVpKGEpO2lmKGEmJiJudW1iZXIiPT09dHlwZW9mIGEubGVuZ3RoJiYiZnVuY3Rpb24iIT09dHlwZW9mIGEpcmV0dXJuIGRpKGEpO2lmKGEmJiJmdW5jdGlvbiIhPT10eXBlb2YgYS5zdWJzY3JpYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS50aGVuKXJldHVybiBGaShhKTtpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGFbemldKXJldHVybiBDaShhKTtpZihTeW1ib2wmJlN5bWJvbC5hc3luY0l0ZXJhdG9yJiZhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGFbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKXJldHVybiBBaShhKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIisoTGgoYSk/ImFuIGludmFsaWQgb2JqZWN0IjoiJyIrYSsiJyIpKyIgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgQXJyYXksIG9yIEl0ZXJhYmxlLiIpOwp9O2Z1bmN0aW9uIEhpKGEsYixjLGQsZSl7ZT12b2lkIDA9PT1lP25ldyB5aShhLGMsZCk6ZTtpZighZS5jbG9zZWQpcmV0dXJuIGIgaW5zdGFuY2VvZiBUaD9iLnN1YnNjcmliZShlKTpHaShiKShlKX07dmFyIElpPXt9O2Z1bmN0aW9uIEppKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2MtMF09YXJndW1lbnRzW2NdO3ZhciBkPWM9dm9pZCAwO2VpKGJbYi5sZW5ndGgtMV0pJiYoZD1iLnBvcCgpKTsiZnVuY3Rpb24iPT09dHlwZW9mIGJbYi5sZW5ndGgtMV0mJihjPWIucG9wKCkpOzE9PT1iLmxlbmd0aCYmSmgoYlswXSkmJihiPWJbMF0pO3JldHVybihkP2NpKGIsZCk6bmV3IFRoKGRpKGIpKSkuamIobmV3IEtpKGMpKX12YXIgS2k9ZnVuY3Rpb24oYSl7dGhpcy5vdD1hfTtLaS5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgTGkoYSx0aGlzLm90KSl9O3ZhciBMaT1mdW5jdGlvbihhLGIpe3hpLmNhbGwodGhpcyxhKTt0aGlzLm90PWI7dGhpcy5hY3RpdmU9MDt0aGlzLnZhbHVlcz1bXTt0aGlzLlRvPVtdfTt0KExpLHhpKTtMaS5FTVBUWT14aS5FTVBUWTtMaS5jcmVhdGU9eGkuY3JlYXRlO2g9TGkucHJvdG90eXBlOwpoLmRhPWZ1bmN0aW9uKGEpe3RoaXMudmFsdWVzLnB1c2goSWkpO3RoaXMuVG8ucHVzaChhKX07aC5SYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuVG8sYj1hLmxlbmd0aDtpZigwPT09Yil0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7ZWxzZXt0aGlzLkNrPXRoaXMuYWN0aXZlPWI7Zm9yKHZhciBjPTA7YzxiO2MrKyl7dmFyIGQ9YVtjXTt0aGlzLmFkZChIaSh0aGlzLGQsZCxjKSl9fX07aC4kZj1mdW5jdGlvbigpezA9PT0tLXRoaXMuYWN0aXZlJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9O2guVmo9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnZhbHVlcyxkPWNbYl07ZD10aGlzLkNrP2Q9PT1JaT8tLXRoaXMuQ2s6dGhpcy5DazowO2NbYl09YTswPT09ZCYmKHRoaXMub3Q/dGhpcy5YTihjKTp0aGlzLmRlc3RpbmF0aW9uLm5leHQoYy5zbGljZSgpKSl9OwpoLlhOPWZ1bmN0aW9uKGEpe3RyeXt2YXIgYj10aGlzLm90LmFwcGx5KHRoaXMsYSl9Y2F0Y2goYyl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcihjKTtyZXR1cm59dGhpcy5kZXN0aW5hdGlvbi5uZXh0KGIpfTtmdW5jdGlvbiBNaShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIFRoP2E6bmV3IFRoKEdpKGEpKX07ZnVuY3Rpb24gTmkoYSxiKXt2YXIgYz12b2lkIDA9PT1jP051bWJlci5QT1NJVElWRV9JTkZJTklUWTpjO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYilyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGQuYihOaShmdW5jdGlvbihlLGYpe3JldHVybiBNaShhKGUsZikpLmIodWkoZnVuY3Rpb24oZyxsKXtyZXR1cm4gYihlLGcsZixsKX0pKX0sYykpfTsibnVtYmVyIj09PXR5cGVvZiBiJiYoYz1iKTtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGQuamIobmV3IE9pKGEsYykpfX12YXIgT2k9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOmI7dGhpcy5NYz1hO3RoaXMuTHg9Yn07T2kucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IFBpKGEsdGhpcy5NYyx0aGlzLkx4KSl9Owp2YXIgUGk9ZnVuY3Rpb24oYSxiLGMpe2M9dm9pZCAwPT09Yz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6Yzt4aS5jYWxsKHRoaXMsYSk7dGhpcy5NYz1iO3RoaXMuTHg9Yzt0aGlzLkxGPSExO3RoaXMuYnVmZmVyPVtdO3RoaXMuaW5kZXg9dGhpcy5hY3RpdmU9MH07dChQaSx4aSk7UGkuRU1QVFk9eGkuRU1QVFk7UGkuY3JlYXRlPXhpLmNyZWF0ZTtoPVBpLnByb3RvdHlwZTtoLmRhPWZ1bmN0aW9uKGEpe3RoaXMuYWN0aXZlPHRoaXMuTHg/dGhpcy5WTihhKTp0aGlzLmJ1ZmZlci5wdXNoKGEpfTtoLlZOPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaW5kZXgrKzt0cnl7dmFyIGM9dGhpcy5NYyhhLGIpfWNhdGNoKGQpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IoZCk7cmV0dXJufXRoaXMuYWN0aXZlKys7dGhpcy5sdihjLGEsYil9OwpoLmx2PWZ1bmN0aW9uKGEsYixjKXtiPW5ldyB5aSh0aGlzLGIsYyk7dGhpcy5kZXN0aW5hdGlvbi5hZGQoYik7SGkodGhpcyxhLHZvaWQgMCx2b2lkIDAsYil9O2guUmI9ZnVuY3Rpb24oKXt0aGlzLkxGPSEwOzA9PT10aGlzLmFjdGl2ZSYmMD09PXRoaXMuYnVmZmVyLmxlbmd0aCYmdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO3RoaXMudW5zdWJzY3JpYmUoKX07aC5Waj1mdW5jdGlvbihhKXt0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSl9O2guJGY9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5idWZmZXI7dGhpcy5yZW1vdmUoYSk7dGhpcy5hY3RpdmUtLTswPGIubGVuZ3RoP3RoaXMuZGEoYi5zaGlmdCgpKTowPT09dGhpcy5hY3RpdmUmJnRoaXMuTEYmJnRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKX07ZnVuY3Rpb24gUWkoYSl7YT12b2lkIDA9PT1hP051bWJlci5QT1NJVElWRV9JTkZJTklUWTphO3JldHVybiBOaShSaCxhKX07ZnVuY3Rpb24gUmkoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbYy0wXT1hcmd1bWVudHNbY107cmV0dXJuIFFpKDEpKGZpLmFwcGx5KG51bGwsamEoYikpKX07ZnVuY3Rpb24gU2koYSl7cmV0dXJuIG5ldyBUaChmdW5jdGlvbihiKXt0cnl7dmFyIGM9YSgpfWNhdGNoKGQpe2IuZXJyb3IoZCk7cmV0dXJufXJldHVybihjP01pKGMpOmJpKS5zdWJzY3JpYmUoYil9KX07ZnVuY3Rpb24gVGkoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbYy0wXT1hcmd1bWVudHNbY107aWYoMT09PWIubGVuZ3RoKXt2YXIgZD1iWzBdO2lmKEpoKGQpKXJldHVybiBVaShkLG51bGwpO2lmKExoKGQpJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZCk9PT1PYmplY3QucHJvdG90eXBlKXJldHVybiBiPU9iamVjdC5rZXlzKGQpLFVpKGIubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBkW2ZdfSksYil9aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBiW2IubGVuZ3RoLTFdKXt2YXIgZT1iLnBvcCgpO2I9MT09PWIubGVuZ3RoJiZKaChiWzBdKT9iWzBdOmI7cmV0dXJuIFVpKGIsbnVsbCkuYih1aShmdW5jdGlvbihmKXtyZXR1cm4gZS5hcHBseShudWxsLGphKGYpKX0pKX1yZXR1cm4gVWkoYixudWxsKX0KZnVuY3Rpb24gVWkoYSxiKXtyZXR1cm4gbmV3IFRoKGZ1bmN0aW9uKGMpe3ZhciBkPWEubGVuZ3RoO2lmKDA9PT1kKWMuY29tcGxldGUoKTtlbHNlIGZvcih2YXIgZT1BcnJheShkKSxmPTAsZz0wLGw9e0hrOjB9O2wuSGs8ZDtsPXtCbTpsLkJtLEhrOmwuSGt9LGwuSGsrKyl7dmFyIG09TWkoYVtsLkhrXSk7bC5CbT0hMTtjLmFkZChtLnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24ocSl7cC5CbXx8KHAuQm09ITAsZysrKTtlW3AuSGtdPXF9fShsKSxlcnJvcjpmdW5jdGlvbihwKXtyZXR1cm4gYy5lcnJvcihwKX0sY29tcGxldGU6ZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZisrO2YhPT1kJiZwLkJtfHwoZz09PWQmJmMubmV4dChiP2IucmVkdWNlKGZ1bmN0aW9uKHEscix2KXtyZXR1cm4gcVtyXT1lW3ZdLHF9LHt9KTplKSxjLmNvbXBsZXRlKCkpfX0obCl9KSl9fSl9O2Z1bmN0aW9uIFZpKGEsYixjKXtpZihLaChjKSl7dmFyIGQ9YztjPXZvaWQgMH1yZXR1cm4gZD9WaShhLGIsYykuYih1aShmdW5jdGlvbihlKXtyZXR1cm4gSmgoZSk/ZC5hcHBseShudWxsLGphKGUpKTpkKGUpfSkpOm5ldyBUaChmdW5jdGlvbihlKXtXaShhLGIsZnVuY3Rpb24oZil7MTxhcmd1bWVudHMubGVuZ3RoP2UubmV4dChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKTplLm5leHQoZil9LGUsYyl9KX0KZnVuY3Rpb24gV2koYSxiLGMsZCxlKXtpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lciYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLnJlbW92ZUV2ZW50TGlzdGVuZXIpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsZSk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyxlKX19ZWxzZSBpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEub24mJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5vZmYpYS5vbihiLGMpLGY9ZnVuY3Rpb24oKXtyZXR1cm4gYS5vZmYoYixjKX07ZWxzZSBpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuYWRkTGlzdGVuZXImJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5yZW1vdmVMaXN0ZW5lcilhLmFkZExpc3RlbmVyKGIsYyksZj1mdW5jdGlvbigpe3JldHVybiBhLnJlbW92ZUxpc3RlbmVyKGIsYyl9O2Vsc2UgaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBnPTAsbD1hLmxlbmd0aDtnPGw7ZysrKVdpKGFbZ10sCmIsYyxkLGUpO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBldmVudCB0YXJnZXQiKTtkLmFkZChmKX07dmFyIFhpPWZ1bmN0aW9uKCl7TWguY2FsbCh0aGlzKX07dChYaSxNaCk7WGkuRU1QVFk9TWguRU1QVFk7WGkucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciBZaT1mdW5jdGlvbihhLGIpe01oLmNhbGwodGhpcyk7dGhpcy5QYj1hO3RoaXMuUHQ9Yjt0aGlzLnBlbmRpbmc9ITF9O3QoWWksWGkpO1lpLkVNUFRZPVhpLkVNUFRZO2g9WWkucHJvdG90eXBlO2guc2NoZWR1bGU9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/MDpiO2lmKHRoaXMuY2xvc2VkKXJldHVybiB0aGlzO3RoaXMuc3RhdGU9YTthPXRoaXMuaWQ7dmFyIGM9dGhpcy5QYjtudWxsIT1hJiYodGhpcy5pZD10aGlzLmZwKGMsYSxiKSk7dGhpcy5wZW5kaW5nPSEwO3RoaXMuZGVsYXk9Yjt0aGlzLmlkPXRoaXMuaWR8fHRoaXMuaHAoYyx0aGlzLmlkLGIpO3JldHVybiB0aGlzfTtoLmhwPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gc2V0SW50ZXJ2YWwoYS5mbHVzaC5iaW5kKGEsdGhpcyksdm9pZCAwPT09Yz8wOmMpfTsKaC5mcD1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jPzA6YztpZihudWxsIT09YyYmdGhpcy5kZWxheT09PWMmJiExPT09dGhpcy5wZW5kaW5nKXJldHVybiBiO2NsZWFySW50ZXJ2YWwoYil9O2gubXM9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLmNsb3NlZClyZXR1cm4gRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTt0aGlzLnBlbmRpbmc9ITE7aWYoYT10aGlzLmtCKGEsYikpcmV0dXJuIGE7ITE9PT10aGlzLnBlbmRpbmcmJm51bGwhPXRoaXMuaWQmJih0aGlzLmlkPXRoaXMuZnAodGhpcy5QYix0aGlzLmlkLG51bGwpKX07aC5rQj1mdW5jdGlvbihhKXt2YXIgYj0hMSxjPXZvaWQgMDt0cnl7dGhpcy5QdChhKX1jYXRjaChkKXtiPSEwLGM9ISFkJiZkfHxFcnJvcihkKX1pZihiKXJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCksY307CmgudWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmlkLGI9dGhpcy5QYixjPWIuYWN0aW9ucyxkPWMuaW5kZXhPZih0aGlzKTt0aGlzLnN0YXRlPXRoaXMuUHQ9bnVsbDt0aGlzLnBlbmRpbmc9ITE7dGhpcy5QYj1udWxsOy0xIT09ZCYmYy5zcGxpY2UoZCwxKTtudWxsIT1hJiYodGhpcy5pZD10aGlzLmZwKGIsYSxudWxsKSk7dGhpcy5kZWxheT1udWxsfTt2YXIgWmk9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/bGkubm93OmI7bGkuY2FsbCh0aGlzLGEsZnVuY3Rpb24oKXtyZXR1cm4gWmkuVSYmWmkuVSE9PWM/WmkuVS5ub3coKTpiKCl9KTt2YXIgYz10aGlzO3RoaXMuYWN0aW9ucz1bXTt0aGlzLmFjdGl2ZT0hMTt0aGlzLnZ0PXZvaWQgMH07dChaaSxsaSk7Wmkubm93PWxpLm5vdztaaS5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24oYSxiLGMpe2I9dm9pZCAwPT09Yj8wOmI7cmV0dXJuIFppLlUmJlppLlUhPT10aGlzP1ppLlUuc2NoZWR1bGUoYSxiLGMpOmxpLnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsYSxiLGMpfTsKWmkucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYWN0aW9ucztpZih0aGlzLmFjdGl2ZSliLnB1c2goYSk7ZWxzZXt2YXIgYzt0aGlzLmFjdGl2ZT0hMDtkbyBpZihjPWEubXMoYS5zdGF0ZSxhLmRlbGF5KSlicmVhazt3aGlsZShhPWIuc2hpZnQoKSk7dGhpcy5hY3RpdmU9ITE7aWYoYyl7Zm9yKDthPWIuc2hpZnQoKTspYS51bnN1YnNjcmliZSgpO3Rocm93IGM7fX19O3ZhciAkaT1uZXcgWmkoWWkpO2Z1bmN0aW9uIFhqKGEpe3JldHVybiFKaChhKSYmMDw9YS1wYXJzZUZsb2F0KGEpKzF9O2Z1bmN0aW9uIFlqKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2MtMF09YXJndW1lbnRzW2NdO2M9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3ZhciBkPXZvaWQgMCxlPWJbYi5sZW5ndGgtMV07ZWkoZSk/KGQ9Yi5wb3AoKSwxPGIubGVuZ3RoJiYibnVtYmVyIj09PXR5cGVvZiBiW2IubGVuZ3RoLTFdJiYoYz1iLnBvcCgpKSk6Im51bWJlciI9PT10eXBlb2YgZSYmKGM9Yi5wb3AoKSk7cmV0dXJuIWQmJjE9PT1iLmxlbmd0aCYmYlswXWluc3RhbmNlb2YgVGg/YlswXTpRaShjKShkP2NpKGIsZCk6bmV3IFRoKGRpKGIpKSl9O2Z1bmN0aW9uIFpqKCl7fTtmdW5jdGlvbiBhayhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IGJrKGEpKX19dmFyIGJrPWZ1bmN0aW9uKGEpe3RoaXMuZ2s9YTt0aGlzLlNlPXZvaWQgMH07YmsucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IGNrKGEsdGhpcy5nayx0aGlzLlNlKSl9O3ZhciBjaz1mdW5jdGlvbihhLGIsYyl7TC5jYWxsKHRoaXMsYSk7dGhpcy5naz1iO3RoaXMuU2U9Yzt0aGlzLmNvdW50PTB9O3QoY2ssTCk7Y2suRU1QVFk9TC5FTVBUWTtjay5jcmVhdGU9TC5jcmVhdGU7Y2sucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe3RyeXt2YXIgYj10aGlzLmdrLmNhbGwodGhpcy5TZSxhLHRoaXMuY291bnQrKyl9Y2F0Y2goYyl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcihjKTtyZXR1cm59YiYmdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGEpfTtmdW5jdGlvbiBkayhhLGIpe3ZhciBjO2E9dm9pZCAwPT09YT8wOmE7dmFyIGQ9LTE7WGooYik/ZD0xPk51bWJlcihiKSYmMXx8TnVtYmVyKGIpOmVpKGIpJiYoYz1iKTtlaShjKXx8KGM9JGkpO3JldHVybiBuZXcgVGgoZnVuY3Rpb24oZSl7dmFyIGY9WGooYSk/YTorYS1jLm5vdygpO3JldHVybiBjLnNjaGVkdWxlKGVrLGYse2luZGV4OjAsU1E6ZCxBejplfSl9KX1mdW5jdGlvbiBlayhhKXt2YXIgYj1hLmluZGV4LGM9YS5TUSxkPWEuQXo7ZC5uZXh0KGIpO2lmKCFkLmNsb3NlZCl7aWYoLTE9PT1jKXJldHVybiBkLmNvbXBsZXRlKCk7YS5pbmRleD1iKzE7dGhpcy5zY2hlZHVsZShhLGMpfX07dmFyIGZrPTEsZ2ssaGs9e307ZnVuY3Rpb24gaWsoYSl7cmV0dXJuIGEgaW4gaGs/KGRlbGV0ZSBoa1thXSwhMCk6ITF9dmFyIGprPWZ1bmN0aW9uKGEpe3ZhciBiPWZrKys7aGtbYl09ITA7Z2t8fChnaz1Qcm9taXNlLnJlc29sdmUoKSk7Z2sudGhlbihmdW5jdGlvbigpe3JldHVybiBpayhiKSYmYSgpfSk7cmV0dXJuIGJ9O3ZhciBraz1mdW5jdGlvbihhLGIpe1lpLmNhbGwodGhpcyxhLGIpO3RoaXMuUGI9YTt0aGlzLlB0PWJ9O3Qoa2ssWWkpO2trLkVNUFRZPVlpLkVNUFRZO2trLnByb3RvdHlwZS5ocD1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jPzA6YztpZihudWxsIT09YyYmMDxjKXJldHVybiBZaS5wcm90b3R5cGUuaHAuY2FsbCh0aGlzLGEsYixjKTthLmFjdGlvbnMucHVzaCh0aGlzKTtyZXR1cm4gYS52dHx8KGEudnQ9amsoYS5mbHVzaC5iaW5kKGEsdm9pZCAwKSkpfTtray5wcm90b3R5cGUuZnA9ZnVuY3Rpb24oYSxiLGMpe2M9dm9pZCAwPT09Yz8wOmM7aWYobnVsbCE9PWMmJjA8Y3x8bnVsbD09PWMmJjA8dGhpcy5kZWxheSlyZXR1cm4gWWkucHJvdG90eXBlLmZwLmNhbGwodGhpcyxhLGIsYyk7MD09PWEuYWN0aW9ucy5sZW5ndGgmJihpayhiKSxhLnZ0PXZvaWQgMCl9O3ZhciBsaz1mdW5jdGlvbigpe1ppLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dChsayxaaSk7bGsubm93PVppLm5vdztsay5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oYSl7dGhpcy5hY3RpdmU9ITA7dGhpcy52dD12b2lkIDA7dmFyIGI9dGhpcy5hY3Rpb25zLGMsZD0tMTthPWF8fGIuc2hpZnQoKTt2YXIgZT1iLmxlbmd0aDtkbyBpZihjPWEubXMoYS5zdGF0ZSxhLmRlbGF5KSlicmVhazt3aGlsZSgrK2Q8ZSYmKGE9Yi5zaGlmdCgpKSk7dGhpcy5hY3RpdmU9ITE7aWYoYyl7Zm9yKDsrK2Q8ZSYmKGE9Yi5zaGlmdCgpKTspYS51bnN1YnNjcmliZSgpO3Rocm93IGM7fX07dmFyIG1rPW5ldyBsayhrayk7dmFyIG5rPWZ1bmN0aW9uKGEsYil7WWkuY2FsbCh0aGlzLGEsYik7dGhpcy5QYj1hO3RoaXMuUHQ9Yn07dChuayxZaSk7bmsuRU1QVFk9WWkuRU1QVFk7bmsucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPzA6YjtpZigwPGIpcmV0dXJuIFlpLnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsYSxiKTt0aGlzLmRlbGF5PWI7dGhpcy5zdGF0ZT1hO3RoaXMuUGIuZmx1c2godGhpcyk7cmV0dXJuIHRoaXN9O25rLnByb3RvdHlwZS5tcz1mdW5jdGlvbihhLGIpe3JldHVybiAwPGJ8fHRoaXMuY2xvc2VkP1lpLnByb3RvdHlwZS5tcy5jYWxsKHRoaXMsYSxiKTp0aGlzLmtCKGEsYil9O25rLnByb3RvdHlwZS5ocD1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jPzA6YztyZXR1cm4gbnVsbCE9PWMmJjA8Y3x8bnVsbD09PWMmJjA8dGhpcy5kZWxheT9ZaS5wcm90b3R5cGUuaHAuY2FsbCh0aGlzLGEsYixjKTphLmZsdXNoKHRoaXMpfTt2YXIgb2s9ZnVuY3Rpb24oKXtaaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3Qob2ssWmkpO29rLm5vdz1aaS5ub3c7dmFyIHBrPW5ldyBvayhuayk7dmFyIHFrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMubWVzc2FnZT0iYXJndW1lbnQgb3V0IG9mIHJhbmdlIjt0aGlzLm5hbWU9IkFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yIjtyZXR1cm4gdGhpc31hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7cmV0dXJuIGF9KCk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMubWVzc2FnZT0iVGltZW91dCBoYXMgb2NjdXJyZWQiO3RoaXMubmFtZT0iVGltZW91dEVycm9yIjtyZXR1cm4gdGhpc31hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7cmV0dXJuIGF9KSgpO3ZhciByaz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTtZaC5jYWxsKHRoaXMpO3RoaXMuTWs9YX07dChyayxZaCk7cmsuY3JlYXRlPVloLmNyZWF0ZTtyay5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihhKXtZaC5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsYSl9Owpyay5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbigpe3JldHVybiBudWxsfSxlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O2lmKGEmJiJvYmplY3QiPT09dHlwZW9mIGEpe3ZhciBmPXRoaXMuTWs/ZnVuY3Rpb24oZyl7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBhLm5leHQoZyl9KX06ZnVuY3Rpb24oZyl7YS5uZXh0KGcpfTthLmVycm9yJiYoZD10aGlzLk1rP2Z1bmN0aW9uKGcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5lcnJvcihnKX0pfTpmdW5jdGlvbihnKXthLmVycm9yKGcpfSk7YS5jb21wbGV0ZSYmKGU9dGhpcy5Naz9mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5jb21wbGV0ZSgpfSl9OmZ1bmN0aW9uKCl7YS5jb21wbGV0ZSgpfSl9ZWxzZSBmPXRoaXMuTWs/ZnVuY3Rpb24oZyl7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBhKGcpfSl9OmZ1bmN0aW9uKGcpe2EoZyl9LGImJgooZD10aGlzLk1rP2Z1bmN0aW9uKGcpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYihnKX0pfTpmdW5jdGlvbihnKXtiKGcpfSksYyYmKGU9dGhpcy5Naz9mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYygpfSl9OmZ1bmN0aW9uKCl7YygpfSk7Zj1ZaC5wcm90b3R5cGUuc3Vic2NyaWJlLmNhbGwodGhpcyxmLGQsZSk7YSBpbnN0YW5jZW9mIE1oJiZhLmFkZChmKTtyZXR1cm4gZn07dmFyIFQ9ZnVuY3Rpb24oYSl7dmFyIGI9dm9pZCAwPT09YS51Rj8hMTphLnVGO2E9dm9pZCAwPT09YS50cD8hMTphLnRwO3RoaXMuc289dGhpcy5Dcz0hMTt0aGlzLmlzU3RhYmxlPSEwO3RoaXMuUnk9bmV3IHJrKCExKTt0aGlzLlVvPW5ldyByayghMSk7dGhpcy5yZj1uZXcgcmsoITEpO3RoaXMuTEc9bmV3IHJrKCExKTtpZigidW5kZWZpbmVkIj09dHlwZW9mIFpvbmUpdGhyb3cgRXJyb3IoIkluIHRoaXMgY29uZmlndXJhdGlvbiBBbmd1bGFyIHJlcXVpcmVzIFpvbmUuanMiKTtab25lLktPKCk7dGhpcy5ubD0wO3RoaXMudU09dGhpcy5YZT1ab25lLmN1cnJlbnQ7Wm9uZS53dGZab25lU3BlYyYmKHRoaXMuWGU9dGhpcy5YZS5DZShab25lLnd0ZlpvbmVTcGVjKSk7Wm9uZS5UYXNrVHJhY2tpbmdab25lU3BlYyYmKHRoaXMuWGU9dGhpcy5YZS5DZShuZXcgWm9uZS5UYXNrVHJhY2tpbmdab25lU3BlYykpO2ImJlpvbmUubG9uZ1N0YWNrVHJhY2Vab25lU3BlYyYmKHRoaXMuWGU9dGhpcy5YZS5DZShab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWMpKTsKdGhpcy50cD1hO3RoaXMuTHM9LTE7Yj0kYy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7YT0kYy5jYW5jZWxBbmltYXRpb25GcmFtZTsidW5kZWZpbmVkIiE9PXR5cGVvZiBab25lJiZiJiZhJiYoKGE9Yltab25lLnNjKCJPcmlnaW5hbERlbGVnYXRlIildKSYmKGI9YSksWm9uZS5zYygiT3JpZ2luYWxEZWxlZ2F0ZSIpKTt0aGlzLkdHPWI7c2sodGhpcyl9LHRrPWZ1bmN0aW9uKCl7cmV0dXJuITA9PT1ab25lLmN1cnJlbnQuZ2V0KCJpc0FuZ3VsYXJab25lIil9LHVrPWZ1bmN0aW9uKCl7aWYodGsoKSl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdG8gbm90IGJlIGluIEFuZ3VsYXIgWm9uZSwgYnV0IGl0IGlzISIpO307VC5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLlhlLmdhKGEsYixjKX07ClQucHJvdG90eXBlLnJ0PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLlhlO2E9ZC50dCgiTmdab25lRXZlbnQ6IHVuZGVmaW5lZCIsYSx2ayx3ayx3ayk7dHJ5e3JldHVybiBkLnJ0KGEsYixjKX1maW5hbGx5e2QuR2coYSl9fTtULnByb3RvdHlwZS5yaz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuWGUucmsoYSxiLGMpfTtULnByb3RvdHlwZS5vYT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51TS5nYShhKX07ZnVuY3Rpb24gd2soKXt9dmFyIHZrPXt9O2Z1bmN0aW9uIHhrKGEpe2lmKDA9PWEubmwmJiFhLnNvJiYhYS5pc1N0YWJsZSl0cnl7YS5ubCsrLGEuVW8uZW1pdChudWxsKX1maW5hbGx5e2lmKGEubmwtLSwhYS5zbyl0cnl7YS5vYShmdW5jdGlvbigpe3JldHVybiBhLnJmLmVtaXQobnVsbCl9KX1maW5hbGx5e2EuaXNTdGFibGU9ITB9fX0KZnVuY3Rpb24geWsoYSl7LTE9PT1hLkxzJiYoYS5Mcz1hLkdHLmNhbGwoJGMsZnVuY3Rpb24oKXthLnlGfHwoYS55Rj1ab25lLnJvb3QudHQoImZha2VUb3BFdmVudFRhc2siLGZ1bmN0aW9uKCl7YS5Mcz0tMTt6ayhhKTt4ayhhKX0sdm9pZCAwLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30pKTthLnlGLkJiKCl9KSx6ayhhKSl9CmZ1bmN0aW9uIHNrKGEpe3ZhciBiPSEhYS50cCYmYS5HRyYmZnVuY3Rpb24oKXt5ayhhKX07YS5YZT1hLlhlLkNlKHtuYW1lOiJhbmd1bGFyIixwcm9wZXJ0aWVzOntpc0FuZ3VsYXJab25lOiEwLG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb246Yn0sd2k6ZnVuY3Rpb24oYyxkLGUsZixnLGwpe3RyeXtyZXR1cm4gQWsoYSksYy5maShlLGYsZyxsKX1maW5hbGx5e2ImJiJldmVudFRhc2siPT09Zi50eXBlJiZiKCksYS5ubC0tLHhrKGEpfX0sZW06ZnVuY3Rpb24oYyxkLGUsZixnLGwsbSl7dHJ5e3JldHVybiBBayhhKSxjLkJiKGUsZixnLGwsbSl9ZmluYWxseXthLm5sLS0seGsoYSl9fSxPeTpmdW5jdGlvbihjLGQsZSxmKXtjLmp5KGUsZik7ZD09PWUmJigibWljcm9UYXNrIj09Zi5RYT8oYS5vTD1mLnVRLHprKGEpLHhrKGEpKToibWFjcm9UYXNrIj09Zi5RYSYmKGEuQ3M9Zi5xUSkpfSxaajpmdW5jdGlvbihjLGQsZSxmKXtjLmhhbmRsZUVycm9yKGUsZik7YS5vYShmdW5jdGlvbigpe3JldHVybiBhLkxHLmVtaXQoZil9KTsKcmV0dXJuITF9fSl9ZnVuY3Rpb24gemsoYSl7YS5zbz1hLm9MfHxhLnRwJiYtMSE9PWEuTHM/ITA6ITF9ZnVuY3Rpb24gQWsoYSl7YS5ubCsrO2EuaXNTdGFibGUmJihhLmlzU3RhYmxlPSExLGEuUnkuZW1pdChudWxsKSl9O3ZhciBCaz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuUz1hO3RoaXMud009MDt0aGlzLnd2PSEwO3RoaXMuVW09ITE7dGhpcy5TaT1bXTt0aGlzLkR0PW51bGw7dGhpcy5zTygpO2EuZ2EoZnVuY3Rpb24oKXtiLkR0PSJ1bmRlZmluZWQiPT10eXBlb2YgWm9uZT9udWxsOlpvbmUuY3VycmVudC5nZXQoIlRhc2tUcmFja2luZ1pvbmUiKX0pfTtCay5wcm90b3R5cGUuc089ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuUy5SeS5zdWJzY3JpYmUoe25leHQ6ZnVuY3Rpb24oKXthLlVtPSEwO2Eud3Y9ITF9fSk7dGhpcy5TLm9hKGZ1bmN0aW9uKCl7YS5TLnJmLnN1YnNjcmliZSh7bmV4dDpmdW5jdGlvbigpe3VrKCk7QWgoZnVuY3Rpb24oKXthLnd2PSEwO2EuekQoKX0pfX0pfSl9O0JrLnByb3RvdHlwZS5pc1N0YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnd2JiYwPT09dGhpcy53TSYmIXRoaXMuUy5Dc307CkJrLnByb3RvdHlwZS56RD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYodGhpcy5pc1N0YWJsZSgpKUFoKGZ1bmN0aW9uKCl7Zm9yKDswIT09YS5TaS5sZW5ndGg7KXt2YXIgYz1hLlNpLnBvcCgpO2NsZWFyVGltZW91dChjLkV6KTtjLnRQKGEuVW0pfWEuVW09ITF9KTtlbHNle3ZhciBiPUNrKHRoaXMpO3RoaXMuU2k9dGhpcy5TaS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMub0kmJmMub0koYik/KGNsZWFyVGltZW91dChjLkV6KSwhMSk6ITB9KTt0aGlzLlVtPSEwfX07CnZhciBDaz1mdW5jdGlvbihhKXtyZXR1cm4gYS5EdD9hLkR0LkNTLm1hcChmdW5jdGlvbihiKXtyZXR1cm57c291cmNlOmIuc291cmNlLGhQOmIuaFAsZGF0YTpiLmRhdGF9fSk6W119LERrPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPS0xO2MmJjA8YyYmKGU9c2V0VGltZW91dChmdW5jdGlvbigpe2EuU2k9YS5TaS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIGYuRXohPT1lfSk7YihhLlVtLENrKGEpKX0sYykpO2EuU2kucHVzaCh7dFA6YixFejplLG9JOmR9KX07QmsucHJvdG90eXBlLndoZW5TdGFibGU9ZnVuY3Rpb24oYSxiLGMpe2lmKGMmJiF0aGlzLkR0KXRocm93IEVycm9yKCdUYXNrIHRyYWNraW5nIHpvbmUgaXMgcmVxdWlyZWQgd2hlbiBwYXNzaW5nIGFuIHVwZGF0ZSBjYWxsYmFjayB0byB3aGVuU3RhYmxlKCkuIElzICJ6b25lLmpzL2Rpc3QvdGFzay10cmFja2luZy5qcyIgbG9hZGVkPycpO0RrKHRoaXMsYSxiLGMpO3RoaXMuekQoKX07CkJrLnByb3RvdHlwZS5maW5kUHJvdmlkZXJzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3ZhciBGaz1mdW5jdGlvbigpe3RoaXMuWXA9bmV3IE1hcDtFay5ERSh0aGlzKX0sR2s9ZnVuY3Rpb24oYSxiLGMpe2EuWXAuc2V0KGIsYyl9O0ZrLnByb3RvdHlwZS5XbD1mdW5jdGlvbihhLGIpe3JldHVybiBFay5XbCh0aGlzLGEsdm9pZCAwPT09Yj8hMDpiKX07dmFyIEhrPWZ1bmN0aW9uKCl7fTtIay5wcm90b3R5cGUuREU9ZnVuY3Rpb24oKXt9O0hrLnByb3RvdHlwZS5XbD1mdW5jdGlvbigpe3JldHVybiBudWxsfTt2YXIgRWs9bmV3IEhrO2Z1bmN0aW9uIElrKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYi5qYihuZXcgSmsoYSkpfX12YXIgSms9ZnVuY3Rpb24oYSl7dGhpcy5WeD1hfTtKay5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgS2soYSx0aGlzLlZ4KSl9O3ZhciBLaz1mdW5jdGlvbihhLGIpe3hpLmNhbGwodGhpcyxhKTt0aGlzLlZ4PWI7dGhpcy52YWx1ZT1udWxsO3RoaXMuRGU9ITE7dGhpcy5FdD1udWxsfTt0KEtrLHhpKTtLay5FTVBUWT14aS5FTVBUWTtLay5jcmVhdGU9eGkuY3JlYXRlO0trLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE7dGhpcy5EZT0hMDtpZighdGhpcy5FdCl7dHJ5e3ZhciBiPXRoaXMuVng7dmFyIGM9YihhKX1jYXRjaChkKXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihkKX1hPUhpKHRoaXMsYyk7IWF8fGEuY2xvc2VkP0xrKHRoaXMpOnRoaXMuYWRkKHRoaXMuRXQ9YSl9fTsKdmFyIExrPWZ1bmN0aW9uKGEpe3ZhciBiPWEudmFsdWUsYz1hLkRlLGQ9YS5FdDtkJiYoYS5yZW1vdmUoZCksYS5FdD1udWxsLGQudW5zdWJzY3JpYmUoKSk7YyYmKGEudmFsdWU9bnVsbCxhLkRlPSExLGEuZGVzdGluYXRpb24ubmV4dChiKSl9O0trLnByb3RvdHlwZS5Waj1mdW5jdGlvbigpe0xrKHRoaXMpfTtLay5wcm90b3R5cGUuJGY9ZnVuY3Rpb24oKXtMayh0aGlzKX07ZnVuY3Rpb24gTWsoYSl7dmFyIGI9dm9pZCAwPT09Yj8kaTpiO3JldHVybiBJayhmdW5jdGlvbigpe3JldHVybiBkayhhLGIpfSl9O2Z1bmN0aW9uIE5rKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1uZXcgT2soYSk7Yj1iLmpiKGMpO3JldHVybiBjLkJ4PWJ9fXZhciBPaz1mdW5jdGlvbihhKXt0aGlzLmllPWF9O09rLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyBQayhhLHRoaXMuaWUsdGhpcy5CeCkpfTt2YXIgUGs9ZnVuY3Rpb24oYSxiLGMpe3hpLmNhbGwodGhpcyxhKTt0aGlzLmllPWI7dGhpcy5CeD1jfTt0KFBrLHhpKTtQay5FTVBUWT14aS5FTVBUWTtQay5jcmVhdGU9eGkuY3JlYXRlO1BrLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihhKXtpZighdGhpcy5DYil7dHJ5e3ZhciBiPXRoaXMuaWUoYSx0aGlzLkJ4KX1jYXRjaChjKXt4aS5wcm90b3R5cGUuZXJyb3IuY2FsbCh0aGlzLGMpO3JldHVybn10aGlzLiROKCk7YT1uZXcgeWkodGhpcyx2b2lkIDAsdm9pZCAwKTt0aGlzLmFkZChhKTtIaSh0aGlzLGIsdm9pZCAwLHZvaWQgMCxhKX19O2Z1bmN0aW9uIFFrKGEpe3ZhciBiPXZvaWQgMD09PWI/JGk6YjtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIGMuamIobmV3IFJrKGEsYikpfX12YXIgUms9ZnVuY3Rpb24oYSxiKXt0aGlzLlV4PWE7dGhpcy5QYj1ifTtSay5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgU2soYSx0aGlzLlV4LHRoaXMuUGIpKX07dmFyIFNrPWZ1bmN0aW9uKGEsYixjKXtMLmNhbGwodGhpcyxhKTt0aGlzLlV4PWI7dGhpcy5QYj1jO3RoaXMuQXk9dGhpcy5PeD1udWxsO3RoaXMuRGU9ITF9O3QoU2ssTCk7U2suRU1QVFk9TC5FTVBUWTtTay5jcmVhdGU9TC5jcmVhdGU7U2sucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe1RrKHRoaXMpO3RoaXMuQXk9YTt0aGlzLkRlPSEwO3RoaXMuYWRkKHRoaXMuT3g9dGhpcy5QYi5zY2hlZHVsZShVayx0aGlzLlV4LHRoaXMpKX07U2sucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7VmsodGhpcyk7dGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfTsKdmFyIFZrPWZ1bmN0aW9uKGEpe1RrKGEpO2lmKGEuRGUpe3ZhciBiPWEuQXk7YS5BeT1udWxsO2EuRGU9ITE7YS5kZXN0aW5hdGlvbi5uZXh0KGIpfX0sVGs9ZnVuY3Rpb24oYSl7dmFyIGI9YS5PeDtudWxsIT09YiYmKGEucmVtb3ZlKGIpLGIudW5zdWJzY3JpYmUoKSxhLk94PW51bGwpfTtmdW5jdGlvbiBVayhhKXtWayhhKX07ZnVuY3Rpb24gV2soYSl7YT12b2lkIDA9PT1hP251bGw6YTtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IFhrKGEpKX19dmFyIFhrPWZ1bmN0aW9uKGEpe3RoaXMuZGVmYXVsdFZhbHVlPWF9O1hrLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyBZayhhLHRoaXMuZGVmYXVsdFZhbHVlKSl9O3ZhciBZaz1mdW5jdGlvbihhLGIpe0wuY2FsbCh0aGlzLGEpO3RoaXMuZGVmYXVsdFZhbHVlPWI7dGhpcy5Paj0hMH07dChZayxMKTtZay5FTVBUWT1MLkVNUFRZO1lrLmNyZWF0ZT1MLmNyZWF0ZTtZay5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSl7dGhpcy5Paj0hMTt0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSl9O1lrLnByb3RvdHlwZS5SYj1mdW5jdGlvbigpe3RoaXMuT2omJnRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZSk7dGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfTtmdW5jdGlvbiBaayhhLGIpe2I9dm9pZCAwPT09Yj8kaTpiO3ZhciBjPWEgaW5zdGFuY2VvZiBEYXRlJiYhaXNOYU4oK2EpPythLWIubm93KCk6TWF0aC5hYnMoYSk7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBkLmpiKG5ldyAkayhjLGIpKX19dmFyICRrPWZ1bmN0aW9uKGEsYil7dGhpcy5kZWxheT1hO3RoaXMuUGI9Yn07JGsucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IGFsKGEsdGhpcy5kZWxheSx0aGlzLlBiKSl9O3ZhciBhbD1mdW5jdGlvbihhLGIsYyl7TC5jYWxsKHRoaXMsYSk7dGhpcy5kZWxheT1iO3RoaXMuUGI9Yzt0aGlzLmd0PVtdO3RoaXMud0Y9dGhpcy5hY3RpdmU9ITF9O3QoYWwsTCk7YWwuRU1QVFk9TC5FTVBUWTthbC5jcmVhdGU9TC5jcmVhdGU7CnZhciBibD1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS5zb3VyY2UsYz1iLmd0LGQ9YS5QYixlPWEuZGVzdGluYXRpb247MDxjLmxlbmd0aCYmMD49Y1swXS50aW1lLWQubm93KCk7KWMuc2hpZnQoKS5ub3RpZmljYXRpb24ub2JzZXJ2ZShlKTswPGMubGVuZ3RoPyhiPU1hdGgubWF4KDAsY1swXS50aW1lLWQubm93KCkpLHRoaXMuc2NoZWR1bGUoYSxiKSk6KGIuQ2I/Yi5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOnRoaXMudW5zdWJzY3JpYmUoKSxiLmFjdGl2ZT0hMSl9O2FsLnByb3RvdHlwZS5hTj1mdW5jdGlvbihhKXt0aGlzLmFjdGl2ZT0hMDt0aGlzLmRlc3RpbmF0aW9uLmFkZChhLnNjaGVkdWxlKGJsLHRoaXMuZGVsYXkse3NvdXJjZTp0aGlzLGRlc3RpbmF0aW9uOnRoaXMuZGVzdGluYXRpb24sUGI6YX0pKX07CmFsLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt2YXIgYj1qaShhKTshMCE9PXRoaXMud0YmJihhPXRoaXMuUGIsYj1uZXcgY2woYS5ub3coKSt0aGlzLmRlbGF5LGIpLHRoaXMuZ3QucHVzaChiKSwhMT09PXRoaXMuYWN0aXZlJiZ0aGlzLmFOKGEpKX07YWwucHJvdG90eXBlLldlPWZ1bmN0aW9uKGEpe3RoaXMud0Y9ITA7dGhpcy5ndD1bXTt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGEpO3RoaXMudW5zdWJzY3JpYmUoKX07YWwucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7MD09PXRoaXMuZ3QubGVuZ3RoJiZ0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7dGhpcy51bnN1YnNjcmliZSgpfTt2YXIgY2w9ZnVuY3Rpb24oYSxiKXt0aGlzLnRpbWU9YTt0aGlzLm5vdGlmaWNhdGlvbj1ifTtmdW5jdGlvbiBkbChhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IGVsKGEpKX19dmFyIGVsPWZ1bmN0aW9uKGEpe3RoaXMuY29tcGFyZT1hO3RoaXMudnk9dm9pZCAwfTtlbC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgZmwoYSx0aGlzLmNvbXBhcmUsdGhpcy52eSkpfTt2YXIgZmw9ZnVuY3Rpb24oYSxiLGMpe0wuY2FsbCh0aGlzLGEpO3RoaXMudnk9Yzt0aGlzLk9GPSExOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKHRoaXMuY29tcGFyZT1iKX07dChmbCxMKTtmbC5FTVBUWT1MLkVNUFRZO2ZsLmNyZWF0ZT1MLmNyZWF0ZTtmbC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn07CmZsLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt0cnl7dmFyIGI9dGhpcy52eTt2YXIgYz1iP2IoYSk6YX1jYXRjaChlKXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlKX1iPSExO2lmKHRoaXMuT0YpdHJ5e3ZhciBkPXRoaXMuY29tcGFyZTtiPWQodGhpcy5rZXksYyl9Y2F0Y2goZSl7cmV0dXJuIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZSl9ZWxzZSB0aGlzLk9GPSEwO2J8fCh0aGlzLmtleT1jLHRoaXMuZGVzdGluYXRpb24ubmV4dChhKSl9O2Z1bmN0aW9uIGdsKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmpiKG5ldyBobCl9fXZhciBobD1mdW5jdGlvbigpe3RoaXMudG90YWw9MTtpZigwPnRoaXMudG90YWwpdGhyb3cgbmV3IHFrO307aGwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IGlsKGEsdGhpcy50b3RhbCkpfTt2YXIgaWw9ZnVuY3Rpb24oYSxiKXtMLmNhbGwodGhpcyxhKTt0aGlzLnRvdGFsPWI7dGhpcy5jb3VudD0wfTt0KGlsLEwpO2lsLkVNUFRZPUwuRU1QVFk7aWwuY3JlYXRlPUwuY3JlYXRlO2lsLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRvdGFsLGM9Kyt0aGlzLmNvdW50O2M8PWImJih0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSksYz09PWImJih0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCksdGhpcy51bnN1YnNjcmliZSgpKSl9O2Z1bmN0aW9uIGpsKGEpe2E9dm9pZCAwPT09YT9rbDphO3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYi5qYihuZXcgbGwoYSkpfX12YXIgbGw9ZnVuY3Rpb24oYSl7dGhpcy5YeD1hfTtsbC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgbWwoYSx0aGlzLlh4KSl9O3ZhciBtbD1mdW5jdGlvbihhLGIpe0wuY2FsbCh0aGlzLGEpO3RoaXMuWHg9Yjt0aGlzLkRlPSExfTt0KG1sLEwpO21sLkVNUFRZPUwuRU1QVFk7bWwuY3JlYXRlPUwuY3JlYXRlO21sLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt0aGlzLkRlPSEwO3RoaXMuZGVzdGluYXRpb24ubmV4dChhKX07bWwucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7aWYodGhpcy5EZSlyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpO3RyeXt2YXIgYT10aGlzLlh4KCl9Y2F0Y2goYil7YT1ifXRoaXMuZGVzdGluYXRpb24uZXJyb3IoYSl9OwpmdW5jdGlvbiBrbCgpe3JldHVybiBuZXcgbWl9O2Z1bmN0aW9uIG5sKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYi5qYihuZXcgb2woYSxiKSl9fXZhciBvbD1mdW5jdGlvbihhLGIpe3RoaXMuZ2s9YTt0aGlzLlNlPXZvaWQgMDt0aGlzLnNvdXJjZT1ifTtvbC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgcGwoYSx0aGlzLmdrLHRoaXMuU2UsdGhpcy5zb3VyY2UpKX07dmFyIHBsPWZ1bmN0aW9uKGEsYixjLGQpe0wuY2FsbCh0aGlzLGEpO3RoaXMuZ2s9Yjt0aGlzLlNlPWM7dGhpcy5zb3VyY2U9ZDt0aGlzLmluZGV4PTA7dGhpcy5TZT1jfHx0aGlzfTt0KHBsLEwpO3BsLkVNUFRZPUwuRU1QVFk7cGwuY3JlYXRlPUwuY3JlYXRlO3BsLnByb3RvdHlwZS4kZj1mdW5jdGlvbihhKXt0aGlzLmRlc3RpbmF0aW9uLm5leHQoYSk7dGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfTsKcGwucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2suY2FsbCh0aGlzLlNlLGEsdGhpcy5pbmRleCsrLHRoaXMuc291cmNlKX1jYXRjaChjKXt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGMpO3JldHVybn1ifHx0aGlzLiRmKCExKX07cGwucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy4kZighMCl9O2Z1bmN0aW9uIHFsKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYi5qYihuZXcgcmwoYSkpfX12YXIgcmw9ZnVuY3Rpb24oYSl7dGhpcy5aZD1hfTtybC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBEaShiLG5ldyBzbChhLHRoaXMuWmQpKX07dmFyIHNsPWZ1bmN0aW9uKGEsYil7TC5jYWxsKHRoaXMsYSk7dGhpcy5hZGQobmV3IE1oKGIpKX07dChzbCxMKTtzbC5FTVBUWT1MLkVNUFRZO3NsLmNyZWF0ZT1MLmNyZWF0ZTtmdW5jdGlvbiB0bChhLGIpe3ZhciBjPTI8PWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBkLmIoYT9hayhmdW5jdGlvbihlLGYpe3JldHVybiBhKGUsZixkKX0pOlJoLGdsKCksYz9XayhiKTpqbChmdW5jdGlvbigpe3JldHVybiBuZXcgbWl9KSl9fTtmdW5jdGlvbiB1bCgpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5qYihuZXcgdmwpfX12YXIgdmw9ZnVuY3Rpb24oKXt0aGlzLnRvdGFsPTE7aWYoMD50aGlzLnRvdGFsKXRocm93IG5ldyBxazt9O3ZsLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyB3bChhLHRoaXMudG90YWwpKX07dmFyIHdsPWZ1bmN0aW9uKGEsYil7TC5jYWxsKHRoaXMsYSk7dGhpcy50b3RhbD1iO3RoaXMueEg9W107dGhpcy5jb3VudD0wfTt0KHdsLEwpO3dsLkVNUFRZPUwuRU1QVFk7d2wuY3JlYXRlPUwuY3JlYXRlO3dsLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnhILGM9dGhpcy50b3RhbCxkPXRoaXMuY291bnQrKztiLmxlbmd0aDxjP2IucHVzaChhKTpiW2QlY109YX07CndsLnByb3RvdHlwZS5SYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVzdGluYXRpb24sYj10aGlzLmNvdW50O2lmKDA8Yilmb3IodmFyIGM9dGhpcy5jb3VudD49dGhpcy50b3RhbD90aGlzLnRvdGFsOnRoaXMuY291bnQsZD10aGlzLnhILGU9MDtlPGM7ZSsrKXt2YXIgZj1iKyslYzthLm5leHQoZFtmXSl9YS5jb21wbGV0ZSgpfTtmdW5jdGlvbiB4bChhLGIpe3ZhciBjPTI8PWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBkLmIoYT9hayhmdW5jdGlvbihlLGYpe3JldHVybiBhKGUsZixkKX0pOlJoLHVsKCksYz9XayhiKTpqbChmdW5jdGlvbigpe3JldHVybiBuZXcgbWl9KSl9fTtmdW5jdGlvbiB5bChhLGIpe3ZhciBjPSExOzI8PWFyZ3VtZW50cy5sZW5ndGgmJihjPSEwKTtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGQuamIobmV3IHpsKGEsYixjKSl9fXZhciB6bD1mdW5jdGlvbihhLGIsYyl7dGhpcy5qeD1hO3RoaXMuZ1I9Yjt0aGlzLldQPXZvaWQgMD09PWM/ITE6Y307emwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IEFsKGEsdGhpcy5qeCx0aGlzLmdSLHRoaXMuV1ApKX07dmFyIEFsPWZ1bmN0aW9uKGEsYixjLGQpe0wuY2FsbCh0aGlzLGEpO3RoaXMuang9Yjt0aGlzLnRhPWM7dGhpcy5WQj1kO3RoaXMuaW5kZXg9MH07dChBbCxMKTtBbC5FTVBUWT1MLkVNUFRZO0FsLmNyZWF0ZT1MLmNyZWF0ZTsKQWwucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZGVzdGluYXRpb247aWYodGhpcy5WQil7dmFyIGM9dGhpcy5pbmRleCsrO3RyeXt2YXIgZD10aGlzLmp4KHRoaXMudGEsYSxjKX1jYXRjaChlKXtiLmVycm9yKGUpO3JldHVybn10aGlzLnRhPWQ7Yi5uZXh0KGQpfWVsc2UgdGhpcy50YT1hLHRoaXMuVkI9ITAsYi5uZXh0KGEpfTtmdW5jdGlvbiBCbCgpe3ZhciBhPUNsO3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz0iZnVuY3Rpb24iPT09dHlwZW9mIGE/YTpmdW5jdGlvbigpe3JldHVybiBhfTt2YXIgZD1PYmplY3QuY3JlYXRlKGIsc2kpO2Quc291cmNlPWI7ZC5hST1jO3JldHVybiBkfX07ZnVuY3Rpb24gRGwoKXt2YXIgYT12b2lkIDA9PT1hPzA6YTtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IEVsKGEpKX19dmFyIEVsPWZ1bmN0aW9uKGEpe3RoaXMuUGI9cGs7dGhpcy5kZWxheT12b2lkIDA9PT1hPzA6YX07RWwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IEZsKGEsdGhpcy5QYix0aGlzLmRlbGF5KSl9O3ZhciBGbD1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jPzA6YztMLmNhbGwodGhpcyxhKTt0aGlzLlBiPWI7dGhpcy5kZWxheT1jfTt0KEZsLEwpO0ZsLkVNUFRZPUwuRU1QVFk7RmwuY3JlYXRlPUwuY3JlYXRlO0ZsLnhhPWZ1bmN0aW9uKGEpe2Eubm90aWZpY2F0aW9uLm9ic2VydmUoYS5kZXN0aW5hdGlvbik7dGhpcy51bnN1YnNjcmliZSgpfTt2YXIgSGw9ZnVuY3Rpb24oYSxiKXthLmRlc3RpbmF0aW9uLmFkZChhLlBiLnNjaGVkdWxlKEZsLnhhLGEuZGVsYXksbmV3IEdsKGIsYS5kZXN0aW5hdGlvbikpKX07CkZsLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXtIbCh0aGlzLGppKGEpKX07RmwucHJvdG90eXBlLldlPWZ1bmN0aW9uKGEpe0hsKHRoaXMsbmV3IGhpKCJFIix2b2lkIDAsYSkpO3RoaXMudW5zdWJzY3JpYmUoKX07RmwucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7SGwodGhpcyxraSk7dGhpcy51bnN1YnNjcmliZSgpfTt2YXIgR2w9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vdGlmaWNhdGlvbj1hO3RoaXMuZGVzdGluYXRpb249Yn07ZnVuY3Rpb24gSWwoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbYy0wXT1hcmd1bWVudHNbY107dmFyIGQ9Yi5sZW5ndGg7aWYoMD09PWQpdGhyb3cgRXJyb3IoImxpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuIik7cmV0dXJuIHVpKGZ1bmN0aW9uKGUpe3ZhciBmPWU7Zm9yKGU9MDtlPGQ7ZSsrKWlmKGY9ZltiW2VdXSwidW5kZWZpbmVkIj09PXR5cGVvZiBmKXJldHVybjtyZXR1cm4gZn0pfTtmdW5jdGlvbiBDbCgpe3JldHVybiBuZXcgWWh9ZnVuY3Rpb24gSmwoKXtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIG5pKCkoQmwoKShhKSl9fTtmdW5jdGlvbiBLbCgpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5qYihuZXcgTGwpfX12YXIgTGw9ZnVuY3Rpb24oKXt0aGlzLnRvdGFsPTF9O0xsLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyBNbChhLHRoaXMudG90YWwpKX07dmFyIE1sPWZ1bmN0aW9uKGEsYil7TC5jYWxsKHRoaXMsYSk7dGhpcy50b3RhbD1iO3RoaXMuY291bnQ9MH07dChNbCxMKTtNbC5FTVBUWT1MLkVNUFRZO01sLmNyZWF0ZT1MLmNyZWF0ZTtNbC5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSl7Kyt0aGlzLmNvdW50PnRoaXMudG90YWwmJnRoaXMuZGVzdGluYXRpb24ubmV4dChhKX07ZnVuY3Rpb24gTmwoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbYy0wXT1hcmd1bWVudHNbY107dmFyIGQ9YltiLmxlbmd0aC0xXTtyZXR1cm4gZWkoZCk/KGIucG9wKCksZnVuY3Rpb24oZSl7cmV0dXJuIFJpKGIsZSxkKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBSaShiLGUpfX07ZnVuY3Rpb24gT2woYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLmpiKG5ldyBQbChhKSl9fXZhciBQbD1mdW5jdGlvbihhKXt0aGlzLk1jPWF9O1BsLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuc3Vic2NyaWJlKG5ldyBRbChhLHRoaXMuTWMpKX07dmFyIFFsPWZ1bmN0aW9uKGEsYil7eGkuY2FsbCh0aGlzLGEpO3RoaXMuTWM9Yjt0aGlzLmluZGV4PTB9O3QoUWwseGkpO1FsLkVNUFRZPXhpLkVNUFRZO1FsLmNyZWF0ZT14aS5jcmVhdGU7aD1RbC5wcm90b3R5cGU7aC5kYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmluZGV4Kys7dHJ5e3ZhciBjPXRoaXMuTWMoYSxiKX1jYXRjaChkKXt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGQpO3JldHVybn10aGlzLmx2KGMsYSxiKX07CmgubHY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuSHM7ZCYmZC51bnN1YnNjcmliZSgpO2I9bmV3IHlpKHRoaXMsYixjKTt0aGlzLmRlc3RpbmF0aW9uLmFkZChiKTt0aGlzLkhzPUhpKHRoaXMsYSx2b2lkIDAsdm9pZCAwLGIpfTtoLlJiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IczthJiYhYS5jbG9zZWR8fHhpLnByb3RvdHlwZS5SYi5jYWxsKHRoaXMpO3RoaXMudW5zdWJzY3JpYmUoKX07aC51ZT1mdW5jdGlvbigpe3RoaXMuSHM9bnVsbH07aC4kZj1mdW5jdGlvbihhKXt0aGlzLmRlc3RpbmF0aW9uLnJlbW92ZShhKTt0aGlzLkhzPW51bGw7dGhpcy5DYiYmeGkucHJvdG90eXBlLlJiLmNhbGwodGhpcyl9O2guVmo9ZnVuY3Rpb24oYSl7dGhpcy5kZXN0aW5hdGlvbi5uZXh0KGEpfTtmdW5jdGlvbiBSbChhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IFNsKGEpKX19dmFyIFNsPWZ1bmN0aW9uKGEpe3RoaXMuQ1E9YX07U2wucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXthPW5ldyBUbChhKTt2YXIgYz1IaShhLHRoaXMuQ1EpO3JldHVybiBjJiYhYS5HSD8oYS5hZGQoYyksYi5zdWJzY3JpYmUoYSkpOmF9O3ZhciBUbD1mdW5jdGlvbihhKXt4aS5jYWxsKHRoaXMsYSk7dGhpcy5HSD0hMX07dChUbCx4aSk7VGwuRU1QVFk9eGkuRU1QVFk7VGwuY3JlYXRlPXhpLmNyZWF0ZTtUbC5wcm90b3R5cGUuVmo9ZnVuY3Rpb24oKXt0aGlzLkdIPSEwO3RoaXMuY29tcGxldGUoKX07VGwucHJvdG90eXBlLiRmPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBVbChhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIuamIobmV3IFZsKGEpKX19dmFyIFZsPWZ1bmN0aW9uKGEpe3RoaXMueFE9YTt0aGlzLmNvbXBsZXRlPXRoaXMuZXJyb3I9dm9pZCAwfTtWbC5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnN1YnNjcmliZShuZXcgV2woYSx0aGlzLnhRLHRoaXMuZXJyb3IsdGhpcy5jb21wbGV0ZSkpfTt2YXIgV2w9ZnVuY3Rpb24oYSxiLGMsZCl7TC5jYWxsKHRoaXMsYSk7dGhpcy5Ndz10aGlzLk53PXRoaXMuT3c9Wmo7dGhpcy5Odz1jfHxaajt0aGlzLk13PWR8fFpqO0toKGIpPyh0aGlzLlFjPXRoaXMsdGhpcy5Pdz1iKTpiJiYodGhpcy5RYz1iLHRoaXMuT3c9Yi5uZXh0fHxaaix0aGlzLk53PWIuZXJyb3J8fFpqLHRoaXMuTXc9Yi5jb21wbGV0ZXx8WmopfTt0KFdsLEwpO1dsLkVNUFRZPUwuRU1QVFk7V2wuY3JlYXRlPUwuY3JlYXRlOwpXbC5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuT3cuY2FsbCh0aGlzLlFjLGEpfWNhdGNoKGIpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IoYik7cmV0dXJufXRoaXMuZGVzdGluYXRpb24ubmV4dChhKX07V2wucHJvdG90eXBlLldlPWZ1bmN0aW9uKGEpe3RyeXt0aGlzLk53LmNhbGwodGhpcy5RYyxhKX1jYXRjaChiKXt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGIpO3JldHVybn10aGlzLmRlc3RpbmF0aW9uLmVycm9yKGEpfTtXbC5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oKXt0cnl7dGhpcy5Ndy5jYWxsKHRoaXMuUWMpfWNhdGNoKGEpe3RoaXMuZGVzdGluYXRpb24uZXJyb3IoYSk7cmV0dXJufXJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9O2Z1bmN0aW9uIFhsKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2MtMF09YXJndW1lbnRzW2NdO3JldHVybiBmdW5jdGlvbihkKXt2YXIgZTsiZnVuY3Rpb24iPT09dHlwZW9mIGJbYi5sZW5ndGgtMV0mJihlPWIucG9wKCkpO3JldHVybiBkLmpiKG5ldyBZbChiLGUpKX19dmFyIFlsPWZ1bmN0aW9uKGEsYil7dGhpcy5Ubz1hO3RoaXMuTWM9Yn07WWwucHJvdG90eXBlLmNhbGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5zdWJzY3JpYmUobmV3IFpsKGEsdGhpcy5Ubyx0aGlzLk1jKSl9O3ZhciBabD1mdW5jdGlvbihhLGIsYyl7eGkuY2FsbCh0aGlzLGEpO3RoaXMuVG89Yjt0aGlzLk1jPWM7dGhpcy5Daz1bXTthPWIubGVuZ3RoO3RoaXMudmFsdWVzPUFycmF5KGEpO2ZvcihjPTA7YzxhO2MrKyl0aGlzLkNrLnB1c2goYyk7Zm9yKGM9MDtjPGE7YysrKXt2YXIgZD1iW2NdO3RoaXMuYWRkKEhpKHRoaXMsZCxkLGMpKX19O3QoWmwseGkpOwpabC5FTVBUWT14aS5FTVBUWTtabC5jcmVhdGU9eGkuY3JlYXRlO1psLnByb3RvdHlwZS5Waj1mdW5jdGlvbihhLGIpe3RoaXMudmFsdWVzW2JdPWE7YT10aGlzLkNrOzA8YS5sZW5ndGgmJihiPWEuaW5kZXhPZihiKSwtMSE9PWImJmEuc3BsaWNlKGIsMSkpfTtabC5wcm90b3R5cGUuJGY9ZnVuY3Rpb24oKXt9O1psLnByb3RvdHlwZS5kYT1mdW5jdGlvbihhKXswPT09dGhpcy5Day5sZW5ndGgmJihhPVthXS5jb25jYXQoamEodGhpcy52YWx1ZXMpKSx0aGlzLk1jP3RoaXMuV04oYSk6dGhpcy5kZXN0aW5hdGlvbi5uZXh0KGEpKX07WmwucHJvdG90eXBlLldOPWZ1bmN0aW9uKGEpe3RyeXt2YXIgYj10aGlzLk1jLmFwcGx5KHRoaXMsYSl9Y2F0Y2goYyl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcihjKTtyZXR1cm59dGhpcy5kZXN0aW5hdGlvbi5uZXh0KGIpfTt2YXIgJGwsYW09bmV3IHkoIkFsbG93TXVsdGlwbGVUb2tlbiIpLGJtPWZ1bmN0aW9uKGEsYil7dGhpcy5uYW1lPWE7dGhpcy5MPWJ9O2Z1bmN0aW9uIGNtKGEpe2lmKCRsJiYhJGwuYWUmJiEkbC5aLmdldChhbSwhMSkpdGhyb3cgRXJyb3IoIlRoZXJlIGNhbiBiZSBvbmx5IG9uZSBwbGF0Zm9ybS4gRGVzdHJveSB0aGUgcHJldmlvdXMgb25lIHRvIGNyZWF0ZSBhIG5ldyBvbmUuIik7JGw9YS5nZXQoZG0pOyhhPWEuZ2V0KE1lLG51bGwpKSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3JldHVybiBiKCl9KX0KZnVuY3Rpb24gZW0oYSxiLGMpe2M9dm9pZCAwPT09Yz9bXTpjO3ZhciBkPSJQbGF0Zm9ybTogIitiLGU9bmV3IHkoZCk7cmV0dXJuIGZ1bmN0aW9uKGYpe2Y9dm9pZCAwPT09Zj9bXTpmO3ZhciBnPSRsJiYhJGwuYWU/JGw6bnVsbDtpZighZ3x8Zy5aLmdldChhbSwhMSkpYT9hKGMuY29uY2F0KGYpLmNvbmNhdCh7WWE6ZSxrZDohMH0pKTpjbShyZSh7cmM6Yy5jb25jYXQoZikuY29uY2F0KHtZYTplLGtkOiEwfSx7WWE6b2Usa2Q6InBsYXRmb3JtIn0pLG5hbWU6ZH0pKTtmPSRsJiYhJGwuYWU/JGw6bnVsbDtpZighZil0aHJvdyBFcnJvcigiTm8gcGxhdGZvcm0gZXhpc3RzISIpO2lmKCFmLlouZ2V0KGUsbnVsbCkpdGhyb3cgRXJyb3IoIkEgcGxhdGZvcm0gd2l0aCBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQuIFBsZWFzZSBkZXN0cm95IGl0IGZpcnN0LiIpO3JldHVybiBmfX0KdmFyIGRtPWZ1bmN0aW9uKGEpe3RoaXMuVWM9YTt0aGlzLkx2PVtdO3RoaXMuVG09W107dGhpcy5hYT0hMX07ZG0ucHJvdG90eXBlLlhMPWZ1bmN0aW9uKGEpe3ZhciBiPWEuWi5nZXQoZm0pO2lmKDA8YS5mcS5sZW5ndGgpYS5mcS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBnbShiLGMpfSk7ZWxzZSBpZihhLmluc3RhbmNlLnlRKWEuaW5zdGFuY2UueVEoYik7ZWxzZSB0aHJvdyBFcnJvcigiVGhlIG1vZHVsZSAiK1BjKGEuaW5zdGFuY2UuY29uc3RydWN0b3IpKycgd2FzIGJvb3RzdHJhcHBlZCwgYnV0IGl0IGRvZXMgbm90IGRlY2xhcmUgIkBOZ01vZHVsZS5ib290c3RyYXAiIGNvbXBvbmVudHMgbm9yIGEgIm5nRG9Cb290c3RyYXAiIG1ldGhvZC4gUGxlYXNlIGRlZmluZSBvbmUgb2YgdGhlc2UuJyk7dGhpcy5Mdi5wdXNoKGEpfTtkbS5wcm90b3R5cGUuVmE9ZnVuY3Rpb24oYSl7dGhpcy5UbS5wdXNoKGEpfTsKZG0ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZih0aGlzLmFhKXRocm93IEVycm9yKCJUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhIik7dGhpcy5Mdi5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGVzdHJveSgpfSk7dGhpcy5UbS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KTt0aGlzLmFhPSEwfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRtLnByb3RvdHlwZSx7Wjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWN9fSxhZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWF9fX0pOwpmdW5jdGlvbiBobShhLGIsYyl7dHJ5e3ZhciBkPWMoKTtyZXR1cm4gRWUoZCk/ZC5jYXRjaChmdW5jdGlvbihlKXtiLm9hKGZ1bmN0aW9uKCl7cmV0dXJuIGEuaGFuZGxlRXJyb3IoZSl9KTt0aHJvdyBlO30pOmR9Y2F0Y2goZSl7dGhyb3cgYi5vYShmdW5jdGlvbigpe3JldHVybiBhLmhhbmRsZUVycm9yKGUpfSksZTt9fQp2YXIgZm09ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPXRoaXM7dGhpcy5iYj1hO3RoaXMuUW09Yjt0aGlzLlVjPWM7dGhpcy5FSz1kO3RoaXMuVmk9ZTt0aGlzLnZMPWY7dGhpcy51Sj1bXTt0aGlzLnhqPVtdO3RoaXMuZ0I9dGhpcy51dz0hMTt0aGlzLnpsPSEwO3RoaXMuZUY9W107dGhpcy5KeD1bXTt0aGlzLmdCPUdkKCk7dGhpcy5iYi5Vby5zdWJzY3JpYmUoe25leHQ6ZnVuY3Rpb24oKXtnLmJiLmdhKGZ1bmN0aW9uKCl7aW0oZyl9KX19KTt0aGlzLmlzU3RhYmxlPVlqKG5ldyBUaChmdW5jdGlvbihsKXtnLnpsPWcuYmIuaXNTdGFibGUmJiFnLmJiLkNzJiYhZy5iYi5zbztnLmJiLm9hKGZ1bmN0aW9uKCl7bC5uZXh0KGcuemwpO2wuY29tcGxldGUoKX0pfSksKG5ldyBUaChmdW5jdGlvbihsKXt2YXIgbTtnLmJiLm9hKGZ1bmN0aW9uKCl7bT1nLmJiLnJmLnN1YnNjcmliZShmdW5jdGlvbigpe3VrKCk7QWgoZnVuY3Rpb24oKXtnLnpsfHxnLmJiLkNzfHxnLmJiLnNvfHwoZy56bD0KITAsbC5uZXh0KCEwKSl9KX0pfSk7dmFyIHA9Zy5iYi5SeS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtpZighdGsoKSl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdG8gYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMgbm90ISIpO2cuemwmJihnLnpsPSExLGcuYmIub2EoZnVuY3Rpb24oKXtsLm5leHQoITEpfSkpfSk7cmV0dXJuIGZ1bmN0aW9uKCl7bS51bnN1YnNjcmliZSgpO3AudW5zdWJzY3JpYmUoKX19KSkuYihKbCgpKSl9LGdtPWZ1bmN0aW9uKGEsYil7aWYoIWEudkwuZG9uZSl0aHJvdyBFcnJvcigiQ2Fubm90IGJvb3RzdHJhcCBhcyB0aGVyZSBhcmUgc3RpbGwgYXN5bmNocm9ub3VzIGluaXRpYWxpemVycyBydW5uaW5nLiBCb290c3RyYXAgY29tcG9uZW50cyBpbiB0aGUgYG5nRG9Cb290c3RyYXBgIG1ldGhvZCBvZiB0aGUgcm9vdCBtb2R1bGUuIik7Yj1iIGluc3RhbmNlb2YgVGU/YjpXZShhLlZpLGIpO2EuZUYucHVzaChiLlluKTt2YXIgYz1iIGluc3RhbmNlb2YgWGU/dm9pZCAwOgphLlVjLmdldChwZCksZD1iLmNyZWF0ZShzZSxbXSxiLmllLGMpO2QuVmEoZnVuY3Rpb24oKXthLllOKGQpfSk7KGI9ZC5aLmdldChCayxudWxsKSkmJkdrKGQuWi5nZXQoRmspLGQubG9jYXRpb24uaSxiKTthLlFMKGQpO0dkKCkmJmEuUW0ubG9nKCJBbmd1bGFyIGlzIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSBwcm9kdWN0aW9uIG1vZGUuIik7cmV0dXJuIGR9LGltPWZ1bmN0aW9uKGEpe2lmKGEudXcpdGhyb3cgRXJyb3IoIkFwcGxpY2F0aW9uUmVmLnRpY2sgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5Iik7dHJ5e2EudXc9ITA7Zm9yKHZhciBiPW4oYS54aiksYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpYy52YWx1ZS5MZygpO2lmKGEuZ0Ipe3ZhciBkPW4oYS54aik7Zm9yKGM9ZC5uZXh0KCk7IWMuZG9uZTtjPWQubmV4dCgpKWMudmFsdWUuWkUoKX19Y2F0Y2goZSl7YS5iYi5vYShmdW5jdGlvbigpe3JldHVybiBhLkVLLmhhbmRsZUVycm9yKGUpfSl9ZmluYWxseXthLnV3PQohMX19LGptPWZ1bmN0aW9uKGEsYil7YS54ai5wdXNoKGIpO2lmKGIuemIpdGhyb3cgRXJyb3IoIlRoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgVmlld0NvbnRhaW5lciEiKTtiLlRlPWF9O2ZtLnByb3RvdHlwZS5RTD1mdW5jdGlvbihhKXtqbSh0aGlzLGEuZGkpO2ltKHRoaXMpO3RoaXMuSngucHVzaChhKTt0aGlzLlVjLmdldChPZSxbXSkuY29uY2F0KHRoaXMudUopLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGIoYSl9KX07Zm0ucHJvdG90eXBlLllOPWZ1bmN0aW9uKGEpe3ZhciBiPWEuZGk7WmcodGhpcy54aixiKTskZyhiKTtaZyh0aGlzLkp4LGEpfTtmbS5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMueGouc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlc3Ryb3koKX0pfTtmdW5jdGlvbiBaZyhhLGIpe2I9YS5pbmRleE9mKGIpOy0xPGImJmEuc3BsaWNlKGIsMSl9O3ZhciBrbT1mdW5jdGlvbigpe307ZnVuY3Rpb24gbG0oKXtyZXR1cm4gdGhpcy5FY1thZigpXSgpfXZhciBtbT1mdW5jdGlvbigpe3RoaXMuVGY9ITA7dGhpcy5FYz1bXTt0aGlzLlpiPW5ldyByazt0aGlzLmxlbmd0aD0wO3ZhciBhPWFmKCksYj1tbS5wcm90b3R5cGU7YlthXXx8KGJbYV09bG0pfTtoPW1tLnByb3RvdHlwZTtoLm1hcD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5FYy5tYXAoYSl9O2guZmlsdGVyPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkVjLmZpbHRlcihhKX07aC5maW5kPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkVjLmZpbmQoYSl9O2gucmVkdWNlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRWMucmVkdWNlKGEsYil9O2guZm9yRWFjaD1mdW5jdGlvbihhKXt0aGlzLkVjLmZvckVhY2goYSl9O2guc29tZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5FYy5zb21lKGEpfTtoLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWMudG9TdHJpbmcoKX07CmgucmVzZXQ9ZnVuY3Rpb24oYSl7dGhpcy5FYz1rZShhKTt0aGlzLlRmPSExO3RoaXMubGVuZ3RoPXRoaXMuRWMubGVuZ3RoO3RoaXMuZmlyc3Q9dGhpcy5FY1swXX07dmFyIG5tPWZ1bmN0aW9uKGEpe2EuWmIuZW1pdChhKX07bW0ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLlpiLmNvbXBsZXRlKCk7dGhpcy5aYi51bnN1YnNjcmliZSgpfTt2YXIgb209ZnVuY3Rpb24oKXt9LHBtPXtDUDoiIixEUDoiLm5nZmFjdG9yeSJ9LHFtPWZ1bmN0aW9uKGEsYil7dGhpcy5KQT1hO3RoaXMuVz1ifHxwbX07cW0ucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSkEgaW5zdGFuY2VvZiB5aD9ybSh0aGlzLGEpOnNtKHRoaXMsYSl9Owp2YXIgc209ZnVuY3Rpb24oYSxiKXtiPW4oYi5zcGxpdCgiIyIpKTt2YXIgYz1iLm5leHQoKS52YWx1ZSxkPWIubmV4dCgpLnZhbHVlO3ZvaWQgMD09PWQmJihkPSJkZWZhdWx0Iik7cmV0dXJuIFN5c3RlbS5pbXBvcnQoYykudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZVtkXX0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHRtKGUsYyxkKX0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGEuSkEuY0YoZSl9KX0scm09ZnVuY3Rpb24oYSxiKXtiPW4oYi5zcGxpdCgiIyIpKTt2YXIgYz1iLm5leHQoKS52YWx1ZSxkPWIubmV4dCgpLnZhbHVlLGU9Ik5nRmFjdG9yeSI7dm9pZCAwPT09ZCYmKGQ9ImRlZmF1bHQiLGU9IiIpO3JldHVybiBTeXN0ZW0uaW1wb3J0KGEuVy5DUCtjK2EuVy5EUCkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gZltkK2VdfSkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gdG0oZixjLGQpfSl9OwpmdW5jdGlvbiB0bShhLGIsYyl7aWYoIWEpdGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kICciK2MrIicgaW4gJyIrYisiJyIpO3JldHVybiBhfTtmdW5jdGlvbiB1bSgpe3JldHVybiBCZn1mdW5jdGlvbiB2bSgpe3JldHVybiBDZn1mdW5jdGlvbiB3bShhKXtyZXR1cm4gYXx8ImVuLVVTIn1uZXcgZGQ7bmV3IGNkKFFlKTtuZXcgZGQ7bmV3IGZkO2Z1bmN0aW9uIHhtKGEpe3ZhciBiPVtdO2EucmYuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7Zm9yKDtiLmxlbmd0aDspYi5wb3AoKSgpfSk7cmV0dXJuIGZ1bmN0aW9uKGMpe2IucHVzaChjKX19dmFyIHltPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBWKGEsYixjLGQsZSxmKXthfD0xO3ZhciBnPW9nKGIpO2I9Zy5wZjt2YXIgbD1nLmdkO2c9Zy5JZTtmPWY/c2coZik6bnVsbDtyZXR1cm57UjotMSxwYXJlbnQ6bnVsbCxkZzpudWxsLFlkOi0xLFpnOi0xLGZsYWdzOmEsTGw6LTEsTmI6MCxNZzowLCRjOjAscGY6YixJZTpnLGdkOmwsVGo6Yyx3YTpkLGViOltdLEVnOjAsb3V0cHV0czpbXSxlbGVtZW50OntXajpudWxsLG5hbWU6bnVsbCxScjpudWxsLFFiOmYsWG46bnVsbCwkZDpudWxsLE1sOm51bGwsY2c6bnVsbCxHbDpudWxsLGhhbmRsZUV2ZW50OmV8fFpmfSxOYzpudWxsLHRleHQ6bnVsbCxxdWVyeTpudWxsLHNpOm51bGx9fQpmdW5jdGlvbiBXKGEsYixjLGQsZSxmLGcsbCxtLHAscSxyKXtnPXZvaWQgMD09PWc/W106ZztwfHwocD1aZik7dmFyIHY9b2coYyk7Yz12LnBmO3ZhciB3PXYuZ2Q7dj12LkllO3ZhciB4PW51bGwsdT1udWxsO2YmJih1PW4oemcoZikpLHg9dS5uZXh0KCkudmFsdWUsdT11Lm5leHQoKS52YWx1ZSk7bD1sfHxbXTtmPVtdO2Zvcih2YXIgRD0wO0Q8bC5sZW5ndGg7RCsrKXt2YXIgSD1uKGxbRF0pLEU9SC5uZXh0KCkudmFsdWUsTj1ILm5leHQoKS52YWx1ZTtIPUgubmV4dCgpLnZhbHVlO3ZhciBNPW4oemcoTikpO049TS5uZXh0KCkudmFsdWU7TT1NLm5leHQoKS52YWx1ZTt2YXIgSj12b2lkIDAsUT12b2lkIDA7c3dpdGNoKEUmMTUpe2Nhc2UgNDpRPUg7YnJlYWs7Y2FzZSAxOmNhc2UgODpKPUh9ZltEXT17ZmxhZ3M6RSxXajpOLG5hbWU6TSxSbzpNLG1wOkosc3VmZml4OlF9fW09bXx8W107bD1bXTtmb3IoRD0wO0Q8bS5sZW5ndGg7RCsrKUg9bihtW0RdKSxFPUgubmV4dCgpLnZhbHVlLApIPUgubmV4dCgpLnZhbHVlLGxbRF09e3R5cGU6MCx0YXJnZXQ6RSxCZTpILGprOm51bGx9O2c9Z3x8W107Zz1nLm1hcChmdW5jdGlvbihVKXtVPW4oVSk7dmFyIHJhPVUubmV4dCgpLnZhbHVlO1U9VS5uZXh0KCkudmFsdWU7dmFyIEVhPW4oemcocmEpKTtyYT1FYS5uZXh0KCkudmFsdWU7RWE9RWEubmV4dCgpLnZhbHVlO3JldHVybltyYSxFYSxVXX0pO3I9ZWcocik7cSYmKGJ8PTMzNTU0NDMyKTtyZXR1cm57UjotMSxwYXJlbnQ6bnVsbCxkZzpudWxsLFlkOi0xLFpnOi0xLExsOmEsZmxhZ3M6YnwxLE5iOjAsTWc6MCwkYzowLHBmOmMsSWU6dixnZDp3LFRqOmQsd2E6ZSxlYjpmLEVnOkFnKGYpLG91dHB1dHM6bCxlbGVtZW50OntXajp4LG5hbWU6dSxScjpnLFFiOm51bGwsWG46bnVsbCwkZDpxfHxudWxsLE1sOnIsY2c6bnVsbCxHbDpudWxsLGhhbmRsZUV2ZW50OnB8fFpmfSxOYzpudWxsLHRleHQ6bnVsbCxxdWVyeTpudWxsLHNpOm51bGx9fQpmdW5jdGlvbiB6bShhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBqZyhhLGIsYyxkKX19CmZ1bmN0aW9uIEFtKGEsYixjLGQpe2lmKCFnZyhhLGIsYyxkKSlyZXR1cm4hMTt2YXIgZT1iLmViW2NdLGY9YS5qW2IuUl07Yz1mLmhkO3ZhciBnPWUubmFtZTtzd2l0Y2goZS5mbGFncyYxNSl7Y2FzZSAxOmI9ZS5XajtlPShlPWUubXApP2Eucm9vdC5xei5HaShlLGQpOmQ7ZT1udWxsIT1lP2UudG9TdHJpbmcoKTpudWxsO2E9YS5oYjtudWxsIT1kP2Euc2V0QXR0cmlidXRlKGMsZyxlLGIpOmEucmVtb3ZlQXR0cmlidXRlKGMsZyxiKTticmVhaztjYXNlIDI6YT1hLmhiO2Q/YS5GbChjLGcpOmEubW0oYyxnKTticmVhaztjYXNlIDQ6ZD1hLnJvb3QucXouR2koMixkKTtudWxsIT1kPyhkPWQudG9TdHJpbmcoKSxlPWUuc3VmZml4LG51bGwhPWUmJihkKz1lKSk6ZD1udWxsO2E9YS5oYjtudWxsIT1kP2EudG0oYyxnLGQpOmEubm0oYyxnKTticmVhaztjYXNlIDg6YT1iLmZsYWdzJjMzNTU0NDMyJiZlLmZsYWdzJjMyP2YuJGQ6YSxkPShlPWUubXApP2Eucm9vdC5xei5HaShlLGQpOmQsYS5oYi5zZXRQcm9wZXJ0eShjLApnLGQpfXJldHVybiEwfTt2YXIgQm09ZnVuY3Rpb24oYSxiKXt0aGlzLm5hbWU9YTt0aGlzLlpkPWJ9LEVtPWZ1bmN0aW9uKGEsYixjKXt0aGlzLkJ5PVtdO3RoaXMucGFyZW50PW51bGw7dGhpcy5wcT1jO3RoaXMuRkc9YTtiJiZiIGluc3RhbmNlb2YgQ20mJkRtKGIsdGhpcyl9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRW0ucHJvdG90eXBlLHtaOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcS5afX0sZEY6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBxLmF9fSxjb250ZXh0Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcS5jb250ZXh0fX0sZ2Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBxLmdkfX19KTsKdmFyIENtPWZ1bmN0aW9uKGEsYixjKXtFbS5jYWxsKHRoaXMsYSxiLGMpO3RoaXMucHJvcGVydGllcz17fTt0aGlzLmF0dHJpYnV0ZXM9e307dGhpcy4kRT17fTt0aGlzLmc9e307dGhpcy5jaGlsZE5vZGVzPVtdO3RoaXMuaT1hfTt0KENtLEVtKTt2YXIgRG09ZnVuY3Rpb24oYSxiKXtiJiYoYS5jaGlsZE5vZGVzLnB1c2goYiksYi5wYXJlbnQ9YSl9O0NtLnByb3RvdHlwZS5yZW1vdmVDaGlsZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNoaWxkTm9kZXMuaW5kZXhPZihhKTstMSE9PWImJihhLnBhcmVudD1udWxsLHRoaXMuY2hpbGROb2Rlcy5zcGxpY2UoYiwxKSl9O0NtLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYSxiKXthPXRoaXMuY2hpbGROb2Rlcy5pbmRleE9mKGEpOy0xPT09YT9EbSh0aGlzLGIpOihiLnBhcmVudCYmYi5wYXJlbnQucmVtb3ZlQ2hpbGQoYiksYi5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkTm9kZXMuc3BsaWNlKGEsMCxiKSl9OwpDbS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oYSl7dmFyIGI9W107Rm0odGhpcyxhLGIpO3JldHVybiBiWzBdfHxudWxsfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENtLnByb3RvdHlwZSx7Y2hpbGRyZW46e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQ219KX19fSk7ZnVuY3Rpb24gRm0oYSxiLGMpe2EuY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QgaW5zdGFuY2VvZiBDbSYmKGIoZCkmJmMucHVzaChkKSxGbShkLGIsYykpfSl9dmFyIEdtPW5ldyBNYXA7ZnVuY3Rpb24gSG0oYSl7cmV0dXJuIEdtLmdldChhKXx8bnVsbH1mdW5jdGlvbiBJbShhKXtHbS5zZXQoYS5GRyxhKX07ZnVuY3Rpb24gWChhLGIsYyl7dmFyIGQ9W10sZTtmb3IoZSBpbiBjKWQucHVzaCh7ams6ZSxRTzpjW2VdfSk7cmV0dXJue1I6LTEscGFyZW50Om51bGwsZGc6bnVsbCxZZDotMSxaZzotMSxMbDotMSxmbGFnczphLE5iOjAsTWc6MCwkYzowLFRqOi0xLHBmOnt9LEllOjAsZ2Q6e30sd2E6MCxlYjpbXSxFZzowLG91dHB1dHM6W10sZWxlbWVudDpudWxsLE5jOm51bGwsdGV4dDpudWxsLHF1ZXJ5OntpZDpiLCRoOjE8PGIlMzIsZWI6ZH0sc2k6bnVsbH19CmZ1bmN0aW9uIEptKGEpe2Zvcih2YXIgYj1hLmJhLlZzO2EucGFyZW50JiZhLnBhcmVudCYmIShhLmJrLmZsYWdzJjMyNzY4KTspe3ZhciBjPWEuYms7YT1hLnBhcmVudDtmb3IodmFyIGQ9Yy5SK2Mud2EsZT0wO2U8PWQ7ZSsrKXt2YXIgZj1hLmJhLmpbZV07Zi5mbGFncyY2NzEwODg2NCYmZi5mbGFncyY1MzY4NzA5MTImJihmLnF1ZXJ5LiRoJmIpPT09Zi5xdWVyeS4kaCYmKGEualtlXS5UZj0hMCk7IShmLmZsYWdzJjEmJmUrZi53YTxjLlIpJiZmLk5iJjY3MTA4ODY0JiZmLk5iJjUzNjg3MDkxMnx8KGUrPWYud2EpfX1pZihhLmJhLldnJjEzNDIxNzcyOClmb3IoYj0wO2I8YS5iYS5qLmxlbmd0aDtiKyspYz1hLmJhLmpbYl0sYy5mbGFncyYxMzQyMTc3MjgmJmMuZmxhZ3MmNTM2ODcwOTEyJiYoYS5qW2JdLlRmPSEwKSxiKz1jLndhfQpmdW5jdGlvbiBLbShhLGIsYyxkLGUpe2Zvcig7Yjw9YztiKyspe3ZhciBmPWEuYmEualtiXSxnPWYucGZbZC5pZF07bnVsbCE9ZyYmZS5wdXNoKExtKGEsZixnKSk7aWYoZi5mbGFncyYxJiZmLmVsZW1lbnQuUWImJihmLmVsZW1lbnQuUWIuVnMmZC4kaCk9PT1kLiRoKXtnPWEualtiXTsoZi4kYyZkLiRoKT09PWQuJGgmJihLbShhLGIrMSxiK2Yud2EsZCxlKSxiKz1mLndhKTtpZihmLmZsYWdzJjE2Nzc3MjE2KWZvcih2YXIgbD1nLmpoLlZlLG09MDttPGwubGVuZ3RoO20rKyl7dmFyIHA9bFttXSxxPWtnKHApO3EmJnE9PT1nJiZLbShwLDAscC5iYS5qLmxlbmd0aC0xLGQsZSl9aWYoZz1nLlFiLmxyKWZvcihsPTA7bDxnLmxlbmd0aDtsKyspbT1nW2xdLEttKG0sMCxtLmJhLmoubGVuZ3RoLTEsZCxlKX0oZi4kYyZkLiRoKSE9PWQuJGgmJihiKz1mLndhKX1yZXR1cm4gZX0KZnVuY3Rpb24gTG0oYSxiLGMpe2lmKG51bGwhPWMpc3dpdGNoKGMpe2Nhc2UgMTpyZXR1cm4gYS5qW2IuUl0uaGQ7Y2FzZSAwOnJldHVybiBuZXcgeihhLmpbYi5SXS5oZCk7Y2FzZSAyOnJldHVybiBhLmpbYi5SXS5RYjtjYXNlIDM6cmV0dXJuIGEualtiLlJdLmpoO2Nhc2UgNDpyZXR1cm4gYS5qW2IuUl0uaW5zdGFuY2V9fTtmdW5jdGlvbiBNbShhLGIpe3JldHVybntSOi0xLHBhcmVudDpudWxsLGRnOm51bGwsWWQ6LTEsWmc6LTEsTGw6LTEsZmxhZ3M6OCxOYjowLE1nOjAsJGM6MCxwZjp7fSxJZTowLGdkOnt9LFRqOmEsd2E6MCxlYjpbXSxFZzowLG91dHB1dHM6W10sZWxlbWVudDpudWxsLE5jOm51bGwsdGV4dDpudWxsLHF1ZXJ5Om51bGwsc2k6e2luZGV4OmJ9fX07ZnVuY3Rpb24gTm0oYSxiKXtiPU9iamVjdC5rZXlzKGIpO2Zvcih2YXIgYz1iLmxlbmd0aCxkPVtdLGU9MDtlPGM7ZSsrKWQucHVzaChiW2VdKTtyZXR1cm4gT20oNjQsYSxkKX1mdW5jdGlvbiBPbShhLGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtkLnB1c2goe2ZsYWdzOjgsbmFtZTpmLFdqOm51bGwsUm86ZixtcDpudWxsLHN1ZmZpeDpudWxsfSl9cmV0dXJue1I6LTEscGFyZW50Om51bGwsZGc6bnVsbCxZZDotMSxaZzotMSxMbDpiLGZsYWdzOmEsTmI6MCxNZzowLCRjOjAscGY6e30sSWU6MCxnZDp7fSxUajotMSx3YTowLGViOmQsRWc6QWcoZCksb3V0cHV0czpbXSxlbGVtZW50Om51bGwsTmM6bnVsbCx0ZXh0Om51bGwscXVlcnk6bnVsbCxzaTpudWxsfX07ZnVuY3Rpb24gWShhLGIsYyl7Zm9yKHZhciBkPVtdLGU9MTtlPGMubGVuZ3RoO2UrKylkW2UtMV09e2ZsYWdzOjgsbmFtZTpudWxsLFdqOm51bGwsUm86bnVsbCxtcDpudWxsLHN1ZmZpeDpjW2VdfTtyZXR1cm57UjotMSxwYXJlbnQ6bnVsbCxkZzpudWxsLFlkOi0xLFpnOi0xLExsOmEsZmxhZ3M6MixOYjowLE1nOjAsJGM6MCxwZjp7fSxJZTowLGdkOnt9LFRqOmIsd2E6MCxlYjpkLEVnOjgsb3V0cHV0czpbXSxlbGVtZW50Om51bGwsTmM6bnVsbCx0ZXh0OntwcmVmaXg6Y1swXX0scXVlcnk6bnVsbCxzaTpudWxsfX1mdW5jdGlvbiBQbShhLGIpe3JldHVybihudWxsIT1hP2EudG9TdHJpbmcoKToiIikrYi5zdWZmaXh9O3ZhciBSbT17RlI6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj0wLGc9MCxsPTAsbT0wLHA9bnVsbCxxPW51bGwscj0hMSx2PSExLHc9bnVsbCx4PTA7eDxiLmxlbmd0aDt4Kyspe3ZhciB1PWJbeF07dS5SPXg7dS5wYXJlbnQ9cDt1LllkPWU7dS5aZz1mO3UuZGc9cTtnfD11LmZsYWdzO218PXUuSWU7dS5lbGVtZW50JiYocj11LmVsZW1lbnQsci5jZz1wP3AuZWxlbWVudC5jZzpPYmplY3QuY3JlYXRlKG51bGwpLHIuR2w9ci5jZyx2PXI9ITEsdS5lbGVtZW50LlFiJiYobXw9dS5lbGVtZW50LlFiLlZzKSk7UW0ocCx1LGIubGVuZ3RoKTtlKz11LmViLmxlbmd0aDtmKz11Lm91dHB1dHMubGVuZ3RoOyFxJiZ1LmZsYWdzJjMmJih3PXUpO2lmKHUuZmxhZ3MmMjAyMjQpe3J8fChyPSEwLHAuZWxlbWVudC5jZz1PYmplY3QuY3JlYXRlKHAuZWxlbWVudC5jZykscC5lbGVtZW50LkdsPXAuZWxlbWVudC5jZyk7dmFyIEQ9MCE9PSh1LmZsYWdzJjMyNzY4KTswPT09KHUuZmxhZ3MmODE5Mil8fApEP3AuZWxlbWVudC5jZ1thZyh1Lk5jLkwpXT11Oih2fHwodj0hMCxwLmVsZW1lbnQuR2w9T2JqZWN0LmNyZWF0ZShwLmVsZW1lbnQuY2cpKSxwLmVsZW1lbnQuR2xbYWcodS5OYy5MKV09dSk7RCYmKHAuZWxlbWVudC5Ybj11KX1wPyhwLk5ifD11LmZsYWdzLHAuTWd8PXUuZmxhZ3MscC4kY3w9dS5JZSx1LmVsZW1lbnQmJnUuZWxlbWVudC5RYiYmKHAuJGN8PXUuZWxlbWVudC5RYi5WcykpOmx8PXUuZmxhZ3M7aWYoMDx1LndhKXA9dSwwIT09KHUuZmxhZ3MmMSkmJm51bGw9PT11LmVsZW1lbnQubmFtZXx8KHE9dSk7ZWxzZSBmb3IoO3AmJng9PT1wLlIrcC53YTspe2lmKHE9cC5wYXJlbnQpcS5OYnw9cC5OYixxLiRjfD1wLiRjO3E9KHA9cSkmJjAhPT0ocC5mbGFncyYxKSYmbnVsbD09PXAuZWxlbWVudC5uYW1lP3AuZGc6cH19cmV0dXJue1Y6bnVsbCxXZzpnLFJTOmwsVnM6bSxmbGFnczphLGo6YixDcDpjfHxaZixEcDpkfHxaZixoYW5kbGVFdmVudDpmdW5jdGlvbihILEUsTixNKXtyZXR1cm4gYltFXS5lbGVtZW50LmhhbmRsZUV2ZW50KEgsCk4sTSl9LFBPOmUsV0c6ZixHbzp3fX19OwpmdW5jdGlvbiBRbShhLGIsYyl7dmFyIGQ9Yi5lbGVtZW50JiZiLmVsZW1lbnQuUWI7aWYoZCl7aWYoIWQuR28pdGhyb3cgRXJyb3IoIklsbGVnYWwgU3RhdGU6IEVtYmVkZGVkIHRlbXBsYXRlcyB3aXRob3V0IG5vZGVzIGFyZSBub3QgYWxsb3dlZCEiKTtpZihkLkdvJiZkLkdvLmZsYWdzJjE2Nzc3MjE2KXRocm93IEVycm9yKCJJbGxlZ2FsIFN0YXRlOiBMYXN0IHJvb3Qgbm9kZSBvZiBhIHRlbXBsYXRlIGNhbid0IGhhdmUgZW1iZWRkZWQgdmlld3MsIGF0IGluZGV4ICIrYi5SKyIhIik7fWlmKGIuZmxhZ3MmMjAyMjQmJjA9PT0oKGE/YS5mbGFnczowKSYxKSl0aHJvdyBFcnJvcigiSWxsZWdhbCBTdGF0ZTogU3RhdGljUHJvdmlkZXIvRGlyZWN0aXZlIG5vZGVzIG5lZWQgdG8gYmUgY2hpbGRyZW4gb2YgZWxlbWVudHMgb3IgYW5jaG9ycywgYXQgaW5kZXggIitiLlIrIiEiKTtpZihiLnF1ZXJ5KXtpZihiLmZsYWdzJjY3MTA4ODY0JiYoIWF8fDA9PT0oYS5mbGFncyYxNjM4NCkpKXRocm93IEVycm9yKCJJbGxlZ2FsIFN0YXRlOiBDb250ZW50IFF1ZXJ5IG5vZGVzIG5lZWQgdG8gYmUgY2hpbGRyZW4gb2YgZGlyZWN0aXZlcywgYXQgaW5kZXggIisKYi5SKyIhIik7aWYoYi5mbGFncyYxMzQyMTc3MjgmJmEpdGhyb3cgRXJyb3IoIklsbGVnYWwgU3RhdGU6IFZpZXcgUXVlcnkgbm9kZXMgaGF2ZSB0byBiZSB0b3AgbGV2ZWwgbm9kZXMsIGF0IGluZGV4ICIrYi5SKyIhIik7fWlmKGIud2EmJihhPWE/YS5SK2Eud2E6Yy0xLGIuUjw9YSYmYi5SK2Iud2E+YSkpdGhyb3cgRXJyb3IoIklsbGVnYWwgU3RhdGU6IGNoaWxkQ291bnQgb2Ygbm9kZSBsZWFkcyBvdXRzaWRlIG9mIHBhcmVudCwgYXQgaW5kZXggIitiLlIrIiEiKTt9Um0uSWM9ZnVuY3Rpb24oYSxiLGMsZCl7Yj1TbShhLnJvb3QsYS5oYixhLGIsYyk7Yi5hPWEuYTtiLmNvbnRleHQ9ZDtUbShiKTtyZXR1cm4gYn07Um0uYW89ZnVuY3Rpb24oYSxiLGMpe2E9U20oYSxhLmhiLG51bGwsbnVsbCxiKTthLmE9YzthLmNvbnRleHQ9YztUbShhKTtyZXR1cm4gYX07ClJtLlpuPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWIuZWxlbWVudC5NbDtkPWU/YS5yb290LnZILkVqKGQsZSk6YS5yb290LmhiO3JldHVybiBTbShhLnJvb3QsZCxhLGIuZWxlbWVudC5YbixjKX07ZnVuY3Rpb24gU20oYSxiLGMsZCxlKXtyZXR1cm57YmE6ZSxwYXJlbnQ6YyxNdDpudWxsLGJrOmQsY29udGV4dDpudWxsLGE6bnVsbCxqOkFycmF5KGUuai5sZW5ndGgpLHN0YXRlOjEzLHJvb3Q6YSxoYjpiLFhqOkFycmF5KGUuUE8pLFhoOmUuV0c/QXJyYXkoZS5XRyk6bnVsbCxxeTotMX19CmZ1bmN0aW9uIFRtKGEpe2lmKG5nKGEpKXZhciBiPWEucGFyZW50LmpbYS5iay5wYXJlbnQuUl0uaGQ7Zm9yKHZhciBjPWEuYmEsZD1hLmosZT0wO2U8Yy5qLmxlbmd0aDtlKyspe3ZhciBmPWMualtlXTtMZihhLGUpO3ZhciBnPXZvaWQgMDtzd2l0Y2goZi5mbGFncyYyMDEzNDcwNjcpe2Nhc2UgMTp2YXIgbD1hLG09YjtnPWYuZWxlbWVudDt2YXIgcD1sLnJvb3QuaFI7dmFyIHE9bC5oYjtsLnBhcmVudHx8IXA/KHA9Zy5uYW1lP3EuY3JlYXRlRWxlbWVudChnLm5hbWUsZy5Xaik6cS5jcmVhdGVDb21tZW50KCIiKSwobD1xZyhsLG0sZikpJiZxLmFwcGVuZENoaWxkKGwscCkpOnA9cS5ucChwLCEhZy5NbCYmMz09PWcuTWwuVCk7aWYoZy5Scilmb3IobD0wO2w8Zy5Sci5sZW5ndGg7bCsrKXt2YXIgcj1uKGcuUnJbbF0pO209ci5uZXh0KCkudmFsdWU7dmFyIHY9ci5uZXh0KCkudmFsdWU7cj1yLm5leHQoKS52YWx1ZTtxLnNldEF0dHJpYnV0ZShwLHYscixtKX1nPXA7cT12b2lkIDA7Zi5mbGFncyYKMzM1NTQ0MzImJihxPXNnKGYuZWxlbWVudC4kZCkscT1PZihhLGYscSxnKSk7cD1hO2w9cTtmb3IobT0wO208Zi5vdXRwdXRzLmxlbmd0aDttKyspe3Y9Zi5vdXRwdXRzW21dO3I9di50YXJnZXQ7dmFyIHc9di5CZTtyPXptKHAsZi5SLHI/cisiOiIrdzp3KTt3PXYudGFyZ2V0O3ZhciB4PXA7ImNvbXBvbmVudCI9PT12LnRhcmdldCYmKHc9bnVsbCx4PWwpO3Y9eC5oYi5mYyh3fHxnLHYuQmUscik7cC5YaFtmLlpnK21dPXZ9Zz17aGQ6ZywkZDpxLGpoOm51bGwsUWI6Zi5lbGVtZW50LlFiP25ldyBhaChhLGYpOnZvaWQgMH07Zi5mbGFncyYxNjc3NzIxNiYmKGcuamg9bmV3IFZnKGEsZixnKSk7YnJlYWs7Y2FzZSAyOnA9YTtsPWI7cT1wLmhiO2c9cS5ibyhmLnRleHQucHJlZml4KTsoZj1xZyhwLGwsZikpJiZxLmFwcGVuZENoaWxkKGYsZyk7Zz17Z3A6Z307YnJlYWs7Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDI1NjooZz1kW2VdKXx8Zi5mbGFncyY0MDk2fHwoZz17aW5zdGFuY2U6b2goYSwKZil9KTticmVhaztjYXNlIDE2OmZvcihnPWE7Zy5wYXJlbnQmJiFuZyhnKTspZz1nLnBhcmVudDtnPXtpbnN0YW5jZTpwaChnLnBhcmVudCxsZyhnKSwhMCxmLk5jLnZhbHVlLGYuTmMuS2EpfTticmVhaztjYXNlIDE2Mzg0Omc9ZFtlXTtpZighZyl7Zz1hO3E9cGgoZyxmLnBhcmVudCwwPChmLmZsYWdzJjMyNzY4KSxmLk5jLnZhbHVlLGYuTmMuS2EpO2lmKGYub3V0cHV0cy5sZW5ndGgpZm9yKHA9MDtwPGYub3V0cHV0cy5sZW5ndGg7cCsrKWlmKGw9Zi5vdXRwdXRzW3BdLG09cVtsLmprXSxGZShtKSlsPW0uc3Vic2NyaWJlKG5oKGcsZi5wYXJlbnQuUixsLkJlKSksZy5YaFtmLlpnK3BdPWwudW5zdWJzY3JpYmUuYmluZChsKTtlbHNlIHRocm93IEVycm9yKCJAT3V0cHV0ICIrbC5qaysiIG5vdCBpbml0aWFsaXplZCBpbiAnIitxLmNvbnN0cnVjdG9yLm5hbWUrIicuIik7Zz17aW5zdGFuY2U6cX19Zi5mbGFncyYzMjc2OCYmKGY9YS5qW2YucGFyZW50LlJdLiRkLHE9Zy5pbnN0YW5jZSwKZi5hPWcuaW5zdGFuY2UsZi5jb250ZXh0PXEpO2JyZWFrO2Nhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpnPXt2YWx1ZTp2b2lkIDB9O2JyZWFrO2Nhc2UgNjcxMDg4NjQ6Y2FzZSAxMzQyMTc3Mjg6Zz1uZXcgbW07YnJlYWs7Y2FzZSA4OihnPXFnKGEsYixmKSkmJndnKGEsZi5zaS5pbmRleCwxLGcsbnVsbCx2b2lkIDApLGc9dm9pZCAwfWRbZV09Z31VbShhLFZtKTtXbShhLDIwMTMyNjU5MiwyNjg0MzU0NTYpfWZ1bmN0aW9uIFhtKGEpe1ltKGEpO1dmKGEsMSk7Wm0oYSwkbSk7WGYoYSwxKTtVbShhLCRtKTthLnN0YXRlJj0tOTd9Um0uVW49WG07CmZ1bmN0aW9uIGFuKGEpe2Euc3RhdGUmMT8oYS5zdGF0ZSY9LTIsYS5zdGF0ZXw9Mik6YS5zdGF0ZSY9LTM7SmYoYSwwLDI1Nik7WW0oYSk7V2YoYSwwKTtabShhLGJuKTtXbShhLDY3MTA4ODY0LDUzNjg3MDkxMik7dmFyIGI9SmYoYSwyNTYsNTEyKTt1aChhLDIwOTcxNTJ8KGI/MTA0ODU3NjowKSk7WGYoYSwwKTtVbShhLGJuKTtXbShhLDEzNDIxNzcyOCw1MzY4NzA5MTIpO2I9SmYoYSw1MTIsNzY4KTt1aChhLDgzODg2MDh8KGI/NDE5NDMwNDowKSk7YS5iYS5mbGFncyYyJiYoYS5zdGF0ZSY9LTkpO2Euc3RhdGUmPS05NztKZihhLDc2OCwxMDI0KX1SbS5Ubj1hbjsKUm0uWUU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsLG0scCxxLHIsdil7aWYoMD09PWMpYTpzd2l0Y2goYi5mbGFncyYyMDEzNDcwNjcpe2Nhc2UgMTp2YXIgdz1iLmViLmxlbmd0aCx4PSExOzA8dyYmQW0oYSxiLDAsZCkmJih4PSEwKTsxPHcmJkFtKGEsYiwxLGUpJiYoeD0hMCk7Mjx3JiZBbShhLGIsMixmKSYmKHg9ITApOzM8dyYmQW0oYSxiLDMsZykmJih4PSEwKTs0PHcmJkFtKGEsYiw0LGwpJiYoeD0hMCk7NTx3JiZBbShhLGIsNSxtKSYmKHg9ITApOzY8dyYmQW0oYSxiLDYscCkmJih4PSEwKTs3PHcmJkFtKGEsYiw3LHEpJiYoeD0hMCk7ODx3JiZBbShhLGIsOCxyKSYmKHg9ITApOzk8dyYmQW0oYSxiLDksdikmJih4PSEwKTtkPXg7YnJlYWsgYTtjYXNlIDI6dz0hMTt4PWIuZWI7Yz14Lmxlbmd0aDswPGMmJmdnKGEsYiwwLGQpJiYodz0hMCk7MTxjJiZnZyhhLGIsMSxlKSYmKHc9ITApOzI8YyYmZ2coYSxiLDIsZikmJih3PSEwKTszPGMmJmdnKGEsYiwzLGcpJiYodz0hMCk7CjQ8YyYmZ2coYSxiLDQsbCkmJih3PSEwKTs1PGMmJmdnKGEsYiw1LG0pJiYodz0hMCk7NjxjJiZnZyhhLGIsNixwKSYmKHc9ITApOzc8YyYmZ2coYSxiLDcscSkmJih3PSEwKTs4PGMmJmdnKGEsYiw4LHIpJiYodz0hMCk7OTxjJiZnZyhhLGIsOSx2KSYmKHc9ITApO2lmKHcpe3ZhciB1PWIudGV4dC5wcmVmaXg7MDxjJiYodSs9UG0oZCx4WzBdKSk7MTxjJiYodSs9UG0oZSx4WzFdKSk7MjxjJiYodSs9UG0oZix4WzJdKSk7MzxjJiYodSs9UG0oZyx4WzNdKSk7NDxjJiYodSs9UG0obCx4WzRdKSk7NTxjJiYodSs9UG0obSx4WzVdKSk7NjxjJiYodSs9UG0ocCx4WzZdKSk7NzxjJiYodSs9UG0ocSx4WzddKSk7ODxjJiYodSs9UG0ocix4WzhdKSk7OTxjJiYodSs9UG0odix4WzldKSk7YS5oYi5zZXRWYWx1ZShhLmpbYi5SXS5ncCx1KX1kPXc7YnJlYWsgYTtjYXNlIDE2Mzg0Onc9YS5qW2IuUl07eD13Lmluc3RhbmNlO2M9ITE7dT12b2lkIDA7dmFyIEQ9Yi5lYi5sZW5ndGg7MDxEJiZmZyhhLApiLDAsZCkmJihjPSEwLHU9dGgoYSx3LGIsMCxkLHUpKTsxPEQmJmZnKGEsYiwxLGUpJiYoYz0hMCx1PXRoKGEsdyxiLDEsZSx1KSk7MjxEJiZmZyhhLGIsMixmKSYmKGM9ITAsdT10aChhLHcsYiwyLGYsdSkpOzM8RCYmZmcoYSxiLDMsZykmJihjPSEwLHU9dGgoYSx3LGIsMyxnLHUpKTs0PEQmJmZnKGEsYiw0LGwpJiYoYz0hMCx1PXRoKGEsdyxiLDQsbCx1KSk7NTxEJiZmZyhhLGIsNSxtKSYmKGM9ITAsdT10aChhLHcsYiw1LG0sdSkpOzY8RCYmZmcoYSxiLDYscCkmJihjPSEwLHU9dGgoYSx3LGIsNixwLHUpKTs3PEQmJmZnKGEsYiw3LHEpJiYoYz0hMCx1PXRoKGEsdyxiLDcscSx1KSk7ODxEJiZmZyhhLGIsOCxyKSYmKGM9ITAsdT10aChhLHcsYiw4LHIsdSkpOzk8RCYmZmcoYSxiLDksdikmJihjPSEwLHU9dGgoYSx3LGIsOSx2LHUpKTt1JiZ4LlNhKHUpO2IuZmxhZ3MmNjU1MzYmJktmKGEsMjU2LGIuUikmJnguT2IoKTtiLmZsYWdzJjI2MjE0NCYmeC50aSgpO2Q9YzticmVhayBhOwpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6dz1iLmViO2M9ITE7dT13Lmxlbmd0aDswPHUmJmdnKGEsYiwwLGQpJiYoYz0hMCk7MTx1JiZnZyhhLGIsMSxlKSYmKGM9ITApOzI8dSYmZ2coYSxiLDIsZikmJihjPSEwKTszPHUmJmdnKGEsYiwzLGcpJiYoYz0hMCk7NDx1JiZnZyhhLGIsNCxsKSYmKGM9ITApOzU8dSYmZ2coYSxiLDUsbSkmJihjPSEwKTs2PHUmJmdnKGEsYiw2LHApJiYoYz0hMCk7Nzx1JiZnZyhhLGIsNyxxKSYmKGM9ITApOzg8dSYmZ2coYSxiLDgscikmJihjPSEwKTs5PHUmJmdnKGEsYiw5LHYpJiYoYz0hMCk7aWYoYyl7YT1hLmpbYi5SXTtzd2l0Y2goYi5mbGFncyYyMDEzNDcwNjcpe2Nhc2UgMzI6eD1bXTswPHUmJngucHVzaChkKTsxPHUmJngucHVzaChlKTsyPHUmJngucHVzaChmKTszPHUmJngucHVzaChnKTs0PHUmJngucHVzaChsKTs1PHUmJngucHVzaChtKTs2PHUmJngucHVzaChwKTs3PHUmJngucHVzaChxKTs4PHUmJngucHVzaChyKTs5PHUmJngucHVzaCh2KTsKYnJlYWs7Y2FzZSA2NDp4PXt9OzA8dSYmKHhbd1swXS5uYW1lXT1kKTsxPHUmJih4W3dbMV0ubmFtZV09ZSk7Mjx1JiYoeFt3WzJdLm5hbWVdPWYpOzM8dSYmKHhbd1szXS5uYW1lXT1nKTs0PHUmJih4W3dbNF0ubmFtZV09bCk7NTx1JiYoeFt3WzVdLm5hbWVdPW0pOzY8dSYmKHhbd1s2XS5uYW1lXT1wKTs3PHUmJih4W3dbN10ubmFtZV09cSk7ODx1JiYoeFt3WzhdLm5hbWVdPXIpOzk8dSYmKHhbd1s5XS5uYW1lXT12KTticmVhaztjYXNlIDEyODpzd2l0Y2godSl7Y2FzZSAxOng9ZC50cmFuc2Zvcm0oZCk7YnJlYWs7Y2FzZSAyOng9ZC50cmFuc2Zvcm0oZSk7YnJlYWs7Y2FzZSAzOng9ZC50cmFuc2Zvcm0oZSxmKTticmVhaztjYXNlIDQ6eD1kLnRyYW5zZm9ybShlLGYsZyk7YnJlYWs7Y2FzZSA1Ong9ZC50cmFuc2Zvcm0oZSxmLGcsbCk7YnJlYWs7Y2FzZSA2Ong9ZC50cmFuc2Zvcm0oZSxmLGcsbCxtKTticmVhaztjYXNlIDc6eD1kLnRyYW5zZm9ybShlLGYsZyxsLG0scCk7YnJlYWs7CmNhc2UgODp4PWQudHJhbnNmb3JtKGUsZixnLGwsbSxwLHEpO2JyZWFrO2Nhc2UgOTp4PWQudHJhbnNmb3JtKGUsZixnLGwsbSxwLHEscik7YnJlYWs7Y2FzZSAxMDp4PWQudHJhbnNmb3JtKGUsZixnLGwsbSxwLHEscix2KX19YS52YWx1ZT14fWQ9YzticmVhayBhO2RlZmF1bHQ6dGhyb3cidW5yZWFjaGFibGUiO31lbHNlIGE6c3dpdGNoKGIuZmxhZ3MmMjAxMzQ3MDY3KXtjYXNlIDE6ZT0hMTtmb3IoZj0wO2Y8ZC5sZW5ndGg7ZisrKUFtKGEsYixmLGRbZl0pJiYoZT0hMCk7ZD1lO2JyZWFrIGE7Y2FzZSAyOmU9Yi5lYjtmPSExO2ZvcihnPTA7ZzxkLmxlbmd0aDtnKyspZ2coYSxiLGcsZFtnXSkmJihmPSEwKTtpZihmKXtnPSIiO2ZvcihsPTA7bDxkLmxlbmd0aDtsKyspZys9UG0oZFtsXSxlW2xdKTtnPWIudGV4dC5wcmVmaXgrZzthLmhiLnNldFZhbHVlKGEualtiLlJdLmdwLGcpfWQ9ZjticmVhayBhO2Nhc2UgMTYzODQ6ZT1hLmpbYi5SXTtmPWUuaW5zdGFuY2U7Zz0hMTtsPXZvaWQgMDsKZm9yKG09MDttPGQubGVuZ3RoO20rKylmZyhhLGIsbSxkW21dKSYmKGc9ITAsbD10aChhLGUsYixtLGRbbV0sbCkpO2wmJmYuU2EobCk7Yi5mbGFncyY2NTUzNiYmS2YoYSwyNTYsYi5SKSYmZi5PYigpO2IuZmxhZ3MmMjYyMTQ0JiZmLnRpKCk7ZD1nO2JyZWFrIGE7Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmY9Yi5lYjtlPSExO2ZvcihnPTA7ZzxkLmxlbmd0aDtnKyspZ2coYSxiLGcsZFtnXSkmJihlPSEwKTtpZihlKXthPWEualtiLlJdO3N3aXRjaChiLmZsYWdzJjIwMTM0NzA2Nyl7Y2FzZSAzMjp3PWQ7YnJlYWs7Y2FzZSA2NDp3PXt9O2ZvcihiPTA7YjxkLmxlbmd0aDtiKyspd1tmW2JdLm5hbWVdPWRbYl07YnJlYWs7Y2FzZSAxMjg6Yj1kWzBdLGQ9ZC5zbGljZSgxKSx3PWIudHJhbnNmb3JtLmFwcGx5KGIsamEoZCkpfWEudmFsdWU9d31kPWU7YnJlYWsgYTtkZWZhdWx0OnRocm93InVucmVhY2hhYmxlIjt9cmV0dXJuIGR9OwpmdW5jdGlvbiBZbShhKXt2YXIgYj1hLmJhO2lmKGIuV2cmNClmb3IodmFyIGM9MDtjPGIuai5sZW5ndGg7YysrKXt2YXIgZD1iLmpbY107aWYoZC5mbGFncyY0KXtpZihkPWEualtjXS5RYi5scilmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtmLnN0YXRlfD0zMjtmb3IodmFyIGc9YTtmJiZmIT09ZzspZi5zdGF0ZXw9NjQsZj1mLk10fHxmLnBhcmVudH19ZWxzZSAwPT09KGQuTmImNCkmJihjKz1kLndhKX19ClJtLkh4PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCxtLHAscSxyLHYpe2lmKDA9PT1jKWM9Yi5lYi5sZW5ndGgsMDxjJiZoZyhhLGIsMCxkKSwxPGMmJmhnKGEsYiwxLGUpLDI8YyYmaGcoYSxiLDIsZiksMzxjJiZoZyhhLGIsMyxnKSw0PGMmJmhnKGEsYiw0LGwpLDU8YyYmaGcoYSxiLDUsbSksNjxjJiZoZyhhLGIsNixwKSw3PGMmJmhnKGEsYiw3LHEpLDg8YyYmaGcoYSxiLDgsciksOTxjJiZoZyhhLGIsOSx2KTtlbHNlIGZvcihlPTA7ZTxkLmxlbmd0aDtlKyspaGcoYSxiLGUsZFtlXSk7cmV0dXJuITF9OwpmdW5jdGlvbiBjbihhKXtpZighKGEuc3RhdGUmMTI4KSl7Wm0oYSxkbik7VW0oYSxkbik7dWgoYSwxMzEwNzIpO2lmKGEuWGgpZm9yKHZhciBiPTA7YjxhLlhoLmxlbmd0aDtiKyspYS5YaFtiXSgpO2Euc3RhdGUmMTYmJihiPWtnKGEpKSYmKGI9Yi5RYi5scikmJihsZShiLGIuaW5kZXhPZihhKSksWWYoYSkpO2lmKGEuaGIuVmgpe2I9YS5iYS5qLmxlbmd0aDtmb3IodmFyIGM9MDtjPGI7YysrKXt2YXIgZD1hLmJhLmpbY107ZC5mbGFncyYxP2EuaGIuVmgoYS5qW2NdLmhkKTpkLmZsYWdzJjI/YS5oYi5WaChhLmpbY10uZ3ApOihkLmZsYWdzJjY3MTA4ODY0fHxkLmZsYWdzJjEzNDIxNzcyOCkmJmEualtjXS5kZXN0cm95KCl9fW5nKGEpJiZhLmhiLmRlc3Ryb3koKTthLnN0YXRlfD0xMjh9fVJtLmlvPWNuO3ZhciBWbT0wLCRtPTEsZW49Mixibj0zLGZuPTQsZG49NTsKZnVuY3Rpb24gVW0oYSxiKXt2YXIgYz1hLmJhO2lmKGMuV2cmMzM1NTQ0MzIpZm9yKHZhciBkPTA7ZDxjLmoubGVuZ3RoO2QrKyl7dmFyIGU9Yy5qW2RdO2UuZmxhZ3MmMzM1NTQ0MzI/Z24oYS5qW2RdLiRkLGIpOjA9PT0oZS5OYiYzMzU1NDQzMikmJihkKz1lLndhKX19ZnVuY3Rpb24gWm0oYSxiKXt2YXIgYz1hLmJhO2lmKGMuV2cmMTY3NzcyMTYpZm9yKHZhciBkPTA7ZDxjLmoubGVuZ3RoO2QrKyl7dmFyIGU9Yy5qW2RdO2lmKGUuZmxhZ3MmMTY3NzcyMTYpe2U9YS5qW2RdLmpoLlZlO2Zvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKWduKGVbZl0sYil9ZWxzZSAwPT09KGUuTmImMTY3NzcyMTYpJiYoZCs9ZS53YSl9fQpmdW5jdGlvbiBnbihhLGIpe3ZhciBjPWEuc3RhdGU7c3dpdGNoKGIpe2Nhc2UgJG06MD09PShjJjEyOCkmJigxMj09PShjJjEyKT9YbShhKTpjJjY0JiZobihhLGVuKSk7YnJlYWs7Y2FzZSBlbjowPT09KGMmMTI4KSYmKGMmMzI/WG0oYSk6YyY2NCYmaG4oYSxiKSk7YnJlYWs7Y2FzZSBibjowPT09KGMmMTI4KSYmKDEyPT09KGMmMTIpP2FuKGEpOmMmNjQmJmhuKGEsZm4pKTticmVhaztjYXNlIGZuOjA9PT0oYyYxMjgpJiYoYyYzMj9hbihhKTpjJjY0JiZobihhLGIpKTticmVhaztjYXNlIGRuOmNuKGEpO2JyZWFrO2Nhc2UgVm06VG0oYSl9fWZ1bmN0aW9uIGhuKGEsYil7Wm0oYSxiKTtVbShhLGIpfQpmdW5jdGlvbiBXbShhLGIsYyl7aWYoYS5iYS5XZyZiJiZhLmJhLldnJmMpZm9yKHZhciBkPWEuYmEuai5sZW5ndGgsZT0wO2U8ZDtlKyspe3ZhciBmPWEuYmEualtlXTtpZihmLmZsYWdzJmImJmYuZmxhZ3MmYylzd2l0Y2goTGYoYSxmLlIpLDApe2Nhc2UgMDp2YXIgZz12b2lkIDAsbD1hLG09bC5qW2YuUl07aWYobS5UZil7dmFyIHA9dm9pZCAwO2YuZmxhZ3MmNjcxMDg4NjQ/KGc9Zi5wYXJlbnQucGFyZW50LHA9S20obCxnLlIsZy5SK2cud2EsZi5xdWVyeSxbXSksZz1sLmpbZi5wYXJlbnQuUl0uaW5zdGFuY2UpOmYuZmxhZ3MmMTM0MjE3NzI4JiYocD1LbShsLDAsbC5iYS5qLmxlbmd0aC0xLGYucXVlcnksW10pLGc9bC5hKTttLnJlc2V0KHApO2w9Zi5xdWVyeS5lYjtwPSExO2Zvcih2YXIgcT0wO3E8bC5sZW5ndGg7cSsrKXt2YXIgcj1sW3FdLHY9dm9pZCAwO3N3aXRjaChyLlFPKXtjYXNlIDA6dj1tLmZpcnN0O2JyZWFrO2Nhc2UgMTp2PW0scD0hMH1nW3IuamtdPXZ9cCYmbm0obSl9fWYuTmImCmImJmYuTmImY3x8KGUrPWYud2EpfX07dmFyIGpuPSExO2Z1bmN0aW9uIGtuKCl7cmV0dXJue0lIOmZ1bmN0aW9uKCl7fSxhbzpsbixJYzpSbS5JYyxabjpSbS5abixpRjpiaCxPUTpaZixOUTpaZixYTzpaZixUbjpSbS5UbixVbjpSbS5VbixpbzpSbS5pbyxObDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbW4oYSxiKX0saGFuZGxlRXZlbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEuYmEuaGFuZGxlRXZlbnQoYSxiLGMsZCl9LENwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYmEuQ3AoMD09PWI/bm46b24sYSl9LERwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYmEuRHAoMD09PWI/bm46b24sYSl9fX1mdW5jdGlvbiBwbigpe3JldHVybntJSDpxbixhbzpybixJYzpzbixabjp0bixpRjp1bixPUTp2bixOUTp3bixYTzp4bixUbjp5bixVbjp6bixpbzpBbixObDpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbW4oYSxiKX0saGFuZGxlRXZlbnQ6Qm4sQ3A6Q24sRHA6RG59fQpmdW5jdGlvbiBsbihhLGIsYyxkLGUsZil7dmFyIGc9ZS5aLmdldChZZSk7cmV0dXJuKDAsUm0uYW8pKEVuKGEsZSxnLGIsYyksZCxmKX1mdW5jdGlvbiBybihhLGIsYyxkLGUsZil7dmFyIGc9ZS5aLmdldChZZSk7YT1FbihhLGUsbmV3IEZuKGcpLGIsYyk7ZD1HbihkKTtyZXR1cm4gSG4oSW4sUm0uYW8sW2EsZCxmXSl9ZnVuY3Rpb24gRW4oYSxiLGMsZCxlKXt2YXIgZj1iLlouZ2V0KGhmKSxnPWIuWi5nZXQodWQpLGw9Yy5FaihudWxsLG51bGwpO3JldHVybntaZjpiLFo6YSxYUTpkLGhSOmUscXo6Zix2SDpjLGhiOmwsWmg6Z319ZnVuY3Rpb24gc24oYSxiLGMsZCl7Yz1HbihjKTtyZXR1cm4gSG4oSW4sUm0uSWMsW2EsYixjLGRdKX1mdW5jdGlvbiB0bihhLGIsYyxkKXt2YXIgZT1Kbi5nZXQoYi5lbGVtZW50LlhuLk5jLkwpO2M9ZT9lOkduKGMpO3JldHVybiBIbihJbixSbS5abixbYSxiLGMsZF0pfQpmdW5jdGlvbiB1bihhLGIsYyxkKXtkPUtuKGQpO3JldHVybiBiaChhLGIsYyxkKX12YXIgTG49bmV3IE1hcCxNbj1uZXcgTWFwLEpuPW5ldyBNYXA7ZnVuY3Rpb24gdm4oYSl7TG4uc2V0KGEuTCxhKTt2YXIgYjsiZnVuY3Rpb24iPT09dHlwZW9mIGEuTCYmKGI9VWMoYS5MKSkmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5ZJiZNbi5zZXQoYS5MLGEpfWZ1bmN0aW9uIHduKGEsYil7Yj1zZyhiLnZJKTtiPXNnKGIualswXS5lbGVtZW50LiRkKTtKbi5zZXQoYSxiKX1mdW5jdGlvbiB4bigpe0xuLmNsZWFyKCk7TW4uY2xlYXIoKTtKbi5jbGVhcigpfQpmdW5jdGlvbiBHbihhKXtmdW5jdGlvbiBiKGUsZil7Zm9yKGYrPTE7ZjxlLmoubGVuZ3RoO2YrKyl7dmFyIGc9ZS5qW2ZdO2lmKGcuZmxhZ3MmMSlicmVhaztpZihnLmZsYWdzJjM4NDApe3ZhciBsPWcuTmMsbT1Mbi5nZXQobC5MKTttJiYoZy5mbGFncz1nLmZsYWdzJi0zODQxfG0uZmxhZ3MsbC5LYT1wZyhtLkthKSxsLnZhbHVlPW0udmFsdWUpfX19aWYoMD09PUxuLnNpemUpcmV0dXJuIGE7dmFyIGM9ZnVuY3Rpb24oZSl7Zm9yKHZhciBmPVtdLGc9bnVsbCxsPTA7bDxlLmoubGVuZ3RoO2wrKyl7dmFyIG09ZS5qW2xdO20uZmxhZ3MmMSYmKGc9bSk7ZyYmbS5mbGFncyYzODQwJiZMbi5oYXMobS5OYy5MKSYmKGYucHVzaChnLlIpLGc9bnVsbCl9cmV0dXJuIGZ9KGEpO2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gYTthPWEuVihmdW5jdGlvbigpe3JldHVybiBaZn0pO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWIoYSxjW2RdKTtyZXR1cm4gYX0KZnVuY3Rpb24gS24oYSl7dmFyIGI9ZnVuY3Rpb24oZCl7dmFyIGU9ITEsZj0hMTtpZigwPT09TG4uc2l6ZSlyZXR1cm57UUY6ZSxNRjpmfTtkLnJjLmZvckVhY2goZnVuY3Rpb24oZyl7dmFyIGw9TG4uZ2V0KGcuTCk7Zy5mbGFncyYzODQwJiZsJiYoZT0hMCxmPWZ8fGwubVApfSk7ZC5Pby5mb3JFYWNoKGZ1bmN0aW9uKGcpe01uLmZvckVhY2goZnVuY3Rpb24obCxtKXtVYyhtKS5ZPT09ZyYmKGU9ITAsZj1mfHxsLm1QKX0pfSk7cmV0dXJue1FGOmUsTUY6Zn19KGEpLGM9Yi5NRjtpZighYi5RRilyZXR1cm4gYTthPWEuVihmdW5jdGlvbigpe3JldHVybiBaZn0pOyhmdW5jdGlvbihkKXtmb3IodmFyIGU9MDtlPGQucmMubGVuZ3RoO2UrKyl7dmFyIGY9ZC5yY1tlXTtjJiYoZi5mbGFnc3w9NDA5Nik7dmFyIGc9TG4uZ2V0KGYuTCk7ZyYmKGYuZmxhZ3M9Zi5mbGFncyYtMzg0MXxnLmZsYWdzLGYuS2E9cGcoZy5LYSksZi52YWx1ZT1nLnZhbHVlKX1pZigwPE1uLnNpemUpe3ZhciBsPW5ldyBTZXQoZC5Pbyk7Ck1uLmZvckVhY2goZnVuY3Rpb24obSxwKXtsLmhhcyhVYyhwKS5ZKSYmKG09e0w6cCxmbGFnczptLmZsYWdzfChjPzQwOTY6MCksS2E6cGcobS5LYSksdmFsdWU6bS52YWx1ZSxpbmRleDpkLnJjLmxlbmd0aH0sZC5yYy5wdXNoKG0pLGQua2tbYWcocCldPW0pfSl9fSkoYSk7cmV0dXJuIGF9ZnVuY3Rpb24gbm4oYSxiLGMsZCxlLGYsZyxsLG0scCxxLHIsdil7dmFyIHc9YS5iYS5qW2JdOygwLFJtLllFKShhLHcsYyxkLGUsZixnLGwsbSxwLHEscix2KTtyZXR1cm4gdy5mbGFncyYyMjQ/YS5qW2JdLnZhbHVlOnZvaWQgMH1mdW5jdGlvbiBvbihhLGIsYyxkLGUsZixnLGwsbSxwLHEscix2KXt2YXIgdz1hLmJhLmpbYl07KDAsUm0uSHgpKGEsdyxjLGQsZSxmLGcsbCxtLHAscSxyLHYpO3JldHVybiB3LmZsYWdzJjIyND9hLmpbYl0udmFsdWU6dm9pZCAwfWZ1bmN0aW9uIHluKGEpe3JldHVybiBIbihObixSbS5UbixbYV0pfQpmdW5jdGlvbiB6bihhKXtyZXR1cm4gSG4oT24sUm0uVW4sW2FdKX1mdW5jdGlvbiBBbihhKXtyZXR1cm4gSG4oUG4sUm0uaW8sW2FdKX12YXIgSW49MCxObj0xLE9uPTIsUG49MyxRbj00LEhmPXtjcmVhdGU6SW4sTGc6Tm4sWkU6T24sZGVzdHJveTpQbixoYW5kbGVFdmVudDpRbn07SGZbSW5dPSJjcmVhdGUiO0hmW05uXT0iZGV0ZWN0Q2hhbmdlcyI7SGZbT25dPSJjaGVja05vQ2hhbmdlcyI7SGZbUG5dPSJkZXN0cm95IjtIZltRbl09ImhhbmRsZUV2ZW50Ijt2YXIgSWYsUm4sU247ZnVuY3Rpb24gcW4oYSxiKXtSbj1hO1NuPWJ9ZnVuY3Rpb24gQm4oYSxiLGMsZCl7cW4oYSxiKTtyZXR1cm4gSG4oUW4sYS5iYS5oYW5kbGVFdmVudCxbYSxiLGMsZF0pfQpmdW5jdGlvbiBDbihhLGIpe2lmKGEuc3RhdGUmMTI4KXRocm93IEdmKCk7cW4oYSxUbihhLDApKTtyZXR1cm4gYS5iYS5DcChmdW5jdGlvbihjLGQsZSxmKXtmb3IodmFyIGc9W10sbD0zO2w8YXJndW1lbnRzLmxlbmd0aDsrK2wpZ1tsLTNdPWFyZ3VtZW50c1tsXTtsPWMuYmEualtkXTswPT09Yj9VbihjLGwsZSxnKTpSbS5IeC5hcHBseShSbSxbYyxsLGVdLmNvbmNhdChqYShnKSkpO2wuZmxhZ3MmMTYzODQmJnFuKGMsVG4oYyxkKSk7cmV0dXJuIGwuZmxhZ3MmMjI0P2MualtsLlJdLnZhbHVlOnZvaWQgMH0sYSl9CmZ1bmN0aW9uIERuKGEsYil7aWYoYS5zdGF0ZSYxMjgpdGhyb3cgR2YoKTtxbihhLFZuKGEsMCkpO3JldHVybiBhLmJhLkRwKGZ1bmN0aW9uKGMsZCxlLGYpe2Zvcih2YXIgZz1bXSxsPTM7bDxhcmd1bWVudHMubGVuZ3RoOysrbClnW2wtM109YXJndW1lbnRzW2xdO2w9Yy5iYS5qW2RdOzA9PT1iP1VuKGMsbCxlLGcpOlJtLkh4LmFwcGx5KFJtLFtjLGwsZV0uY29uY2F0KGphKGcpKSk7bC5mbGFncyYzJiZxbihjLFZuKGMsZCkpO3JldHVybiBsLmZsYWdzJjIyND9jLmpbbC5SXS52YWx1ZTp2b2lkIDB9LGEpfQpmdW5jdGlvbiBVbihhLGIsYyxkKXtpZihSbS5ZRS5hcHBseShSbSxbYSxiLGNdLmNvbmNhdChqYShkKSkpJiYoZD0xPT09Yz9kWzBdOmQsYi5mbGFncyYxNjM4NCkpe2M9e307Zm9yKHZhciBlPTA7ZTxiLmViLmxlbmd0aDtlKyspe3ZhciBmPWIuZWJbZV0sZz1kW2VdO2lmKGYuZmxhZ3MmOCl7Zj1mLlJvO2Y9amUoZi5yZXBsYWNlKC9bJEBdL2csIl8iKSk7Zj0ibmctcmVmbGVjdC0iK2Y7dHJ5e3ZhciBsPW51bGwhPWc/Zy50b1N0cmluZygpLnNsaWNlKDAsMzApOmd9Y2F0Y2gocCl7bD0iW0VSUk9SXSBFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUifWNbZl09bH19bD1iLnBhcmVudDtiPWEualtsLlJdLmhkO2lmKGwuZWxlbWVudC5uYW1lKWZvcih2YXIgbSBpbiBjKWw9Y1ttXSxudWxsIT1sP2EuaGIuc2V0QXR0cmlidXRlKGIsbSxsKTphLmhiLnJlbW92ZUF0dHJpYnV0ZShiLG0pO2Vsc2UgYS5oYi5zZXRWYWx1ZShiLCJiaW5kaW5ncz0iK0pTT04uc3RyaW5naWZ5KGMsCm51bGwsMikpfX1mdW5jdGlvbiBUbihhLGIpe2Zvcig7YjxhLmJhLmoubGVuZ3RoO2IrKyl7dmFyIGM9YS5iYS5qW2JdO2lmKGMuZmxhZ3MmMTYzODQmJmMuZWImJmMuZWIubGVuZ3RoKXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIFZuKGEsYil7Zm9yKDtiPGEuYmEuai5sZW5ndGg7YisrKXt2YXIgYz1hLmJhLmpbYl07aWYoYy5mbGFncyYzJiZjLmViJiZjLmViLmxlbmd0aClyZXR1cm4gYn1yZXR1cm4gbnVsbH12YXIgbW49ZnVuY3Rpb24oYSxiKXt0aGlzLnZpZXc9YTt0aGlzLlI9YjtudWxsPT1iJiYodGhpcy5SPWI9MCk7Zm9yKGI9dGhpcy5MeT1hLmJhLmpbYl07YiYmMD09PShiLmZsYWdzJjEpOyliPWIucGFyZW50O2lmKCFiKWZvcig7IWImJmE7KWI9bGcoYSksYT1hLnBhcmVudDt0aGlzLkFlPWI7dGhpcy5VbD1hfTsKbW4ucHJvdG90eXBlLnBRPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0xXT1hcmd1bWVudHNbZF07aWYodGhpcy5MeS5mbGFncyYyKXtkPXRoaXMudmlldy5iYTt2YXIgZT10aGlzLkx5LlJ9ZWxzZSBkPXRoaXMuVWwuYmEsZT10aGlzLkFlLlI7dmFyIGY9V24oZCxlKSxnPS0xO2QuVihmdW5jdGlvbigpe2crKztyZXR1cm4gZz09PWY/YS5lcnJvci5iaW5kLmFwcGx5KGEuZXJyb3IsW2FdLmNvbmNhdChqYShjKSkpOlpmfSk7ZzxmJiYoYS5lcnJvcigiSWxsZWdhbCBzdGF0ZTogdGhlIFZpZXdEZWZpbml0aW9uRmFjdG9yeSBkaWQgbm90IGNhbGwgdGhlIGxvZ2dlciEiKSxhLmVycm9yLmFwcGx5KGEsamEoYykpKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobW4ucHJvdG90eXBlLHtzRjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWwualt0aGlzLkFlLlJdLiRkfHx0aGlzLnZpZXd9fSxaOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFVnKHRoaXMuVWwsdGhpcy5BZSl9fSxhOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zRi5hfX0sY29udGV4dDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc0YuY29udGV4dH19LGdkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgYT17fTtpZih0aGlzLkFlKXtYbih0aGlzLlVsLHRoaXMuQWUsYSk7Zm9yKHZhciBiPXRoaXMuQWUuUisxO2I8PXRoaXMuQWUuUit0aGlzLkFlLndhO2IrKyl7dmFyIGM9CnRoaXMuVWwuYmEualtiXTtjLmZsYWdzJjIwMjI0JiZYbih0aGlzLlVsLGMsYSk7Yis9Yy53YX19cmV0dXJuIGF9fX0pO2Z1bmN0aW9uIFduKGEsYil7Zm9yKHZhciBjPS0xLGQ9MDtkPD1iO2QrKylhLmpbZF0uZmxhZ3MmMyYmYysrO3JldHVybiBjfWZ1bmN0aW9uIFhuKGEsYixjKXtmb3IodmFyIGQgaW4gYi5nZCljW2RdPUxtKGEsYixiLmdkW2RdKX1mdW5jdGlvbiBIbihhLGIsYyl7dmFyIGQ9SWYsZT1SbixmPVNuO3RyeXtJZj1hO3ZhciBnPWIuYXBwbHkobnVsbCxjKTtSbj1lO1NuPWY7SWY9ZDtyZXR1cm4gZ31jYXRjaChsKXtpZihsLm5nRGVidWdDb250ZXh0fHwhUm4pdGhyb3cgbDthPWw7Yj1ZbigpO2EgaW5zdGFuY2VvZiBFcnJvcnx8KGE9RXJyb3IoYS50b1N0cmluZygpKSk7RmYoYSxiKTt0aHJvdyBhO319ZnVuY3Rpb24gWW4oKXtyZXR1cm4gUm4/bmV3IG1uKFJuLFNuKTpudWxsfXZhciBGbj1mdW5jdGlvbihhKXt0aGlzLlU9YX07CkZuLnByb3RvdHlwZS5Faj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgWm4odGhpcy5VLkVqKGEsYikpfTtGbi5wcm90b3R5cGUuUWg9ZnVuY3Rpb24oKXt0aGlzLlUuUWgmJnRoaXMuVS5RaCgpfTtGbi5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKCl7dGhpcy5VLmVuZCYmdGhpcy5VLmVuZCgpfTt2YXIgWm49ZnVuY3Rpb24oYSl7dGhpcy5VPWE7dGhpcy5rUD1Zbjt0aGlzLmRhdGE9dGhpcy5VLmRhdGF9O2g9Wm4ucHJvdG90eXBlO2guTmw9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMua1AoYSl9O2guVmg9ZnVuY3Rpb24oYSl7dmFyIGI9SG0oYSk7R20uZGVsZXRlKGIuRkcpO2IgaW5zdGFuY2VvZiBFbSYmKGIuQnkubGVuZ3RoPTApO3RoaXMuVS5WaCYmdGhpcy5VLlZoKGEpfTtoLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLlUuZGVzdHJveSgpfTsKaC5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7Yj10aGlzLlUuY3JlYXRlRWxlbWVudChhLGIpO3ZhciBjPXRoaXMuTmwoYik7YyYmKGM9bmV3IENtKGIsbnVsbCxjKSxjLm5hbWU9YSxJbShjKSk7cmV0dXJuIGJ9O2guY3JlYXRlQ29tbWVudD1mdW5jdGlvbihhKXthPXRoaXMuVS5jcmVhdGVDb21tZW50KGEpO3ZhciBiPXRoaXMuTmwoYSk7YiYmSW0obmV3IEVtKGEsbnVsbCxiKSk7cmV0dXJuIGF9O2guYm89ZnVuY3Rpb24oYSl7YT10aGlzLlUuYm8oYSk7dmFyIGI9dGhpcy5ObChhKTtiJiZJbShuZXcgRW0oYSxudWxsLGIpKTtyZXR1cm4gYX07aC5hcHBlbmRDaGlsZD1mdW5jdGlvbihhLGIpe3ZhciBjPUhtKGEpLGQ9SG0oYik7YyYmZCYmYyBpbnN0YW5jZW9mIENtJiZEbShjLGQpO3RoaXMuVS5hcHBlbmRDaGlsZChhLGIpfTsKaC5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUhtKGEpLGU9SG0oYiksZj1IbShjKTtkJiZlJiZkIGluc3RhbmNlb2YgQ20mJmQuaW5zZXJ0QmVmb3JlKGYsZSk7dGhpcy5VLmluc2VydEJlZm9yZShhLGIsYyl9O2gucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1IbShhKSxkPUhtKGIpO2MmJmQmJmMgaW5zdGFuY2VvZiBDbSYmYy5yZW1vdmVDaGlsZChkKTt0aGlzLlUucmVtb3ZlQ2hpbGQoYSxiKX07aC5ucD1mdW5jdGlvbihhLGIpe2E9dGhpcy5VLm5wKGEsYik7KGI9WW4oKSkmJkltKG5ldyBDbShhLG51bGwsYikpO3JldHVybiBhfTtoLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1IbShhKTtlJiZlIGluc3RhbmNlb2YgQ20mJihlLmF0dHJpYnV0ZXNbZD9kKyI6IitiOmJdPWMpO3RoaXMuVS5zZXRBdHRyaWJ1dGUoYSxiLGMsZCl9OwpoLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9SG0oYSk7ZCYmZCBpbnN0YW5jZW9mIENtJiYoZC5hdHRyaWJ1dGVzW2M/YysiOiIrYjpiXT1udWxsKTt0aGlzLlUucmVtb3ZlQXR0cmlidXRlKGEsYixjKX07aC5GbD1mdW5jdGlvbihhLGIpe3ZhciBjPUhtKGEpO2MmJmMgaW5zdGFuY2VvZiBDbSYmKGMuJEVbYl09ITApO3RoaXMuVS5GbChhLGIpfTtoLm1tPWZ1bmN0aW9uKGEsYil7dmFyIGM9SG0oYSk7YyYmYyBpbnN0YW5jZW9mIENtJiYoYy4kRVtiXT0hMSk7dGhpcy5VLm1tKGEsYil9O2gudG09ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9SG0oYSk7ZSYmZSBpbnN0YW5jZW9mIENtJiYoZS5nW2JdPWMpO3RoaXMuVS50bShhLGIsYyxkKX07aC5ubT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9SG0oYSk7ZCYmZCBpbnN0YW5jZW9mIENtJiYoZC5nW2JdPW51bGwpO3RoaXMuVS5ubShhLGIsYyl9OwpoLnNldFByb3BlcnR5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1IbShhKTtkJiZkIGluc3RhbmNlb2YgQ20mJihkLnByb3BlcnRpZXNbYl09Yyk7dGhpcy5VLnNldFByb3BlcnR5KGEsYixjKX07aC5mYz1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPT10eXBlb2YgYSl7dmFyIGQ9SG0oYSk7ZCYmZC5CeS5wdXNoKG5ldyBCbShiLGMpKX1yZXR1cm4gdGhpcy5VLmZjKGEsYixjKX07aC5wYXJlbnROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlUucGFyZW50Tm9kZShhKX07aC5uZXh0U2libGluZz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5VLm5leHRTaWJsaW5nKGEpfTtoLnNldFZhbHVlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuVS5zZXRWYWx1ZShhLGIpfTt2YXIgJG49ZnVuY3Rpb24oYSxiLGMpe3RoaXMuQkc9YTt0aGlzLmZxPWI7dGhpcy5jTT1jfTt0KCRuLHFkKTskbi5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEpe2lmKCFqbil7am49ITA7dmFyIGI9R2QoKT9wbigpOmtuKCk7TGY9Yi5JSDtNZj1iLmFvO05mPWIuSWM7T2Y9Yi5abjtQZj1iLmlGO1FmPWIuVG47UmY9Yi5VbjtTZj1iLmlvO1RmPXFoO1VmPWIuTmw7VmY9Yi5oYW5kbGVFdmVudDtXZj1iLkNwO1hmPWIuRHA7WWY9Sm19Yj1zZyh0aGlzLmNNKTt2YXIgYz1BcnJheS5mcm9tKGIucmMpLGQ9QXJyYXkuZnJvbShiLk9vKSxlPXt9LGY7Zm9yKGYgaW4gYi5rayllW2ZdPWIua2tbZl07cmV0dXJuIFBmKHRoaXMuQkcsYXx8c2UsdGhpcy5mcSx7VjpiLlYsc2NvcGU6Yi5zY29wZSxyYzpjLE9vOmQsa2s6ZX0pfTt2YXIgWj1SbS5GUjt2YXIgYW89ZW0obnVsbCwiY29yZSIsW3tZYTpOZSxrZDoidW5rbm93biJ9LHtZYTpkbSxLYTpbcGVdfSx7WWE6RmssS2E6W119LHtZYTpQZSxLYTpbXX1dKTt2YXIgYm89ZnVuY3Rpb24oKXt9LGNvPWZ1bmN0aW9uKGEpe3RoaXMueWQ9YX07dChjbyxibyk7Y28ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWR9O3ZhciBlbz1mdW5jdGlvbigpe30sZm89ZnVuY3Rpb24oYSl7dGhpcy55ZD1hfTt0KGZvLGVvKTtmby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55ZH07dmFyIGdvPWZ1bmN0aW9uKCl7fSxobz1mdW5jdGlvbihhKXt0aGlzLnlkPWF9O3QoaG8sZ28pO2hvLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnlkfTt2YXIgaW89ZnVuY3Rpb24oKXt9LGpvPWZ1bmN0aW9uKGEpe3RoaXMueWQ9YX07dChqbyxpbyk7am8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWR9O2Z1bmN0aW9uIGtvKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgRXJyb3IoIndyb25nIHR5cGUiKTt9ZnVuY3Rpb24gbG8oYSl7a28oYSxjbyk7cmV0dXJuIGEueWR9ZnVuY3Rpb24gbW8oYSl7a28oYSxmbyk7cmV0dXJuIGEueWR9ZnVuY3Rpb24gbm8oYSl7a28oYSxqbyk7cmV0dXJuIGEueWR9ZnVuY3Rpb24gb28oYSl7a28oYSxobyk7cmV0dXJuIGEueWR9O3ZhciBwbz1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLkxMPWE7dGhpcy5NTD1iO3RoaXMubG49Yzt0aGlzLnBhPWQ7dGhpcy5PcT10aGlzLk5xPW51bGw7dGhpcy5JcT1bXTt0aGlzLnhnPW51bGx9O2g9cG8ucHJvdG90eXBlO2gudGk9ZnVuY3Rpb24oKXtpZih0aGlzLk5xKXt2YXIgYT10aGlzLk5xLkdqKHRoaXMueGcpO2EmJnRoaXMuZEooYSl9ZWxzZSB0aGlzLk9xJiYoYT10aGlzLk9xLkdqKHRoaXMueGcpKSYmdGhpcy5lSihhKX07aC5lSj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2EudHMoZnVuY3Rpb24oYyl7cmV0dXJuIGIuWmMoYy5rZXksYy5KYyl9KTt3ZihhLGZ1bmN0aW9uKGMpe3JldHVybiBiLlpjKGMua2V5LGMuSmMpfSk7YS51cyhmdW5jdGlvbihjKXtjLkNpJiZiLlpjKGMua2V5LCExKX0pfTsKaC5kSj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2EudHMoZnVuY3Rpb24oYyl7aWYoInN0cmluZyI9PT10eXBlb2YgYy5pdGVtKWIuWmMoYy5pdGVtLCEwKTtlbHNlIHRocm93IEVycm9yKCJOZ0NsYXNzIGNhbiBvbmx5IHRvZ2dsZSBDU1MgY2xhc3NlcyBleHByZXNzZWQgYXMgc3RyaW5ncywgZ290ICIrUGMoYy5pdGVtKSk7fSk7YS51cyhmdW5jdGlvbihjKXtyZXR1cm4gYi5aYyhjLml0ZW0sITEpfSl9O2guZHU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthJiYoQXJyYXkuaXNBcnJheShhKXx8YSBpbnN0YW5jZW9mIFNldD9hLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGIuWmMoYywhMCl9KTpPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBiLlpjKGMsISFhW2NdKX0pKX07CmgucUQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthJiYoQXJyYXkuaXNBcnJheShhKXx8YSBpbnN0YW5jZW9mIFNldD9hLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGIuWmMoYywhMSl9KTpPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBiLlpjKGMsITEpfSkpfTtoLlpjPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczsoYT1hLnRyaW0oKSkmJmEuc3BsaXQoL1xzKy9nKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2I/Yy5wYS5GbChjLmxuLmksZCk6Yy5wYS5tbShjLmxuLmksZCl9KX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocG8ucHJvdG90eXBlLHt3eTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsc2V0OmZ1bmN0aW9uKGEpe3RoaXMucUQodGhpcy5JcSk7dGhpcy5JcT0ic3RyaW5nIj09PXR5cGVvZiBhP2Euc3BsaXQoL1xzKy8pOltdO3RoaXMuZHUodGhpcy5JcSk7dGhpcy5kdSh0aGlzLnhnKX19LGppOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5xRCh0aGlzLnhnKTt0aGlzLmR1KHRoaXMuSXEpO3RoaXMuT3E9dGhpcy5OcT1udWxsO2lmKHRoaXMueGc9InN0cmluZyI9PT10eXBlb2YgYT9hLnNwbGl0KC9ccysvKTphKWNmKHRoaXMueGcpP3RoaXMuTnE9dGhpcy5MTC5maW5kKHRoaXMueGcpLmNyZWF0ZSgpOnRoaXMuT3E9dGhpcy5NTC5maW5kKHRoaXMueGcpLmNyZWF0ZSgpfX19KTt2YXIgcW89ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5QPWE7dGhpcy5VYT1iO3RoaXMuaW5kZXg9Yzt0aGlzLmNvdW50PWR9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocW8ucHJvdG90eXBlLHtmaXJzdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLmluZGV4fX19KTt2YXIgcm89ZnVuY3Rpb24oYSxiLGMpe3RoaXMudmU9YTt0aGlzLlVEPWI7dGhpcy5CdT1jO3RoaXMubW49bnVsbDt0aGlzLlF2PSEwO3RoaXMuc2c9bnVsbH07CnJvLnByb3RvdHlwZS50aT1mdW5jdGlvbigpe2lmKHRoaXMuUXYpe3RoaXMuUXY9ITE7dmFyIGE9dGhpcy5tbjtpZighdGhpcy5zZyYmYSl0cnl7dGhpcy5zZz10aGlzLkJ1LmZpbmQoYSkuY3JlYXRlKHRoaXMuelEpfWNhdGNoKGIpe3Rocm93IEVycm9yKCJDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnIithKyInIG9mIHR5cGUgJyIrKGEubmFtZXx8dHlwZW9mIGEpKyInLiBOZ0ZvciBvbmx5IHN1cHBvcnRzIGJpbmRpbmcgdG8gSXRlcmFibGVzIHN1Y2ggYXMgQXJyYXlzLiIpO319dGhpcy5zZyYmKGE9dGhpcy5zZy5Haih0aGlzLm1uKSkmJnRoaXMuY3UoYSl9Owpyby5wcm90b3R5cGUuY3U9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPVtdO3BmKGEsZnVuY3Rpb24oZyxsLG0pe251bGw9PWcuaGs/KG09Yi52ZS5JYyhiLlVELG5ldyBxbyhudWxsLGIubW4sLTEsLTEpLG51bGw9PT1tP3ZvaWQgMDptKSxjLnB1c2gobmV3IHNvKGcsbSkpKTpudWxsPT1tP2IudmUucmVtb3ZlKG51bGw9PT1sP3ZvaWQgMDpsKTpudWxsIT09bCYmKGw9Yi52ZS5nZXQobCksYi52ZS5tb3ZlKGwsbSksYy5wdXNoKG5ldyBzbyhnLGwpKSl9KTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLnhNKGNbZF0udmlldyxjW2RdLlpRKTtkPTA7Zm9yKHZhciBlPXRoaXMudmUubGVuZ3RoO2Q8ZTtkKyspe3ZhciBmPXRoaXMudmUuZ2V0KGQpO2YuY29udGV4dC5pbmRleD1kO2YuY29udGV4dC5jb3VudD1lO2YuY29udGV4dC5VYT10aGlzLm1ufXFmKGEsZnVuY3Rpb24oZyl7Yi52ZS5nZXQoZy5RZikuY29udGV4dC5QPWcuaXRlbX0pfTsKcm8ucHJvdG90eXBlLnhNPWZ1bmN0aW9uKGEsYil7YS5jb250ZXh0LlA9Yi5pdGVtfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHJvLnByb3RvdHlwZSx7VWE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihhKXt0aGlzLm1uPWE7dGhpcy5Rdj0hMH19LHpROntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24oYSl7R2QoKSYmbnVsbCE9YSYmImZ1bmN0aW9uIiE9PXR5cGVvZiBhJiZjb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigidHJhY2tCeSBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAiK0pTT04uc3RyaW5naWZ5KGEpKyIuIFNlZSBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2NvbW1vbi9OZ0Zvck9mI2NoYW5nZS1wcm9wYWdhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTt0aGlzLkhyPWF9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhyfX19KTsKdmFyIHNvPWZ1bmN0aW9uKGEsYil7dGhpcy5aUT1hO3RoaXMudmlldz1ifTt2YXIgdW89ZnVuY3Rpb24oYSxiKXt0aGlzLnZlPWE7dGhpcy5RYz1uZXcgdG87dGhpcy50cT10aGlzLlB3PXRoaXMuR3U9bnVsbDt0aGlzLlZEPWJ9O3VvLnByb3RvdHlwZS5wRT1mdW5jdGlvbigpe3RoaXMuUWMuUD90aGlzLlB3fHwodGhpcy52ZS5jbGVhcigpLHRoaXMudHE9bnVsbCx0aGlzLlZEJiYodGhpcy5Qdz10aGlzLnZlLkljKHRoaXMuVkQsdGhpcy5RYykpKTp0aGlzLnRxfHwodGhpcy52ZS5jbGVhcigpLHRoaXMuUHc9bnVsbCx0aGlzLkd1JiYodGhpcy50cT10aGlzLnZlLkljKHRoaXMuR3UsdGhpcy5RYykpKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModW8ucHJvdG90eXBlLHtSYTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsc2V0OmZ1bmN0aW9uKGEpe3RoaXMuUWMuUD10aGlzLlFjLlJhPWE7dGhpcy5wRSgpfX0sSnk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihhKXtpZihhJiYhYS5JYyl0aHJvdyBFcnJvcigibmdJZkVsc2UgbXVzdCBiZSBhIFRlbXBsYXRlUmVmLCBidXQgcmVjZWl2ZWQgJyIrUGMoYSkrIicuIik7dGhpcy5HdT1hO3RoaXMudHE9bnVsbDt0aGlzLnBFKCl9fX0pO3ZhciB0bz1mdW5jdGlvbigpe3RoaXMuUmE9dGhpcy5QPW51bGx9O3ZhciB2bz1mdW5jdGlvbihhLGIpe3RoaXMuemI9YTt0aGlzLkhOPWI7dGhpcy5Xaz0hMX07dm8ucHJvdG90eXBlLmNyZWF0ZT1mdW5jdGlvbigpe3RoaXMuV2s9ITA7dGhpcy56Yi5JYyh0aGlzLkhOKX07dm8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLldrPSExO3RoaXMuemIuY2xlYXIoKX07dmFyIHdvPWZ1bmN0aW9uKCl7dGhpcy5TQT0hMTt0aGlzLnl2PXRoaXMucHU9MDt0aGlzLlJxPSExfTt3by5wcm90b3R5cGUuUUk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdSsrfTt3by5wcm90b3R5cGUuUkk9ZnVuY3Rpb24oYSl7dGhpcy5TbXx8KHRoaXMuU209W10pO3RoaXMuU20ucHVzaChhKX07d28ucHJvdG90eXBlLlRMPWZ1bmN0aW9uKGEpe2E9YT09dGhpcy5kTTt0aGlzLlJxPXRoaXMuUnF8fGE7dGhpcy55disrO3RoaXMueXY9PT10aGlzLnB1JiYodGhpcy5mRSghdGhpcy5ScSksdGhpcy55dj0wLHRoaXMuUnE9ITEpO3JldHVybiBhfTsKd28ucHJvdG90eXBlLmZFPWZ1bmN0aW9uKGEpe2lmKHRoaXMuU20mJmEhPT10aGlzLlNBKXt0aGlzLlNBPWE7Zm9yKHZhciBiPTA7Yjx0aGlzLlNtLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuU21bYl0sZD1hO2QmJiFjLldrP2MuY3JlYXRlKCk6IWQmJmMuV2smJmMuZGVzdHJveSgpfX19O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod28ucHJvdG90eXBlLHtVajp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsc2V0OmZ1bmN0aW9uKGEpe3RoaXMuZE09YTswPT09dGhpcy5wdSYmdGhpcy5mRSghMCl9fX0pO3ZhciB4bz1mdW5jdGlvbihhLGIsYyl7dGhpcy5Vaj1jO2MuUUkoKTt0aGlzLklhPW5ldyB2byhhLGIpfTt4by5wcm90b3R5cGUudGk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLGI9dGhpcy5Vai5UTCh0aGlzLlZnKTtiJiYhYS5Xaz9hLmNyZWF0ZSgpOiFiJiZhLldrJiZhLmRlc3Ryb3koKX07dmFyIHlvPWZ1bmN0aW9uKGEsYixjKXtjLlJJKG5ldyB2byhhLGIpKX07dmFyIHpvPWZ1bmN0aW9uKCl7fSxBbz1mdW5jdGlvbihhKXt0aGlzLmxvY2FsZT1hfTt0KEFvLHpvKTt2YXIgQm89ZnVuY3Rpb24oYSxiLGMpe3RoaXMubG49YTt0aGlzLkJ1PWI7dGhpcy5wYT1jO3RoaXMuc2c9dGhpcy5KQz1udWxsfTtCby5wcm90b3R5cGUudGk9ZnVuY3Rpb24oKXtpZih0aGlzLnNnKXt2YXIgYT10aGlzLnNnLkdqKHRoaXMuSkMpO2EmJnRoaXMuY3UoYSl9fTtCby5wcm90b3R5cGUuQnc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uKGEuc3BsaXQoIi4iKSk7YT1jLm5leHQoKS52YWx1ZTtjPWMubmV4dCgpLnZhbHVlO2I9bnVsbCE9YiYmYz8iIitiK2M6YjtudWxsIT1iP3RoaXMucGEudG0odGhpcy5sbi5pLGEsYik6dGhpcy5wYS5ubSh0aGlzLmxuLmksYSl9O0JvLnByb3RvdHlwZS5jdT1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2EudXMoZnVuY3Rpb24oYyl7cmV0dXJuIGIuQncoYy5rZXksbnVsbCl9KTthLnRzKGZ1bmN0aW9uKGMpe3JldHVybiBiLkJ3KGMua2V5LGMuSmMpfSk7d2YoYSxmdW5jdGlvbihjKXtyZXR1cm4gYi5CdyhjLmtleSxjLkpjKX0pfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCby5wcm90b3R5cGUse3VpOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5KQz1hOyF0aGlzLnNnJiZhJiYodGhpcy5zZz10aGlzLkJ1LmZpbmQoYSkuY3JlYXRlKCkpfX19KTt2YXIgQ289ZnVuY3Rpb24oYSl7dGhpcy56Yj1hO3RoaXMuZG09dGhpcy52aT10aGlzLkloPW51bGx9O0NvLnByb3RvdHlwZS5TYT1mdW5jdGlvbihhKXt0aGlzLnZOKGEpPyhhPXRoaXMuemIsdGhpcy5JaCYmYS5yZW1vdmUoYS5pbmRleE9mKHRoaXMuSWgpKSx0aGlzLkloPXRoaXMuZG0/YS5JYyh0aGlzLmRtLHRoaXMudmkpOm51bGwpOnRoaXMuSWgmJnRoaXMudmkmJnRoaXMuY08odGhpcy52aSl9O0NvLnByb3RvdHlwZS52Tj1mdW5jdGlvbihhKXt2YXIgYj1hLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0O3JldHVybiEhYS5uZ1RlbXBsYXRlT3V0bGV0fHxiJiZ0aGlzLm5MKGIpfTsKQ28ucHJvdG90eXBlLm5MPWZ1bmN0aW9uKGEpe3ZhciBiPU9iamVjdC5rZXlzKGEuQ2l8fHt9KTthPU9iamVjdC5rZXlzKGEuSmN8fHt9KTtpZihiLmxlbmd0aD09PWEubGVuZ3RoKXthPW4oYSk7Zm9yKHZhciBjPWEubmV4dCgpOyFjLmRvbmU7Yz1hLm5leHQoKSlpZigtMT09PWIuaW5kZXhPZihjLnZhbHVlKSlyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMH07Q28ucHJvdG90eXBlLmNPPWZ1bmN0aW9uKGEpe2E9bihPYmplY3Qua2V5cyhhKSk7Zm9yKHZhciBiPWEubmV4dCgpOyFiLmRvbmU7Yj1hLm5leHQoKSliPWIudmFsdWUsdGhpcy5JaC5jb250ZXh0W2JdPXRoaXMudmlbYl19O2Z1bmN0aW9uIERvKGEsYil7cmV0dXJuIEVycm9yKCJJbnZhbGlkUGlwZUFyZ3VtZW50OiAnIitiKyInIGZvciBwaXBlICciK1BjKGEpKyInIil9O3ZhciBFbz1mdW5jdGlvbigpe307RW8ucHJvdG90eXBlLmpGPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3Vic2NyaWJlKHtuZXh0OmIsZXJyb3I6ZnVuY3Rpb24oYyl7dGhyb3cgYzt9fSl9O0VvLnByb3RvdHlwZS4kYj1mdW5jdGlvbihhKXthLnVuc3Vic2NyaWJlKCl9O0VvLnByb3RvdHlwZS5WYT1mdW5jdGlvbihhKXthLnVuc3Vic2NyaWJlKCl9O3ZhciBGbz1mdW5jdGlvbigpe307Rm8ucHJvdG90eXBlLmpGPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudGhlbihiLGZ1bmN0aW9uKGMpe3Rocm93IGM7fSl9O0ZvLnByb3RvdHlwZS4kYj1mdW5jdGlvbigpe307Rm8ucHJvdG90eXBlLlZhPWZ1bmN0aW9uKCl7fTt2YXIgR289bmV3IEZvLEhvPW5ldyBFbyxJbz1mdW5jdGlvbihhKXt0aGlzLkxNPWE7dGhpcy5Idz10aGlzLm5uPXRoaXMuQnI9dGhpcy5TcT1udWxsfTtoPUlvLnByb3RvdHlwZTtoLlg9ZnVuY3Rpb24oKXt0aGlzLkJyJiZ0aGlzLlpBKCl9OwpoLnRyYW5zZm9ybT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ubj9hIT09dGhpcy5ubj8odGhpcy5aQSgpLHRoaXMudHJhbnNmb3JtKGEpKTp0aGlzLlNxOihhJiZ0aGlzLkZjKGEpLHRoaXMuU3EpfTtoLkZjPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5ubj1hO3RoaXMuSHc9dGhpcy5lTihhKTt0aGlzLkJyPXRoaXMuSHcuakYoYSxmdW5jdGlvbihjKXtyZXR1cm4gYi5kTyhhLGMpfSl9O2guZU49ZnVuY3Rpb24oYSl7aWYoRWUoYSkpcmV0dXJuIEdvO2lmKEZlKGEpKXJldHVybiBIbzt0aHJvdyBEbyhJbyxhKTt9O2guWkE9ZnVuY3Rpb24oKXt0aGlzLkh3LiRiKHRoaXMuQnIpO3RoaXMubm49dGhpcy5Ccj10aGlzLlNxPW51bGx9O2guZE89ZnVuY3Rpb24oYSxiKXthPT09dGhpcy5ubiYmKHRoaXMuU3E9YixZZyh0aGlzLkxNKSl9O3ZhciBKbz1mdW5jdGlvbigpe307Sm8ucHJvdG90eXBlLnRyYW5zZm9ybT1mdW5jdGlvbihhKXtpZighYSlyZXR1cm4gYTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRocm93IERvKEpvLGEpO3JldHVybiBhLnRvVXBwZXJDYXNlKCl9O3ZhciBLbz1mdW5jdGlvbigpe307dmFyIExvPW5ldyB5KCJEb2N1bWVudFRva2VuIik7dmFyIE1vPW51bGwsTm89ZnVuY3Rpb24oKXt9O3ZhciBPbz1mdW5jdGlvbigpe307T28uaGE9VGMoe1Y6UG8sTDpPbyxZOiJwbGF0Zm9ybSJ9KTtmdW5jdGlvbiBQbygpe3JldHVybiBtZChRbyl9dmFyIFJvPW5ldyB5KCJMb2NhdGlvbiBJbml0aWFsaXplZCIpLFFvPWZ1bmN0aW9uKGEpe3RoaXMuRGM9YTt0aGlzLnNMKCl9O3QoUW8sT28pO1FvLnByb3RvdHlwZS5zTD1mdW5jdGlvbigpe3RoaXMubG9jYXRpb249d2luZG93LmxvY2F0aW9uO3RoaXMuYW49d2luZG93Lmhpc3Rvcnl9O1FvLnByb3RvdHlwZS5Wbz1mdW5jdGlvbihhKXtTbyh0aGlzLkRjLCJ3aW5kb3ciKS5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsYSwhMSl9O3ZhciBUbz1mdW5jdGlvbihhLGIpe1NvKGEuRGMsIndpbmRvdyIpLmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLGIsITEpfTtoPVFvLnByb3RvdHlwZTsKaC5wdXNoU3RhdGU9ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZT90aGlzLmFuLnB1c2hTdGF0ZShhLGIsYyk6dGhpcy5sb2NhdGlvbi5oYXNoPWN9O2gucmVwbGFjZVN0YXRlPWZ1bmN0aW9uKGEsYixjKXt3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU/dGhpcy5hbi5yZXBsYWNlU3RhdGUoYSxiLGMpOnRoaXMubG9jYXRpb24uaGFzaD1jfTtoLmZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLmFuLmZvcndhcmQoKX07aC5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5hbi5iYWNrKCl9O2guZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbi5zdGF0ZX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUW8ucHJvdG90eXBlLHtocmVmOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5ocmVmfX0scHJvdG9jb2w6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLnByb3RvY29sfX0saG9zdG5hbWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLmhvc3RuYW1lfX0scG9ydDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ucG9ydH19LHBhdGhuYW1lOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubG9jYXRpb24ucGF0aG5hbWU9YX19LApzZWFyY2g6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLnNlYXJjaH19LGhhc2g6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2F0aW9uLmhhc2h9fX0pO1FvLmhhPVRjKHtWOlVvLEw6UW8sWToicGxhdGZvcm0ifSk7ZnVuY3Rpb24gVW8oKXtyZXR1cm4gbmV3IFFvKG1kKExvKSl9O2Z1bmN0aW9uIFZvKGEsYil7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9MDthLmVuZHNXaXRoKCIvIikmJmMrKztiLnN0YXJ0c1dpdGgoIi8iKSYmYysrO3JldHVybiAyPT1jP2ErYi5zdWJzdHJpbmcoMSk6MT09Yz9hK2I6YSsiLyIrYn1mdW5jdGlvbiBXbyhhKXt2YXIgYj1hLm1hdGNoKC8jfFw/fCQvKTtiPWImJmIuaW5kZXh8fGEubGVuZ3RoO3JldHVybiBhLnNsaWNlKDAsYi0oIi8iPT09YVtiLTFdPzE6MCkpK2Euc2xpY2UoYil9ZnVuY3Rpb24gWG8oYSl7cmV0dXJuIGEmJiI/IiE9PWFbMF0/Ij8iK2E6YX07dmFyIFlvPWZ1bmN0aW9uKCl7fTtZby5oYT1UYyh7VjpabyxMOllvLFk6InJvb3QifSk7ZnVuY3Rpb24gWm8oKXt2YXIgYT1tZChMbykubG9jYXRpb247cmV0dXJuIG5ldyAkbyhtZChPbyksYSYmYS5vcmlnaW58fCIiKX12YXIgYXA9bmV3IHkoImFwcEJhc2VIcmVmIiksJG89ZnVuY3Rpb24oYSxiKXt0aGlzLkliPWE7bnVsbD09YiYmKGI9TW8ueHMoKSk7aWYobnVsbD09Yil0aHJvdyBFcnJvcigiTm8gYmFzZSBocmVmIHNldC4gUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIEFQUF9CQVNFX0hSRUYgdG9rZW4gb3IgYWRkIGEgYmFzZSBlbGVtZW50IHRvIHRoZSBkb2N1bWVudC4iKTt0aGlzLmtoPWJ9O3QoJG8sWW8pOyRvLmhhPVlvLmhhO2g9JG8ucHJvdG90eXBlO2guVm89ZnVuY3Rpb24oYSl7dGhpcy5JYi5WbyhhKTtUbyh0aGlzLkliLGEpfTtoLnhzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2h9O2guJGc9ZnVuY3Rpb24oYSl7cmV0dXJuIFZvKHRoaXMua2gsYSl9OwpoLnBhdGg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5JYi5wYXRobmFtZStYbyh0aGlzLkliLnNlYXJjaCksYz10aGlzLkliLmhhc2g7cmV0dXJuIGMmJih2b2lkIDA9PT1hPzA6YSk/IiIrYitjOmJ9O2gucHVzaFN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuSWIucHVzaFN0YXRlKGEsYix0aGlzLiRnKGMrWG8oZCkpKX07aC5yZXBsYWNlU3RhdGU9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5JYi5yZXBsYWNlU3RhdGUoYSxiLHRoaXMuJGcoYytYbyhkKSkpfTtoLmZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLkliLmZvcndhcmQoKX07aC5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5JYi5iYWNrKCl9O3ZhciBicD1mdW5jdGlvbihhLGIpe3RoaXMuSWI9YTt0aGlzLmtoPSIiO251bGwhPWImJih0aGlzLmtoPWIpfTt0KGJwLFlvKTticC5oYT1Zby5oYTtoPWJwLnByb3RvdHlwZTtoLlZvPWZ1bmN0aW9uKGEpe3RoaXMuSWIuVm8oYSk7VG8odGhpcy5JYixhKX07aC54cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtofTtoLnBhdGg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkliLmhhc2g7bnVsbD09YSYmKGE9IiMiKTtyZXR1cm4gMDxhLmxlbmd0aD9hLnN1YnN0cmluZygxKTphfTtoLiRnPWZ1bmN0aW9uKGEpe2E9Vm8odGhpcy5raCxhKTtyZXR1cm4gMDxhLmxlbmd0aD8iIyIrYTphfTtoLnB1c2hTdGF0ZT1mdW5jdGlvbihhLGIsYyxkKXtjPXRoaXMuJGcoYytYbyhkKSk7MD09Yy5sZW5ndGgmJihjPXRoaXMuSWIucGF0aG5hbWUpO3RoaXMuSWIucHVzaFN0YXRlKGEsYixjKX07CmgucmVwbGFjZVN0YXRlPWZ1bmN0aW9uKGEsYixjLGQpe2M9dGhpcy4kZyhjK1hvKGQpKTswPT1jLmxlbmd0aCYmKGM9dGhpcy5JYi5wYXRobmFtZSk7dGhpcy5JYi5yZXBsYWNlU3RhdGUoYSxiLGMpfTtoLmZvcndhcmQ9ZnVuY3Rpb24oKXt0aGlzLkliLmZvcndhcmQoKX07aC5iYWNrPWZ1bmN0aW9uKCl7dGhpcy5JYi5iYWNrKCl9O3ZhciBjcD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7dGhpcy52aj1uZXcgcms7dGhpcy5qTz1bXTt0aGlzLkJoPWE7YT10aGlzLkJoLnhzKCk7dGhpcy5JYj1iO3RoaXMua2g9V28oYS5yZXBsYWNlKC9cL2luZGV4Lmh0bWwkLywiIikpO3RoaXMuQmguVm8oZnVuY3Rpb24oZCl7Yy52ai5lbWl0KHt1cmw6Yy5wYXRoKCEwKSxwb3A6ITAsc3RhdGU6ZC5zdGF0ZSx0eXBlOmQudHlwZX0pfSl9O2g9Y3AucHJvdG90eXBlO2gucGF0aD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5CaC5wYXRoKHZvaWQgMD09PWE/ITE6YSkpfTtoLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWIuZ2V0U3RhdGUoKX07aC5ub3JtYWxpemU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5raDthPWEucmVwbGFjZSgvXC9pbmRleC5odG1sJC8sIiIpO3JldHVybiBXbyhiJiZhLnN0YXJ0c1dpdGgoYik/YS5zdWJzdHJpbmcoYi5sZW5ndGgpOmEpfTsKaC4kZz1mdW5jdGlvbihhKXthJiYiLyIhPT1hWzBdJiYoYT0iLyIrYSk7cmV0dXJuIHRoaXMuQmguJGcoYSl9O2guZ289ZnVuY3Rpb24oYSxiLGMpe2I9dm9pZCAwPT09Yj8iIjpiO2M9dm9pZCAwPT09Yz9udWxsOmM7dGhpcy5CaC5wdXNoU3RhdGUoYywiIixhLGIpO3RoaXMuS0ModGhpcy4kZyhhK1hvKGIpKSxjKX07aC5yZXBsYWNlU3RhdGU9ZnVuY3Rpb24oYSxiLGMpe2I9dm9pZCAwPT09Yj8iIjpiO2M9dm9pZCAwPT09Yz9udWxsOmM7dGhpcy5CaC5yZXBsYWNlU3RhdGUoYywiIixhLGIpO3RoaXMuS0ModGhpcy4kZyhhK1hvKGIpKSxjKX07aC5mb3J3YXJkPWZ1bmN0aW9uKCl7dGhpcy5CaC5mb3J3YXJkKCl9O2guYmFjaz1mdW5jdGlvbigpe3RoaXMuQmguYmFjaygpfTtoLktDPWZ1bmN0aW9uKGEsYil7YT12b2lkIDA9PT1hPyIiOmE7dGhpcy5qTy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBjKGEsYil9KX07Cmguc3Vic2NyaWJlPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy52ai5zdWJzY3JpYmUoe25leHQ6YSxlcnJvcjpiLGNvbXBsZXRlOmN9KX07Y3AuaGE9VGMoe1Y6ZHAsTDpjcCxZOiJyb290In0pO2Z1bmN0aW9uIGRwKCl7cmV0dXJuIG5ldyBjcChtZChZbyksbWQoT28pKX07bmV3IGpmO3ZhciBlcD1mdW5jdGlvbigpe307ZXAuaGE9VGMoe0w6ZXAsWToicm9vdCIsVjpmdW5jdGlvbigpe3JldHVybiBuZXcgZnB9fSk7CnZhciBmcD1mdW5jdGlvbigpe3ZhciBhPW1kKExvKSxiPXdpbmRvdyxjPW1kKHVkKTt0aGlzLmRvY3VtZW50PWE7dGhpcy53aW5kb3c9Yjt0aGlzLlpoPWM7dGhpcy5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm5bMCwwXX19LGdwPWZ1bmN0aW9uKGEsYil7YS5vZmZzZXQ9QXJyYXkuaXNBcnJheShiKT9mdW5jdGlvbigpe3JldHVybiBifTpifSxpcD1mdW5jdGlvbihhLGIpe2hwKGEpJiZhLndpbmRvdy5zY3JvbGxUbyhiWzBdLGJbMV0pfSxqcD1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yj1jLmxlZnQrYS53aW5kb3cucGFnZVhPZmZzZXQ7Yz1jLnRvcCthLndpbmRvdy5wYWdlWU9mZnNldDt2YXIgZD1hLm9mZnNldCgpO2Eud2luZG93LnNjcm9sbFRvKGItZFswXSxjLWRbMV0pfSxocD1mdW5jdGlvbihhKXt0cnl7cmV0dXJuISFhLndpbmRvdyYmISFhLndpbmRvdy5zY3JvbGxUb31jYXRjaChiKXtyZXR1cm4hMX19O3ZhciBrcD1mdW5jdGlvbigpe307dChrcCxObyk7dmFyIGxwPWZ1bmN0aW9uKCl7fTt0KGxwLGtwKTtscC5wcm90b3R5cGUuZ2V0UHJvcGVydHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVtiXX07bHAucHJvdG90eXBlLmxvZz1mdW5jdGlvbihhKXt3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nJiZ3aW5kb3cuY29uc29sZS5sb2coYSl9O3ZhciBtcD1mdW5jdGlvbihhLGIsYyl7YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSk7cmV0dXJuIGZ1bmN0aW9uKCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9fTtscC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhLGIpe2EuZGlzcGF0Y2hFdmVudChiKX07bHAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTtyZXR1cm4gYX07bHAucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKGEpe3JldHVybiBhLnZhbHVlfTsKbHAucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fGRvY3VtZW50O3JldHVybiBiLmNyZWF0ZUVsZW1lbnQoYSl9O3ZhciBTbz1mdW5jdGlvbihhLGIpe3JldHVybiJ3aW5kb3ciPT09Yj93aW5kb3c6ImRvY3VtZW50Ij09PWI/YToiYm9keSI9PT1iP2EuYm9keTpudWxsfTtscC5wcm90b3R5cGUueHM9ZnVuY3Rpb24oKXthOntpZighbnAmJihucD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIiksIW5wKSl7dmFyIGE9bnVsbDticmVhayBhfWE9bnAuZ2V0QXR0cmlidXRlKCJocmVmIil9bnVsbD09YT9hPW51bGw6KG9wfHwob3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpKSxvcC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLGE9Ii8iPT09b3AucGF0aG5hbWUuY2hhckF0KDApP29wLnBhdGhuYW1lOiIvIitvcC5wYXRobmFtZSk7cmV0dXJuIGF9O3ZhciBucD1udWxsLG9wO3ZhciBwcD1mdW5jdGlvbigpe307CnBwLnByb3RvdHlwZS5ERT1mdW5jdGlvbihhKXskYy5nZXRBbmd1bGFyVGVzdGFiaWxpdHk9ZnVuY3Rpb24oYixjKXtiPWEuV2woYix2b2lkIDA9PT1jPyEwOmMpO2lmKG51bGw9PWIpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LiIpO3JldHVybiBifTskYy5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKGEuWXAudmFsdWVzKCkpfTskYy5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20oYS5ZcC5rZXlzKCkpfTskYy5mcmFtZXdvcmtTdGFiaWxpemVyc3x8KCRjLmZyYW1ld29ya1N0YWJpbGl6ZXJzPVtdKTskYy5mcmFtZXdvcmtTdGFiaWxpemVycy5wdXNoKGZ1bmN0aW9uKGIpe3ZhciBjPSRjLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzKCksZD1jLmxlbmd0aCxlPSExLGY9ZnVuY3Rpb24oZyl7ZT1lfHxnO2QtLTswPT1kJiZiKGUpfTsKYy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cud2hlblN0YWJsZShmKX0pfSl9O3BwLnByb3RvdHlwZS5XbD1mdW5jdGlvbihhLGIsYyl7aWYobnVsbD09YilyZXR1cm4gbnVsbDt2YXIgZD1hLllwLmdldChiKXx8bnVsbDtyZXR1cm4gbnVsbCE9ZD9kOmM/YiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/dGhpcy5XbChhLGIuaG9zdCwhMCk6dGhpcy5XbChhLGIucGFyZW50RWxlbWVudCwhMCk6bnVsbH07ZnVuY3Rpb24gcXAoKXt9O3ZhciBycD17QXBwbGljYXRpb25SZWY6Zm0sTmdab25lOlR9O2Z1bmN0aW9uIHNwKGEpe3JldHVybiBIbShhKX1mdW5jdGlvbiB0cChhKXtxcChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scnApLHVwKGF8fFtdKSkpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzcH19ZnVuY3Rpb24gdXAoYSl7cmV0dXJuIGEucmVkdWNlKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGJbYy5uYW1lXT1jLkwsYn0se30pfW5ldyBkZDt2YXIgdnA9bmV3IHkoIkV2ZW50TWFuYWdlclBsdWdpbnMiKSx3cD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7dGhpcy5iYj1iO3RoaXMuakI9bmV3IE1hcDthLmZvckVhY2goZnVuY3Rpb24oZCl7cmV0dXJuIGQuRHk9Y30pO3RoaXMuek09YS5zbGljZSgpLnJldmVyc2UoKX07d3AucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnNCKGIpLmFkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTt3cC5wcm90b3R5cGUubXg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLnNCKGIpLm14KGEsYixjKX07CndwLnByb3RvdHlwZS5zQj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmpCLmdldChhKTtpZihiKXJldHVybiBiO2I9dGhpcy56TTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtpZihkLnN1cHBvcnRzKGEpKXJldHVybiB0aGlzLmpCLnNldChhLGQpLGR9dGhyb3cgRXJyb3IoIk5vIGV2ZW50IG1hbmFnZXIgcGx1Z2luIGZvdW5kIGZvciBldmVudCAiK2EpO307dmFyIHhwPWZ1bmN0aW9uKGEpe3RoaXMuRGM9YX07eHAucHJvdG90eXBlLm14PWZ1bmN0aW9uKGEsYixjKXthPVNvKHRoaXMuRGMsYSk7aWYoIWEpdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGV2ZW50IHRhcmdldCAiK2ErIiBmb3IgZXZlbnQgIitiKTtyZXR1cm4gdGhpcy5hZGRFdmVudExpc3RlbmVyKGEsYixjKX07dmFyIHlwPWZ1bmN0aW9uKCl7dGhpcy5Bcj1uZXcgU2V0fSx6cD1mdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTZXQ7Yi5mb3JFYWNoKGZ1bmN0aW9uKGQpe2EuQXIuaGFzKGQpfHwoYS5Bci5hZGQoZCksYy5hZGQoZCkpfSk7YS5RRyhjKX07eXAucHJvdG90eXBlLlFHPWZ1bmN0aW9uKCl7fTt2YXIgQXA9ZnVuY3Rpb24oYSl7dGhpcy5Bcj1uZXcgU2V0O3RoaXMuRGM9YTt0aGlzLkZxPW5ldyBTZXQ7dGhpcy5QRD1uZXcgU2V0O3RoaXMuRnEuYWRkKGEuaGVhZCl9O3QoQXAseXApO0FwLnByb3RvdHlwZS4kej1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7YS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMuRGMuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLnRleHRDb250ZW50PWQ7Yy5QRC5hZGQoYi5hcHBlbmRDaGlsZChlKSl9KX07QXAucHJvdG90eXBlLlFHPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5GcS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBiLiR6KGEsYyl9KX07CkFwLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5QRC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBNby5yZW1vdmUoYSl9KX07dmFyIEJwPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxDcD0vJUNPTVAlL2c7ZnVuY3Rpb24gRHAoYSxiLGMpe2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO0FycmF5LmlzQXJyYXkoZSk/RHAoYSxlLGMpOihlPWUucmVwbGFjZShDcCxhKSxjLnB1c2goZSkpfXJldHVybiBjfWZ1bmN0aW9uIEVwKGEpe3JldHVybiBmdW5jdGlvbihiKXtpZigiX19uZ1Vud3JhcF9fIj09PWIpcmV0dXJuIGE7ITE9PT1hKGIpJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGIucmV0dXJuVmFsdWU9ITEpfX0KdmFyIEdwPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmxvPWE7dGhpcy51bT1iO3RoaXMuYXBwSWQ9Yzt0aGlzLmt0PW5ldyBNYXA7dGhpcy5QeD1uZXcgRnAoYSl9O0dwLnByb3RvdHlwZS5Faj1mdW5jdGlvbihhLGIpe2lmKCFhfHwhYilyZXR1cm4gdGhpcy5QeDtzd2l0Y2goYi5UKXtjYXNlIDA6dmFyIGM9dGhpcy5rdC5nZXQoYi5pZCk7Y3x8KGM9bmV3IEhwKHRoaXMubG8sdGhpcy51bSxiLHRoaXMuYXBwSWQpLHRoaXMua3Quc2V0KGIuaWQsYykpO0ZwLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbChjLGEsYy5YUCwiIik7cmV0dXJuIGM7Y2FzZSAxOmNhc2UgMzpyZXR1cm4gbmV3IElwKHRoaXMubG8sdGhpcy51bSxhLGIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMua3QuaGFzKGIuaWQpfHwoYT1EcChiLmlkLGIuZyxbXSksenAodGhpcy51bSxhKSx0aGlzLmt0LnNldChiLmlkLHRoaXMuUHgpKSx0aGlzLlB4fX07R3AucHJvdG90eXBlLlFoPWZ1bmN0aW9uKCl7fTsKR3AucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe307dmFyIEZwPWZ1bmN0aW9uKGEpe3RoaXMubG89YTt0aGlzLmRhdGE9T2JqZWN0LmNyZWF0ZShudWxsKX07aD1GcC5wcm90b3R5cGU7aC5kZXN0cm95PWZ1bmN0aW9uKCl7fTtoLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQnBbYl18fGIsYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhKX07aC5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGEpe3JldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGEpfTtoLmJvPWZ1bmN0aW9uKGEpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKX07aC5hcHBlbmRDaGlsZD1mdW5jdGlvbihhLGIpe2EuYXBwZW5kQ2hpbGQoYil9O2guaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYixjKXthJiZhLmluc2VydEJlZm9yZShiLGMpfTtoLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEsYil7YSYmYS5yZW1vdmVDaGlsZChiKX07CmgubnA9ZnVuY3Rpb24oYSxiKXt2YXIgYz0ic3RyaW5nIj09PXR5cGVvZiBhP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYSk6YTtpZighYyl0aHJvdyBFcnJvcignVGhlIHNlbGVjdG9yICInK2ErJyIgZGlkIG5vdCBtYXRjaCBhbnkgZWxlbWVudHMnKTtifHwoYy50ZXh0Q29udGVudD0iIik7cmV0dXJuIGN9O2gucGFyZW50Tm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlfTtoLm5leHRTaWJsaW5nPWZ1bmN0aW9uKGEpe3JldHVybiBhLm5leHRTaWJsaW5nfTtoLnNldEF0dHJpYnV0ZT1mdW5jdGlvbihhLGIsYyxkKXtkPyhiPWQrIjoiK2IsKGQ9QnBbZF0pP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpOmEuc2V0QXR0cmlidXRlKGIsYyl9O2gucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGEsYixjKXtpZihjKXt2YXIgZD1CcFtjXTtkP2EucmVtb3ZlQXR0cmlidXRlTlMoZCxiKTphLnJlbW92ZUF0dHJpYnV0ZShjKyI6IitiKX1lbHNlIGEucmVtb3ZlQXR0cmlidXRlKGIpfTsKaC5GbD1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0LmFkZChiKX07aC5tbT1mdW5jdGlvbihhLGIpe2EuY2xhc3NMaXN0LnJlbW92ZShiKX07aC50bT1mdW5jdGlvbihhLGIsYyxkKXtkJjI/YS5zdHlsZS5zZXRQcm9wZXJ0eShiLGMsZCYxPyJpbXBvcnRhbnQiOiIiKTphLnN0eWxlW2JdPWN9O2gubm09ZnVuY3Rpb24oYSxiLGMpe2MmMj9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGIpOmEuc3R5bGVbYl09IiJ9O2guc2V0UHJvcGVydHk9ZnVuY3Rpb24oYSxiLGMpe2FbYl09Y307aC5zZXRWYWx1ZT1mdW5jdGlvbihhLGIpe2Eubm9kZVZhbHVlPWJ9O2guZmM9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiJzdHJpbmciPT09dHlwZW9mIGE/dGhpcy5sby5teChhLGIsRXAoYykpOnRoaXMubG8uYWRkRXZlbnRMaXN0ZW5lcihhLGIsRXAoYykpfTsKdmFyIEhwPWZ1bmN0aW9uKGEsYixjLGQpe0ZwLmNhbGwodGhpcyxhKTt0aGlzLmE9YzthPURwKGQrIi0iK2MuaWQsYy5nLFtdKTt6cChiLGEpO3RoaXMuZVA9Il9uZ2NvbnRlbnQtJUNPTVAlIi5yZXBsYWNlKENwLGQrIi0iK2MuaWQpO3RoaXMuWFA9Il9uZ2hvc3QtJUNPTVAlIi5yZXBsYWNlKENwLGQrIi0iK2MuaWQpfTt0KEhwLEZwKTtIcC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihhLGIpe2E9RnAucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQuY2FsbCh0aGlzLGEsYik7RnAucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsYSx0aGlzLmVQLCIiKTtyZXR1cm4gYX07CnZhciBJcD1mdW5jdGlvbihhLGIsYyxkKXtGcC5jYWxsKHRoaXMsYSk7dGhpcy51bT1iO3RoaXMuWVA9Yzt0aGlzLmE9ZDt0aGlzLnNoYWRvd1Jvb3Q9Mz09PWQuVD9jLmF0dGFjaFNoYWRvdyh7bW9kZToib3BlbiJ9KTpjLmNyZWF0ZVNoYWRvd1Jvb3QoKTthPXRoaXMudW07Yj10aGlzLnNoYWRvd1Jvb3Q7YS4keihhLkFyLGIpO2EuRnEuYWRkKGIpO2Q9RHAoZC5pZCxkLmcsW10pO2ZvcihhPTA7YTxkLmxlbmd0aDthKyspYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGIudGV4dENvbnRlbnQ9ZFthXSx0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoYil9O3QoSXAsRnApO3ZhciBKcD1mdW5jdGlvbihhLGIpe3JldHVybiBiPT09YS5ZUD9hLnNoYWRvd1Jvb3Q6Yn07aD1JcC5wcm90b3R5cGU7aC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy51bS5GcS5kZWxldGUodGhpcy5zaGFkb3dSb290KX07CmguYXBwZW5kQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gRnAucHJvdG90eXBlLmFwcGVuZENoaWxkLmNhbGwodGhpcyxKcCh0aGlzLGEpLGIpfTtoLmluc2VydEJlZm9yZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEZwLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUuY2FsbCh0aGlzLEpwKHRoaXMsYSksYixjKX07aC5yZW1vdmVDaGlsZD1mdW5jdGlvbihhLGIpe3JldHVybiBGcC5wcm90b3R5cGUucmVtb3ZlQ2hpbGQuY2FsbCh0aGlzLEpwKHRoaXMsYSksYil9O2gucGFyZW50Tm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gSnAodGhpcyxGcC5wcm90b3R5cGUucGFyZW50Tm9kZS5jYWxsKHRoaXMsSnAodGhpcyxhKSkpfTt2YXIgS3A9ZnVuY3Rpb24oYSl7dGhpcy5EYz1hfTt0KEtwLHhwKTtLcC5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4hMH07S3AucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyl9fTtLcC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMpfTt2YXIgTHA9e3BhbjohMCxwYW5zdGFydDohMCxwYW5tb3ZlOiEwLHBhbmVuZDohMCxwYW5jYW5jZWw6ITAscGFubGVmdDohMCxwYW5yaWdodDohMCxwYW51cDohMCxwYW5kb3duOiEwLHBpbmNoOiEwLHBpbmNoc3RhcnQ6ITAscGluY2htb3ZlOiEwLHBpbmNoZW5kOiEwLHBpbmNoY2FuY2VsOiEwLHBpbmNoaW46ITAscGluY2hvdXQ6ITAscHJlc3M6ITAscHJlc3N1cDohMCxyb3RhdGU6ITAscm90YXRlc3RhcnQ6ITAscm90YXRlbW92ZTohMCxyb3RhdGVlbmQ6ITAscm90YXRlY2FuY2VsOiEwLHN3aXBlOiEwLHN3aXBlbGVmdDohMCxzd2lwZXJpZ2h0OiEwLHN3aXBldXA6ITAsc3dpcGVkb3duOiEwLHRhcDohMH0sTXA9bmV3IHkoIkhhbW1lckdlc3R1cmVDb25maWciKSxOcD1uZXcgeSgiSGFtbWVyTG9hZGVyIiksT3A9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cz1bXTt0aGlzLllHPXt9fSxQcD1mdW5jdGlvbihhLGIpe2I9bmV3IEhhbW1lcihiLGEub3B0aW9ucyk7Yi5nZXQoInBpbmNoIikuc2V0KHtlbmFibGU6ITB9KTsKYi5nZXQoInJvdGF0ZSIpLnNldCh7ZW5hYmxlOiEwfSk7Zm9yKHZhciBjIGluIGEuWUcpYi5nZXQoYykuc2V0KGEuWUdbY10pO3JldHVybiBifSxRcD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLkRjPWE7dGhpcy5XPWI7dGhpcy5jb25zb2xlPWM7dGhpcy5Saj1kfTt0KFFwLHhwKTtRcC5wcm90b3R5cGUuc3VwcG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIExwLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSl8fC0xPHRoaXMuVy5ldmVudHMuaW5kZXhPZihhKT93aW5kb3cuSGFtbWVyfHx0aGlzLlJqPyEwOih0aGlzLmNvbnNvbGUud2FybignVGhlICInK2ErJyIgZXZlbnQgY2Fubm90IGJlIGJvdW5kIGJlY2F1c2UgSGFtbWVyLkpTIGlzIG5vdCBsb2FkZWQgYW5kIG5vIGN1c3RvbSBsb2FkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLicpLCExKTohMX07ClFwLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLGU9dGhpcy5EeS5iYjtiPWIudG9Mb3dlckNhc2UoKTtpZighd2luZG93LkhhbW1lciYmdGhpcy5Sail7dmFyIGY9ITEsZz1mdW5jdGlvbigpe2Y9ITB9O3RoaXMuUmooKS50aGVuKGZ1bmN0aW9uKCl7d2luZG93LkhhbW1lcj9mfHwoZz1kLmFkZEV2ZW50TGlzdGVuZXIoYSxiLGMpKTooZC5jb25zb2xlLndhcm4oIlRoZSBjdXN0b20gSEFNTUVSX0xPQURFUiBjb21wbGV0ZWQsIGJ1dCBIYW1tZXIuSlMgaXMgbm90IHByZXNlbnQuIiksZz1mdW5jdGlvbigpe30pfSkuY2F0Y2goZnVuY3Rpb24oKXtkLmNvbnNvbGUud2FybignVGhlICInK2IrJyIgZXZlbnQgY2Fubm90IGJlIGJvdW5kIGJlY2F1c2UgdGhlIGN1c3RvbSBIYW1tZXIuSlMgbG9hZGVyIGZhaWxlZC4nKTtnPWZ1bmN0aW9uKCl7fX0pO3JldHVybiBmdW5jdGlvbigpe2coKX19cmV0dXJuIGUub2EoZnVuY3Rpb24oKXt2YXIgbD0KUHAoZC5XLGEpLG09ZnVuY3Rpb24ocCl7ZS5yayhmdW5jdGlvbigpe2MocCl9KX07bC5vbihiLG0pO3JldHVybiBmdW5jdGlvbigpe2wub2ZmKGIsbSk7ImZ1bmN0aW9uIj09PXR5cGVvZiBsLmRlc3Ryb3kmJmwuZGVzdHJveSgpfX0pfTtuZXcgZGQ7dmFyIFJwPVsiYWx0IiwiY29udHJvbCIsIm1ldGEiLCJzaGlmdCJdLFNwPXsiXGIiOiJCYWNrc3BhY2UiLCJcdCI6IlRhYiIsIlx1MDA3ZiI6IkRlbGV0ZSIsIlx1MDAxYiI6IkVzY2FwZSIsRGVsOiJEZWxldGUiLEVzYzoiRXNjYXBlIixMZWZ0OiJBcnJvd0xlZnQiLFJpZ2h0OiJBcnJvd1JpZ2h0IixVcDoiQXJyb3dVcCIsRG93bjoiQXJyb3dEb3duIixNZW51OiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixXaW46Ik9TIn0sVHA9e0E6IjEiLEI6IjIiLEM6IjMiLEQ6IjQiLEU6IjUiLEY6IjYiLEc6IjciLEg6IjgiLEk6IjkiLEo6IioiLEs6IisiLE06Ii0iLE46Ii4iLE86Ii8iLCJgIjoiMCIsIlx1MDA5MCI6Ik51bUxvY2sifSxVcD17YWx0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmFsdEtleX0sY29udHJvbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5jdHJsS2V5fSxtZXRhOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1ldGFLZXl9LHNoaWZ0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnNoaWZ0S2V5fX0sClZwPWZ1bmN0aW9uKGEpe3RoaXMuRGM9YX07dChWcCx4cCk7VnAucHJvdG90eXBlLnN1cHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1XcChhKX07VnAucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVdwKGIpLGU9WHAoZC5mdWxsS2V5LGMsdGhpcy5EeS5iYik7cmV0dXJuIHRoaXMuRHkuYmIub2EoZnVuY3Rpb24oKXtyZXR1cm4gbXAoYSxkLmRvbUV2ZW50TmFtZSxlKX0pfTsKdmFyIFdwPWZ1bmN0aW9uKGEpe3ZhciBiPWEudG9Mb3dlckNhc2UoKS5zcGxpdCgiLiIpO2E9Yi5zaGlmdCgpO2lmKDA9PT1iLmxlbmd0aHx8ImtleWRvd24iIT09YSYmImtleXVwIiE9PWEpcmV0dXJuIG51bGw7dmFyIGM9WXAoYi5wb3AoKSksZD0iIjtScC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPWIuaW5kZXhPZihlKTstMTxmJiYoYi5zcGxpY2UoZiwxKSxkKz1lKyIuIil9KTtkKz1jO2lmKDAhPWIubGVuZ3RofHwwPT09Yy5sZW5ndGgpcmV0dXJuIG51bGw7YT17ZG9tRXZlbnROYW1lOmF9O2EuZnVsbEtleT1kO3JldHVybiBhfSwkcD1mdW5jdGlvbihhKXt2YXIgYj0iIixjPVpwKGEpO2M9Yy50b0xvd2VyQ2FzZSgpOyIgIj09PWM/Yz0ic3BhY2UiOiIuIj09PWMmJihjPSJkb3QiKTtScC5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QhPWMmJigwLFVwW2RdKShhKSYmKGIrPWQrIi4iKX0pO3JldHVybiBiKz1jfSxYcD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpeyRwKGQpPT09CmEmJmMucmsoZnVuY3Rpb24oKXtyZXR1cm4gYihkKX0pfX0sWXA9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImVzYyI6cmV0dXJuImVzY2FwZSI7ZGVmYXVsdDpyZXR1cm4gYX19O2Z1bmN0aW9uIFpwKGEpe3ZhciBiPWEua2V5O2lmKG51bGw9PWIpe2I9YS5rZXlJZGVudGlmaWVyO2lmKG51bGw9PWIpcmV0dXJuIlVuaWRlbnRpZmllZCI7Yi5zdGFydHNXaXRoKCJVKyIpJiYoYj1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGIuc3Vic3RyaW5nKDIpLDE2KSksMz09PWEubG9jYXRpb24mJlRwLmhhc093blByb3BlcnR5KGIpJiYoYj1UcFtiXSkpfXJldHVybiBTcFtiXXx8Yn07dmFyIGFxPWZ1bmN0aW9uKCl7fTthcS5oYT1UYyh7VjpmdW5jdGlvbigpe3JldHVybiBtZChicSl9LEw6YXEsWToicm9vdCJ9KTt2YXIgYnE9ZnVuY3Rpb24oYSl7dGhpcy5EYz1hfTt0KGJxLGFxKTtoPWJxLnByb3RvdHlwZTsKaC5HaT1mdW5jdGlvbihhLGIpe2lmKG51bGw9PWIpcmV0dXJuIG51bGw7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gYjtjYXNlIDE6aWYoQmQoYiwiSFRNTCIpKXZhciBjPUFkKGIpO2Vsc2UgYTp7Yj1TdHJpbmcoYik7YT1udWxsO3RyeXtmZT1mZXx8bmV3IENkKHRoaXMuRGMpO3ZhciBkPWI/U3RyaW5nKGIpOiIiO2E9ZmUuZnkoZCk7Yj01O3ZhciBlPWQ7ZG97aWYoMD09PWIpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzYW5pdGl6ZSBodG1sIGJlY2F1c2UgdGhlIGlucHV0IGlzIHVuc3RhYmxlIik7Yi0tO2Q9ZTtlPWEuaW5uZXJIVE1MO2E9ZmUuZnkoZCl9d2hpbGUoZCE9PWUpO3ZhciBmPW5ldyBhZSxnPShnZShhKXx8YSkuZmlyc3RDaGlsZDtmb3IoZD0hMDtnOyl7aWYoZy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXtiPWc7dmFyIGw9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKFVkLmhhc093blByb3BlcnR5KGwpKXtmLkZnLnB1c2goIjwiKTtmLkZnLnB1c2gobCk7CnZhciBtPWIuYXR0cmlidXRlcztmb3IoYj0wO2I8bS5sZW5ndGg7YisrKXt2YXIgcD1tLml0ZW0oYikscT1wLm5hbWUscj1xLnRvTG93ZXJDYXNlKCk7aWYoWmQuaGFzT3duUHJvcGVydHkocikpe3ZhciB2PXAudmFsdWU7VmRbcl0mJih2PUpkKHYpKTtXZFtyXSYmKHY9S2QodikpO2YuRmcucHVzaCgiICIscSwnPSInLGVlKHYpLCciJyl9ZWxzZSBmLnN0PSEwfWYuRmcucHVzaCgiPiIpO2Q9ITB9ZWxzZSBmLnN0PSEwLGQ9ISRkLmhhc093blByb3BlcnR5KGwpfWVsc2UgZy5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP2YuRmcucHVzaChlZShnLm5vZGVWYWx1ZSkpOmYuc3Q9ITA7aWYoZCYmZy5maXJzdENoaWxkKWc9Zy5maXJzdENoaWxkO2Vsc2UgZm9yKDtnOyl7aWYoZy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgdz1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7VWQuaGFzT3duUHJvcGVydHkodykmJiFOZC5oYXNPd25Qcm9wZXJ0eSh3KSYmKGYuRmcucHVzaCgiPC8iKSwKZi5GZy5wdXNoKHcpLGYuRmcucHVzaCgiPiIpKX12YXIgeD1iZShnLGcubmV4dFNpYmxpbmcpO2lmKHgpe2c9eDticmVha31nPWJlKGcsZy5wYXJlbnROb2RlKX19dmFyIHU9Zi5GZy5qb2luKCIiKTtHZCgpJiZmLnN0JiZjb25zb2xlLndhcm4oIldBUk5JTkc6IHNhbml0aXppbmcgSFRNTCBzdHJpcHBlZCBzb21lIGNvbnRlbnQsIHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MiKTtjPXU7YnJlYWsgYX1maW5hbGx5e2lmKGEpZm9yKGY9Z2UoYSl8fGE7Zi5maXJzdENoaWxkOylmLnJlbW92ZUNoaWxkKGYuZmlyc3RDaGlsZCl9Yz12b2lkIDB9cmV0dXJuIGM7Y2FzZSAyOnJldHVybiBCZChiLCJTdHlsZSIpP0FkKGIpOmI7Y2FzZSAzOmlmKEJkKGIsIlNjcmlwdCIpKXJldHVybiBBZChiKTt0aHJvdyBFcnJvcigidW5zYWZlIHZhbHVlIHVzZWQgaW4gYSBzY3JpcHQgY29udGV4dCIpO2Nhc2UgNDpyZXR1cm4gYiBpbnN0YW5jZW9mIHZkJiZiLmdldFR5cGVOYW1lKCksQmQoYiwiVVJMIik/CkFkKGIpOkpkKFN0cmluZyhiKSk7Y2FzZSA1OmlmKEJkKGIsIlJlc291cmNlVVJMIikpcmV0dXJuIEFkKGIpO3Rocm93IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgU2VjdXJpdHlDb250ZXh0ICIrYSsiIChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpO319O2gudng9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB3ZChhKX07aC54eD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IHhkKGEpfTtoLnl4PWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgeWQoYSl9O2gud3g9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyB6ZChhKX07YnEuaGE9VGMoe1Y6ZnVuY3Rpb24oKXt2YXIgYT1tZChnZCk7cmV0dXJuIG5ldyBicShhLmdldChMbykpfSxMOmJxLFk6InJvb3QifSk7ZnVuY3Rpb24gY3EoKXtyZXR1cm4gbmV3IHVkfXZhciBkcT1lbShhbywiYnJvd3NlciIsW3tZYTpOZSxrZDoiYnJvd3NlciJ9LHtZYTpNZSxrZDpmdW5jdGlvbigpe3ZhciBhPW5ldyBscDtNb3x8KE1vPWEpO0VrPW5ldyBwcH0sQ0c6ITB9LHtZYTpMbyxHcDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudH0sS2E6W119XSksZXE9ZnVuY3Rpb24oYSl7aWYoYSl0aHJvdyBFcnJvcigiQnJvd3Nlck1vZHVsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gSWYgeW91IG5lZWQgYWNjZXNzIHRvIGNvbW1vbiBkaXJlY3RpdmVzIHN1Y2ggYXMgTmdJZiBhbmQgTmdGb3IgZnJvbSBhIGxhenkgbG9hZGVkIG1vZHVsZSwgaW1wb3J0IENvbW1vbk1vZHVsZSBpbnN0ZWFkLiIpO307bmV3IGpmO3ZhciBmcT1mdW5jdGlvbihhKXt0aGlzLlJmPW5ldyBicShhKX07dChmcSxhcSk7ZnEuaGE9YXEuaGE7aD1mcS5wcm90b3R5cGU7aC5HaT1mdW5jdGlvbihhLGIpe2lmKG51bGw9PWIpcmV0dXJuIG51bGw7aWYoYiBpbnN0YW5jZW9mIGdvfHxiIGluc3RhbmNlb2YgaW98fGIgaW5zdGFuY2VvZiBib3x8YiBpbnN0YW5jZW9mIGVvKXtpZihncShiLGEpKXJldHVybiB0aGlzLlJmLkdpKGEsaHEodGhpcyxiKSk7dGhyb3cgRXJyb3IoIlJlcXVpcmVkIGEgc2FmZSB2YWx1ZSBmb3IgIitoZVthXSsiLCBnb3QgIitiKyIgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpIik7fXJldHVybiB0aGlzLlJmLkdpKGEsYil9O2gudng9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUmYudngoYSl9O2gueHg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUmYueHgoYSl9O2gueXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUmYueXgoYSl9O2gud3g9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUmYud3goYSl9Owp2YXIgaHE9ZnVuY3Rpb24oYSxiKXtpZihudWxsIT1iKXtpZihiIGluc3RhbmNlb2YgYm8pcmV0dXJuIGEuUmYudngobG8oYikpO2lmKGIgaW5zdGFuY2VvZiBpbylyZXR1cm4gYS5SZi55eChubyhiKSk7aWYoYiBpbnN0YW5jZW9mIGdvKXJldHVybiBhLlJmLnd4KG9vKGIpKTtpZihiIGluc3RhbmNlb2YgZW8pcmV0dXJuIGEuUmYueHgobW8oYikpfXJldHVybiBudWxsfSxncT1mdW5jdGlvbihhLGIpe3N3aXRjaChiKXtjYXNlIDE6cmV0dXJuIGEgaW5zdGFuY2VvZiBibztjYXNlIDQ6cmV0dXJuIGEgaW5zdGFuY2VvZiBpb3x8YSBpbnN0YW5jZW9mIGdvO2Nhc2UgNTpyZXR1cm4gYSBpbnN0YW5jZW9mIGdvO2Nhc2UgMjpyZXR1cm4gYSBpbnN0YW5jZW9mIGVvO2Nhc2UgMzpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiExfX07dmFyIGlxPWZ1bmN0aW9uKCl7fTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKIEB0eXBlIHtzdHJpbmd9CiovCmZ1bmN0aW9uIGpxKGEsYil7dmFyIGM9W107InN0cmluZyI9PXR5cGVvZiBhP2Euc3BsaXQoL1xzKixccyovKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2E6e3ZhciBlPWQ7aWYoIjoiPT1lWzBdKXtkPWtxKGUsYik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGQpe2MucHVzaChkKTtkPXZvaWQgMDticmVhayBhfWU9ZH1kPWUubWF0Y2goL14oXCp8Wy1cd10rKVxzKig8P1s9LV0+KVxzKihcKnxbLVx3XSspJC8pO2lmKG51bGw9PWR8fDQ+ZC5sZW5ndGgpYi5wdXNoKCdUaGUgcHJvdmlkZWQgdHJhbnNpdGlvbiBleHByZXNzaW9uICInK2UrJyIgaXMgbm90IHN1cHBvcnRlZCcpLGQ9YztlbHNle2U9ZFsxXTt2YXIgZj1kWzJdO2Q9ZFszXTtjLnB1c2gobHEoZSxkKSk7IjwiIT1mWzBdfHwiKiI9PWUmJiIqIj09ZHx8Yy5wdXNoKGxxKGQsZSkpO2Q9dm9pZCAwfX1yZXR1cm4gZH0pOmMucHVzaChhKTtyZXR1cm4gY30KZnVuY3Rpb24ga3EoYSxiKXtzd2l0Y2goYSl7Y2FzZSAiOmVudGVyIjpyZXR1cm4idm9pZCA9PiAqIjtjYXNlICI6bGVhdmUiOnJldHVybiIqID0+IHZvaWQiO2Nhc2UgIjppbmNyZW1lbnQiOnJldHVybiBmdW5jdGlvbihjLGQpe3JldHVybiBwYXJzZUZsb2F0KGQpPnBhcnNlRmxvYXQoYyl9O2Nhc2UgIjpkZWNyZW1lbnQiOnJldHVybiBmdW5jdGlvbihjLGQpe3JldHVybiBwYXJzZUZsb2F0KGQpPHBhcnNlRmxvYXQoYyl9O2RlZmF1bHQ6cmV0dXJuIGIucHVzaCgnVGhlIHRyYW5zaXRpb24gYWxpYXMgdmFsdWUgIicrYSsnIiBpcyBub3Qgc3VwcG9ydGVkJyksIiogPT4gKiJ9fXZhciBtcT1uZXcgU2V0KFsidHJ1ZSIsIjEiXSksbnE9bmV3IFNldChbImZhbHNlIiwiMCJdKTsKZnVuY3Rpb24gbHEoYSxiKXt2YXIgYz1tcS5oYXMoYSl8fG5xLmhhcyhhKSxkPW1xLmhhcyhiKXx8bnEuaGFzKGIpO3JldHVybiBmdW5jdGlvbihlLGYpe3ZhciBnPSIqIj09YXx8YT09ZSxsPSIqIj09Ynx8Yj09ZjshZyYmYyYmImJvb2xlYW4iPT09dHlwZW9mIGUmJihnPWU/bXEuaGFzKGEpOm5xLmhhcyhhKSk7IWwmJmQmJiJib29sZWFuIj09PXR5cGVvZiBmJiYobD1mP21xLmhhcyhiKTpucS5oYXMoYikpO3JldHVybiBnJiZsfX07dmFyIG9xPWZ1bmN0aW9uKCl7fSxwcT1mdW5jdGlvbigpe307LyoKCiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgoKIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiBAcGFyYW0ge2Z1bmN0aW9uKCk6ID99IGNiCiBAcmV0dXJuIHt2b2lkfQoqLwp2YXIgcXE9ZnVuY3Rpb24oYSxiKXt0aGlzLmRjPVtdO3RoaXMuZWM9W107dGhpcy5XYz1bXTt0aGlzLm1kPXRoaXMuYWE9dGhpcy53ZD0hMTt0aGlzLmNrPW51bGw7dGhpcy50b3RhbFRpbWU9KHZvaWQgMD09PWE/MDphKSsodm9pZCAwPT09Yj8wOmIpfTtoPXFxLnByb3RvdHlwZTtoLmNmPWZ1bmN0aW9uKCl7dGhpcy5tZHx8KHRoaXMubWQ9ITAsdGhpcy5kYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KSx0aGlzLmRjPVtdKX07aC5MZT1mdW5jdGlvbihhKXt0aGlzLmVjLnB1c2goYSl9O2guZWQ9ZnVuY3Rpb24oYSl7dGhpcy5kYy5wdXNoKGEpfTtoLlZhPWZ1bmN0aW9uKGEpe3RoaXMuV2MucHVzaChhKX07aC5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLndkfTtoLmluaXQ9ZnVuY3Rpb24oKXt9O2gucGxheT1mdW5jdGlvbigpe3RoaXMuY2UoKXx8KHRoaXMucW4oKSxycSh0aGlzKSk7dGhpcy53ZD0hMH07dmFyIHJxPWZ1bmN0aW9uKGEpe1Byb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2YoKX0pfTsKaD1xcS5wcm90b3R5cGU7aC5xbj1mdW5jdGlvbigpe3RoaXMuZWMuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYSgpfSk7dGhpcy5lYz1bXX07aC5wYXVzZT1mdW5jdGlvbigpe307aC5GaT1mdW5jdGlvbigpe307aC5maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLmNmKCl9O2guZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYWF8fCh0aGlzLmFhPSEwLHRoaXMuY2UoKXx8dGhpcy5xbigpLHRoaXMuZmluaXNoKCksdGhpcy5XYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KSx0aGlzLldjPVtdKX07aC5yZXNldD1mdW5jdGlvbigpe307aC5zZXRQb3NpdGlvbj1mdW5jdGlvbigpe307aC5MaT1mdW5jdGlvbihhKXthPSJzdGFydCI9PWE/dGhpcy5lYzp0aGlzLmRjO2EuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYigpfSk7YS5sZW5ndGg9MH07dmFyIHNxPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5kYz1bXTt0aGlzLmVjPVtdO3RoaXMuYWE9dGhpcy53ZD10aGlzLm1kPSExO3RoaXMuV2M9W107dGhpcy5jaz1udWxsO3RoaXMudG90YWxUaW1lPTA7dGhpcy5FYT1hO3ZhciBjPTAsZD0wLGU9MCxmPXRoaXMuRWEubGVuZ3RoOzA9PWY/UHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYi5jZigpfSk6dGhpcy5FYS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cuZWQoZnVuY3Rpb24oKXsrK2M9PWYmJmIuY2YoKX0pO2cuVmEoZnVuY3Rpb24oKXsrK2Q9PWYmJmIuTUMoKX0pO2cuTGUoZnVuY3Rpb24oKXsrK2U9PWYmJmIucW4oKX0pfSk7dGhpcy50b3RhbFRpbWU9dGhpcy5FYS5yZWR1Y2UoZnVuY3Rpb24oZyxsKXtyZXR1cm4gTWF0aC5tYXgoZyxsLnRvdGFsVGltZSl9LDApfTtoPXNxLnByb3RvdHlwZTsKaC5jZj1mdW5jdGlvbigpe3RoaXMubWR8fCh0aGlzLm1kPSEwLHRoaXMuZGMuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYSgpfSksdGhpcy5kYz1bXSl9O2guaW5pdD1mdW5jdGlvbigpe3RoaXMuRWEuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYS5pbml0KCl9KX07aC5MZT1mdW5jdGlvbihhKXt0aGlzLmVjLnB1c2goYSl9O2gucW49ZnVuY3Rpb24oKXt0aGlzLmNlKCl8fCh0aGlzLndkPSEwLHRoaXMuZWMuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYSgpfSksdGhpcy5lYz1bXSl9O2guZWQ9ZnVuY3Rpb24oYSl7dGhpcy5kYy5wdXNoKGEpfTtoLlZhPWZ1bmN0aW9uKGEpe3RoaXMuV2MucHVzaChhKX07aC5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLndkfTtoLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmNrfHx0aGlzLmluaXQoKTt0aGlzLnFuKCk7dGhpcy5FYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLnBsYXkoKX0pfTtoLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5FYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLnBhdXNlKCl9KX07CmguRmk9ZnVuY3Rpb24oKXt0aGlzLkVhLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEuRmkoKX0pfTtoLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuY2YoKTt0aGlzLkVhLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmluaXNoKCl9KX07aC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5NQygpfTtoLk1DPWZ1bmN0aW9uKCl7dGhpcy5hYXx8KHRoaXMuYWE9ITAsdGhpcy5jZigpLHRoaXMuRWEuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYS5kZXN0cm95KCl9KSx0aGlzLldjLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEoKX0pLHRoaXMuV2M9W10pfTtoLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5FYS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLnJlc2V0KCl9KTt0aGlzLndkPXRoaXMubWQ9dGhpcy5hYT0hMX07Cmguc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9YSp0aGlzLnRvdGFsVGltZTt0aGlzLkVhLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5zZXRQb3NpdGlvbihjLnRvdGFsVGltZT9NYXRoLm1pbigxLGIvYy50b3RhbFRpbWUpOjEpfSl9O2guSmw9ZnVuY3Rpb24oKXt0aGlzLkVhLmZvckVhY2goZnVuY3Rpb24oYSl7YS5KbCYmYS5KbCgpfSl9O2guTGk9ZnVuY3Rpb24oYSl7YT0ic3RhcnQiPT1hP3RoaXMuZWM6dGhpcy5kYzthLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGIoKX0pO2EubGVuZ3RoPTB9O2Z1bmN0aW9uIHRxKCl7cmV0dXJuInVuZGVmaW5lZCIhPT10eXBlb2YgcHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChwcm9jZXNzKX1mdW5jdGlvbiB1cShhKXtzd2l0Y2goYS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHFxO2Nhc2UgMTpyZXR1cm4gYVswXTtkZWZhdWx0OnJldHVybiBuZXcgc3EoYSl9fQpmdW5jdGlvbiB2cShhLGIsYyl7Yj12b2lkIDA9PT1iP3t9OmI7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9W10sZT1bXSxmPS0xLGc9bnVsbDthLmZvckVhY2goZnVuY3Rpb24obCl7dmFyIG09bC5vZmZzZXQscD1tPT1mLHE9cCYmZ3x8e307T2JqZWN0LmtleXMobCkuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgdj1yLHc9bFtyXTtpZigib2Zmc2V0IiE9PXIpc3dpdGNoKHY9d3Eodiksdyl7Y2FzZSAiISI6dz1iW3JdO2JyZWFrO2Nhc2UgIioiOnc9Y1tyXTticmVhaztkZWZhdWx0OnZhciB4PSIiLHU9dy50b1N0cmluZygpLnRyaW0oKTtpZih4cVt2XSYmMCE9PXcmJiIwIiE9PXcpaWYoIm51bWJlciI9PT10eXBlb2Ygdyl4PSJweCI7ZWxzZXt2YXIgRD13Lm1hdGNoKC9eWystXT9bXGRcLl0rKFthLXpdKikkLyk7RCYmMD09RFsxXS5sZW5ndGgmJmQucHVzaCgiUGxlYXNlIHByb3ZpZGUgYSBDU1MgdW5pdCB2YWx1ZSBmb3IgIityKyI6Iit3KX13PXUreH1xW3ZdPXd9KTtwfHxlLnB1c2gocSk7Cmc9cTtmPW19KTtpZihkLmxlbmd0aCl0aHJvdyBFcnJvcigiVW5hYmxlIHRvIGFuaW1hdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxuIC0gIitkLmpvaW4oIlxuIC0gIikpO3JldHVybiBlfWZ1bmN0aW9uIHlxKGEsYixjLGQpe3N3aXRjaChiKXtjYXNlICJzdGFydCI6YS5MZShmdW5jdGlvbigpe3JldHVybiBkKGMmJnpxKGMsInN0YXJ0IixhKSl9KTticmVhaztjYXNlICJkb25lIjphLmVkKGZ1bmN0aW9uKCl7cmV0dXJuIGQoYyYmenEoYywiZG9uZSIsYSkpfSk7YnJlYWs7Y2FzZSAiZGVzdHJveSI6YS5WYShmdW5jdGlvbigpe3JldHVybiBkKGMmJnpxKGMsImRlc3Ryb3kiLGEpKX0pfX1mdW5jdGlvbiB6cShhLGIsYyl7dmFyIGQ9Yy50b3RhbFRpbWU7Yj1BcShhLmVsZW1lbnQsYS5IZCxhLmNkLGEuaWIsYnx8YS5idCx2b2lkIDA9PWQ/YS50b3RhbFRpbWU6ZCxjLmRpc2FibGVkPyEwOiExKTthPWEuX2RhdGE7bnVsbCE9YSYmKGIuX2RhdGE9YSk7cmV0dXJuIGJ9CmZ1bmN0aW9uIEFxKGEsYixjLGQsZSxmLGcpe3JldHVybntlbGVtZW50OmEsSGQ6YixjZDpjLGliOmQsYnQ6dm9pZCAwPT09ZT8iIjplLHRvdGFsVGltZTp2b2lkIDA9PT1mPzA6ZixkaXNhYmxlZDohIWd9fWZ1bmN0aW9uIEJxKGEsYixjKXt2YXIgZDthIGluc3RhbmNlb2YgTWFwPyhkPWEuZ2V0KGIpKXx8YS5zZXQoYixkPWMpOihkPWFbYl0pfHwoZD1hW2JdPWMpO3JldHVybiBkfWZ1bmN0aW9uIENxKGEpe3ZhciBiPWEuaW5kZXhPZigiOiIpO3JldHVyblthLnN1YnN0cmluZygxLGIpLGEuc3Vic3RyKGIrMSldfXZhciBEcT1mdW5jdGlvbigpe3JldHVybiExfSxFcT1mdW5jdGlvbigpe3JldHVybiExfSxGcT1mdW5jdGlvbigpe3JldHVybltdfSxHcT10cSgpOwppZihHcXx8InVuZGVmaW5lZCIhPT10eXBlb2YgRWxlbWVudClEcT1mdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbnRhaW5zKGIpfSxFcT1mdW5jdGlvbigpe2lmKEdxfHxFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzKXJldHVybiBmdW5jdGlvbihjLGQpe3JldHVybiBjLm1hdGNoZXMoZCl9O3ZhciBhPUVsZW1lbnQucHJvdG90eXBlLGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiP2Z1bmN0aW9uKGMsZCl7cmV0dXJuIGIuYXBwbHkoYyxbZF0pfTpFcX0oKSxGcT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9W107Yz9kLnB1c2guYXBwbHkoZCxqYShhLnF1ZXJ5U2VsZWN0b3JBbGwoYikpKTooYT1hLnF1ZXJ5U2VsZWN0b3IoYikpJiZkLnB1c2goYSk7cmV0dXJuIGR9O3ZhciBIcT1udWxsLElxPSExOwpmdW5jdGlvbiBKcShhKXtIcXx8KEhxPSgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmJvZHk6bnVsbCl8fHt9LElxPUhxLnN0eWxlPyJXZWJraXRBcHBlYXJhbmNlImluIEhxLnN0eWxlOiExKTt2YXIgYj0hMDtIcS5zdHlsZSYmImVia2l0IiE9YS5zdWJzdHJpbmcoMSw2KSYmKGI9YSBpbiBIcS5zdHlsZSwhYiYmSXEmJihiPSJXZWJraXQiK2EuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHIoMSlpbiBIcS5zdHlsZSkpO3JldHVybiBifWZ1bmN0aW9uIEtxKGEpe3ZhciBiPXt9O09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCIkMS0kMiIpO2JbZF09YVtjXX0pO3JldHVybiBifTtmdW5jdGlvbiBMcShhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7YT1hLm1hdGNoKC9eKC0/W1wuXGRdKykobT9zKS8pO3JldHVybiFhfHwyPmEubGVuZ3RoPzA6TXEocGFyc2VGbG9hdChhWzFdKSxhWzJdKX1mdW5jdGlvbiBNcShhLGIpe3N3aXRjaChiKXtjYXNlICJzIjpyZXR1cm4gMUUzKmE7ZGVmYXVsdDpyZXR1cm4gYX19CmZ1bmN0aW9uIE5xKGEsYixjKXtpZighYS5oYXNPd25Qcm9wZXJ0eSgiZHVyYXRpb24iKSlhOnt2YXIgZD0vXigtP1tcLlxkXSspKG0/cykoPzpccysoLT9bXC5cZF0rKShtP3MpKT8oPzpccysoWy1hLXpdKyg/OlwoLis/XCkpPykpPyQvaSxlPTAsZj0iIjtpZigic3RyaW5nIj09PXR5cGVvZiBhKXt2YXIgZz1hLm1hdGNoKGQpO2lmKG51bGw9PT1nKXtiLnB1c2goJ1RoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIicrYSsnIiBpcyBpbnZhbGlkLicpO2E9e2R1cmF0aW9uOjAsZGVsYXk6MCxlYXNpbmc6IiJ9O2JyZWFrIGF9ZD1NcShwYXJzZUZsb2F0KGdbMV0pLGdbMl0pO3ZhciBsPWdbM107bnVsbCE9bCYmKGU9TXEocGFyc2VGbG9hdChsKSxnWzRdKSk7KGc9Z1s1XSkmJihmPWcpfWVsc2UgZD1hO2N8fChjPSExLGc9Yi5sZW5ndGgsMD5kJiYoYi5wdXNoKCJEdXJhdGlvbiB2YWx1ZXMgYmVsb3cgMCBhcmUgbm90IGFsbG93ZWQgZm9yIHRoaXMgYW5pbWF0aW9uIHN0ZXAuIiksYz0hMCksCjA+ZSYmKGIucHVzaCgiRGVsYXkgdmFsdWVzIGJlbG93IDAgYXJlIG5vdCBhbGxvd2VkIGZvciB0aGlzIGFuaW1hdGlvbiBzdGVwLiIpLGM9ITApLGMmJmIuc3BsaWNlKGcsMCwnVGhlIHByb3ZpZGVkIHRpbWluZyB2YWx1ZSAiJythKyciIGlzIGludmFsaWQuJykpO2E9e2R1cmF0aW9uOmQsZGVsYXk6ZSxlYXNpbmc6Zn19cmV0dXJuIGF9ZnVuY3Rpb24gT3EoYSxiKXtiPXZvaWQgMD09PWI/e306YjtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109YVtjXX0pO3JldHVybiBifWZ1bmN0aW9uIFBxKGEsYixjKXtjPXZvaWQgMD09PWM/e306YztpZihiKWZvcih2YXIgZCBpbiBhKWNbZF09YVtkXTtlbHNlIE9xKGEsYyk7cmV0dXJuIGN9CmZ1bmN0aW9uIFFxKGEpe2Zvcih2YXIgYj0iIixjPTA7YzxhLnN0eWxlLmxlbmd0aDtjKyspe3ZhciBkPWEuc3R5bGUuaXRlbShjKSxlPWEuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShkKTtiKz1lP2QrIjoiK2UrIjsiOiIifWZvcih2YXIgZiBpbiBhLnN0eWxlKWEuc3R5bGUuaGFzT3duUHJvcGVydHkoZikmJiFmLnN0YXJ0c1dpdGgoIl8iKSYmKGM9Zi5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksZD1hLnN0eWxlW2ZdLGIrPWQ/YysiOiIrZCsiOyI6IiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsYil9ZnVuY3Rpb24gUnEoYSxiLGMpe2Euc3R5bGUmJihPYmplY3Qua2V5cyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPXdxKGQpO2MmJiFjLmhhc093blByb3BlcnR5KGQpJiYoY1tkXT1hLnN0eWxlW2VdKTthLnN0eWxlW2VdPWJbZF19KSx0cSgpJiZRcShhKSl9CmZ1bmN0aW9uIFNxKGEsYil7YS5zdHlsZSYmKE9iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7Yz13cShjKTthLnN0eWxlW2NdPSIifSksdHEoKSYmUXEoYSkpfWZ1bmN0aW9uIFRxKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpPzE9PWEubGVuZ3RoP2FbMF06e3R5cGU6MixqZTphLG9wdGlvbnM6bnVsbH06YX1mdW5jdGlvbiBVcShhLGIsYyl7dmFyIGQ9Yi5wYXJhbXN8fHt9O2E9VnEoYSk7YS5sZW5ndGgmJmEuZm9yRWFjaChmdW5jdGlvbihlKXtkLmhhc093blByb3BlcnR5KGUpfHxjLnB1c2goIlVuYWJsZSB0byByZXNvbHZlIHRoZSBsb2NhbCBhbmltYXRpb24gcGFyYW0gIitlKyIgaW4gdGhlIGdpdmVuIGxpc3Qgb2YgdmFsdWVzIil9KX12YXIgV3E9L3t7XHMqKC4rPylccyp9fS9nOwpmdW5jdGlvbiBWcShhKXt2YXIgYj1bXTtpZigic3RyaW5nIj09PXR5cGVvZiBhKXtmb3IodmFyIGM7Yz1XcS5leGVjKGEpOyliLnB1c2goY1sxXSk7V3EubGFzdEluZGV4PTB9cmV0dXJuIGJ9ZnVuY3Rpb24gWHEoYSxiLGMpe3ZhciBkPWEudG9TdHJpbmcoKSxlPWQucmVwbGFjZShXcSxmdW5jdGlvbihmLGcpe3ZhciBsPWJbZ107Yi5oYXNPd25Qcm9wZXJ0eShnKXx8KGMucHVzaCgiUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBwYXJhbSAiK2cpLGw9IiIpO3JldHVybiBsLnRvU3RyaW5nKCl9KTtyZXR1cm4gZT09ZD9hOmV9ZnVuY3Rpb24gWXEoYSl7Zm9yKHZhciBiPVtdLGM9YS5uZXh0KCk7IWMuZG9uZTspYi5wdXNoKGMudmFsdWUpLGM9YS5uZXh0KCk7cmV0dXJuIGJ9dmFyIFpxPS8tKyhbYS16MC05XSkvZzsKZnVuY3Rpb24gd3EoYSl7cmV0dXJuIGEucmVwbGFjZShacSxmdW5jdGlvbihiKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTBdPWFyZ3VtZW50c1tkXTtyZXR1cm4gY1sxXS50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gJHEoYSxiLGMpe3ZhciBkPU9iamVjdC5rZXlzKGMpO2lmKGQubGVuZ3RoJiZiLmxlbmd0aCl7dmFyIGU9YlswXSxmPVtdO2QuZm9yRWFjaChmdW5jdGlvbihsKXtlLmhhc093blByb3BlcnR5KGwpfHxmLnB1c2gobCk7ZVtsXT1jW2xdfSk7aWYoZi5sZW5ndGgpe2Q9e307Zm9yKHZhciBnPTE7ZzxiLmxlbmd0aDtkPXtTdDpkLlN0fSxnKyspZC5TdD1iW2ddLGYuZm9yRWFjaChmdW5jdGlvbihsKXtyZXR1cm4gZnVuY3Rpb24obSl7bC5TdFttXT1hcihhLG0pfX0oZCkpfX1yZXR1cm4gYn0KZnVuY3Rpb24gYnIoYSxiLGMpe3N3aXRjaChiLnR5cGUpe2Nhc2UgNzpyZXR1cm4gYS5FSShiLGMpO2Nhc2UgMDpyZXR1cm4gYS5SeihiLGMpO2Nhc2UgMTpyZXR1cm4gYS5TeihiLGMpO2Nhc2UgMjpyZXR1cm4gYS5DSShiLGMpO2Nhc2UgMzpyZXR1cm4gYS5BSShiLGMpO2Nhc2UgNDpyZXR1cm4gYS54SShiLGMpO2Nhc2UgNTpyZXR1cm4gYS5OdChiLGMpO2Nhc2UgNjpyZXR1cm4gYS5JcChiLGMpO2Nhc2UgODpyZXR1cm4gYS5PdChiLGMpO2Nhc2UgOTpyZXR1cm4gYS55SShiLGMpO2Nhc2UgMTA6cmV0dXJuIGEuekkoYixjKTtjYXNlIDExOnJldHVybiBhLkJJKGIsYyk7Y2FzZSAxMjpyZXR1cm4gYS5ESShiLGMpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIGFuaW1hdGlvbiBtZXRhZGF0YSBub2RlICMiK2IudHlwZSk7fX1mdW5jdGlvbiBhcihhLGIpe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKVtiXX07dmFyIGNyPS9zKjpzZWxmcyosPy9nLGRyPWZ1bmN0aW9uKGEpe3RoaXMuUmM9YX07aD1kci5wcm90b3R5cGU7aC5Baj1mdW5jdGlvbihhLGIpe2I9bmV3IGVyKGIpO3RoaXMudkQoYik7cmV0dXJuIGJyKHRoaXMsVHEoYSksYil9O2gudkQ9ZnVuY3Rpb24oYSl7YS5QbD0iIjthLllyPXt9O2EuWXJbIiJdPXt9O2EuY3VycmVudFRpbWU9MH07CmguRUk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yi5EaT0wLGU9Yi5TZj0wLGY9W10sZz1bXTsiQCI9PWEubmFtZS5jaGFyQXQoMCkmJmIuZXJyb3JzLnB1c2goImFuaW1hdGlvbiB0cmlnZ2VycyBjYW5ub3QgYmUgcHJlZml4ZWQgd2l0aCBhbiBgQGAgc2lnbiAoZS5nLiB0cmlnZ2VyKCdAZm9vJywgWy4uLl0pKSIpO2EuamYuZm9yRWFjaChmdW5jdGlvbihsKXtjLnZEKGIpO2lmKDA9PWwudHlwZSl7dmFyIG09bC5uYW1lO20udG9TdHJpbmcoKS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goZnVuY3Rpb24ocCl7bC5uYW1lPXA7Zi5wdXNoKGMuUnoobCxiKSl9KTtsLm5hbWU9bX1lbHNlIDE9PWwudHlwZT8obT1jLlN6KGwsYiksZCs9bS5EaSxlKz1tLlNmLGcucHVzaChtKSk6Yi5lcnJvcnMucHVzaCgib25seSBzdGF0ZSgpIGFuZCB0cmFuc2l0aW9uKCkgZGVmaW5pdGlvbnMgY2FuIHNpdCBpbnNpZGUgb2YgYSB0cmlnZ2VyKCkiKX0pO3JldHVybnt0eXBlOjcsbmFtZTphLm5hbWUsCnprOmYsRGs6ZyxEaTpkLFNmOmUsb3B0aW9uczpudWxsfX07aC5Sej1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuSXAoYS5nLGIpLGQ9YS5vcHRpb25zJiZhLm9wdGlvbnMucGFyYW1zfHxudWxsO2lmKGMuZFApe3ZhciBlPW5ldyBTZXQsZj1kfHx7fTtjLmcuZm9yRWFjaChmdW5jdGlvbihsKXtmcihsKSYmT2JqZWN0LmtleXMobCkuZm9yRWFjaChmdW5jdGlvbihtKXtWcShsW21dKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2YuaGFzT3duUHJvcGVydHkocCl8fGUuYWRkKHApfSl9KX0pO2lmKGUuc2l6ZSl7dmFyIGc9WXEoZS52YWx1ZXMoKSk7Yi5lcnJvcnMucHVzaCgnc3RhdGUoIicrYS5uYW1lKyciLCAuLi4pIG11c3QgZGVmaW5lIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdGhlIGZvbGxvd2luZyBzdHlsZSBzdWJzdGl0dXRpb25zOiAnK2cuam9pbigiLCAiKSl9fXJldHVybnt0eXBlOjAsbmFtZTphLm5hbWUsc3R5bGU6YyxvcHRpb25zOmQ/e3BhcmFtczpkfTpudWxsfX07CmguU3o9ZnVuY3Rpb24oYSxiKXtiLkRpPTA7Yi5TZj0wO3ZhciBjPWJyKHRoaXMsVHEoYS5hbmltYXRpb24pLGIpO3JldHVybnt0eXBlOjEsdUc6anEoYS56YyxiLmVycm9ycyksYW5pbWF0aW9uOmMsRGk6Yi5EaSxTZjpiLlNmLG9wdGlvbnM6Z3IoYS5vcHRpb25zKX19O2guQ0k9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3JldHVybnt0eXBlOjIsamU6YS5qZS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGJyKGMsZCxiKX0pLG9wdGlvbnM6Z3IoYS5vcHRpb25zKX19O2guQUk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yi5jdXJyZW50VGltZSxlPTAsZj1hLmplLm1hcChmdW5jdGlvbihnKXtiLmN1cnJlbnRUaW1lPWQ7Zz1icihjLGcsYik7ZT1NYXRoLm1heChlLGIuY3VycmVudFRpbWUpO3JldHVybiBnfSk7Yi5jdXJyZW50VGltZT1lO3JldHVybnt0eXBlOjMsamU6ZixvcHRpb25zOmdyKGEub3B0aW9ucyl9fTsKaC54ST1mdW5jdGlvbihhLGIpe3ZhciBjPWhyKGEua2IsYi5lcnJvcnMpO2IuemU9Yzt2YXIgZD1hLmc/YS5nOnt0eXBlOjYsZzp7fSxvZmZzZXQ6bnVsbH07aWYoNT09ZC50eXBlKWE9dGhpcy5OdChkLGIpO2Vsc2V7ZD1hLmc7YT0hMTtkfHwoYT0hMCxkPXt9LGMuZWFzaW5nJiYoZC5lYXNpbmc9Yy5lYXNpbmcpLGQ9e3R5cGU6NixnOmQsb2Zmc2V0Om51bGx9KTtiLmN1cnJlbnRUaW1lKz1jLmR1cmF0aW9uK2MuZGVsYXk7dmFyIGU9dGhpcy5JcChkLGIpO2UuaVE9YTthPWV9Yi56ZT1udWxsO3JldHVybnt0eXBlOjQsa2I6YyxzdHlsZTphLG9wdGlvbnM6bnVsbH19O2guSXA9ZnVuY3Rpb24oYSxiKXthPXRoaXMuQkMoYSxiKTt0aGlzLnVFKGEsYik7cmV0dXJuIGF9OwpoLkJDPWZ1bmN0aW9uKGEsYil7dmFyIGM9W107QXJyYXkuaXNBcnJheShhLmcpP2EuZy5mb3JFYWNoKGZ1bmN0aW9uKGYpeyJzdHJpbmciPT10eXBlb2YgZj8iKiI9PWY/Yy5wdXNoKGYpOmIuZXJyb3JzLnB1c2goIlRoZSBwcm92aWRlZCBzdHlsZSBzdHJpbmcgdmFsdWUgIitmKyIgaXMgbm90IGFsbG93ZWQuIik6Yy5wdXNoKGYpfSk6Yy5wdXNoKGEuZyk7dmFyIGQ9ITEsZT1udWxsO2MuZm9yRWFjaChmdW5jdGlvbihmKXtpZihmcihmKSl7dmFyIGc9Zi5lYXNpbmc7ZyYmKGU9ZyxkZWxldGUgZi5lYXNpbmcpO2lmKCFkKWZvcih2YXIgbCBpbiBmKWlmKDA8PWZbbF0udG9TdHJpbmcoKS5pbmRleE9mKCJ7eyIpKXtkPSEwO2JyZWFrfX19KTtyZXR1cm57dHlwZTo2LGc6YyxlYXNpbmc6ZSxvZmZzZXQ6YS5vZmZzZXQsZFA6ZCxvcHRpb25zOm51bGx9fTsKaC51RT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD1iLnplLGU9Yi5jdXJyZW50VGltZSxmPWIuY3VycmVudFRpbWU7ZCYmMDxmJiYoZi09ZC5kdXJhdGlvbitkLmRlbGF5KTthLmcuZm9yRWFjaChmdW5jdGlvbihnKXsic3RyaW5nIiE9dHlwZW9mIGcmJk9iamVjdC5rZXlzKGcpLmZvckVhY2goZnVuY3Rpb24obCl7aWYoYy5SYy5zSShsKSl7dmFyIG09Yi5ZcltiLlBsXSxwPW1bbF0scT0hMDtwJiYoZiE9ZSYmZj49cC5zdGFydFRpbWUmJmU8PXAuZW5kVGltZSYmKGIuZXJyb3JzLnB1c2goJ1RoZSBDU1MgcHJvcGVydHkgIicrbCsnIiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJytwLnN0YXJ0VGltZSsnbXMiIGFuZCAiJytwLmVuZFRpbWUrJ21zIiBpcyBhbHNvIGJlaW5nIGFuaW1hdGVkIGluIGEgcGFyYWxsZWwgYW5pbWF0aW9uIGJldHdlZW4gdGhlIHRpbWVzIG9mICInK2YrJ21zIiBhbmQgIicrZSsnbXMiJykscT0hMSksZj1wLnN0YXJ0VGltZSk7cSYmKG1bbF09CntzdGFydFRpbWU6ZixlbmRUaW1lOmV9KTtiLm9wdGlvbnMmJlVxKGdbbF0sYi5vcHRpb25zLGIuZXJyb3JzKX1lbHNlIGIuZXJyb3JzLnB1c2goJ1RoZSBwcm92aWRlZCBhbmltYXRpb24gcHJvcGVydHkgIicrbCsnIiBpcyBub3QgYSBzdXBwb3J0ZWQgQ1NTIHByb3BlcnR5IGZvciBhbmltYXRpb25zJyl9KX0pfTsKaC5OdD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD17dHlwZTo1LGc6W10sb3B0aW9uczpudWxsfTtpZighYi56ZSlyZXR1cm4gYi5lcnJvcnMucHVzaCgia2V5ZnJhbWVzKCkgbXVzdCBiZSBwbGFjZWQgaW5zaWRlIG9mIGEgY2FsbCB0byBhbmltYXRlKCkiKSxkO3ZhciBlPTAsZj1bXSxnPSExLGw9ITEsbT0wLHA9YS5qZS5tYXAoZnVuY3Rpb24odSl7dT1jLkJDKHUsYik7dmFyIEQ9bnVsbCE9dS5vZmZzZXQ/dS5vZmZzZXQ6aXIodS5nKSxIPTA7bnVsbCE9RCYmKGUrKyxIPXUub2Zmc2V0PUQpO2w9bHx8MD5IfHwxPEg7Zz1nfHxIPG07bT1IO2YucHVzaChIKTtyZXR1cm4gdX0pO2wmJmIuZXJyb3JzLnB1c2goIlBsZWFzZSBlbnN1cmUgdGhhdCBhbGwga2V5ZnJhbWUgb2Zmc2V0cyBhcmUgYmV0d2VlbiAwIGFuZCAxIik7ZyYmYi5lcnJvcnMucHVzaCgiUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBpbiBvcmRlciIpO2E9YS5qZS5sZW5ndGg7dmFyIHE9CjA7MDxlJiZlPGE/Yi5lcnJvcnMucHVzaCgiTm90IGFsbCBzdHlsZSgpIHN0ZXBzIHdpdGhpbiB0aGUgZGVjbGFyZWQga2V5ZnJhbWVzKCkgY29udGFpbiBvZmZzZXRzIik6MD09ZSYmKHE9MS8oYS0xKSk7dmFyIHI9YS0xLHY9Yi5jdXJyZW50VGltZSx3PWIuemUseD13LmR1cmF0aW9uO3AuZm9yRWFjaChmdW5jdGlvbih1LEQpe0Q9MDxxP0Q9PXI/MTpxKkQ6ZltEXTt2YXIgSD1EKng7Yi5jdXJyZW50VGltZT12K3cuZGVsYXkrSDt3LmR1cmF0aW9uPUg7Yy51RSh1LGIpO3Uub2Zmc2V0PUQ7ZC5nLnB1c2godSl9KTtyZXR1cm4gZH07aC5PdD1mdW5jdGlvbihhLGIpe3JldHVybnt0eXBlOjgsYW5pbWF0aW9uOmJyKHRoaXMsVHEoYS5hbmltYXRpb24pLGIpLG9wdGlvbnM6Z3IoYS5vcHRpb25zKX19O2gueUk9ZnVuY3Rpb24oYSxiKXtiLlNmKys7cmV0dXJue3R5cGU6OSxvcHRpb25zOmdyKGEub3B0aW9ucyl9fTsKaC56ST1mdW5jdGlvbihhLGIpe3JldHVybnt0eXBlOjEwLGFuaW1hdGlvbjp0aGlzLk90KGEuYW5pbWF0aW9uLGIpLG9wdGlvbnM6Z3IoYS5vcHRpb25zKX19O2guQkk9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLlBsLGQ9YS5vcHRpb25zfHx7fTtiLkRpKys7Yi5OeD1hO3ZhciBlPW4oanIoYS5pZSkpLGY9ZS5uZXh0KCkudmFsdWU7ZT1lLm5leHQoKS52YWx1ZTtiLlBsPWMubGVuZ3RoP2MrIiAiK2Y6ZjtCcShiLllyLGIuUGwse30pO3ZhciBnPWJyKHRoaXMsVHEoYS5hbmltYXRpb24pLGIpO2IuTng9bnVsbDtiLlBsPWM7cmV0dXJue3R5cGU6MTEsaWU6ZixsaW1pdDpkLmxpbWl0fHwwLG9wdGlvbmFsOiEhZC5vcHRpb25hbCxjUTplLGFuaW1hdGlvbjpnLEhROmEuaWUsb3B0aW9uczpncihhLm9wdGlvbnMpfX07CmguREk9ZnVuY3Rpb24oYSxiKXtiLk54fHxiLmVycm9ycy5wdXNoKCJzdGFnZ2VyKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgcXVlcnkoKSIpO3ZhciBjPSJmdWxsIj09PWEua2I/e2R1cmF0aW9uOjAsZGVsYXk6MCxlYXNpbmc6ImZ1bGwifTpOcShhLmtiLGIuZXJyb3JzLCEwKTtyZXR1cm57dHlwZToxMixhbmltYXRpb246YnIodGhpcyxUcShhLmFuaW1hdGlvbiksYiksa2I6YyxvcHRpb25zOm51bGx9fTtmdW5jdGlvbiBqcihhKXt2YXIgYj1hLnNwbGl0KC9ccyosXHMqLykuZmluZChmdW5jdGlvbihjKXtyZXR1cm4iOnNlbGYiPT1jfSk/ITA6ITE7YiYmKGE9YS5yZXBsYWNlKGNyLCIiKSk7YT1hLnJlcGxhY2UoL0BcKi9nLCIubmctdHJpZ2dlciIpLnJlcGxhY2UoL0BcdysvZyxmdW5jdGlvbihjKXtyZXR1cm4iLm5nLXRyaWdnZXItIitjLnN1YnN0cigxKX0pLnJlcGxhY2UoLzphbmltYXRpbmcvZywiLm5nLWFuaW1hdGluZyIpO3JldHVyblthLGJdfQp2YXIgZXI9ZnVuY3Rpb24oYSl7dGhpcy5lcnJvcnM9YTt0aGlzLlNmPXRoaXMuRGk9MDt0aGlzLnplPXRoaXMuUGw9dGhpcy5OeD1udWxsO3RoaXMuY3VycmVudFRpbWU9MDt0aGlzLllyPXt9O3RoaXMub3B0aW9ucz1udWxsfTtmdW5jdGlvbiBpcihhKXtpZigic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIG51bGw7dmFyIGI9bnVsbDtBcnJheS5pc0FycmF5KGEpP2EuZm9yRWFjaChmdW5jdGlvbihjKXtmcihjKSYmYy5oYXNPd25Qcm9wZXJ0eSgib2Zmc2V0IikmJihiPXBhcnNlRmxvYXQoYy5vZmZzZXQpLGRlbGV0ZSBjLm9mZnNldCl9KTpmcihhKSYmYS5oYXNPd25Qcm9wZXJ0eSgib2Zmc2V0IikmJihiPXBhcnNlRmxvYXQoYS5vZmZzZXQpLGRlbGV0ZSBhLm9mZnNldCk7cmV0dXJuIGJ9ZnVuY3Rpb24gZnIoYSl7cmV0dXJuIUFycmF5LmlzQXJyYXkoYSkmJiJvYmplY3QiPT10eXBlb2YgYX0KZnVuY3Rpb24gaHIoYSxiKXt2YXIgYz1udWxsO2lmKGEuaGFzT3duUHJvcGVydHkoImR1cmF0aW9uIikpYz1hO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybntkdXJhdGlvbjpOcShhLGIpLmR1cmF0aW9uLGRlbGF5OjAsZWFzaW5nOiIifTtpZihhLnNwbGl0KC9ccysvKS5zb21lKGZ1bmN0aW9uKGQpe3JldHVybiJ7Ij09ZC5jaGFyQXQoMCkmJiJ7Ij09ZC5jaGFyQXQoMSl9KSlyZXR1cm4gYj17ZHVyYXRpb246MCxkZWxheTowLGVhc2luZzoiIix2UDohMH0sYi5xUj1hLGI7Yz1jfHxOcShhLGIpO3JldHVybntkdXJhdGlvbjpjLmR1cmF0aW9uLGRlbGF5OmMuZGVsYXksZWFzaW5nOmMuZWFzaW5nfX1mdW5jdGlvbiBncihhKXtpZihhKXtpZihhPU9xKGEpLGEucGFyYW1zKXt2YXIgYj1hO3ZhciBjPShjPWEucGFyYW1zKT9PcShjKTpudWxsO2IucGFyYW1zPWN9fWVsc2UgYT17fTtyZXR1cm4gYX07ZnVuY3Rpb24ga3IoYSxiLGMsZCxlLGYsZyxsKXtyZXR1cm57dHlwZToxLGVsZW1lbnQ6YSxSZzpiLGttOmMsZms6ZCxkdXJhdGlvbjplLGRlbGF5OmYsdG90YWxUaW1lOmUrZixlYXNpbmc6dm9pZCAwPT09Zz9udWxsOmcsc1I6dm9pZCAwPT09bD8hMTpsfX07dmFyIGxyPWZ1bmN0aW9uKCl7dGhpcy5rbD1uZXcgTWFwfTtsci5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5rbC5nZXQoYSk7Y3x8dGhpcy5rbC5zZXQoYSxjPVtdKTtjLnB1c2guYXBwbHkoYyxqYShiKSl9O2xyLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMua2wuaGFzKGEpfTtsci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmtsLmNsZWFyKCl9O3ZhciBtcj0vOmVudGVyL2csbnI9LzpsZWF2ZS9nO2Z1bmN0aW9uIG9yKGEsYixjLGQsZSxmLGcsbCxtLHApe2Y9dm9pZCAwPT09Zj97fTpmO2c9dm9pZCAwPT09Zz97fTpnO3A9dm9pZCAwPT09cD9bXTpwO3JldHVybihuZXcgcHIpLlRyKGEsYixjLGQsZSxmLGcsbCxtLHApfXZhciBwcj1mdW5jdGlvbigpe307aD1wci5wcm90b3R5cGU7CmguVHI9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsLG0scCl7cD12b2lkIDA9PT1wP1tdOnA7bT1tfHxuZXcgbHI7YT1uZXcgcXIoYSxiLG0sZCxlLHAsW10pO2Eub3B0aW9ucz1sO3JyKGEucWEsW2ZdLG51bGwsYS5lcnJvcnMsbCk7YnIodGhpcyxjLGEpO2M9YS5naC5maWx0ZXIoZnVuY3Rpb24ocSl7cmV0dXJuIHEuZ0YoKX0pO2MubGVuZ3RoJiZPYmplY3Qua2V5cyhnKS5sZW5ndGgmJihmPWNbYy5sZW5ndGgtMV0sZi5QQSE9PWYuQ2N8fHJyKGYsW2ddLG51bGwsYS5lcnJvcnMsbCkpO3JldHVybiBjLmxlbmd0aD9jLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS5UcigpfSk6W2tyKGIsW10sW10sW10sMCwwLCIiLCExKV19O2guRUk9ZnVuY3Rpb24oKXt9O2guUno9ZnVuY3Rpb24oKXt9O2guU3o9ZnVuY3Rpb24oKXt9OwpoLnlJPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5aSDt2YXIgZD1iLmVsZW1lbnQ7dmFyIGU9Yy5rbC5nZXQoZCk7ZT9jLmtsLmRlbGV0ZShkKTplPVtdO2lmKGQ9ZSllPXNyKGIsYS5vcHRpb25zKSxjPWIucWEuY3VycmVudFRpbWUsZD10aGlzLnBPKGQsZSxlLm9wdGlvbnMpLGMhPWQmJnRyKGIsZCk7Yi5wcmV2aW91c05vZGU9YX07aC56ST1mdW5jdGlvbihhLGIpe3ZhciBjPXNyKGIsYS5vcHRpb25zKTt0cihjKTt0aGlzLk90KGEuYW5pbWF0aW9uLGMpO3RyKGIsYy5xYS5jdXJyZW50VGltZSk7Yi5wcmV2aW91c05vZGU9YX07CmgucE89ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIucWEuY3VycmVudFRpbWUsZT1udWxsIT1jLmR1cmF0aW9uP0xxKGMuZHVyYXRpb24pOm51bGwsZj1udWxsIT1jLmRlbGF5P0xxKGMuZGVsYXkpOm51bGw7MCE9PWUmJmEuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD17ZHVyYXRpb246bnVsbCE9ZT9lOmcuZHVyYXRpb24sZGVsYXk6Yi5xYS5jdXJyZW50VGltZSsobnVsbCE9Zj9mOjApK2cuZGVsYXksZWFzaW5nOiIifTtnPW5ldyB1cihiLlJjLGcuZWxlbWVudCxnLlJnLGcua20sZy5mayxsLGcuclIpO2IuZ2gucHVzaChnKTtkPU1hdGgubWF4KGQsbC5kdXJhdGlvbitsLmRlbGF5KX0pO3JldHVybiBkfTtoLk90PWZ1bmN0aW9uKGEsYil7dnIoYixhLm9wdGlvbnMsITApO2JyKHRoaXMsYS5hbmltYXRpb24sYik7Yi5wcmV2aW91c05vZGU9YX07CmguQ0k9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9Yi56eixlPWIsZj1hLm9wdGlvbnM7ZiYmKGYucGFyYW1zfHxmLmRlbGF5KSYmKGU9c3IoYixmKSx0cihlKSxudWxsIT1mLmRlbGF5JiYoNj09ZS5wcmV2aW91c05vZGUudHlwZSYmKHdyKGUucWEpLGUucHJldmlvdXNOb2RlPXhyKSxmPUxxKGYuZGVsYXkpLGUuUmwoZikpKTthLmplLmxlbmd0aCYmKGEuamUuZm9yRWFjaChmdW5jdGlvbihnKXtyZXR1cm4gYnIoYyxnLGUpfSkseXIoZS5xYSksZS56ej5kJiZ0cihlKSk7Yi5wcmV2aW91c05vZGU9YX07CmguQUk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLGQ9W10sZT1iLnFhLmN1cnJlbnRUaW1lLGY9YS5vcHRpb25zJiZhLm9wdGlvbnMuZGVsYXk/THEoYS5vcHRpb25zLmRlbGF5KTowO2EuamUuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD1zcihiLGEub3B0aW9ucyk7ZiYmbC5SbChmKTticihjLGcsbCk7ZT1NYXRoLm1heChlLGwucWEuY3VycmVudFRpbWUpO2QucHVzaChsLnFhKX0pO2QuZm9yRWFjaChmdW5jdGlvbihnKXtyZXR1cm4genIoYi5xYSxnKX0pO3RyKGIsZSk7Yi5wcmV2aW91c05vZGU9YX07aC5xTz1mdW5jdGlvbihhLGIpe3JldHVybiBhLnZQPyhhPWEucVIsYT1iLnBhcmFtcz9YcShhLGIucGFyYW1zLGIuZXJyb3JzKTphLE5xKGEsYi5lcnJvcnMpKTp7ZHVyYXRpb246YS5kdXJhdGlvbixkZWxheTphLmRlbGF5LGVhc2luZzphLmVhc2luZ319OwpoLnhJPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi56ZT10aGlzLnFPKGEua2IsYiksZD1iLnFhO2MuZGVsYXkmJihBcihiLnFhLGIucWEuZHVyYXRpb24rYy5kZWxheSksd3IoZCkpO3ZhciBlPWEuc3R5bGU7NT09ZS50eXBlP3RoaXMuTnQoZSxiKTooQXIoYi5xYSxiLnFhLmR1cmF0aW9uK2MuZHVyYXRpb24pLHRoaXMuSXAoZSxiKSx5cihkKSk7Yi56ZT1udWxsO2IucHJldmlvdXNOb2RlPWF9O2guSXA9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnFhLGQ9Yi56ZTshZCYmT2JqZWN0LmtleXMoYy5DYykubGVuZ3RoJiYoYy5kdXJhdGlvbis9MSxjLkR2KCkpO2Q9ZCYmZC5lYXNpbmd8fGEuZWFzaW5nO2EuaVE/QnIoYyxkKTpycihjLGEuZyxkLGIuZXJyb3JzLGIub3B0aW9ucyk7Yi5wcmV2aW91c05vZGU9YX07CmguTnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnplLGQ9Yi5xYS5kdXJhdGlvbixlPWMuZHVyYXRpb24sZj1zcihiKS5xYTtmLmVhc2luZz1jLmVhc2luZzthLmcuZm9yRWFjaChmdW5jdGlvbihnKXtBcihmLChnLm9mZnNldHx8MCkqZSk7cnIoZixnLmcsZy5lYXNpbmcsYi5lcnJvcnMsYi5vcHRpb25zKTt5cihmKX0pO3pyKGIucWEsZik7dHIoYixkK2UpO2IucHJldmlvdXNOb2RlPWF9OwpoLkJJPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPWIucWEuY3VycmVudFRpbWUsZT1hLm9wdGlvbnN8fHt9LGY9ZS5kZWxheT9McShlLmRlbGF5KTowO2YmJig2PT09Yi5wcmV2aW91c05vZGUudHlwZXx8MD09ZCYmT2JqZWN0LmtleXMoYi5xYS5DYykubGVuZ3RoKSYmKHdyKGIucWEpLGIucHJldmlvdXNOb2RlPXhyKTt2YXIgZz1kO2Q9T3IoYixhLmllLGEuSFEsYS5saW1pdCxhLmNRLGUub3B0aW9uYWw/ITA6ITEsYi5lcnJvcnMpO2IuZW89ZC5sZW5ndGg7dmFyIGw9bnVsbDtkLmZvckVhY2goZnVuY3Rpb24obSxwKXtiLmNvPXA7cD1zcihiLGEub3B0aW9ucyxtKTtmJiZwLlJsKGYpO209PT1iLmVsZW1lbnQmJihsPXAucWEpO2JyKGMsYS5hbmltYXRpb24scCk7eXIocC5xYSk7Zz1NYXRoLm1heChnLHAucWEuY3VycmVudFRpbWUpfSk7Yi5jbz0wO2IuZW89MDt0cihiLGcpO2wmJih6cihiLnFhLGwpLHdyKGIucWEpKTtiLnByZXZpb3VzTm9kZT1hfTsKaC5EST1mdW5jdGlvbihhLGIpe3ZhciBjPWIuWkcsZD1iLnFhLGU9YS5rYixmPU1hdGguYWJzKGUuZHVyYXRpb24pLGc9ZiooYi5lby0xKTtmKj1iLmNvO3N3aXRjaCgwPmUuZHVyYXRpb24/InJldmVyc2UiOmUuZWFzaW5nKXtjYXNlICJyZXZlcnNlIjpmPWctZjticmVhaztjYXNlICJmdWxsIjpmPWMubUZ9ZT1iLnFhO2YmJmUuUmwoZik7ZT1lLmN1cnJlbnRUaW1lO2JyKHRoaXMsYS5hbmltYXRpb24sYik7Yi5wcmV2aW91c05vZGU9YTtjLm1GPWQuY3VycmVudFRpbWUtZSsoZC5zdGFydFRpbWUtYy5xYS5zdGFydFRpbWUpfTsKdmFyIHhyPXt9LHFyPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7dGhpcy5SYz1hO3RoaXMuZWxlbWVudD1iO3RoaXMuWkg9Yzt0aGlzLmhCPWQ7dGhpcy55Qz1lO3RoaXMuZXJyb3JzPWY7dGhpcy5naD1nO3RoaXMuemU9dGhpcy5aRz1udWxsO3RoaXMucHJldmlvdXNOb2RlPXhyO3RoaXMueno9MDt0aGlzLm9wdGlvbnM9e307dGhpcy5tRj10aGlzLmVvPXRoaXMuY289MDt0aGlzLnFhPWx8fG5ldyBQcih0aGlzLlJjLGIsMCk7Zy5wdXNoKHRoaXMucWEpfSx2cj1mdW5jdGlvbihhLGIsYyl7aWYoYil7dmFyIGQ9YS5vcHRpb25zO251bGwhPWIuZHVyYXRpb24mJihkLmR1cmF0aW9uPUxxKGIuZHVyYXRpb24pKTtudWxsIT1iLmRlbGF5JiYoZC5kZWxheT1McShiLmRlbGF5KSk7dmFyIGU9Yi5wYXJhbXM7aWYoZSl7dmFyIGY9ZC5wYXJhbXM7Znx8KGY9YS5vcHRpb25zLnBhcmFtcz17fSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihnKXtjJiZmLmhhc093blByb3BlcnR5KGcpfHwKKGZbZ109WHEoZVtnXSxmLGEuZXJyb3JzKSl9KX19fTtxci5wcm90b3R5cGUuJEo9ZnVuY3Rpb24oKXt2YXIgYT17fTtpZih0aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5wYXJhbXM7aWYoYil7dmFyIGM9YS5wYXJhbXM9e307T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihkKXtjW2RdPWJbZF19KX19cmV0dXJuIGF9O3ZhciBzcj1mdW5jdGlvbihhLGIsYyl7Yj12b2lkIDA9PT1iP251bGw6YjtjPWN8fGEuZWxlbWVudDtjPW5ldyBxcihhLlJjLGMsYS5aSCxhLmhCLGEueUMsYS5lcnJvcnMsYS5naCxhLnFhLkNlKGMsMCkpO2MucHJldmlvdXNOb2RlPWEucHJldmlvdXNOb2RlO2MuemU9YS56ZTtjLm9wdGlvbnM9YS4kSigpO3ZyKGMsYik7Yy5jbz1hLmNvO2MuZW89YS5lbztjLlpHPWE7YS56eisrO3JldHVybiBjfSx0cj1mdW5jdGlvbihhLGIpe2EucHJldmlvdXNOb2RlPXhyO2EucWE9YS5xYS5DZShhLmVsZW1lbnQsYik7YS5naC5wdXNoKGEucWEpfTsKcXIucHJvdG90eXBlLlJsPWZ1bmN0aW9uKGEpezA8YSYmdGhpcy5xYS5SbChhKX07dmFyIE9yPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBsPVtdO2UmJmwucHVzaChhLmVsZW1lbnQpOzA8Yi5sZW5ndGgmJihiPWIucmVwbGFjZShtciwiLiIrYS5oQiksYj1iLnJlcGxhY2UobnIsIi4iK2EueUMpLGE9YS5SYy5xdWVyeShhLmVsZW1lbnQsYiwxIT1kKSwwIT09ZCYmKGE9MD5kP2Euc2xpY2UoYS5sZW5ndGgrZCxhLmxlbmd0aCk6YS5zbGljZSgwLGQpKSxsLnB1c2guYXBwbHkobCxqYShhKSkpO2Z8fDAhPWwubGVuZ3RofHxnLnB1c2goJ2BxdWVyeSgiJytjKyciKWAgcmV0dXJuZWQgemVybyBlbGVtZW50cy4gKFVzZSBgcXVlcnkoIicrYysnIiwgeyBvcHRpb25hbDogdHJ1ZSB9KWAgaWYgeW91IHdpc2ggdG8gYWxsb3cgdGhpcy4pJyk7cmV0dXJuIGx9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFyLnByb3RvdHlwZSx7cGFyYW1zOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnBhcmFtc319fSk7dmFyIFByPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuUmM9YTt0aGlzLmVsZW1lbnQ9Yjt0aGlzLnN0YXJ0VGltZT1jO3RoaXMuV209ZDt0aGlzLmR1cmF0aW9uPTA7dGhpcy5qdz17fTt0aGlzLkNjPXt9O3RoaXMuZ2w9bmV3IE1hcDt0aGlzLnpyPXt9O3RoaXMud249e307dGhpcy5hcT17fTt0aGlzLlBBPW51bGw7dGhpcy5XbXx8KHRoaXMuV209bmV3IE1hcCk7dGhpcy53aD1PYmplY3QuY3JlYXRlKHRoaXMuYXEse30pO3RoaXMucWg9dGhpcy5XbS5nZXQoYik7dGhpcy5xaHx8KHRoaXMucWg9dGhpcy53aCx0aGlzLldtLnNldChiLHRoaXMud2gpKTt0aGlzLkR2KCl9OwpQci5wcm90b3R5cGUuZ0Y9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5nbC5zaXplKXtjYXNlIDA6cmV0dXJuITE7Y2FzZSAxOnJldHVybiAwPE9iamVjdC5rZXlzKHRoaXMuQ2MpLmxlbmd0aDtkZWZhdWx0OnJldHVybiEwfX07UHIucHJvdG90eXBlLlJsPWZ1bmN0aW9uKGEpe3ZhciBiPTE9PXRoaXMuZ2wuc2l6ZSYmT2JqZWN0LmtleXModGhpcy53bikubGVuZ3RoO3RoaXMuZHVyYXRpb258fGI/KEFyKHRoaXMsdGhpcy5jdXJyZW50VGltZSthKSxiJiZ3cih0aGlzKSk6dGhpcy5zdGFydFRpbWUrPWF9O1ByLnByb3RvdHlwZS5DZT1mdW5jdGlvbihhLGIpe3lyKHRoaXMpO3JldHVybiBuZXcgUHIodGhpcy5SYyxhLGJ8fHRoaXMuY3VycmVudFRpbWUsdGhpcy5XbSl9OwpQci5wcm90b3R5cGUuRHY9ZnVuY3Rpb24oKXt0aGlzLkNjJiYodGhpcy5qdz10aGlzLkNjKTt0aGlzLkNjPXRoaXMuZ2wuZ2V0KHRoaXMuZHVyYXRpb24pO3RoaXMuQ2N8fCh0aGlzLkNjPU9iamVjdC5jcmVhdGUodGhpcy5hcSx7fSksdGhpcy5nbC5zZXQodGhpcy5kdXJhdGlvbix0aGlzLkNjKSl9O3ZhciBBcj1mdW5jdGlvbihhLGIpe3lyKGEpO2EuZHVyYXRpb249YjthLkR2KCl9O1ByLnByb3RvdHlwZS5leD1mdW5jdGlvbihhLGIpe3RoaXMud2hbYV09Yjt0aGlzLnFoW2FdPWI7dGhpcy56clthXT17dGltZTp0aGlzLmN1cnJlbnRUaW1lLHZhbHVlOmJ9fTsKdmFyIEJyPWZ1bmN0aW9uKGEsYil7YiYmKGEuancuZWFzaW5nPWIpO09iamVjdC5rZXlzKGEucWgpLmZvckVhY2goZnVuY3Rpb24oYyl7YS5hcVtjXT1hLnFoW2NdfHwiKiI7YS5DY1tjXT0iKiJ9KTthLlBBPWEuQ2N9LHJyPWZ1bmN0aW9uKGEsYixjLGQsZSl7YyYmKGEuancuZWFzaW5nPWMpO3ZhciBmPWUmJmUucGFyYW1zfHx7fSxnPVFyKGIsYS5xaCk7T2JqZWN0LmtleXMoZykuZm9yRWFjaChmdW5jdGlvbihsKXt2YXIgbT1YcShnW2xdLGYsZCk7YS53bltsXT1tO2Eud2guaGFzT3duUHJvcGVydHkobCl8fChhLmFxW2xdPWEucWguaGFzT3duUHJvcGVydHkobCk/YS5xaFtsXToiKiIpO2EuZXgobCxtKX0pfSx5cj1mdW5jdGlvbihhKXt2YXIgYj1hLnduLGM9T2JqZWN0LmtleXMoYik7MCE9Yy5sZW5ndGgmJihhLnduPXt9LGMuZm9yRWFjaChmdW5jdGlvbihkKXthLkNjW2RdPWJbZF19KSxPYmplY3Qua2V5cyhhLndoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2EuQ2MuaGFzT3duUHJvcGVydHkoZCl8fAooYS5DY1tkXT1hLndoW2RdKX0pKX0sd3I9ZnVuY3Rpb24oYSl7T2JqZWN0LmtleXMoYS53aCkuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgYz1hLndoW2JdO2Eud25bYl09YzthLmV4KGIsYyl9KX0senI9ZnVuY3Rpb24oYSxiKXtPYmplY3Qua2V5cyhiLnpyKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWEuenJbY10sZT1iLnpyW2NdOyghZHx8ZS50aW1lPmQudGltZSkmJmEuZXgoYyxlLnZhbHVlKX0pfTsKUHIucHJvdG90eXBlLlRyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt5cih0aGlzKTt2YXIgYj1uZXcgU2V0LGM9bmV3IFNldCxkPTE9PT10aGlzLmdsLnNpemUmJjA9PT10aGlzLmR1cmF0aW9uLGU9W107dGhpcy5nbC5mb3JFYWNoKGZ1bmN0aW9uKHAscSl7dmFyIHI9UHEocCwhMCk7T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih2KXt2YXIgdz1yW3ZdOyIhIj09dz9iLmFkZCh2KToiKiI9PXcmJmMuYWRkKHYpfSk7ZHx8KHIub2Zmc2V0PXEvYS5kdXJhdGlvbik7ZS5wdXNoKHIpfSk7dmFyIGY9Yi5zaXplP1lxKGIudmFsdWVzKCkpOltdLGc9Yy5zaXplP1lxKGMudmFsdWVzKCkpOltdO2lmKGQpe3ZhciBsPWVbMF0sbT1PcShsKTtsLm9mZnNldD0wO20ub2Zmc2V0PTE7ZT1bbCxtXX1yZXR1cm4ga3IodGhpcy5lbGVtZW50LGUsZixnLHRoaXMuZHVyYXRpb24sdGhpcy5zdGFydFRpbWUsdGhpcy5lYXNpbmcsITEpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhQci5wcm90b3R5cGUse2N1cnJlbnRUaW1lOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydFRpbWUrdGhpcy5kdXJhdGlvbn19LHByb3BlcnRpZXM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5DYylhLnB1c2goYik7cmV0dXJuIGF9fX0pO3ZhciB1cj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtnPXZvaWQgMD09PWc/ITE6ZztQci5jYWxsKHRoaXMsYSxiLGYuZGVsYXkpO3RoaXMuZWxlbWVudD1iO3RoaXMuUmc9Yzt0aGlzLmttPWQ7dGhpcy5maz1lO3RoaXMuQU49Zzt0aGlzLmtiPXtkdXJhdGlvbjpmLmR1cmF0aW9uLGRlbGF5OmYuZGVsYXksZWFzaW5nOmYuZWFzaW5nfX07dCh1cixQcik7dXIucHJvdG90eXBlLmdGPWZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5SZy5sZW5ndGh9Owp1ci5wcm90b3R5cGUuVHI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJnLGI9dGhpcy5rYixjPWIuZGVsYXksZD1iLmR1cmF0aW9uLGU9Yi5lYXNpbmc7aWYodGhpcy5BTiYmYyl7Yj1bXTtlPWQrYzt2YXIgZj1jL2UsZz1QcShhWzBdLCExKTtnLm9mZnNldD0wO2IucHVzaChnKTtnPVBxKGFbMF0sITEpO2cub2Zmc2V0PVJyKGYpO2IucHVzaChnKTtmPWEubGVuZ3RoLTE7Zm9yKGc9MTtnPD1mO2crKyl7dmFyIGw9UHEoYVtnXSwhMSk7bC5vZmZzZXQ9UnIoKGMrbC5vZmZzZXQqZCkvZSk7Yi5wdXNoKGwpfWQ9ZTtjPTA7ZT0iIjthPWJ9cmV0dXJuIGtyKHRoaXMuZWxlbWVudCxhLHRoaXMua20sdGhpcy5mayxkLGMsZSwhMCl9O2Z1bmN0aW9uIFJyKGEpe3ZhciBiPU1hdGgucG93KDEwLDIpO3JldHVybiBNYXRoLnJvdW5kKGEqYikvYn0KZnVuY3Rpb24gUXIoYSxiKXt2YXIgYz17fSxkO2EuZm9yRWFjaChmdW5jdGlvbihlKXsiKiI9PT1lPyhkPWR8fE9iamVjdC5rZXlzKGIpLGQuZm9yRWFjaChmdW5jdGlvbihmKXtjW2ZdPSIqIn0pKTpQcShlLCExLGMpfSk7cmV0dXJuIGN9O3ZhciBTcj1mdW5jdGlvbigpe307dmFyIFRyPWZ1bmN0aW9uKCl7fTt0KFRyLFNyKTt2YXIgeHE9VXIoKTtmdW5jdGlvbiBVcigpe3ZhciBhPXt9OyJ3aWR0aCBoZWlnaHQgbWluV2lkdGggbWluSGVpZ2h0IG1heFdpZHRoIG1heEhlaWdodCBsZWZ0IHRvcCBib3R0b20gcmlnaHQgZm9udFNpemUgb3V0bGluZVdpZHRoIG91dGxpbmVPZmZzZXQgcGFkZGluZ1RvcCBwYWRkaW5nTGVmdCBwYWRkaW5nQm90dG9tIHBhZGRpbmdSaWdodCBtYXJnaW5Ub3AgbWFyZ2luTGVmdCBtYXJnaW5Cb3R0b20gbWFyZ2luUmlnaHQgYm9yZGVyUmFkaXVzIGJvcmRlcldpZHRoIGJvcmRlclRvcFdpZHRoIGJvcmRlckxlZnRXaWR0aCBib3JkZXJSaWdodFdpZHRoIGJvcmRlckJvdHRvbVdpZHRoIHRleHRJbmRlbnQgcGVyc3BlY3RpdmUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYVtiXT0hMH0pO3JldHVybiBhfTt2YXIgVnI9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIFdyKGEsYixjLGQsZSxmLGcsbCxtLHAscSxyLHYpe3JldHVybnt0eXBlOjAsZWxlbWVudDphLEhkOmIsakc6ZSxjZDpjLHdzOmYsaWI6ZCx6cDpnLGdoOmwsWVE6bSxrbTpwLGZrOnEsdG90YWxUaW1lOnIsZXJyb3JzOnZ9fTt2YXIgWHI9e30sWXI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJEQ9YTt0aGlzLnpqPWI7dGhpcy5ORD1jfTtZci5wcm90b3R5cGUubWF0Y2g9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIFpyKHRoaXMuemoudUcsYSxiLGMsZCl9O1lyLnByb3RvdHlwZS5Caj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5ORFsiKiJdO2E9dGhpcy5ORFthXTtkPWQ/ZC5CaihiLGMpOnt9O3JldHVybiBhP2EuQmooYixjKTpkfTsKWXIucHJvdG90eXBlLkFqPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCxtLHApe3ZhciBxPVtdLHI9dGhpcy56ai5vcHRpb25zJiZ0aGlzLnpqLm9wdGlvbnMucGFyYW1zfHxYcjtnPXRoaXMuQmooYyxnJiZnLnBhcmFtc3x8WHIscSk7dmFyIHY9bCYmbC5wYXJhbXN8fFhyO2w9dGhpcy5CaihkLHYscSk7dmFyIHc9bmV3IFNldCx4PW5ldyBNYXAsdT1uZXcgTWFwLEQ9InZvaWQiPT09ZDtyPXtwYXJhbXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHIpLHYpfTthPXA/W106b3IoYSxiLHRoaXMuemouYW5pbWF0aW9uLGUsZixnLGwscixtLHEpO3ZhciBIPTA7YS5mb3JFYWNoKGZ1bmN0aW9uKEUpe0g9TWF0aC5tYXgoRS5kdXJhdGlvbitFLmRlbGF5LEgpfSk7aWYocS5sZW5ndGgpcmV0dXJuIFdyKGIsdGhpcy4kRCxjLGQsRCxnLGwsW10sW10seCx1LEgscSk7YS5mb3JFYWNoKGZ1bmN0aW9uKEUpe3ZhciBOPUUuZWxlbWVudCxNPUJxKHgsTix7fSk7RS5rbS5mb3JFYWNoKGZ1bmN0aW9uKFEpe3JldHVybiBNW1FdPQohMH0pO3ZhciBKPUJxKHUsTix7fSk7RS5may5mb3JFYWNoKGZ1bmN0aW9uKFEpe3JldHVybiBKW1FdPSEwfSk7TiE9PWImJncuYWRkKE4pfSk7cT1ZcSh3LnZhbHVlcygpKTtyZXR1cm4gV3IoYix0aGlzLiRELGMsZCxELGcsbCxhLHEseCx1LEgpfTtmdW5jdGlvbiBacihhLGIsYyxkLGUpe3JldHVybiBhLnNvbWUoZnVuY3Rpb24oZil7cmV0dXJuIGYoYixjLGQsZSl9KX12YXIgJHI9ZnVuY3Rpb24oYSxiKXt0aGlzLmc9YTt0aGlzLmxQPWJ9Owokci5wcm90b3R5cGUuQmo9ZnVuY3Rpb24oYSxiKXt2YXIgYz17fSxkPU9xKHRoaXMubFApO09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGY9YVtlXTtudWxsIT1mJiYoZFtlXT1mKX0pO3RoaXMuZy5nLmZvckVhY2goZnVuY3Rpb24oZSl7InN0cmluZyIhPT10eXBlb2YgZSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihmKXt2YXIgZz1lW2ZdOzE8Zy5sZW5ndGgmJihnPVhxKGcsZCxiKSk7Y1tmXT1nfSl9KTtyZXR1cm4gY307dmFyIGNzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLm5hbWU9YTt0aGlzLnpqPWI7dGhpcy5tST1bXTt0aGlzLnprPXt9O2IuemsuZm9yRWFjaChmdW5jdGlvbihkKXtjLnprW2QubmFtZV09bmV3ICRyKGQuc3R5bGUsZC5vcHRpb25zJiZkLm9wdGlvbnMucGFyYW1zfHx7fSl9KTthcyh0aGlzLnprLCJ0cnVlIiwiMSIpO2FzKHRoaXMuemssImZhbHNlIiwiMCIpO2IuRGsuZm9yRWFjaChmdW5jdGlvbihkKXtjLm1JLnB1c2gobmV3IFlyKGEsZCxjLnprKSl9KTt0aGlzLm5zPWJzKGEsdGhpcy56ayl9LGRzPWZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIGEubUkuZmluZChmdW5jdGlvbihmKXtyZXR1cm4gZi5tYXRjaChiLGMsZCxlKX0pfHxudWxsfTsKZnVuY3Rpb24gYnMoYSxiKXtyZXR1cm4gbmV3IFlyKGEse3R5cGU6MSxhbmltYXRpb246e3R5cGU6MixqZTpbXSxvcHRpb25zOm51bGx9LHVHOltmdW5jdGlvbigpe3JldHVybiEwfV0sb3B0aW9uczpudWxsLERpOjAsU2Y6MH0sYil9ZnVuY3Rpb24gYXMoYSxiLGMpe2EuaGFzT3duUHJvcGVydHkoYik/YS5oYXNPd25Qcm9wZXJ0eShjKXx8KGFbY109YVtiXSk6YS5oYXNPd25Qcm9wZXJ0eShjKSYmKGFbYl09YVtjXSl9O3ZhciBlcz1uZXcgbHIsZnM9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudXg9YTt0aGlzLlJjPWI7dGhpcy5mTT1jO3RoaXMuaEE9e307dGhpcy5jdz17fTt0aGlzLkVhPVtdfTtoPWZzLnByb3RvdHlwZTtoLnJlZ2lzdGVyPWZ1bmN0aW9uKGEsYil7dmFyIGM9W107Yj0obmV3IGRyKHRoaXMuUmMpKS5BaihiLGMpO2lmKGMubGVuZ3RoKXRocm93IEVycm9yKCJVbmFibGUgdG8gYnVpbGQgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICIrYy5qb2luKCJcbiIpKTt0aGlzLmhBW2FdPWJ9O2guT2s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZWxlbWVudDtiPXZxKGEuUmcsYixjKTtyZXR1cm4gdGhpcy5SYy5hbmltYXRlKGQsYixhLmR1cmF0aW9uLGEuZGVsYXksYS5lYXNpbmcsW10sITApfTsKaC5jcmVhdGU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGU9W10sZj10aGlzLmhBW2FdLGc9bmV3IE1hcDtmPyhiPW9yKHRoaXMuUmMsYixmLCJuZy1lbnRlciIsIm5nLWxlYXZlIix7fSx7fSxjLGVzLGUpLGIuZm9yRWFjaChmdW5jdGlvbihsKXt2YXIgbT1CcShnLGwuZWxlbWVudCx7fSk7bC5may5mb3JFYWNoKGZ1bmN0aW9uKHApe3JldHVybiBtW3BdPW51bGx9KX0pKTooZS5wdXNoKCJUaGUgcmVxdWVzdGVkIGFuaW1hdGlvbiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIiksYj1bXSk7aWYoZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICIrZS5qb2luKCJcbiIpKTtnLmZvckVhY2goZnVuY3Rpb24obCxtKXtPYmplY3Qua2V5cyhsKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2xbcF09ZC5SYy5LeChtLHApfSl9KTsKZT1iLm1hcChmdW5jdGlvbihsKXt2YXIgbT1nLmdldChsLmVsZW1lbnQpO3JldHVybiBkLk9rKGwse30sbSl9KTtlPXVxKGUpO3RoaXMuY3dbYV09ZTtlLlZhKGZ1bmN0aW9uKCl7cmV0dXJuIGQuZGVzdHJveShhKX0pO3RoaXMuRWEucHVzaChlKTtyZXR1cm4gZX07aC5kZXN0cm95PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWHUoYSk7Yi5kZXN0cm95KCk7ZGVsZXRlIHRoaXMuY3dbYV07YT10aGlzLkVhLmluZGV4T2YoYik7MDw9YSYmdGhpcy5FYS5zcGxpY2UoYSwxKX07aC5YdT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmN3W2FdO2lmKCFiKXRocm93IEVycm9yKCJVbmFibGUgdG8gZmluZCB0aGUgdGltZWxpbmUgcGxheWVyIHJlZmVyZW5jZWQgYnkgIithKTtyZXR1cm4gYn07aC5mYz1mdW5jdGlvbihhLGIsYyxkKXtiPUFxKGIsIiIsIiIsIiIpO3lxKHRoaXMuWHUoYSksYyxiLGQpO3JldHVybiBmdW5jdGlvbigpe319O3ZhciBncz1bXSxocz17YmM6IiIseGs6ITEsdXo6ITEsQXM6ITEsbHo6ITF9LGlzPXtiYzoiIix1ejohMSx4azohMSxBczohMSxsejohMH0sanM9ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPXZvaWQgMD09PWI/IiI6Yjt2YXIgYz0oYj1hJiZhLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpKT9hLnZhbHVlOmE7dGhpcy52YWx1ZT1udWxsIT1jP2M6bnVsbDtiPyhhPU9xKGEpLGRlbGV0ZSBhLnZhbHVlLHRoaXMub3B0aW9ucz1hKTp0aGlzLm9wdGlvbnM9e307dGhpcy5vcHRpb25zLnBhcmFtc3x8KHRoaXMub3B0aW9ucy5wYXJhbXM9e30pfSxrcz1mdW5jdGlvbihhLGIpe3ZhciBjPWIucGFyYW1zO2lmKGMpe3ZhciBkPWEub3B0aW9ucy5wYXJhbXM7T2JqZWN0LmtleXMoYykuZm9yRWFjaChmdW5jdGlvbihlKXtudWxsPT1kW2VdJiYoZFtlXT1jW2VdKX0pfX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoanMucHJvdG90eXBlLHtwYXJhbXM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zfX19KTt2YXIgbHM9bmV3IGpzKCJ2b2lkIiksbnM9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaWQ9YTt0aGlzLlZmPWI7dGhpcy50Yj1jO3RoaXMuRWE9W107dGhpcy5IaD17fTt0aGlzLm1yPVtdO3RoaXMuWWs9bmV3IE1hcDt0aGlzLmJDPSJuZy10bnMtIithO21zKGIsdGhpcy5iQyl9O2g9bnMucHJvdG90eXBlOwpoLmZjPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuSGguaGFzT3duUHJvcGVydHkoYikpdGhyb3cgRXJyb3IoJ1VuYWJsZSB0byBsaXN0ZW4gb24gdGhlIGFuaW1hdGlvbiB0cmlnZ2VyIGV2ZW50ICInK2MrJyIgYmVjYXVzZSB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIicrYisiXCIgZG9lc24ndCBleGlzdCEiKTtpZihudWxsPT1jfHwwPT1jLmxlbmd0aCl0aHJvdyBFcnJvcignVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIicrYisnIiBiZWNhdXNlIHRoZSBwcm92aWRlZCBldmVudCBpcyB1bmRlZmluZWQhJyk7aWYoInN0YXJ0IiE9YyYmImRvbmUiIT1jKXRocm93IEVycm9yKCdUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIicrYysnIiBmb3IgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICInK2IrJyIgaXMgbm90IHN1cHBvcnRlZCEnKTt2YXIgZj1CcSh0aGlzLllrLGEsW10pLGc9e25hbWU6YixUUTpjLFpkOmR9O2YucHVzaChnKTsKdmFyIGw9QnEodGhpcy50Yi5oZyxhLHt9KTtsLmhhc093blByb3BlcnR5KGIpfHwobXMoYSwibmctdHJpZ2dlciIpLG1zKGEsIm5nLXRyaWdnZXItIitiKSxsW2JdPWxzKTtyZXR1cm4gZnVuY3Rpb24oKXtvcyhlLnRiLGZ1bmN0aW9uKCl7dmFyIG09Zi5pbmRleE9mKGcpOzA8PW0mJmYuc3BsaWNlKG0sMSk7ZS5IaFtiXXx8ZGVsZXRlIGxbYl19KX19O2gucmVnaXN0ZXI9ZnVuY3Rpb24oYSxiKXtpZih0aGlzLkhoW2FdKXJldHVybiExO3RoaXMuSGhbYV09YjtyZXR1cm4hMH07aC5oTD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLkhoW2FdO2lmKCFiKXRocm93IEVycm9yKCdUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgIicrYSsnIiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCEnKTtyZXR1cm4gYn07CmgudHJpZ2dlcj1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT10aGlzO2Q9dm9pZCAwPT09ZD8hMDpkO3ZhciBmPXRoaXMuaEwoYiksZz1uZXcgcHModGhpcy5pZCxiLGEpLGw9dGhpcy50Yi5oZy5nZXQoYSk7bHx8KG1zKGEsIm5nLXRyaWdnZXIiKSxtcyhhLCJuZy10cmlnZ2VyLSIrYiksdGhpcy50Yi5oZy5zZXQoYSxsPXt9KSk7dmFyIG09bFtiXSxwPW5ldyBqcyhjLHRoaXMuaWQpO2MmJmMuaGFzT3duUHJvcGVydHkoInZhbHVlIil8fCFtfHxrcyhwLG0ub3B0aW9ucyk7bFtiXT1wO218fChtPWxzKTtpZigidm9pZCIhPT1wLnZhbHVlJiZtLnZhbHVlPT09cC52YWx1ZSl7aWYoIXFzKG0ucGFyYW1zLHAucGFyYW1zKSl7ZD1bXTt2YXIgcT1mLm5zLkJqKG0udmFsdWUsbS5wYXJhbXMsZCkscj1mLm5zLkJqKHAudmFsdWUscC5wYXJhbXMsZCk7ZC5sZW5ndGg/cnMoZCk6b3ModGhpcy50YixmdW5jdGlvbigpe1NxKGEscSk7UnEoYSxyKX0pfX1lbHNle2M9QnEodGhpcy50Yi5layxhLFtdKTsKYy5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuYmM9PWUuaWQmJncuSGQ9PWImJncuaGUmJncuZGVzdHJveSgpfSk7bD1kcyhmLG0udmFsdWUscC52YWx1ZSxhLHAucGFyYW1zKTt2YXIgdj0hMTtpZighbCl7aWYoIWQpcmV0dXJuO2w9Zi5uczt2PSEwfXRoaXMudGIuSHQrKzt0aGlzLm1yLnB1c2goe2VsZW1lbnQ6YSxIZDpiLHRyYW5zaXRpb246bCxjZDptLGliOnAsZGs6ZyxmRzp2fSk7dnx8KG1zKGEsIm5nLWFuaW1hdGUtcXVldWVkIiksZy5MZShmdW5jdGlvbigpe3NzKGEsIm5nLWFuaW1hdGUtcXVldWVkIil9KSk7Zy5lZChmdW5jdGlvbigpe3ZhciB3PWUuRWEuaW5kZXhPZihnKTswPD13JiZlLkVhLnNwbGljZSh3LDEpO2lmKHc9ZS50Yi5lay5nZXQoYSkpe3ZhciB4PXcuaW5kZXhPZihnKTswPD14JiZ3LnNwbGljZSh4LDEpfX0pO3RoaXMuRWEucHVzaChnKTtjLnB1c2goZyk7cmV0dXJuIGd9fTsKaC5ReD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2RlbGV0ZSB0aGlzLkhoW2FdO3RoaXMudGIuaGcuZm9yRWFjaChmdW5jdGlvbihjKXtkZWxldGUgY1thXX0pO3RoaXMuWWsuZm9yRWFjaChmdW5jdGlvbihjLGQpe2IuWWsuc2V0KGQsYy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmFtZSE9YX0pKX0pfTt2YXIgdHM9ZnVuY3Rpb24oYSxiKXthLnRiLmhnLmRlbGV0ZShiKTthLllrLmRlbGV0ZShiKTt2YXIgYz1hLnRiLmVrLmdldChiKTtjJiYoYy5mb3JFYWNoKGZ1bmN0aW9uKGQpe3JldHVybiBkLmRlc3Ryb3koKX0pLGEudGIuZWsuZGVsZXRlKGIpKX07Cm5zLnByb3RvdHlwZS5KRD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLnRiLmFkLnF1ZXJ5KGEsIi5uZy10cmlnZ2VyIiwhMCk7ZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKCFlLl9fbmdfcmVtb3ZlZCl7dmFyIGY9dXMoYy50YixlKTtmLnNpemU/Zi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiB2cyhnLGUsYiwhMSwhMCl9KTp0cyhjLGUpfX0pO3dzKHRoaXMudGIsZnVuY3Rpb24oKXtyZXR1cm4gZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0cyhjLGUpfSl9KX07CnZhciB2cz1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPWEudGIuaGcuZ2V0KGIpO2lmKGYpe3ZhciBnPVtdO09iamVjdC5rZXlzKGYpLmZvckVhY2goZnVuY3Rpb24obCl7YS5IaFtsXSYmKGw9YS50cmlnZ2VyKGIsbCwidm9pZCIsZSkpJiZnLnB1c2gobCl9KTtpZihnLmxlbmd0aClyZXR1cm4geHMoYS50YixhLmlkLGIsITAsYyksZCYmdXEoZykuZWQoZnVuY3Rpb24oKXtyZXR1cm4geXMoYS50YixiKX0pLCEwfXJldHVybiExfSx6cz1mdW5jdGlvbihhLGIpe3ZhciBjPWEuWWsuZ2V0KGIpO2lmKGMpe3ZhciBkPW5ldyBTZXQ7Yy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5uYW1lO2lmKCFkLmhhcyhlKSl7ZC5hZGQoZSk7dmFyIGY9YS5IaFtlXS5ucyxnPWEudGIuaGcuZ2V0KGIpW2VdfHxscyxsPW5ldyBqcygidm9pZCIpLG09bmV3IHBzKGEuaWQsZSxiKTthLnRiLkh0Kys7YS5tci5wdXNoKHtlbGVtZW50OmIsSGQ6ZSx0cmFuc2l0aW9uOmYsY2Q6ZyxpYjpsLGRrOm0sZkc6ITB9KX19KX19Owpucy5wcm90b3R5cGUucmVtb3ZlTm9kZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLnRiO2EuY2hpbGRFbGVtZW50Q291bnQmJnRoaXMuSkQoYSxiKTtpZighdnModGhpcyxhLGIsITApKXt2YXIgZT0hMTtpZihkLkZ6KXt2YXIgZj1kLkVhLmxlbmd0aD9kLmptLmdldChhKTpbXTtpZihmJiZmLmxlbmd0aCllPSEwO2Vsc2UgZm9yKGY9YTtmPWYucGFyZW50Tm9kZTspaWYoZC5oZy5nZXQoZikpe2U9ITA7YnJlYWt9fXpzKHRoaXMsYSk7ZT94cyhkLHRoaXMuaWQsYSwhMSxiKTooZT1hLl9fbmdfcmVtb3ZlZCxlJiZlIT09aHN8fChvcyhkLGZ1bmN0aW9uKCl7cmV0dXJuIHRzKGMsYSl9KSxBcyhkLGEpLGQuWHYoYSxiKSkpfX07bnMucHJvdG90eXBlLmluc2VydE5vZGU9ZnVuY3Rpb24oYSl7bXMoYSx0aGlzLmJDKX07CnZhciBCcz1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2EubXIuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1kLmRrO2lmKCFlLmFlKXt2YXIgZj1kLmVsZW1lbnQsZz1hLllrLmdldChmKTtnJiZnLmZvckVhY2goZnVuY3Rpb24obCl7aWYobC5uYW1lPT1kLkhkKXt2YXIgbT1BcShmLGQuSGQsZC5jZC52YWx1ZSxkLmliLnZhbHVlKTttLl9kYXRhPWI7eXEoZC5kayxsLlRRLG0sbC5aZCl9fSk7ZS50Rz9vcyhhLnRiLGZ1bmN0aW9uKCl7ZS5kZXN0cm95KCl9KTpjLnB1c2goZCl9fSk7YS5tcj1bXTtyZXR1cm4gYy5zb3J0KGZ1bmN0aW9uKGQsZSl7dmFyIGY9ZC50cmFuc2l0aW9uLnpqLlNmLGc9ZS50cmFuc2l0aW9uLnpqLlNmO3JldHVybiAwPT1mfHwwPT1nP2YtZzphLnRiLmFkLmVzKGQuZWxlbWVudCxlLmVsZW1lbnQpPzE6LTF9KX07Cm5zLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKGEpe3RoaXMuRWEuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYi5kZXN0cm95KCl9KTt0aGlzLkpEKHRoaXMuVmYsYSl9O3ZhciBDcz1mdW5jdGlvbihhLGIsYyl7dGhpcy51eD1hO3RoaXMuYWQ9Yjt0aGlzLmZNPWM7dGhpcy5FYT1bXTt0aGlzLlVzPW5ldyBNYXA7dGhpcy5laz1uZXcgTWFwO3RoaXMuam09bmV3IE1hcDt0aGlzLmhnPW5ldyBNYXA7dGhpcy5rbz1uZXcgU2V0O3RoaXMuSHQ9dGhpcy5Gej0wO3RoaXMua249e307dGhpcy5KZj1bXTt0aGlzLk51PVtdO3RoaXMuTXI9W107dGhpcy5JeT1uZXcgTWFwO3RoaXMuUmg9W107dGhpcy5JZz1bXTt0aGlzLldvPWZ1bmN0aW9uKCl7fX07aD1Dcy5wcm90b3R5cGU7aC5Ydj1mdW5jdGlvbihhLGIpe3RoaXMuV28oYSxiKX07CmgudEE9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLkpmLmxlbmd0aC0xO2lmKDA8PWMpe2Zvcih2YXIgZD0hMTswPD1jO2MtLSlpZih0aGlzLmFkLmVzKHRoaXMuSmZbY10uVmYsYikpe3RoaXMuSmYuc3BsaWNlKGMrMSwwLGEpO2Q9ITA7YnJlYWt9ZHx8dGhpcy5KZi5zcGxpY2UoMCwwLGEpfWVsc2UgdGhpcy5KZi5wdXNoKGEpO3RoaXMuSXkuc2V0KGIsYSk7cmV0dXJuIGF9O2gucmVnaXN0ZXI9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmtuW2FdO2N8fChjPW5ldyBucyhhLGIsdGhpcyksYi5wYXJlbnROb2RlP3RoaXMudEEoYyxiKToodGhpcy5Vcy5zZXQoYixjKSx0aGlzLlJoLnB1c2goYikpLGM9dGhpcy5rblthXT1jKTtyZXR1cm4gY307aC5nej1mdW5jdGlvbihhLGIsYyl7KGE9dGhpcy5rblthXSkmJmEucmVnaXN0ZXIoYixjKSYmdGhpcy5GeisrfTsKaC5kZXN0cm95PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztpZihhKXt2YXIgZD10aGlzLiRpKGEpO29zKHRoaXMsZnVuY3Rpb24oKXtjLkl5LmRlbGV0ZShkLlZmKTtkZWxldGUgYy5rblthXTt2YXIgZT1jLkpmLmluZGV4T2YoZCk7MDw9ZSYmYy5KZi5zcGxpY2UoZSwxKX0pO3dzKHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZC5kZXN0cm95KGIpfSl9fTtoLiRpPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmtuW2FdfTt2YXIgdXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2V0O2lmKGI9YS5oZy5nZXQoYikpZm9yKHZhciBkPU9iamVjdC5rZXlzKGIpLGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9YltkW2VdXS5iYztmJiYoZj1hLiRpKGYpKSYmYy5hZGQoZil9cmV0dXJuIGN9O0NzLnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBEcyhiKSYmKGE9dGhpcy4kaShhKSk/KGEudHJpZ2dlcihiLGMsZCksITApOiExfTsKQ3MucHJvdG90eXBlLmluc2VydE5vZGU9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoRHMoYikpe3ZhciBlPWIuX19uZ19yZW1vdmVkO2UmJmUueGsmJihlLnhrPSExLGUudXo9ITAsZT10aGlzLklnLmluZGV4T2YoYiksMDw9ZSYmdGhpcy5JZy5zcGxpY2UoZSwxKSk7YSYmKGE9dGhpcy4kaShhKSkmJmEuaW5zZXJ0Tm9kZShiLGMpO2QmJnRoaXMuUmgucHVzaChiKX19O3ZhciBFcz1mdW5jdGlvbihhLGIsYyl7Yz9hLmtvLmhhcyhiKXx8KGEua28uYWRkKGIpLG1zKGIsIm5nLWFuaW1hdGUtZGlzYWJsZWQiKSk6YS5rby5oYXMoYikmJihhLmtvLmRlbGV0ZShiKSxzcyhiLCJuZy1hbmltYXRlLWRpc2FibGVkIikpfTsKQ3MucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoRHMoYikpe3ZhciBlPWE/dGhpcy4kaShhKTpudWxsO2U/ZS5yZW1vdmVOb2RlKGIsZCk6eHModGhpcyxhLGIsITEsZCk7YyYmKGM9dGhpcy5JeS5nZXQoYikpJiZjLmlkIT09YSYmYy5yZW1vdmVOb2RlKGIsZCl9ZWxzZSB0aGlzLlh2KGIsZCl9O3ZhciB4cz1mdW5jdGlvbihhLGIsYyxkLGUpe2EuSWcucHVzaChjKTtjLl9fbmdfcmVtb3ZlZD17YmM6Yix4azplLEFzOmQsbHo6ITF9fTtDcy5wcm90b3R5cGUuZmM9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gRHMoYik/dGhpcy4kaShhKS5mYyhiLGMsZCxlKTpmdW5jdGlvbigpe319O0NzLnByb3RvdHlwZS55Sj1mdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBhLnRyYW5zaXRpb24uQWoodGhpcy5hZCxhLmVsZW1lbnQsYS5jZC52YWx1ZSxhLmliLnZhbHVlLGMsZCxhLmNkLm9wdGlvbnMsYS5pYi5vcHRpb25zLGIsZSl9Owp2YXIgQXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmFkLnF1ZXJ5KGIsIi5uZy10cmlnZ2VyIiwhMCk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGQpe3JldHVybiBGcyhhLGQpfSk7MCE9YS5qbS5zaXplJiYoYz1hLmFkLnF1ZXJ5KGIsIi5uZy1hbmltYXRpbmciLCEwKSxjLmZvckVhY2goZnVuY3Rpb24oZCl7cmV0dXJuIEdzKGEsZCl9KSl9LEZzPWZ1bmN0aW9uKGEsYil7KGE9YS5lay5nZXQoYikpJiZhLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5oZT9jLnRHPSEwOmMuZGVzdHJveSgpfSl9LEdzPWZ1bmN0aW9uKGEsYil7KGE9YS5qbS5nZXQoYikpJiZhLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGMuZmluaXNoKCl9KX0seXM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLl9fbmdfcmVtb3ZlZDtpZihjJiZjLnhrKXtiLl9fbmdfcmVtb3ZlZD1ocztpZihjLmJjKXtBcyhhLGIpO3ZhciBkPWEuJGkoYy5iYyk7ZCYmdHMoZCxiKX1hLlh2KGIsYy54ayl9YS5hZC52RyhiLCIubmctYW5pbWF0ZS1kaXNhYmxlZCIpJiYKRXMoYSxiLCExKTthLmFkLnF1ZXJ5KGIsIi5uZy1hbmltYXRlLWRpc2FibGVkIiwhMCkuZm9yRWFjaChmdW5jdGlvbihlKXtFcyhhLGUsITEpfSl9OwpDcy5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPXZvaWQgMD09PWE/LTE6YTt2YXIgYz1bXTt0aGlzLlVzLnNpemUmJih0aGlzLlVzLmZvckVhY2goZnVuY3Rpb24oZixnKXtyZXR1cm4gYi50QShmLGcpfSksdGhpcy5Vcy5jbGVhcigpKTtpZih0aGlzLkZ6JiZ0aGlzLlJoLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuUmgubGVuZ3RoO2QrKyltcyh0aGlzLlJoW2RdLCJuZy1zdGFyLWluc2VydGVkIik7aWYodGhpcy5KZi5sZW5ndGgmJih0aGlzLkh0fHx0aGlzLklnLmxlbmd0aCkpe2Q9W107dHJ5e2M9dGhpcy5NSyhkLGEpfWZpbmFsbHl7Zm9yKGE9MDthPGQubGVuZ3RoO2ErKylkW2FdKCl9fWVsc2UgZm9yKGE9MDthPHRoaXMuSWcubGVuZ3RoO2ErKyl5cyh0aGlzLHRoaXMuSWdbYV0pO3RoaXMuSHQ9MDt0aGlzLlJoLmxlbmd0aD0wO3RoaXMuSWcubGVuZ3RoPTA7dGhpcy5OdS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3JldHVybiBmKCl9KTt0aGlzLk51PVtdOwppZih0aGlzLk1yLmxlbmd0aCl7dmFyIGU9dGhpcy5Ncjt0aGlzLk1yPVtdO2MubGVuZ3RoP3VxKGMpLmVkKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3JldHVybiBmKCl9KX0pOmUuZm9yRWFjaChmdW5jdGlvbihmKXtyZXR1cm4gZigpfSl9fTt2YXIgcnM9ZnVuY3Rpb24oYSl7dGhyb3cgRXJyb3IoIlVuYWJsZSB0byBwcm9jZXNzIGFuaW1hdGlvbnMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFpbGVkIHRyaWdnZXIgdHJhbnNpdGlvbnNcbiAiK2Euam9pbigiXG4iKSk7fTsKQ3MucHJvdG90eXBlLk1LPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPW5ldyBscixlPVtdLGY9bmV3IE1hcCxnPVtdLGw9bmV3IE1hcCxtPW5ldyBNYXAscD1uZXcgTWFwLHE9bmV3IFNldDt0aGlzLmtvLmZvckVhY2goZnVuY3Rpb24oQyl7cS5hZGQoQyk7Qz1jLmFkLnF1ZXJ5KEMsIi5uZy1hbmltYXRlLXF1ZXVlZCIsITApO2Zvcih2YXIgUD0wO1A8Qy5sZW5ndGg7UCsrKXEuYWRkKENbUF0pfSk7dmFyIHI9dGhpcy51eCx2PUFycmF5LmZyb20odGhpcy5oZy5rZXlzKCkpLHc9SHModix0aGlzLlJoKSx4PW5ldyBNYXAsdT0wO3cuZm9yRWFjaChmdW5jdGlvbihDLFApe3ZhciBSPSJuZy1lbnRlciIrdSsrO3guc2V0KFAsUik7Qy5mb3JFYWNoKGZ1bmN0aW9uKGJhKXtyZXR1cm4gbXMoYmEsUil9KX0pO2Zvcih2YXIgRD1bXSxIPW5ldyBTZXQsRT1uZXcgU2V0LE49MDtOPHRoaXMuSWcubGVuZ3RoO04rKyl7dmFyIE09dGhpcy5JZ1tOXSxKPU0uX19uZ19yZW1vdmVkO0omJkoueGsmJgooRC5wdXNoKE0pLEguYWRkKE0pLEouQXM/dGhpcy5hZC5xdWVyeShNLCIubmctc3Rhci1pbnNlcnRlZCIsITApLmZvckVhY2goZnVuY3Rpb24oQyl7cmV0dXJuIEguYWRkKEMpfSk6RS5hZGQoTSkpfXZhciBRPW5ldyBNYXAsVT1Icyh2LEFycmF5LmZyb20oSCkpO1UuZm9yRWFjaChmdW5jdGlvbihDLFApe3ZhciBSPSJuZy1sZWF2ZSIrdSsrO1Euc2V0KFAsUik7Qy5mb3JFYWNoKGZ1bmN0aW9uKGJhKXtyZXR1cm4gbXMoYmEsUil9KX0pO2EucHVzaChmdW5jdGlvbigpe3cuZm9yRWFjaChmdW5jdGlvbihDLFApe3ZhciBSPXguZ2V0KFApO0MuZm9yRWFjaChmdW5jdGlvbihiYSl7cmV0dXJuIHNzKGJhLFIpfSl9KTtVLmZvckVhY2goZnVuY3Rpb24oQyxQKXt2YXIgUj1RLmdldChQKTtDLmZvckVhY2goZnVuY3Rpb24oYmEpe3JldHVybiBzcyhiYSxSKX0pfSk7RC5mb3JFYWNoKGZ1bmN0aW9uKEMpe3lzKGMsQyl9KX0pO3ZhciByYT1bXSxFYT1bXTtmb3IoYT10aGlzLkpmLmxlbmd0aC0KMTswPD1hO2EtLSlCcyh0aGlzLkpmW2FdLGIpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIFA9Qy5kayxSPUMuZWxlbWVudDtyYS5wdXNoKFApO2lmKGMuUmgubGVuZ3RoKXt2YXIgYmE9Ui5fX25nX3JlbW92ZWQ7aWYoYmEmJmJhLnV6KXtQLmRlc3Ryb3koKTtyZXR1cm59fWJhPSFyfHwhYy5hZC5lcyhyLFIpO3ZhciB1YT1RLmdldChSKSxKYT14LmdldChSKSx0YT1jLnlKKEMsZCxKYSx1YSxiYSk7dGEuZXJyb3JzJiZ0YS5lcnJvcnMubGVuZ3RoP0VhLnB1c2godGEpOmJhPyhQLkxlKGZ1bmN0aW9uKCl7cmV0dXJuIFNxKFIsdGEud3MpfSksUC5WYShmdW5jdGlvbigpe3JldHVybiBScShSLHRhLnpwKX0pLGUucHVzaChQKSk6Qy5mRz8oUC5MZShmdW5jdGlvbigpe3JldHVybiBTcShSLHRhLndzKX0pLFAuVmEoZnVuY3Rpb24oKXtyZXR1cm4gUnEoUix0YS56cCl9KSxlLnB1c2goUCkpOih0YS5naC5mb3JFYWNoKGZ1bmN0aW9uKHdhKXtyZXR1cm4gd2EuclI9ITB9KSxkLmFwcGVuZChSLAp0YS5naCksZy5wdXNoKHtZRjp0YSxkazpQLGVsZW1lbnQ6Un0pLHRhLllRLmZvckVhY2goZnVuY3Rpb24od2Epe3JldHVybiBCcShsLHdhLFtdKS5wdXNoKFApfSksdGEua20uZm9yRWFjaChmdW5jdGlvbih3YSxUYSl7d2E9T2JqZWN0LmtleXMod2EpO2lmKHdhLmxlbmd0aCl7dmFyIFFiPW0uZ2V0KFRhKTtRYnx8bS5zZXQoVGEsUWI9bmV3IFNldCk7d2EuZm9yRWFjaChmdW5jdGlvbihSYil7cmV0dXJuIFFiLmFkZChSYil9KX19KSx0YS5may5mb3JFYWNoKGZ1bmN0aW9uKHdhLFRhKXt3YT1PYmplY3Qua2V5cyh3YSk7dmFyIFFiPXAuZ2V0KFRhKTtRYnx8cC5zZXQoVGEsUWI9bmV3IFNldCk7d2EuZm9yRWFjaChmdW5jdGlvbihSYil7cmV0dXJuIFFiLmFkZChSYil9KX0pKX0pO2lmKEVhLmxlbmd0aCl7dmFyIEI9W107RWEuZm9yRWFjaChmdW5jdGlvbihDKXtCLnB1c2goIkAiK0MuSGQrIiBoYXMgZmFpbGVkIGR1ZSB0bzpcbiIpO0MuZXJyb3JzLmZvckVhY2goZnVuY3Rpb24oUCl7cmV0dXJuIEIucHVzaCgiLSAiKwpQKyJcbiIpfSl9KTtyYS5mb3JFYWNoKGZ1bmN0aW9uKEMpe3JldHVybiBDLmRlc3Ryb3koKX0pO3JzKEIpfXZhciBHPW5ldyBNYXAsSz1uZXcgTWFwO2cuZm9yRWFjaChmdW5jdGlvbihDKXt2YXIgUD1DLmVsZW1lbnQ7ZC5oYXMoUCkmJihLLnNldChQLFApLGMuckooQy5kay5iYyxDLllGLEcpKX0pO2UuZm9yRWFjaChmdW5jdGlvbihDKXt2YXIgUD1DLmVsZW1lbnQ7Yy5JQihQLCExLEMuYmMsQy5IZCxudWxsKS5mb3JFYWNoKGZ1bmN0aW9uKFIpe0JxKEcsUCxbXSkucHVzaChSKTtSLmRlc3Ryb3koKX0pfSk7dmFyIG1hPUQuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBJcyhDLG0scCl9KSxrYT1uZXcgTWFwO0pzKGthLHRoaXMuYWQsRSxwKS5mb3JFYWNoKGZ1bmN0aW9uKEMpe0lzKEMsbSxwKSYmbWEucHVzaChDKX0pO3ZhciAkYT1uZXcgTWFwO3cuZm9yRWFjaChmdW5jdGlvbihDKXtKcygkYSxjLmFkLG5ldyBTZXQoQyksbSl9KTttYS5mb3JFYWNoKGZ1bmN0aW9uKEMpe3ZhciBQPQprYS5nZXQoQyksUj0kYS5nZXQoQyk7a2Euc2V0KEMsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LFApLFIpKX0pO3ZhciBPPVtdLFM9W10sZGE9e307Zy5mb3JFYWNoKGZ1bmN0aW9uKEMpe3ZhciBQPUMuZWxlbWVudCxSPUMuZGssYmE9Qy5ZRjtpZihkLmhhcyhQKSlpZihxLmhhcyhQKSlSLlZhKGZ1bmN0aW9uKCl7cmV0dXJuIFJxKFAsYmEuenApfSksUi5kaXNhYmxlZD0hMCxSLnRvdGFsVGltZT1iYS50b3RhbFRpbWUsZS5wdXNoKFIpO2Vsc2V7dmFyIHVhPWRhO2lmKDE8Sy5zaXplKXtDPVA7Zm9yKHZhciBKYT1bXTtDPUMucGFyZW50Tm9kZTspe3ZhciB0YT1LLmdldChDKTtpZih0YSl7dWE9dGE7YnJlYWt9SmEucHVzaChDKX1KYS5mb3JFYWNoKGZ1bmN0aW9uKHdhKXtyZXR1cm4gSy5zZXQod2EsdWEpfSl9Qz1jLndKKFIuYmMsYmEsRyxmLCRhLGthKTtLcyhSLEMpO3VhPT09ZGE/Ty5wdXNoKFIpOigoQz1jLmVrLmdldCh1YSkpJiZDLmxlbmd0aCYmKFIuY2s9dXEoQykpLAplLnB1c2goUikpfWVsc2UgU3EoUCxiYS53cyksUi5WYShmdW5jdGlvbigpe3JldHVybiBScShQLGJhLnpwKX0pLFMucHVzaChSKSxxLmhhcyhQKSYmZS5wdXNoKFIpfSk7Uy5mb3JFYWNoKGZ1bmN0aW9uKEMpe3ZhciBQPWYuZ2V0KEMuZWxlbWVudCk7UCYmUC5sZW5ndGgmJihQPXVxKFApLEtzKEMsUCkpfSk7ZS5mb3JFYWNoKGZ1bmN0aW9uKEMpe0MuY2s/THMoQyxDLmNrKTpDLmRlc3Ryb3koKX0pO2ZvcihiPTA7YjxELmxlbmd0aDtiKyspaWYoRT1EW2JdLGE9RS5fX25nX3JlbW92ZWQsc3MoRSwibmctbGVhdmUiKSwhYXx8IWEuQXMpe2E9W107aWYobC5zaXplKWZvcigodj1sLmdldChFKSkmJnYubGVuZ3RoJiZhLnB1c2guYXBwbHkoYSxqYSh2KSksdj10aGlzLmFkLnF1ZXJ5KEUsIi5uZy1hbmltYXRpbmciLCEwKSxOPTA7Tjx2Lmxlbmd0aDtOKyspKE09bC5nZXQodltOXSkpJiZNLmxlbmd0aCYmYS5wdXNoLmFwcGx5KGEsamEoTSkpO2E9YS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIUMuYWV9KTsKYS5sZW5ndGg/TXModGhpcyxFLGEpOnlzKHRoaXMsRSl9RC5sZW5ndGg9MDtPLmZvckVhY2goZnVuY3Rpb24oQyl7Yy5FYS5wdXNoKEMpO0MuZWQoZnVuY3Rpb24oKXtDLmRlc3Ryb3koKTtjLkVhLnNwbGljZShjLkVhLmluZGV4T2YoQyksMSl9KTtDLnBsYXkoKX0pO3JldHVybiBPfTt2YXIgb3M9ZnVuY3Rpb24oYSxiKXthLk51LnB1c2goYil9LHdzPWZ1bmN0aW9uKGEsYil7YS5Nci5wdXNoKGIpfTtDcy5wcm90b3R5cGUuSUI9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1bXTtpZihiKShlPXRoaXMuam0uZ2V0KGEpKSYmKGY9ZSk7ZWxzZSBpZihhPXRoaXMuZWsuZ2V0KGEpKXt2YXIgZz0hZXx8InZvaWQiPT1lO2EuZm9yRWFjaChmdW5jdGlvbihsKXtsLmhlfHwoZ3x8bC5IZD09ZCkmJmYucHVzaChsKX0pfWlmKGN8fGQpZj1mLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gYyYmYyE9bC5iY3x8ZCYmZCE9bC5IZD8hMTohMH0pO3JldHVybiBmfTsKQ3MucHJvdG90eXBlLnJKPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLkhkLGU9Yi5lbGVtZW50O2E9Yi5qRz92b2lkIDA6YTtkPWIuakc/dm9pZCAwOmQ7Zm9yKHZhciBmPXt9LGc9bihiLmdoKSxsPWcubmV4dCgpOyFsLmRvbmU7Zj17VHQ6Zi5UdH0sbD1nLm5leHQoKSl7bD1sLnZhbHVlLmVsZW1lbnQ7dmFyIG09bCE9PWU7Zi5UdD1CcShjLGwsW10pO3RoaXMuSUIobCxtLGEsZCxiLmliKS5mb3JFYWNoKGZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihxKXt2YXIgcj1xLnRjO3IuSmwmJnIuSmwoKTtxLmRlc3Ryb3koKTtwLlR0LnB1c2gocSl9fShmKSl9U3EoZSxiLndzKX07CkNzLnByb3RvdHlwZS53Sj1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9dGhpcyxsPWIuSGQsbT1iLmVsZW1lbnQscD1bXSxxPW5ldyBTZXQscj1uZXcgU2V0LHY9Yi5naC5tYXAoZnVuY3Rpb24oeCl7dmFyIHU9eC5lbGVtZW50O3EuYWRkKHUpO3ZhciBEPXUuX19uZ19yZW1vdmVkO2lmKEQmJkQubHopcmV0dXJuIG5ldyBxcSh4LmR1cmF0aW9uLHguZGVsYXkpO0Q9dSE9PW07dmFyIEg9TnMoKGMuZ2V0KHUpfHxncykubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLnRjfSkpLmZpbHRlcihmdW5jdGlvbihNKXtyZXR1cm4gTS5lbGVtZW50P00uZWxlbWVudD09PXU6ITF9KSxFPWUuZ2V0KHUpLE49Zi5nZXQodSk7RT12cSh4LlJnLEUsTik7SD1nLk9rKHgsRSxIKTt4LnNSJiZkJiZyLmFkZCh1KTtEJiYoeD1uZXcgcHMoYSxsLHUpLEtzKHgsSCkscC5wdXNoKHgpKTtyZXR1cm4gSH0pO3AuZm9yRWFjaChmdW5jdGlvbih4KXtCcShnLmptLHguZWxlbWVudCxbXSkucHVzaCh4KTt4LmVkKGZ1bmN0aW9uKCl7dmFyIHU9Cmcuam0sRD14LmVsZW1lbnQsSDtpZih1IGluc3RhbmNlb2YgTWFwKXtpZihIPXUuZ2V0KEQpKUgubGVuZ3RoJiZILnNwbGljZShILmluZGV4T2YoeCksMSksMD09SC5sZW5ndGgmJnUuZGVsZXRlKEQpfWVsc2UgaWYoSD11W0RdKUgubGVuZ3RoJiZILnNwbGljZShILmluZGV4T2YoeCksMSksMD09SC5sZW5ndGgmJmRlbGV0ZSB1W0RdO3JldHVybiBIfSl9KTtxLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIG1zKHgsIm5nLWFuaW1hdGluZyIpfSk7dmFyIHc9dXEodik7dy5WYShmdW5jdGlvbigpe3EuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gc3MoeCwibmctYW5pbWF0aW5nIil9KTtScShtLGIuenApfSk7ci5mb3JFYWNoKGZ1bmN0aW9uKHgpe0JxKGQseCxbXSkucHVzaCh3KX0pO3JldHVybiB3fTsKQ3MucHJvdG90eXBlLk9rPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMDxiLmxlbmd0aD90aGlzLmFkLmFuaW1hdGUoYS5lbGVtZW50LGIsYS5kdXJhdGlvbixhLmRlbGF5LGEuZWFzaW5nLGMpOm5ldyBxcShhLmR1cmF0aW9uLGEuZGVsYXkpfTsKdmFyIHBzPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmJjPWE7dGhpcy5IZD1iO3RoaXMuZWxlbWVudD1jO3RoaXMudGM9bmV3IHFxO3RoaXMuTUE9ITE7dGhpcy5ucj17fTt0aGlzLmRpc2FibGVkPXRoaXMudEc9dGhpcy5hZT0hMTt0aGlzLmhlPSEwO3RoaXMudG90YWxUaW1lPTB9LEtzPWZ1bmN0aW9uKGEsYil7YS5NQXx8KGEudGM9YixPYmplY3Qua2V5cyhhLm5yKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2EubnJbY10uZm9yRWFjaChmdW5jdGlvbihkKXtyZXR1cm4geXEoYixjLHZvaWQgMCxkKX0pfSksYS5ucj17fSxhLk1BPSEwLGEudG90YWxUaW1lPWIudG90YWxUaW1lLGEuaGU9ITEpfSxMcz1mdW5jdGlvbihhLGIpe3ZhciBjPWEudGM7Yy5MaSYmYi5MZShmdW5jdGlvbigpe3JldHVybiBjLkxpKCJzdGFydCIpfSk7Yi5lZChmdW5jdGlvbigpe3JldHVybiBhLmZpbmlzaCgpfSk7Yi5WYShmdW5jdGlvbigpe3JldHVybiBhLmRlc3Ryb3koKX0pfTtoPXBzLnByb3RvdHlwZTsKaC5sdz1mdW5jdGlvbihhLGIpe0JxKHRoaXMubnIsYSxbXSkucHVzaChiKX07aC5lZD1mdW5jdGlvbihhKXt0aGlzLmhlJiZ0aGlzLmx3KCJkb25lIixhKTt0aGlzLnRjLmVkKGEpfTtoLkxlPWZ1bmN0aW9uKGEpe3RoaXMuaGUmJnRoaXMubHcoInN0YXJ0IixhKTt0aGlzLnRjLkxlKGEpfTtoLlZhPWZ1bmN0aW9uKGEpe3RoaXMuaGUmJnRoaXMubHcoImRlc3Ryb3kiLGEpO3RoaXMudGMuVmEoYSl9O2guaW5pdD1mdW5jdGlvbigpe3RoaXMudGMuaW5pdCgpfTtoLmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGU/ITE6dGhpcy50Yy5jZSgpfTtoLnBsYXk9ZnVuY3Rpb24oKXshdGhpcy5oZSYmdGhpcy50Yy5wbGF5KCl9O2gucGF1c2U9ZnVuY3Rpb24oKXshdGhpcy5oZSYmdGhpcy50Yy5wYXVzZSgpfTtoLkZpPWZ1bmN0aW9uKCl7IXRoaXMuaGUmJnRoaXMudGMuRmkoKX07aC5maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLnRjLmZpbmlzaCgpfTsKaC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5hZT0hMDt0aGlzLnRjLmRlc3Ryb3koKX07aC5yZXNldD1mdW5jdGlvbigpeyF0aGlzLmhlJiZ0aGlzLnRjLnJlc2V0KCl9O2guc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5oZXx8dGhpcy50Yy5zZXRQb3NpdGlvbihhKX07aC5MaT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnRjO2IuTGkmJmIuTGkoYSl9O2Z1bmN0aW9uIERzKGEpe3JldHVybiBhJiYxPT09YS5ub2RlVHlwZX1mdW5jdGlvbiBPcyhhLGIpe3ZhciBjPWEuc3R5bGUuZGlzcGxheTthLnN0eWxlLmRpc3BsYXk9bnVsbCE9Yj9iOiJub25lIjtyZXR1cm4gY30KZnVuY3Rpb24gSnMoYSxiLGMsZCl7dmFyIGU9W107Yy5mb3JFYWNoKGZ1bmN0aW9uKGwpe3JldHVybiBlLnB1c2goT3MobCkpfSk7dmFyIGY9W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGwsbSl7dmFyIHA9e307bC5mb3JFYWNoKGZ1bmN0aW9uKHEpe3E9cFtxXT1iLkt4KG0scSk7cSYmMCE9cS5sZW5ndGh8fChtLl9fbmdfcmVtb3ZlZD1pcyxmLnB1c2gobSkpfSk7YS5zZXQobSxwKX0pO3ZhciBnPTA7Yy5mb3JFYWNoKGZ1bmN0aW9uKGwpe3JldHVybiBPcyhsLGVbZysrXSl9KTtyZXR1cm4gZn0KZnVuY3Rpb24gSHMoYSxiKXtmdW5jdGlvbiBjKGcpe2lmKCFnKXJldHVybiAxO3ZhciBsPWYuZ2V0KGcpO2lmKGwpcmV0dXJuIGw7bD1nLnBhcmVudE5vZGU7bD1kLmhhcyhsKT9sOmUuaGFzKGwpPzE6YyhsKTtmLnNldChnLGwpO3JldHVybiBsfXZhciBkPW5ldyBNYXA7YS5mb3JFYWNoKGZ1bmN0aW9uKGcpe3JldHVybiBkLnNldChnLFtdKX0pO2lmKDA9PWIubGVuZ3RoKXJldHVybiBkO3ZhciBlPW5ldyBTZXQoYiksZj1uZXcgTWFwO2IuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD1jKGcpOzEhPT1sJiZkLmdldChsKS5wdXNoKGcpfSk7cmV0dXJuIGR9ZnVuY3Rpb24gbXMoYSxiKXtpZihhLmNsYXNzTGlzdClhLmNsYXNzTGlzdC5hZGQoYik7ZWxzZXt2YXIgYz1hLiQkY2xhc3NlcztjfHwoYz1hLiQkY2xhc3Nlcz17fSk7Y1tiXT0hMH19ZnVuY3Rpb24gc3MoYSxiKXthLmNsYXNzTGlzdD9hLmNsYXNzTGlzdC5yZW1vdmUoYik6KGE9YS4kJGNsYXNzZXMpJiZkZWxldGUgYVtiXX0KZnVuY3Rpb24gTXMoYSxiLGMpe3VxKGMpLmVkKGZ1bmN0aW9uKCl7cmV0dXJuIHlzKGEsYil9KX1mdW5jdGlvbiBOcyhhKXt2YXIgYj1bXTtQcyhhLGIpO3JldHVybiBifWZ1bmN0aW9uIFBzKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107ZCBpbnN0YW5jZW9mIHNxP1BzKGQuRWEsYik6Yi5wdXNoKGQpfX1mdW5jdGlvbiBxcyhhLGIpe3ZhciBjPU9iamVjdC5rZXlzKGEpLGQ9T2JqZWN0LmtleXMoYik7aWYoYy5sZW5ndGghPWQubGVuZ3RoKXJldHVybiExO2ZvcihkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF07aWYoIWIuaGFzT3duUHJvcGVydHkoZSl8fGFbZV0hPT1iW2VdKXJldHVybiExfXJldHVybiEwfQpmdW5jdGlvbiBJcyhhLGIsYyl7dmFyIGQ9Yy5nZXQoYSk7aWYoIWQpcmV0dXJuITE7dmFyIGU9Yi5nZXQoYSk7ZT9kLmZvckVhY2goZnVuY3Rpb24oZil7cmV0dXJuIGUuYWRkKGYpfSk6Yi5zZXQoYSxkKTtjLmRlbGV0ZShhKTtyZXR1cm4hMH07dmFyIFFzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO3RoaXMudXg9YTt0aGlzLlJjPWI7dGhpcy5aRD17fTt0aGlzLldvPWZ1bmN0aW9uKCl7fTt0aGlzLnRlPW5ldyBDcyhhLGIsYyk7dGhpcy5Tdz1uZXcgZnMoYSxiLGMpO3RoaXMudGUuV289ZnVuY3Rpb24oZSxmKXtyZXR1cm4gZC5XbyhlLGYpfX07aD1Rcy5wcm90b3R5cGU7aC5nej1mdW5jdGlvbihhLGIsYyxkLGUpe2E9YSsiLSIrZDtjPXRoaXMuWkRbYV07aWYoIWMpe2M9W107ZT0obmV3IGRyKHRoaXMuUmMpKS5BaihlLGMpO2lmKGMubGVuZ3RoKXRocm93IEVycm9yKCdUaGUgYW5pbWF0aW9uIHRyaWdnZXIgIicrZCsnIiBoYXMgZmFpbGVkIHRvIGJ1aWxkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yczpcbiAtICcrYy5qb2luKCJcbiAtICIpKTtjPW5ldyBjcyhkLGUpO3RoaXMuWkRbYV09Y310aGlzLnRlLmd6KGIsZCxjKX07aC5yZWdpc3Rlcj1mdW5jdGlvbihhLGIpe3RoaXMudGUucmVnaXN0ZXIoYSxiKX07CmguZGVzdHJveT1mdW5jdGlvbihhLGIpe3RoaXMudGUuZGVzdHJveShhLGIpfTtoLmtzPWZ1bmN0aW9uKGEsYil7RXModGhpcy50ZSxhLGIpfTsKaC5wcm9jZXNzPWZ1bmN0aW9uKGEsYixjLGQpe2lmKCJAIj09Yy5jaGFyQXQoMCkpe2M9bihDcShjKSk7YT1jLm5leHQoKS52YWx1ZTtjPWMubmV4dCgpLnZhbHVlO3ZhciBlPXRoaXMuU3c7aWYoInJlZ2lzdGVyIj09YyllLnJlZ2lzdGVyKGEsZFswXSk7ZWxzZSBpZigiY3JlYXRlIj09YyllLmNyZWF0ZShhLGIsZFswXXx8e30pO2Vsc2Ugc3dpdGNoKGI9ZS5YdShhKSxjKXtjYXNlICJwbGF5IjpiLnBsYXkoKTticmVhaztjYXNlICJwYXVzZSI6Yi5wYXVzZSgpO2JyZWFrO2Nhc2UgInJlc2V0IjpiLnJlc2V0KCk7YnJlYWs7Y2FzZSAicmVzdGFydCI6Yi5GaSgpO2JyZWFrO2Nhc2UgImZpbmlzaCI6Yi5maW5pc2goKTticmVhaztjYXNlICJpbml0IjpiLmluaXQoKTticmVhaztjYXNlICJzZXRQb3NpdGlvbiI6Yi5zZXRQb3NpdGlvbihwYXJzZUZsb2F0KGRbMF0pKTticmVhaztjYXNlICJkZXN0cm95IjplLmRlc3Ryb3koYSl9fWVsc2UgdGhpcy50ZS50cmlnZ2VyKGEsYixjLGQpfTsKaC5mYz1mdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiJAIj09Yy5jaGFyQXQoMCk/KGM9bihDcShjKSksYT1jLm5leHQoKS52YWx1ZSxjPWMubmV4dCgpLnZhbHVlLHRoaXMuU3cuZmMoYSxiLGMsZSkpOnRoaXMudGUuZmMoYSxiLGMsZCxlKX07aC5mbHVzaD1mdW5jdGlvbihhKXt0aGlzLnRlLmZsdXNoKHZvaWQgMD09PWE/LTE6YSl9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUXMucHJvdG90eXBlLHtFYTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGUuRWEuY29uY2F0KHRoaXMuU3cuRWEpfX19KTsvKgoKIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKIEB0eXBlIHtudW1iZXJ9CiovCnZhciBScz1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9dGhpczt0aGlzLmthPWE7dGhpcy4kZT1iO3RoaXMub2g9Yzt0aGlzLnBnPWQ7dGhpcy5DSz1lO3RoaXMuSks9ImZvcndhcmRzIjt0aGlzLmxNPWY7dGhpcy5hYT10aGlzLm1kPSExO3RoaXMubWM9dGhpcy5NRD0wO3RoaXMuaUI9ZnVuY3Rpb24obCl7cmV0dXJuIGcuakwobCl9fTtoPVJzLnByb3RvdHlwZTtoLmFwcGx5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5rYSxiPXRoaXMub2grIm1zICIrdGhpcy5DSysiICIrdGhpcy5wZysibXMgMSBub3JtYWwgIit0aGlzLkpLKyIgIit0aGlzLiRlLGM9YS5zdHlsZS5hbmltYXRpb24udHJpbSgpO2lmKGMubGVuZ3RoKXtmb3IodmFyIGQ9MCxlPTA7ZTxjLmxlbmd0aDtlKyspIiwiPT09Yy5jaGFyQXQoZSkmJmQrKztiPWMrIiwgIitifVNzKGEsIiIsYik7VHModGhpcy5rYSx0aGlzLmlCLCExKTt0aGlzLk1EPURhdGUubm93KCl9OwpoLnBhdXNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5rYTtTcyhhLCJQbGF5U3RhdGUiLCJwYXVzZWQiLFVzKGEsdGhpcy4kZSkpfTtoLnJlc3VtZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMua2E7U3MoYSwiUGxheVN0YXRlIiwicnVubmluZyIsVXMoYSx0aGlzLiRlKSl9O2guc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9VXModGhpcy5rYSx0aGlzLiRlKTt0aGlzLm1jPWEqdGhpcy5vaDtTcyh0aGlzLmthLCJEZWxheSIsIi0iK3RoaXMubWMrIm1zIixiKX07aC5qTD1mdW5jdGlvbihhKXt2YXIgYj1hLmNTfHxEYXRlLm5vdygpLGM9MUUzKnBhcnNlRmxvYXQoYS5lbGFwc2VkVGltZS50b0ZpeGVkKDMpKTthLmFuaW1hdGlvbk5hbWU9PXRoaXMuJGUmJk1hdGgubWF4KGItdGhpcy5NRCwwKT49dGhpcy5wZyYmYz49dGhpcy5vaCYmdGhpcy5maW5pc2goKX07aC5maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLm1kfHwodGhpcy5tZD0hMCx0aGlzLmxNKCksVHModGhpcy5rYSx0aGlzLmlCLCEwKSl9OwpoLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZighdGhpcy5hYSl7dGhpcy5hYT0hMDt0aGlzLmZpbmlzaCgpO3ZhciBhPXRoaXMua2EsYj1hLnN0eWxlLmFuaW1hdGlvbi5zcGxpdCgiLCIpLGM9VnMoYix0aGlzLiRlKTswPD1jJiYoYi5zcGxpY2UoYywxKSxTcyhhLCIiLGIuam9pbigiLCIpKSl9fTtmdW5jdGlvbiBVcyhhLGIpe2E9YS5zdHlsZS5hbmltYXRpb247cmV0dXJuIDA8YS5pbmRleE9mKCIsIik/VnMoYS5zcGxpdCgiLCIpLGIpOlZzKFthXSxiKX1mdW5jdGlvbiBWcyhhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKDA8PWFbY10uaW5kZXhPZihiKSlyZXR1cm4gYztyZXR1cm4tMX1mdW5jdGlvbiBUcyhhLGIsYyl7Yz9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsYik6YS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLGIpfQpmdW5jdGlvbiBTcyhhLGIsYyxkKXtiPSJhbmltYXRpb24iK2I7aWYobnVsbCE9ZCl7dmFyIGU9YS5zdHlsZVtiXTtlLmxlbmd0aCYmKGU9ZS5zcGxpdCgiLCIpLGVbZF09YyxjPWUuam9pbigiLCIpKX1hLnN0eWxlW2JdPWN9O3ZhciBXcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGwpe3RoaXMuZWxlbWVudD1hO3RoaXMuUmc9Yjt0aGlzLmFuaW1hdGlvbk5hbWU9Yzt0aGlzLm9oPWQ7dGhpcy5wZz1lO3RoaXMucEI9Zzt0aGlzLlVkPWw7dGhpcy5kYz1bXTt0aGlzLmVjPVtdO3RoaXMuV2M9W107dGhpcy53ZD0hMTt0aGlzLkpnPXt9O3RoaXMudGE9MDt0aGlzLmVhc2luZz1mfHwibGluZWFyIjt0aGlzLnRvdGFsVGltZT1kK2U7dGhpcy53QSgpfTtoPVdzLnByb3RvdHlwZTtoLkxlPWZ1bmN0aW9uKGEpe3RoaXMuZWMucHVzaChhKX07aC5lZD1mdW5jdGlvbihhKXt0aGlzLmRjLnB1c2goYSl9O2guVmE9ZnVuY3Rpb24oYSl7dGhpcy5XYy5wdXNoKGEpfTsKaC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5pbml0KCk7NDw9dGhpcy50YXx8KHRoaXMudGE9NCx0aGlzLkFnLmRlc3Ryb3koKSx0aGlzLk91KCksdGhpcy55QigpLHRoaXMuVWQmJnRoaXMuVWQuZGVzdHJveSgpLHRoaXMuV2MuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYSgpfSksdGhpcy5XYz1bXSl9O2gueUI9ZnVuY3Rpb24oKXt0aGlzLmRjLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEoKX0pO3RoaXMuZGM9W119O2guT3U9ZnVuY3Rpb24oKXt0aGlzLmVjLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEoKX0pO3RoaXMuZWM9W119O2guZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5pbml0KCk7Mzw9dGhpcy50YXx8KHRoaXMudGE9Myx0aGlzLkFnLmZpbmlzaCgpLHRoaXMuT3UoKSx0aGlzLlVkJiZ0aGlzLlVkLmZpbmlzaCgpLHRoaXMueUIoKSl9O2guc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5BZy5zZXRQb3NpdGlvbihhKX07CmguY2U9ZnVuY3Rpb24oKXtyZXR1cm4gMjw9dGhpcy50YX07aC5pbml0PWZ1bmN0aW9uKCl7MTw9dGhpcy50YXx8KHRoaXMudGE9MSx0aGlzLkFnLmFwcGx5KCksdGhpcy5wZyYmdGhpcy5BZy5wYXVzZSgpKX07aC5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5pbml0KCk7dGhpcy5jZSgpfHwodGhpcy5PdSgpLHRoaXMudGE9Mix0aGlzLlVkJiZ0aGlzLlVkLnN0YXJ0KCkpO3RoaXMuQWcucmVzdW1lKCl9O2gucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmluaXQoKTt0aGlzLkFnLnBhdXNlKCl9O2guRmk9ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCk7dGhpcy5wbGF5KCl9O2gucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLkFnLmRlc3Ryb3koKTt0aGlzLndBKCk7dGhpcy5BZy5hcHBseSgpfTtoLndBPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLkFnPW5ldyBScyh0aGlzLmVsZW1lbnQsdGhpcy5hbmltYXRpb25OYW1lLHRoaXMub2gsdGhpcy5wZyx0aGlzLmVhc2luZyxmdW5jdGlvbigpe3JldHVybiBhLmZpbmlzaCgpfSl9OwpoLkxpPWZ1bmN0aW9uKGEpe2E9InN0YXJ0Ij09YT90aGlzLmVjOnRoaXMuZGM7YS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3JldHVybiBiKCl9KTthLmxlbmd0aD0wfTtoLkpsPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLmluaXQoKTt2YXIgYj17fTtpZih0aGlzLmNlKCkpe3ZhciBjPTM8PXRoaXMudGE7T2JqZWN0LmtleXModGhpcy5wQikuZm9yRWFjaChmdW5jdGlvbihkKXsib2Zmc2V0IiE9ZCYmKGJbZF09Yz9hLnBCW2RdOmFyKGEuZWxlbWVudCxkKSl9KX10aGlzLkpnPWJ9O3ZhciBYcz1mdW5jdGlvbihhLGIpe3FxLmNhbGwodGhpcyk7dGhpcy5lbGVtZW50PWE7dGhpcy51aj17fTt0aGlzLlp6PSExO3RoaXMuSXc9S3EoYil9O3QoWHMscXEpO1hzLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczshdGhpcy5aeiYmdGhpcy51aiYmKHRoaXMuWno9ITAsT2JqZWN0LmtleXModGhpcy5JdykuZm9yRWFjaChmdW5jdGlvbihiKXthLnVqW2JdPWEuZWxlbWVudC5zdHlsZVtiXX0pLHFxLnByb3RvdHlwZS5pbml0LmNhbGwodGhpcykpfTtYcy5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy51aiYmKHRoaXMuaW5pdCgpLE9iamVjdC5rZXlzKHRoaXMuSXcpLmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGEuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShiLGEuSXdbYl0pfSkscXEucHJvdG90eXBlLnBsYXkuY2FsbCh0aGlzKSl9OwpYcy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy51aiYmKE9iamVjdC5rZXlzKHRoaXMudWopLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGM9YS51altiXTtjP2EuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShiLGMpOmEuZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShiKX0pLHRoaXMudWo9bnVsbCxxcS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpKX07ZnVuY3Rpb24gWXMoYSxiKXt2YXIgYz1udWxsLGQ9bnVsbDtBcnJheS5pc0FycmF5KGIpJiZiLmxlbmd0aD8oYz1acyhiWzBdKSwxPGIubGVuZ3RoJiYoZD1acyhiW2IubGVuZ3RoLTFdKSkpOmImJihjPVpzKGIpKTtyZXR1cm4gY3x8ZD9uZXcgJHMoYSxjLGQpOm51bGx9dmFyICRzPWZ1bmN0aW9uKGEsYixjKXt0aGlzLmthPWE7dGhpcy54cj1iO3RoaXMuWmk9Yzt0aGlzLnRhPTA7dmFyIGQ9YXQuZ2V0KGEpO2R8fGF0LnNldChhLGQ9e30pO3RoaXMua3Y9ZH07JHMucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7MT50aGlzLnRhJiYodGhpcy54ciYmUnEodGhpcy5rYSx0aGlzLnhyLHRoaXMua3YpLHRoaXMudGE9MSl9OyRzLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLnN0YXJ0KCk7Mj50aGlzLnRhJiYoUnEodGhpcy5rYSx0aGlzLmt2KSx0aGlzLlppJiYoUnEodGhpcy5rYSx0aGlzLlppKSx0aGlzLlppPW51bGwpLHRoaXMudGE9MSl9Owokcy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZmluaXNoKCk7Mz50aGlzLnRhJiYoYXQuZGVsZXRlKHRoaXMua2EpLHRoaXMueHImJihTcSh0aGlzLmthLHRoaXMueHIpLHRoaXMuWmk9bnVsbCksdGhpcy5aaSYmKFNxKHRoaXMua2EsdGhpcy5aaSksdGhpcy5aaT1udWxsKSxScSh0aGlzLmthLHRoaXMua3YpLHRoaXMudGE9Myl9O3ZhciBhdD1uZXcgV2Vha01hcDtmdW5jdGlvbiBacyhhKXtmb3IodmFyIGI9bnVsbCxjPU9iamVjdC5rZXlzKGEpLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtpZigiZGlzcGxheSI9PT1lfHwicG9zaXRpb24iPT09ZSliPWJ8fHt9LGJbZV09YVtlXX1yZXR1cm4gYn07dmFyIGJ0PWZ1bmN0aW9uKCl7dGhpcy5hSz0wO3RoaXMuJGs9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO3RoaXMueUU9ITF9O2g9YnQucHJvdG90eXBlO2guc0k9ZnVuY3Rpb24oYSl7cmV0dXJuIEpxKGEpfTtoLnZHPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEVxKGEsYil9O2guZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gRHEoYSxiKX07aC5xdWVyeT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEZxKGEsYixjKX07aC5LeD1mdW5jdGlvbihhLGIpe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKVtiXX07CnZhciBjdD1mdW5jdGlvbihhLGIpe2I9Yi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEtxKGUpfSk7dmFyIGM9IkBrZXlmcmFtZXMgIithKyIge1xuIixkPSIiO2IuZm9yRWFjaChmdW5jdGlvbihlKXtkPSIgIjtjKz0iIitkKzEwMCpwYXJzZUZsb2F0KGUub2Zmc2V0KSsiJSB7XG4iO2QrPSIgIjtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3ZhciBnPWVbZl07c3dpdGNoKGYpe2Nhc2UgIm9mZnNldCI6YnJlYWs7Y2FzZSAiZWFzaW5nIjpnJiYoYys9ZCsiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogIitnKyI7XG4iKTticmVhaztkZWZhdWx0OmMrPSIiK2QrZisiOiAiK2crIjtcbiJ9fSk7Yys9ZCsifVxuIn0pO2MrPSJ9XG4iO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTthLmlubmVySFRNTD1jO3JldHVybiBhfTsKYnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7Zj12b2lkIDA9PT1mP1tdOmY7ZyYmdGhpcy5nTSgpO2Y9Zi5maWx0ZXIoZnVuY3Rpb24ocSl7cmV0dXJuIHEgaW5zdGFuY2VvZiBXc30pO3ZhciBsPXt9OzAhPT1jJiYwIT09ZHx8Zi5mb3JFYWNoKGZ1bmN0aW9uKHEpe3ZhciByPXEuSmc7T2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gbFt2XT1yW3ZdfSl9KTtiPSRxKGEsYixsKTtmPWR0KGIpO2lmKDA9PWMpcmV0dXJuIG5ldyBYcyhhLGYpO2c9Imdlbl9jc3Nfa2ZfIit0aGlzLmFLKys7dmFyIG09Y3QoZyxiKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIikuYXBwZW5kQ2hpbGQobSk7dmFyIHA9WXMoYSxiKTthPW5ldyBXcyhhLGIsZyxjLGQsZSxmLHApO2EuVmEoZnVuY3Rpb24oKXttLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobSl9KTtyZXR1cm4gYX07CmJ0LnByb3RvdHlwZS5nTT1mdW5jdGlvbigpe3RoaXMueUV8fChjb25zb2xlLndhcm4oIkBhbmd1bGFyL2FuaW1hdGlvbnM6IHBsZWFzZSBsb2FkIHRoZSB3ZWItYW5pbWF0aW9ucy5qcyBwb2x5ZmlsbCB0byBhbGxvdyBwcm9ncmFtbWF0aWMgYWNjZXNzLi4uXG4iLCIgIHZpc2l0IGh0dHA6Ly9iaXQubHkvSVd1a2FtIHRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgdGhlIHdlYi1hbmltYXRpb24tanMgcG9seWZpbGwuIiksdGhpcy55RT0hMCl9O2Z1bmN0aW9uIGR0KGEpe3ZhciBiPXt9O2EmJihBcnJheS5pc0FycmF5KGEpP2E6W2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe09iamVjdC5rZXlzKGMpLmZvckVhY2goZnVuY3Rpb24oZCl7Im9mZnNldCIhPWQmJiJlYXNpbmciIT1kJiYoYltkXT1jW2RdKX0pfSk7cmV0dXJuIGJ9O3ZhciBldD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLmVsZW1lbnQ9YTt0aGlzLlJnPWI7dGhpcy5vcHRpb25zPWM7dGhpcy5VZD1kO3RoaXMuZGM9W107dGhpcy5lYz1bXTt0aGlzLldjPVtdO3RoaXMuYWE9dGhpcy53ZD10aGlzLm1kPXRoaXMuZUM9ITE7dGhpcy50aW1lPTA7dGhpcy5jaz1udWxsO3RoaXMuSmc9e307dGhpcy5vaD1jLmR1cmF0aW9uO3RoaXMucGc9Yy5kZWxheXx8MDt0aGlzLnRpbWU9dGhpcy5vaCt0aGlzLnBnfTtoPWV0LnByb3RvdHlwZTtoLmNmPWZ1bmN0aW9uKCl7dGhpcy5tZHx8KHRoaXMubWQ9ITAsdGhpcy5kYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KSx0aGlzLmRjPVtdKX07aC5pbml0PWZ1bmN0aW9uKCl7dGhpcy5PaygpO3RoaXMuQ00oKX07CmguT2s9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2lmKCF0aGlzLmVDKXt0aGlzLmVDPSEwO3ZhciBiPXRoaXMuUmc7dGhpcy5ZaD10aGlzLlROKHRoaXMuZWxlbWVudCxiLHRoaXMub3B0aW9ucyk7dGhpcy5vQj1iLmxlbmd0aD9iW2IubGVuZ3RoLTFdOnt9O3RoaXMuWWguYWRkRXZlbnRMaXN0ZW5lcigiZmluaXNoIixmdW5jdGlvbigpe3JldHVybiBhLmNmKCl9KX19O2guQ009ZnVuY3Rpb24oKXt0aGlzLnBnP3RoaXMucXcoKTp0aGlzLlloLnBhdXNlKCl9O2guVE49ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLmFuaW1hdGUoYixjKX07aC5MZT1mdW5jdGlvbihhKXt0aGlzLmVjLnB1c2goYSl9O2guZWQ9ZnVuY3Rpb24oYSl7dGhpcy5kYy5wdXNoKGEpfTtoLlZhPWZ1bmN0aW9uKGEpe3RoaXMuV2MucHVzaChhKX07CmgucGxheT1mdW5jdGlvbigpe3RoaXMuT2soKTt0aGlzLmNlKCl8fCh0aGlzLmVjLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEoKX0pLHRoaXMuZWM9W10sdGhpcy53ZD0hMCx0aGlzLlVkJiZ0aGlzLlVkLnN0YXJ0KCkpO3RoaXMuWWgucGxheSgpfTtoLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5pbml0KCk7dGhpcy5ZaC5wYXVzZSgpfTtoLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMuaW5pdCgpO3RoaXMuVWQmJnRoaXMuVWQuZmluaXNoKCk7dGhpcy5jZigpO3RoaXMuWWguZmluaXNoKCl9O2gucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLnF3KCk7dGhpcy53ZD10aGlzLm1kPXRoaXMuYWE9ITF9O2gucXc9ZnVuY3Rpb24oKXt0aGlzLlloJiZ0aGlzLlloLmNhbmNlbCgpfTtoLkZpPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpO3RoaXMucGxheSgpfTtoLmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2R9OwpoLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmFhfHwodGhpcy5hYT0hMCx0aGlzLnF3KCksdGhpcy5jZigpLHRoaXMuVWQmJnRoaXMuVWQuZGVzdHJveSgpLHRoaXMuV2MuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYSgpfSksdGhpcy5XYz1bXSl9O2guc2V0UG9zaXRpb249ZnVuY3Rpb24oYSl7dGhpcy5ZaC5jdXJyZW50VGltZT1hKnRoaXMudGltZX07aC5KbD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj17fTt0aGlzLmNlKCkmJk9iamVjdC5rZXlzKHRoaXMub0IpLmZvckVhY2goZnVuY3Rpb24oYyl7Im9mZnNldCIhPWMmJihiW2NdPWEubWQ/YS5vQltjXTphcihhLmVsZW1lbnQsYykpfSk7dGhpcy5KZz1ifTtoLkxpPWZ1bmN0aW9uKGEpe2E9InN0YXJ0Ij09YT90aGlzLmVjOnRoaXMuZGM7YS5mb3JFYWNoKGZ1bmN0aW9uKGIpe3JldHVybiBiKCl9KTthLmxlbmd0aD0wfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhldC5wcm90b3R5cGUse3RvdGFsVGltZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGcrdGhpcy5vaH19fSk7dmFyIGd0PWZ1bmN0aW9uKCl7dGhpcy5GTD0vXHtccypcW25hdGl2ZVxzK2NvZGVcXVxzKlx9Ly50ZXN0KGZ0KCkudG9TdHJpbmcoKSk7dGhpcy5rSz1uZXcgYnR9O2g9Z3QucHJvdG90eXBlO2guc0k9ZnVuY3Rpb24oYSl7cmV0dXJuIEpxKGEpfTtoLnZHPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEVxKGEsYil9O2guZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gRHEoYSxiKX07aC5xdWVyeT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEZxKGEsYixjKX07aC5LeD1mdW5jdGlvbihhLGIpe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKVtiXX07CmguYW5pbWF0ZT1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtmPXZvaWQgMD09PWY/W106ZjtpZighZyYmIXRoaXMuRkwpcmV0dXJuIHRoaXMua0suYW5pbWF0ZShhLGIsYyxkLGUsZik7Zz17ZHVyYXRpb246YyxkZWxheTpkLGZpbGw6MD09ZD8iYm90aCI6ImZvcndhcmRzIn07ZSYmKGcuZWFzaW5nPWUpO3ZhciBsPXt9O2U9Zi5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIG0gaW5zdGFuY2VvZiBldH0pOzAhPT1jJiYwIT09ZHx8ZS5mb3JFYWNoKGZ1bmN0aW9uKG0pe3ZhciBwPW0uSmc7T2JqZWN0LmtleXMocCkuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbFtxXT1wW3FdfSl9KTtiPWIubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBQcShtLCExKX0pO2I9JHEoYSxiLGwpO2M9WXMoYSxiKTtyZXR1cm4gbmV3IGV0KGEsYixnLGMpfTsKZnVuY3Rpb24gZnQoKXtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudCYmRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZXx8e319O3ZhciBodD1mdW5jdGlvbigpe30saXQ9ZnVuY3Rpb24oKXt9O3ZhciBrdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuWGc9bmV3IE1hcDt0aGlzLkhvPW51bGw7YT90aGlzLlRnPSJzdHJpbmciPT09dHlwZW9mIGE/ZnVuY3Rpb24oKXtiLmhlYWRlcnM9bmV3IE1hcDthLnNwbGl0KCJcbiIpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5pbmRleE9mKCI6Iik7aWYoMDxkKXt2YXIgZT1jLnNsaWNlKDAsZCksZj1lLnRvTG93ZXJDYXNlKCk7Yz1jLnNsaWNlKGQrMSkudHJpbSgpO2p0KGIsZSxmKTtiLmhlYWRlcnMuaGFzKGYpP2IuaGVhZGVycy5nZXQoZikucHVzaChjKTpiLmhlYWRlcnMuc2V0KGYsW2NdKX19KX06ZnVuY3Rpb24oKXtiLmhlYWRlcnM9bmV3IE1hcDtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWFbY10sZT1jLnRvTG93ZXJDYXNlKCk7InN0cmluZyI9PT10eXBlb2YgZCYmKGQ9W2RdKTswPGQubGVuZ3RoJiYoYi5oZWFkZXJzLnNldChlLGQpLGp0KGIsYyxlKSl9KX06dGhpcy5oZWFkZXJzPW5ldyBNYXB9OwpoPWt0LnByb3RvdHlwZTtoLmhhcz1mdW5jdGlvbihhKXt0aGlzLmluaXQoKTtyZXR1cm4gdGhpcy5oZWFkZXJzLmhhcyhhLnRvTG93ZXJDYXNlKCkpfTtoLmdldD1mdW5jdGlvbihhKXt0aGlzLmluaXQoKTtyZXR1cm4oYT10aGlzLmhlYWRlcnMuZ2V0KGEudG9Mb3dlckNhc2UoKSkpJiYwPGEubGVuZ3RoP2FbMF06bnVsbH07aC5rZXlzPWZ1bmN0aW9uKCl7dGhpcy5pbml0KCk7cmV0dXJuIEFycmF5LmZyb20odGhpcy5YZy52YWx1ZXMoKSl9O2guZ2V0QWxsPWZ1bmN0aW9uKGEpe3RoaXMuaW5pdCgpO3JldHVybiB0aGlzLmhlYWRlcnMuZ2V0KGEudG9Mb3dlckNhc2UoKSl8fG51bGx9O2guYXBwZW5kPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6YSx2YWx1ZTpiLG9wOiJhIn0pfTtoLnNldD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNsb25lKHtuYW1lOmEsdmFsdWU6YixvcDoicyJ9KX07CmguZGVsZXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6YSx2YWx1ZTpiLG9wOiJkIn0pfTt2YXIganQ9ZnVuY3Rpb24oYSxiLGMpe2EuWGcuaGFzKGMpfHxhLlhnLnNldChjLGIpfTtrdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5UZyYmKHRoaXMuVGcgaW5zdGFuY2VvZiBrdD9sdCh0aGlzLHRoaXMuVGcpOnRoaXMuVGcoKSx0aGlzLlRnPW51bGwsdGhpcy5IbyYmKHRoaXMuSG8uZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gbXQoYSxiKX0pLHRoaXMuSG89bnVsbCkpfTt2YXIgbHQ9ZnVuY3Rpb24oYSxiKXtiLmluaXQoKTtBcnJheS5mcm9tKGIuaGVhZGVycy5rZXlzKCkpLmZvckVhY2goZnVuY3Rpb24oYyl7YS5oZWFkZXJzLnNldChjLGIuaGVhZGVycy5nZXQoYykpO2EuWGcuc2V0KGMsYi5YZy5nZXQoYykpfSl9OwprdC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGt0O2IuVGc9dGhpcy5UZyYmdGhpcy5UZyBpbnN0YW5jZW9mIGt0P3RoaXMuVGc6dGhpcztiLkhvPSh0aGlzLkhvfHxbXSkuY29uY2F0KFthXSk7cmV0dXJuIGJ9Owp2YXIgbXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLm5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2goYi5vcCl7Y2FzZSAiYSI6Y2FzZSAicyI6dmFyIGQ9Yi52YWx1ZTsic3RyaW5nIj09PXR5cGVvZiBkJiYoZD1bZF0pO2lmKDA9PT1kLmxlbmd0aClicmVhaztqdChhLGIubmFtZSxjKTtiPSgiYSI9PT1iLm9wP2EuaGVhZGVycy5nZXQoYyk6dm9pZCAwKXx8W107Yi5wdXNoLmFwcGx5KGIsamEoZCkpO2EuaGVhZGVycy5zZXQoYyxiKTticmVhaztjYXNlICJkIjp2YXIgZT1iLnZhbHVlO2lmKGUpe2lmKGQ9YS5oZWFkZXJzLmdldChjKSlkPWQuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybi0xPT09ZS5pbmRleE9mKGYpfSksMD09PWQubGVuZ3RoPyhhLmhlYWRlcnMuZGVsZXRlKGMpLGEuWGcuZGVsZXRlKGMpKTphLmhlYWRlcnMuc2V0KGMsZCl9ZWxzZSBhLmhlYWRlcnMuZGVsZXRlKGMpLGEuWGcuZGVsZXRlKGMpfX07Cmt0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5pbml0KCk7QXJyYXkuZnJvbSh0aGlzLlhnLmtleXMoKSkuZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gYShiLlhnLmdldChjKSxiLmhlYWRlcnMuZ2V0KGMpKX0pfTt2YXIgbnQ9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIG90KGEpe3ZhciBiPW5ldyBNYXA7MDxhLmxlbmd0aCYmYS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy5pbmRleE9mKCI9Iik7aWYoLTE9PWQpdmFyIGU9W2RlY29kZVVSSUNvbXBvbmVudChjKSwiIl07ZWxzZSBlPWMuc2xpY2UoMCxkKSxlPWRlY29kZVVSSUNvbXBvbmVudChlKSxjPWMuc2xpY2UoZCsxKSxjPWRlY29kZVVSSUNvbXBvbmVudChjKSxlPVtlLGNdO2M9bihlKTtlPWMubmV4dCgpLnZhbHVlO2M9Yy5uZXh0KCkudmFsdWU7ZD1iLmdldChlKXx8W107ZC5wdXNoKGMpO2Iuc2V0KGUsZCl9KTtyZXR1cm4gYn0KZnVuY3Rpb24gcHQoYSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChhKS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZ2ksIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lM0IvZ2ksIjsiKS5yZXBsYWNlKC8lMkIvZ2ksIisiKS5yZXBsYWNlKC8lM0QvZ2ksIj0iKS5yZXBsYWNlKC8lM0YvZ2ksIj8iKS5yZXBsYWNlKC8lMkYvZ2ksIi8iKX0KdmFyIHF0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT12b2lkIDA9PT1hP3t9OmE7dGhpcy5Daj10aGlzLkt0PW51bGw7dGhpcy5XeD1hLld4fHxuZXcgbnQ7aWYoYS5PUCl7aWYoYS52cyl0aHJvdyBFcnJvcigiQ2Fubm90IHNwZWNpZnkgYm90aCBmcm9tU3RyaW5nIGFuZCBmcm9tT2JqZWN0LiIpO3RoaXMubWFwPW90KGEuT1ApfWVsc2UgYS52cz8odGhpcy5tYXA9bmV3IE1hcCxPYmplY3Qua2V5cyhhLnZzKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWEudnNbY107Yi5tYXAuc2V0KGMsQXJyYXkuaXNBcnJheShkKT9kOltkXSl9KSk6dGhpcy5tYXA9bnVsbH07aD1xdC5wcm90b3R5cGU7aC5oYXM9ZnVuY3Rpb24oYSl7dGhpcy5pbml0KCk7cmV0dXJuIHRoaXMubWFwLmhhcyhhKX07aC5nZXQ9ZnVuY3Rpb24oYSl7dGhpcy5pbml0KCk7cmV0dXJuKGE9dGhpcy5tYXAuZ2V0KGEpKT9hWzBdOm51bGx9OwpoLmdldEFsbD1mdW5jdGlvbihhKXt0aGlzLmluaXQoKTtyZXR1cm4gdGhpcy5tYXAuZ2V0KGEpfHxudWxsfTtoLmtleXM9ZnVuY3Rpb24oKXt0aGlzLmluaXQoKTtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLm1hcC5rZXlzKCkpfTtoLmFwcGVuZD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNsb25lKHtBaTphLHZhbHVlOmIsb3A6ImEifSl9O2guc2V0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY2xvbmUoe0FpOmEsdmFsdWU6YixvcDoicyJ9KX07aC5kZWxldGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jbG9uZSh7QWk6YSx2YWx1ZTpiLG9wOiJkIn0pfTsKaC50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5pbml0KCk7cmV0dXJuIHRoaXMua2V5cygpLm1hcChmdW5jdGlvbihiKXt2YXIgYz1wdChiKTtyZXR1cm4gYS5tYXAuZ2V0KGIpLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gYysiPSIrcHQoZCl9KS5qb2luKCImIil9KS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIiIhPT1ifSkuam9pbigiJiIpfTtoLmNsb25lPWZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBxdCh7V3g6dGhpcy5XeH0pO2IuQ2o9dGhpcy5Danx8dGhpcztiLkt0PSh0aGlzLkt0fHxbXSkuY29uY2F0KFthXSk7cmV0dXJuIGJ9OwpoLmluaXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO251bGw9PT10aGlzLm1hcCYmKHRoaXMubWFwPW5ldyBNYXApO251bGwhPT10aGlzLkNqJiYodGhpcy5Dai5pbml0KCksdGhpcy5Dai5rZXlzKCkuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYS5tYXAuc2V0KGIsYS5Dai5tYXAuZ2V0KGIpKX0pLHRoaXMuS3QuZm9yRWFjaChmdW5jdGlvbihiKXtzd2l0Y2goYi5vcCl7Y2FzZSAiYSI6Y2FzZSAicyI6dmFyIGM9KCJhIj09PWIub3A/YS5tYXAuZ2V0KGIuQWkpOnZvaWQgMCl8fFtdO2MucHVzaChiLnZhbHVlKTthLm1hcC5zZXQoYi5BaSxjKTticmVhaztjYXNlICJkIjppZih2b2lkIDAhPT1iLnZhbHVlKXtjPWEubWFwLmdldChiLkFpKXx8W107dmFyIGQ9Yy5pbmRleE9mKGIudmFsdWUpOy0xIT09ZCYmYy5zcGxpY2UoZCwxKTswPGMubGVuZ3RoP2EubWFwLnNldChiLkFpLGMpOmEubWFwLmRlbGV0ZShiLkFpKX1lbHNlIGEubWFwLmRlbGV0ZShiLkFpKX19KSx0aGlzLkNqPXRoaXMuS3Q9Cm51bGwpfTtmdW5jdGlvbiBydChhKXtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiBBcnJheUJ1ZmZlciYmYSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfWZ1bmN0aW9uIHN0KGEpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIEJsb2ImJmEgaW5zdGFuY2VvZiBCbG9ifWZ1bmN0aW9uIHR0KGEpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIEZvcm1EYXRhJiZhIGluc3RhbmNlb2YgRm9ybURhdGF9CnZhciB1dD1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLnVybD1iO3RoaXMuYm9keT1udWxsO3RoaXMud2l0aENyZWRlbnRpYWxzPXRoaXMuT2U9ITE7dGhpcy5yZXNwb25zZVR5cGU9Impzb24iO3RoaXMubWV0aG9kPWEudG9VcHBlckNhc2UoKTthOnN3aXRjaCh0aGlzLm1ldGhvZCl7Y2FzZSAiREVMRVRFIjpjYXNlICJHRVQiOmNhc2UgIkhFQUQiOmNhc2UgIk9QVElPTlMiOmNhc2UgIkpTT05QIjphPSExO2JyZWFrIGE7ZGVmYXVsdDphPSEwfWlmKGF8fGQpdGhpcy5ib2R5PXZvaWQgMCE9PWM/YzpudWxsLGM9ZDtjJiYodGhpcy5PZT0hIWMuT2UsdGhpcy53aXRoQ3JlZGVudGlhbHM9ISFjLndpdGhDcmVkZW50aWFscyxjLnJlc3BvbnNlVHlwZSYmKHRoaXMucmVzcG9uc2VUeXBlPWMucmVzcG9uc2VUeXBlKSxjLmhlYWRlcnMmJih0aGlzLmhlYWRlcnM9Yy5oZWFkZXJzKSxjLnBhcmFtcyYmKHRoaXMucGFyYW1zPWMucGFyYW1zKSk7dGhpcy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBrdCk7CnRoaXMucGFyYW1zPyhjPXRoaXMucGFyYW1zLnRvU3RyaW5nKCksMD09PWMubGVuZ3RoP3RoaXMuTXo9YjooZD1iLmluZGV4T2YoIj8iKSx0aGlzLk16PWIrKC0xPT09ZD8iPyI6ZDxiLmxlbmd0aC0xPyImIjoiIikrYykpOih0aGlzLnBhcmFtcz1uZXcgcXQsdGhpcy5Nej1iKX0sdnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmJvZHk/bnVsbDpydChhLmJvZHkpfHxzdChhLmJvZHkpfHx0dChhLmJvZHkpfHwic3RyaW5nIj09PXR5cGVvZiBhLmJvZHk/YS5ib2R5OmEuYm9keSBpbnN0YW5jZW9mIHF0P2EuYm9keS50b1N0cmluZygpOiJvYmplY3QiPT09dHlwZW9mIGEuYm9keXx8ImJvb2xlYW4iPT09dHlwZW9mIGEuYm9keXx8QXJyYXkuaXNBcnJheShhLmJvZHkpP0pTT04uc3RyaW5naWZ5KGEuYm9keSk6YS5ib2R5LnRvU3RyaW5nKCl9Owp1dC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP3t9OmE7dmFyIGI9YS5tZXRob2R8fHRoaXMubWV0aG9kLGM9YS51cmx8fHRoaXMudXJsLGQ9YS5yZXNwb25zZVR5cGV8fHRoaXMucmVzcG9uc2VUeXBlLGU9dm9pZCAwIT09YS5ib2R5P2EuYm9keTp0aGlzLmJvZHksZj12b2lkIDAhPT1hLndpdGhDcmVkZW50aWFscz9hLndpdGhDcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscyxnPXZvaWQgMCE9PWEuT2U/YS5PZTp0aGlzLk9lLGw9YS5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsbT1hLnBhcmFtc3x8dGhpcy5wYXJhbXM7dm9pZCAwIT09YS5MSCYmKGw9T2JqZWN0LmtleXMoYS5MSCkucmVkdWNlKGZ1bmN0aW9uKHAscSl7cmV0dXJuIHAuc2V0KHEsYS5MSFtxXSl9LGwpKTthLk1IJiYobT1PYmplY3Qua2V5cyhhLk1IKS5yZWR1Y2UoZnVuY3Rpb24ocCxxKXtyZXR1cm4gcC5zZXQocSxhLk1IW3FdKX0sbSkpO3JldHVybiBuZXcgdXQoYixjLGUse3BhcmFtczptLApoZWFkZXJzOmwsT2U6ZyxyZXNwb25zZVR5cGU6ZCx3aXRoQ3JlZGVudGlhbHM6Zn0pfTt2YXIgd3Q9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGVhZGVycz1hLmhlYWRlcnN8fG5ldyBrdDt0aGlzLnN0YXR1cz12b2lkIDAhPT1hLnN0YXR1cz9hLnN0YXR1czp2b2lkIDA9PT1iPzIwMDpiO3RoaXMuc3RhdHVzVGV4dD1hLnN0YXR1c1RleHR8fCh2b2lkIDA9PT1jPyJPSyI6Yyk7dGhpcy51cmw9YS51cmx8fG51bGw7dGhpcy5vaz0yMDA8PXRoaXMuc3RhdHVzJiYzMDA+dGhpcy5zdGF0dXN9LHh0PWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT97fTphO3d0LmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9Mn07dCh4dCx3dCk7eHQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT97fTphO3JldHVybiBuZXcgeHQoe2hlYWRlcnM6YS5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsc3RhdHVzOnZvaWQgMCE9PWEuc3RhdHVzP2Euc3RhdHVzOnRoaXMuc3RhdHVzLHN0YXR1c1RleHQ6YS5zdGF0dXNUZXh0fHx0aGlzLnN0YXR1c1RleHQsdXJsOmEudXJsfHx0aGlzLnVybHx8dm9pZCAwfSl9Owp2YXIgeXQ9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP3t9OmE7d3QuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT00O3RoaXMuYm9keT12b2lkIDAhPT1hLmJvZHk/YS5ib2R5Om51bGx9O3QoeXQsd3QpO3l0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/e306YTtyZXR1cm4gbmV3IHl0KHtib2R5OnZvaWQgMCE9PWEuYm9keT9hLmJvZHk6dGhpcy5ib2R5LGhlYWRlcnM6YS5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsc3RhdHVzOnZvaWQgMCE9PWEuc3RhdHVzP2Euc3RhdHVzOnRoaXMuc3RhdHVzLHN0YXR1c1RleHQ6YS5zdGF0dXNUZXh0fHx0aGlzLnN0YXR1c1RleHQsdXJsOmEudXJsfHx0aGlzLnVybHx8dm9pZCAwfSl9Owp2YXIgenQ9ZnVuY3Rpb24oYSl7d3QuY2FsbCh0aGlzLGEsMCwiVW5rbm93biBFcnJvciIpO3RoaXMubmFtZT0iSHR0cEVycm9yUmVzcG9uc2UiO3RoaXMub2s9ITE7dGhpcy5tZXNzYWdlPTIwMDw9dGhpcy5zdGF0dXMmJjMwMD50aGlzLnN0YXR1cz8iSHR0cCBmYWlsdXJlIGR1cmluZyBwYXJzaW5nIGZvciAiKyhhLnVybHx8Iih1bmtub3duIHVybCkiKToiSHR0cCBmYWlsdXJlIHJlc3BvbnNlIGZvciAiKyhhLnVybHx8Iih1bmtub3duIHVybCkiKSsiOiAiK2Euc3RhdHVzKyIgIithLnN0YXR1c1RleHQ7dGhpcy5lcnJvcj1hLmVycm9yfHxudWxsfTt0KHp0LHd0KTt2YXIgQXQ9ZnVuY3Rpb24oYSl7dGhpcy5oYW5kbGVyPWF9O2g9QXQucHJvdG90eXBlOwpoLnJlcXVlc3Q9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7Yz12b2lkIDA9PT1jP3t9OmM7aWYoYSBpbnN0YW5jZW9mIHV0KWI9YTtlbHNle3ZhciBlPXZvaWQgMDtlPWMuaGVhZGVycyBpbnN0YW5jZW9mIGt0P2MuaGVhZGVyczpuZXcga3QoYy5oZWFkZXJzKTt2YXIgZj12b2lkIDA7Yy5wYXJhbXMmJihmPWMucGFyYW1zIGluc3RhbmNlb2YgcXQ/Yy5wYXJhbXM6bmV3IHF0KHt2czpjLnBhcmFtc30pKTtiPW5ldyB1dChhLGIsdm9pZCAwIT09Yy5ib2R5P2MuYm9keTpudWxsLHtoZWFkZXJzOmUscGFyYW1zOmYsT2U6Yy5PZSxyZXNwb25zZVR5cGU6Yy5yZXNwb25zZVR5cGV8fCJqc29uIix3aXRoQ3JlZGVudGlhbHM6Yy53aXRoQ3JlZGVudGlhbHN9KX1lPWZpKGIpLmIoTmkoZnVuY3Rpb24oZyl7cmV0dXJuIGQuaGFuZGxlci5oYW5kbGUoZyl9LDEpKTtpZihhIGluc3RhbmNlb2YgdXR8fCJldmVudHMiPT09Yy5vYnNlcnZlKXJldHVybiBlO2E9ZS5iKGFrKGZ1bmN0aW9uKGcpe3JldHVybiBnIGluc3RhbmNlb2YKeXR9KSk7c3dpdGNoKGMub2JzZXJ2ZXx8ImJvZHkiKXtjYXNlICJib2R5Ijpzd2l0Y2goYi5yZXNwb25zZVR5cGUpe2Nhc2UgImFycmF5YnVmZmVyIjpyZXR1cm4gYS5iKHVpKGZ1bmN0aW9uKGcpe2lmKG51bGwhPT1nLmJvZHkmJiEoZy5ib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXRocm93IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuIik7cmV0dXJuIGcuYm9keX0pKTtjYXNlICJibG9iIjpyZXR1cm4gYS5iKHVpKGZ1bmN0aW9uKGcpe2lmKG51bGwhPT1nLmJvZHkmJiEoZy5ib2R5IGluc3RhbmNlb2YgQmxvYikpdGhyb3cgRXJyb3IoIlJlc3BvbnNlIGlzIG5vdCBhIEJsb2IuIik7cmV0dXJuIGcuYm9keX0pKTtjYXNlICJ0ZXh0IjpyZXR1cm4gYS5iKHVpKGZ1bmN0aW9uKGcpe2lmKG51bGwhPT1nLmJvZHkmJiJzdHJpbmciIT09dHlwZW9mIGcuYm9keSl0aHJvdyBFcnJvcigiUmVzcG9uc2UgaXMgbm90IGEgc3RyaW5nLiIpO3JldHVybiBnLmJvZHl9KSk7CmRlZmF1bHQ6cmV0dXJuIGEuYih1aShmdW5jdGlvbihnKXtyZXR1cm4gZy5ib2R5fSkpfWNhc2UgInJlc3BvbnNlIjpyZXR1cm4gYTtkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlYWNoYWJsZTogdW5oYW5kbGVkIG9ic2VydmUgdHlwZSAiK2Mub2JzZXJ2ZSsifSIpO319O2guZGVsZXRlPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7cmV0dXJuIHRoaXMucmVxdWVzdCgiREVMRVRFIixhLGIpfTtoLmdldD1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj97fTpiO3JldHVybiB0aGlzLnJlcXVlc3QoIkdFVCIsYSxiKX07aC5oZWFkPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7cmV0dXJuIHRoaXMucmVxdWVzdCgiSEVBRCIsYSxiKX07aC5vcHRpb25zPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7cmV0dXJuIHRoaXMucmVxdWVzdCgiT1BUSU9OUyIsYSxiKX07CmgucHV0PWZ1bmN0aW9uKGEsYixjKXtjPXZvaWQgMD09PWM/e306YztyZXR1cm4gdGhpcy5yZXF1ZXN0KCJQVVQiLGEse2JvZHk6YixoZWFkZXJzOmMuaGVhZGVycyxvYnNlcnZlOmMub2JzZXJ2ZSxwYXJhbXM6Yy5wYXJhbXMsT2U6Yy5PZSxyZXNwb25zZVR5cGU6Yy5yZXNwb25zZVR5cGUsd2l0aENyZWRlbnRpYWxzOmMud2l0aENyZWRlbnRpYWxzfSl9O3ZhciBCdD1mdW5jdGlvbihhLGIpe3RoaXMubmV4dD1hO3RoaXMuZlE9Yn07QnQucHJvdG90eXBlLmhhbmRsZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mUS50eShhLHRoaXMubmV4dCl9O3ZhciBDdD1uZXcgeSgiSFRUUF9JTlRFUkNFUFRPUlMiKTt2YXIgRHQ9L15cKVxdXH0nLD9cbi8sRXQ9ZnVuY3Rpb24oKXt9LEZ0PWZ1bmN0aW9uKCl7fTtGdC5wcm90b3R5cGUuQWo9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fTt2YXIgR3Q9ZnVuY3Rpb24oYSl7dGhpcy5KUj1hfTsKR3QucHJvdG90eXBlLmhhbmRsZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKCJKU09OUCI9PT1hLm1ldGhvZCl0aHJvdyBFcnJvcigiQXR0ZW1wdGVkIHRvIGNvbnN0cnVjdCBKc29ucCByZXF1ZXN0IHdpdGhvdXQgSnNvbnBDbGllbnRNb2R1bGUgaW5zdGFsbGVkLiIpO3JldHVybiBuZXcgVGgoZnVuY3Rpb24oYyl7dmFyIGQ9Yi5KUi5BaigpO2Qub3BlbihhLm1ldGhvZCxhLk16KTthLndpdGhDcmVkZW50aWFscyYmKGQud2l0aENyZWRlbnRpYWxzPSEwKTthLmhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbih3LHgpe3JldHVybiBkLnNldFJlcXVlc3RIZWFkZXIodyx4LmpvaW4oIiwiKSl9KTthLmhlYWRlcnMuaGFzKCJBY2NlcHQiKXx8ZC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiKTtpZighYS5oZWFkZXJzLmhhcygiQ29udGVudC1UeXBlIikpe3ZhciBlPW51bGw9PT1hLmJvZHl8fHR0KGEuYm9keSk/bnVsbDpzdChhLmJvZHkpPwphLmJvZHkudHlwZXx8bnVsbDpydChhLmJvZHkpP251bGw6InN0cmluZyI9PT10eXBlb2YgYS5ib2R5PyJ0ZXh0L3BsYWluIjphLmJvZHkgaW5zdGFuY2VvZiBxdD8iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgiOiJvYmplY3QiPT09dHlwZW9mIGEuYm9keXx8Im51bWJlciI9PT10eXBlb2YgYS5ib2R5fHxBcnJheS5pc0FycmF5KGEuYm9keSk/ImFwcGxpY2F0aW9uL2pzb24iOm51bGw7bnVsbCE9PWUmJmQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixlKX1hLnJlc3BvbnNlVHlwZSYmKGU9YS5yZXNwb25zZVR5cGUudG9Mb3dlckNhc2UoKSxkLnJlc3BvbnNlVHlwZT0ianNvbiIhPT1lP2U6InRleHQiKTt2YXIgZj12dChhKSxnPW51bGwsbD1mdW5jdGlvbigpe2lmKG51bGwhPT1nKXJldHVybiBnO3ZhciB3PTEyMjM9PT1kLnN0YXR1cz8yMDQ6ZC5zdGF0dXMseD1kLnN0YXR1c1RleHR8fCJPSyIsdT1uZXcga3QoZC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksCkQ9KCJyZXNwb25zZVVSTCJpbiBkJiZkLnJlc3BvbnNlVVJMP2QucmVzcG9uc2VVUkw6L15YLVJlcXVlc3QtVVJMOi9tLnRlc3QoZC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk/ZC5nZXRSZXNwb25zZUhlYWRlcigiWC1SZXF1ZXN0LVVSTCIpOm51bGwpfHxhLnVybDtyZXR1cm4gZz1uZXcgeHQoe2hlYWRlcnM6dSxzdGF0dXM6dyxzdGF0dXNUZXh0OngsdXJsOkR9KX0sbT1mdW5jdGlvbigpe3ZhciB3PWwoKSx4PXcuaGVhZGVycyx1PXcuc3RhdHVzLEQ9dy5zdGF0dXNUZXh0O3c9dy51cmw7dmFyIEg9bnVsbDsyMDQhPT11JiYoSD0idW5kZWZpbmVkIj09PXR5cGVvZiBkLnJlc3BvbnNlP2QucmVzcG9uc2VUZXh0OmQucmVzcG9uc2UpOzA9PT11JiYodT1IPzIwMDowKTt2YXIgRT0yMDA8PXUmJjMwMD51O2lmKCJqc29uIj09PWEucmVzcG9uc2VUeXBlJiYic3RyaW5nIj09PXR5cGVvZiBIKXt2YXIgTj1IO0g9SC5yZXBsYWNlKER0LCIiKTt0cnl7SD0iIiE9PUg/SlNPTi5wYXJzZShIKToKbnVsbH1jYXRjaChNKXtIPU4sRSYmKEU9ITEsSD17ZXJyb3I6TSx0ZXh0Okh9KX19RT8oYy5uZXh0KG5ldyB5dCh7Ym9keTpILGhlYWRlcnM6eCxzdGF0dXM6dSxzdGF0dXNUZXh0OkQsdXJsOnd8fHZvaWQgMH0pKSxjLmNvbXBsZXRlKCkpOmMuZXJyb3IobmV3IHp0KHtlcnJvcjpILGhlYWRlcnM6eCxzdGF0dXM6dSxzdGF0dXNUZXh0OkQsdXJsOnd8fHZvaWQgMH0pKX0scD1mdW5jdGlvbih3KXt2YXIgeD1sKCkudXJsO2MuZXJyb3IobmV3IHp0KHtlcnJvcjp3LHN0YXR1czpkLnN0YXR1c3x8MCxzdGF0dXNUZXh0OmQuc3RhdHVzVGV4dHx8IlVua25vd24gRXJyb3IiLHVybDp4fHx2b2lkIDB9KSl9LHE9ITEscj1mdW5jdGlvbih3KXtxfHwoYy5uZXh0KGwoKSkscT0hMCk7dmFyIHg9e3R5cGU6Myxsb2FkZWQ6dy5sb2FkZWR9O3cubGVuZ3RoQ29tcHV0YWJsZSYmKHgudG90YWw9dy50b3RhbCk7InRleHQiPT09YS5yZXNwb25zZVR5cGUmJmQucmVzcG9uc2VUZXh0JiYoeC5JUz1kLnJlc3BvbnNlVGV4dCk7CmMubmV4dCh4KX0sdj1mdW5jdGlvbih3KXt2YXIgeD17dHlwZToxLGxvYWRlZDp3LmxvYWRlZH07dy5sZW5ndGhDb21wdXRhYmxlJiYoeC50b3RhbD13LnRvdGFsKTtjLm5leHQoeCl9O2QuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbSk7ZC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIscCk7YS5PZSYmKGQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHIpLG51bGwhPT1mJiZkLnVwbG9hZCYmZC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHYpKTtkLnNlbmQoZik7Yy5uZXh0KHt0eXBlOjB9KTtyZXR1cm4gZnVuY3Rpb24oKXtkLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixwKTtkLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG0pO2EuT2UmJihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixyKSxudWxsIT09ZiYmZC51cGxvYWQmJmQudXBsb2FkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIix2KSk7ZC5yZWFkeVN0YXRlIT09ZC5ET05FJiYKZC5hYm9ydCgpfX0pfTt2YXIgSHQ9bmV3IHkoIlhTUkZfQ09PS0lFX05BTUUiKSxJdD1uZXcgeSgiWFNSRl9IRUFERVJfTkFNRSIpLEp0PWZ1bmN0aW9uKCl7fSxLdD1mdW5jdGlvbihhLGIsYyl7dGhpcy5zUD1hO3RoaXMucGxhdGZvcm09Yjt0aGlzLmZQPWM7dGhpcy5tRz0iIjt0aGlzLnBHPW51bGx9LEx0PWZ1bmN0aW9uKGEsYil7dGhpcy55Uj1hO3RoaXMuUkY9Yn07Ckx0LnByb3RvdHlwZS50eT1mdW5jdGlvbihhLGIpe3ZhciBjPWEudXJsLnRvTG93ZXJDYXNlKCk7aWYoIkdFVCI9PT1hLm1ldGhvZHx8IkhFQUQiPT09YS5tZXRob2R8fGMuc3RhcnRzV2l0aCgiaHR0cDovLyIpfHxjLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpcmV0dXJuIGIuaGFuZGxlKGEpO2M9dGhpcy55UjtpZigic2VydmVyIj09PWMucGxhdGZvcm0pYz1udWxsO2Vsc2V7dmFyIGQ9Yy5zUC5jb29raWV8fCIiO2lmKGQhPT1jLm1HKXtiOnt2YXIgZT1jLmZQO2U9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO2Zvcih2YXIgZj1uKGQuc3BsaXQoIjsiKSksZz1mLm5leHQoKTshZy5kb25lO2c9Zi5uZXh0KCkpe2c9Zy52YWx1ZTt2YXIgbD1nLmluZGV4T2YoIj0iKTtsPW4oLTE9PWw/W2csIiJdOltnLnNsaWNlKDAsbCksZy5zbGljZShsKzEpXSk7Zz1sLm5leHQoKS52YWx1ZTtsPWwubmV4dCgpLnZhbHVlO2lmKGcudHJpbSgpPT09ZSl7ZT1kZWNvZGVVUklDb21wb25lbnQobCk7YnJlYWsgYn19ZT0KbnVsbH1jLnBHPWU7Yy5tRz1kfWM9Yy5wR31udWxsPT09Y3x8YS5oZWFkZXJzLmhhcyh0aGlzLlJGKXx8KGE9YS5jbG9uZSh7aGVhZGVyczphLmhlYWRlcnMuc2V0KHRoaXMuUkYsYyl9KSk7cmV0dXJuIGIuaGFuZGxlKGEpfTt2YXIgTXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLk1PPWE7dGhpcy5aPWI7dGhpcy5DeD1udWxsfTtNdC5wcm90b3R5cGUuaGFuZGxlPWZ1bmN0aW9uKGEpe251bGw9PT10aGlzLkN4JiYodGhpcy5DeD10aGlzLlouZ2V0KEN0LFtdKS5yZWR1Y2VSaWdodChmdW5jdGlvbihiLGMpe3JldHVybiBuZXcgQnQoYixjKX0sdGhpcy5NTykpO3JldHVybiB0aGlzLkN4LmhhbmRsZShhKX07dmFyIE50PWZ1bmN0aW9uKCl7fSxPdD1mdW5jdGlvbigpe307dmFyIFB0PW5ldyB5KCJOZ1ZhbHVlQWNjZXNzb3IiKTt2YXIgUXQ9ZnVuY3Rpb24oYSxiKXt0aGlzLnBhPWE7dGhpcy5tPWI7dGhpcy5BYz1mdW5jdGlvbigpe307dGhpcy5nYj1mdW5jdGlvbigpe319O1F0LnByb3RvdHlwZS5JZD1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJjaGVja2VkIixhKX07UXQucHJvdG90eXBlLkZkPWZ1bmN0aW9uKGEpe3RoaXMuQWM9YX07UXQucHJvdG90eXBlLk5lPWZ1bmN0aW9uKGEpe3RoaXMuZ2I9YX07UXQucHJvdG90eXBlLlBlPWZ1bmN0aW9uKGEpe3RoaXMucGEuc2V0UHJvcGVydHkodGhpcy5tLmksImRpc2FibGVkIixhKX07dmFyIFJ0PW5ldyB5KCJDb21wb3NpdGlvbkV2ZW50TW9kZSIpLFN0PWZ1bmN0aW9uKGEsYixjKXt0aGlzLnBhPWE7dGhpcy5tPWI7dGhpcy5QbT1jO3RoaXMuQWM9ZnVuY3Rpb24oKXt9O3RoaXMuZ2I9ZnVuY3Rpb24oKXt9O3RoaXMudnU9ITE7bnVsbD09dGhpcy5QbSYmKHRoaXMuUG09IS9hbmRyb2lkIChcZCspLy50ZXN0KChNbz93aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDoiIikudG9Mb3dlckNhc2UoKSkpfTtoPVN0LnByb3RvdHlwZTtoLklkPWZ1bmN0aW9uKGEpe3RoaXMucGEuc2V0UHJvcGVydHkodGhpcy5tLmksInZhbHVlIixudWxsPT1hPyIiOmEpfTtoLkZkPWZ1bmN0aW9uKGEpe3RoaXMuQWM9YX07aC5OZT1mdW5jdGlvbihhKXt0aGlzLmdiPWF9O2guUGU9ZnVuY3Rpb24oYSl7dGhpcy5wYS5zZXRQcm9wZXJ0eSh0aGlzLm0uaSwiZGlzYWJsZWQiLGEpfTtoLkFxPWZ1bmN0aW9uKGEpeyghdGhpcy5QbXx8dGhpcy5QbSYmIXRoaXMudnUpJiZ0aGlzLkFjKGEpfTsKaC5scT1mdW5jdGlvbigpe3RoaXMudnU9ITB9O2gua3E9ZnVuY3Rpb24oYSl7dGhpcy52dT0hMTt0aGlzLlBtJiZ0aGlzLkFjKGEpfTt2YXIgVHQ9ZnVuY3Rpb24oKXt9O1R0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbihhKXt0aGlzLmNvbnRyb2wmJnRoaXMuY29udHJvbC5yZXNldChhKX07VHQucHJvdG90eXBlLlpsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuWmwoYSxiKTohMX07VHQucHJvdG90eXBlLmdldEVycm9yPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZ2V0RXJyb3IoYSxiKTpudWxsfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhUdC5wcm90b3R5cGUse3ZhbHVlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC52YWx1ZTpudWxsfX0sdmFsaWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbGlkOm51bGx9fSxKczp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuSnM6bnVsbH19LHBlbmRpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnBlbmRpbmc6bnVsbH19LGRpc2FibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sPwp0aGlzLmNvbnRyb2wuZGlzYWJsZWQ6bnVsbH19LGVuYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmVuYWJsZWQ6bnVsbH19LGVycm9yczp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZXJyb3JzOm51bGx9fSxpazp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuaWs6bnVsbH19LFRmOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5UZjpudWxsfX0saGg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmhoOm51bGx9fSwKc3RhdHVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXM6bnVsbH19LEx6Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5MejpudWxsfX0sdnA6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZwOm51bGx9fSx6bTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuem06bnVsbH19LHBhdGg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudWxsfX19KTtmdW5jdGlvbiBVdCgpe3Rocm93IEVycm9yKCJ1bmltcGxlbWVudGVkIik7fXZhciBWdD1mdW5jdGlvbigpe3RoaXMuRWY9dGhpcy5uYW1lPXRoaXMuJD1udWxsO3RoaXMucXI9W107dGhpcy5wcj1bXX07dChWdCxUdCk7ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhWdC5wcm90b3R5cGUse2loOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVXQoKX19LERnOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVXQoKX19fSk7dmFyIFd0PWZ1bmN0aW9uKCl7fTt0KFd0LFR0KTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFd0LnByb3RvdHlwZSx7Smo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudWxsfX0scGF0aDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fX0pO3ZhciBYdD1mdW5jdGlvbihhKXt0aGlzLlBjPWF9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFh0LnByb3RvdHlwZSx7cGk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBjLmNvbnRyb2w/dGhpcy5QYy5jb250cm9sLkx6OiExfX0sb2k6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBjLmNvbnRyb2w/dGhpcy5QYy5jb250cm9sLmhoOiExfX0sbmk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBjLmNvbnRyb2w/dGhpcy5QYy5jb250cm9sLmlrOiExfX0sa2k6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBjLmNvbnRyb2w/dGhpcy5QYy5jb250cm9sLlRmOiExfX0scmk6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBjLmNvbnRyb2w/dGhpcy5QYy5jb250cm9sLnZhbGlkOgohMX19LGxpOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QYy5jb250cm9sP3RoaXMuUGMuY29udHJvbC5KczohMX19LG1pOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QYy5jb250cm9sP3RoaXMuUGMuY29udHJvbC5wZW5kaW5nOiExfX19KTt2YXIgWXQ9ZnVuY3Rpb24oYSl7dGhpcy5QYz1hfTt0KFl0LFh0KTtmdW5jdGlvbiBadChhKXtyZXR1cm4gYS52YWxpZGF0ZT9mdW5jdGlvbihiKXtyZXR1cm4gYS52YWxpZGF0ZShiKX06YX1mdW5jdGlvbiAkdChhKXtyZXR1cm4gYS52YWxpZGF0ZT9mdW5jdGlvbihiKXtyZXR1cm4gYS52YWxpZGF0ZShiKX06YX07dmFyIGF1PWZ1bmN0aW9uKGEsYil7dGhpcy5wYT1hO3RoaXMubT1iO3RoaXMuQWM9ZnVuY3Rpb24oKXt9O3RoaXMuZ2I9ZnVuY3Rpb24oKXt9fTthdS5wcm90b3R5cGUuSWQ9ZnVuY3Rpb24oYSl7dGhpcy5wYS5zZXRQcm9wZXJ0eSh0aGlzLm0uaSwidmFsdWUiLG51bGw9PWE/IiI6YSl9O2F1LnByb3RvdHlwZS5GZD1mdW5jdGlvbihhKXt0aGlzLkFjPWZ1bmN0aW9uKGIpe2EoIiI9PWI/bnVsbDpwYXJzZUZsb2F0KGIpKX19O2F1LnByb3RvdHlwZS5OZT1mdW5jdGlvbihhKXt0aGlzLmdiPWF9O2F1LnByb3RvdHlwZS5QZT1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJkaXNhYmxlZCIsYSl9O3ZhciBidT1mdW5jdGlvbigpe3RoaXMuR209W119O2J1LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oYSxiKXt0aGlzLkdtLnB1c2goW2EsYl0pfTtidS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLkdtLmxlbmd0aC0xOzA8PWI7LS1iKWlmKHRoaXMuR21bYl1bMV09PT1hKXt0aGlzLkdtLnNwbGljZShiLDEpO2JyZWFrfX07YnUucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuR20uZm9yRWFjaChmdW5jdGlvbihjKXtiLkhMKGMsYSkmJmNbMV0hPT1hJiZjWzFdLklkKGEudmFsdWUpfSl9O2J1LnByb3RvdHlwZS5ITD1mdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLmNvbnRyb2w/YVswXS4kPT09Yi5sLiQmJmFbMV0ubmFtZT09PWIubmFtZTohMX07dmFyIGN1PWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMucGE9YTt0aGlzLm09Yjt0aGlzLm93PWM7dGhpcy5VYz1kO3RoaXMuQWM9ZnVuY3Rpb24oKXt9O3RoaXMuZ2I9ZnVuY3Rpb24oKXt9fTsKaD1jdS5wcm90b3R5cGU7aC5PYj1mdW5jdGlvbigpe3RoaXMubD10aGlzLlVjLmdldChWdCk7dGhpcy5zdSgpO3RoaXMub3cuYWRkKHRoaXMubCx0aGlzKX07aC5YPWZ1bmN0aW9uKCl7dGhpcy5vdy5yZW1vdmUodGhpcyl9O2guSWQ9ZnVuY3Rpb24oYSl7dGhpcy50YT1hPT09dGhpcy52YWx1ZTt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJjaGVja2VkIix0aGlzLnRhKX07aC5GZD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuVFI9YTt0aGlzLkFjPWZ1bmN0aW9uKCl7YShiLnZhbHVlKTtiLm93LnNlbGVjdChiKX19O2guTmU9ZnVuY3Rpb24oYSl7dGhpcy5nYj1hfTtoLlBlPWZ1bmN0aW9uKGEpe3RoaXMucGEuc2V0UHJvcGVydHkodGhpcy5tLmksImRpc2FibGVkIixhKX07aC5zdT1mdW5jdGlvbigpe3RoaXMubmFtZSYmdGhpcy5leSYmdGhpcy5uYW1lIT09dGhpcy5leSYmdGhpcy5JTigpOyF0aGlzLm5hbWUmJnRoaXMuZXkmJih0aGlzLm5hbWU9dGhpcy5leSl9OwpoLklOPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoJ1xuICAgICAgSWYgeW91IGRlZmluZSBib3RoIGEgbmFtZSBhbmQgYSBmb3JtQ29udHJvbE5hbWUgYXR0cmlidXRlIG9uIHlvdXIgcmFkaW8gYnV0dG9uLCB0aGVpciB2YWx1ZXNcbiAgICAgIG11c3QgbWF0Y2guIEV4OiA8aW5wdXQgdHlwZT0icmFkaW8iIGZvcm1Db250cm9sTmFtZT0iZm9vZCIgbmFtZT0iZm9vZCI+XG4gICAgJyk7fTt2YXIgZHU9ZnVuY3Rpb24oYSxiKXt0aGlzLnBhPWE7dGhpcy5tPWI7dGhpcy5BYz1mdW5jdGlvbigpe307dGhpcy5nYj1mdW5jdGlvbigpe319O2R1LnByb3RvdHlwZS5JZD1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJ2YWx1ZSIscGFyc2VGbG9hdChhKSl9O2R1LnByb3RvdHlwZS5GZD1mdW5jdGlvbihhKXt0aGlzLkFjPWZ1bmN0aW9uKGIpe2EoIiI9PWI/bnVsbDpwYXJzZUZsb2F0KGIpKX19O2R1LnByb3RvdHlwZS5OZT1mdW5jdGlvbihhKXt0aGlzLmdiPWF9O2R1LnByb3RvdHlwZS5QZT1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJkaXNhYmxlZCIsYSl9O3ZhciBldT1mdW5jdGlvbihhLGIpe3RoaXMucGE9YTt0aGlzLm09Yjt0aGlzLmVmPW5ldyBNYXA7dGhpcy5ndj0wO3RoaXMuQWM9ZnVuY3Rpb24oKXt9O3RoaXMuZ2I9ZnVuY3Rpb24oKXt9O3RoaXMuT209T2JqZWN0LmlzfTtoPWV1LnByb3RvdHlwZTtoLklkPWZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YTt2YXIgYj10aGlzLlN1KGEpO251bGw9PWImJnRoaXMucGEuc2V0UHJvcGVydHkodGhpcy5tLmksInNlbGVjdGVkSW5kZXgiLC0xKTtudWxsPT1iP2I9IiIrYTooYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmKGE9Ik9iamVjdCIpLGI9KGIrIjogIithKS5zbGljZSgwLDUwKSk7dGhpcy5wYS5zZXRQcm9wZXJ0eSh0aGlzLm0uaSwidmFsdWUiLGIpfTtoLkZkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5BYz1mdW5jdGlvbihjKXtiLnZhbHVlPWIuenEoYyk7YShiLnZhbHVlKX19O2guTmU9ZnVuY3Rpb24oYSl7dGhpcy5nYj1hfTsKaC5QZT1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJkaXNhYmxlZCIsYSl9O2guTk09ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5ndisrKS50b1N0cmluZygpfTtoLlN1PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1uKEFycmF5LmZyb20odGhpcy5lZi5rZXlzKCkpKSxjPWIubmV4dCgpOyFjLmRvbmU7Yz1iLm5leHQoKSlpZihjPWMudmFsdWUsdGhpcy5PbSh0aGlzLmVmLmdldChjKSxhKSlyZXR1cm4gYztyZXR1cm4gbnVsbH07aC56cT1mdW5jdGlvbihhKXt2YXIgYj1hLnNwbGl0KCI6IilbMF07cmV0dXJuIHRoaXMuZWYuaGFzKGIpP3RoaXMuZWYuZ2V0KGIpOmF9O3ZhciBmdT1mdW5jdGlvbihhLGIpe3RoaXMucGE9YTt0aGlzLm09Yjt0aGlzLmVmPW5ldyBNYXA7dGhpcy5ndj0wO3RoaXMuQWM9ZnVuY3Rpb24oKXt9O3RoaXMuZ2I9ZnVuY3Rpb24oKXt9O3RoaXMuT209T2JqZWN0LmlzfTtoPWZ1LnByb3RvdHlwZTtoLklkPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy52YWx1ZT1hO2lmKEFycmF5LmlzQXJyYXkoYSkpe3ZhciBjPWEubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBiLlN1KGQpfSk7YT1mdW5jdGlvbihkLGUpe2QucE4oLTE8Yy5pbmRleE9mKGUudG9TdHJpbmcoKSkpfX1lbHNlIGE9ZnVuY3Rpb24oZCl7ZC5wTighMSl9O3RoaXMuZWYuZm9yRWFjaChhKX07CmguRmQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLkFjPWZ1bmN0aW9uKGMpe3ZhciBkPVtdO2lmKHZvaWQgMCE9PWMuc2VsZWN0ZWRPcHRpb25zKWZvcih2YXIgZT1jLnNlbGVjdGVkT3B0aW9ucyxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWUuaXRlbShmKTtnPWIuenEoZy52YWx1ZSk7ZC5wdXNoKGcpfWVsc2UgZm9yKGU9Yy5vcHRpb25zLGY9MDtmPGUubGVuZ3RoO2YrKylnPWUuaXRlbShmKSxnLnNlbGVjdGVkJiYoZz1iLnpxKGcudmFsdWUpLGQucHVzaChnKSk7Yi52YWx1ZT1kO2EoZCl9fTtoLk5lPWZ1bmN0aW9uKGEpe3RoaXMuZ2I9YX07aC5QZT1mdW5jdGlvbihhKXt0aGlzLnBhLnNldFByb3BlcnR5KHRoaXMubS5pLCJkaXNhYmxlZCIsYSl9O2guTk09ZnVuY3Rpb24oYSl7dmFyIGI9KHRoaXMuZ3YrKykudG9TdHJpbmcoKTt0aGlzLmVmLnNldChiLGEpO3JldHVybiBifTsKaC5TdT1mdW5jdGlvbihhKXtmb3IodmFyIGI9bihBcnJheS5mcm9tKHRoaXMuZWYua2V5cygpKSksYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpaWYoYz1jLnZhbHVlLHRoaXMuT20odGhpcy5lZi5nZXQoYykubWEsYSkpcmV0dXJuIGM7cmV0dXJuIG51bGx9O2guenE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcGxpdCgiOiIpWzBdO3JldHVybiB0aGlzLmVmLmhhcyhiKT90aGlzLmVmLmdldChiKS5tYTphfTt2YXIgZ3U9bmV3IHkoIk5nVmFsaWRhdG9ycyIpLGt1PWZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiBudWxsO3ZhciBiPWEuZmlsdGVyKGh1KTtyZXR1cm4gMD09Yi5sZW5ndGg/bnVsbDpmdW5jdGlvbihjKXtyZXR1cm4gaXUoanUoYyxiKSl9fSxudT1mdW5jdGlvbihhKXtpZighYSlyZXR1cm4gbnVsbDt2YXIgYj1hLmZpbHRlcihodSk7cmV0dXJuIDA9PWIubGVuZ3RoP251bGw6ZnVuY3Rpb24oYyl7Yz1sdShjLGIpLm1hcChtdSk7cmV0dXJuIFRpKGMpLmIodWkoaXUpKX19O2Z1bmN0aW9uIGh1KGEpe3JldHVybiBudWxsIT1hfWZ1bmN0aW9uIG11KGEpe2E9RWUoYSk/TWkoYSk6YTtpZighRmUoYSkpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHZhbGlkYXRvciB0byByZXR1cm4gUHJvbWlzZSBvciBPYnNlcnZhYmxlLiIpO3JldHVybiBhfWZ1bmN0aW9uIGp1KGEsYil7cmV0dXJuIGIubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBjKGEpfSl9CmZ1bmN0aW9uIGx1KGEsYil7cmV0dXJuIGIubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBjKGEpfSl9ZnVuY3Rpb24gaXUoYSl7dmFyIGI9e307YS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2I9bnVsbCE9Yz9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYiksYyk6Yn0pO3JldHVybiAwPT09T2JqZWN0LmtleXMoYikubGVuZ3RoP251bGw6Yn07ZnVuY3Rpb24gb3UoYSxiKXthfHxwdShiLCJDYW5ub3QgZmluZCBjb250cm9sIHdpdGgiKTtiLkVmfHxwdShiLCJObyB2YWx1ZSBhY2Nlc3NvciBmb3IgZm9ybSBjb250cm9sIHdpdGgiKTthLmloPWt1KFthLmloLGIuaWhdKTthLkRnPW51KFthLkRnLGIuRGddKTtiLkVmLklkKGEudmFsdWUpO3F1KGEsYik7cnUoYSxiKTtzdShhLGIpO2IuRWYuUGUmJnR1KGEsZnVuY3Rpb24oYyl7Yi5FZi5QZShjKX0pO2IucXIuZm9yRWFjaChmdW5jdGlvbihjKXtjLkVpJiZjLkVpKGZ1bmN0aW9uKCl7cmV0dXJuIHV1KGEpfSl9KTtiLnByLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5FaSYmYy5FaShmdW5jdGlvbigpe3JldHVybiB1dShhKX0pfSl9CmZ1bmN0aW9uIHZ1KGEsYil7Yi5FZi5GZChmdW5jdGlvbigpe3JldHVybiB3dShiKX0pO2IuRWYuTmUoZnVuY3Rpb24oKXtyZXR1cm4gd3UoYil9KTtiLnFyLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5FaSYmYy5FaShudWxsKX0pO2IucHIuZm9yRWFjaChmdW5jdGlvbihjKXtjLkVpJiZjLkVpKG51bGwpfSk7YSYmYS5SSigpfWZ1bmN0aW9uIHF1KGEsYil7Yi5FZi5GZChmdW5jdGlvbihjKXthLnJsPWM7YS5hcj0hMDthLmJ3PSEwOyJjaGFuZ2UiPT09YS5DZiYmeHUoYSxiKX0pfWZ1bmN0aW9uIHN1KGEsYil7Yi5FZi5OZShmdW5jdGlvbigpe2EuWkM9ITA7ImJsdXIiPT09YS5DZiYmYS5hciYmeHUoYSxiKTsic3VibWl0IiE9PWEuQ2YmJnl1KGEpfSl9ZnVuY3Rpb24geHUoYSxiKXthLmJ3JiZ6dShhKTthLnNldFZhbHVlKGEucmwse3RGOiExfSk7dmFyIGM9YS5ybDtiLlF6PWM7Yi51cGRhdGUuZW1pdChjKTthLmFyPSExfQpmdW5jdGlvbiBydShhLGIpe2EuRmQoZnVuY3Rpb24oYyxkKXtiLkVmLklkKGMpO2QmJihiLlF6PWMsYi51cGRhdGUuZW1pdChjKSl9KX1mdW5jdGlvbiB3dShhKXtyZXR1cm4gcHUoYSwiVGhlcmUgaXMgbm8gRm9ybUNvbnRyb2wgaW5zdGFuY2UgYXR0YWNoZWQgdG8gZm9ybSBjb250cm9sIGVsZW1lbnQgd2l0aCIpfWZ1bmN0aW9uIHB1KGEsYil7dGhyb3cgRXJyb3IoYisiICIrKDE8YS5wYXRoLmxlbmd0aD8icGF0aDogJyIrYS5wYXRoLmpvaW4oIiAtPiAiKSsiJyI6YS5wYXRoWzBdPyJuYW1lOiAnIithLnBhdGgrIiciOiJ1bnNwZWNpZmllZCBuYW1lIGF0dHJpYnV0ZSIpKTt9ZnVuY3Rpb24gQXUoYSl7cmV0dXJuIG51bGwhPWE/a3UoYS5tYXAoWnQpKTpudWxsfWZ1bmN0aW9uIEJ1KGEpe3JldHVybiBudWxsIT1hP251KGEubWFwKCR0KSk6bnVsbH12YXIgQ3U9W1F0LGR1LGF1LGV1LGZ1LGN1XTsKZnVuY3Rpb24gRHUoYSl7cmV0dXJuIEN1LnNvbWUoZnVuY3Rpb24oYil7cmV0dXJuIGEuY29uc3RydWN0b3I9PT1ifSl9CmZ1bmN0aW9uIEV1KGEsYil7aWYoIWIpcmV0dXJuIG51bGw7QXJyYXkuaXNBcnJheShiKXx8cHUoYSwiVmFsdWUgYWNjZXNzb3Igd2FzIG5vdCBwcm92aWRlZCBhcyBhbiBhcnJheSBmb3IgZm9ybSBjb250cm9sIHdpdGgiKTt2YXIgYz12b2lkIDAsZD12b2lkIDAsZT12b2lkIDA7Yi5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuY29uc3RydWN0b3I9PT1TdD9jPWY6RHUoZik/KGQmJnB1KGEsIk1vcmUgdGhhbiBvbmUgYnVpbHQtaW4gdmFsdWUgYWNjZXNzb3IgbWF0Y2hlcyBmb3JtIGNvbnRyb2wgd2l0aCIpLGQ9Zik6KGUmJnB1KGEsIk1vcmUgdGhhbiBvbmUgY3VzdG9tIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgiKSxlPWYpfSk7aWYoZSlyZXR1cm4gZTtpZihkKXJldHVybiBkO2lmKGMpcmV0dXJuIGM7cHUoYSwiTm8gdmFsaWQgdmFsdWUgYWNjZXNzb3IgZm9yIGZvcm0gY29udHJvbCB3aXRoIik7cmV0dXJuIG51bGx9O2Z1bmN0aW9uIEZ1KGEsYil7aWYobnVsbD09YilyZXR1cm4gbnVsbDtBcnJheS5pc0FycmF5KGIpfHwoYj1iLnNwbGl0KCIuIikpO2lmKEFycmF5LmlzQXJyYXkoYikmJjA9PT1iLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgYz1hO2IuZm9yRWFjaChmdW5jdGlvbihkKXtjPWMgaW5zdGFuY2VvZiBHdT9jLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGQpP2MuY29udHJvbHNbZF06bnVsbDpjIGluc3RhbmNlb2YgSHU/Yy5jb250cm9sc1tkXXx8bnVsbDpudWxsfSk7cmV0dXJuIGN9ZnVuY3Rpb24gSXUoYSl7YT1KdShhKT9hLllTOmE7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/QXUoYSk6YXx8bnVsbH1mdW5jdGlvbiBLdShhLGIpe2E9SnUoYik/Yi5uUzphO3JldHVybiBBcnJheS5pc0FycmF5KGEpP0J1KGEpOmF8fG51bGx9ZnVuY3Rpb24gSnUoYSl7cmV0dXJuIG51bGwhPWEmJiFBcnJheS5pc0FycmF5KGEpJiYib2JqZWN0Ij09PXR5cGVvZiBhfQp2YXIgTHU9ZnVuY3Rpb24oYSxiKXt0aGlzLmloPWE7dGhpcy5EZz1iO3RoaXMuRHE9ITE7dGhpcy54aD1mdW5jdGlvbigpe307dGhpcy5paz0hMDt0aGlzLmhoPSExO3RoaXMuWHE9W119LHl1PWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7YS5oaD0hMDthLiQmJiFiLldhJiZ5dShhLiQsYil9LE11PWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7YS5oaD0hMTthLlpDPSExO2EuU2MoZnVuY3Rpb24oYyl7TXUoYyx7V2E6ITB9KX0pO2EuJCYmIWIuV2EmJmEuJC5KbihiKX0senU9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/e306YjthLmlrPSExO2EuJCYmIWIuV2EmJnp1KGEuJCxiKX0sTnU9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/e306YjthLmlrPSEwO2EuYnc9ITE7YS5TYyhmdW5jdGlvbihjKXtOdShjLHtXYTohMH0pfSk7YS4kJiYhYi5XYSYmYS4kLkhuKGIpfTsKTHUucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hP3t9OmE7dmFyIGI9dGhpcy5YQyhhLldhKTt0aGlzLnN0YXR1cz0iRElTQUJMRUQiO3RoaXMuZXJyb3JzPW51bGw7dGhpcy5TYyhmdW5jdGlvbihjKXtjLmRpc2FibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtXYTohMH0pKX0pO3RoaXMuRGwoKTshMSE9PWEuZmImJih0aGlzLnptLmVtaXQodGhpcy52YWx1ZSksdGhpcy52cC5lbWl0KHRoaXMuc3RhdHVzKSk7dGhpcy5kRShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse1FIOmJ9KSk7dGhpcy5YcS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3JldHVybiBjKCEwKX0pfTsKTHUucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/e306YTt2YXIgYj10aGlzLlhDKGEuV2EpO3RoaXMuc3RhdHVzPSJWQUxJRCI7dGhpcy5TYyhmdW5jdGlvbihjKXtjLmVuYWJsZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse1dhOiEwfSkpfSk7dXUodGhpcyx7V2E6ITAsZmI6YS5mYn0pO3RoaXMuZEUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtRSDpifSkpO3RoaXMuWHEuZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gYyghMSl9KX07THUucHJvdG90eXBlLmRFPWZ1bmN0aW9uKGEpe3RoaXMuJCYmIWEuV2EmJih1dSh0aGlzLiQsYSksYS5RSHx8dGhpcy4kLkhuKCksdGhpcy4kLkpuKCkpfTsKdmFyIHV1PWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7YS5rTigpO2EuRGwoKTthLmVuYWJsZWQmJihhLkpKKCksYS5lcnJvcnM9YS4kTSgpLGEuc3RhdHVzPWEueUEoKSwiVkFMSUQiIT09YS5zdGF0dXMmJiJQRU5ESU5HIiE9PWEuc3RhdHVzfHxhLlpNKGIuZmIpKTshMSE9PWIuZmImJihhLnptLmVtaXQoYS52YWx1ZSksYS52cC5lbWl0KGEuc3RhdHVzKSk7YS4kJiYhYi5XYSYmdXUoYS4kLGIpfTtoPUx1LnByb3RvdHlwZTtoLm5FPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT97ZmI6ITB9OmE7dGhpcy5TYyhmdW5jdGlvbihiKXtyZXR1cm4gYi5uRShhKX0pO3V1KHRoaXMse1dhOiEwLGZiOmEuZmJ9KX07aC5rTj1mdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuVnAoKT8iRElTQUJMRUQiOiJWQUxJRCJ9O2guJE09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5paD90aGlzLmloKHRoaXMpOm51bGx9OwpoLlpNPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5EZyYmKHRoaXMuc3RhdHVzPSJQRU5ESU5HIix0aGlzLkRxPSEwLHRoaXMub0E9bXUodGhpcy5EZyh0aGlzKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2IuRHE9ITE7dmFyIGQ9e2ZiOmF9O2Q9dm9pZCAwPT09ZD97fTpkO2IuZXJyb3JzPWM7Yi5lRSghMSE9PWQuZmIpfSkpfTtoLkpKPWZ1bmN0aW9uKCl7dGhpcy5vQSYmKHRoaXMub0EudW5zdWJzY3JpYmUoKSx0aGlzLkRxPSExKX07aC5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEZ1KHRoaXMsYSl9O2guZ2V0RXJyb3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYj1iP3RoaXMuZ2V0KGIpOnRoaXMpJiZiLmVycm9ycz9iLmVycm9yc1thXTpudWxsfTtoLlpsPWZ1bmN0aW9uKGEsYil7cmV0dXJuISF0aGlzLmdldEVycm9yKGEsYil9O2guZUU9ZnVuY3Rpb24oYSl7dGhpcy5zdGF0dXM9dGhpcy55QSgpO2EmJnRoaXMudnAuZW1pdCh0aGlzLnN0YXR1cyk7dGhpcy4kJiZ0aGlzLiQuZUUoYSl9OwpoLmp2PWZ1bmN0aW9uKCl7dGhpcy56bT1uZXcgcms7dGhpcy52cD1uZXcgcmt9O2gueUE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WcCgpPyJESVNBQkxFRCI6dGhpcy5lcnJvcnM/IklOVkFMSUQiOnRoaXMuRHF8fHRoaXMuakEoIlBFTkRJTkciKT8iUEVORElORyI6dGhpcy5qQSgiSU5WQUxJRCIpPyJJTlZBTElEIjoiVkFMSUQifTtoLmpBPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxtKGZ1bmN0aW9uKGIpe3JldHVybiBiLnN0YXR1cz09PWF9KX07aC5pQT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkxtKGZ1bmN0aW9uKGEpe3JldHVybiBhLlRmfSl9O2guY0o9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MbShmdW5jdGlvbihhKXtyZXR1cm4gYS5oaH0pfTtoLkhuPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT97fTphO3RoaXMuaWs9IXRoaXMuaUEoKTt0aGlzLiQmJiFhLldhJiZ0aGlzLiQuSG4oYSl9OwpoLkpuPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT97fTphO3RoaXMuaGg9dGhpcy5jSigpO3RoaXMuJCYmIWEuV2EmJnRoaXMuJC5KbihhKX07aC5ETD1mdW5jdGlvbihhKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBhJiZudWxsIT09YSYmMj09PU9iamVjdC5rZXlzKGEpLmxlbmd0aCYmInZhbHVlImluIGEmJiJkaXNhYmxlZCJpbiBhfTtoLnFqPWZ1bmN0aW9uKGEpe3RoaXMueGg9YX07aC5yaj1mdW5jdGlvbihhKXtKdShhKSYmbnVsbCE9YS5DZiYmKHRoaXMuSXI9YS5DZil9O2guWEM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kJiZ0aGlzLiQuVGY7cmV0dXJuIWEmJmImJiF0aGlzLiQuaUEoKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTHUucHJvdG90eXBlLHtwYXJlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR9fSx2YWxpZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIlZBTElEIj09PXRoaXMuc3RhdHVzfX0sSnM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJJTlZBTElEIj09PXRoaXMuc3RhdHVzfX0scGVuZGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIlBFTkRJTkciPT10aGlzLnN0YXR1c319LGRpc2FibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRElTQUJMRUQiPT09dGhpcy5zdGF0dXN9fSxlbmFibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iRElTQUJMRUQiIT09CnRoaXMuc3RhdHVzfX0sVGY6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmlrfX0sTHo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmhofX0sQ2Y6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLklyP3RoaXMuSXI6dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQuQ2Y6ImNoYW5nZSJ9fSxyb290Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpczthLiQ7KWE9YS4kO3JldHVybiBhfX19KTt2YXIgT3U9ZnVuY3Rpb24oYSxiLGMpe2E9dm9pZCAwPT09YT9udWxsOmE7THUuY2FsbCh0aGlzLEl1KGIpLEt1KGMsYikpO3RoaXMucmQ9W107dGhpcy5sQShhKTt0aGlzLnJqKGIpO3V1KHRoaXMse1dhOiEwLGZiOiExfSk7dGhpcy5qdigpfTt0KE91LEx1KTtoPU91LnByb3RvdHlwZTsKaC5zZXRWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yj12b2lkIDA9PT1iP3t9OmI7dGhpcy52YWx1ZT10aGlzLnJsPWE7dGhpcy5yZC5sZW5ndGgmJiExIT09Yi50RiYmdGhpcy5yZC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3JldHVybiBkKGMudmFsdWUsITEhPT1iLnhQKX0pO3V1KHRoaXMsYil9O2gucmVzZXQ9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/e306Yjt0aGlzLmxBKHZvaWQgMD09PWE/bnVsbDphKTtOdSh0aGlzLGIpO011KHRoaXMsYik7dGhpcy5zZXRWYWx1ZSh0aGlzLnZhbHVlLGIpO3RoaXMuYXI9ITF9O2guRGw9ZnVuY3Rpb24oKXt9O2guTG09ZnVuY3Rpb24oKXtyZXR1cm4hMX07aC5WcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfTtoLkZkPWZ1bmN0aW9uKGEpe3RoaXMucmQucHVzaChhKX07aC5SSj1mdW5jdGlvbigpe3RoaXMucmQ9W107dGhpcy5YcT1bXTt0aGlzLnhoPWZ1bmN0aW9uKCl7fX07dmFyIHR1PWZ1bmN0aW9uKGEsYil7YS5YcS5wdXNoKGIpfTsKT3UucHJvdG90eXBlLlNjPWZ1bmN0aW9uKCl7fTtPdS5wcm90b3R5cGUuRHI9ZnVuY3Rpb24oKXtyZXR1cm4ic3VibWl0Ij09PXRoaXMuQ2YmJih0aGlzLmJ3JiZ6dSh0aGlzKSx0aGlzLlpDJiZ5dSh0aGlzKSx0aGlzLmFyKT8odGhpcy5zZXRWYWx1ZSh0aGlzLnJsLHtXYTohMCx0RjohMX0pLCEwKTohMX07T3UucHJvdG90eXBlLmxBPWZ1bmN0aW9uKGEpe3RoaXMuREwoYSk/KHRoaXMudmFsdWU9dGhpcy5ybD1hLnZhbHVlLGEuZGlzYWJsZWQ/dGhpcy5kaXNhYmxlKHtXYTohMCxmYjohMX0pOnRoaXMuZW5hYmxlKHtXYTohMCxmYjohMX0pKTp0aGlzLnZhbHVlPXRoaXMucmw9YX07dmFyIEd1PWZ1bmN0aW9uKGEsYixjKXtMdS5jYWxsKHRoaXMsSXUoYiksS3UoYyxiKSk7dGhpcy5jb250cm9scz1hO3RoaXMuanYoKTt0aGlzLnJqKGIpO3RoaXMuQ3coKTt1dSh0aGlzLHtXYTohMCxmYjohMX0pfTt0KEd1LEx1KTsKdmFyIFB1PWZ1bmN0aW9uKGEsYixjKXtpZihhLmNvbnRyb2xzW2JdKXJldHVybiBhLmNvbnRyb2xzW2JdO2EuY29udHJvbHNbYl09YztjLiQ9YTtjLnFqKGEueGgpO3JldHVybiBjfTtoPUd1LnByb3RvdHlwZTtoLmx4PWZ1bmN0aW9uKGEpe1B1KHRoaXMsYSx2b2lkIDApO3V1KHRoaXMpO3RoaXMueGgoKX07aC5qdD1mdW5jdGlvbihhKXt0aGlzLmNvbnRyb2xzW2FdJiZ0aGlzLmNvbnRyb2xzW2FdLnFqKGZ1bmN0aW9uKCl7fSk7ZGVsZXRlIHRoaXMuY29udHJvbHNbYV07dXUodGhpcyk7dGhpcy54aCgpfTtoLmNvbnRhaW5zPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGEpJiZ0aGlzLmNvbnRyb2xzW2FdLmVuYWJsZWR9OwpoLnNldFZhbHVlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztiPXZvaWQgMD09PWI/e306Yjt0aGlzLnJ1KGEpO09iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24oZCl7Yy5RdyhkKTtjLmNvbnRyb2xzW2RdLnNldFZhbHVlKGFbZF0se1dhOiEwLGZiOmIuZmJ9KX0pO3V1KHRoaXMsYil9O2gucmVzZXQ9ZnVuY3Rpb24oYSxiKXthPXZvaWQgMD09PWE/e306YTtiPXZvaWQgMD09PWI/e306Yjt0aGlzLlNjKGZ1bmN0aW9uKGMsZCl7Yy5yZXNldChhW2RdLHtXYTohMCxmYjpiLmZifSl9KTt0aGlzLkhuKGIpO3RoaXMuSm4oYik7dXUodGhpcyxiKX07aC5Ecj1mdW5jdGlvbigpe3ZhciBhPXRoaXMubUQoITEsZnVuY3Rpb24oYixjKXtyZXR1cm4gYy5EcigpPyEwOmJ9KTthJiZ1dSh0aGlzLHtXYTohMH0pO3JldHVybiBhfTsKaC5Rdz1mdW5jdGlvbihhKXtpZighT2JqZWN0LmtleXModGhpcy5jb250cm9scykubGVuZ3RoKXRocm93IEVycm9yKCJcbiAgICAgICAgVGhlcmUgYXJlIG5vIGZvcm0gY29udHJvbHMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZ3JvdXAgeWV0LiAgSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsXG4gICAgICAgIHlvdSBtYXkgd2FudCB0byBjaGVjayBuZXh0IHRpY2sgKGUuZy4gdXNlIHNldFRpbWVvdXQpLlxuICAgICAgIik7aWYoIXRoaXMuY29udHJvbHNbYV0pdGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGZvcm0gY29udHJvbCB3aXRoIG5hbWU6ICIrYSsiLiIpO307aC5TYz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO09iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGEoYi5jb250cm9sc1tjXSxjKX0pfTtoLkN3PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLlNjKGZ1bmN0aW9uKGIpe2IuJD1hO2IucWooYS54aCl9KX07CmguRGw9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuS00oKX07aC5MbT1mdW5jdGlvbihhKXtmb3IodmFyIGI9bihPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKSksYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpe2M9Yy52YWx1ZTt2YXIgZD10aGlzLmNvbnRyb2xzW2NdO2lmKHRoaXMuY29udGFpbnMoYykmJmEoZCkpcmV0dXJuITB9cmV0dXJuITF9O2guS009ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLm1EKHt9LGZ1bmN0aW9uKGIsYyxkKXtpZihjLmVuYWJsZWR8fGEuZGlzYWJsZWQpYltkXT1jLnZhbHVlO3JldHVybiBifSl9O2gubUQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hO3RoaXMuU2MoZnVuY3Rpb24oZCxlKXtjPWIoYyxkLGUpfSk7cmV0dXJuIGN9OwpoLlZwPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW4oT2JqZWN0LmtleXModGhpcy5jb250cm9scykpLGI9YS5uZXh0KCk7IWIuZG9uZTtiPWEubmV4dCgpKWlmKHRoaXMuY29udHJvbHNbYi52YWx1ZV0uZW5hYmxlZClyZXR1cm4hMTtyZXR1cm4gMDxPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKS5sZW5ndGh8fHRoaXMuZGlzYWJsZWR9O2gucnU9ZnVuY3Rpb24oYSl7dGhpcy5TYyhmdW5jdGlvbihiLGMpe2lmKHZvaWQgMD09PWFbY10pdGhyb3cgRXJyb3IoIk11c3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGZvcm0gY29udHJvbCB3aXRoIG5hbWU6ICciK2MrIicuIik7fSl9O3ZhciBIdT1mdW5jdGlvbihhLGIsYyl7THUuY2FsbCh0aGlzLEl1KGIpLEt1KGMsYikpO3RoaXMuY29udHJvbHM9YTt0aGlzLmp2KCk7dGhpcy5yaihiKTt0aGlzLkN3KCk7dXUodGhpcyx7V2E6ITAsZmI6ITF9KX07dChIdSxMdSk7aD1IdS5wcm90b3R5cGU7CmgucHVzaD1mdW5jdGlvbihhKXt0aGlzLmNvbnRyb2xzLnB1c2goYSk7dGhpcy5udyhhKTt1dSh0aGlzKTt0aGlzLnhoKCl9O2guSXM9ZnVuY3Rpb24oYSxiKXt0aGlzLmNvbnRyb2xzLnNwbGljZShhLDAsYik7dGhpcy5udyhiKTt1dSh0aGlzKX07aC5zZXRWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yj12b2lkIDA9PT1iP3t9OmI7dGhpcy5ydShhKTthLmZvckVhY2goZnVuY3Rpb24oZCxlKXtjLlF3KGUpO2MuY29udHJvbHNbZV0uc2V0VmFsdWUoZCx7V2E6ITAsZmI6Yi5mYn0pfSk7dXUodGhpcyxiKX07aC5yZXNldD1mdW5jdGlvbihhLGIpe2E9dm9pZCAwPT09YT9bXTphO2I9dm9pZCAwPT09Yj97fTpiO3RoaXMuU2MoZnVuY3Rpb24oYyxkKXtjLnJlc2V0KGFbZF0se1dhOiEwLGZiOmIuZmJ9KX0pO3RoaXMuSG4oYik7dGhpcy5KbihiKTt1dSh0aGlzLGIpfTsKaC5jbGVhcj1mdW5jdGlvbigpezE+dGhpcy5jb250cm9scy5sZW5ndGh8fCh0aGlzLlNjKGZ1bmN0aW9uKGEpe3JldHVybiBhLnFqKGZ1bmN0aW9uKCl7fSl9KSx0aGlzLmNvbnRyb2xzLnNwbGljZSgwKSx1dSh0aGlzKSl9O2guRHI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnRyb2xzLnJlZHVjZShmdW5jdGlvbihiLGMpe3JldHVybiBjLkRyKCk/ITA6Yn0sITEpO2EmJnV1KHRoaXMse1dhOiEwfSk7cmV0dXJuIGF9OwpoLlF3PWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzLmxlbmd0aCl0aHJvdyBFcnJvcigiXG4gICAgICAgIFRoZXJlIGFyZSBubyBmb3JtIGNvbnRyb2xzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGFycmF5IHlldC4gIElmIHlvdSdyZSB1c2luZyBuZ01vZGVsLFxuICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS5cbiAgICAgICIpO2lmKCF0aGlzLmNvbnRyb2xzW2FdKXRocm93IEVycm9yKCJDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgYXQgaW5kZXggIithKTt9O2guU2M9ZnVuY3Rpb24oYSl7dGhpcy5jb250cm9scy5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7YShiLGMpfSl9O2guRGw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudmFsdWU9dGhpcy5jb250cm9scy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuZW5hYmxlZHx8YS5kaXNhYmxlZH0pLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi52YWx1ZX0pfTsKaC5MbT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb250cm9scy5zb21lKGZ1bmN0aW9uKGIpe3JldHVybiBiLmVuYWJsZWQmJmEoYil9KX07aC5Ddz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5TYyhmdW5jdGlvbihiKXtyZXR1cm4gYS5udyhiKX0pfTtoLnJ1PWZ1bmN0aW9uKGEpe3RoaXMuU2MoZnVuY3Rpb24oYixjKXtpZih2b2lkIDA9PT1hW2NdKXRocm93IEVycm9yKCJNdXN0IHN1cHBseSBhIHZhbHVlIGZvciBmb3JtIGNvbnRyb2wgYXQgaW5kZXg6ICIrYysiLiIpO30pfTtoLlZwPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW4odGhpcy5jb250cm9scyksYj1hLm5leHQoKTshYi5kb25lO2I9YS5uZXh0KCkpaWYoYi52YWx1ZS5lbmFibGVkKXJldHVybiExO3JldHVybiAwPHRoaXMuY29udHJvbHMubGVuZ3RofHx0aGlzLmRpc2FibGVkfTtoLm53PWZ1bmN0aW9uKGEpe2EuJD10aGlzO2EucWoodGhpcy54aCl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEh1LnByb3RvdHlwZSx7bGVuZ3RoOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250cm9scy5sZW5ndGh9fX0pO3ZhciBRdT1Qcm9taXNlLnJlc29sdmUobnVsbCksUnU9ZnVuY3Rpb24oYSxiKXt0aGlzLmJJPSExO3RoaXMuV0E9W107dGhpcy5mb3JtPW5ldyBHdSh7fSxBdShhKSxCdShiKSl9O3QoUnUsV3QpO2g9UnUucHJvdG90eXBlO2guTGM9ZnVuY3Rpb24oKXt0aGlzLnJqKCl9O2gubHg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztRdS50aGVuKGZ1bmN0aW9uKCl7dmFyIGM9Yi5xQihhLnBhdGgpO2EuY29udHJvbD1QdShjLGEubmFtZSxhLmNvbnRyb2wpO291KGEuY29udHJvbCxhKTt1dShhLmNvbnRyb2wse2ZiOiExfSk7Yi5XQS5wdXNoKGEpfSl9O2guanQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztRdS50aGVuKGZ1bmN0aW9uKCl7dmFyIGM9Yi5xQihhLnBhdGgpO2MmJmMuanQoYS5uYW1lKTtjPWIuV0E7dmFyIGQ9Yy5pbmRleE9mKGEpOy0xPGQmJmMuc3BsaWNlKGQsMSl9KX07aC5zZXRWYWx1ZT1mdW5jdGlvbihhKXt0aGlzLmNvbnRyb2wuc2V0VmFsdWUoYSl9OwpoLnJqPWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZudWxsIT10aGlzLm9wdGlvbnMuQ2YmJih0aGlzLmZvcm0uSXI9dGhpcy5vcHRpb25zLkNmKX07aC5xQj1mdW5jdGlvbihhKXthLnBvcCgpO3JldHVybiBhLmxlbmd0aD90aGlzLmZvcm0uZ2V0KGEpOnRoaXMuZm9ybX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSdS5wcm90b3R5cGUse0pqOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LGNvbnRyb2w6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm19fSxwYXRoOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGNvbnRyb2xzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzfX19KTt2YXIgU3U9UHJvbWlzZS5yZXNvbHZlKG51bGwpLFR1PWZ1bmN0aW9uKGEsYixjLGQpe1Z0LmNhbGwodGhpcyk7dGhpcy5jb250cm9sPW5ldyBPdTt0aGlzLm9EPSExO3RoaXMudXBkYXRlPW5ldyByazt0aGlzLiQ9YTt0aGlzLnFyPWJ8fFtdO3RoaXMucHI9Y3x8W107dGhpcy5FZj1FdSh0aGlzLGQpfTt0KFR1LFZ0KTtoPVR1LnByb3RvdHlwZTtoLlNhPWZ1bmN0aW9uKGEpe3RoaXMuTUooKTt0aGlzLm9EfHx0aGlzLnNOKCk7ImlzRGlzYWJsZWQiaW4gYSYmdGhpcy5iTyhhKTt2YXIgYj10aGlzLlF6O2EuaGFzT3duUHJvcGVydHkoIm1vZGVsIik/KGE9YS5tb2RlbCxiPWEuRlA/ITA6IU9iamVjdC5pcyhiLGEuSmMpKTpiPSExO2ImJih0aGlzLkRsKHRoaXMubW9kZWwpLHRoaXMuUXo9dGhpcy5tb2RlbCl9O2guWD1mdW5jdGlvbigpe3RoaXMuSmomJnRoaXMuSmouanQodGhpcyl9OwpoLnNOPWZ1bmN0aW9uKCl7dGhpcy5yaigpO3RoaXMudnYoKT90aGlzLnROKCk6dGhpcy5Kai5seCh0aGlzKTt0aGlzLm9EPSEwfTtoLnJqPWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZudWxsIT10aGlzLm9wdGlvbnMuQ2YmJih0aGlzLmNvbnRyb2wuSXI9dGhpcy5vcHRpb25zLkNmKX07aC52dj1mdW5jdGlvbigpe3JldHVybiF0aGlzLiR8fCEoIXRoaXMub3B0aW9uc3x8IXRoaXMub3B0aW9ucy5UUyl9O2gudE49ZnVuY3Rpb24oKXtvdSh0aGlzLmNvbnRyb2wsdGhpcyk7dXUodGhpcy5jb250cm9sLHtmYjohMX0pfTtoLk1KPWZ1bmN0aW9uKCl7dGhpcy52digpfHx0aGlzLlBKKCk7dGhpcy5zdSgpfTsKaC5QSj1mdW5jdGlvbigpe2lmKCEodGhpcy4kIGluc3RhbmNlb2YgUnUpKXRocm93IEVycm9yKCdcbiAgICAgIG5nTW9kZWwgY2Fubm90IGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9ybSBjb250cm9scyB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBUcnkgdXNpbmdcbiAgICAgIGZvcm1Hcm91cFwncyBwYXJ0bmVyIGRpcmVjdGl2ZSAiZm9ybUNvbnRyb2xOYW1lIiBpbnN0ZWFkLiAgRXhhbXBsZTpcblxuICAgICAgXG4gICAgPGRpdiBbZm9ybUdyb3VwXT0ibXlHcm91cCI+XG4gICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPSJmaXJzdE5hbWUiPlxuICAgIDwvZGl2PlxuXG4gICAgSW4geW91ciBjbGFzczpcblxuICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgIGZpcnN0TmFtZTogbmV3IEZvcm1Db250cm9sKClcbiAgICB9KTtcblxuICAgICAgT3IsIGlmIHlvdVwnZCBsaWtlIHRvIGF2b2lkIHJlZ2lzdGVyaW5nIHRoaXMgZm9ybSBjb250cm9sLCBpbmRpY2F0ZSB0aGF0IGl0XCdzIHN0YW5kYWxvbmUgaW4gbmdNb2RlbE9wdGlvbnM6XG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+XG4gICAgICAgPGlucHV0IFsobmdNb2RlbCldPSJzaG93TW9yZUNvbnRyb2xzIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPlxuICAgIDwvZGl2PlxuICAnKTt9OwpoLnN1PWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubmFtZSYmKHRoaXMubmFtZT10aGlzLm9wdGlvbnMubmFtZSk7aWYoIXRoaXMudnYoKSYmIXRoaXMubmFtZSl0aHJvdyBFcnJvcignSWYgbmdNb2RlbCBpcyB1c2VkIHdpdGhpbiBhIGZvcm0gdGFnLCBlaXRoZXIgdGhlIG5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0IG9yIHRoZSBmb3JtXG4gICAgICBjb250cm9sIG11c3QgYmUgZGVmaW5lZCBhcyBcJ3N0YW5kYWxvbmVcJyBpbiBuZ01vZGVsT3B0aW9ucy5cblxuICAgICAgRXhhbXBsZSAxOiA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5maXJzdE5hbWUiIG5hbWU9ImZpcnN0Ij5cbiAgICAgIEV4YW1wbGUgMjogPGlucHV0IFsobmdNb2RlbCldPSJwZXJzb24uZmlyc3ROYW1lIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPicpO307CmguRGw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztTdS50aGVuKGZ1bmN0aW9uKCl7Yi5jb250cm9sLnNldFZhbHVlKGEse3hQOiExfSl9KX07aC5iTz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2E9YS5pc0Rpc2FibGVkLkpjO3ZhciBjPSIiPT09YXx8YSYmImZhbHNlIiE9PWE7U3UudGhlbihmdW5jdGlvbigpe2MmJiFiLmNvbnRyb2wuZGlzYWJsZWQ/Yi5jb250cm9sLmRpc2FibGUoKTohYyYmYi5jb250cm9sLmRpc2FibGVkJiZiLmNvbnRyb2wuZW5hYmxlKCl9KX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVHUucHJvdG90eXBlLHtwYXRoOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLiQpe3ZhciBhPXRoaXMubmFtZTthPVtdLmNvbmNhdChqYSh0aGlzLiQucGF0aCksW2FdKX1lbHNlIGE9W3RoaXMubmFtZV07cmV0dXJuIGF9fSxKajp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJD90aGlzLiQuSmo6bnVsbH19LGloOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQXUodGhpcy5xcil9fSxEZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEJ1KHRoaXMucHIpfX19KTt2YXIgVXU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5PPWE7dGhpcy5pSj1iO3RoaXMuYkk9ITE7dGhpcy5TeD1bXTt0aGlzLmZvcm09bnVsbH07dChVdSxXdCk7aD1VdS5wcm90b3R5cGU7aC5TYT1mdW5jdGlvbihhKXt0aGlzLk5KKCk7YS5oYXNPd25Qcm9wZXJ0eSgiZm9ybSIpJiYodGhpcy5pTygpLHRoaXMuZ0UoKSx0aGlzLmZPKCkpfTtoLmx4PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZm9ybS5nZXQoYS5wYXRoKTtvdShiLGEpO3V1KGIse2ZiOiExfSk7dGhpcy5TeC5wdXNoKGEpfTtoLmp0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuU3g7YT1iLmluZGV4T2YoYSk7LTE8YSYmYi5zcGxpY2UoYSwxKX07aC5nRT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5TeC5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWEuZm9ybS5nZXQoYi5wYXRoKTtiLmNvbnRyb2whPT1jJiYodnUoYi5jb250cm9sLGIpLGMmJm91KGMsYiksYi5jb250cm9sPWMpfSk7dGhpcy5mb3JtLm5FKHtmYjohMX0pfTsKaC5mTz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5mb3JtLnFqKGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ0UoKX0pO3RoaXMuTEMmJnRoaXMuTEMucWooZnVuY3Rpb24oKXt9KTt0aGlzLkxDPXRoaXMuZm9ybX07aC5pTz1mdW5jdGlvbigpe3ZhciBhPUF1KHRoaXMubk8pO3RoaXMuZm9ybS5paD1rdShbdGhpcy5mb3JtLmloLGFdKTthPUJ1KHRoaXMuaUopO3RoaXMuZm9ybS5EZz1udShbdGhpcy5mb3JtLkRnLGFdKX07CmguTko9ZnVuY3Rpb24oKXtpZighdGhpcy5mb3JtKXRocm93IEVycm9yKCdmb3JtR3JvdXAgZXhwZWN0cyBhIEZvcm1Hcm91cCBpbnN0YW5jZS4gUGxlYXNlIHBhc3Mgb25lIGluLlxuXG4gICAgICAgRXhhbXBsZTpcblxuICAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgPGlucHV0IGZvcm1Db250cm9sTmFtZT0iZmlyc3ROYW1lIj5cbiAgICA8L2Rpdj5cblxuICAgIEluIHlvdXIgY2xhc3M6XG5cbiAgICB0aGlzLm15R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICBmaXJzdE5hbWU6IG5ldyBGb3JtQ29udHJvbCgpXG4gICAgfSk7Jyk7fTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhVdS5wcm90b3R5cGUse0pqOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LGNvbnRyb2w6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZvcm19fSxwYXRoOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSk7dmFyIFZ1PWZ1bmN0aW9uKCl7fTtWdS5wcm90b3R5cGUudmFsaWRhdGU9ZnVuY3Rpb24oYSl7dGhpcy5yZXF1aXJlZD8oYT1hLnZhbHVlLGE9bnVsbD09YXx8MD09PWEubGVuZ3RoP3tyZXF1aXJlZDohMH06bnVsbCk6YT1udWxsO3JldHVybiBhfTtWdS5wcm90b3R5cGUuRWk9ZnVuY3Rpb24oYSl7dGhpcy5yZD1hfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFZ1LnByb3RvdHlwZSx7cmVxdWlyZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlljfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ZYz1udWxsIT1hJiYhMSE9PWEmJiJmYWxzZSIhPT0iIithO3RoaXMucmQmJnRoaXMucmQoKX19fSk7dmFyIFd1PWZ1bmN0aW9uKCl7fTt2YXIgWHU9ZnVuY3Rpb24oKXt9O25ldyBqZjt2YXIgWXU9ZnVuY3Rpb24oYSxiKXt0aGlzLklDPTA7dGhpcy5wYT1hLkVqKGIuYm9keSx7aWQ6IjAiLFQ6MixnOltdLGRhdGE6e2FuaW1hdGlvbjpbXX19KX07dChZdSxvcSk7WXUucHJvdG90eXBlLkFqPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSUMudG9TdHJpbmcoKTt0aGlzLklDKys7dGhpcy5wYS5zZXRQcm9wZXJ0eShudWxsLCJAQCIrYisiOnJlZ2lzdGVyIixbQXJyYXkuaXNBcnJheShhKT97dHlwZToyLGplOmEsb3B0aW9uczpudWxsfTphXSk7cmV0dXJuIG5ldyBadShiLHRoaXMucGEpfTt2YXIgWnU9ZnVuY3Rpb24oYSxiKXt0aGlzLmhqPWE7dGhpcy5wYT1ifTt0KFp1LHBxKTtadS5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyAkdSh0aGlzLmhqLGEsYnx8e30sdGhpcy5wYSl9Owp2YXIgJHU9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5pZD1hO3RoaXMuZWxlbWVudD1iO3RoaXMucGE9ZDt0aGlzLmNrPW51bGw7dGhpcy53ZD0hMTt0aGlzLnRvdGFsVGltZT0wO3RoaXMubmcoImNyZWF0ZSIsYyl9O2g9JHUucHJvdG90eXBlO2guQ3Y9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wYS5mYyh0aGlzLmVsZW1lbnQsIkBAIit0aGlzLmlkKyI6IithLGIpfTtoLm5nPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0xXT1hcmd1bWVudHNbZF07cmV0dXJuIHRoaXMucGEuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50LCJAQCIrdGhpcy5pZCsiOiIrYSxjKX07aC5lZD1mdW5jdGlvbihhKXt0aGlzLkN2KCJkb25lIixhKX07aC5MZT1mdW5jdGlvbihhKXt0aGlzLkN2KCJzdGFydCIsYSl9O2guVmE9ZnVuY3Rpb24oYSl7dGhpcy5DdigiZGVzdHJveSIsYSl9O2guaW5pdD1mdW5jdGlvbigpe3RoaXMubmcoImluaXQiKX07CmguY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZH07aC5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5uZygicGxheSIpO3RoaXMud2Q9ITB9O2gucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLm5nKCJwYXVzZSIpfTtoLkZpPWZ1bmN0aW9uKCl7dGhpcy5uZygicmVzdGFydCIpfTtoLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMubmcoImZpbmlzaCIpfTtoLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLm5nKCJkZXN0cm95Iil9O2gucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLm5nKCJyZXNldCIpfTtoLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGEpe3RoaXMubmcoInNldFBvc2l0aW9uIixhKX07dmFyIGF2PWZ1bmN0aW9uKGEsYixjKXt0aGlzLlU9YTt0aGlzLmJlPWI7dGhpcy5iYj1jO3RoaXMuUUE9MDt0aGlzLkp2PTE7dGhpcy5YcD1bXTt0aGlzLnVEPW5ldyBNYXA7dGhpcy5xdT0wO3RoaXMuZmU9UHJvbWlzZS5yZXNvbHZlKDApO2IuV289ZnVuY3Rpb24oZCxlKXtlJiZlLnBhcmVudE5vZGUoZCkmJmUucmVtb3ZlQ2hpbGQoZC5wYXJlbnROb2RlLGQpfX07CmF2LnByb3RvdHlwZS5Faj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLlUuRWooYSxiKTtpZighKGEmJmImJmIuZGF0YSYmYi5kYXRhLmFuaW1hdGlvbikpcmV0dXJuIGI9dGhpcy51RC5nZXQoZCksYnx8KGI9bmV3IGJ2KCIiLGQsdGhpcy5iZSksdGhpcy51RC5zZXQoZCxiKSksYjt2YXIgZT1iLmlkLGY9Yi5pZCsiLSIrdGhpcy5RQTt0aGlzLlFBKys7dGhpcy5iZS5yZWdpc3RlcihmLGEpO3ZhciBnPWZ1bmN0aW9uKGwpe0FycmF5LmlzQXJyYXkobCk/bC5mb3JFYWNoKGcpOmMuYmUuZ3ooZSxmLGEsbC5uYW1lLGwpfTtiLmRhdGEuYW5pbWF0aW9uLmZvckVhY2goZyk7cmV0dXJuIG5ldyBjdih0aGlzLGYsZCx0aGlzLmJlKX07YXYucHJvdG90eXBlLlFoPWZ1bmN0aW9uKCl7dGhpcy5xdSsrO3RoaXMuVS5RaCYmdGhpcy5VLlFoKCl9O2F2LnByb3RvdHlwZS5iTj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5mZS50aGVuKGZ1bmN0aW9uKCl7YS5KdisrfSl9Owp2YXIgZHY9ZnVuY3Rpb24oYSxiLGMsZCl7MDw9YiYmYjxhLkp2P2EuYmIuZ2EoZnVuY3Rpb24oKXtyZXR1cm4gYyhkKX0pOigwPT1hLlhwLmxlbmd0aCYmUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oZnVuY3Rpb24oKXthLmJiLmdhKGZ1bmN0aW9uKCl7YS5YcC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBmPW4oZSk7ZT1mLm5leHQoKS52YWx1ZTtmPWYubmV4dCgpLnZhbHVlO2UoZil9KTthLlhwPVtdfSl9KSxhLlhwLnB1c2goW2MsZF0pKX07YXYucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5xdS0tOzA9PXRoaXMucXUmJnRoaXMuYmIub2EoZnVuY3Rpb24oKXthLmJOKCk7YS5iZS5mbHVzaChhLkp2KX0pO3RoaXMuVS5lbmQmJnRoaXMuVS5lbmQoKX07dmFyIGJ2PWZ1bmN0aW9uKGEsYixjKXt0aGlzLmJjPWE7dGhpcy5VPWI7dGhpcy5iZT1jO3RoaXMuVmg9dGhpcy5VLlZoP2Z1bmN0aW9uKGQpe3JldHVybiBiLlZoKGQpfTpudWxsfTtoPWJ2LnByb3RvdHlwZTsKaC5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5iZS5kZXN0cm95KHRoaXMuYmMsdGhpcy5VKTt0aGlzLlUuZGVzdHJveSgpfTtoLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5VLmNyZWF0ZUVsZW1lbnQoYSxiKX07aC5jcmVhdGVDb21tZW50PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlUuY3JlYXRlQ29tbWVudChhKX07aC5ibz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5VLmJvKGEpfTtoLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGEsYil7dGhpcy5VLmFwcGVuZENoaWxkKGEsYik7dGhpcy5iZS50ZS5pbnNlcnROb2RlKHRoaXMuYmMsYixhLCExKX07aC5pbnNlcnRCZWZvcmU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuVS5pbnNlcnRCZWZvcmUoYSxiLGMpO3RoaXMuYmUudGUuaW5zZXJ0Tm9kZSh0aGlzLmJjLGIsYSwhMCl9O2gucmVtb3ZlQ2hpbGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmUudGUucmVtb3ZlTm9kZSh0aGlzLmJjLGIsY3x8ITEsdGhpcy5VKX07CmgubnA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5VLm5wKGEsYil9O2gucGFyZW50Tm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5VLnBhcmVudE5vZGUoYSl9O2gubmV4dFNpYmxpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuVS5uZXh0U2libGluZyhhKX07aC5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5VLnNldEF0dHJpYnV0ZShhLGIsYyxkKX07aC5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuVS5yZW1vdmVBdHRyaWJ1dGUoYSxiLGMpfTtoLkZsPWZ1bmN0aW9uKGEsYil7dGhpcy5VLkZsKGEsYil9O2gubW09ZnVuY3Rpb24oYSxiKXt0aGlzLlUubW0oYSxiKX07aC50bT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlUudG0oYSxiLGMsZCl9O2gubm09ZnVuY3Rpb24oYSxiLGMpe3RoaXMuVS5ubShhLGIsYyl9OwpoLnNldFByb3BlcnR5PWZ1bmN0aW9uKGEsYixjKXsiQCI9PWIuY2hhckF0KDApJiYiQC5kaXNhYmxlZCI9PWI/dGhpcy5rcyhhLCEhYyk6dGhpcy5VLnNldFByb3BlcnR5KGEsYixjKX07aC5zZXRWYWx1ZT1mdW5jdGlvbihhLGIpe3RoaXMuVS5zZXRWYWx1ZShhLGIpfTtoLmZjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5VLmZjKGEsYixjKX07aC5rcz1mdW5jdGlvbihhLGIpe3RoaXMuYmUua3MoYSxiKX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhidi5wcm90b3R5cGUse2RhdGE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlUuZGF0YX19fSk7dmFyIGN2PWZ1bmN0aW9uKGEsYixjLGQpe2J2LmNhbGwodGhpcyxiLGMsZCk7dGhpcy5WPWE7dGhpcy5iYz1ifTt0KGN2LGJ2KTsKY3YucHJvdG90eXBlLnNldFByb3BlcnR5PWZ1bmN0aW9uKGEsYixjKXsiQCI9PWIuY2hhckF0KDApPyIuIj09Yi5jaGFyQXQoMSkmJiJALmRpc2FibGVkIj09Yj90aGlzLmtzKGEsdm9pZCAwPT09Yz8hMDohIWMpOnRoaXMuYmUucHJvY2Vzcyh0aGlzLmJjLGEsYi5zdWJzdHIoMSksYyk6dGhpcy5VLnNldFByb3BlcnR5KGEsYixjKX07Y3YucHJvdG90eXBlLmZjPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO2lmKCJAIj09Yi5jaGFyQXQoMCkpe2E9ZXYoYSk7Yj1iLnN1YnN0cigxKTt2YXIgZT0iIjsiQCIhPWIuY2hhckF0KDApJiYoZT1uKGZ2KGIpKSxiPWUubmV4dCgpLnZhbHVlLGU9ZS5uZXh0KCkudmFsdWUpO3JldHVybiB0aGlzLmJlLmZjKHRoaXMuYmMsYSxiLGUsZnVuY3Rpb24oZil7ZHYoZC5WLGYuX2RhdGF8fC0xLGMsZil9KX1yZXR1cm4gdGhpcy5VLmZjKGEsYixjKX07CmZ1bmN0aW9uIGV2KGEpe3N3aXRjaChhKXtjYXNlICJib2R5IjpyZXR1cm4gZG9jdW1lbnQuYm9keTtjYXNlICJkb2N1bWVudCI6cmV0dXJuIGRvY3VtZW50O2Nhc2UgIndpbmRvdyI6cmV0dXJuIHdpbmRvdztkZWZhdWx0OnJldHVybiBhfX1mdW5jdGlvbiBmdihhKXt2YXIgYj1hLmluZGV4T2YoIi4iKTtyZXR1cm5bYS5zdWJzdHJpbmcoMCxiKSxhLnN1YnN0cihiKzEpXX07dmFyIGd2PWZ1bmN0aW9uKGEsYixjKXtRcy5jYWxsKHRoaXMsYS5ib2R5LGIsYyl9O3QoZ3YsUXMpO2Z1bmN0aW9uIGh2KCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBmdCgpP25ldyBndDpuZXcgYnR9ZnVuY3Rpb24gaXYoKXtyZXR1cm4gbmV3IFRyfWZ1bmN0aW9uIGp2KGEsYixjKXtyZXR1cm4gbmV3IGF2KGEsYixjKX12YXIga3Y9bmV3IHkoIkFuaW1hdGlvbk1vZHVsZVR5cGUiKSxsdj1be1lhOm9xLE56Oll1fSx7WWE6U3IsR3A6aXZ9LHtZYTpRcyxOejpndn0se1lhOlllLEdwOmp2LEthOltHcCxRcyxUXX1dO2phKGx2KTtqYShsdik7dmFyIG12PWZ1bmN0aW9uKCl7fTt2YXIgbnY9ZnVuY3Rpb24oYSxiKXt0aGlzLmlkPWE7dGhpcy51cmw9Yn0sb3Y9ZnVuY3Rpb24oYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyJpbXBlcmF0aXZlIjpjO2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnYuY2FsbCh0aGlzLGEsYik7dGhpcy52UT1jO3RoaXMub209ZH07dChvdixudik7b3YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIk5hdmlnYXRpb25TdGFydChpZDogIit0aGlzLmlkKyIsIHVybDogJyIrdGhpcy51cmwrIicpIn07dmFyIHB2PWZ1bmN0aW9uKGEsYixjKXtudi5jYWxsKHRoaXMsYSxiKTt0aGlzLk5hPWN9O3QocHYsbnYpO3B2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJOYXZpZ2F0aW9uRW5kKGlkOiAiK3RoaXMuaWQrIiwgdXJsOiAnIit0aGlzLnVybCsiJywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICciK3RoaXMuTmErIicpIn07dmFyIHF2PWZ1bmN0aW9uKGEsYixjKXtudi5jYWxsKHRoaXMsYSxiKTt0aGlzLnJlYXNvbj1jfTsKdChxdixudik7cXYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIk5hdmlnYXRpb25DYW5jZWwoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInKSJ9O3ZhciBydj1mdW5jdGlvbihhLGIsYyl7bnYuY2FsbCh0aGlzLGEsYik7dGhpcy5lcnJvcj1jfTt0KHJ2LG52KTtydi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iTmF2aWdhdGlvbkVycm9yKGlkOiAiK3RoaXMuaWQrIiwgdXJsOiAnIit0aGlzLnVybCsiJywgZXJyb3I6ICIrdGhpcy5lcnJvcisiKSJ9O3ZhciBzdj1mdW5jdGlvbihhLGIsYyxkKXtudi5jYWxsKHRoaXMsYSxiKTt0aGlzLk5hPWM7dGhpcy5zdGF0ZT1kfTt0KHN2LG52KTsKc3YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJvdXRlc1JlY29nbml6ZWQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy5OYSsiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiKSJ9O3ZhciB0dj1mdW5jdGlvbihhLGIsYyxkKXtudi5jYWxsKHRoaXMsYSxiKTt0aGlzLk5hPWM7dGhpcy5zdGF0ZT1kfTt0KHR2LG52KTt0di5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iR3VhcmRzQ2hlY2tTdGFydChpZDogIit0aGlzLmlkKyIsIHVybDogJyIrdGhpcy51cmwrIicsIHVybEFmdGVyUmVkaXJlY3RzOiAnIit0aGlzLk5hKyInLCBzdGF0ZTogIit0aGlzLnN0YXRlKyIpIn07dmFyIHV2PWZ1bmN0aW9uKGEsYixjLGQsZSl7bnYuY2FsbCh0aGlzLGEsYik7dGhpcy5OYT1jO3RoaXMuc3RhdGU9ZDt0aGlzLmtSPWV9O3QodXYsbnYpOwp1di5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iR3VhcmRzQ2hlY2tFbmQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy5OYSsiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiLCBzaG91bGRBY3RpdmF0ZTogIit0aGlzLmtSKyIpIn07dmFyIHZ2PWZ1bmN0aW9uKGEsYixjLGQpe252LmNhbGwodGhpcyxhLGIpO3RoaXMuTmE9Yzt0aGlzLnN0YXRlPWR9O3QodnYsbnYpO3Z2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSZXNvbHZlU3RhcnQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy5OYSsiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiKSJ9O3ZhciB3dj1mdW5jdGlvbihhLGIsYyxkKXtudi5jYWxsKHRoaXMsYSxiKTt0aGlzLk5hPWM7dGhpcy5zdGF0ZT1kfTt0KHd2LG52KTsKd3YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJlc29sdmVFbmQoaWQ6ICIrdGhpcy5pZCsiLCB1cmw6ICciK3RoaXMudXJsKyInLCB1cmxBZnRlclJlZGlyZWN0czogJyIrdGhpcy5OYSsiJywgc3RhdGU6ICIrdGhpcy5zdGF0ZSsiKSJ9O3ZhciB4dj1mdW5jdGlvbihhKXt0aGlzLkJjPWF9O3h2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSb3V0ZUNvbmZpZ0xvYWRTdGFydChwYXRoOiAiK3RoaXMuQmMucGF0aCsiKSJ9O3ZhciB5dj1mdW5jdGlvbihhKXt0aGlzLkJjPWF9O3l2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSb3V0ZUNvbmZpZ0xvYWRFbmQocGF0aDogIit0aGlzLkJjLnBhdGgrIikifTt2YXIgenY9ZnVuY3Rpb24oYSl7dGhpcy5DYT1hfTsKenYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkNoaWxkQWN0aXZhdGlvblN0YXJ0KHBhdGg6ICciKyh0aGlzLkNhLkZhJiZ0aGlzLkNhLkZhLnBhdGh8fCIiKSsiJykifTt2YXIgQXY9ZnVuY3Rpb24oYSl7dGhpcy5DYT1hfTtBdi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2hpbGRBY3RpdmF0aW9uRW5kKHBhdGg6ICciKyh0aGlzLkNhLkZhJiZ0aGlzLkNhLkZhLnBhdGh8fCIiKSsiJykifTt2YXIgQnY9ZnVuY3Rpb24oYSl7dGhpcy5DYT1hfTtCdi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQWN0aXZhdGlvblN0YXJ0KHBhdGg6ICciKyh0aGlzLkNhLkZhJiZ0aGlzLkNhLkZhLnBhdGh8fCIiKSsiJykifTt2YXIgQ3Y9ZnVuY3Rpb24oYSl7dGhpcy5DYT1hfTsKQ3YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFjdGl2YXRpb25FbmQocGF0aDogJyIrKHRoaXMuQ2EuRmEmJnRoaXMuQ2EuRmEucGF0aHx8IiIpKyInKSJ9O3ZhciBEdj1mdW5jdGlvbihhLGIpe3RoaXMucG9zaXRpb249YTt0aGlzLmFuY2hvcj1ifTtEdi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU2Nyb2xsKGFuY2hvcjogJyIrdGhpcy5hbmNob3IrIicsIHBvc2l0aW9uOiAnIisodGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uWzBdKyIsICIrdGhpcy5wb3NpdGlvblsxXTpudWxsKSsiJykifTt2YXIgRXY9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIEZ2KGEpe2E9RXJyb3IoIk5hdmlnYXRpb25DYW5jZWxpbmdFcnJvcjogIithKTthLm5nTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yPSEwO3JldHVybiBhfWZ1bmN0aW9uIEd2KGEsYixjKXt2YXIgZD1jLnBhdGguc3BsaXQoIi8iKTtpZihkLmxlbmd0aD5hLmxlbmd0aHx8ImZ1bGwiPT09Yy5CaSYmKDA8Yi5kZHx8ZC5sZW5ndGg8YS5sZW5ndGgpKXJldHVybiBudWxsO2I9e307Zm9yKGM9MDtjPGQubGVuZ3RoO2MrKyl7dmFyIGU9ZFtjXSxmPWFbY107aWYoZS5zdGFydHNXaXRoKCI6IikpYltlLnN1YnN0cmluZygxKV09ZjtlbHNlIGlmKGUhPT1mLnBhdGgpcmV0dXJuIG51bGx9cmV0dXJue0RqOmEuc2xpY2UoMCxkLmxlbmd0aCksbkg6Yn19O3ZhciBIdj1mdW5jdGlvbihhLGIpe3RoaXMucXQ9YTt0aGlzLm1vZHVsZT1ifTsKZnVuY3Rpb24gSXYoYSxiKXtiPXZvaWQgMD09PWI/IiI6Yjtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXSxlPWQ/Ynx8ZC5wYXRoP2ImJiFkLnBhdGg/YisiLyI6IWImJmQucGF0aD9kLnBhdGg6YisiLyIrZC5wYXRoOiIiOmI7aWYoIWQpdGhyb3cgRXJyb3IoIlxuICAgICAgSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IEVuY291bnRlcmVkIHVuZGVmaW5lZCByb3V0ZS5cbiAgICAgIFRoZSByZWFzb24gbWlnaHQgYmUgYW4gZXh0cmEgY29tbWEuXG5cbiAgICAgIEV4YW1wbGU6XG4gICAgICBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAgICAgICAgeyBwYXRoOiAnJywgcmVkaXJlY3RUbzogJy9kYXNoYm9hcmQnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9LFxuICAgICAgICB7IHBhdGg6ICdkYXNoYm9hcmQnLCAgY29tcG9uZW50OiBEYXNoYm9hcmRDb21wb25lbnQgfSwsIDw8IHR3byBjb21tYXNcbiAgICAgICAgeyBwYXRoOiAnZGV0YWlsLzppZCcsIGNvbXBvbmVudDogSGVyb0RldGFpbENvbXBvbmVudCB9XG4gICAgICBdO1xuICAgICIpO2lmKEFycmF5LmlzQXJyYXkoZCkpdGhyb3cgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAnIisKZSsiJzogQXJyYXkgY2Fubm90IGJlIHNwZWNpZmllZCIpO2lmKCFkLmEmJiFkLmNoaWxkcmVuJiYhZC5XZiYmZC5yYSYmInByaW1hcnkiIT09ZC5yYSl0aHJvdyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IGEgY29tcG9uZW50bGVzcyByb3V0ZSB3aXRob3V0IGNoaWxkcmVuIG9yIGxvYWRDaGlsZHJlbiBjYW5ub3QgaGF2ZSBhIG5hbWVkIG91dGxldCBzZXQiKTtpZihkLkVkJiZkLmNoaWxkcmVuKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogcmVkaXJlY3RUbyBhbmQgY2hpbGRyZW4gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIiKTtpZihkLkVkJiZkLldmKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogcmVkaXJlY3RUbyBhbmQgbG9hZENoaWxkcmVuIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYoZC5jaGlsZHJlbiYmZC5XZil0aHJvdyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciKwplKyInOiBjaGlsZHJlbiBhbmQgbG9hZENoaWxkcmVuIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYoZC5FZCYmZC5hKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogcmVkaXJlY3RUbyBhbmQgY29tcG9uZW50IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7aWYoZC5wYXRoJiZkLkV5KXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogcGF0aCBhbmQgbWF0Y2hlciBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciIpO2lmKHZvaWQgMD09PWQuRWQmJiFkLmEmJiFkLmNoaWxkcmVuJiYhZC5XZil0aHJvdyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIicuIE9uZSBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgcHJvdmlkZWQ6IGNvbXBvbmVudCwgcmVkaXJlY3RUbywgY2hpbGRyZW4gb3IgbG9hZENoaWxkcmVuIik7aWYodm9pZCAwPT09ZC5wYXRoJiZ2b2lkIDA9PT0KZC5FeSl0aHJvdyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IHJvdXRlcyBtdXN0IGhhdmUgZWl0aGVyIGEgcGF0aCBvciBhIG1hdGNoZXIgc3BlY2lmaWVkIik7aWYoInN0cmluZyI9PT10eXBlb2YgZC5wYXRoJiYiLyI9PT1kLnBhdGguY2hhckF0KDApKXRocm93IEVycm9yKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2Ygcm91dGUgJyIrZSsiJzogcGF0aCBjYW5ub3Qgc3RhcnQgd2l0aCBhIHNsYXNoIik7aWYoIiI9PT1kLnBhdGgmJnZvaWQgMCE9PWQuRWQmJnZvaWQgMD09PWQuQmkpdGhyb3cgRXJyb3IoIkludmFsaWQgY29uZmlndXJhdGlvbiBvZiByb3V0ZSAne3BhdGg6IFwiIitlKyciLCByZWRpcmVjdFRvOiAiJytkLkVkKyJcIn0nOiBwbGVhc2UgcHJvdmlkZSAncGF0aE1hdGNoJy4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgJ3BhdGhNYXRjaCcgaXMgJ3ByZWZpeCcsIGJ1dCBvZnRlbiB0aGUgaW50ZW50IGlzIHRvIHVzZSAnZnVsbCcuIik7CmlmKHZvaWQgMCE9PWQuQmkmJiJmdWxsIiE9PWQuQmkmJiJwcmVmaXgiIT09ZC5CaSl0aHJvdyBFcnJvcigiSW52YWxpZCBjb25maWd1cmF0aW9uIG9mIHJvdXRlICciK2UrIic6IHBhdGhNYXRjaCBjYW4gb25seSBiZSBzZXQgdG8gJ3ByZWZpeCcgb3IgJ2Z1bGwnIik7ZC5jaGlsZHJlbiYmSXYoZC5jaGlsZHJlbixlKX19ZnVuY3Rpb24gSnYoYSl7dmFyIGI9YS5jaGlsZHJlbiYmYS5jaGlsZHJlbi5tYXAoSnYpO2E9Yj9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NoaWxkcmVuOmJ9KTpPYmplY3QuYXNzaWduKHt9LGEpOyFhLmEmJihifHxhLldmKSYmYS5yYSYmInByaW1hcnkiIT09YS5yYSYmKGEuYT1Fdik7cmV0dXJuIGF9O2Z1bmN0aW9uIEt2KGEsYil7dmFyIGM9T2JqZWN0LmtleXMoYSksZD1PYmplY3Qua2V5cyhiKTtpZighY3x8IWR8fGMubGVuZ3RoIT1kLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylpZihkPWNbZV0sIUx2KGFbZF0sYltkXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTHYoYSxiKXtyZXR1cm4gQXJyYXkuaXNBcnJheShhKSYmQXJyYXkuaXNBcnJheShiKT9hLmxlbmd0aCE9Yi5sZW5ndGg/ITE6YS5ldmVyeShmdW5jdGlvbihjKXtyZXR1cm4tMTxiLmluZGV4T2YoYyl9KTphPT09Yn1mdW5jdGlvbiBNdihhLGIpe2Zvcih2YXIgYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJmIoYVtjXSxjKX0KZnVuY3Rpb24gTnYoYSxiKXtpZigwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiBmaSh7fSk7dmFyIGM9W10sZD1bXSxlPXt9O012KGEsZnVuY3Rpb24oZixnKXtmPWIoZyxmKS5iKHVpKGZ1bmN0aW9uKGwpe3JldHVybiBlW2ddPWx9KSk7InByaW1hcnkiPT09Zz9jLnB1c2goZik6ZC5wdXNoKGYpfSk7cmV0dXJuIGZpLmFwcGx5KG51bGwsYy5jb25jYXQoZCkpLmIoUWkoMSkseGwoKSx1aShmdW5jdGlvbigpe3JldHVybiBlfSkpfWZ1bmN0aW9uIE92KGEpe3JldHVybiBGZShhKT9hOkVlKGEpP01pKFByb21pc2UucmVzb2x2ZShhKSk6ZmkoYSl9O3ZhciBQdj1mdW5jdGlvbihhLGIsYyl7dGhpcy5yb290PWE7dGhpcy52Yj1iO3RoaXMubmM9Y307UHYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFF2KHRoaXMpfTt2YXIgUnY9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuVGE9YTt0aGlzLmNoaWxkcmVuPWI7dGhpcy5wYXJlbnQ9bnVsbDtNdihiLGZ1bmN0aW9uKGQpe3JldHVybiBkLnBhcmVudD1jfSl9O1J2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdih0aGlzKX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSdi5wcm90b3R5cGUse2RkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5jaGlsZHJlbikubGVuZ3RofX19KTt2YXIgVHY9ZnVuY3Rpb24oYSxiKXt0aGlzLnBhdGg9YTt0aGlzLnBhcmFtZXRlcnM9Yn07ClR2LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIiK1V2KHRoaXMucGF0aCkrVnYodGhpcy5wYXJhbWV0ZXJzKX07ZnVuY3Rpb24gV3YoYSxiKXtyZXR1cm4gWHYoYSxiKSYmYS5ldmVyeShmdW5jdGlvbihjLGQpe3JldHVybiBLdihjLnBhcmFtZXRlcnMsYltkXS5wYXJhbWV0ZXJzKX0pfWZ1bmN0aW9uIFh2KGEsYil7cmV0dXJuIGEubGVuZ3RoIT09Yi5sZW5ndGg/ITE6YS5ldmVyeShmdW5jdGlvbihjLGQpe3JldHVybiBjLnBhdGg9PT1iW2RdLnBhdGh9KX1mdW5jdGlvbiBZdihhLGIpe3ZhciBjPVtdO012KGEuY2hpbGRyZW4sZnVuY3Rpb24oZCxlKXsicHJpbWFyeSI9PT1lJiYoYz1jLmNvbmNhdChiKGQsZSkpKX0pO012KGEuY2hpbGRyZW4sZnVuY3Rpb24oZCxlKXsicHJpbWFyeSIhPT1lJiYoYz1jLmNvbmNhdChiKGQsZSkpKX0pO3JldHVybiBjfXZhciBadj1mdW5jdGlvbigpe30sJHY9ZnVuY3Rpb24oKXt9Owokdi5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oYSl7YT1uZXcgYXcoYSk7YncoYSwiLyIpO3ZhciBiPSIiPT09YS5zYnx8YS5zYi5zdGFydHNXaXRoKCI/Iil8fGEuc2Iuc3RhcnRzV2l0aCgiIyIpP25ldyBSdihbXSx7fSk6bmV3IFJ2KFtdLGN3KGEpKTt2YXIgYz17fTtpZihidyhhLCI/Iikpe2Rve3ZhciBkLGUsZj1hLnNiLm1hdGNoKGR3KTtpZihlPWY/ZlswXToiIilhLmNhcHR1cmUoZSksZj0iIixidyhhLCI9IikmJihkPShkPWEuc2IubWF0Y2goZXcpKT9kWzBdOiIiKSYmKGY9ZCxhLmNhcHR1cmUoZikpLGU9ZGVjb2RlVVJJQ29tcG9uZW50KGUucmVwbGFjZSgvXCsvZywiJTIwIikpLGY9ZGVjb2RlVVJJQ29tcG9uZW50KGYucmVwbGFjZSgvXCsvZywiJTIwIikpLGMuaGFzT3duUHJvcGVydHkoZSk/KGQ9Y1tlXSxBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0sY1tlXT1kKSxkLnB1c2goZikpOmNbZV09Zn13aGlsZShidyhhLCImIikpfXJldHVybiBuZXcgUHYoYixjLGJ3KGEsIiMiKT8KZGVjb2RlVVJJQ29tcG9uZW50KGEuc2IpOm51bGwpfTt2YXIgUXY9ZnVuY3Rpb24oYSl7dmFyIGI9Ii8iK2Z3KGEucm9vdCwhMCksYz1ndyhhLnZiKTthPSJzdHJpbmciPT09dHlwZW9mIGEubmM/IiMiK2VuY29kZVVSSShhLm5jKToiIjtyZXR1cm4iIitiK2MrYX07ZnVuY3Rpb24gU3YoYSl7cmV0dXJuIGEuVGEubWFwKGZ1bmN0aW9uKGIpe3JldHVybiIiK1V2KGIucGF0aCkrVnYoYi5wYXJhbWV0ZXJzKX0pLmpvaW4oIi8iKX0KZnVuY3Rpb24gZncoYSxiKXtpZighKDA8YS5kZCkpcmV0dXJuIFN2KGEpO2lmKGIpe2I9YS5jaGlsZHJlbi5wcmltYXJ5P2Z3KGEuY2hpbGRyZW4ucHJpbWFyeSwhMSk6IiI7dmFyIGM9W107TXYoYS5jaGlsZHJlbixmdW5jdGlvbihkLGUpeyJwcmltYXJ5IiE9PWUmJmMucHVzaChlKyI6IitmdyhkLCExKSl9KTtyZXR1cm4gMDxjLmxlbmd0aD9iKyIoIitjLmpvaW4oIi8vIikrIikiOmJ9Yj1ZdihhLGZ1bmN0aW9uKGQsZSl7cmV0dXJuInByaW1hcnkiPT09ZT9bZncoYS5jaGlsZHJlbi5wcmltYXJ5LCExKV06W2UrIjoiK2Z3KGQsITEpXX0pO3JldHVybiAxPT09T2JqZWN0LmtleXMoYS5jaGlsZHJlbikubGVuZ3RoJiZudWxsIT1hLmNoaWxkcmVuLnByaW1hcnk/U3YoYSkrIi8iK2JbMF06U3YoYSkrIi8oIitiLmpvaW4oIi8vIikrIikifQpmdW5jdGlvbiBodyhhKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGEpLnJlcGxhY2UoLyU0MC9nLCJAIikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKX1mdW5jdGlvbiBpdyhhKXtyZXR1cm4gaHcoYSkucmVwbGFjZSgvJTNCL2dpLCI7Iil9ZnVuY3Rpb24gVXYoYSl7cmV0dXJuIGh3KGEpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpLnJlcGxhY2UoLyUyNi9naSwiJiIpfWZ1bmN0aW9uIFZ2KGEpe3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIjsiK1V2KGIpKyI9IitVdihhW2JdKX0pLmpvaW4oIiIpfQpmdW5jdGlvbiBndyhhKXt2YXIgYj1PYmplY3Qua2V5cyhhKS5tYXAoZnVuY3Rpb24oYyl7dmFyIGQ9YVtjXTtyZXR1cm4gQXJyYXkuaXNBcnJheShkKT9kLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gaXcoYykrIj0iK2l3KGUpfSkuam9pbigiJiIpOml3KGMpKyI9IitpdyhkKX0pO3JldHVybiBiLmxlbmd0aD8iPyIrYi5qb2luKCImIik6IiJ9dmFyIGp3PS9eW15cLygpPzs9I10rLztmdW5jdGlvbiBrdyhhKXtyZXR1cm4oYT1hLm1hdGNoKGp3KSk/YVswXToiIn0KdmFyIGR3PS9eW149PyYjXSsvLGV3PS9eW14/JiNdKy8sYXc9ZnVuY3Rpb24oYSl7dGhpcy5zYj10aGlzLnVybD1hfSxjdz1mdW5jdGlvbihhKXtpZigiIj09PWEuc2IpcmV0dXJue307YncoYSwiLyIpO3ZhciBiPVtdO2ZvcihhLnNiLnN0YXJ0c1dpdGgoIigiKXx8Yi5wdXNoKGx3KGEpKTthLnNiLnN0YXJ0c1dpdGgoIi8iKSYmIWEuc2Iuc3RhcnRzV2l0aCgiLy8iKSYmIWEuc2Iuc3RhcnRzV2l0aCgiLygiKTspYS5jYXB0dXJlKCIvIiksYi5wdXNoKGx3KGEpKTt2YXIgYz17fTthLnNiLnN0YXJ0c1dpdGgoIi8oIikmJihhLmNhcHR1cmUoIi8iKSxjPW13KGEsITApKTt2YXIgZD17fTthLnNiLnN0YXJ0c1dpdGgoIigiKSYmKGQ9bXcoYSwhMSkpO2lmKDA8Yi5sZW5ndGh8fDA8T2JqZWN0LmtleXMoYykubGVuZ3RoKWQucHJpbWFyeT1uZXcgUnYoYixjKTtyZXR1cm4gZH0sbHc9ZnVuY3Rpb24oYSl7dmFyIGI9a3coYS5zYik7aWYoIiI9PT1iJiZhLnNiLnN0YXJ0c1dpdGgoIjsiKSl0aHJvdyBFcnJvcigiRW1wdHkgcGF0aCB1cmwgc2VnbWVudCBjYW5ub3QgaGF2ZSBwYXJhbWV0ZXJzOiAnIisKYS5zYisiJy4iKTthLmNhcHR1cmUoYik7Yj1kZWNvZGVVUklDb21wb25lbnQoYik7Zm9yKHZhciBjPXt9O2J3KGEsIjsiKTspe3ZhciBkPWEsZT1rdyhkLnNiKTtpZihlKXtkLmNhcHR1cmUoZSk7dmFyIGY9IiI7aWYoYncoZCwiPSIpKXt2YXIgZz1rdyhkLnNiKTtnJiYoZj1nLGQuY2FwdHVyZShmKSl9Y1tkZWNvZGVVUklDb21wb25lbnQoZSldPWRlY29kZVVSSUNvbXBvbmVudChmKX19cmV0dXJuIG5ldyBUdihiLGMpfSxtdz1mdW5jdGlvbihhLGIpe3ZhciBjPXt9O2ZvcihhLmNhcHR1cmUoIigiKTshYncoYSwiKSIpJiYwPGEuc2IubGVuZ3RoOyl7dmFyIGQ9a3coYS5zYiksZT1hLnNiW2QubGVuZ3RoXTtpZigiLyIhPT1lJiYiKSIhPT1lJiYiOyIhPT1lKXRocm93IEVycm9yKCJDYW5ub3QgcGFyc2UgdXJsICciK2EudXJsKyInIik7ZT12b2lkIDA7LTE8ZC5pbmRleE9mKCI6Iik/KGU9ZC5zdWJzdHIoMCxkLmluZGV4T2YoIjoiKSksYS5jYXB0dXJlKGUpLGEuY2FwdHVyZSgiOiIpKToKYiYmKGU9InByaW1hcnkiKTtkPWN3KGEpO2NbZV09MT09PU9iamVjdC5rZXlzKGQpLmxlbmd0aD9kLnByaW1hcnk6bmV3IFJ2KFtdLGQpO2J3KGEsIi8vIil9cmV0dXJuIGN9LGJ3PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc2Iuc3RhcnRzV2l0aChiKT8oYS5zYj1hLnNiLnN1YnN0cmluZyhiLmxlbmd0aCksITApOiExfTthdy5wcm90b3R5cGUuY2FwdHVyZT1mdW5jdGlvbihhKXtpZighYncodGhpcyxhKSl0aHJvdyBFcnJvcignRXhwZWN0ZWQgIicrYSsnIi4nKTt9O3ZhciBudz1mdW5jdGlvbihhKXt0aGlzLnVkPWF9O253LnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24oYSl7YT10aGlzLmhtKGEpO3JldHVybiAxPGEubGVuZ3RoP2FbYS5sZW5ndGgtMl06bnVsbH07bncucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKGEpe3JldHVybihhPW93KGEsdGhpcy51ZCkpP2EuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBiLnZhbHVlfSk6W119O253LnByb3RvdHlwZS5maXJzdENoaWxkPWZ1bmN0aW9uKGEpe3JldHVybihhPW93KGEsdGhpcy51ZCkpJiYwPGEuY2hpbGRyZW4ubGVuZ3RoP2EuY2hpbGRyZW5bMF0udmFsdWU6bnVsbH07bncucHJvdG90eXBlLmhtPWZ1bmN0aW9uKGEpe3JldHVybiBwdyhhLHRoaXMudWQpLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi52YWx1ZX0pfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG53LnByb3RvdHlwZSx7cm9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWQudmFsdWV9fX0pOwpmdW5jdGlvbiBvdyhhLGIpe2lmKGE9PT1iLnZhbHVlKXJldHVybiBiO2I9bihiLmNoaWxkcmVuKTtmb3IodmFyIGM9Yi5uZXh0KCk7IWMuZG9uZTtjPWIubmV4dCgpKWlmKGM9b3coYSxjLnZhbHVlKSlyZXR1cm4gYztyZXR1cm4gbnVsbH1mdW5jdGlvbiBwdyhhLGIpe2lmKGE9PT1iLnZhbHVlKXJldHVybltiXTtmb3IodmFyIGM9bihiLmNoaWxkcmVuKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPXB3KGEsZC52YWx1ZSksZC5sZW5ndGgpcmV0dXJuIGQudW5zaGlmdChiKSxkO3JldHVybltdfXZhciBxdz1mdW5jdGlvbihhLGIpe3RoaXMudmFsdWU9YTt0aGlzLmNoaWxkcmVuPWJ9O3F3LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJUcmVlTm9kZSgiK3RoaXMudmFsdWUrIikifTtmdW5jdGlvbiBydyhhKXt2YXIgYj17fTthJiZhLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGJbYy52YWx1ZS5yYV09Y30pO3JldHVybiBifTt2YXIgdHc9ZnVuY3Rpb24oYSxiKXt0aGlzLnVkPWE7dGhpcy5DYT1iO3N3KHRoaXMsYSl9O3QodHcsbncpO3R3LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkNhLnRvU3RyaW5nKCl9O2Z1bmN0aW9uIHV3KGEsYil7YT1uZXcgdncoIiIsbmV3IHF3KG5ldyB3dyhbXSx7fSx7fSwiIix7fSwicHJpbWFyeSIsYixudWxsLGEucm9vdCwtMSx7fSksW10pKTtiPW5ldyB4dyhuZXcgYWkoW25ldyBUdigiIix7fSldKSxuZXcgYWkoe30pLG5ldyBhaSh7fSksbmV3IGFpKCIiKSxuZXcgYWkoe30pLCJwcmltYXJ5IixiLGEucm9vdCk7Yi5DYT1hLnJvb3Q7cmV0dXJuIG5ldyB0dyhuZXcgcXcoYixbXSksYSl9dmFyIHh3PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7dGhpcy51cmw9YTt0aGlzLnBhcmFtcz1iO3RoaXMudmI9Yzt0aGlzLm5jPWQ7dGhpcy5kYXRhPWU7dGhpcy5yYT1mO3RoaXMuYT1nO3RoaXMuYmo9bH07Cnh3LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkNhP3RoaXMuQ2EudG9TdHJpbmcoKToiRnV0dXJlKCIrdGhpcy5iaisiKSJ9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHh3LnByb3RvdHlwZSx7RmE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJqLkZhfX0scm9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWYucm9vdH19LHBhcmVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWYucGFyZW50KHRoaXMpfX0sZmlyc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWYuZmlyc3RDaGlsZCh0aGlzKX19LGNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NZi5jaGlsZHJlbih0aGlzKX19LGhtOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NZi5obSh0aGlzKX19fSk7CmZ1bmN0aW9uIHl3KGEsYil7YT1hLmhtO3ZhciBjPTA7aWYoImFsd2F5cyIhPT0odm9pZCAwPT09Yj8iZW1wdHlPbmx5IjpiKSlmb3IoYz1hLmxlbmd0aC0xOzE8PWM7KXtiPWFbY107dmFyIGQ9YVtjLTFdO2lmKGIuRmEmJiIiPT09Yi5GYS5wYXRoKWMtLTtlbHNlIGlmKGQuYSlicmVhaztlbHNlIGMtLX1yZXR1cm4gencoYS5zbGljZShjKSl9ZnVuY3Rpb24gencoYSl7cmV0dXJuIGEucmVkdWNlKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGIucGFyYW1zKSxjLnBhcmFtcyksZT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYi5kYXRhKSxjLmRhdGEpO2I9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGIucmVzb2x2ZSksYy5zdyk7cmV0dXJue3BhcmFtczpkLGRhdGE6ZSxyZXNvbHZlOmJ9fSx7cGFyYW1zOnt9LGRhdGE6e30scmVzb2x2ZTp7fX0pfQp2YXIgd3c9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsLG0scCxxKXt0aGlzLnVybD1hO3RoaXMucGFyYW1zPWI7dGhpcy52Yj1jO3RoaXMubmM9ZDt0aGlzLmRhdGE9ZTt0aGlzLnJhPWY7dGhpcy5hPWc7dGhpcy5GYT1sO3RoaXMuckU9bTt0aGlzLndDPXA7dGhpcy5YTT1xfTt3dy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iUm91dGUodXJsOiciK3RoaXMudXJsLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSkuam9pbigiLyIpKyInLCBwYXRoOiciKyh0aGlzLkZhP3RoaXMuRmEucGF0aDoiIikrIicpIn07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3cucHJvdG90eXBlLHtyb290Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NZi5yb290fX0scGFyZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NZi5wYXJlbnQodGhpcyl9fSxmaXJzdENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NZi5maXJzdENoaWxkKHRoaXMpfX0sY2hpbGRyZW46e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1mLmNoaWxkcmVuKHRoaXMpfX0saG06e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1mLmhtKHRoaXMpfX19KTsKdmFyIHZ3PWZ1bmN0aW9uKGEsYil7dGhpcy51ZD1iO3RoaXMudXJsPWE7c3codGhpcyxiKX07dCh2dyxudyk7dncucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEF3KHRoaXMudWQpfTtmdW5jdGlvbiBzdyhhLGIpe2IudmFsdWUuTWY9YTtiLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIHN3KGEsYyl9KX1mdW5jdGlvbiBBdyhhKXt2YXIgYj0wPGEuY2hpbGRyZW4ubGVuZ3RoPyIgeyAiK2EuY2hpbGRyZW4ubWFwKEF3KS5qb2luKCIsICIpKyIgfSAiOiIiO3JldHVybiIiK2EudmFsdWUrYn0KZnVuY3Rpb24gQncoYSl7aWYoYS5DYSl7dmFyIGI9YS5DYSxjPWEuYmo7YS5DYT1jO0t2KGIudmIsYy52Yil8fGEudmIubmV4dChjLnZiKTtiLm5jIT09Yy5uYyYmYS5uYy5uZXh0KGMubmMpO0t2KGIucGFyYW1zLGMucGFyYW1zKXx8YS5wYXJhbXMubmV4dChjLnBhcmFtcyk7YTp7dmFyIGQ9Yi51cmw7dmFyIGU9Yy51cmw7aWYoZC5sZW5ndGghPT1lLmxlbmd0aClkPSExO2Vsc2V7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDsrK2YpaWYoIUt2KGRbZl0sZVtmXSkpe2Q9ITE7YnJlYWsgYX1kPSEwfX1kfHxhLnVybC5uZXh0KGMudXJsKTtLdihiLmRhdGEsYy5kYXRhKXx8YS5kYXRhLm5leHQoYy5kYXRhKX1lbHNlIGEuQ2E9YS5iaixhLmRhdGEubmV4dChhLmJqLmRhdGEpfQpmdW5jdGlvbiBDdyhhLGIpe3ZhciBjPUt2KGEucGFyYW1zLGIucGFyYW1zKSYmV3YoYS51cmwsYi51cmwpLGQ9IWEucGFyZW50IT09IWIucGFyZW50O3JldHVybiBjJiYhZCYmKCFhLnBhcmVudHx8Q3coYS5wYXJlbnQsYi5wYXJlbnQpKX07ZnVuY3Rpb24gRHcoYSxiLGMpe2lmKGMmJmIudmFsdWUuRmE9PT1jLnZhbHVlLkNhLkZhKXt2YXIgZD1jLnZhbHVlO2QuYmo9Yi52YWx1ZTtiPUV3KGEsYixjKTtyZXR1cm4gbmV3IHF3KGQsYil9ZD1GdyhiLnZhbHVlKTtiPWIuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBEdyhhLGUpfSk7cmV0dXJuIG5ldyBxdyhkLGIpfWZ1bmN0aW9uIEV3KGEsYixjKXtyZXR1cm4gYi5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oZCl7Zm9yKHZhciBlPW4oYy5jaGlsZHJlbiksZj1lLm5leHQoKTshZi5kb25lO2Y9ZS5uZXh0KCkpaWYoZj1mLnZhbHVlLGYudmFsdWUuQ2EuRmE9PT1kLnZhbHVlLkZhKXJldHVybiBEdyhhLGQsZik7cmV0dXJuIER3KGEsZCl9KX1mdW5jdGlvbiBGdyhhKXtyZXR1cm4gbmV3IHh3KG5ldyBhaShhLnVybCksbmV3IGFpKGEucGFyYW1zKSxuZXcgYWkoYS52YiksbmV3IGFpKGEubmMpLG5ldyBhaShhLmRhdGEpLGEucmEsYS5hLGEpfTtmdW5jdGlvbiBHdyhhKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBhJiZudWxsIT1hJiYhYS50ZiYmIWEuSEh9ZnVuY3Rpb24gSHcoYSxiLGMsZCxlKXt2YXIgZj17fTtkJiZNdihkLGZ1bmN0aW9uKGcsbCl7ZltsXT1BcnJheS5pc0FycmF5KGcpP2cubWFwKGZ1bmN0aW9uKG0pe3JldHVybiIiK219KToiIitnfSk7cmV0dXJuIGMucm9vdD09PWE/bmV3IFB2KGIsZixlKTpuZXcgUHYoSXcoYy5yb290LGEsYiksZixlKX1mdW5jdGlvbiBJdyhhLGIsYyl7dmFyIGQ9e307TXYoYS5jaGlsZHJlbixmdW5jdGlvbihlLGYpe2RbZl09ZT09PWI/YzpJdyhlLGIsYyl9KTtyZXR1cm4gbmV3IFJ2KGEuVGEsZCl9CnZhciBKdz1mdW5jdGlvbihhLGIsYyl7dGhpcy5iRz1hO3RoaXMuRFE9Yjt0aGlzLlZuPWM7aWYoYSYmMDxjLmxlbmd0aCYmR3coY1swXSkpdGhyb3cgRXJyb3IoIlJvb3Qgc2VnbWVudCBjYW5ub3QgaGF2ZSBtYXRyaXggcGFyYW1ldGVycyIpO2lmKChhPWMuZmluZChmdW5jdGlvbihkKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBkJiZudWxsIT1kJiZkLnRmfSkpJiZhIT09KDA8Yy5sZW5ndGg/Y1tjLmxlbmd0aC0xXTpudWxsKSl0aHJvdyBFcnJvcigie291dGxldHM6e319IGhhcyB0byBiZSB0aGUgbGFzdCBjb21tYW5kIik7fTsKZnVuY3Rpb24gS3coYSl7aWYoInN0cmluZyI9PT10eXBlb2YgYVswXSYmMT09PWEubGVuZ3RoJiYiLyI9PT1hWzBdKXJldHVybiBuZXcgSncoITAsMCxhKTt2YXIgYj0wLGM9ITE7YT1hLnJlZHVjZShmdW5jdGlvbihkLGUsZil7aWYoIm9iamVjdCI9PT10eXBlb2YgZSYmbnVsbCE9ZSl7aWYoZS50Zil7dmFyIGc9e307TXYoZS50ZixmdW5jdGlvbihsLG0pe2dbbV09InN0cmluZyI9PT10eXBlb2YgbD9sLnNwbGl0KCIvIik6bH0pO3JldHVybltdLmNvbmNhdChqYShkKSxbe3RmOmd9XSl9aWYoZS5ISClyZXR1cm5bXS5jb25jYXQoamEoZCksW2UuSEhdKX1yZXR1cm4ic3RyaW5nIiE9PXR5cGVvZiBlP1tdLmNvbmNhdChqYShkKSxbZV0pOjA9PT1mPyhlLnNwbGl0KCIvIikuZm9yRWFjaChmdW5jdGlvbihsLG0pe2lmKDAhPW18fCIuIiE9PWwpMD09bSYmIiI9PT1sP2M9ITA6Ii4uIj09PWw/YisrOiIiIT1sJiZkLnB1c2gobCl9KSxkKTpbXS5jb25jYXQoamEoZCksW2VdKX0sW10pO3JldHVybiBuZXcgSncoYywKYixhKX12YXIgTHc9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuR2Q9YTt0aGlzLmZ0PWI7dGhpcy5pbmRleD1jfTtmdW5jdGlvbiBNdyhhKXtyZXR1cm4ib2JqZWN0Ij09PXR5cGVvZiBhJiZudWxsIT1hJiZhLnRmP2EudGYucHJpbWFyeToiIithfWZ1bmN0aW9uIE53KGEpe2lmKCJvYmplY3QiPT09dHlwZW9mIGFbMF0mJm51bGwhPT1hWzBdJiZhWzBdLnRmKXJldHVybiBhWzBdLnRmO3ZhciBiPXt9O3JldHVybiBiLnByaW1hcnk9YSxifQpmdW5jdGlvbiBPdyhhLGIsYyl7YXx8KGE9bmV3IFJ2KFtdLHt9KSk7aWYoMD09PWEuVGEubGVuZ3RoJiYwPGEuZGQpcmV0dXJuIFB3KGEsYixjKTthOnt2YXIgZD1hO2Zvcih2YXIgZT0wLGY9YixnPXttYXRjaDohMSxhdDowLGJGOjB9O2Y8ZC5UYS5sZW5ndGg7KXtpZihlPj1jLmxlbmd0aCl7ZD1nO2JyZWFrIGF9dmFyIGw9ZC5UYVtmXSxtPU13KGNbZV0pLHA9ZTxjLmxlbmd0aC0xP2NbZSsxXTpudWxsO2lmKDA8ZiYmdm9pZCAwPT09bSlicmVhaztpZihtJiZwJiYib2JqZWN0Ij09PXR5cGVvZiBwJiZ2b2lkIDA9PT1wLnRmKXtpZihtIT1sLnBhdGh8fCFLdihwLGwucGFyYW1ldGVycykpe2Q9ZzticmVhayBhfWUrPTJ9ZWxzZXtwPXt9O2lmKG0hPWwucGF0aHx8IUt2KHAsbC5wYXJhbWV0ZXJzKSl7ZD1nO2JyZWFrIGF9ZSsrfWYrK31kPXttYXRjaDohMCxhdDpmLGJGOmV9fWU9Yy5zbGljZShkLmJGKTtyZXR1cm4gZC5tYXRjaCYmZC5hdDxhLlRhLmxlbmd0aD8oYj1uZXcgUnYoYS5UYS5zbGljZSgwLApkLmF0KSx7fSksYi5jaGlsZHJlbi5wcmltYXJ5PW5ldyBSdihhLlRhLnNsaWNlKGQuYXQpLGEuY2hpbGRyZW4pLFB3KGIsMCxlKSk6ZC5tYXRjaCYmMD09PWUubGVuZ3RoP25ldyBSdihhLlRhLHt9KTohZC5tYXRjaHx8MDxhLmRkP2QubWF0Y2g/UHcoYSwwLGUpOlF3KGEsYixjKTpRdyhhLGIsYyl9ZnVuY3Rpb24gUHcoYSxiLGMpe2lmKDA9PT1jLmxlbmd0aClyZXR1cm4gbmV3IFJ2KGEuVGEse30pO3ZhciBkPU53KGMpLGU9e307TXYoZCxmdW5jdGlvbihmLGcpe251bGwhPT1mJiYoZVtnXT1PdyhhLmNoaWxkcmVuW2ddLGIsZikpfSk7TXYoYS5jaGlsZHJlbixmdW5jdGlvbihmLGcpe3ZvaWQgMD09PWRbZ10mJihlW2ddPWYpfSk7cmV0dXJuIG5ldyBSdihhLlRhLGUpfQpmdW5jdGlvbiBRdyhhLGIsYyl7Zm9yKHZhciBkPWEuVGEuc2xpY2UoMCxiKSxlPTA7ZTxjLmxlbmd0aDspe2lmKCJvYmplY3QiPT09dHlwZW9mIGNbZV0mJm51bGwhPT1jW2VdJiZ2b2lkIDAhPT1jW2VdLnRmKXJldHVybiBhPVJ3KGNbZV0udGYpLG5ldyBSdihkLGEpO2lmKDA9PT1lJiZHdyhjWzBdKSlkLnB1c2gobmV3IFR2KGEuVGFbYl0ucGF0aCxjWzBdKSksZSsrO2Vsc2V7dmFyIGY9TXcoY1tlXSksZz1lPGMubGVuZ3RoLTE/Y1tlKzFdOm51bGw7ZiYmZyYmR3coZyk/KGQucHVzaChuZXcgVHYoZixTdyhnKSkpLGUrPTIpOihkLnB1c2gobmV3IFR2KGYse30pKSxlKyspfX1yZXR1cm4gbmV3IFJ2KGQse30pfWZ1bmN0aW9uIFJ3KGEpe3ZhciBiPXt9O012KGEsZnVuY3Rpb24oYyxkKXtudWxsIT09YyYmKGJbZF09UXcobmV3IFJ2KFtdLHt9KSwwLGMpKX0pO3JldHVybiBifQpmdW5jdGlvbiBTdyhhKXt2YXIgYj17fTtNdihhLGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGJbZF09IiIrY30pO3JldHVybiBifTt2YXIgV3c9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1aShmdW5jdGlvbihkKXt2YXIgZT1uZXcgVHcoYixkLkN6LGQuZm8sYyksZj1lLkpGLnVkLGc9ZS5rRj9lLmtGLnVkOm51bGw7VXcoZSxmLGcsYSk7QncoZS5KRi5yb290KTtWdyhlLGYsZyxhKTtyZXR1cm4gZH0pfSxUdz1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLnB0PWE7dGhpcy5KRj1iO3RoaXMua0Y9Yzt0aGlzLkRGPWR9LFV3PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXJ3KGMpO2IuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihmKXt2YXIgZz1mLnZhbHVlLnJhLGw9ZVtnXSxtPWYudmFsdWUscD1sP2wudmFsdWU6bnVsbDttPT09cD9tLmE/KG09ZC5nZXRDb250ZXh0KG0ucmEpKSYmVXcoYSxmLGwsbS5jaGlsZHJlbik6VXcoYSxmLGwsZCk6cCYmWHcoYSxsLGQpO2RlbGV0ZSBlW2ddfSk7TXYoZSxmdW5jdGlvbihmKXtYdyhhLGYsZCl9KX0sWHc9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMuZ2V0Q29udGV4dChiLnZhbHVlLnJhKTsKaWYoZCl7dmFyIGU9cncoYiksZj1iLnZhbHVlLmE/ZC5jaGlsZHJlbjpjO012KGUsZnVuY3Rpb24oZyl7WHcoYSxnLGYpfSk7ZC5yYSYmKFl3KGQucmEpLGQuY2hpbGRyZW4uZnM9bmV3IE1hcCl9fSxWdz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1ydyhjKTtiLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oZil7dmFyIGc9ZVtmLnZhbHVlLnJhXSxsPWYudmFsdWUsbT1nP2cudmFsdWU6bnVsbDtCdyhsKTtpZihsPT09bSlsLmE/KGw9WncoZCxsLnJhKSxWdyhhLGYsZyxsLmNoaWxkcmVuKSk6VncoYSxmLGcsZCk7ZWxzZSBpZihsLmEpe2c9WncoZCxsLnJhKTthOntmb3IobT1sLkNhLnBhcmVudDttO209bS5wYXJlbnQpe3ZhciBwPW0uRmE7aWYocCYmcC5aZSl7bT1wLlplO2JyZWFrIGF9aWYocCYmcC5hKWJyZWFrfW09bnVsbH1tPW0/bS5tb2R1bGUuV246bnVsbDtnLnF4PW51bGw7Zy5CYz1sO2cubXQ9bTtnLnJhJiYkdyhnLnJhLGwsbSk7VncoYSxmLG51bGwsZy5jaGlsZHJlbil9ZWxzZSBWdyhhLApmLG51bGwsZCk7YS5ERihuZXcgQ3YoZi52YWx1ZS5DYSkpfSk7Yi5jaGlsZHJlbi5sZW5ndGgmJmEuREYobmV3IEF2KGIudmFsdWUuQ2EpKX07ZnVuY3Rpb24gYXgoYSl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBhfWZ1bmN0aW9uIGJ4KGEpe3JldHVybiBhIGluc3RhbmNlb2YgUHZ9O3ZhciBjeD1mdW5jdGlvbihhKXt0aGlzLkdkPWF8fG51bGx9LGR4PWZ1bmN0aW9uKGEpe3RoaXMuamQ9YX07ZnVuY3Rpb24gZXgoYSl7cmV0dXJuIG5ldyBUaChmdW5jdGlvbihiKXtyZXR1cm4gYi5lcnJvcihuZXcgY3goYSkpfSl9ZnVuY3Rpb24gZngoYSl7cmV0dXJuIG5ldyBUaChmdW5jdGlvbihiKXtyZXR1cm4gYi5lcnJvcihuZXcgZHgoYSkpfSl9ZnVuY3Rpb24gZ3goYSl7cmV0dXJuIG5ldyBUaChmdW5jdGlvbihiKXtyZXR1cm4gYi5lcnJvcihFcnJvcigiT25seSBhYnNvbHV0ZSByZWRpcmVjdHMgY2FuIGhhdmUgbmFtZWQgb3V0bGV0cy4gcmVkaXJlY3RUbzogJyIrYSsiJyIpKX0pfWZ1bmN0aW9uIGh4KGEpe3JldHVybiBuZXcgVGgoZnVuY3Rpb24oYil7cmV0dXJuIGIuZXJyb3IoRnYoIkNhbm5vdCBsb2FkIGNoaWxkcmVuIGJlY2F1c2UgdGhlIGd1YXJkIG9mIHRoZSByb3V0ZSBcInBhdGg6ICciK2EucGF0aCsiJ1wiIHJldHVybmVkIGZhbHNlIikpfSl9CnZhciBpeD1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMuJHI9Yjt0aGlzLkZwPWM7dGhpcy5qZD1kO3RoaXMuemQ9ZTt0aGlzLkpFPSEwO3RoaXMuWmY9YS5nZXQocGQpfTtpeC5wcm90b3R5cGUuYXBwbHk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiBqeCh0aGlzLHRoaXMuWmYsdGhpcy56ZCx0aGlzLmpkLnJvb3QsInByaW1hcnkiKS5iKHVpKGZ1bmN0aW9uKGIpe3JldHVybiBhLmhzKGIsYS5qZC52YixhLmpkLm5jKX0pKS5iKE5rKGZ1bmN0aW9uKGIpe2lmKGIgaW5zdGFuY2VvZiBkeClyZXR1cm4gYS5KRT0hMSxhLm1hdGNoKGIuamQpO2lmKGIgaW5zdGFuY2VvZiBjeCl0aHJvdyBreChiKTt0aHJvdyBiO30pKX07Cml4LnByb3RvdHlwZS5tYXRjaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3JldHVybiBqeCh0aGlzLHRoaXMuWmYsdGhpcy56ZCxhLnJvb3QsInByaW1hcnkiKS5iKHVpKGZ1bmN0aW9uKGMpe3JldHVybiBiLmhzKGMsYS52YixhLm5jKX0pKS5iKE5rKGZ1bmN0aW9uKGMpe2lmKGMgaW5zdGFuY2VvZiBjeCl0aHJvdyBreChjKTt0aHJvdyBjO30pKX07dmFyIGt4PWZ1bmN0aW9uKGEpe3JldHVybiBFcnJvcigiQ2Fubm90IG1hdGNoIGFueSByb3V0ZXMuIFVSTCBTZWdtZW50OiAnIithLkdkKyInIil9O2l4LnByb3RvdHlwZS5ocz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9e307YT0wPGEuVGEubGVuZ3RoP25ldyBSdihbXSwoZC5wcmltYXJ5PWEsZCkpOmE7cmV0dXJuIG5ldyBQdihhLGIsYyl9Owp2YXIgang9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gMD09PWQuVGEubGVuZ3RoJiYwPGQuZGQ/bHgoYSxiLGMsZCkuYih1aShmdW5jdGlvbihmKXtyZXR1cm4gbmV3IFJ2KFtdLGYpfSkpOm14KGEsYixkLGMsZC5UYSxlLCEwKX0sbHg9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIE52KGQuY2hpbGRyZW4sZnVuY3Rpb24oZSxmKXtyZXR1cm4gangoYSxiLGMsZixlKX0pfSxteD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXtyZXR1cm4gZmkuYXBwbHkobnVsbCxqYShkKSkuYih1aShmdW5jdGlvbihsKXtyZXR1cm4gbngoYSxiLGMsZCxsLGUsZixnKS5iKE5rKGZ1bmN0aW9uKG0pe2lmKG0gaW5zdGFuY2VvZiBjeClyZXR1cm4gZmkobnVsbCk7dGhyb3cgbTt9KSl9KSxRaSgxKSx0bChmdW5jdGlvbihsKXtyZXR1cm4hIWx9KSxOayhmdW5jdGlvbihsKXtpZihsIGluc3RhbmNlb2YgbWl8fCJFbXB0eUVycm9yIj09PWwubmFtZSl7aWYoYS5LeShjLGUsZikpcmV0dXJuIGZpKG5ldyBSdihbXSwKe30pKTt0aHJvdyBuZXcgY3goYyk7fXRocm93IGw7fSkpfTtpeC5wcm90b3R5cGUuS3k9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAwPT09Yi5sZW5ndGgmJiFhLmNoaWxkcmVuW2NdfTsKdmFyIG54PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7cmV0dXJuIG94KGUpIT09Zz9leChjKTp2b2lkIDA9PT1lLkVkP3B4KGEsYixjLGUsZik6bCYmYS5KRT8iKioiPT09ZS5wYXRoP3F4KGEsYixkLGUsZyk6cngoYSxiLGMsZCxlLGYsZyk6ZXgoYyl9LHF4PWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9c3goYSxbXSxkLkVkLHt9KTtyZXR1cm4gZC5FZC5zdGFydHNXaXRoKCIvIik/ZngoZik6dHgoZCxmKS5iKE5pKGZ1bmN0aW9uKGcpe3ZhciBsPW5ldyBSdihnLHt9KTtyZXR1cm4gbXgoYSxiLGwsYyxnLGUsITEpfSkpfSxyeD1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgbD11eChjLGUsZiksbT1sLmxhc3RDaGlsZDtpZighbC5KbylyZXR1cm4gZXgoYyk7bD1zeChhLGwuVGgsZS5FZCxsLmV0KTtyZXR1cm4gZS5FZC5zdGFydHNXaXRoKCIvIik/ZngobCk6dHgoZSxsKS5iKE5pKGZ1bmN0aW9uKHApe3JldHVybiBteChhLGIsYyxkLHAuY29uY2F0KGYuc2xpY2UobSkpLGcsCiExKX0pKX0scHg9ZnVuY3Rpb24oYSxiLGMsZCxlKXtpZigiKioiPT09ZC5wYXRoKXJldHVybiBkLldmP2EuJHIubG9hZChiLlosZCkuYih1aShmdW5jdGlvbihtKXtkLlplPW07cmV0dXJuIG5ldyBSdihlLHt9KX0pKTpmaShuZXcgUnYoZSx7fSkpO3ZhciBmPXV4KGMsZCxlKSxnPWYuVGg7aWYoIWYuSm8pcmV0dXJuIGV4KGMpO3ZhciBsPWUuc2xpY2UoZi5sYXN0Q2hpbGQpO3JldHVybiB2eChhLGIsZCxlKS5iKE5pKGZ1bmN0aW9uKG0pe3ZhciBwPW0ubW9kdWxlO209bS5xdDt2YXIgcT13eChjLGcsbCxtKSxyPXEuR2Q7cT1xLnlrO3JldHVybiAwPT09cS5sZW5ndGgmJjA8ci5kZD9seChhLHAsbSxyKS5iKHVpKGZ1bmN0aW9uKHYpe3JldHVybiBuZXcgUnYoZyx2KX0pKTowPT09bS5sZW5ndGgmJjA9PT1xLmxlbmd0aD9maShuZXcgUnYoZyx7fSkpOm14KGEscCxyLG0scSwicHJpbWFyeSIsITApLmIodWkoZnVuY3Rpb24odil7cmV0dXJuIG5ldyBSdihnLmNvbmNhdCh2LlRhKSx2LmNoaWxkcmVuKX0pKX0pKX0sCnZ4PWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjLmNoaWxkcmVuP2ZpKG5ldyBIdihjLmNoaWxkcmVuLGIpKTpjLldmP3ZvaWQgMCE9PWMuWmU/ZmkoYy5aZSk6eHgoYi5aLGMsZCkuYihOaShmdW5jdGlvbihlKXtyZXR1cm4gZT9hLiRyLmxvYWQoYi5aLGMpLmIodWkoZnVuY3Rpb24oZil7cmV0dXJuIGMuWmU9Zn0pKTpoeChjKX0pKTpmaShuZXcgSHYoW10sYikpfSx4eD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9Yi5XcjtyZXR1cm4gZCYmMCE9PWQubGVuZ3RoP01pKGQpLmIodWkoZnVuY3Rpb24oZSl7aWYoKGU9YS5nZXQoZSkpJiZheChlLldyKSllPWUuV3IoYixjKTtlbHNlIGlmKGF4KGUpKWU9ZShiLGMpO2Vsc2UgdGhyb3cgRXJyb3IoIkludmFsaWQgQ2FuTG9hZCBndWFyZCIpO3JldHVybiBPdihlKX0pKS5iKFFpKDEpLFVsKGZ1bmN0aW9uKGUpe2lmKGJ4KGUpKXt2YXIgZj1GdignUmVkaXJlY3RpbmcgdG8gIicrUXYoZSkrJyInKTtmLnVybD1lO3Rocm93IGY7fX0pLG5sKGZ1bmN0aW9uKGUpe3JldHVybiEwPT09CmV9KSk6ZmkoITApfSx0eD1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2ZvcihiPWIucm9vdDs7KXtjPWMuY29uY2F0KGIuVGEpO2lmKDA9PT1iLmRkKXJldHVybiBmaShjKTtpZigxPGIuZGR8fCFiLmNoaWxkcmVuLnByaW1hcnkpcmV0dXJuIGd4KGEuRWQpO2I9Yi5jaGlsZHJlbi5wcmltYXJ5fX0sc3g9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5GcC5wYXJzZShjKTtiPXl4KGEsYyxlLnJvb3QsYixkKTtyZXR1cm4gbmV3IFB2KGIsengoZS52YixhLmpkLnZiKSxlLm5jKX0seng9ZnVuY3Rpb24oYSxiKXt2YXIgYz17fTtNdihhLGZ1bmN0aW9uKGQsZSl7Y1tlXT0ic3RyaW5nIj09PXR5cGVvZiBkJiZkLnN0YXJ0c1dpdGgoIjoiKT9iW2Quc3Vic3RyaW5nKDEpXTpkfSk7cmV0dXJuIGN9LHl4PWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9QXgoYixjLlRhLGQsZSksZz17fTtNdihjLmNoaWxkcmVuLGZ1bmN0aW9uKGwsbSl7Z1ttXT15eChhLGIsbCxkLGUpfSk7cmV0dXJuIG5ldyBSdihmLApnKX0sQXg9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGIubWFwKGZ1bmN0aW9uKGUpe2lmKGUucGF0aC5zdGFydHNXaXRoKCI6Iikpe3ZhciBmPWRbZS5wYXRoLnN1YnN0cmluZygxKV07aWYoIWYpdGhyb3cgRXJyb3IoIkNhbm5vdCByZWRpcmVjdCB0byAnIithKyInLiBDYW5ub3QgZmluZCAnIitlLnBhdGgrIicuIik7ZT1mfWVsc2UgYTp7Zj0wO2Zvcih2YXIgZz1uKGMpLGw9Zy5uZXh0KCk7IWwuZG9uZTtsPWcubmV4dCgpKXtsPWwudmFsdWU7aWYobC5wYXRoPT09ZS5wYXRoKXtjLnNwbGljZShmKTtlPWw7YnJlYWsgYX1mKyt9fXJldHVybiBlfSl9OwpmdW5jdGlvbiB1eChhLGIsYyl7cmV0dXJuIiI9PT1iLnBhdGg/ImZ1bGwiPT09Yi5CaSYmKDA8YS5kZHx8MDxjLmxlbmd0aCk/e0pvOiExLFRoOltdLGxhc3RDaGlsZDowLGV0Ont9fTp7Sm86ITAsVGg6W10sbGFzdENoaWxkOjAsZXQ6e319OihhPShiLkV5fHxHdikoYyxhLGIpKT97Sm86ITAsVGg6YS5EaixsYXN0Q2hpbGQ6YS5Eai5sZW5ndGgsZXQ6YS5uSH06e0pvOiExLFRoOltdLGxhc3RDaGlsZDowLGV0Ont9fX0KZnVuY3Rpb24gd3goYSxiLGMsZCl7aWYoMDxjLmxlbmd0aCYmQngoYSxjLGQpKXthPW5ldyBSdihjLGEuY2hpbGRyZW4pO2M9e307Yy5wcmltYXJ5PWE7YT1uKGQpO2ZvcihkPWEubmV4dCgpOyFkLmRvbmU7ZD1hLm5leHQoKSlkPWQudmFsdWUsIiI9PT1kLnBhdGgmJiJwcmltYXJ5IiE9PW94KGQpJiYoY1tveChkKV09bmV3IFJ2KFtdLHt9KSk7Yz1uZXcgUnYoYixjKTtyZXR1cm57R2Q6Q3goYykseWs6W119fWlmKDA9PT1jLmxlbmd0aCYmRHgoYSxjLGQpKXtiPWEuVGE7dmFyIGU9YS5jaGlsZHJlbixmPXt9O2Q9bihkKTtmb3IodmFyIGc9ZC5uZXh0KCk7IWcuZG9uZTtnPWQubmV4dCgpKWc9Zy52YWx1ZSxFeChhLGMsZykmJiFlW294KGcpXSYmKGZbb3goZyldPW5ldyBSdihbXSx7fSkpO2E9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLGYpO2E9bmV3IFJ2KGIsYSk7cmV0dXJue0dkOkN4KGEpLHlrOmN9fXJldHVybntHZDphLHlrOmN9fQpmdW5jdGlvbiBDeChhKXtpZigxPT09YS5kZCYmYS5jaGlsZHJlbi5wcmltYXJ5KXt2YXIgYj1hLmNoaWxkcmVuLnByaW1hcnk7cmV0dXJuIG5ldyBSdihhLlRhLmNvbmNhdChiLlRhKSxiLmNoaWxkcmVuKX1yZXR1cm4gYX1mdW5jdGlvbiBCeChhLGIsYyl7cmV0dXJuIGMuc29tZShmdW5jdGlvbihkKXtyZXR1cm4gRXgoYSxiLGQpJiYicHJpbWFyeSIhPT1veChkKX0pfWZ1bmN0aW9uIER4KGEsYixjKXtyZXR1cm4gYy5zb21lKGZ1bmN0aW9uKGQpe3JldHVybiBFeChhLGIsZCl9KX1mdW5jdGlvbiBFeChhLGIsYyl7cmV0dXJuKDA8YS5kZHx8MDxiLmxlbmd0aCkmJiJmdWxsIj09PWMuQmk/ITE6IiI9PT1jLnBhdGgmJnZvaWQgMCE9PWMuRWR9ZnVuY3Rpb24gb3goYSl7cmV0dXJuIGEucmF8fCJwcmltYXJ5In07ZnVuY3Rpb24gRngoYSxiLGMsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmIoT2woZnVuY3Rpb24oZil7cmV0dXJuKG5ldyBpeChhLGIsYyxmLmFjLGQpKS5hcHBseSgpLmIodWkoZnVuY3Rpb24oZyl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxmKSx7TmE6Z30pfSkpfSkpfX07dmFyIEd4PVN5bWJvbCgiSU5JVElBTF9WQUxVRSIpO2Z1bmN0aW9uIEh4KCl7cmV0dXJuIE9sKGZ1bmN0aW9uKGEpe3JldHVybiBKaS5hcHBseShudWxsLGphKGEubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBiLmIoZ2woKSxObChHeCkpfSkpKS5iKHlsKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITE7cmV0dXJuIGMucmVkdWNlKGZ1bmN0aW9uKGUsZixnKXtpZihlIT09R3gpcmV0dXJuIGU7Zj09PUd4JiYoZD0hMCk7aWYoIWQpe2lmKCExPT09ZilyZXR1cm4gZjtpZihnPT09Yy5sZW5ndGgtMXx8YngoZikpcmV0dXJuIGZ9cmV0dXJuIGV9LGIpfSxHeCksYWsoZnVuY3Rpb24oYil7cmV0dXJuIGIhPT1HeH0pLHVpKGZ1bmN0aW9uKGIpe3JldHVybiBieChiKT9iOiEwPT09Yn0pLGdsKCkpfSl9O3ZhciBJeD1mdW5jdGlvbihhKXt0aGlzLnBhdGg9YTt0aGlzLkJjPXRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoLTFdfSxKeD1mdW5jdGlvbihhLGIpe3RoaXMuYT1hO3RoaXMuQmM9Yn07ZnVuY3Rpb24gS3goYSxiLGMpe2E9YS51ZDtyZXR1cm4gTHgoYSxiP2IudWQ6bnVsbCxjLFthLnZhbHVlXSl9ZnVuY3Rpb24gTXgoYSxiLGMpe2E6e2lmKGIpZm9yKGI9Yi5wYXJlbnQ7YjtiPWIucGFyZW50KXt2YXIgZD1iLkZhO2lmKGQmJmQuWmUpe2I9ZC5aZTticmVhayBhfX1iPW51bGx9cmV0dXJuKGI/Yi5tb2R1bGUuWjpjKS5nZXQoYSl9CmZ1bmN0aW9uIEx4KGEsYixjLGQsZSl7ZT12b2lkIDA9PT1lP3tjYW5EZWFjdGl2YXRlQ2hlY2tzOltdLGNhbkFjdGl2YXRlQ2hlY2tzOltdfTplO3ZhciBmPXJ3KGIpO2EuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD1mW2cudmFsdWUucmFdLG09ZC5jb25jYXQoW2cudmFsdWVdKSxwPWU7cD12b2lkIDA9PT1wP3tjYW5EZWFjdGl2YXRlQ2hlY2tzOltdLGNhbkFjdGl2YXRlQ2hlY2tzOltdfTpwO3ZhciBxPWcudmFsdWUscj1sP2wudmFsdWU6bnVsbCx2PWM/Yy5nZXRDb250ZXh0KGcudmFsdWUucmEpOm51bGw7aWYociYmcS5GYT09PXIuRmEpe3ZhciB3PU54KHIscSxxLkZhLlNTKTt3P3AuY2FuQWN0aXZhdGVDaGVja3MucHVzaChuZXcgSXgobSkpOihxLmRhdGE9ci5kYXRhLHEuc3c9ci5zdyk7cS5hP0x4KGcsbCx2P3YuY2hpbGRyZW46bnVsbCxtLHApOkx4KGcsbCxjLG0scCk7dyYmcC5jYW5EZWFjdGl2YXRlQ2hlY2tzLnB1c2gobmV3IEp4KHYmJnYucmEmJnYucmEuYXx8Cm51bGwscikpfWVsc2UgciYmT3gobCx2LHApLHAuY2FuQWN0aXZhdGVDaGVja3MucHVzaChuZXcgSXgobSkpLHEuYT9MeChnLG51bGwsdj92LmNoaWxkcmVuOm51bGwsbSxwKTpMeChnLG51bGwsYyxtLHApO2RlbGV0ZSBmW2cudmFsdWUucmFdfSk7TXYoZixmdW5jdGlvbihnLGwpe3JldHVybiBPeChnLGMuZ2V0Q29udGV4dChsKSxlKX0pO3JldHVybiBlfQpmdW5jdGlvbiBOeChhLGIsYyl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBjKXJldHVybiBjKGEsYik7c3dpdGNoKGMpe2Nhc2UgInBhdGhQYXJhbXNDaGFuZ2UiOnJldHVybiFYdihhLnVybCxiLnVybCk7Y2FzZSAicGF0aFBhcmFtc09yUXVlcnlQYXJhbXNDaGFuZ2UiOnJldHVybiFYdihhLnVybCxiLnVybCl8fCFLdihhLnZiLGIudmIpO2Nhc2UgImFsd2F5cyI6cmV0dXJuITA7Y2FzZSAicGFyYW1zT3JRdWVyeVBhcmFtc0NoYW5nZSI6cmV0dXJuIUN3KGEsYil8fCFLdihhLnZiLGIudmIpO2RlZmF1bHQ6cmV0dXJuIUN3KGEsYil9fQpmdW5jdGlvbiBPeChhLGIsYyl7dmFyIGQ9cncoYSksZT1hLnZhbHVlO012KGQsZnVuY3Rpb24oZixnKXtlLmE/Yj9PeChmLGIuY2hpbGRyZW4uZ2V0Q29udGV4dChnKSxjKTpPeChmLG51bGwsYyk6T3goZixiLGMpfSk7ZS5hP2ImJmIucmEmJmIucmEuY0c/Yy5jYW5EZWFjdGl2YXRlQ2hlY2tzLnB1c2gobmV3IEp4KGIucmEuYSxlKSk6Yy5jYW5EZWFjdGl2YXRlQ2hlY2tzLnB1c2gobmV3IEp4KG51bGwsZSkpOmMuY2FuRGVhY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBKeChudWxsLGUpKX07ZnVuY3Rpb24gUHgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIGMuYihOaShmdW5jdGlvbihkKXt2YXIgZT1kLmxlLGY9ZC5KZyxnPWQuWWwsbD1nLmNhbkFjdGl2YXRlQ2hlY2tzO2c9Zy5jYW5EZWFjdGl2YXRlQ2hlY2tzO3JldHVybiAwPT09Zy5sZW5ndGgmJjA9PT1sLmxlbmd0aD9maShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse0tqOiEwfSkpOlF4KGcsZSxmLGEpLmIoTmkoZnVuY3Rpb24obSl7cmV0dXJuIG0mJiJib29sZWFuIj09PXR5cGVvZiBtP1J4KGUsbCxhLGIpOmZpKG0pfSksdWkoZnVuY3Rpb24obSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxkKSx7S2o6bX0pfSkpfSkpfX1mdW5jdGlvbiBReChhLGIsYyxkKXtyZXR1cm4gTWkoYSkuYihOaShmdW5jdGlvbihlKXtyZXR1cm4gU3goZS5hLGUuQmMsYyxiLGQpfSksdGwoZnVuY3Rpb24oZSl7cmV0dXJuITAhPT1lfSwhMCkpfQpmdW5jdGlvbiBSeChhLGIsYyxkKXtyZXR1cm4gTWkoYikuYihOaShmdW5jdGlvbihlKXtyZXR1cm4gTWkoW1R4KGUuQmMucGFyZW50LGQpLFV4KGUuQmMsZCksVngoYSxlLnBhdGgsYyksV3goYSxlLkJjLGMpXSkuYihRaSgxKSx0bChmdW5jdGlvbihmKXtyZXR1cm4hMCE9PWZ9LCEwKSl9LDEpLHRsKGZ1bmN0aW9uKGUpe3JldHVybiEwIT09ZX0sITApKX1mdW5jdGlvbiBVeChhLGIpe251bGwhPT1hJiZiJiZiKG5ldyBCdihhKSk7cmV0dXJuIGZpKCEwKX1mdW5jdGlvbiBUeChhLGIpe251bGwhPT1hJiZiJiZiKG5ldyB6dihhKSk7cmV0dXJuIGZpKCEwKX0KZnVuY3Rpb24gV3goYSxiLGMpe3ZhciBkPWIuRmE/Yi5GYS5TRTpudWxsO2lmKCFkfHwwPT09ZC5sZW5ndGgpcmV0dXJuIGZpKCEwKTtkPWQubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBTaShmdW5jdGlvbigpe3ZhciBmPU14KGUsYixjKTtpZihmJiZheChmLlNFKSlmPU92KGYuU0UoYixhKSk7ZWxzZSBpZihheChmKSlmPU92KGYoYixhKSk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBDYW5BY3RpdmF0ZSBndWFyZCIpO3JldHVybiBmLmIodGwoKSl9KX0pO3JldHVybiBmaShkKS5iKEh4KCkpfQpmdW5jdGlvbiBWeChhLGIsYyl7dmFyIGQ9YltiLmxlbmd0aC0xXTtiPWIuc2xpY2UoMCxiLmxlbmd0aC0xKS5yZXZlcnNlKCkubWFwKGZ1bmN0aW9uKGUpe3ZhciBmPWUuRmE/ZS5GYS5URTpudWxsO3JldHVybiBmJiYwIT09Zi5sZW5ndGg/e25vZGU6ZSxZbDpmfTpudWxsfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gU2koZnVuY3Rpb24oKXt2YXIgZj1lLllsLm1hcChmdW5jdGlvbihnKXtpZigoZz1NeChnLGUubm9kZSxjKSkmJmF4KGcuVEUpKWc9T3YoZy5URShkLGEpKTtlbHNlIGlmKGF4KGcpKWc9T3YoZyhkLGEpKTtlbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIENhbkFjdGl2YXRlQ2hpbGQgZ3VhcmQiKTtyZXR1cm4gZy5iKHRsKCkpfSk7cmV0dXJuIGZpKGYpLmIoSHgoKSl9KX0pO3JldHVybiBmaShiKS5iKEh4KCkpfQpmdW5jdGlvbiBTeChhLGIsYyxkLGUpe3ZhciBmPWImJmIuRmE/Yi5GYS5VRTpudWxsO2lmKCFmfHwwPT09Zi5sZW5ndGgpcmV0dXJuIGZpKCEwKTtmPWYubWFwKGZ1bmN0aW9uKGcpe2lmKChnPU14KGcsYixlKSkmJmF4KGcuVUUpKWc9T3YoZy5VRShhLGIsYyxkKSk7ZWxzZSBpZihheChnKSlnPU92KGcoYSxiLGMsZCkpO2Vsc2UgdGhyb3cgRXJyb3IoIkludmFsaWQgQ2FuRGVhY3RpdmF0ZSBndWFyZCIpO3JldHVybiBnLmIodGwoKSl9KTtyZXR1cm4gZmkoZikuYihIeCgpKX07dmFyIFh4PWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBZeChhLGIsYyxkLGUsZil7cmV0dXJuKG5ldyBaeChhLGIsYyxkLHZvaWQgMD09PWU/ImVtcHR5T25seSI6ZSx2b2lkIDA9PT1mPyJsZWdhY3kiOmYpKS5yZWNvZ25pemUoKX12YXIgWng9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMubms9YTt0aGlzLnpkPWI7dGhpcy5qZD1jO3RoaXMudXJsPWQ7dGhpcy5haz1lO3RoaXMubWs9Zn07Clp4LnByb3RvdHlwZS5yZWNvZ25pemU9ZnVuY3Rpb24oKXt0cnl7dmFyIGE9JHgodGhpcy5qZC5yb290LFtdLFtdLHRoaXMuemQsdGhpcy5taykuR2QsYj1heSh0aGlzLHRoaXMuemQsYSwicHJpbWFyeSIpLGM9bmV3IHd3KFtdLE9iamVjdC5mcmVlemUoe30pLE9iamVjdC5mcmVlemUoT2JqZWN0LmFzc2lnbih7fSx0aGlzLmpkLnZiKSksdGhpcy5qZC5uYyx7fSwicHJpbWFyeSIsdGhpcy5uayxudWxsLHRoaXMuamQucm9vdCwtMSx7fSksZD1uZXcgdncodGhpcy51cmwsbmV3IHF3KGMsYikpO2J5KHRoaXMsZC51ZCk7cmV0dXJuIGZpKGQpfWNhdGNoKGUpe3JldHVybiBuZXcgVGgoZnVuY3Rpb24oZil7cmV0dXJuIGYuZXJyb3IoZSl9KX19Owp2YXIgYnk9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLnZhbHVlLGQ9eXcoYyxhLmFrKTtjLnBhcmFtcz1PYmplY3QuZnJlZXplKGQucGFyYW1zKTtjLmRhdGE9T2JqZWN0LmZyZWV6ZShkLmRhdGEpO2IuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gYnkoYSxlKX0pfSxheT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gMD09PWMuVGEubGVuZ3RoJiYwPGMuZGQ/YS5mdChiLGMpOmN5KGEsYixjLGMuVGEsZCl9O1p4LnByb3RvdHlwZS5mdD1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7Yj1ZdihiLGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGF5KGMsYSxkLGUpfSk7ZHkoYik7ZXkoYik7cmV0dXJuIGJ9Owp2YXIgY3k9ZnVuY3Rpb24oYSxiLGMsZCxlKXtiPW4oYik7Zm9yKHZhciBmPWIubmV4dCgpOyFmLmRvbmU7Zj1iLm5leHQoKSl7Zj1mLnZhbHVlO3RyeXt2YXIgZz12b2lkIDAsbD1hLG09YyxwPWQscT1lO2lmKGYuRWQpdGhyb3cgbmV3IFh4O2lmKChmLnJhfHwicHJpbWFyeSIpIT09cSl0aHJvdyBuZXcgWHg7dmFyIHI9W10sdj1bXTtpZigiKioiPT09Zi5wYXRoKWc9bmV3IHd3KHAsMDxwLmxlbmd0aD8oMDxwLmxlbmd0aD9wW3AubGVuZ3RoLTFdOm51bGwpLnBhcmFtZXRlcnM6e30sT2JqZWN0LmZyZWV6ZShPYmplY3QuYXNzaWduKHt9LGwuamQudmIpKSxsLmpkLm5jLGYuZGF0YXx8e30scSxmLmEsZixmeShtKSxneShtKStwLmxlbmd0aCxmLnJlc29sdmV8fHt9KTtlbHNle3ZhciB3PWh5KG0sZixwKTtyPXcuVGg7dj1wLnNsaWNlKHcubGFzdENoaWxkKTtnPW5ldyB3dyhyLHcucGFyYW1ldGVycyxPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sbC5qZC52YikpLGwuamQubmMsCmYuZGF0YXx8e30scSxmLmEsZixmeShtKSxneShtKStyLmxlbmd0aCxmLnJlc29sdmV8fHt9KX12YXIgeD1mLmNoaWxkcmVuP2YuY2hpbGRyZW46Zi5XZj9mLlplLnF0OltdLHU9JHgobSxyLHYseCxsLm1rKSxEPXUuR2QsSD11LnlrO2lmKDA9PT1ILmxlbmd0aCYmMDxELmRkKXt2YXIgRT1sLmZ0KHgsRCk7dmFyIE49W25ldyBxdyhnLEUpXX1lbHNlIGlmKDA9PT14Lmxlbmd0aCYmMD09PUgubGVuZ3RoKU49W25ldyBxdyhnLFtdKV07ZWxzZXt2YXIgTT1jeShsLHgsRCxILCJwcmltYXJ5Iik7Tj1bbmV3IHF3KGcsTSldfXJldHVybiBOfWNhdGNoKEope2lmKCEoSiBpbnN0YW5jZW9mIFh4KSl0aHJvdyBKO319aWYoYS5LeShjLGQsZSkpcmV0dXJuW107dGhyb3cgbmV3IFh4O307WngucHJvdG90eXBlLkt5PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMD09PWIubGVuZ3RoJiYhYS5jaGlsZHJlbltjXX07CmZ1bmN0aW9uIGV5KGEpe2Euc29ydChmdW5jdGlvbihiLGMpe3JldHVybiJwcmltYXJ5Ij09PWIudmFsdWUucmE/LTE6InByaW1hcnkiPT09Yy52YWx1ZS5yYT8xOmIudmFsdWUucmEubG9jYWxlQ29tcGFyZShjLnZhbHVlLnJhKX0pfWZ1bmN0aW9uIGh5KGEsYixjKXtpZigiIj09PWIucGF0aCl7aWYoImZ1bGwiPT09Yi5CaSYmKDA8YS5kZHx8MDxjLmxlbmd0aCkpdGhyb3cgbmV3IFh4O3JldHVybntUaDpbXSxsYXN0Q2hpbGQ6MCxwYXJhbWV0ZXJzOnt9fX1hPShiLkV5fHxHdikoYyxhLGIpO2lmKCFhKXRocm93IG5ldyBYeDt2YXIgZD17fTtNdihhLm5ILGZ1bmN0aW9uKGUsZil7ZFtmXT1lLnBhdGh9KTtiPTA8YS5Eai5sZW5ndGg/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLGEuRGpbYS5Eai5sZW5ndGgtMV0ucGFyYW1ldGVycyk6ZDtyZXR1cm57VGg6YS5EaixsYXN0Q2hpbGQ6YS5Eai5sZW5ndGgscGFyYW1ldGVyczpifX0KZnVuY3Rpb24gZHkoYSl7dmFyIGI9e307YS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWJbYy52YWx1ZS5yYV07aWYoZCl0aHJvdyBkPWQudXJsLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkuam9pbigiLyIpLGM9Yy52YWx1ZS51cmwubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9KS5qb2luKCIvIiksRXJyb3IoIlR3byBzZWdtZW50cyBjYW5ub3QgaGF2ZSB0aGUgc2FtZSBvdXRsZXQgbmFtZTogJyIrZCsiJyBhbmQgJyIrYysiJy4iKTtiW2MudmFsdWUucmFdPWMudmFsdWV9KX1mdW5jdGlvbiBmeShhKXtmb3IoO2Euemc7KWE9YS56ZztyZXR1cm4gYX1mdW5jdGlvbiBneShhKXtmb3IodmFyIGI9YS55Zz9hLnlnOjA7YS56ZzspYT1hLnpnLGIrPWEueWc/YS55ZzowO3JldHVybiBiLTF9CmZ1bmN0aW9uICR4KGEsYixjLGQsZSl7aWYoMDxjLmxlbmd0aCYmaXkoYSxjLGQpKXt2YXIgZj1uZXcgUnYoYyxhLmNoaWxkcmVuKTtjPXt9O2MucHJpbWFyeT1mO2Yuemc9YTtmLnlnPWIubGVuZ3RoO2Y9bihkKTtmb3IoZT1mLm5leHQoKTshZS5kb25lO2U9Zi5uZXh0KCkpaWYoZT1lLnZhbHVlLCIiPT09ZS5wYXRoJiYicHJpbWFyeSIhPT1qeShlKSl7dmFyIGc9bmV3IFJ2KFtdLHt9KTtnLnpnPWE7Zy55Zz1iLmxlbmd0aDtjW2p5KGUpXT1nfWM9bmV3IFJ2KGIsYyk7Yy56Zz1hO2MueWc9Yi5sZW5ndGg7cmV0dXJue0dkOmMseWs6W119fWlmKDA9PT1jLmxlbmd0aCYma3koYSxjLGQpKXtmPWEuVGE7Zz1hLmNoaWxkcmVuO3ZhciBsPXt9O2Q9bihkKTtmb3IodmFyIG09ZC5uZXh0KCk7IW0uZG9uZTttPWQubmV4dCgpKWlmKG09bS52YWx1ZSxseShhLGMsbSkmJiFnW2p5KG0pXSl7dmFyIHA9bmV3IFJ2KFtdLHt9KTtwLnpnPWE7cC55Zz0ibGVnYWN5Ij09PWU/YS5UYS5sZW5ndGg6Yi5sZW5ndGg7CmxbankobSldPXB9ZT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZyksbCk7Zj1uZXcgUnYoZixlKTtmLnpnPWE7Zi55Zz1iLmxlbmd0aDtyZXR1cm57R2Q6Zix5azpjfX1mPW5ldyBSdihhLlRhLGEuY2hpbGRyZW4pO2Yuemc9YTtmLnlnPWIubGVuZ3RoO3JldHVybntHZDpmLHlrOmN9fWZ1bmN0aW9uIGl5KGEsYixjKXtyZXR1cm4gYy5zb21lKGZ1bmN0aW9uKGQpe3JldHVybiBseShhLGIsZCkmJiJwcmltYXJ5IiE9PWp5KGQpfSl9ZnVuY3Rpb24ga3koYSxiLGMpe3JldHVybiBjLnNvbWUoZnVuY3Rpb24oZCl7cmV0dXJuIGx5KGEsYixkKX0pfWZ1bmN0aW9uIGx5KGEsYixjKXtyZXR1cm4oMDxhLmRkfHwwPGIubGVuZ3RoKSYmImZ1bGwiPT09Yy5CaT8hMToiIj09PWMucGF0aCYmdm9pZCAwPT09Yy5FZH1mdW5jdGlvbiBqeShhKXtyZXR1cm4gYS5yYXx8InByaW1hcnkifTtmdW5jdGlvbiBteShhLGIsYyxkLGUpe3JldHVybiBmdW5jdGlvbihmKXtyZXR1cm4gZi5iKE5pKGZ1bmN0aW9uKGcpe3JldHVybiBZeChhLGIsZy5OYSxjKGcuTmEpLGQsZSkuYih1aShmdW5jdGlvbihsKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtsZTpsfSl9KSl9KSl9fTtmdW5jdGlvbiBueShhLGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYy5iKE5pKGZ1bmN0aW9uKGQpe3ZhciBlPWQubGUsZj1kLllsLmNhbkFjdGl2YXRlQ2hlY2tzO2lmKCFmLmxlbmd0aClyZXR1cm4gZmkoZCk7dmFyIGc9MDtyZXR1cm4gTWkoZikuYihOaShmdW5jdGlvbihsKXtyZXR1cm4gb3kobC5CYyxlLGEsYil9LDEpLFVsKGZ1bmN0aW9uKCl7cmV0dXJuIGcrK30pLHVsKCksTmkoZnVuY3Rpb24oKXtyZXR1cm4gZz09PWYubGVuZ3RoP2ZpKGQpOmJpfSkpfSkpfX1mdW5jdGlvbiBveShhLGIsYyxkKXtyZXR1cm4gcHkoYS5YTSxhLGIsZCkuYih1aShmdW5jdGlvbihlKXthLnN3PWU7YS5kYXRhPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhLmRhdGEpLHl3KGEsYykucmVzb2x2ZSk7cmV0dXJuIG51bGx9KSl9CmZ1bmN0aW9uIHB5KGEsYixjLGQpe3ZhciBlPU9iamVjdC5rZXlzKGEpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZmkoe30pO3ZhciBmPXt9O3JldHVybiBNaShlKS5iKE5pKGZ1bmN0aW9uKGcpe3JldHVybiBxeShhW2ddLGIsYyxkKS5iKFVsKGZ1bmN0aW9uKGwpe2ZbZ109bH0pKX0pLHVsKCksTmkoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmtleXMoZikubGVuZ3RoPT09ZS5sZW5ndGg/ZmkoZik6Yml9KSl9ZnVuY3Rpb24gcXkoYSxiLGMsZCl7YT1NeChhLGIsZCk7cmV0dXJuIGEucmVzb2x2ZT9PdihhLnJlc29sdmUoYixjKSk6T3YoYShiLGMpKX07ZnVuY3Rpb24gcnkoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBiLmIoT2woZnVuY3Rpb24oYyl7dmFyIGQ9YShjKTtyZXR1cm4gZD9NaShkKS5iKHVpKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSk6TWkoW2NdKX0pKX19O3ZhciBzeT1mdW5jdGlvbigpe30sdHk9ZnVuY3Rpb24oKXt9O3R5LnByb3RvdHlwZS5zdG9yZT1mdW5jdGlvbigpe307dmFyIHV5PW5ldyB5KCJST1VURVMiKSx2eT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlJqPWE7dGhpcy5jUD1iO3RoaXMuTkc9Yzt0aGlzLk1HPWR9O3Z5LnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLk5HJiZ0aGlzLk5HKGIpO3JldHVybiB3eSh0aGlzLGIuV2YpLmIodWkoZnVuY3Rpb24oZCl7Yy5NRyYmYy5NRyhiKTtkPWQuY3JlYXRlKGEpO3JldHVybiBuZXcgSHYoQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxkLlouZ2V0KHV5KSkubWFwKEp2KSxkKX0pKX07dmFyIHd5PWZ1bmN0aW9uKGEsYil7cmV0dXJuInN0cmluZyI9PT10eXBlb2YgYj9NaShhLlJqLmxvYWQoYikpOk92KGIoKSkuYihOaShmdW5jdGlvbihjKXtyZXR1cm4gYyBpbnN0YW5jZW9mIHFkP2ZpKGMpOk1pKGEuY1AuY0YoYykpfSkpfTt2YXIgeXk9ZnVuY3Rpb24oKXt0aGlzLm10PXRoaXMuQmM9dGhpcy5yYT1udWxsO3RoaXMuY2hpbGRyZW49bmV3IHh5O3RoaXMucXg9bnVsbH0seHk9ZnVuY3Rpb24oKXt0aGlzLmZzPW5ldyBNYXB9LFp3PWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRDb250ZXh0KGIpO2N8fChjPW5ldyB5eSxhLmZzLnNldChiLGMpKTtyZXR1cm4gY307eHkucHJvdG90eXBlLmdldENvbnRleHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnMuZ2V0KGEpfHxudWxsfTt2YXIgenk9ZnVuY3Rpb24oKXt9LEF5PWZ1bmN0aW9uKCl7fTtBeS5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIEJ5KGEpe3Rocm93IGE7fWZ1bmN0aW9uIEN5KGEsYil7cmV0dXJuIGIucGFyc2UoIi8iKX1mdW5jdGlvbiBEeSgpe3JldHVybiBmaShudWxsKX0KdmFyIEl5PWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7dmFyIG09dGhpczt0aGlzLm5rPWE7dGhpcy5GcD1iO3RoaXMuQUg9Yzt0aGlzLmxvY2F0aW9uPWQ7dGhpcy56ZD1sO3RoaXMuT2w9dGhpcy56eT1udWxsO3RoaXMuWWY9MDt0aGlzLmlHPSExO3RoaXMuZXZlbnRzPW5ldyBZaDt0aGlzLlpoPUJ5O3RoaXMuT3M9Q3k7dGhpcy5Ucz0hMTt0aGlzLnl5PS0xO3RoaXMucHk9e05POkR5LEZFOkR5fTt0aGlzLkVwPW5ldyBBeTt0aGlzLnB0PW5ldyB0eTt0aGlzLlhzPSJpZ25vcmUiO3RoaXMuYWs9ImVtcHR5T25seSI7dGhpcy55bT0iZGVmZXJyZWQiO3RoaXMubWs9ImxlZ2FjeSI7dGhpcy5aZj1lLmdldChwZCk7dGhpcy5jb25zb2xlPWUuZ2V0KFBlKTt0aGlzLmlHPWUuZ2V0KFQpaW5zdGFuY2VvZiBUO0V5KHRoaXMsbCk7dGhpcy5Qbj10aGlzLndmPXRoaXMubmI9bmV3IFB2KG5ldyBSdihbXSx7fSkse30sbnVsbCk7dGhpcy4kcj1uZXcgdnkoZixnLGZ1bmN0aW9uKHApe3JldHVybiBGeShtLApuZXcgeHYocCkpfSxmdW5jdGlvbihwKXtyZXR1cm4gRnkobSxuZXcgeXYocCkpfSk7dGhpcy5laD11dyh0aGlzLm5iLHRoaXMubmspO3RoaXMuRGs9bmV3IGFpKHtpZDowLG5iOnRoaXMubmIsbEY6dGhpcy5uYixhYzp0aGlzLm5iLE5hOnRoaXMubmIsdmY6dGhpcy5uYixCZDp7fSxyZXNvbHZlOm51bGwscmVqZWN0Om51bGwsZmU6UHJvbWlzZS5yZXNvbHZlKCEwKSxzb3VyY2U6ImltcGVyYXRpdmUiLG9tOm51bGwsSmc6dGhpcy5laC5DYSxsZTpudWxsLGZvOnRoaXMuZWgsQ3o6bnVsbCxZbDp7Y2FuQWN0aXZhdGVDaGVja3M6W10sY2FuRGVhY3RpdmF0ZUNoZWNrczpbXX0sS2o6bnVsbH0pO3RoaXMud1E9R3kodGhpcyx0aGlzLkRrKTtIeSh0aGlzKX0sR3k9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmV2ZW50cztyZXR1cm4gYi5iKGFrKGZ1bmN0aW9uKGQpe3JldHVybiAwIT09ZC5pZH0pLHVpKGZ1bmN0aW9uKGQpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCksCnthYzpkLnZmfSl9KSxPbChmdW5jdGlvbihkKXt2YXIgZT0hMSxmPSExO3JldHVybiBmaShkKS5iKFVsKGZ1bmN0aW9uKGcpe2EuT2w9e2lkOmcuaWQseFM6Zy5sRixhYzpnLmFjLHRyaWdnZXI6Zy5zb3VyY2UsQmQ6Zy5CZCxWUTphLnp5P09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxhLnp5KSx7VlE6bnVsbH0pOm51bGx9fSksT2woZnVuY3Rpb24oZyl7dmFyIGw9IWEuVHN8fGcuYWMudG9TdHJpbmcoKSE9PWEuUG4udG9TdHJpbmcoKTtpZigicmVsb2FkIj09PWEuWHN8fGwpcmV0dXJuIGZpKGcpLmIoT2woZnVuY3Rpb24ocil7dmFyIHY9YS5Eay5nZXRWYWx1ZSgpO2MubmV4dChuZXcgb3Yoci5pZCxRdihyLmFjKSxyLnNvdXJjZSxyLm9tKSk7cmV0dXJuIHYhPT1hLkRrLmdldFZhbHVlKCk/Ymk6W3JdfSksT2woZnVuY3Rpb24ocil7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKX0pLEZ4KGEuWmYuWixhLiRyLGEuRnAsYS56ZCksVWwoZnVuY3Rpb24ocil7YS5PbD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sCmEuT2wpLHt1UzpyLk5hfSl9KSxteShhLm5rLGEuemQsZnVuY3Rpb24ocil7cmV0dXJuIFF2KHIpfSxhLmFrLGEubWspLFVsKGZ1bmN0aW9uKHIpeyJlYWdlciI9PT1hLnltJiYoci5CZC5nZ3x8SnkoYSxyLk5hLCEhci5CZC5iaCxyLmlkLHIuQmQuc3RhdGUpLGEuUG49ci5OYSl9KSxVbChmdW5jdGlvbihyKXtyPW5ldyBzdihyLmlkLFF2KHIuYWMpLFF2KHIuTmEpLHIubGUpO2MubmV4dChyKX0pKTtpZihsJiZhLndmKXtsPWcuYWM7dmFyIG09Zy5zb3VyY2UscD1nLm9tLHE9Zy5CZDttPW5ldyBvdihnLmlkLFF2KGwpLG0scCk7Yy5uZXh0KG0pO209dXcobCxhLm5rKS5DYTtyZXR1cm4gZmkoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtsZTptLE5hOmwsQmQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHEpLHtnZzohMSxiaDohMX0pfSkpfWEud2Y9Zy52ZjthLlBuPWcuTmE7Zy5yZXNvbHZlKG51bGwpO3JldHVybiBiaX0pLHJ5KGZ1bmN0aW9uKGcpe3ZhciBsPQpnLkJkO3JldHVybiBhLnB5Lk5PKGcubGUse1lmOmcuaWQsRk86Zy5hYyx3ZjpnLnZmLGdnOiEhbC5nZyxiaDohIWwuYmh9KX0pLFVsKGZ1bmN0aW9uKGcpe2c9bmV3IHR2KGcuaWQsUXYoZy5hYyksUXYoZy5OYSksZy5sZSk7RnkoYSxnKX0pLHVpKGZ1bmN0aW9uKGcpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZykse1lsOkt4KGcubGUsZy5KZyxhLkFIKX0pfSksUHgoYS5aZi5aLGZ1bmN0aW9uKGcpe3JldHVybiBGeShhLGcpfSksVWwoZnVuY3Rpb24oZyl7aWYoYngoZy5Laikpe3ZhciBsPUZ2KCdSZWRpcmVjdGluZyB0byAiJytRdihnLktqKSsnIicpO2wudXJsPWcuS2o7dGhyb3cgbDt9fSksVWwoZnVuY3Rpb24oZyl7Zz1uZXcgdXYoZy5pZCxRdihnLmFjKSxRdihnLk5hKSxnLmxlLCEhZy5Laik7RnkoYSxnKX0pLGFrKGZ1bmN0aW9uKGcpe2lmKCFnLktqKXtLeShhKTt2YXIgbD1uZXcgcXYoZy5pZCxRdihnLmFjKSwiIik7Yy5uZXh0KGwpO2cucmVzb2x2ZSghMSk7CnJldHVybiExfXJldHVybiEwfSkscnkoZnVuY3Rpb24oZyl7aWYoZy5ZbC5jYW5BY3RpdmF0ZUNoZWNrcy5sZW5ndGgpcmV0dXJuIGZpKGcpLmIoVWwoZnVuY3Rpb24obCl7bD1uZXcgdnYobC5pZCxRdihsLmFjKSxRdihsLk5hKSxsLmxlKTtGeShhLGwpfSksT2woZnVuY3Rpb24obCl7dmFyIG09ITE7cmV0dXJuIGZpKGwpLmIobnkoYS5hayxhLlpmLlopLFVsKHtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIG09ITB9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7aWYoIW0pe3ZhciBwPW5ldyBxdihsLmlkLFF2KGwuYWMpLCJBdCBsZWFzdCBvbmUgcm91dGUgcmVzb2x2ZXIgZGlkbid0IGVtaXQgYW55IHZhbHVlLiIpO2MubmV4dChwKTtsLnJlc29sdmUoITEpfX19KSl9KSxVbChmdW5jdGlvbihsKXtsPW5ldyB3dihsLmlkLFF2KGwuYWMpLFF2KGwuTmEpLGwubGUpO0Z5KGEsbCl9KSl9KSxyeShmdW5jdGlvbihnKXt2YXIgbD1nLkJkO3JldHVybiBhLnB5LkZFKGcubGUse1lmOmcuaWQsRk86Zy5hYywKd2Y6Zy52ZixnZzohIWwuZ2csYmg6ISFsLmJofSl9KSx1aShmdW5jdGlvbihnKXt2YXIgbD1nLmxlO3ZhciBtPWcuZm87bT1EdyhhLnB0LGwudWQsbT9tLnVkOnZvaWQgMCk7bD1uZXcgdHcobSxsKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGcpLHtDejpsfSl9KSxVbChmdW5jdGlvbihnKXthLm5iPWcuTmE7YS53Zj1hLkVwLm1lcmdlKGEubmIsZy52Zik7YS5laD1nLkN6OyJkZWZlcnJlZCI9PT1hLnltJiYoZy5CZC5nZ3x8SnkoYSxhLndmLCEhZy5CZC5iaCxnLmlkLGcuQmQuc3RhdGUpLGEuUG49Zy5OYSl9KSxXdyhhLkFILGEucHQsZnVuY3Rpb24oZyl7cmV0dXJuIEZ5KGEsZyl9KSxVbCh7bmV4dDpmdW5jdGlvbigpe2U9ITB9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7ZT0hMH19KSxxbChmdW5jdGlvbigpe2lmKCFlJiYhZil7S3koYSk7dmFyIGc9bmV3IHF2KGQuaWQsUXYoZC5hYyksIk5hdmlnYXRpb24gSUQgIitkLmlkKyIgaXMgbm90IGVxdWFsIHRvIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gaWQgIisKYS5ZZik7Yy5uZXh0KGcpO2QucmVzb2x2ZSghMSl9YS5PbD1udWxsfSksTmsoZnVuY3Rpb24oZyl7Zj0hMDtpZihnJiZnLm5nTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yKXt2YXIgbD1ieChnLnVybCk7bHx8KGEuVHM9ITAsTHkoYSxkLmZvLGQubmIsZC52ZikpO3ZhciBtPW5ldyBxdihkLmlkLFF2KGQuYWMpLGcubWVzc2FnZSk7Yy5uZXh0KG0pO2w/c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBwPWEuRXAubWVyZ2UoZy51cmwsYS53Zik7cmV0dXJuIE15KGEscCwiaW1wZXJhdGl2ZSIsbnVsbCx7Z2c6ZC5CZC5nZyxiaDoiZWFnZXIiPT09YS55bX0se3Jlc29sdmU6ZC5yZXNvbHZlLHJlamVjdDpkLnJlamVjdCxmZTpkLmZlfSl9LDApOmQucmVzb2x2ZSghMSl9ZWxzZXtMeShhLGQuZm8sZC5uYixkLnZmKTtsPW5ldyBydihkLmlkLFF2KGQuYWMpLGcpO2MubmV4dChsKTt0cnl7ZC5yZXNvbHZlKGEuWmgoZykpfWNhdGNoKHApe2QucmVqZWN0KHApfX1yZXR1cm4gYml9KSl9KSl9LE55PQpmdW5jdGlvbihhKXt2YXIgYj1hLkRrLnZhbHVlO2IuTmE9YS5QbjtyZXR1cm4gYn0sT3k9ZnVuY3Rpb24oYSxiKXthLkRrLm5leHQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE55KGEpKSxiKSl9O0l5LnByb3RvdHlwZS5HZT1mdW5jdGlvbigpe1B5KHRoaXMpOzA9PT10aGlzLllmJiZReSh0aGlzLHRoaXMubG9jYXRpb24ucGF0aCghMCkse2JoOiEwfSl9Owp2YXIgUHk9ZnVuY3Rpb24oYSl7YS5Oc3x8KGEuTnM9YS5sb2NhdGlvbi5zdWJzY3JpYmUoZnVuY3Rpb24oYil7dmFyIGM9UnkoYSxiLnVybCksZD0icG9wc3RhdGUiPT09Yi50eXBlPyJwb3BzdGF0ZSI6Imhhc2hjaGFuZ2UiLGU9Yi5zdGF0ZSYmYi5zdGF0ZS5ZZj9iLnN0YXRlOm51bGw7c2V0VGltZW91dChmdW5jdGlvbigpe015KGEsYyxkLGUse2JoOiEwfSl9LDApfSkpfSxGeT1mdW5jdGlvbihhLGIpe2EuZXZlbnRzLm5leHQoYil9LEV5PWZ1bmN0aW9uKGEsYil7SXYoYik7YS56ZD1iLm1hcChKdik7YS5Ucz0hMTthLnl5PS0xfTtJeS5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuJGIoKX07SXkucHJvdG90eXBlLiRiPWZ1bmN0aW9uKCl7dGhpcy5OcyYmKHRoaXMuTnMudW5zdWJzY3JpYmUoKSx0aGlzLk5zPW51bGwpfTsKSXkucHJvdG90eXBlLmhzPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yj12b2lkIDA9PT1iP3t9OmIsZD1jLk5TLGU9Yy52YjtiPWMubmM7dmFyIGY9Yy5LUyxnPWMuTVM7Yz1jLkpTO0dkKCkmJmYmJmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJwcmVzZXJ2ZVF1ZXJ5UGFyYW1zIGlzIGRlcHJlY2F0ZWQsIHVzZSBxdWVyeVBhcmFtc0hhbmRsaW5nIGluc3RlYWQuIik7ZD1kfHx0aGlzLmVoLnJvb3Q7Yj1jP3RoaXMubmIubmM6YjtpZihnKXN3aXRjaChnKXtjYXNlICJtZXJnZSI6Zj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5uYi52YiksZSk7YnJlYWs7Y2FzZSAicHJlc2VydmUiOmY9dGhpcy5uYi52YjticmVhaztkZWZhdWx0OmY9ZXx8bnVsbH1lbHNlIGY9Zj90aGlzLm5iLnZiOmV8fG51bGw7bnVsbCE9PWYmJihmPVN5KGYpKTtlPXRoaXMubmI7aWYoMD09PWEubGVuZ3RoKWI9SHcoZS5yb290LGUucm9vdCxlLGYsYik7ZWxzZSBpZihhPUt3KGEpLAphLmJHJiYxPT09YS5Wbi5sZW5ndGgmJiIvIj09YS5WblswXSliPUh3KGUucm9vdCxuZXcgUnYoW10se30pLGUsZixiKTtlbHNle2lmKGEuYkcpZD1uZXcgTHcoZS5yb290LCEwLDApO2Vsc2UgaWYoLTE9PT1kLkNhLndDKWQ9ZC5DYS5yRSxkPW5ldyBMdyhkLGQ9PT1lLnJvb3QsMCk7ZWxzZXtnPWQuQ2EuckU7ZD1kLkNhLndDKyhHdyhhLlZuWzBdKT8wOjEpO2ZvcihjPWEuRFE7Yz5kOyl7Yy09ZDtnPWcucGFyZW50O2lmKCFnKXRocm93IEVycm9yKCJJbnZhbGlkIG51bWJlciBvZiAnLi4vJyIpO2Q9Zy5UYS5sZW5ndGh9ZD1uZXcgTHcoZywhMSxkLWMpfWE9ZC5mdD9QdyhkLkdkLGQuaW5kZXgsYS5Wbik6T3coZC5HZCxkLmluZGV4LGEuVm4pO2I9SHcoZC5HZCxhLGUsZixiKX1yZXR1cm4gYn07CnZhciBReT1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jP3tnZzohMX06YztHZCgpJiZhLmlHJiYhdGsoKSYmYS5jb25zb2xlLndhcm4oIk5hdmlnYXRpb24gdHJpZ2dlcmVkIG91dHNpZGUgQW5ndWxhciB6b25lLCBkaWQgeW91IGZvcmdldCB0byBjYWxsICduZ1pvbmUucnVuKCknPyIpO2I9YngoYik/YjpSeShhLGIpO2I9YS5FcC5tZXJnZShiLGEud2YpO3JldHVybiBNeShhLGIsImltcGVyYXRpdmUiLG51bGwsYyl9O0l5LnByb3RvdHlwZS5uYXZpZ2F0ZT1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj97Z2c6ITF9OmI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107aWYobnVsbD09ZCl0aHJvdyBFcnJvcigiVGhlIHJlcXVlc3RlZCBwYXRoIGNvbnRhaW5zICIrZCsiIHNlZ21lbnQgYXQgaW5kZXggIitjKTt9cmV0dXJuIFF5KHRoaXMsdGhpcy5ocyhhLGIpLGIpfTsKdmFyIFJ5PWZ1bmN0aW9uKGEsYil7dHJ5e3ZhciBjPWEuRnAucGFyc2UoYil9Y2F0Y2goZCl7Yz1hLk9zKGQsYS5GcCxiKX1yZXR1cm4gY30sU3k9ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5rZXlzKGEpLnJlZHVjZShmdW5jdGlvbihiLGMpe3ZhciBkPWFbY107bnVsbCE9PWQmJnZvaWQgMCE9PWQmJihiW2NdPWQpO3JldHVybiBifSx7fSl9LEh5PWZ1bmN0aW9uKGEpe2Eud1Euc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2EuVHM9ITA7YS55eT1iLmlkO2EuZXZlbnRzLm5leHQobmV3IHB2KGIuaWQsUXYoYi5hYyksUXYoYS5uYikpKTthLnp5PWEuT2w7YS5PbD1udWxsO2IucmVzb2x2ZSghMCl9LGZ1bmN0aW9uKCl7YS5jb25zb2xlLndhcm4oIlVuaGFuZGxlZCBOYXZpZ2F0aW9uIEVycm9yOiAiKX0pfSxNeT1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9TnkoYSk7aWYoZyYmImltcGVyYXRpdmUiIT09YyYmImltcGVyYXRpdmUiPT09Zy5zb3VyY2UmJmcudmYudG9TdHJpbmcoKT09PQpiLnRvU3RyaW5nKCl8fGcmJiJoYXNoY2hhbmdlIj09YyYmInBvcHN0YXRlIj09PWcuc291cmNlJiZnLnZmLnRvU3RyaW5nKCk9PT1iLnRvU3RyaW5nKCl8fGcmJiJwb3BzdGF0ZSI9PWMmJiJoYXNoY2hhbmdlIj09PWcuc291cmNlJiZnLnZmLnRvU3RyaW5nKCk9PT1iLnRvU3RyaW5nKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMCk7aWYoZil7dmFyIGw9Zi5yZXNvbHZlO3ZhciBtPWYucmVqZWN0O2Y9Zi5mZX1lbHNlIGY9bmV3IFByb21pc2UoZnVuY3Rpb24ocCxxKXtsPXA7bT1xfSk7Zz0rK2EuWWY7T3koYSx7aWQ6Zyxzb3VyY2U6YyxvbTpkLG5iOmEubmIsbEY6YS53Zix2ZjpiLEJkOmUscmVzb2x2ZTpsLHJlamVjdDptLGZlOmYsSmc6YS5laC5DYSxmbzphLmVofSk7cmV0dXJuIGYuY2F0Y2goZnVuY3Rpb24ocCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHApfSl9LEp5PWZ1bmN0aW9uKGEsYixjLGQsZSl7Yj1RdihiKTtlPWV8fHt9O3ZhciBmPWEubG9jYXRpb247dmFyIGc9dm9pZCAwPT09Cmc/IiI6ZztmLnBhdGgoKT09Zi5ub3JtYWxpemUoYitYbyhnKSl8fGM/YS5sb2NhdGlvbi5yZXBsYWNlU3RhdGUoYiwiIixPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse1lmOmR9KSk6YS5sb2NhdGlvbi5nbyhiLCIiLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7WWY6ZH0pKX0sTHk9ZnVuY3Rpb24oYSxiLGMsZCl7YS5laD1iO2EubmI9YzthLndmPWEuRXAubWVyZ2UoYS5uYixkKTtLeShhKX0sS3k9ZnVuY3Rpb24oYSl7YS5sb2NhdGlvbi5yZXBsYWNlU3RhdGUoUXYoYS53ZiksIiIse1lmOmEueXl9KX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhJeS5wcm90b3R5cGUse3VybDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF2KHRoaXMubmIpfX19KTt2YXIgVHk9ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLlh5PWE7dGhpcy5sb2NhdGlvbj1iO3RoaXMubXQ9Yzt0aGlzLkR4PWU7dGhpcy5PcD10aGlzLlhkPW51bGw7dGhpcy55Tz1uZXcgcms7dGhpcy5qUD1uZXcgcms7Yj10aGlzLm5hbWU9ZHx8InByaW1hcnkiO2M9WncoYSxiKTtjLnJhPXRoaXM7YS5mcy5zZXQoYixjKX07VHkucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlh5LmdldENvbnRleHQodGhpcy5uYW1lKTthJiYoYS5yYT1udWxsKX07VHkucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7aWYoIXRoaXMuWGQpe3ZhciBhPXRoaXMuWHkuZ2V0Q29udGV4dCh0aGlzLm5hbWUpO2EmJmEuQmMmJihhLnF4P3RoaXMuY2IoYS5xeCxhLkJjKTokdyh0aGlzLGEuQmMsYS5tdHx8bnVsbCkpfX07ClR5LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXtpZighdGhpcy5YZCl0aHJvdyBFcnJvcigiT3V0bGV0IGlzIG5vdCBhY3RpdmF0ZWQiKTt0aGlzLmxvY2F0aW9uLmRldGFjaCgpO3ZhciBhPXRoaXMuWGQ7dGhpcy5PcD10aGlzLlhkPW51bGw7cmV0dXJuIGF9O1R5LnByb3RvdHlwZS5jYj1mdW5jdGlvbihhLGIpe3RoaXMuWGQ9YTt0aGlzLk9wPWI7dGhpcy5sb2NhdGlvbi5JcyhhLmRpKX07CnZhciBZdz1mdW5jdGlvbihhKXtpZihhLlhkKXt2YXIgYj1hLmE7YS5YZC5kZXN0cm95KCk7YS5YZD1udWxsO2EuT3A9bnVsbDthLmpQLmVtaXQoYil9fSwkdz1mdW5jdGlvbihhLGIsYyl7aWYoYS5jRyl0aHJvdyBFcnJvcigiQ2Fubm90IGFjdGl2YXRlIGFuIGFscmVhZHkgYWN0aXZhdGVkIG91dGxldCIpO2EuT3A9Yjt2YXIgZD1iLmJqLkZhLmE7Yz1jfHxhLm10O2M9V2UoYyxkKTtkPVp3KGEuWHksYS5uYW1lKS5jaGlsZHJlbjthLlhkPVhnKGEubG9jYXRpb24sYyxhLmxvY2F0aW9uLmxlbmd0aCxuZXcgVXkoYixkLGEubG9jYXRpb24uWikpO1lnKGEuRHgpO2EueU8uZW1pdChhLlhkLmluc3RhbmNlKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVHkucHJvdG90eXBlLHtjRzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLlhkfX0sYTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGQpdGhyb3cgRXJyb3IoIk91dGxldCBpcyBub3QgYWN0aXZhdGVkIik7cmV0dXJuIHRoaXMuWGQuaW5zdGFuY2V9fX0pO3ZhciBVeT1mdW5jdGlvbihhLGIsYyl7dGhpcy5CYz1hO3RoaXMuVk89Yjt0aGlzLnBhcmVudD1jfTtVeS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT14dz90aGlzLkJjOmE9PT14eT90aGlzLlZPOnRoaXMucGFyZW50LmdldChhLGIpfTt2YXIgVnk9ZnVuY3Rpb24oKXt9LFd5PWZ1bmN0aW9uKCl7fTtXeS5wcm90b3R5cGUucHJlbG9hZD1mdW5jdGlvbihhLGIpe3JldHVybiBiKCkuYihOayhmdW5jdGlvbigpe3JldHVybiBmaShudWxsKX0pKX07dmFyIFh5PWZ1bmN0aW9uKCl7fTtYeS5wcm90b3R5cGUucHJlbG9hZD1mdW5jdGlvbigpe3JldHVybiBmaShudWxsKX07dmFyIFl5PWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5kaD1hO3RoaXMuWj1kO3RoaXMuVVE9ZTt0aGlzLlJqPW5ldyB2eShiLGMsZnVuY3Rpb24oZil7cmV0dXJuIEZ5KGEsbmV3IHh2KGYpKX0sZnVuY3Rpb24oZil7cmV0dXJuIEZ5KGEsbmV3IHl2KGYpKX0pfSxaeT1mdW5jdGlvbihhKXthLnRSPWEuZGguZXZlbnRzLmIoYWsoZnVuY3Rpb24oYil7cmV0dXJuIGIgaW5zdGFuY2VvZiBwdn0pLE5pKGZ1bmN0aW9uKCl7cmV0dXJuIGEucHJlbG9hZCgpfSwxKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7fSl9OwpZeS5wcm90b3R5cGUucHJlbG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXQocGQpO3JldHVybiAkeSh0aGlzLGEsdGhpcy5kaC56ZCl9O1l5LnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy50Ui51bnN1YnNjcmliZSgpfTsKdmFyICR5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXTtjPW4oYyk7Zm9yKHZhciBlPWMubmV4dCgpOyFlLmRvbmU7ZT1jLm5leHQoKSllPWUudmFsdWUsZS5XZiYmIWUuV3ImJmUuWmU/KGU9ZS5aZSxkLnB1c2goJHkoYSxlLm1vZHVsZSxlLnF0KSkpOmUuV2YmJiFlLldyP2QucHVzaChheihhLGIsZSkpOmUuY2hpbGRyZW4mJmQucHVzaCgkeShhLGIsZS5jaGlsZHJlbikpO3JldHVybiBNaShkKS5iKFFpKCksdWkoZnVuY3Rpb24oKXt9KSl9LGF6PWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5VUS5wcmVsb2FkKGMsZnVuY3Rpb24oKXtyZXR1cm4gYS5Sai5sb2FkKGIuWixjKS5iKE5pKGZ1bmN0aW9uKGQpe2MuWmU9ZDtyZXR1cm4gJHkoYSxkLm1vZHVsZSxkLnF0KX0pKX0pfTt2YXIgYno9ZnVuY3Rpb24oYSxiLGMpe2M9dm9pZCAwPT09Yz97fTpjO3RoaXMuZGg9YTt0aGlzLkFtPWI7dGhpcy5vcHRpb25zPWM7dGhpcy5uRz0wO3RoaXMub0c9ImltcGVyYXRpdmUiO3RoaXMud0g9MDt0aGlzLnN0b3JlPXt9O2Mua3A9Yy5rcHx8ImRpc2FibGVkIjtjLktFPWMuS0V8fCJkaXNhYmxlZCJ9O2J6LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7aWYoImRpc2FibGVkIiE9PXRoaXMub3B0aW9ucy5rcCl7dmFyIGE9dGhpcy5BbTtocChhKSYmKGE9YS53aW5kb3cuaGlzdG9yeSkmJmEuc2Nyb2xsUmVzdG9yYXRpb24mJihhLnNjcm9sbFJlc3RvcmF0aW9uPSJtYW51YWwiKX10aGlzLkJIPWN6KHRoaXMpO3RoaXMuRkg9ZHoodGhpcyl9Owp2YXIgY3o9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGguZXZlbnRzLnN1YnNjcmliZShmdW5jdGlvbihiKXtpZihiIGluc3RhbmNlb2Ygb3Ype3ZhciBjPWEuQW07YS5zdG9yZVthLm5HXT1ocChjKT9bYy53aW5kb3cuc2Nyb2xsWCxjLndpbmRvdy5zY3JvbGxZXTpbMCwwXTthLm9HPWIudlE7YS53SD1iLm9tP2Iub20uWWY6MH1lbHNlIGIgaW5zdGFuY2VvZiBwdiYmKGEubkc9Yi5pZCxiPVJ5KGEuZGgsYi5OYSkubmMsRnkoYS5kaCxuZXcgRHYoInBvcHN0YXRlIj09PWEub0c/YS5zdG9yZVthLndIXTpudWxsLGIpKSl9KX0sZHo9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGguZXZlbnRzLnN1YnNjcmliZShmdW5jdGlvbihiKXtpZihiIGluc3RhbmNlb2YgRHYpaWYoYi5wb3NpdGlvbikidG9wIj09PWEub3B0aW9ucy5rcD9pcChhLkFtLFswLDBdKToiZW5hYmxlZCI9PT1hLm9wdGlvbnMua3AmJmlwKGEuQW0sYi5wb3NpdGlvbik7ZWxzZSBpZihiLmFuY2hvciYmImVuYWJsZWQiPT09YS5vcHRpb25zLktFKXt2YXIgYz0KYS5BbTtiPWIuYW5jaG9yO2lmKGhwKGMpKXtiPWMud2luZG93LkNTUyYmYy53aW5kb3cuQ1NTLmVzY2FwZT9jLndpbmRvdy5DU1MuZXNjYXBlKGIpOmIucmVwbGFjZSgvKCJ8JyB8OnxcLnxcW3xcXXwsfD0pL2csIlxcJDEiKTt0cnl7dmFyIGQ9Yy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjIitiKTtpZihkKWpwKGMsZCk7ZWxzZXt2YXIgZT1jLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIltuYW1lPSciK2IrIiddIik7ZSYmanAoYyxlKX19Y2F0Y2goZil7Yy5aaC5oYW5kbGVFcnJvcihmKX19fWVsc2UiZGlzYWJsZWQiIT09YS5vcHRpb25zLmtwJiZpcChhLkFtLFswLDBdKX0pfTtiei5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuQkgmJnRoaXMuQkgudW5zdWJzY3JpYmUoKTt0aGlzLkZIJiZ0aGlzLkZILnVuc3Vic2NyaWJlKCl9O3ZhciBlej1uZXcgeSgiUk9VVEVSX0NPTkZJR1VSQVRJT04iKSxmej1uZXcgeSgiUk9VVEVSX0ZPUlJPT1RfR1VBUkQiKTtuZXcgZGQ7bmV3IGRkO3ZhciBnej1mdW5jdGlvbigpe307ZnVuY3Rpb24gaHooYSxiLGMpe2MuZFImJmdwKGIsYy5kUik7cmV0dXJuIG5ldyBieihhLGIsYyl9ZnVuY3Rpb24gaXooYSxiLGMpe2M9dm9pZCAwPT09Yz97fTpjO3JldHVybiBjLlhTP25ldyBicChhLGIpOm5ldyAkbyhhLGIpfWZ1bmN0aW9uIGp6KGEpe2lmKGEpdGhyb3cgRXJyb3IoIlJvdXRlck1vZHVsZS5mb3JSb290KCkgY2FsbGVkIHR3aWNlLiBMYXp5IGxvYWRlZCBtb2R1bGVzIHNob3VsZCB1c2UgUm91dGVyTW9kdWxlLmZvckNoaWxkKCkgaW5zdGVhZC4iKTtyZXR1cm4iZ3VhcmRlZCJ9CmZ1bmN0aW9uIGt6KGEsYixjLGQsZSxmLGcsbCxtLHApe2w9dm9pZCAwPT09bD97fTpsO2E9bmV3IEl5KG51bGwsYSxiLGMsZCxlLGYsQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxnKSk7bSYmKGEuRXA9bSk7cCYmKGEucHQ9cCk7bC5aaCYmKGEuWmg9bC5aaCk7bC5PcyYmKGEuT3M9bC5Pcyk7aWYobC5yUyl7dmFyIHE9TW87YS5ldmVudHMuc3Vic2NyaWJlKGZ1bmN0aW9uKHIpe3dpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5ncm91cCYmd2luZG93LmNvbnNvbGUuZ3JvdXAoIlJvdXRlciBFdmVudDogIityLmNvbnN0cnVjdG9yLm5hbWUpO3EubG9nKHIudG9TdHJpbmcoKSk7cS5sb2cocik7d2luZG93LmNvbnNvbGUmJndpbmRvdy5jb25zb2xlLmdyb3VwRW5kJiZ3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpfSl9bC5YcyYmKGEuWHM9bC5Ycyk7bC5hayYmKGEuYWs9bC5hayk7bC55bSYmKGEueW09bC55bSk7bC5tayYmKGEubWs9bC5tayk7cmV0dXJuIGF9CmZ1bmN0aW9uIGx6KGEpe3JldHVybiBhLmVoLnJvb3R9dmFyIG16PWZ1bmN0aW9uKGEpe3RoaXMuWj1hO3RoaXMuV0Y9ITE7dGhpcy5uej1uZXcgWWh9Owptei5wcm90b3R5cGUuRU89ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLlouZ2V0KFJvLFByb21pc2UucmVzb2x2ZShudWxsKSkudGhlbihmdW5jdGlvbigpe3ZhciBiPW51bGwsYz1uZXcgUHJvbWlzZShmdW5jdGlvbihmKXtyZXR1cm4gYj1mfSksZD1hLlouZ2V0KEl5KSxlPWEuWi5nZXQoZXopO2lmKCJsZWdhY3lfZGlzYWJsZWQiPT09ZS5HZXx8ITE9PT1lLkdlfHxueihlKSliKCEwKTtlbHNlIGlmKCJkaXNhYmxlZCI9PT1lLkdlKVB5KGQpLGIoITApO2Vsc2UgaWYoImVuYWJsZWQiPT09ZS5HZSlkLnB5LkZFPWZ1bmN0aW9uKCl7aWYoYS5XRilyZXR1cm4gZmkobnVsbCk7YS5XRj0hMDtiKCEwKTtyZXR1cm4gYS5uen0sZC5HZSgpO2Vsc2UgdGhyb3cgRXJyb3IoIkludmFsaWQgaW5pdGlhbE5hdmlnYXRpb24gb3B0aW9uczogJyIrZS5HZSsiJyIpO3JldHVybiBjfSl9Owptei5wcm90b3R5cGUuUk89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5aLmdldChleiksYz10aGlzLlouZ2V0KFl5KSxkPXRoaXMuWi5nZXQoYnopLGU9dGhpcy5aLmdldChJeSksZj10aGlzLlouZ2V0KGZtKTthPT09Zi5KeFswXSYmKG56KGIpP2UuR2UoKTooImxlZ2FjeV9kaXNhYmxlZCI9PT1iLkdlfHwhMT09PWIuR2UpJiZQeShlKSxaeShjKSxkLmluaXQoKSxlLm5rPWYuZUZbMF0sZS5laC5yb290LmE9ZS5uayx0aGlzLm56Lm5leHQobnVsbCksdGhpcy5uei5jb21wbGV0ZSgpKX07dmFyIG56PWZ1bmN0aW9uKGEpe3JldHVybiJsZWdhY3lfZW5hYmxlZCI9PT1hLkdlfHwhMD09PWEuR2V8fHZvaWQgMD09PWEuR2V9O2Z1bmN0aW9uIG96KGEpe3JldHVybiBhLlJPLmJpbmQoYSl9dmFyIHB6PW5ldyB5KCJSb3V0ZXIgSW5pdGlhbGl6ZXIiKTtuZXcgamY7dmFyIHF6PWNnKHtUOjIsZzpbXSxkYXRhOnt9fSk7ZnVuY3Rpb24gcnooYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwxNjc3NzIxNixudWxsLG51bGwsMSwicm91dGVyLW91dGxldCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgxLDIxMjk5MixudWxsLDAsVHksW3h5LEVmLFVlLFs4LG51bGxdLG5lXSxudWxsLG51bGwpXSxmdW5jdGlvbihiLGMpe2IoYywxLDApfSxudWxsKX12YXIgc3o9UWcoIm5nLWNvbXBvbmVudCIsRXYsZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJuZy1jb21wb25lbnQiLFtdLG51bGwsbnVsbCxudWxsLHJ6LHF6KSksSSgxLDQ5MTUyLG51bGwsMCxFdixbXSxudWxsLG51bGwpXSxudWxsLG51bGwpfSk7ZnVuY3Rpb24gdHooYSl7cmV0dXJuIG51bGwhPWEmJiJmYWxzZSIhPT0iIithfTtmdW5jdGlvbiB1eihhKXtyZXR1cm4gbnVsbD09YT8iIjoic3RyaW5nIj09PXR5cGVvZiBhP2E6YSsicHgifTtmdW5jdGlvbiB2eihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIHo/YS5pOmF9O2Z1bmN0aW9uIHd6KGEsYil7cmV0dXJuIGlzTmFOKHBhcnNlRmxvYXQoYSkpfHxpc05hTihOdW1iZXIoYSkpP3ZvaWQgMD09PWI/MDpiOk51bWJlcihhKX07dmFyIHh6PWZ1bmN0aW9uKCl7fTt4ei5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI/bnVsbDpuZXcgTXV0YXRpb25PYnNlcnZlcihhKX07eHouaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHh6fSxMOnh6LFk6InJvb3QifSk7dmFyIHl6PWZ1bmN0aW9uKGEpe3RoaXMuJEw9YTt0aGlzLmJmPW5ldyBNYXB9O2g9eXoucHJvdG90eXBlO2guWD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5iZi5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuR0EoYyl9KX07aC5vYnNlcnZlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz12eihhKTtyZXR1cm4gbmV3IFRoKGZ1bmN0aW9uKGQpe3ZhciBlPWIuaE0oYykuc3Vic2NyaWJlKGQpO3JldHVybiBmdW5jdGlvbigpe2UudW5zdWJzY3JpYmUoKTtiLlpOKGMpfX0pfTsKaC5oTT1mdW5jdGlvbihhKXtpZih0aGlzLmJmLmhhcyhhKSl0aGlzLmJmLmdldChhKS5jb3VudCsrO2Vsc2V7dmFyIGI9bmV3IFloLGM9dGhpcy4kTC5jcmVhdGUoZnVuY3Rpb24oZCl7cmV0dXJuIGIubmV4dChkKX0pO2MmJmMub2JzZXJ2ZShhLHtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5iZi5zZXQoYSx7RVE6YyxzdHJlYW06Yixjb3VudDoxfSl9cmV0dXJuIHRoaXMuYmYuZ2V0KGEpLnN0cmVhbX07aC5aTj1mdW5jdGlvbihhKXt0aGlzLmJmLmhhcyhhKSYmKHRoaXMuYmYuZ2V0KGEpLmNvdW50LS0sdGhpcy5iZi5nZXQoYSkuY291bnR8fHRoaXMuR0EoYSkpfTtoLkdBPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYmYuaGFzKGEpKXt2YXIgYj10aGlzLmJmLmdldChhKSxjPWIuRVE7Yj1iLnN0cmVhbTtjJiZjLmRpc2Nvbm5lY3QoKTtiLmNvbXBsZXRlKCk7dGhpcy5iZi5kZWxldGUoYSl9fTsKeXouaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHl6KG1kKHh6KSl9LEw6eXosWToicm9vdCJ9KTt2YXIgeno9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuWko9YTt0aGlzLm09Yjt0aGlzLlM9Yzt0aGlzLmV2ZW50PW5ldyByazt0aGlzLk9hPSExO3RoaXMub3E9bnVsbH07enoucHJvdG90eXBlLnFmPWZ1bmN0aW9uKCl7dGhpcy5vcXx8dGhpcy5kaXNhYmxlZHx8dGhpcy5GYygpfTt6ei5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMudWUoKX07enoucHJvdG90eXBlLkZjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnVlKCk7dmFyIGI9dGhpcy5aSi5vYnNlcnZlKHRoaXMubSk7dGhpcy5TLm9hKGZ1bmN0aW9uKCl7YS5vcT0oYS5vRj9iLmIoUWsoYS5vRikpOmIpLnN1YnNjcmliZShhLmV2ZW50KX0pfTt6ei5wcm90b3R5cGUudWU9ZnVuY3Rpb24oKXt0aGlzLm9xJiZ0aGlzLm9xLnVuc3Vic2NyaWJlKCl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHp6LnByb3RvdHlwZSx7ZGlzYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hfSxzZXQ6ZnVuY3Rpb24oYSl7KHRoaXMuT2E9dHooYSkpP3RoaXMudWUoKTp0aGlzLkZjKCl9fSxvRjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubkt9LHNldDpmdW5jdGlvbihhKXt0aGlzLm5LPXd6KGEpO3RoaXMuRmMoKX19fSk7dmFyIEF6PWZ1bmN0aW9uKCl7fTt2YXIgQnosQ3o9ImNvbG9yIGJ1dHRvbiBjaGVja2JveCBkYXRlIGRhdGV0aW1lLWxvY2FsIGVtYWlsIGZpbGUgaGlkZGVuIGltYWdlIG1vbnRoIG51bWJlciBwYXNzd29yZCByYWRpbyByYW5nZSByZXNldCBzZWFyY2ggc3VibWl0IHRlbCB0ZXh0IHRpbWUgdXJsIHdlZWsiLnNwbGl0KCIgIik7ZnVuY3Rpb24gRHooKXtpZihCeilyZXR1cm4gQno7aWYoIm9iamVjdCIhPT10eXBlb2YgZG9jdW1lbnR8fCFkb2N1bWVudClyZXR1cm4gQno9bmV3IFNldChDeik7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyZXR1cm4gQno9bmV3IFNldChDei5maWx0ZXIoZnVuY3Rpb24oYil7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpO3JldHVybiBhLnR5cGU9PT1ifSkpfTt2YXIgRXo7ZnVuY3Rpb24gRnooKXtpZihudWxsPT1FeiYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93KXRyeXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRXo9ITB9fSkpfWZpbmFsbHl7RXo9RXp8fCExfXJldHVybiBFen1mdW5jdGlvbiBHeihhKXtyZXR1cm4gRnooKT9hOiEhYS5jYXB0dXJlfTt2YXIgSHo7ZnVuY3Rpb24gSXooKXtpZigib2JqZWN0IiE9PXR5cGVvZiBkb2N1bWVudHx8IWRvY3VtZW50KXJldHVybiAwO2lmKG51bGw9PUh6KXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiPWEuc3R5bGU7YS5kaXI9InJ0bCI7Yi5oZWlnaHQ9IjFweCI7Yi53aWR0aD0iMXB4IjtiLm92ZXJmbG93PSJhdXRvIjtiLnZpc2liaWxpdHk9ImhpZGRlbiI7Yi5wb2ludGVyRXZlbnRzPSJub25lIjtiLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt2YXIgYz1iLnN0eWxlO2Mud2lkdGg9IjJweCI7Yy5oZWlnaHQ9IjFweCI7YS5hcHBlbmRDaGlsZChiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO0h6PTA7MD09PWEuc2Nyb2xsTGVmdCYmKGEuc2Nyb2xsTGVmdD0xLEh6PTA9PT1hLnNjcm9sbExlZnQ/MToyKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9cmV0dXJuIEh6fTt2YXIgSno7ZnVuY3Rpb24gS3ooYSl7aWYobnVsbD09Snope3ZhciBiPSJ1bmRlZmluZWQiIT09dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmhlYWQ6bnVsbDtKej0hKCFifHwhYi5jcmVhdGVTaGFkb3dSb290JiYhYi5hdHRhY2hTaGFkb3cpfXJldHVybiBKeiYmKGE9YS5nZXRSb290Tm9kZT9hLmdldFJvb3ROb2RlKCk6bnVsbCwidW5kZWZpbmVkIiE9PXR5cGVvZiBTaGFkb3dSb290JiZTaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdCk/YTpudWxsfTt2YXIgTHo9ZnVuY3Rpb24oKXt9O3ZhciBNejt0cnl7TXo9InVuZGVmaW5lZCIhPT10eXBlb2YgSW50bCYmSW50bC52OEJyZWFrSXRlcmF0b3J9Y2F0Y2goYSl7TXo9ITF9CnZhciBOej1mdW5jdGlvbihhKXt0aGlzLlV0PSh0aGlzLnlhPSh0aGlzLiRDPWEpPyJicm93c2VyIj09PXRoaXMuJEM6Im9iamVjdCI9PT10eXBlb2YgZG9jdW1lbnQmJiEhZG9jdW1lbnQpJiYvKGVkZ2UpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTt0aGlzLkVtPXRoaXMueWEmJi8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7dGhpcy5Kaz10aGlzLnlhJiYhKCF3aW5kb3cuY2hyb21lJiYhTXopJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBDU1MmJiF0aGlzLlV0JiYhdGhpcy5FbTt0aGlzLkZtPXRoaXMueWEmJi9BcHBsZVdlYktpdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF0aGlzLkprJiYhdGhpcy5VdCYmIXRoaXMuRW07dGhpcy5WdD10aGlzLnlhJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmISgiTVNTdHJlYW0iaW4gd2luZG93KTt0aGlzLktJPXRoaXMueWEmJi8oZmlyZWZveHxtaW5lZmllbGQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKdGhpcy5KST10aGlzLnlhJiYvYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF0aGlzLkVtfTtOei5oYT1UYyh7VjpmdW5jdGlvbigpe3JldHVybiBuZXcgTnoobWQoTmUpKX0sTDpOeixZOiJyb290In0pO3ZhciBPej1uZXcgeSgiY2RrLWZvY3VzLW1vbml0b3ItZGVmYXVsdC1vcHRpb25zIiksUHo9R3ooe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLFJ6PWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXM7dGhpcy5TPWE7dGhpcy5lYT1iO3RoaXMuS2Y9bnVsbDt0aGlzLmh4PSExO3RoaXMuV2k9bmV3IE1hcDt0aGlzLkdDPTA7dGhpcy54bD1uZXcgTWFwO3RoaXMuJEE9ZnVuY3Rpb24oKXtlLmpsPW51bGw7ZS5Bdygia2V5Ym9hcmQiKX07dGhpcy5hQj1mdW5jdGlvbihmKXtlLmpsfHxlLkF3KDA9PT1mLmJ1dHRvbnM/ImtleWJvYXJkIjoibW91c2UiKX07dGhpcy5iQj1mdW5jdGlvbihmKXtudWxsIT1lLlh3JiZjbGVhclRpbWVvdXQoZS5Ydyk7ZS5qbD1ReihmKTtlLlh3PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5qbD1udWxsfSw2NTApfTt0aGlzLkFFPWZ1bmN0aW9uKCl7ZS5oeD0hMDtlLndPPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gZS5oeD0hMX0pfTt0aGlzLnJyPQpmdW5jdGlvbihmKXtmb3IodmFyIGc9UXooZiksbD0iZm9jdXMiPT09Zi50eXBlP2Uuc2Q6ZS5xZDtnO2c9Zy5wYXJlbnRFbGVtZW50KWwuY2FsbChlLGYsZyl9O3RoaXMudT1jO3RoaXMudks9KG51bGw9PT1kfHx2b2lkIDA9PT1kP3ZvaWQgMDpkLnBTKXx8MH07UnoucHJvdG90eXBlLlVnPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPyExOmI7aWYoIXRoaXMuZWEueWEpcmV0dXJuIGZpKG51bGwpO2E9dnooYSk7dmFyIGM9S3ooYSl8fHRoaXMuTmQoKSxkPXRoaXMuV2kuZ2V0KGEpO2lmKGQpcmV0dXJuIGImJihkLkd4PSEwKSwkaChkLnpmKTtiPXtHeDpiLHpmOm5ldyBZaCxwazpjfTt0aGlzLldpLnNldChhLGIpO3RoaXMuTU0oYik7cmV0dXJuICRoKGIuemYpfTtSei5wcm90b3R5cGUueWY9ZnVuY3Rpb24oYSl7YT12eihhKTt2YXIgYj10aGlzLldpLmdldChhKTtiJiYoYi56Zi5jb21wbGV0ZSgpLHRoaXMuencoYSksdGhpcy5XaS5kZWxldGUoYSksdGhpcy5STShiKSl9Owp2YXIgU3o9ZnVuY3Rpb24oYSxiLGMsZCl7Yj12eihiKTthLkF3KGMpOyJmdW5jdGlvbiI9PT10eXBlb2YgYi5mb2N1cyYmYi5mb2N1cyhkKX07aD1Sei5wcm90b3R5cGU7aC5YPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLldpLmZvckVhY2goZnVuY3Rpb24oYixjKXtyZXR1cm4gYS55ZihjKX0pfTtoLk5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXx8ZG9jdW1lbnR9O2guUGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5OZCgpLmRlZmF1bHRWaWV3fHx3aW5kb3d9O2guWmM9ZnVuY3Rpb24oYSxiLGMpe2M/YS5jbGFzc0xpc3QuYWRkKGIpOmEuY2xhc3NMaXN0LnJlbW92ZShiKX07aC5XSz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LZj90aGlzLktmOnRoaXMuaHgmJnRoaXMudkM/dGhpcy52Qzp0aGlzLnJPKGEpPyJ0b3VjaCI6InByb2dyYW0ifTsKaC56dz1mdW5jdGlvbihhLGIpe3RoaXMuWmMoYSwiY2RrLWZvY3VzZWQiLCEhYik7dGhpcy5aYyhhLCJjZGstdG91Y2gtZm9jdXNlZCIsInRvdWNoIj09PWIpO3RoaXMuWmMoYSwiY2RrLWtleWJvYXJkLWZvY3VzZWQiLCJrZXlib2FyZCI9PT1iKTt0aGlzLlpjKGEsImNkay1tb3VzZS1mb2N1c2VkIiwibW91c2UiPT09Yik7dGhpcy5aYyhhLCJjZGstcHJvZ3JhbS1mb2N1c2VkIiwicHJvZ3JhbSI9PT1iKX07aC5Bdz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuUy5vYShmdW5jdGlvbigpe2IuS2Y9YTswPT09Yi52SyYmKGIudE09c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBiLktmPW51bGx9LDEpKX0pfTtoLnJPPWZ1bmN0aW9uKGEpe2E9UXooYSk7cmV0dXJuIHRoaXMuamwgaW5zdGFuY2VvZiBOb2RlJiZhIGluc3RhbmNlb2YgTm9kZSYmKGE9PT10aGlzLmpsfHxhLmNvbnRhaW5zKHRoaXMuamwpKX07Cmguc2Q9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLldpLmdldChiKTtjJiYoYy5HeHx8Yj09PVF6KGEpKSYmKGE9dGhpcy5XSyhhKSx0aGlzLnp3KGIsYSksdGhpcy5lQihjLnpmLGEpLHRoaXMudkM9YSl9O2gucWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLldpLmdldChiKTshY3x8Yy5HeCYmYS5yZWxhdGVkVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSYmYi5jb250YWlucyhhLnJlbGF0ZWRUYXJnZXQpfHwodGhpcy56dyhiKSx0aGlzLmVCKGMuemYsbnVsbCkpfTtoLmVCPWZ1bmN0aW9uKGEsYil7dGhpcy5TLmdhKGZ1bmN0aW9uKCl7cmV0dXJuIGEubmV4dChiKX0pfTsKaC5NTT1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKHRoaXMuZWEueWEpe3ZhciBjPWEucGs7KGE9dGhpcy54bC5nZXQoYyl8fDApfHx0aGlzLlMub2EoZnVuY3Rpb24oKXtjLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIixiLnJyLFB6KTtjLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLGIucnIsUHopfSk7dGhpcy54bC5zZXQoYyxhKzEpOzE9PT0rK3RoaXMuR0MmJnRoaXMuUy5vYShmdW5jdGlvbigpe3ZhciBkPWIuTmQoKSxlPWIuUGQoKTtkLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGIuJEEsUHopO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixiLmFCLFB6KTtkLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGIuYkIsUHopO2UuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLGIuQUUpfSl9fTsKaC5STT1mdW5jdGlvbihhKXthPWEucGs7aWYodGhpcy54bC5oYXMoYSkpe3ZhciBiPXRoaXMueGwuZ2V0KGEpOzE8Yj90aGlzLnhsLnNldChhLGItMSk6KGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMucnIsUHopLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5ycixQeiksdGhpcy54bC5kZWxldGUoYSkpfS0tdGhpcy5HQ3x8KGE9dGhpcy5OZCgpLGI9dGhpcy5QZCgpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy4kQSxQeiksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYUIsUHopLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5iQixQeiksYi5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5BRSksY2xlYXJUaW1lb3V0KHRoaXMud08pLGNsZWFyVGltZW91dCh0aGlzLlh3KSxjbGVhclRpbWVvdXQodGhpcy50TSkpfTsKUnouaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ6KG1kKFQpLG1kKE56KSxtZChMbyw4KSxtZChPeiw4KSl9LEw6UnosWToicm9vdCJ9KTtmdW5jdGlvbiBReihhKXtyZXR1cm4gYS5jb21wb3NlZFBhdGg/YS5jb21wb3NlZFBhdGgoKVswXTphLnRhcmdldH07dmFyIFR6PWZ1bmN0aW9uKGEpe3RoaXMuZWE9YX07VHoucHJvdG90eXBlLmhRPWZ1bmN0aW9uKGEpe3JldHVybiBhLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKX07VHoucHJvdG90eXBlLmlzVmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hIShhLm9mZnNldFdpZHRofHxhLm9mZnNldEhlaWdodHx8ImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldENsaWVudFJlY3RzJiZhLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSYmInZpc2libGUiPT09Z2V0Q29tcHV0ZWRTdHlsZShhKS52aXNpYmlsaXR5fTsKdmFyIFZ6PWZ1bmN0aW9uKGEsYil7aWYoIWEuZWEueWEpcmV0dXJuITE7dHJ5e3ZhciBjPShiLm93bmVyRG9jdW1lbnQmJmIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5mcmFtZUVsZW1lbnR9Y2F0Y2goZSl7Yz1udWxsfWlmKGMpe3ZhciBkPWMmJmMubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMT09PVV6KGMpfHwoYS5lYS5Ka3x8YS5lYS5GbSkmJiJvYmplY3QiPT09ZHx8KGEuZWEuSmt8fGEuZWEuRm0pJiYhYS5pc1Zpc2libGUoYykpcmV0dXJuITF9Yz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ZD1VeihiKTtpZihiLmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikpcmV0dXJuLTEhPT1kO2lmKCJpZnJhbWUiPT09YylyZXR1cm4hMTtpZigiYXVkaW8iPT09Yyl7aWYoIWIuaGFzQXR0cmlidXRlKCJjb250cm9scyIpKXJldHVybiExO2lmKGEuZWEuSmspcmV0dXJuITB9aWYoInZpZGVvIj09PWMpe2lmKCFiLmhhc0F0dHJpYnV0ZSgiY29udHJvbHMiKSYmCmEuZWEuRW0pcmV0dXJuITE7aWYoYS5lYS5Ka3x8YS5lYS5LSSlyZXR1cm4hMH1pZighKGM9Im9iamVjdCI9PT1jJiYoYS5lYS5Ka3x8YS5lYS5GbSkpKXtpZihhPWEuZWEuRm0mJmEuZWEuVnQpYT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYz0iaW5wdXQiPT09YSYmYi50eXBlLGE9ISgidGV4dCI9PT1jfHwicGFzc3dvcmQiPT09Y3x8InNlbGVjdCI9PT1hfHwidGV4dGFyZWEiPT09YSk7Yz1hfXJldHVybiBjPyExOjA8PWIudGFiSW5kZXh9LFh6PWZ1bmN0aW9uKGEsYil7aWYoImlucHV0Ij09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYiaGlkZGVuIj09Yi50eXBlKXZhciBjPSExO2Vsc2UgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYz0iaW5wdXQiPT09Y3x8InNlbGVjdCI9PT1jfHwiYnV0dG9uIj09PWN8fCJ0ZXh0YXJlYSI9PT1jfHwiYSI9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmYi5oYXNBdHRyaWJ1dGUoImhyZWYiKXx8Yi5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpfHwKV3ooYik7cmV0dXJuIGMmJiFhLmhRKGIpJiZhLmlzVmlzaWJsZShiKX07VHouaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFR6KG1kKE56KSl9LEw6VHosWToicm9vdCJ9KTtmdW5jdGlvbiBXeihhKXtpZighYS5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHZvaWQgMD09PWEudGFiSW5kZXgpcmV0dXJuITE7YT1hLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtyZXR1cm4iLTMyNzY4Ij09YT8hMTohKCFhfHxpc05hTihwYXJzZUludChhLDEwKSkpfWZ1bmN0aW9uIFV6KGEpe2lmKCFXeihhKSlyZXR1cm4gbnVsbDthPXBhcnNlSW50KGEuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwiIiwxMCk7cmV0dXJuIGlzTmFOKGEpPy0xOmF9O3ZhciAkej1mdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPXRoaXM7dGhpcy5rYT1hO3RoaXMuVGk9Yjt0aGlzLlM9Yzt0aGlzLnU9ZDt0aGlzLiR1PSExO3RoaXMuVUg9ZnVuY3Rpb24oKXt2YXIgZz1mLkpCKCJlbmQiKTtnJiZnLmZvY3VzKCk7cmV0dXJuISFnfTt0aGlzLnZGPWZ1bmN0aW9uKCl7cmV0dXJuIFl6KGYpfTt0aGlzLkp1PSEwOyh2b2lkIDA9PT1lPzA6ZSl8fFp6KHRoaXMpfTskei5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhPXRoaXMudGosYj10aGlzLllpO2EmJihhLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLlVIKSxhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKSk7YiYmKGIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMudkYpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTt0aGlzLnRqPXRoaXMuWWk9bnVsbH07CnZhciBaej1mdW5jdGlvbihhKXthLiR1fHwoYS5TLm9hKGZ1bmN0aW9uKCl7YS50anx8KGEudGo9YS5OQSgpLGEudGouYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLGEuVUgpKTthLllpfHwoYS5ZaT1hLk5BKCksYS5ZaS5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsYS52RikpfSksYS5rYS5wYXJlbnROb2RlJiYoYS5rYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLnRqLGEua2EpLGEua2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYS5ZaSxhLmthLm5leHRTaWJsaW5nKSxhLiR1PSEwKSl9LGJBPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLkZLKGZ1bmN0aW9uKCl7cmV0dXJuIGIoYUEoYSkpfSl9KX07CiR6LnByb3RvdHlwZS5KQj1mdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5rYS5xdWVyeVNlbGVjdG9yQWxsKCJbY2RrLWZvY3VzLXJlZ2lvbi0iK2ErIl0sIFtjZGtGb2N1c1JlZ2lvbiIrKGErIl0sIFtjZGstZm9jdXMtIikrKGErIl0iKSksYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaGFzQXR0cmlidXRlKCJjZGstZm9jdXMtIithKT9jb25zb2xlLndhcm4oIkZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLSIrYSsiJywgdXNlICdjZGtGb2N1c1JlZ2lvbiIrKGErIicgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiA4LjAuMC4iKSxiW2NdKTpiW2NdLmhhc0F0dHJpYnV0ZSgiY2RrLWZvY3VzLXJlZ2lvbi0iK2EpJiZjb25zb2xlLndhcm4oIkZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLXJlZ2lvbi0iK2ErIicsIHVzZSAnY2RrRm9jdXNSZWdpb24iKyhhKyInIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgaW4gOC4wLjAuIiksCmJbY10pO3JldHVybiJzdGFydCI9PWE/Yi5sZW5ndGg/YlswXTp0aGlzLkRCKHRoaXMua2EpOmIubGVuZ3RoP2JbYi5sZW5ndGgtMV06dGhpcy5GQih0aGlzLmthKX07CnZhciBhQT1mdW5jdGlvbihhKXt2YXIgYj1hLmthLnF1ZXJ5U2VsZWN0b3IoIltjZGstZm9jdXMtaW5pdGlhbF0sIFtjZGtGb2N1c0luaXRpYWxdIik7cmV0dXJuIGI/KGIuaGFzQXR0cmlidXRlKCJjZGstZm9jdXMtaW5pdGlhbCIpJiZjb25zb2xlLndhcm4oIkZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLWluaXRpYWwnLCB1c2UgJ2Nka0ZvY3VzSW5pdGlhbCcgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiA4LjAuMCIsYiksR2QoKSYmIVh6KGEuVGksYikmJmNvbnNvbGUud2FybigiRWxlbWVudCBtYXRjaGluZyAnW2Nka0ZvY3VzSW5pdGlhbF0nIGlzIG5vdCBmb2N1c2FibGUuIixiKSxiLmZvY3VzKCksITApOll6KGEpfSxZej1mdW5jdGlvbihhKXsoYT1hLkpCKCJzdGFydCIpKSYmYS5mb2N1cygpO3JldHVybiEhYX07aD0kei5wcm90b3R5cGU7aC5vYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1fTsKaC5EQj1mdW5jdGlvbihhKXtpZihYeih0aGlzLlRpLGEpJiZWeih0aGlzLlRpLGEpKXJldHVybiBhO2E9YS5jaGlsZHJlbnx8YS5jaGlsZE5vZGVzO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdLm5vZGVUeXBlPT09dGhpcy51LkVMRU1FTlRfTk9ERT90aGlzLkRCKGFbYl0pOm51bGw7aWYoYylyZXR1cm4gY31yZXR1cm4gbnVsbH07aC5GQj1mdW5jdGlvbihhKXtpZihYeih0aGlzLlRpLGEpJiZWeih0aGlzLlRpLGEpKXJldHVybiBhO2E9YS5jaGlsZHJlbnx8YS5jaGlsZE5vZGVzO2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLm5vZGVUeXBlPT09dGhpcy51LkVMRU1FTlRfTk9ERT90aGlzLkZCKGFbYl0pOm51bGw7aWYoYylyZXR1cm4gY31yZXR1cm4gbnVsbH07CmguTkE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5Vdyh0aGlzLkp1LGEpO2EuY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpO2EuY2xhc3NMaXN0LmFkZCgiY2RrLWZvY3VzLXRyYXAtYW5jaG9yIik7YS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3JldHVybiBhfTtoLlV3PWZ1bmN0aW9uKGEsYil7YT9iLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIik6Yi5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4Iil9O2guRks9ZnVuY3Rpb24oYSl7dGhpcy5TLmlzU3RhYmxlP2EoKTokaCh0aGlzLlMucmYpLmIoZ2woKSkuc3Vic2NyaWJlKGEpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcygkei5wcm90b3R5cGUse2VuYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkp1fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5KdT1hO3RoaXMudGomJnRoaXMuWWkmJih0aGlzLlV3KGEsdGhpcy50aiksdGhpcy5VdyhhLHRoaXMuWWkpKX19fSk7dmFyIGNBPWZ1bmN0aW9uKGEsYixjKXt0aGlzLlRpPWE7dGhpcy5TPWI7dGhpcy51PWN9O2NBLnByb3RvdHlwZS5jcmVhdGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3ICR6KGEsdGhpcy5UaSx0aGlzLlMsdGhpcy51LHZvaWQgMD09PWI/ITE6Yil9O2NBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjQShtZChUeiksbWQoVCksbWQoTG8pKX0sTDpjQSxZOiJyb290In0pO3ZhciBkQT1mdW5jdGlvbihhLGIpe3RoaXMuZWE9YTt0aGlzLnU9Yn0sZUE9ZnVuY3Rpb24oYSl7aWYoIWEuZWEueWEpcmV0dXJuIDA7dmFyIGI9YS51LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoMSwyLDMpIjtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS51LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGM9YS51LmRlZmF1bHRWaWV3fHx3aW5kb3c7Yz1jJiZjLmdldENvbXB1dGVkU3R5bGU/Yy5nZXRDb21wdXRlZFN0eWxlKGIpOm51bGw7Yz0oYyYmYy5iYWNrZ3JvdW5kQ29sb3J8fCIiKS5yZXBsYWNlKC8gL2csIiIpO2EudS5ib2R5LnJlbW92ZUNoaWxkKGIpO3N3aXRjaChjKXtjYXNlICJyZ2IoMCwwLDApIjpyZXR1cm4gMjtjYXNlICJyZ2IoMjU1LDI1NSwyNTUpIjpyZXR1cm4gMX1yZXR1cm4gMH07CmRBLnByb3RvdHlwZS5rQT1mdW5jdGlvbigpe2lmKHRoaXMuZWEueWEmJnRoaXMudS5ib2R5KXt2YXIgYT10aGlzLnUuYm9keS5jbGFzc0xpc3Q7YS5yZW1vdmUoImNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSIpO2EucmVtb3ZlKCJjZGstaGlnaC1jb250cmFzdC1ibGFjay1vbi13aGl0ZSIpO2EucmVtb3ZlKCJjZGstaGlnaC1jb250cmFzdC13aGl0ZS1vbi1ibGFjayIpO3ZhciBiPWVBKHRoaXMpOzE9PT1iPyhhLmFkZCgiY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIiksYS5hZGQoImNkay1oaWdoLWNvbnRyYXN0LWJsYWNrLW9uLXdoaXRlIikpOjI9PT1iJiYoYS5hZGQoImNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSIpLGEuYWRkKCJjZGstaGlnaC1jb250cmFzdC13aGl0ZS1vbi1ibGFjayIpKX19O2RBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkQShtZChOeiksbWQoTG8pKX0sTDpkQSxZOiJyb290In0pO3ZhciBnQT1uZXcgeSgibGl2ZUFubm91bmNlckVsZW1lbnQiLHtZOiJyb290IixWOmZBfSk7ZnVuY3Rpb24gZkEoKXtyZXR1cm4gbnVsbH12YXIgaEE9bmV3IHkoIkxJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUyIpO3ZhciBpQT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLlM9Yjt0aGlzLmxkPWQ7dGhpcy51PWM7dGhpcy50Zz1hfHx0aGlzLmRLKCl9OwppQS5wcm90b3R5cGUuTEU9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W10sZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTFdPWFyZ3VtZW50c1tkXTt2YXIgZT10aGlzO2Q9dGhpcy5sZDtpZigxPT09Yy5sZW5ndGgmJiJudW1iZXIiPT09dHlwZW9mIGNbMF0pdmFyIGY9Y1swXTtlbHNle2M9bihjKTt2YXIgZz1jLm5leHQoKS52YWx1ZTtmPWMubmV4dCgpLnZhbHVlfXRoaXMuY2xlYXIoKTtjbGVhclRpbWVvdXQodGhpcy5rcik7Z3x8KGc9ZCYmZC4kbz9kLiRvOiJwb2xpdGUiKTtudWxsPT1mJiZkJiYoZj1kLmR1cmF0aW9uKTt0aGlzLnRnLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIixnKTt0aGlzLlMub2EoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obCl7Y2xlYXJUaW1lb3V0KGUua3IpO2Uua3I9c2V0VGltZW91dChmdW5jdGlvbigpe2UudGcudGV4dENvbnRlbnQ9YTtsKCk7Im51bWJlciI9PT10eXBlb2YgZiYmKGUua3I9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBlLmNsZWFyKCl9LApmKSl9LDEwMCl9KX0pfTtpQS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnRnJiYodGhpcy50Zy50ZXh0Q29udGVudD0iIil9O2lBLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMua3IpO3RoaXMudGcmJnRoaXMudGcucGFyZW50Tm9kZSYmKHRoaXMudGcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnRnKSx0aGlzLnRnPW51bGwpfTsKaUEucHJvdG90eXBlLmRLPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJjZGstbGl2ZS1hbm5vdW5jZXItZWxlbWVudCIpLGI9dGhpcy51LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtjXSk7Yi5jbGFzc0xpc3QuYWRkKCJjZGstbGl2ZS1hbm5vdW5jZXItZWxlbWVudCIpO2IuY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpO2Iuc2V0QXR0cmlidXRlKCJhcmlhLWF0b21pYyIsInRydWUiKTtiLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIik7dGhpcy51LmJvZHkuYXBwZW5kQ2hpbGQoYik7cmV0dXJuIGJ9O2lBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpQShtZChnQSw4KSxtZChUKSxtZChMbyksbWQoaEEsOCkpfSxMOmlBLFk6InJvb3QifSk7dmFyIGpBPWZ1bmN0aW9uKGEpe2Eua0EoKX07ZnVuY3Rpb24ga0EoYSxiKXt2YXIgYz1sQShhKTtjLnNvbWUoZnVuY3Rpb24oZCl7cmV0dXJuIGQudHJpbSgpPT1iLnRyaW0oKX0pfHwoYy5wdXNoKGIudHJpbSgpKSxhLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYy5qb2luKCIgIikpKX1mdW5jdGlvbiBtQShhLGIpe3ZhciBjPWxBKGEpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZCE9Yi50cmltKCl9KTtjLmxlbmd0aD9hLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYy5qb2luKCIgIikpOmEucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iil9ZnVuY3Rpb24gbEEoYSl7cmV0dXJuKGEuZ2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5tYXRjaCgvXFMrL2cpfHxbXX07dmFyIG5BPTAsb0E9bmV3IE1hcCxwQT1udWxsLHFBPWZ1bmN0aW9uKGEpe3RoaXMudT1hfSxyQT1mdW5jdGlvbihhLGIsYyl7YS5zQyhiKSYmKGEuckMoYixjKSYmYS5TTShiLGMpLCJzdHJpbmciPT09dHlwZW9mIGMmJihiPW9BLmdldChjKSkmJjA9PT1iLml0JiZhLnJLKGMpLHBBJiYwPT09cEEuY2hpbGROb2Rlcy5sZW5ndGgmJmEuVEEoKSl9O2g9cUEucHJvdG90eXBlO2guWD1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnUucXVlcnlTZWxlY3RvckFsbCgiW2Nkay1kZXNjcmliZWRieS1ob3N0XSIpLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlFNKGFbYl0pLGFbYl0ucmVtb3ZlQXR0cmlidXRlKCJjZGstZGVzY3JpYmVkYnktaG9zdCIpO3BBJiZ0aGlzLlRBKCk7b0EuY2xlYXIoKX07CmguZUs9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuRkQoYik7Yi50ZXh0Q29udGVudD1hO3RoaXMuZksoKTtwQS5hcHBlbmRDaGlsZChiKTtvQS5zZXQoYSx7Tm86YixpdDowfSl9O2guRkQ9ZnVuY3Rpb24oYSl7YS5pZHx8KGEuaWQ9ImNkay1kZXNjcmliZWRieS1tZXNzYWdlLSIrbkErKyl9O2gucks9ZnVuY3Rpb24oYSl7dmFyIGI9b0EuZ2V0KGEpO2I9YiYmYi5ObztwQSYmYiYmcEEucmVtb3ZlQ2hpbGQoYik7b0EuZGVsZXRlKGEpfTsKaC5mSz1mdW5jdGlvbigpe2lmKCFwQSl7dmFyIGE9dGhpcy51LmdldEVsZW1lbnRCeUlkKCJjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXIiKTthJiZhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7cEE9dGhpcy51LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3BBLmlkPSJjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXIiO3BBLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7cEEuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy51LmJvZHkuYXBwZW5kQ2hpbGQocEEpfX07aC5UQT1mdW5jdGlvbigpe3BBJiZwQS5wYXJlbnROb2RlJiYocEEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwQSkscEE9bnVsbCl9O2guUU09ZnVuY3Rpb24oYSl7dmFyIGI9bEEoYSkuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiAwIT1jLmluZGV4T2YoImNkay1kZXNjcmliZWRieS1tZXNzYWdlIil9KTthLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYi5qb2luKCIgIikpfTsKaC5UST1mdW5jdGlvbihhLGIpe2I9b0EuZ2V0KGIpO2tBKGEsYi5Oby5pZCk7YS5zZXRBdHRyaWJ1dGUoImNkay1kZXNjcmliZWRieS1ob3N0IiwiIik7Yi5pdCsrfTtoLlNNPWZ1bmN0aW9uKGEsYil7Yj1vQS5nZXQoYik7Yi5pdC0tO21BKGEsYi5Oby5pZCk7YS5yZW1vdmVBdHRyaWJ1dGUoImNkay1kZXNjcmliZWRieS1ob3N0Iil9O2guckM9ZnVuY3Rpb24oYSxiKXthPWxBKGEpO2I9KGI9b0EuZ2V0KGIpKSYmYi5Oby5pZDtyZXR1cm4hIWImJi0xIT1hLmluZGV4T2YoYil9O2guR0o9ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5zQyhhKSlyZXR1cm4hMTtpZihiJiYib2JqZWN0Ij09PXR5cGVvZiBiKXJldHVybiEwO2I9bnVsbD09Yj8iIjooIiIrYikudHJpbSgpO2E9YS5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtyZXR1cm4gYj8hYXx8YS50cmltKCkhPT1iOiExfTtoLnNDPWZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVUeXBlPT09dGhpcy51LkVMRU1FTlRfTk9ERX07CnFBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxQShtZChMbykpfSxMOnFBLFk6InJvb3QifSk7ZnVuY3Rpb24gc0EoYSxiKXtmb3IodmFyIGM9W10sZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTFdPWFyZ3VtZW50c1tkXTtyZXR1cm4gYy5sZW5ndGg/Yy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBhW2VdfSk6YS5hbHRLZXl8fGEuc2hpZnRLZXl8fGEuY3RybEtleXx8YS5tZXRhS2V5fTt2YXIgdEE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLmZsPWE7dGhpcy5tZT0tMTt0aGlzLlBwPW51bGw7dGhpcy5peD0hMTt0aGlzLkJ2PW5ldyBZaDt0aGlzLmFFPU1oLkVNUFRZO3RoaXMuQmc9ITA7dGhpcy5mQT1bXTt0aGlzLkd3PWZ1bmN0aW9uKGMpe3JldHVybiBjLmRpc2FibGVkfTt0aGlzLm9qPVtdO3RoaXMuQno9bmV3IFloO3RoaXMuUWE9bmV3IFloO2EgaW5zdGFuY2VvZiBtbSYmYS5aYi5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7Yi5QcCYmKGM9Yy5FYy5zbGljZSgpLmluZGV4T2YoYi5QcCksLTE8YyYmYyE9PWIubWUmJihiLm1lPWMpKX0pfSx1QT1mdW5jdGlvbihhKXthLml4PSEwO3JldHVybiBhfSx2QT1mdW5jdGlvbihhKXthLkJnPSEwO3JldHVybiBhfSx3QT1mdW5jdGlvbihhLGIpe2EuRXE9YjtyZXR1cm4gYX0seEE9ZnVuY3Rpb24oYSl7YS5mQT1bInNoaWZ0S2V5Il07cmV0dXJuIGF9LHlBPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPzIwMDpiO2lmKGEuZmwubGVuZ3RoJiYKYS5mbC5zb21lKGZ1bmN0aW9uKGMpe3JldHVybiJmdW5jdGlvbiIhPT10eXBlb2YgYy5neX0pKXRocm93IEVycm9yKCJMaXN0S2V5TWFuYWdlciBpdGVtcyBpbiB0eXBlYWhlYWQgbW9kZSBtdXN0IGltcGxlbWVudCB0aGUgYGdldExhYmVsYCBtZXRob2QuIik7YS5hRS51bnN1YnNjcmliZSgpO2EuYUU9YS5Cdi5iKFVsKGZ1bmN0aW9uKGMpe3JldHVybiBhLm9qLnB1c2goYyl9KSxRayhiKSxhayhmdW5jdGlvbigpe3JldHVybiAwPGEub2oubGVuZ3RofSksdWkoZnVuY3Rpb24oKXtyZXR1cm4gYS5vai5qb2luKCIiKX0pKS5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7Zm9yKHZhciBkPWEueHEoKSxlPTE7ZTxkLmxlbmd0aCsxO2UrKyl7dmFyIGY9KGEubWUrZSklZC5sZW5ndGgsZz1kW2ZdO2lmKCFhLkd3KGcpJiYwPT09Zy5neSgpLnRvVXBwZXJDYXNlKCkudHJpbSgpLmluZGV4T2YoYykpe2EueGYoZik7YnJlYWt9fWEub2o9W119KTtyZXR1cm4gYX07CnRBLnByb3RvdHlwZS54Zj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLm1lO3pBKHRoaXMsYSk7dGhpcy5tZSE9PWImJnRoaXMuUWEubmV4dCh0aGlzLm1lKX07CnZhciBDQT1mdW5jdGlvbihhLGIpe3ZhciBjPWIua2V5Q29kZSxkPVsiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSJdLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiFiW2VdfHwtMTxhLmZBLmluZGV4T2YoZSl9KTtzd2l0Y2goYyl7Y2FzZSA5OmEuQnoubmV4dCgpO3JldHVybjtjYXNlIDQwOmlmKGEuQmcmJmQpe0FBKGEpO2JyZWFrfWVsc2UgcmV0dXJuO2Nhc2UgMzg6aWYoYS5CZyYmZCl7QkEoYSk7YnJlYWt9ZWxzZSByZXR1cm47Y2FzZSAzOTppZihhLkVxJiZkKXsicnRsIj09PWEuRXE/QkEoYSk6QUEoYSk7YnJlYWt9ZWxzZSByZXR1cm47Y2FzZSAzNzppZihhLkVxJiZkKXsicnRsIj09PWEuRXE/QUEoYSk6QkEoYSk7YnJlYWt9ZWxzZSByZXR1cm47ZGVmYXVsdDppZihkfHxzQShiLCJzaGlmdEtleSIpKWIua2V5JiYxPT09Yi5rZXkubGVuZ3RoP2EuQnYubmV4dChiLmtleS50b0xvY2FsZVVwcGVyQ2FzZSgpKTooNjU8PWMmJjkwPj1jfHw0ODw9YyYmNTc+PQpjKSYmYS5Cdi5uZXh0KFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO3JldHVybn1hLm9qPVtdO2IucHJldmVudERlZmF1bHQoKX0sREE9ZnVuY3Rpb24oYSl7YS5FaChhLmZsLmxlbmd0aC0xLC0xKX0sQUE9ZnVuY3Rpb24oYSl7MD5hLm1lP2EuRWgoMCwxKTphLkVEKDEpfSxCQT1mdW5jdGlvbihhKXswPmEubWUmJmEuaXg/REEoYSk6YS5FRCgtMSl9LHpBPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS54cSgpO2I9Im51bWJlciI9PT10eXBlb2YgYj9iOmMuaW5kZXhPZihiKTtjPWNbYl07YS5QcD1udWxsPT1jP251bGw6YzthLm1lPWJ9O2g9dEEucHJvdG90eXBlO2guRUQ9ZnVuY3Rpb24oYSl7dGhpcy5peD90aGlzLmdOKGEpOnRoaXMuZk4oYSl9O2guZ049ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXMueHEoKSxjPTE7Yzw9Yi5sZW5ndGg7YysrKXt2YXIgZD0odGhpcy5tZSthKmMrYi5sZW5ndGgpJWIubGVuZ3RoO2lmKCF0aGlzLkd3KGJbZF0pKXt0aGlzLnhmKGQpO2JyZWFrfX19OwpoLmZOPWZ1bmN0aW9uKGEpe3RoaXMuRWgodGhpcy5tZSthLGEpfTtoLkVoPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy54cSgpO2lmKGNbYV0pe2Zvcig7dGhpcy5HdyhjW2FdKTspaWYoYSs9YiwhY1thXSlyZXR1cm47dGhpcy54ZihhKX19O2gueHE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbCBpbnN0YW5jZW9mIG1tP3RoaXMuZmwuRWMuc2xpY2UoKTp0aGlzLmZsfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRBLnByb3RvdHlwZSx7UHI6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lfX0sd2M6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlBwfX19KTt2YXIgRUE9ZnVuY3Rpb24oKXt0QS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3QoRUEsdEEpO0VBLnByb3RvdHlwZS54Zj1mdW5jdGlvbihhKXtpZih0aGlzLndjKXt2YXIgYj10aGlzLndjO2IuSG0mJihiLkhtPSExLFlnKGIuY2EpKX10QS5wcm90b3R5cGUueGYuY2FsbCh0aGlzLGEpO3RoaXMud2MmJihhPXRoaXMud2MsYS5IbXx8KGEuSG09ITAsWWcoYS5jYSkpKX07dmFyIEZBPWZ1bmN0aW9uKCl7dEEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuS2Y9InByb2dyYW0ifTt0KEZBLHRBKTtGQS5wcm90b3R5cGUueGY9ZnVuY3Rpb24oYSl7dEEucHJvdG90eXBlLnhmLmNhbGwodGhpcyxhKTt0aGlzLndjJiZ0aGlzLndjLmZvY3VzKHRoaXMuS2YpfTt2YXIgR0E9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7YT12b2lkIDA9PT1hPyExOmE7Yz12b2lkIDA9PT1jPyEwOmM7dGhpcy5JZj1hO3RoaXMuZEI9Yzt0aGlzLk5mPW5ldyBTZXQ7dGhpcy5ycT1bXTt0aGlzLkFuPVtdO3RoaXMuV0U9bmV3IFloO2ImJmIubGVuZ3RoJiYoYT9iLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGQuR3YoZSl9KTp0aGlzLkd2KGJbMF0pLHRoaXMuQW4ubGVuZ3RoPTApfTtoPUdBLnByb3RvdHlwZTtoLnNlbGVjdD1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTt2YXIgZD10aGlzO3RoaXMueEUoYik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBkLkd2KGUpfSk7dGhpcy5MZCgpfTsKaC5TbD1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTt2YXIgZD10aGlzO3RoaXMueEUoYik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBkLmNFKGUpfSk7dGhpcy5MZCgpfTtoLnRvZ2dsZT1mdW5jdGlvbihhKXt0aGlzLk5mLmhhcyhhKT90aGlzLlNsKGEpOnRoaXMuc2VsZWN0KGEpfTtoLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5iRSgpO3RoaXMuTGQoKX07aC5Paj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5OZi5zaXplfTtoLkRlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuT2ooKX07aC5zb3J0PWZ1bmN0aW9uKGEpe3RoaXMuSWYmJnRoaXMuc2VsZWN0ZWQmJnRoaXMubWIuc29ydChhKX07CmguTGQ9ZnVuY3Rpb24oKXt0aGlzLm1iPW51bGw7aWYodGhpcy5Bbi5sZW5ndGh8fHRoaXMucnEubGVuZ3RoKXRoaXMuV0UubmV4dCh7c291cmNlOnRoaXMsQU86dGhpcy5BbiwkUTp0aGlzLnJxfSksdGhpcy5ycT1bXSx0aGlzLkFuPVtdfTtoLkd2PWZ1bmN0aW9uKGEpe3RoaXMuTmYuaGFzKGEpfHwodGhpcy5JZnx8dGhpcy5iRSgpLHRoaXMuTmYuYWRkKGEpLHRoaXMuZEImJnRoaXMuQW4ucHVzaChhKSl9O2guY0U9ZnVuY3Rpb24oYSl7dGhpcy5OZi5oYXMoYSkmJih0aGlzLk5mLmRlbGV0ZShhKSx0aGlzLmRCJiZ0aGlzLnJxLnB1c2goYSkpfTtoLmJFPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLk9qKCl8fHRoaXMuTmYuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYS5jRShiKX0pfTsKaC54RT1mdW5jdGlvbihhKXtpZigxPGEubGVuZ3RoJiYhdGhpcy5JZil0aHJvdyBFcnJvcigiQ2Fubm90IHBhc3MgbXVsdGlwbGUgdmFsdWVzIGludG8gU2VsZWN0aW9uTW9kZWwgd2l0aCBzaW5nbGUtdmFsdWUgbW9kZS4iKTt9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR0EucHJvdG90eXBlLHtzZWxlY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dGhpcy5tYnx8KHRoaXMubWI9QXJyYXkuZnJvbSh0aGlzLk5mLnZhbHVlcygpKSk7cmV0dXJuIHRoaXMubWJ9fX0pO3ZhciBIQT1mdW5jdGlvbigpe3RoaXMuZ249W119O0hBLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9bih0aGlzLmduKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlkPWQudmFsdWUsZChhLGIpfTtIQS5wcm90b3R5cGUuZmM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLmduLnB1c2goYSk7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5nbj1iLmduLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYSE9PWN9KX19O0hBLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5nbj1bXX07SEEuaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEhBfSxMOkhBLFk6InJvb3QifSk7dmFyIElBPTAsSkE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5ZYj1hO3RoaXMuY2E9Yjt0aGlzLkdLPWM7dGhpcy5PQz1NaC5FTVBUWTt0aGlzLmNsb3NlZD1uZXcgcms7dGhpcy5lZT1uZXcgcms7dGhpcy5hZT1uZXcgcms7dGhpcy5CUD1uZXcgcms7dGhpcy5pZD0iY2RrLWFjY29yZGlvbi1jaGlsZC0iK0lBKys7dGhpcy5PYT10aGlzLkx1PSExO3RoaXMueW49ZnVuY3Rpb24oKXt9O3RoaXMueW49Yy5mYyhmdW5jdGlvbihlLGYpe2QuWWImJiFkLlliLkNHJiZkLlliLmlkPT09ZiYmZC5pZCE9PWUmJihkLk1hPSExKX0pO3RoaXMuWWImJih0aGlzLk9DPXRoaXMuQ04oKSl9O2g9SkEucHJvdG90eXBlO2guWD1mdW5jdGlvbigpe3RoaXMuZWUuY29tcGxldGUoKTt0aGlzLmNsb3NlZC5jb21wbGV0ZSgpO3RoaXMuYWUuZW1pdCgpO3RoaXMuYWUuY29tcGxldGUoKTt0aGlzLnluKCk7dGhpcy5PQy51bnN1YnNjcmliZSgpfTsKaC50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHwodGhpcy5NYT0hdGhpcy5NYSl9O2guY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHwodGhpcy5NYT0hMSl9O2gub3Blbj1mdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLk1hPSEwKX07aC5DTj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7cmV0dXJuIHRoaXMuWWIuZVMuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2EuZGlzYWJsZWR8fChhLk1hPWIpfSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEpBLnByb3RvdHlwZSx7TWE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkx1fSxzZXQ6ZnVuY3Rpb24oYSl7YT10eihhKTt0aGlzLkx1IT09YSYmKHRoaXMuTHU9YSx0aGlzLkJQLmVtaXQoYSksYT8odGhpcy5lZS5lbWl0KCksdGhpcy5HSy5ub3RpZnkodGhpcy5pZCx0aGlzLlliP3RoaXMuWWIuaWQ6dGhpcy5pZCkpOnRoaXMuY2xvc2VkLmVtaXQoKSxZZyh0aGlzLmNhKSl9fSxkaXNhYmxlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2F9LHNldDpmdW5jdGlvbihhKXt0aGlzLk9hPXR6KGEpfX19KTt2YXIgS0E9ZnVuY3Rpb24oKXt9O3ZhciBNQT1uZXcgeSgiY2RrLWRpci1kb2MiLHtZOiJyb290IixWOkxBfSk7ZnVuY3Rpb24gTEEoKXtyZXR1cm4gbWQoTG8pfTt2YXIgTkE9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT0ibHRyIjt0aGlzLlFhPW5ldyByaztpZihhKXt2YXIgYj1hLmRvY3VtZW50RWxlbWVudD9hLmRvY3VtZW50RWxlbWVudC5kaXI6bnVsbDtiPShhLmJvZHk/YS5ib2R5LmRpcjpudWxsKXx8Yjt0aGlzLnZhbHVlPSJsdHIiPT09Ynx8InJ0bCI9PT1iP2I6Imx0ciJ9fTtOQS5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuUWEuY29tcGxldGUoKX07TkEuaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE5BKG1kKE1BLDgpKX0sTDpOQSxZOiJyb290In0pO3ZhciBPQT1mdW5jdGlvbigpe307dmFyIFBBPW5ldyBTZXQsUUEsU0E9ZnVuY3Rpb24oYSl7dGhpcy5lYT1hO3RoaXMuVUw9dGhpcy5lYS55YSYmd2luZG93Lm1hdGNoTWVkaWE/d2luZG93Lm1hdGNoTWVkaWEuYmluZCh3aW5kb3cpOlJBfTtTQS5wcm90b3R5cGUubWF0Y2hNZWRpYT1mdW5jdGlvbihhKXtpZih0aGlzLmVhLkZtJiYhUEEuaGFzKGEpKXRyeXtRQXx8KFFBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksUUEuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKFFBKSksUUEuc2hlZXQmJihRQS5zaGVldC5pbnNlcnRSdWxlKCJAbWVkaWEgIithKyIgey5meC1xdWVyeS10ZXN0eyB9fSIsMCksUEEuYWRkKGEpKX1jYXRjaChiKXtjb25zb2xlLmVycm9yKGIpfXJldHVybiB0aGlzLlVMKGEpfTtTQS5oYT1UYyh7VjpmdW5jdGlvbigpe3JldHVybiBuZXcgU0EobWQoTnopKX0sTDpTQSxZOiJyb290In0pOwpmdW5jdGlvbiBSQShhKXtyZXR1cm57bWF0Y2hlczoiYWxsIj09PWF8fCIiPT09YSxtZWRpYTphLGFkZExpc3RlbmVyOmZ1bmN0aW9uKCl7fSxyZW1vdmVMaXN0ZW5lcjpmdW5jdGlvbigpe319fTt2YXIgVEE9ZnVuY3Rpb24oYSxiKXt0aGlzLlZMPWE7dGhpcy5iYj1iO3RoaXMua3c9bmV3IE1hcDt0aGlzLnp1PW5ldyBZaH07VEEucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt0aGlzLnp1Lm5leHQoKTt0aGlzLnp1LmNvbXBsZXRlKCl9O1RBLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1VQShBcnJheS5pc0FycmF5KGEpP2E6W2FdKS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGIuT00oYykub2JzZXJ2YWJsZX0pO2E9SmkoYSk7YT1SaShhLmIoZ2woKSksYS5iKEtsKCksUWsoMCkpKTtyZXR1cm4gYS5iKHVpKGZ1bmN0aW9uKGMpe3ZhciBkPXttYXRjaGVzOiExLFNPOnt9fTtjLmZvckVhY2goZnVuY3Rpb24oZSl7ZC5tYXRjaGVzPWQubWF0Y2hlc3x8ZS5tYXRjaGVzO2QuU09bZS5xdWVyeV09ZS5tYXRjaGVzfSk7cmV0dXJuIGR9KSl9OwpUQS5wcm90b3R5cGUuT009ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZih0aGlzLmt3LmhhcyhhKSlyZXR1cm4gdGhpcy5rdy5nZXQoYSk7dmFyIGM9dGhpcy5WTC5tYXRjaE1lZGlhKGEpLGQ9e29ic2VydmFibGU6KG5ldyBUaChmdW5jdGlvbihlKXt2YXIgZj1mdW5jdGlvbihnKXtyZXR1cm4gYi5iYi5nYShmdW5jdGlvbigpe3JldHVybiBlLm5leHQoZyl9KX07Yy5hZGRMaXN0ZW5lcihmKTtyZXR1cm4gZnVuY3Rpb24oKXtjLnJlbW92ZUxpc3RlbmVyKGYpfX0pKS5iKE5sKGMpLHVpKGZ1bmN0aW9uKGUpe3JldHVybntxdWVyeTphLG1hdGNoZXM6ZS5tYXRjaGVzfX0pLFJsKHRoaXMuenUpKSxFUzpjfTt0aGlzLmt3LnNldChhLGQpO3JldHVybiBkfTtUQS5oYT1UYyh7VjpmdW5jdGlvbigpe3JldHVybiBuZXcgVEEobWQoU0EpLG1kKFQpKX0sTDpUQSxZOiJyb290In0pOwpmdW5jdGlvbiBVQShhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIGIuc3BsaXQoIiwiKX0pLnJlZHVjZShmdW5jdGlvbihiLGMpe3JldHVybiBiLmNvbmNhdChjKX0pLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi50cmltKCl9KX07LyoKCiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgoKIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiBAdHlwZSB7e1hTbWFsbDogc3RyaW5nLCBTbWFsbDogc3RyaW5nLCBNZWRpdW06IHN0cmluZywgTGFyZ2U6IHN0cmluZywgWExhcmdlOiBzdHJpbmcsIEhhbmRzZXQ6IHN0cmluZywgVGFibGV0OiBzdHJpbmcsIFdlYjogc3RyaW5nLCBIYW5kc2V0UG9ydHJhaXQ6IHN0cmluZywgVGFibGV0UG9ydHJhaXQ6IHN0cmluZywgV2ViUG9ydHJhaXQ6IHN0cmluZywgSGFuZHNldExhbmRzY2FwZTogc3RyaW5nLCBUYWJsZXRMYW5kc2NhcGU6IHN0cmluZywgV2ViTGFuZHNjYXBlOiBzdHJpbmd9fQoqLwp2YXIgVkE9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuUz1hO3RoaXMuZWE9Yjt0aGlzLnpuPW5ldyBZaDt0aGlzLlhtPW51bGw7dGhpcy55dz0wO3RoaXMucW09bmV3IE1hcDt0aGlzLnU9Y307VkEucHJvdG90eXBlLnJlZ2lzdGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5xbS5oYXMoYSl8fHRoaXMucW0uc2V0KGEsYS5ESy5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gYi56bi5uZXh0KGEpfSkpfTtWQS5wcm90b3R5cGUuUXg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5xbS5nZXQoYSk7YiYmKGIudW5zdWJzY3JpYmUoKSx0aGlzLnFtLmRlbGV0ZShhKSl9Owp2YXIgV0E9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/MjA6YjtyZXR1cm4gYS5lYS55YT9uZXcgVGgoZnVuY3Rpb24oYyl7YS5YbXx8YS5TSSgpO3ZhciBkPTA8Yj9hLnpuLmIoTWsoYikpLnN1YnNjcmliZShjKTphLnpuLnN1YnNjcmliZShjKTthLnl3Kys7cmV0dXJuIGZ1bmN0aW9uKCl7ZC51bnN1YnNjcmliZSgpO2EueXctLTthLnl3fHxhLnNEKCl9fSk6ZmkoKX07VkEucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuc0QoKTt0aGlzLnFtLmZvckVhY2goZnVuY3Rpb24oYixjKXtyZXR1cm4gYS5ReChjKX0pO3RoaXMuem4uY29tcGxldGUoKX07dmFyIFhBPWZ1bmN0aW9uKGEsYil7dmFyIGM9W107YS5xbS5mb3JFYWNoKGZ1bmN0aW9uKGQsZSl7YS5kTihlLGIpJiZjLnB1c2goZSl9KTtyZXR1cm4gY307aD1WQS5wcm90b3R5cGU7aC5OZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnV8fGRvY3VtZW50fTsKaC5QZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLk5kKCkuZGVmYXVsdFZpZXd8fHdpbmRvd307aC5kTj1mdW5jdGlvbihhLGIpe2I9Yi5pO2E9YS5VZi5pO2RvIGlmKGI9PWEpcmV0dXJuITA7d2hpbGUoYj1iLnBhcmVudEVsZW1lbnQpO3JldHVybiExfTtoLlNJPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLlhtPXRoaXMuUy5vYShmdW5jdGlvbigpe3JldHVybiBWaShhLlBkKCkuZG9jdW1lbnQsInNjcm9sbCIpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBhLnpuLm5leHQoKX0pfSl9O2guc0Q9ZnVuY3Rpb24oKXt0aGlzLlhtJiYodGhpcy5YbS51bnN1YnNjcmliZSgpLHRoaXMuWG09bnVsbCl9O1ZBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBWQShtZChUKSxtZChOeiksbWQoTG8sOCkpfSxMOlZBLFk6InJvb3QifSk7dmFyIFlBPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXM7dGhpcy5VZj1hO3RoaXMuRUg9Yjt0aGlzLkFRPWM7dGhpcy5kaXI9ZDt0aGlzLmFhPW5ldyBZaDt0aGlzLkRLPW5ldyBUaChmdW5jdGlvbihmKXtyZXR1cm4gZS5BUS5vYShmdW5jdGlvbigpe3JldHVybiBWaShlLlVmLmksInNjcm9sbCIpLmIoUmwoZS5hYSkpLnN1YnNjcmliZShmKX0pfSl9O1lBLnByb3RvdHlwZS5PYj1mdW5jdGlvbigpe3RoaXMuRUgucmVnaXN0ZXIodGhpcyl9O1lBLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5FSC5ReCh0aGlzKTt0aGlzLmFhLm5leHQoKTt0aGlzLmFhLmNvbXBsZXRlKCl9OwpZQS5wcm90b3R5cGUuc2Nyb2xsVG89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZi5pLGM9dGhpcy5kaXImJiJydGwiPT10aGlzLmRpci52YWx1ZTtudWxsPT1hLmxlZnQmJihhLmxlZnQ9Yz9hLmVuZDphLnN0YXJ0KTtudWxsPT1hLnJpZ2h0JiYoYS5yaWdodD1jP2Euc3RhcnQ6YS5lbmQpO251bGwhPWEuYm90dG9tJiYoYS50b3A9Yi5zY3JvbGxIZWlnaHQtYi5jbGllbnRIZWlnaHQtYS5ib3R0b20pO2MmJjAhPUl6KCk/KG51bGwhPWEubGVmdCYmKGEucmlnaHQ9Yi5zY3JvbGxXaWR0aC1iLmNsaWVudFdpZHRoLWEubGVmdCksMj09SXooKT9hLmxlZnQ9YS5yaWdodDoxPT1JeigpJiYoYS5sZWZ0PWEucmlnaHQ/LWEucmlnaHQ6YS5yaWdodCkpOm51bGwhPWEucmlnaHQmJihhLmxlZnQ9Yi5zY3JvbGxXaWR0aC1iLmNsaWVudFdpZHRoLWEucmlnaHQpO3RoaXMuZkooYSl9OwpZQS5wcm90b3R5cGUuZko9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZi5pOyJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQmJiJzY3JvbGxCZWhhdmlvciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU/Yi5zY3JvbGxUbyhhKToobnVsbCE9YS50b3AmJihiLnNjcm9sbFRvcD1hLnRvcCksbnVsbCE9YS5sZWZ0JiYoYi5zY3JvbGxMZWZ0PWEubGVmdCkpfTt2YXIgWkE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5lYT1hO3RoaXMudT1jO2Iub2EoZnVuY3Rpb24oKXt2YXIgZT1kLlBkKCk7ZC5BQT1hLnlhP1lqKFZpKGUsInJlc2l6ZSIpLFZpKGUsIm9yaWVudGF0aW9uY2hhbmdlIikpOmZpKCk7ZC5BTD1kLlFhKCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIGQucUUoKX0pfSl9O1pBLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5BTC51bnN1YnNjcmliZSgpfTsKdmFyICRBPWZ1bmN0aW9uKGEpe2EuTHJ8fGEucUUoKTt2YXIgYj17d2lkdGg6YS5Mci53aWR0aCxoZWlnaHQ6YS5Mci5oZWlnaHR9O2EuZWEueWF8fChhLkxyPW51bGwpO3JldHVybiBifSxhQj1mdW5jdGlvbihhKXtpZighYS5lYS55YSlyZXR1cm57dG9wOjAsbGVmdDowfTt2YXIgYj1hLk5kKCk7YT1hLlBkKCk7dmFyIGM9Yi5kb2N1bWVudEVsZW1lbnQsZD1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt0b3A6LWQudG9wfHxiLmJvZHkuc2Nyb2xsVG9wfHxhLnNjcm9sbFl8fGMuc2Nyb2xsVG9wfHwwLGxlZnQ6LWQubGVmdHx8Yi5ib2R5LnNjcm9sbExlZnR8fGEuc2Nyb2xsWHx8Yy5zY3JvbGxMZWZ0fHwwfX07WkEucHJvdG90eXBlLlFhPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8yMDphO3JldHVybiAwPGE/dGhpcy5BQS5iKE1rKGEpKTp0aGlzLkFBfTtaQS5wcm90b3R5cGUuTmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51fHxkb2N1bWVudH07ClpBLnByb3RvdHlwZS5QZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLk5kKCkuZGVmYXVsdFZpZXd8fHdpbmRvd307WkEucHJvdG90eXBlLnFFPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QZCgpO3RoaXMuTHI9dGhpcy5lYS55YT97d2lkdGg6YS5pbm5lcldpZHRoLGhlaWdodDphLmlubmVySGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19O1pBLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBaQShtZChOeiksbWQoVCksbWQoTG8sOCkpfSxMOlpBLFk6InJvb3QifSk7dmFyIGJCPSJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmISF3aW5kb3cmJiEoIXdpbmRvdy5OSSYmIXdpbmRvdy5tUSksY0I9ZnVuY3Rpb24oYSxiKXt0aGlzLmVhPWI7dGhpcy51PWF9O2NCLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5WazthJiZhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKX07dmFyIGRCPWZ1bmN0aW9uKGEpe2EuVmt8fGEuYksoKTtyZXR1cm4gYS5Wa307CmNCLnByb3RvdHlwZS5iSz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZWE/dGhpcy5lYS55YToidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3c7aWYoYXx8YkIpZm9yKHZhciBiPXRoaXMudS5xdWVyeVNlbGVjdG9yQWxsKCcuY2RrLW92ZXJsYXktY29udGFpbmVyW3BsYXRmb3JtPSJzZXJ2ZXIiXSwgLmNkay1vdmVybGF5LWNvbnRhaW5lcltwbGF0Zm9ybT0idGVzdCJdJyksYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiW2NdKTtiPXRoaXMudS5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LWNvbnRhaW5lciIpO2JCP2Iuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInRlc3QiKTphfHxiLnNldEF0dHJpYnV0ZSgicGxhdGZvcm0iLCJzZXJ2ZXIiKTt0aGlzLnUuYm9keS5hcHBlbmRDaGlsZChiKTt0aGlzLlZrPWJ9OwpjQi5oYT1UYyh7VjpmdW5jdGlvbigpe3JldHVybiBuZXcgY0IobWQoTG8pLG1kKE56KSl9LEw6Y0IsWToicm9vdCJ9KTtuZXcgZGQ7bmV3IGZkO3ZhciBlQj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuTm09W107dGhpcy51Qz1mdW5jdGlvbihjKXtmb3IodmFyIGQ9Yi5ObSxlPWQubGVuZ3RoLTE7LTE8ZTtlLS0paWYoMDxkW2VdLlBxLmFnLmxlbmd0aCl7ZFtlXS5QcS5uZXh0KGMpO2JyZWFrfX07dGhpcy51PWF9O2VCLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5yZygpfTtlQi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlKGEpO3RoaXMuc3Z8fCh0aGlzLnUuYm9keS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnVDKSx0aGlzLnN2PSEwKTt0aGlzLk5tLnB1c2goYSl9O2VCLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oYSl7YT10aGlzLk5tLmluZGV4T2YoYSk7LTE8YSYmdGhpcy5ObS5zcGxpY2UoYSwxKTswPT09dGhpcy5ObS5sZW5ndGgmJnRoaXMucmcoKX07CmVCLnByb3RvdHlwZS5yZz1mdW5jdGlvbigpe3RoaXMuc3YmJih0aGlzLnUuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnVDKSx0aGlzLnN2PSExKX07ZUIuaGE9VGMoe1Y6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGVCKG1kKExvKSl9LEw6ZUIsWToicm9vdCJ9KTtuZXcgZGQ7bmV3IGZkO3ZhciBmQj1mdW5jdGlvbihhLGIpe3RoaXMuTWI9YTt0aGlzLmdyPXt0b3A6IiIsbGVmdDoiIn07dGhpcy5McT0hMTt0aGlzLnU9Yn07ZkIucHJvdG90eXBlLmNiPWZ1bmN0aW9uKCl7fTtmQi5wcm90b3R5cGUuZW5hYmxlPWZ1bmN0aW9uKCl7aWYodGhpcy5ISigpKXt2YXIgYT10aGlzLnUuZG9jdW1lbnRFbGVtZW50O3RoaXMuanI9YUIodGhpcy5NYik7dGhpcy5nci5sZWZ0PWEuc3R5bGUubGVmdHx8IiI7dGhpcy5nci50b3A9YS5zdHlsZS50b3B8fCIiO2Euc3R5bGUubGVmdD11eigtdGhpcy5qci5sZWZ0KTthLnN0eWxlLnRvcD11eigtdGhpcy5qci50b3ApO2EuY2xhc3NMaXN0LmFkZCgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpO3RoaXMuTHE9ITB9fTsKZkIucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXtpZih0aGlzLkxxKXt2YXIgYT10aGlzLnUuZG9jdW1lbnRFbGVtZW50LGI9YS5zdHlsZSxjPXRoaXMudS5ib2R5LnN0eWxlLGQ9Yi5qcHx8IiIsZT1jLmpwfHwiIjt0aGlzLkxxPSExO2IubGVmdD10aGlzLmdyLmxlZnQ7Yi50b3A9dGhpcy5nci50b3A7YS5jbGFzc0xpc3QucmVtb3ZlKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIik7Yi5qcD1jLmpwPSJhdXRvIjt3aW5kb3cuc2Nyb2xsKHRoaXMuanIubGVmdCx0aGlzLmpyLnRvcCk7Yi5qcD1kO2MuanA9ZX19O2ZCLnByb3RvdHlwZS5ISj1mdW5jdGlvbigpe2lmKHRoaXMudS5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIil8fHRoaXMuTHEpcmV0dXJuITE7dmFyIGE9dGhpcy51LmJvZHksYj0kQSh0aGlzLk1iKTtyZXR1cm4gYS5zY3JvbGxIZWlnaHQ+Yi5oZWlnaHR8fGEuc2Nyb2xsV2lkdGg+Yi53aWR0aH07ZnVuY3Rpb24gZ0IoKXtyZXR1cm4gRXJyb3IoIlNjcm9sbCBzdHJhdGVneSBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkLiIpfTt2YXIgaEI9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpczt0aGlzLkRoPWE7dGhpcy5TPWI7dGhpcy5NYj1jO3RoaXMuVz1kO3RoaXMuc2U9bnVsbDt0aGlzLnJnPWZ1bmN0aW9uKCl7ZS5kaXNhYmxlKCk7ZS5zLm9jKCkmJmUuUy5nYShmdW5jdGlvbigpe3JldHVybiBlLnMuZGV0YWNoKCl9KX19O2hCLnByb3RvdHlwZS5jYj1mdW5jdGlvbihhKXtpZih0aGlzLnMpdGhyb3cgZ0IoKTt0aGlzLnM9YX07aEIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuc2Upe3ZhciBiPVdBKHRoaXMuRGgsMCk7dGhpcy5XJiZ0aGlzLlcudGhyZXNob2xkJiYxPHRoaXMuVy50aHJlc2hvbGQ/KHRoaXMud0w9YUIodGhpcy5NYikudG9wLHRoaXMuc2U9Yi5zdWJzY3JpYmUoZnVuY3Rpb24oKXt2YXIgYz1hQihhLk1iKS50b3A7TWF0aC5hYnMoYy1hLndMKT5hLlcudGhyZXNob2xkP2EucmcoKTphLnMuamcoKX0pKTp0aGlzLnNlPWIuc3Vic2NyaWJlKHRoaXMucmcpfX07CmhCLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKCl7dGhpcy5zZSYmKHRoaXMuc2UudW5zdWJzY3JpYmUoKSx0aGlzLnNlPW51bGwpfTtoQi5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlKCk7dGhpcy5zPW51bGx9O3ZhciBpQj1mdW5jdGlvbigpe307aUIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe307aUIucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt9O2lCLnByb3RvdHlwZS5jYj1mdW5jdGlvbigpe307ZnVuY3Rpb24gakIoYSxiKXtyZXR1cm4gYi5zb21lKGZ1bmN0aW9uKGMpe3ZhciBkPWEudG9wPmMuYm90dG9tLGU9YS5yaWdodDxjLmxlZnQsZj1hLmxlZnQ+Yy5yaWdodDtyZXR1cm4gYS5ib3R0b208Yy50b3B8fGR8fGV8fGZ9KX1mdW5jdGlvbiBrQihhLGIpe3JldHVybiBiLnNvbWUoZnVuY3Rpb24oYyl7dmFyIGQ9YS5ib3R0b20+Yy5ib3R0b20sZT1hLmxlZnQ8Yy5sZWZ0LGY9YS5yaWdodD5jLnJpZ2h0O3JldHVybiBhLnRvcDxjLnRvcHx8ZHx8ZXx8Zn0pfTt2YXIgbEI9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5EaD1hO3RoaXMuTWI9Yjt0aGlzLlM9Yzt0aGlzLlc9ZDt0aGlzLnNlPW51bGx9O2xCLnByb3RvdHlwZS5jYj1mdW5jdGlvbihhKXtpZih0aGlzLnMpdGhyb3cgZ0IoKTt0aGlzLnM9YX07bEIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5zZXx8KHRoaXMuc2U9V0EodGhpcy5EaCx0aGlzLlc/dGhpcy5XLmVSOjApLnN1YnNjcmliZShmdW5jdGlvbigpe2Eucy5qZygpO2lmKGEuVyYmYS5XLm9TKXt2YXIgYj1hLnMuemkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0kQShhLk1iKSxkPWMud2lkdGg7Yz1jLmhlaWdodDtqQihiLFt7d2lkdGg6ZCxoZWlnaHQ6Yyxib3R0b206YyxyaWdodDpkLHRvcDowLGxlZnQ6MH1dKSYmKGEuZGlzYWJsZSgpLGEuUy5nYShmdW5jdGlvbigpe3JldHVybiBhLnMuZGV0YWNoKCl9KSl9fSkpfTsKbEIucHJvdG90eXBlLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLnNlJiYodGhpcy5zZS51bnN1YnNjcmliZSgpLHRoaXMuc2U9bnVsbCl9O2xCLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGUoKTt0aGlzLnM9bnVsbH07dmFyIG1CPWZ1bmN0aW9uKCl7fSxuQj1mdW5jdGlvbigpe307dmFyIG9CPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXM7dGhpcy5EaD1hO3RoaXMuTWI9Yjt0aGlzLlM9Yzt0aGlzLmNsb3NlPWZ1bmN0aW9uKGYpe3JldHVybiBuZXcgaEIoZS5EaCxlLlMsZS5NYixmKX07dGhpcy5ibG9jaz1mdW5jdGlvbigpe3JldHVybiBuZXcgZkIoZS5NYixlLnUpfTt0aGlzLmx0PWZ1bmN0aW9uKGYpe3JldHVybiBuZXcgbEIoZS5EaCxlLk1iLGUuUyxmKX07dGhpcy51PWR9O29CLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvQihtZChWQSksbWQoWkEpLG1kKFQpLG1kKExvKSl9LEw6b0IsWToicm9vdCJ9KTt2YXIgcEI9ZnVuY3Rpb24oYSl7dGhpcy5lZz1uZXcgaUI7dGhpcy5yYj0iIjt0aGlzLnBjPSExO3RoaXMueGM9ImNkay1vdmVybGF5LWRhcmstYmFja2Ryb3AiO3RoaXMuckY9ITE7aWYoYSl7dmFyIGI9T2JqZWN0LmtleXMoYSk7Yj1uKGIpO2Zvcih2YXIgYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpYz1jLnZhbHVlLHZvaWQgMCE9PWFbY10mJih0aGlzW2NdPWFbY10pfX07dmFyIHFCPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7dmFyIG09dGhpczt0aGlzLlNkPWE7dGhpcy5jYz1iO3RoaXMuR2I9Yzt0aGlzLlc9ZDt0aGlzLlM9ZTt0aGlzLmRuPWY7dGhpcy51PWc7dGhpcy5qaj1sO3RoaXMuVWU9bnVsbDt0aGlzLmh1PW5ldyBZaDt0aGlzLmd1PW5ldyBZaDt0aGlzLm5oPW5ldyBZaDt0aGlzLkV2PU1oLkVNUFRZO3RoaXMuc0E9ZnVuY3Rpb24ocCl7cmV0dXJuIG0uaHUubmV4dChwKX07dGhpcy5QcT1uZXcgWWg7ZC5lZyYmKHRoaXMudmQ9ZC5lZyx0aGlzLnZkLmNiKHRoaXMpKTt0aGlzLndnPWQuTWV9O2g9cUIucHJvdG90eXBlOwpoLmNiPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT10aGlzLlNkLmNiKGEpOyF0aGlzLmNjLnBhcmVudEVsZW1lbnQmJnRoaXMuaHImJnRoaXMuaHIuYXBwZW5kQ2hpbGQodGhpcy5jYyk7dGhpcy53ZyYmdGhpcy53Zy5jYih0aGlzKTt0aGlzLmhPKCk7dGhpcy5pRSgpO3RoaXMuaEUoKTt0aGlzLnZkJiZ0aGlzLnZkLmVuYWJsZSgpOyRoKHRoaXMuUy5yZikuYihnbCgpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtiLm9jKCkmJmIuamcoKX0pO3RoaXMuWEQoITApO3RoaXMuVy5wYyYmdGhpcy5rSigpO3RoaXMuVy5yYiYmdGhpcy5Hcih0aGlzLkdiLHRoaXMuVy5yYiwhMCk7dGhpcy5ndS5uZXh0KCk7dGhpcy5kbi5hZGQodGhpcyk7dGhpcy5XLnJGJiZ0aGlzLmpqJiYodGhpcy5Fdj10aGlzLmpqLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBiLiRiKCl9KSk7cmV0dXJuIGF9OwpoLmRldGFjaD1mdW5jdGlvbigpe2lmKHRoaXMub2MoKSl7ckIodGhpcyk7dGhpcy5YRCghMSk7dGhpcy53ZyYmdGhpcy53Zy5kZXRhY2gmJnRoaXMud2cuZGV0YWNoKCk7dGhpcy52ZCYmdGhpcy52ZC5kaXNhYmxlKCk7dmFyIGE9dGhpcy5TZC5kZXRhY2goKTt0aGlzLm5oLm5leHQoKTt0aGlzLmRuLnJlbW92ZSh0aGlzKTt0aGlzLnVLKCk7dGhpcy5Fdi51bnN1YnNjcmliZSgpO3JldHVybiBhfX07CmguJGI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9jKCk7dGhpcy53ZyYmdGhpcy53Zy4kYigpO3RoaXMuQUsoKTtyQih0aGlzKTt0aGlzLkV2LnVuc3Vic2NyaWJlKCk7dGhpcy5kbi5yZW1vdmUodGhpcyk7dGhpcy5TZC4kYigpO3RoaXMuZ3UuY29tcGxldGUoKTt0aGlzLmh1LmNvbXBsZXRlKCk7dGhpcy5QcS5jb21wbGV0ZSgpO3RoaXMuY2MmJnRoaXMuY2MucGFyZW50Tm9kZSYmKHRoaXMuY2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNjKSx0aGlzLmNjPW51bGwpO3RoaXMuaHI9dGhpcy5HYj1udWxsO2EmJnRoaXMubmgubmV4dCgpO3RoaXMubmguY29tcGxldGUoKX07aC5vYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLlNkLm9jKCl9O2guUGY9ZnVuY3Rpb24oKXtyZXR1cm4gJGgodGhpcy5odSl9O2guRm89ZnVuY3Rpb24oKXtyZXR1cm4gJGgodGhpcy5QcSl9O2guamc9ZnVuY3Rpb24oKXt0aGlzLndnJiZ0aGlzLndnLmFwcGx5KCl9OwpoLkVrPWZ1bmN0aW9uKGEpe3RoaXMuVz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5XKSxhKTt0aGlzLmlFKCl9O2guc2V0RGlyZWN0aW9uPWZ1bmN0aW9uKGEpe3RoaXMuVz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5XKSx7ZGlyZWN0aW9uOmF9KTt0aGlzLmhFKCl9O3ZhciBzQj1mdW5jdGlvbihhKXtyZXR1cm4oYT1hLlcuZGlyZWN0aW9uKT8ic3RyaW5nIj09PXR5cGVvZiBhP2E6YS52YWx1ZToibHRyIn07aD1xQi5wcm90b3R5cGU7aC5oRT1mdW5jdGlvbigpe3RoaXMuY2Muc2V0QXR0cmlidXRlKCJkaXIiLHNCKHRoaXMpKX07CmguaUU9ZnVuY3Rpb24oKXtpZih0aGlzLkdiKXt2YXIgYT10aGlzLkdiLnN0eWxlO2Eud2lkdGg9dXoodGhpcy5XLndpZHRoKTthLmhlaWdodD11eih0aGlzLlcuaGVpZ2h0KTthLm1pbldpZHRoPXV6KHRoaXMuVy5taW5XaWR0aCk7YS5taW5IZWlnaHQ9dXoodGhpcy5XLm1pbkhlaWdodCk7YS5tYXhXaWR0aD11eih0aGlzLlcubWF4V2lkdGgpO2EubWF4SGVpZ2h0PXV6KHRoaXMuVy5tYXhIZWlnaHQpfX07aC5YRD1mdW5jdGlvbihhKXt0aGlzLkdiLnN0eWxlLnBvaW50ZXJFdmVudHM9YT8iYXV0byI6Im5vbmUifTsKaC5rSj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5VZT10aGlzLnUuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5VZS5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1iYWNrZHJvcCIpO3RoaXMuVy54YyYmdGhpcy5Hcih0aGlzLlVlLHRoaXMuVy54YywhMCk7dGhpcy5jYy5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLlVlLHRoaXMuY2MpO3RoaXMuVWUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuc0EpOyJ1bmRlZmluZWQiIT09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT90aGlzLlMub2EoZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLlVlJiZhLlVlLmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmciKX0pfSk6dGhpcy5VZS5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIil9O2guaE89ZnVuY3Rpb24oKXt0aGlzLmNjLm5leHRTaWJsaW5nJiZ0aGlzLmNjLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jYyl9Owp2YXIgckI9ZnVuY3Rpb24oYSl7dmFyIGI9YS5VZTtpZihiKXt2YXIgYz1mdW5jdGlvbigpe2ImJihiLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixhLnNBKSxiLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLGMpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTthLlVlPT1iJiYoYS5VZT1udWxsKTthLlcueGMmJmEuR3IoYixhLlcueGMsITEpO2NsZWFyVGltZW91dChkKX07Yi5jbGFzc0xpc3QucmVtb3ZlKCJjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIik7YS5TLm9hKGZ1bmN0aW9uKCl7Yi5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixjKX0pO2Iuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSI7dmFyIGQ9YS5TLm9hKGZ1bmN0aW9uKCl7cmV0dXJuIHNldFRpbWVvdXQoYyw1MDApfSl9fTsKcUIucHJvdG90eXBlLkdyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNsYXNzTGlzdDsoQXJyYXkuaXNBcnJheShiKT9iOltiXSkuZm9yRWFjaChmdW5jdGlvbihlKXtlJiYoYz9kLmFkZChlKTpkLnJlbW92ZShlKSl9KX07cUIucHJvdG90eXBlLnVLPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLlMub2EoZnVuY3Rpb24oKXt2YXIgYj0kaChhLlMucmYpLmIoUmwoWWooYS5ndSxhLm5oKSkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuR2ImJmEuY2MmJjAhPT1hLkdiLmNoaWxkcmVuLmxlbmd0aHx8KGEuR2ImJmEuVy5yYiYmYS5HcihhLkdiLGEuVy5yYiwhMSksYS5jYyYmYS5jYy5wYXJlbnRFbGVtZW50JiYoYS5ocj1hLmNjLnBhcmVudEVsZW1lbnQsYS5oci5yZW1vdmVDaGlsZChhLmNjKSksYi51bnN1YnNjcmliZSgpKX0pfSl9O3FCLnByb3RvdHlwZS5BSz1mdW5jdGlvbigpe3ZhciBhPXRoaXMudmQ7YSYmKGEuZGlzYWJsZSgpLGEuZGV0YWNoJiZhLmRldGFjaCgpKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocUIucHJvdG90eXBlLHt6aTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9fSxWZjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2N9fX0pO3ZhciB0Qj1mdW5jdGlvbihhLGIpe3RoaXMuZkY9YTt0aGlzLmZSPWJ9O2Z1bmN0aW9uIHVCKGEsYil7aWYoInRvcCIhPT1iJiYiYm90dG9tIiE9PWImJiJjZW50ZXIiIT09Yil0aHJvdyBFcnJvcigiQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgIithKycgIicrYisnIi4gRXhwZWN0ZWQgInRvcCIsICJib3R0b20iIG9yICJjZW50ZXIiLicpO31mdW5jdGlvbiB2QihhLGIpe2lmKCJzdGFydCIhPT1iJiYiZW5kIiE9PWImJiJjZW50ZXIiIT09Yil0aHJvdyBFcnJvcigiQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgIithKycgIicrYisnIi4gRXhwZWN0ZWQgInN0YXJ0IiwgImVuZCIgb3IgImNlbnRlciIuJyk7fTt2YXIgd0I9LyhbQS1aYS16JV0rKSQvLHlCPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5NYj1iO3RoaXMudT1jO3RoaXMuZWE9ZDt0aGlzLm5qPWU7dGhpcy5lbj17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy50aD0hMTt0aGlzLnpBPSEwO3RoaXMuZmo9ITE7dGhpcy5CcT0hMDt0aGlzLmZ3PSExO3RoaXMueGQ9MDt0aGlzLkNEPVtdO3RoaXMudGw9W107dGhpcy5kcj1uZXcgWWg7dGhpcy5ydz1NaC5FTVBUWTt0aGlzLnBkPXRoaXMuUnY9MDt0aGlzLlpwPVtdO3RoaXMuZHo9JGgodGhpcy5kcik7eEIodGhpcyxhKX07CnlCLnByb3RvdHlwZS5jYj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKHRoaXMucyYmYSE9PXRoaXMucyl0aHJvdyBFcnJvcigiVGhpcyBwb3NpdGlvbiBzdHJhdGVneSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIG92ZXJsYXkiKTt0aGlzLnRFKCk7YS5WZi5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94Iik7dGhpcy5zPWE7dGhpcy5Oaz1hLlZmO3RoaXMuR2I9YS56aTt0aGlzLm9kPSExO3RoaXMuZGw9ITA7dGhpcy5pbD1udWxsO3RoaXMucncudW5zdWJzY3JpYmUoKTt0aGlzLnJ3PXRoaXMuTWIuUWEoKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtiLmRsPSEwO2IuYXBwbHkoKX0pfTsKeUIucHJvdG90eXBlLmFwcGx5PWZ1bmN0aW9uKCl7aWYoIXRoaXMub2QmJnRoaXMuZWEueWEpaWYoIXRoaXMuZGwmJnRoaXMuZncmJnRoaXMuaWwpe2lmKCF0aGlzLm9kJiYoIXRoaXMuZWF8fHRoaXMuZWEueWEpKXt0aGlzLlp2PXRoaXMuVXUoKTt0aGlzLnpoPXRoaXMuR2IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5Lcj10aGlzLkdCKCk7dmFyIGE9dGhpcy5pbHx8dGhpcy50bFswXSxiPXRoaXMuSEIodGhpcy5adixhKTt0aGlzLiRwKGEsYil9fWVsc2V7dGhpcy5IQSgpO3RoaXMud0QoKTt0aGlzLlZNKCk7dGhpcy5Lcj10aGlzLkdCKCk7dGhpcy5adj10aGlzLlV1KCk7dGhpcy56aD10aGlzLkdiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2I9dGhpcy5adjt2YXIgYz10aGlzLnpoLGQ9dGhpcy5LcjthPVtdO2Zvcih2YXIgZSxmPW4odGhpcy50bCksZz1mLm5leHQoKTshZy5kb25lO2c9Zi5uZXh0KCkpe2c9Zy52YWx1ZTt2YXIgbD10aGlzLkhCKGIsZyksbT10aGlzLld1KGwsCmMsZykscD10aGlzLiRLKG0sYyxkLGcpO2lmKHAuZ1Epe3RoaXMudGg9ITE7dGhpcy4kcChnLGwpO3JldHVybn1pZih0aGlzLklKKHAsbSxkKSlhLnB1c2goe3Bvc2l0aW9uOmcsb3JpZ2luOmwsTFE6YyxSRTp0aGlzLnhBKGwsZyl9KTtlbHNlIGlmKCFlfHxlLkpRLndJPHAud0kpZT17SlE6cCxIUzptLEdROmwscG9zaXRpb246ZyxMUTpjfX1pZihhLmxlbmd0aCl7Yj1udWxsO2M9LTE7YT1uKGEpO2ZvcihkPWEubmV4dCgpOyFkLmRvbmU7ZD1hLm5leHQoKSlkPWQudmFsdWUsZT1kLlJFLndpZHRoKmQuUkUuaGVpZ2h0KihkLnBvc2l0aW9uLndlaWdodHx8MSksZT5jJiYoYz1lLGI9ZCk7dGhpcy50aD0hMTt0aGlzLiRwKGIucG9zaXRpb24sYi5vcmlnaW4pfWVsc2UgdGhpcy56QSYmKHRoaXMudGg9ITApLHRoaXMuJHAoZS5wb3NpdGlvbixlLkdRKX19O3lCLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLkhBKCk7dGhpcy5pcj10aGlzLmlsPW51bGw7dGhpcy5ydy51bnN1YnNjcmliZSgpfTsKeUIucHJvdG90eXBlLiRiPWZ1bmN0aW9uKCl7dGhpcy5vZHx8KHRoaXMuTmsmJnpCKHRoaXMuTmsuc3R5bGUse3RvcDoiIixsZWZ0OiIiLHJpZ2h0OiIiLGJvdHRvbToiIixoZWlnaHQ6IiIsd2lkdGg6IiIsYWxpZ25JdGVtczoiIixqdXN0aWZ5Q29udGVudDoiIn0pLHRoaXMuR2ImJnRoaXMud0QoKSx0aGlzLnMmJnRoaXMucy5WZi5jbGFzc0xpc3QucmVtb3ZlKCJjZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94IiksdGhpcy5kZXRhY2goKSx0aGlzLmRyLmNvbXBsZXRlKCksdGhpcy5zPXRoaXMuTms9bnVsbCx0aGlzLm9kPSEwKX07CnZhciBBQj1mdW5jdGlvbihhLGIpe2EuQ0Q9YjtyZXR1cm4gYX0sQkI9ZnVuY3Rpb24oYSxiKXthLnRsPWI7LTE9PT1iLmluZGV4T2YoYS5pbCkmJihhLmlsPW51bGwpO2EudEUoKTtyZXR1cm4gYX0sQ0I9ZnVuY3Rpb24oYSxiKXthLnhkPWI7cmV0dXJuIGF9LERCPWZ1bmN0aW9uKGEsYil7YS5CcT12b2lkIDA9PT1iPyEwOmI7cmV0dXJuIGF9LEVCPWZ1bmN0aW9uKGEsYil7YS5maj12b2lkIDA9PT1iPyEwOmI7cmV0dXJuIGF9LEZCPWZ1bmN0aW9uKGEsYil7YS56QT12b2lkIDA9PT1iPyEwOmI7cmV0dXJuIGF9LEdCPWZ1bmN0aW9uKGEsYil7YS5mdz12b2lkIDA9PT1iPyEwOmI7cmV0dXJuIGF9LHhCPWZ1bmN0aW9uKGEsYil7YS5LZj1iO3JldHVybiBhfSxIQj1mdW5jdGlvbihhLGIpe2EuWUQ9YjtyZXR1cm4gYX07aD15Qi5wcm90b3R5cGU7CmguSEI9ZnVuY3Rpb24oYSxiKXtpZigiY2VudGVyIj09Yi5oYyl2YXIgYz1hLmxlZnQrYS53aWR0aC8yO2Vsc2V7Yz10aGlzLnJlKCk/YS5yaWdodDphLmxlZnQ7dmFyIGQ9dGhpcy5yZSgpP2EubGVmdDphLnJpZ2h0O2M9InN0YXJ0Ij09Yi5oYz9jOmR9cmV0dXJue3g6Yyx5OiJjZW50ZXIiPT1iLmljP2EudG9wK2EuaGVpZ2h0LzI6InRvcCI9PWIuaWM/YS50b3A6YS5ib3R0b219fTtoLld1PWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iY2VudGVyIj09Yy5BYT8tYi53aWR0aC8yOiJzdGFydCI9PT1jLkFhP3RoaXMucmUoKT8tYi53aWR0aDowOnRoaXMucmUoKT8wOi1iLndpZHRoO3JldHVybnt4OmEueCtkLHk6YS55KygiY2VudGVyIj09Yy5YYT8tYi5oZWlnaHQvMjoidG9wIj09Yy5YYT8wOi1iLmhlaWdodCl9fTsKaC4kSz1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1hLng7YT1hLnk7dmFyIGY9dGhpcy55cShkLCJ4Iik7ZD10aGlzLnlxKGQsInkiKTtmJiYoZSs9Zik7ZCYmKGErPWQpO2Q9MC1hO2E9YStiLmhlaWdodC1jLmhlaWdodDtjPXRoaXMuUkQoYi53aWR0aCwwLWUsZStiLndpZHRoLWMud2lkdGgpO2U9dGhpcy5SRChiLmhlaWdodCxkLGEpO2E9YyplO3JldHVybnt3STphLGdROmIud2lkdGgqYi5oZWlnaHQ9PT1hLElQOmU9PT1iLmhlaWdodCxIUDpjPT1iLndpZHRofX07aC5JSj1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5CcSl7dmFyIGQ9Yy5ib3R0b20tYi55O2M9Yy5yaWdodC1iLng7Yj1JQih0aGlzLnMuVy5taW5IZWlnaHQpO3ZhciBlPUlCKHRoaXMucy5XLm1pbldpZHRoKTtjPWEuSFB8fG51bGwhPWUmJmU8PWM7cmV0dXJuKGEuSVB8fG51bGwhPWImJmI8PWQpJiZjfXJldHVybiExfTsKaC5rRD1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5pciYmdGhpcy5mdylyZXR1cm57eDphLngrdGhpcy5pci54LHk6YS55K3RoaXMuaXIueX07dmFyIGQ9dGhpcy5LcixlPU1hdGgubWF4KGEueCtiLndpZHRoLWQucmlnaHQsMCksZj1NYXRoLm1heChhLnkrYi5oZWlnaHQtZC5ib3R0b20sMCksZz1NYXRoLm1heChkLnRvcC1jLnRvcC1hLnksMCksbD1NYXRoLm1heChkLmxlZnQtYy5sZWZ0LWEueCwwKTtlPWIud2lkdGg8PWQud2lkdGg/bHx8LWU6YS54PHRoaXMueGQ/ZC5sZWZ0LWMubGVmdC1hLng6MDtiPWIuaGVpZ2h0PD1kLmhlaWdodD9nfHwtZjphLnk8dGhpcy54ZD9kLnRvcC1jLnRvcC1hLnk6MDt0aGlzLmlyPXt4OmUseTpifTtyZXR1cm57eDphLngrZSx5OmEueStifX07CmguJHA9ZnVuY3Rpb24oYSxiKXt0aGlzLnJOKGEpO3RoaXMubk4oYixhKTt0aGlzLmhOKGIsYSk7YS5yYiYmdGhpcy5VSShhLnJiKTt0aGlzLmlsPWE7dGhpcy5kci5hZy5sZW5ndGgmJihiPXRoaXMuZUwoKSx0aGlzLmRyLm5leHQobmV3IHRCKGEsYikpKTt0aGlzLmRsPSExfTtoLnJOPWZ1bmN0aW9uKGEpe2lmKHRoaXMuWUQpe3ZhciBiPXRoaXMuTmsucXVlcnlTZWxlY3RvckFsbCh0aGlzLllEKSxjPWEuWGE7YT0iY2VudGVyIj09PWEuQWE/ImNlbnRlciI6dGhpcy5yZSgpPyJzdGFydCI9PT1hLkFhPyJyaWdodCI6ImxlZnQiOiJzdGFydCI9PT1hLkFhPyJsZWZ0IjoicmlnaHQiO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF0uc3R5bGUudHJhbnNmb3JtT3JpZ2luPWErIiAiK2N9fTsKaC54QT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuS3IsZD10aGlzLnJlKCk7aWYoInRvcCI9PT1iLlhhKXt2YXIgZT1hLnk7dmFyIGY9Yy5oZWlnaHQtZSt0aGlzLnhkfWVsc2UgaWYoImJvdHRvbSI9PT1iLlhhKXt2YXIgZz1jLmhlaWdodC1hLnkrMip0aGlzLnhkO2Y9Yy5oZWlnaHQtZyt0aGlzLnhkfWVsc2V7ZT1NYXRoLm1pbihjLmJvdHRvbS1hLnkrYy50b3AsYS55KTt2YXIgbD10aGlzLmVuLmhlaWdodDtmPTIqZTtlPWEueS1lO2Y+bCYmIXRoaXMuZGwmJiF0aGlzLmZqJiYoZT1hLnktbC8yKX1sPSJzdGFydCI9PT1iLkFhJiYhZHx8ImVuZCI9PT1iLkFhJiZkO2lmKCJlbmQiPT09Yi5BYSYmIWR8fCJzdGFydCI9PT1iLkFhJiZkKXt2YXIgbT1jLndpZHRoLWEueCt0aGlzLnhkO2I9YS54LXRoaXMueGR9ZWxzZSBpZihsKXt2YXIgcD1hLng7Yj1jLnJpZ2h0LWEueH1lbHNlIHA9TWF0aC5taW4oYy5yaWdodC1hLngrYy5sZWZ0LGEueCksYz10aGlzLmVuLndpZHRoLGI9MipwLHA9CmEueC1wLGI+YyYmIXRoaXMuZGwmJiF0aGlzLmZqJiYocD1hLngtYy8yKTtyZXR1cm57dG9wOmUsbGVmdDpwLGJvdHRvbTpnLHJpZ2h0Om0sd2lkdGg6YixoZWlnaHQ6Zn19OwpoLmhOPWZ1bmN0aW9uKGEsYil7YT10aGlzLnhBKGEsYik7dGhpcy5kbHx8dGhpcy5manx8KGEuaGVpZ2h0PU1hdGgubWluKGEuaGVpZ2h0LHRoaXMuZW4uaGVpZ2h0KSxhLndpZHRoPU1hdGgubWluKGEud2lkdGgsdGhpcy5lbi53aWR0aCkpO3ZhciBjPXt9O2lmKHRoaXMuVEIoKSljLnRvcD1jLmxlZnQ9IjAiLGMuYm90dG9tPWMucmlnaHQ9Yy5tYXhIZWlnaHQ9Yy5tYXhXaWR0aD0iIixjLndpZHRoPWMuaGVpZ2h0PSIxMDAlIjtlbHNle3ZhciBkPXRoaXMucy5XLm1heEhlaWdodCxlPXRoaXMucy5XLm1heFdpZHRoO2MuaGVpZ2h0PXV6KGEuaGVpZ2h0KTtjLnRvcD11eihhLnRvcCk7Yy5ib3R0b209dXooYS5ib3R0b20pO2Mud2lkdGg9dXooYS53aWR0aCk7Yy5sZWZ0PXV6KGEubGVmdCk7Yy5yaWdodD11eihhLnJpZ2h0KTtjLmFsaWduSXRlbXM9ImNlbnRlciI9PT1iLkFhPyJjZW50ZXIiOiJlbmQiPT09Yi5BYT8iZmxleC1lbmQiOiJmbGV4LXN0YXJ0IjtjLmp1c3RpZnlDb250ZW50PQoiY2VudGVyIj09PWIuWGE/ImNlbnRlciI6ImJvdHRvbSI9PT1iLlhhPyJmbGV4LWVuZCI6ImZsZXgtc3RhcnQiO2QmJihjLm1heEhlaWdodD11eihkKSk7ZSYmKGMubWF4V2lkdGg9dXooZSkpfXRoaXMuZW49YTt6Qih0aGlzLk5rLnN0eWxlLGMpfTtoLlZNPWZ1bmN0aW9uKCl7ekIodGhpcy5Oay5zdHlsZSx7dG9wOiIwIixsZWZ0OiIwIixyaWdodDoiMCIsYm90dG9tOiIwIixoZWlnaHQ6IiIsd2lkdGg6IiIsYWxpZ25JdGVtczoiIixqdXN0aWZ5Q29udGVudDoiIn0pfTtoLndEPWZ1bmN0aW9uKCl7ekIodGhpcy5HYi5zdHlsZSx7dG9wOiIiLGxlZnQ6IiIsYm90dG9tOiIiLHJpZ2h0OiIiLHBvc2l0aW9uOiIiLHRyYW5zZm9ybToiIn0pfTsKaC5uTj1mdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9dGhpcy5UQigpLGU9dGhpcy5CcSxmPXRoaXMucy5XO2lmKGQpe3ZhciBnPWFCKHRoaXMuTWIpO3pCKGMsdGhpcy5WSyhiLGEsZykpO3pCKGMsdGhpcy5VSyhiLGEsZykpfWVsc2UgYy5wb3NpdGlvbj0ic3RhdGljIjthPSIiO2c9dGhpcy55cShiLCJ4Iik7Yj10aGlzLnlxKGIsInkiKTtnJiYoYSs9InRyYW5zbGF0ZVgoIitnKyJweCkgIik7YiYmKGErPSJ0cmFuc2xhdGVZKCIrYisicHgpIik7Yy50cmFuc2Zvcm09YS50cmltKCk7Zi5tYXhIZWlnaHQmJihkP2MubWF4SGVpZ2h0PXV6KGYubWF4SGVpZ2h0KTplJiYoYy5tYXhIZWlnaHQ9IiIpKTtmLm1heFdpZHRoJiYoZD9jLm1heFdpZHRoPXV6KGYubWF4V2lkdGgpOmUmJihjLm1heFdpZHRoPSIiKSk7ekIodGhpcy5HYi5zdHlsZSxjKX07CmguVks9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt0b3A6IiIsYm90dG9tOiIifTtiPXRoaXMuV3UoYix0aGlzLnpoLGEpO3RoaXMudGgmJihiPXRoaXMua0QoYix0aGlzLnpoLGMpKTtjPWRCKHRoaXMubmopLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtiLnktPWM7ImJvdHRvbSI9PT1hLlhhP2QuYm90dG9tPXRoaXMudS5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LShiLnkrdGhpcy56aC5oZWlnaHQpKyJweCI6ZC50b3A9dXooYi55KTtyZXR1cm4gZH07CmguVUs9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXtsZWZ0OiIiLHJpZ2h0OiIifTtiPXRoaXMuV3UoYix0aGlzLnpoLGEpO3RoaXMudGgmJihiPXRoaXMua0QoYix0aGlzLnpoLGMpKTsicmlnaHQiPT09KHRoaXMucmUoKT8iZW5kIj09PWEuQWE/ImxlZnQiOiJyaWdodCI6ImVuZCI9PT1hLkFhPyJyaWdodCI6ImxlZnQiKT9kLnJpZ2h0PXRoaXMudS5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgtKGIueCt0aGlzLnpoLndpZHRoKSsicHgiOmQubGVmdD11eihiLngpO3JldHVybiBkfTtoLmVMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5VdSgpLGI9dGhpcy5HYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPXRoaXMuQ0QubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkLlVmLmkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KTtyZXR1cm57eVM6a0IoYSxjKSx6UzpqQihhLGMpLGxROmtCKGIsYyksQVM6akIoYixjKX19OwpoLlJEPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0xXT1hcmd1bWVudHNbZF07cmV0dXJuIGMucmVkdWNlKGZ1bmN0aW9uKGUsZil7cmV0dXJuIGUtTWF0aC5tYXgoZiwwKX0sYSl9O2guR0I9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnUuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGI9dGhpcy51LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsYz1hQih0aGlzLk1iKTtyZXR1cm57dG9wOmMudG9wK3RoaXMueGQsbGVmdDpjLmxlZnQrdGhpcy54ZCxyaWdodDpjLmxlZnQrYS10aGlzLnhkLGJvdHRvbTpjLnRvcCtiLXRoaXMueGQsd2lkdGg6YS0yKnRoaXMueGQsaGVpZ2h0OmItMip0aGlzLnhkfX07aC5yZT1mdW5jdGlvbigpe3JldHVybiJydGwiPT09c0IodGhpcy5zKX07aC5UQj1mdW5jdGlvbigpe3JldHVybiF0aGlzLkJxfHx0aGlzLnRofTsKaC55cT1mdW5jdGlvbihhLGIpe3JldHVybiJ4Ij09PWI/bnVsbD09YS5vZmZzZXRYP3RoaXMuUnY6YS5vZmZzZXRYOm51bGw9PWEub2Zmc2V0WT90aGlzLnBkOmEub2Zmc2V0WX07aC50RT1mdW5jdGlvbigpe2lmKCF0aGlzLnRsLmxlbmd0aCl0aHJvdyBFcnJvcigiRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5OiBBdCBsZWFzdCBvbmUgcG9zaXRpb24gaXMgcmVxdWlyZWQuIik7dGhpcy50bC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZCKCJvcmlnaW5YIixhLmhjKTt1Qigib3JpZ2luWSIsYS5pYyk7dkIoIm92ZXJsYXlYIixhLkFhKTt1Qigib3ZlcmxheVkiLGEuWGEpfSl9O2guVUk9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLkdiJiYoQXJyYXkuaXNBcnJheShhKT9hOlthXSkuZm9yRWFjaChmdW5jdGlvbihjKXsiIiE9PWMmJi0xPT09Yi5acC5pbmRleE9mKGMpJiYoYi5acC5wdXNoKGMpLGIuR2IuY2xhc3NMaXN0LmFkZChjKSl9KX07CmguSEE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuR2ImJih0aGlzLlpwLmZvckVhY2goZnVuY3Rpb24oYil7YS5HYi5jbGFzc0xpc3QucmVtb3ZlKGIpfSksdGhpcy5acD1bXSl9O2guVXU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLktmO2lmKGEgaW5zdGFuY2VvZiB6KXJldHVybiBhLmkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoYSBpbnN0YW5jZW9mIEVsZW1lbnQpcmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGI9YS53aWR0aHx8MCxjPWEuaGVpZ2h0fHwwO3JldHVybnt0b3A6YS55LGJvdHRvbTphLnkrYyxsZWZ0OmEueCxyaWdodDphLngrYixoZWlnaHQ6Yyx3aWR0aDpifX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh5Qi5wcm90b3R5cGUse2FwOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50bH19fSk7CmZ1bmN0aW9uIHpCKGEsYil7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmKGFbY109YltjXSl9ZnVuY3Rpb24gSUIoYSl7aWYoIm51bWJlciIhPT10eXBlb2YgYSYmbnVsbCE9YSl7dmFyIGI9bihhLnNwbGl0KHdCKSk7YT1iLm5leHQoKS52YWx1ZTtyZXR1cm4oYj1iLm5leHQoKS52YWx1ZSkmJiJweCIhPT1iP251bGw6cGFyc2VGbG9hdChhKX1yZXR1cm4gYXx8bnVsbH07dmFyIEpCPWZ1bmN0aW9uKCl7dGhpcy5sSz0ic3RhdGljIjt0aGlzLmN2PXRoaXMuSmg9dGhpcy51aD10aGlzLlRwPXRoaXMudHc9dGhpcy5Bdj10aGlzLmp1PXRoaXMuV3c9IiJ9O2g9SkIucHJvdG90eXBlO2guY2I9ZnVuY3Rpb24oYSl7dmFyIGI9YS5XO3RoaXMucz1hO3RoaXMuSmgmJiFiLndpZHRoJiZhLkVrKHt3aWR0aDp0aGlzLkpofSk7dGhpcy5jdiYmIWIuaGVpZ2h0JiZhLkVrKHtoZWlnaHQ6dGhpcy5jdn0pO2EuVmYuY2xhc3NMaXN0LmFkZCgiY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXIiKTt0aGlzLm9kPSExfTtoLnRvcD1mdW5jdGlvbihhKXt0aGlzLmp1PSIiO3RoaXMuV3c9dm9pZCAwPT09YT8iIjphO3RoaXMuVHA9ImZsZXgtc3RhcnQiO3JldHVybiB0aGlzfTtoLmxlZnQ9ZnVuY3Rpb24oYSl7dGhpcy50dz0iIjt0aGlzLkF2PXZvaWQgMD09PWE/IiI6YTt0aGlzLnVoPSJmbGV4LXN0YXJ0IjtyZXR1cm4gdGhpc307CmguYm90dG9tPWZ1bmN0aW9uKGEpe3RoaXMuV3c9IiI7dGhpcy5qdT12b2lkIDA9PT1hPyIiOmE7dGhpcy5UcD0iZmxleC1lbmQiO3JldHVybiB0aGlzfTtoLnJpZ2h0PWZ1bmN0aW9uKGEpe3RoaXMuQXY9IiI7dGhpcy50dz12b2lkIDA9PT1hPyIiOmE7dGhpcy51aD0iZmxleC1lbmQiO3JldHVybiB0aGlzfTtoLndpZHRoPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8iIjphO3RoaXMucz90aGlzLnMuRWsoe3dpZHRoOmF9KTp0aGlzLkpoPWE7cmV0dXJuIHRoaXN9O2guaGVpZ2h0PWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8iIjphO3RoaXMucz90aGlzLnMuRWsoe2hlaWdodDphfSk6dGhpcy5jdj1hO3JldHVybiB0aGlzfTsKaC5hcHBseT1mdW5jdGlvbigpe2lmKHRoaXMucyYmdGhpcy5zLm9jKCkpe3ZhciBhPXRoaXMucy56aS5zdHlsZSxiPXRoaXMucy5WZi5zdHlsZSxjPXRoaXMucy5XLGQ9Yy53aWR0aCxlPWMuaGVpZ2h0LGY9Yy5tYXhXaWR0aDtjPWMubWF4SGVpZ2h0O2Q9KCIxMDAlIj09PWR8fCIxMDB2dyI9PT1kKSYmKCFmfHwiMTAwJSI9PT1mfHwiMTAwdnciPT09Zik7ZT0oIjEwMCUiPT09ZXx8IjEwMHZoIj09PWUpJiYoIWN8fCIxMDAlIj09PWN8fCIxMDB2aCI9PT1jKTthLnBvc2l0aW9uPXRoaXMubEs7YS5tYXJnaW5MZWZ0PWQ/IjAiOnRoaXMuQXY7YS5tYXJnaW5Ub3A9ZT8iMCI6dGhpcy5XdzthLm1hcmdpbkJvdHRvbT10aGlzLmp1O2EubWFyZ2luUmlnaHQ9dGhpcy50dztkP2IuanVzdGlmeUNvbnRlbnQ9ImZsZXgtc3RhcnQiOiJjZW50ZXIiPT09dGhpcy51aD9iLmp1c3RpZnlDb250ZW50PSJjZW50ZXIiOiJydGwiPT09dGhpcy5zLlcuZGlyZWN0aW9uPyJmbGV4LXN0YXJ0Ij09PXRoaXMudWg/CmIuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIjoiZmxleC1lbmQiPT09dGhpcy51aCYmKGIuanVzdGlmeUNvbnRlbnQ9ImZsZXgtc3RhcnQiKTpiLmp1c3RpZnlDb250ZW50PXRoaXMudWg7Yi5hbGlnbkl0ZW1zPWU/ImZsZXgtc3RhcnQiOnRoaXMuVHB9fTtoLiRiPWZ1bmN0aW9uKCl7aWYoIXRoaXMub2QmJnRoaXMucyl7dmFyIGE9dGhpcy5zLnppLnN0eWxlLGI9dGhpcy5zLlZmLGM9Yi5zdHlsZTtiLmNsYXNzTGlzdC5yZW1vdmUoImNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyIik7Yy5qdXN0aWZ5Q29udGVudD1jLmFsaWduSXRlbXM9YS5tYXJnaW5Ub3A9YS5tYXJnaW5Cb3R0b209YS5tYXJnaW5MZWZ0PWEubWFyZ2luUmlnaHQ9YS5wb3NpdGlvbj0iIjt0aGlzLnM9bnVsbDt0aGlzLm9kPSEwfX07dmFyIEtCPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuTWI9YTt0aGlzLnU9Yjt0aGlzLmVhPWM7dGhpcy5uaj1kfTtLQi5wcm90b3R5cGUuZ2xvYmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBKQn07dmFyIExCPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyB5QihiLGEuTWIsYS51LGEuZWEsYS5uail9O0tCLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLQihtZChaQSksbWQoTG8pLG1kKE56KSxtZChjQikpfSxMOktCLFk6InJvb3QifSk7ZnVuY3Rpb24gTUIoKXt0aHJvdyBFcnJvcigiSG9zdCBhbHJlYWR5IGhhcyBhIHBvcnRhbCBhdHRhY2hlZCIpO307dmFyIE5CPWZ1bmN0aW9uKCl7fTtOQi5wcm90b3R5cGUuY2I9ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggYSBwb3J0YWwgdG8gYSBudWxsIFBvcnRhbE91dGxldCIpO2Eub2MoKSYmTUIoKTt0aGlzLk1tPWE7cmV0dXJuIGEuY2IodGhpcyl9O05CLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1tO2lmKG51bGw9PWEpdGhyb3cgRXJyb3IoIkF0dGVtcHRpbmcgdG8gZGV0YWNoIGEgcG9ydGFsIHRoYXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgaG9zdCIpO3RoaXMuTW09bnVsbDthLmRldGFjaCgpfTt2YXIgT0I9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5hPWE7dGhpcy5rYz1iO3RoaXMuWj1jO3RoaXMuV249ZH07dChPQixOQik7dmFyIFBCPWZ1bmN0aW9uKGEsYixjKXt0aGlzLkFrPWE7dGhpcy5rYz1iO3RoaXMuY29udGV4dD1jfTt0KFBCLE5CKTsKUEIucHJvdG90eXBlLmNiPWZ1bmN0aW9uKGEsYil7dGhpcy5jb250ZXh0PWI9dm9pZCAwPT09Yj90aGlzLmNvbnRleHQ6YjtyZXR1cm4gTkIucHJvdG90eXBlLmNiLmNhbGwodGhpcyxhKX07UEIucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuY29udGV4dD12b2lkIDA7cmV0dXJuIE5CLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhQQi5wcm90b3R5cGUse29yaWdpbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWsuVWZ9fX0pO3ZhciBRQj1mdW5jdGlvbigpe3RoaXMub2Q9ITF9O2g9UUIucHJvdG90eXBlO2gub2M9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuRmZ9OwpoLmNiPWZ1bmN0aW9uKGEpe2lmKCFhKXRocm93IEVycm9yKCJNdXN0IHByb3ZpZGUgYSBwb3J0YWwgdG8gYXR0YWNoIik7dGhpcy5vYygpJiZNQigpO2lmKHRoaXMub2QpdGhyb3cgRXJyb3IoIlRoaXMgUG9ydGFsT3V0bGV0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQiKTtpZihhIGluc3RhbmNlb2YgT0IpcmV0dXJuIHRoaXMuRmY9YSx0aGlzLk1oKGEpO2lmKGEgaW5zdGFuY2VvZiBQQilyZXR1cm4gdGhpcy5GZj1hLHRoaXMuTmgoYSk7dGhyb3cgRXJyb3IoIkF0dGVtcHRpbmcgdG8gYXR0YWNoIGFuIHVua25vd24gUG9ydGFsIHR5cGUuIEJhc2VQb3J0YWxPdXRsZXQgYWNjZXB0cyBlaXRoZXIgYSBDb21wb25lbnRQb3J0YWwgb3IgYSBUZW1wbGF0ZVBvcnRhbC4iKTt9O2guZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5GZiYmKHRoaXMuRmY9dGhpcy5GZi5NbT1udWxsKTt0aGlzLm5DKCl9OwpoLiRiPWZ1bmN0aW9uKCl7dGhpcy5vYygpJiZ0aGlzLmRldGFjaCgpO3RoaXMubkMoKTt0aGlzLm9kPSEwfTtoLnJwPWZ1bmN0aW9uKGEpe3RoaXMuRXU9YX07aC5uQz1mdW5jdGlvbigpe3RoaXMuRXUmJih0aGlzLkV1KCksdGhpcy5FdT1udWxsKX07dmFyIFJCPWZ1bmN0aW9uKGEsYixjLGQsZSl7dGhpcy5vZD0hMTt0aGlzLlhvPWE7dGhpcy5WaT1iO3RoaXMuVGU9Yzt0aGlzLnFLPWQ7dGhpcy51PWV9O3QoUkIsUUIpO1JCLnByb3RvdHlwZS5NaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9V2UoYS5Xbnx8dGhpcy5WaSxhLmEpO2lmKGEua2Mpe3ZhciBkPVhnKGEua2MsYyxhLmtjLmxlbmd0aCxhLlp8fGEua2MuWik7dGhpcy5ycChmdW5jdGlvbigpe3JldHVybiBkLmRlc3Ryb3koKX0pfWVsc2UgZD1jLmNyZWF0ZShhLlp8fHRoaXMucUspLGptKHRoaXMuVGUsZC5kaSksdGhpcy5ycChmdW5jdGlvbigpe3ZhciBlPWQuZGk7WmcoYi5UZS54aixlKTskZyhlKTtkLmRlc3Ryb3koKX0pO3RoaXMuWG8uYXBwZW5kQ2hpbGQodGhpcy5USyhkKSk7cmV0dXJuIGR9OwpSQi5wcm90b3R5cGUuTmg9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEua2MsZD1jLkljKGEuQWssYS5jb250ZXh0KTtkLkxnKCk7ZC5wei5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBiLlhvLmFwcGVuZENoaWxkKGUpfSk7dGhpcy5ycChmdW5jdGlvbigpe3ZhciBlPWMuaW5kZXhPZihkKTstMSE9PWUmJmMucmVtb3ZlKGUpfSk7cmV0dXJuIGR9O1JCLnByb3RvdHlwZS4kYj1mdW5jdGlvbigpe1FCLnByb3RvdHlwZS4kYi5jYWxsKHRoaXMpO251bGwhPXRoaXMuWG8ucGFyZW50Tm9kZSYmdGhpcy5Yby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuWG8pfTtSQi5wcm90b3R5cGUuVEs9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGkucHpbMF19O3ZhciBTQj1mdW5jdGlvbihhLGIsYyl7dGhpcy5vZD0hMTt0aGlzLlZpPWE7dGhpcy56Yj1iO3RoaXMuc2g9ITE7dGhpcy5QRT1uZXcgcms7dGhpcy51PWN9O3QoU0IsUUIpO2g9U0IucHJvdG90eXBlO2guT2I9ZnVuY3Rpb24oKXt0aGlzLnNoPSEwfTtoLlg9ZnVuY3Rpb24oKXtRQi5wcm90b3R5cGUuJGIuY2FsbCh0aGlzKTt0aGlzLnFBPXRoaXMuRmY9bnVsbH07aC5NaD1mdW5jdGlvbihhKXthLk1tPXRoaXM7dmFyIGI9bnVsbCE9YS5rYz9hLmtjOnRoaXMuemIsYz1XZShhLldufHx0aGlzLlZpLGEuYSksZD1YZyhiLGMsYi5sZW5ndGgsYS5afHxiLlopO2IhPT10aGlzLnpiJiZ0aGlzLmRMKCkuYXBwZW5kQ2hpbGQoZC5kaS5welswXSk7UUIucHJvdG90eXBlLnJwLmNhbGwodGhpcyxmdW5jdGlvbigpe3JldHVybiBkLmRlc3Ryb3koKX0pO3RoaXMuRmY9YTt0aGlzLnFBPWQ7dGhpcy5QRS5lbWl0KGQpO3JldHVybiBkfTsKaC5OaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2EuTW09dGhpczt2YXIgYz10aGlzLnpiLkljKGEuQWssYS5jb250ZXh0KTtRQi5wcm90b3R5cGUucnAuY2FsbCh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGIuemIuY2xlYXIoKX0pO3RoaXMuRmY9YTt0aGlzLnFBPWM7dGhpcy5QRS5lbWl0KGMpO3JldHVybiBjfTtoLmRMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy56Yi5lbGVtZW50Lmk7cmV0dXJuIGEubm9kZVR5cGU9PT1hLkVMRU1FTlRfTk9ERT9hOmEucGFyZW50Tm9kZX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTQi5wcm90b3R5cGUse2N6Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZn0sc2V0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLm9jKCl8fGF8fHRoaXMuc2gpdGhpcy5vYygpJiZRQi5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksYSYmUUIucHJvdG90eXBlLmNiLmNhbGwodGhpcyxhKSx0aGlzLkZmPWF9fX0pOwp2YXIgVEI9ZnVuY3Rpb24oKXt9O3ZhciBVQj1mdW5jdGlvbihhLGIpe3RoaXMudk09YTt0aGlzLm1LPWJ9O1VCLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLm1LLmdldChhKTtyZXR1cm4idW5kZWZpbmVkIiE9PXR5cGVvZiBjP2M6dGhpcy52TS5nZXQoYSxiKX07dmFyIFZCPTAsV0I9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsLG0scCl7dGhpcy5scD1hO3RoaXMubmo9Yjt0aGlzLlZpPWM7dGhpcy5BTT1kO3RoaXMuZG49ZTt0aGlzLlVjPWY7dGhpcy5TPWc7dGhpcy51PWw7dGhpcy53Sz1tO3RoaXMuamo9cH07aD1XQi5wcm90b3R5cGU7aC5jcmVhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jSygpLGM9dGhpcy5nSyhiKSxkPXRoaXMuaEsoYyk7YT1uZXcgcEIoYSk7YS5kaXJlY3Rpb249YS5kaXJlY3Rpb258fHRoaXMud0sudmFsdWU7cmV0dXJuIG5ldyBxQihkLGIsYyxhLHRoaXMuUyx0aGlzLmRuLHRoaXMudSx0aGlzLmpqKX07aC5wb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkFNfTtoLmdLPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudS5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPSJjZGstb3ZlcmxheS0iK1ZCKys7Yi5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1wYW5lIik7YS5hcHBlbmRDaGlsZChiKTtyZXR1cm4gYn07CmguY0s9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnUuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZEIodGhpcy5uaikuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIGF9O2guaEs9ZnVuY3Rpb24oYSl7dGhpcy5UZXx8KHRoaXMuVGU9dGhpcy5VYy5nZXQoZm0pKTtyZXR1cm4gbmV3IFJCKGEsdGhpcy5WaSx0aGlzLlRlLHRoaXMuVWMsdGhpcy51KX07dmFyIFhCPVt7aGM6InN0YXJ0IixpYzoiYm90dG9tIixBYToic3RhcnQiLFhhOiJ0b3AifSx7aGM6InN0YXJ0IixpYzoidG9wIixBYToic3RhcnQiLFhhOiJib3R0b20ifSx7aGM6ImVuZCIsaWM6InRvcCIsQWE6ImVuZCIsWGE6ImJvdHRvbSJ9LHtoYzoiZW5kIixpYzoiYm90dG9tIixBYToiZW5kIixYYToidG9wIn1dLFlCPW5ldyB5KCJjZGstY29ubmVjdGVkLW92ZXJsYXktc2Nyb2xsLXN0cmF0ZWd5IiksWkI9ZnVuY3Rpb24oYSl7dGhpcy5VZj1hfSwkQj1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMudGQ9YTt0aGlzLkdhPWU7dGhpcy5qRD10aGlzLnhCPXRoaXMuZmo9dGhpcy5BQz10aGlzLlltPSExO3RoaXMuY3E9TWguRU1QVFk7dGhpcy5HUj0wO3RoaXMub3Blbj0hMTt0aGlzLlBmPW5ldyByazt0aGlzLm9IPW5ldyByazt0aGlzLmNiPW5ldyByazt0aGlzLmRldGFjaD1uZXcgcms7dGhpcy5LUT1uZXcgcms7dGhpcy5HTj1uZXcgUEIoYixjKTt0aGlzLnh3PWQ7dGhpcy5lZz10aGlzLnh3KCl9OwpoPSRCLnByb3RvdHlwZTtoLlg9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMucy4kYigpO3RoaXMuY3EudW5zdWJzY3JpYmUoKX07aC5TYT1mdW5jdGlvbihhKXt0aGlzLm1jJiYodGhpcy5Kcih0aGlzLm1jKSx0aGlzLnMuRWsoe3dpZHRoOnRoaXMud2lkdGgsbWluV2lkdGg6dGhpcy5taW5XaWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHQsbWluSGVpZ2h0OnRoaXMubWluSGVpZ2h0fSksYS5vcmlnaW4mJnRoaXMub3BlbiYmdGhpcy5tYy5hcHBseSgpKTthLm9wZW4mJih0aGlzLm9wZW4/dGhpcy5uSigpOnRoaXMuVUEoKSl9O2gub2c9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYXAmJnRoaXMuYXAubGVuZ3RofHwodGhpcy5hcD1YQik7dGhpcy5zPXRoaXMudGQuY3JlYXRlKHRoaXMueEooKSk7dGhpcy5zLkZvKCkuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2EuS1EubmV4dChiKTsyNyE9PWIua2V5Q29kZXx8c0EoYil8fChiLnByZXZlbnREZWZhdWx0KCksYS5VQSgpKX0pfTsKaC54Sj1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWM9dGhpcy5NZXx8dGhpcy5pSygpO2E9bmV3IHBCKHtkaXJlY3Rpb246dGhpcy5HYSxNZTphLGVnOnRoaXMuZWcscGM6dGhpcy5wY30pO2lmKHRoaXMud2lkdGh8fDA9PT10aGlzLndpZHRoKWEud2lkdGg9dGhpcy53aWR0aDtpZih0aGlzLmhlaWdodHx8MD09PXRoaXMuaGVpZ2h0KWEuaGVpZ2h0PXRoaXMuaGVpZ2h0O2lmKHRoaXMubWluV2lkdGh8fDA9PT10aGlzLm1pbldpZHRoKWEubWluV2lkdGg9dGhpcy5taW5XaWR0aDtpZih0aGlzLm1pbkhlaWdodHx8MD09PXRoaXMubWluSGVpZ2h0KWEubWluSGVpZ2h0PXRoaXMubWluSGVpZ2h0O3RoaXMueGMmJihhLnhjPXRoaXMueGMpO3RoaXMucmImJihhLnJiPXRoaXMucmIpO3JldHVybiBhfTsKaC5Kcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5hcC5tYXAoZnVuY3Rpb24oZCl7cmV0dXJue2hjOmQuaGMsaWM6ZC5pYyxBYTpkLkFhLFhhOmQuWGEsb2Zmc2V0WDpkLm9mZnNldFh8fGIub2Zmc2V0WCxvZmZzZXRZOmQub2Zmc2V0WXx8Yi5vZmZzZXRZLHJiOmQucmJ8fHZvaWQgMH19KTtyZXR1cm4gSEIoR0IoQ0IoRUIoRkIoREIoQkIoeEIoYSx0aGlzLm9yaWdpbi5VZiksYyksdGhpcy5MUCksdGhpcy5wdXNoKSx0aGlzLlVQKSx0aGlzLkdSKSx0aGlzLnJHKSx0aGlzLlVTKX07aC5pSz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1MQih0aGlzLnRkLnBvc2l0aW9uKCksdGhpcy5vcmlnaW4uVWYpO3RoaXMuSnIoYik7Yi5kei5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7cmV0dXJuIGEub0guZW1pdChjKX0pO3JldHVybiBifTsKaC5uSj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5zP3RoaXMucy5XLnBjPXRoaXMucGM6dGhpcy5vZygpO3RoaXMucy5vYygpfHwodGhpcy5zLmNiKHRoaXMuR04pLHRoaXMuY2IuZW1pdCgpKTt0aGlzLnBjP3RoaXMuY3E9dGhpcy5zLlBmKCkuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2EuUGYuZW1pdChiKX0pOnRoaXMuY3EudW5zdWJzY3JpYmUoKX07aC5VQT1mdW5jdGlvbigpe3RoaXMucyYmKHRoaXMucy5kZXRhY2goKSx0aGlzLmRldGFjaC5lbWl0KCkpO3RoaXMuY3EudW5zdWJzY3JpYmUoKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoJEIucHJvdG90eXBlLHtvZmZzZXRYOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Sdn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuUnY9YTt0aGlzLm1jJiZ0aGlzLkpyKHRoaXMubWMpfX0sb2Zmc2V0WTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGR9LHNldDpmdW5jdGlvbihhKXt0aGlzLnBkPWE7dGhpcy5tYyYmdGhpcy5Kcih0aGlzLm1jKX19LHBjOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZbX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuWW09dHooYSl9fSxyRzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQUN9LHNldDpmdW5jdGlvbihhKXt0aGlzLkFDPXR6KGEpfX0sTFA6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54Qn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMueEI9dHooYSl9fSxVUDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmp9LHNldDpmdW5jdGlvbihhKXt0aGlzLmZqPXR6KGEpfX0scHVzaDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuakR9LHNldDpmdW5jdGlvbihhKXt0aGlzLmpEPXR6KGEpfX0sWW86e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fSxkaXI6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhP3RoaXMuR2EudmFsdWU6Imx0ciJ9fX0pO2Z1bmN0aW9uIGFDKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmxwLmx0KCl9fTt2YXIgYkM9ZnVuY3Rpb24oKXt9O3ZhciBjQz1Heih7cGFzc2l2ZTohMH0pLGRDPWZ1bmN0aW9uKGEsYil7dGhpcy5lYT1hO3RoaXMuUz1iO3RoaXMuam49bmV3IE1hcH07CmRDLnByb3RvdHlwZS5VZz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKCF0aGlzLmVhLnlhKXJldHVybiBiaTt2YXIgYz12eihhKTtpZihhPXRoaXMuam4uZ2V0KGMpKXJldHVybiAkaChhLnpmKTt2YXIgZD1uZXcgWWgsZT1mdW5jdGlvbihmKXsiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQiIT09Zi5hbmltYXRpb25OYW1lfHxjLmNsYXNzTGlzdC5jb250YWlucygiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpPyJjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQiPT09Zi5hbmltYXRpb25OYW1lJiZjLmNsYXNzTGlzdC5jb250YWlucygiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpJiYoYy5jbGFzc0xpc3QucmVtb3ZlKCJjZGstdGV4dC1maWVsZC1hdXRvZmlsbGVkIiksYi5TLmdhKGZ1bmN0aW9uKCl7cmV0dXJuIGQubmV4dCh7dGFyZ2V0OmYudGFyZ2V0LGRHOiExfSl9KSk6KGMuY2xhc3NMaXN0LmFkZCgiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpLGIuUy5nYShmdW5jdGlvbigpe3JldHVybiBkLm5leHQoe3RhcmdldDpmLnRhcmdldCwKZEc6ITB9KX0pKX07dGhpcy5TLm9hKGZ1bmN0aW9uKCl7Yy5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsZSxjQyk7Yy5jbGFzc0xpc3QuYWRkKCJjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQiKX0pO3RoaXMuam4uc2V0KGMse3pmOmQsQlI6ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixlLGNDKX19KTtyZXR1cm4gJGgoZCl9O2RDLnByb3RvdHlwZS55Zj1mdW5jdGlvbihhKXthPXZ6KGEpO3ZhciBiPXRoaXMuam4uZ2V0KGEpO2ImJihiLkJSKCksYi56Zi5jb21wbGV0ZSgpLGEuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkIiksYS5jbGFzc0xpc3QucmVtb3ZlKCJjZGstdGV4dC1maWVsZC1hdXRvZmlsbGVkIiksdGhpcy5qbi5kZWxldGUoYSkpfTtkQy5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5qbi5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEueWYoYyl9KX07CmRDLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBkQyhtZChOeiksbWQoVCkpfSxMOmRDLFk6InJvb3QifSk7dmFyIGVDPWZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBmQyhhLGIpe3ZhciBjPWZ1bmN0aW9uKGQpe2Zvcih2YXIgZT1bXSxmPTA7Zjxhcmd1bWVudHMubGVuZ3RoOysrZillW2YtMF09YXJndW1lbnRzW2ZdO2U9YS5hcHBseSh0aGlzLFtdLmNvbmNhdChqYShlKSkpfHx0aGlzO2UuY29sb3I9YjtyZXR1cm4gZX07dChjLGEpO2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYy5wcm90b3R5cGUse2NvbG9yOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ua30sc2V0OmZ1bmN0aW9uKGQpe2Q9ZHx8YjtkIT09dGhpcy5UayYmKHRoaXMuVGsmJnRoaXMubS5pLmNsYXNzTGlzdC5yZW1vdmUoIm1hdC0iK3RoaXMuVGspLGQmJnRoaXMubS5pLmNsYXNzTGlzdC5hZGQoIm1hdC0iK2QpLHRoaXMuVGs9ZCl9fX0pO3JldHVybiBjfTt2YXIgZ0M9bmV3IGpmLGhDPW5ldyBqZixpQz1uZXcgeSgibWF0LXNhbml0eS1jaGVja3MiLHtZOiJyb290IixWOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSksakM9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuU0I9ITE7dGhpcy51PWM7YS5rQSgpO3RoaXMueWw9Yjt0aGlzLlNCfHwodGhpcy5MSigpLHRoaXMuUUooKSx0aGlzLktKKCksdGhpcy5TQj0hMCl9O2g9akMucHJvdG90eXBlO2guTmQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnV8fGRvY3VtZW50O3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJmE/YTpudWxsfTtoLlBkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5OZCgpO2E9KG51bGw9PT1hfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmRlZmF1bHRWaWV3KXx8d2luZG93O3JldHVybiJvYmplY3QiPT09dHlwZW9mIGEmJmE/YTpudWxsfTtoLnR1PWZ1bmN0aW9uKCl7cmV0dXJuIEdkKCkmJiF0aGlzLkpMKCl9OwpoLkpMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5QZCgpO3JldHVybiBhJiYoYS5OSXx8YS5tUSl9O2guTEo9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR1KCkmJighMD09PXRoaXMueWx8fHRoaXMueWwuZG9jdHlwZSksYj10aGlzLk5kKCk7YSYmYiYmIWIuZG9jdHlwZSYmY29uc29sZS53YXJuKCJDdXJyZW50IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBkb2N0eXBlLiBUaGlzIG1heSBjYXVzZSBzb21lIEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cyBub3QgdG8gYmVoYXZlIGFzIGV4cGVjdGVkLiIpfTsKaC5RSj1mdW5jdGlvbigpe3ZhciBhPSF0aGlzLnR1KCl8fCExPT09dGhpcy55bHx8IXRoaXMueWwudGhlbWUsYj10aGlzLk5kKCk7aWYoIWEmJmImJmIuYm9keSYmImZ1bmN0aW9uIj09PXR5cGVvZiBnZXRDb21wdXRlZFN0eWxlKXthPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5jbGFzc0xpc3QuYWRkKCJtYXQtdGhlbWUtbG9hZGVkLW1hcmtlciIpO2IuYm9keS5hcHBlbmRDaGlsZChhKTt2YXIgYz1nZXRDb21wdXRlZFN0eWxlKGEpO2MmJiJub25lIiE9PWMuZGlzcGxheSYmY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBBbmd1bGFyIE1hdGVyaWFsIGNvcmUgdGhlbWUuIE1vc3QgTWF0ZXJpYWwgY29tcG9uZW50cyBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIEZvciBtb3JlIGluZm8gcmVmZXIgdG8gdGhlIHRoZW1pbmcgZ3VpZGU6IGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nIik7Yi5ib2R5LnJlbW92ZUNoaWxkKGEpfX07CmguS0o9ZnVuY3Rpb24oKXt0aGlzLnR1KCkmJighMD09PXRoaXMueWx8fHRoaXMueWwudmVyc2lvbikmJmhDLm9vIT09Z0Mub28mJmNvbnNvbGUud2FybigiVGhlIEFuZ3VsYXIgTWF0ZXJpYWwgdmVyc2lvbiAoIitoQy5vbysiKSBkb2VzIG5vdCBtYXRjaCB0aGUgQW5ndWxhciBDREsgdmVyc2lvbiAoIitnQy5vbysiKS5cblBsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb25zIG9mIHRoZXNlIHR3byBwYWNrYWdlcyBleGFjdGx5IG1hdGNoLiIpfTtmdW5jdGlvbiBrQyhhKXt2YXIgYj1mdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlLTBdPWFyZ3VtZW50c1tlXTtkPWEuYXBwbHkodGhpcyxbXS5jb25jYXQoamEoZCkpKXx8dGhpcztkLllBPSExO3JldHVybiBkfTt0KGIsYSk7ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhiLnByb3RvdHlwZSx7SWo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllBfSxzZXQ6ZnVuY3Rpb24oYyl7dGhpcy5ZQT10eihjKX19fSk7cmV0dXJuIGJ9O2Z1bmN0aW9uIGxDKGEpe3ZhciBiPWZ1bmN0aW9uKGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoOysrZSlkW2UtMF09YXJndW1lbnRzW2VdO2Q9YS5hcHBseSh0aGlzLFtdLmNvbmNhdChqYShkKSkpfHx0aGlzO2QuT2E9ITE7cmV0dXJuIGR9O3QoYixhKTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGIucHJvdG90eXBlLHtkaXNhYmxlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2F9LHNldDpmdW5jdGlvbihjKXt0aGlzLk9hPXR6KGMpfX19KTtyZXR1cm4gYn07ZnVuY3Rpb24gbUMoYSl7dmFyIGI9ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZS0wXT1hcmd1bWVudHNbZV07ZD1hLmFwcGx5KHRoaXMsW10uY29uY2F0KGphKGQpKSl8fHRoaXM7ZC5mYT0hMTtkLndiPW5ldyBZaDtyZXR1cm4gZH07dChiLGEpO2IucHJvdG90eXBlLnBJPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5xYz90aGlzLnFjLmNvbnRyb2w6bnVsbDt2YXIgZD10aGlzLldDfHx0aGlzLlZDO2M9ISEoYyYmYy5KcyYmKGMuaGh8fGQmJmQuYkkpKTtjIT09dGhpcy5mYSYmKHRoaXMuZmE9Yyx0aGlzLndiLm5leHQoKSl9O3JldHVybiBifTtmdW5jdGlvbiBuQyhhKXt2YXIgYj12b2lkIDA9PT1iPzA6Yjt2YXIgYz1mdW5jdGlvbihkKXtmb3IodmFyIGU9W10sZj0wO2Y8YXJndW1lbnRzLmxlbmd0aDsrK2YpZVtmLTBdPWFyZ3VtZW50c1tmXTtlPWEuYXBwbHkodGhpcyxbXS5jb25jYXQoamEoZSkpKXx8dGhpcztlLlNEPWI7cmV0dXJuIGV9O3QoYyxhKTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGMucHJvdG90eXBlLHt0YWJJbmRleDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/LTE6dGhpcy5TRH0sc2V0OmZ1bmN0aW9uKGQpe3RoaXMuU0Q9bnVsbCE9ZD9kOmJ9fX0pO3JldHVybiBjfTtmb3IodmFyIG9DPUFycmF5KDMxKSxwQz0wOzMxPnBDO3BDKyspb0NbcENdPVN0cmluZyhwQysxKTt2YXIgcUM9ZnVuY3Rpb24oKXt9O3FDLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxQ30sTDpxQyxZOiJyb290In0pO3ZhciByQz1uZXcgeSgibWF0LWxhYmVsLWdsb2JhbC1vcHRpb25zIik7dmFyIHNDPWxDKGZ1bmN0aW9uKCl7fSksdEM9MCx1Qz1mdW5jdGlvbigpe3ZhciBhPXNDLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpczthLnh2PSJtYXQtb3B0Z3JvdXAtbGFiZWwtIit0QysrO3JldHVybiBhfTt0KHVDLHNDKTt2YXIgdkM9MCx3Qz1mdW5jdGlvbihhLGIpe3RoaXMuc291cmNlPWE7dGhpcy5sRz12b2lkIDA9PT1iPyExOmJ9LHhDPW5ldyB5KCJNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQiKSx5Qz1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLmthPWE7dGhpcy5jYT1iO3RoaXMuJD1jO3RoaXMuZ3JvdXA9ZDt0aGlzLk9hPXRoaXMuSG09dGhpcy5tYj0hMTt0aGlzLkhDPSIiO3RoaXMuaWQ9Im1hdC1vcHRpb24tIit2QysrO3RoaXMuUEc9bmV3IHJrO3RoaXMueXI9bmV3IFlofTtoPXlDLnByb3RvdHlwZTtoLnNlbGVjdD1mdW5jdGlvbigpe3RoaXMubWJ8fCh0aGlzLm1iPSEwLFlnKHRoaXMuY2EpLHRoaXMuSXUoKSl9O2guU2w9ZnVuY3Rpb24oKXt0aGlzLm1iJiYodGhpcy5tYj0hMSxZZyh0aGlzLmNhKSx0aGlzLkl1KCkpfTtoLmZvY3VzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5PZCgpOyJmdW5jdGlvbiI9PT10eXBlb2YgYy5mb2N1cyYmYy5mb2N1cyhiKX07aC5neT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkhwfTsKaC5IYT1mdW5jdGlvbihhKXsxMyE9PWEua2V5Q29kZSYmMzIhPT1hLmtleUNvZGV8fHNBKGEpfHwodGhpcy52YygpLGEucHJldmVudERlZmF1bHQoKSl9O2gudmM9ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHwodGhpcy5tYj10aGlzLm11bHRpcGxlPyF0aGlzLm1iOiEwLFlnKHRoaXMuY2EpLHRoaXMuSXUoITApKX07aC5xZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGVkfHwodGhpcy5tdWx0aXBsZT8hMTpudWxsKX07aC5UYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkPyItMSI6IjAifTtoLk9kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2EuaX07aC5JRz1mdW5jdGlvbigpe2lmKHRoaXMubWIpe3ZhciBhPXRoaXMuSHA7YSE9PXRoaXMuSEMmJih0aGlzLkhDPWEsdGhpcy55ci5uZXh0KCkpfX07aC5YPWZ1bmN0aW9uKCl7dGhpcy55ci5jb21wbGV0ZSgpfTtoLkl1PWZ1bmN0aW9uKGEpe3RoaXMuUEcuZW1pdChuZXcgd0ModGhpcyx2b2lkIDA9PT1hPyExOmEpKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeUMucHJvdG90eXBlLHttdWx0aXBsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJCYmdGhpcy4kLm11bHRpcGxlfX0sc2VsZWN0ZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1ifX0sZGlzYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdyb3VwJiZ0aGlzLmdyb3VwLmRpc2FibGVkfHx0aGlzLk9hfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5PYT10eihhKX19LElqOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kJiZ0aGlzLiQuSWp9fSxhY3RpdmU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhtfX0sSHA6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5PZCgpLnRleHRDb250ZW50fHwiIikudHJpbSgpfX19KTtmdW5jdGlvbiB6QyhhLGIsYyl7aWYoYy5sZW5ndGgpe2I9Yi5FYy5zbGljZSgpO2M9Yy5FYy5zbGljZSgpO2Zvcih2YXIgZD0wLGU9MDtlPGErMTtlKyspYltlXS5ncm91cCYmYltlXS5ncm91cD09PWNbZF0mJmQrKztyZXR1cm4gZH1yZXR1cm4gMH07dmFyIEFDPWZ1bmN0aW9uKGEsYixjKXt0aGlzLnBhPWE7dGhpcy5lbGVtZW50PWI7dGhpcy56ZD1jO3RoaXMuc3RhdGU9M307dmFyIEJDPXtsczo0NTAsWng6NDAwfSxDQz1Heih7cGFzc2l2ZTohMH0pLERDPVsibW91c2Vkb3duIiwidG91Y2hzdGFydCJdLEVDPVsibW91c2V1cCIsIm1vdXNlbGVhdmUiLCJ0b3VjaGVuZCIsInRvdWNoY2FuY2VsIl0sRkM9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5Fcj1hO3RoaXMuUz1iO3RoaXMuYm49ITE7dGhpcy5RcD1uZXcgU2V0O3RoaXMuZXc9ITE7ZC55YSYmKHRoaXMuVms9dnooYykpfSxJQz1mdW5jdGlvbihhLGIsYyxkKXtkPXZvaWQgMD09PWQ/e306ZDt2YXIgZT1hLkxBPWEuTEF8fGEuVmsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sQkMpLGQuYW5pbWF0aW9uKTtkLlNuJiYoYj1lLmxlZnQrZS53aWR0aC8yLGM9ZS50b3ArZS5oZWlnaHQvMik7dmFyIGc9ZC5jcHx8R0MoYixjLGUpO2ItPWUubGVmdDtjLT1lLnRvcDtmPWYubHM7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTGlzdC5hZGQoIm1hdC1yaXBwbGUtZWxlbWVudCIpOwplLnN0eWxlLmxlZnQ9Yi1nKyJweCI7ZS5zdHlsZS50b3A9Yy1nKyJweCI7ZS5zdHlsZS5oZWlnaHQ9MipnKyJweCI7ZS5zdHlsZS53aWR0aD0yKmcrInB4IjtudWxsIT1kLmNvbG9yJiYoZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZC5jb2xvcik7ZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249ZisibXMiO2EuVmsuYXBwZW5kQ2hpbGQoZSk7d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpO2Uuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxKSI7dmFyIGw9bmV3IEFDKGEsZSxkKTtsLnN0YXRlPTA7YS5RcC5hZGQobCk7ZC5rSHx8KGEuTXY9bCk7YS5BRChmdW5jdGlvbigpe3ZhciBtPWw9PT1hLk12O2wuc3RhdGU9MTtkLmtIfHxtJiZhLmJufHxIQyhsLnBhLGwpfSxmKX0sSEM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLlFwLmRlbGV0ZShiKTtiPT09YS5NdiYmKGEuTXY9bnVsbCk7YS5RcC5zaXplfHwoYS5MQT1udWxsKTtpZihjKXt2YXIgZD0KYi5lbGVtZW50O2M9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LEJDKSxiLnpkLmFuaW1hdGlvbik7ZC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249Yy5aeCsibXMiO2Quc3R5bGUub3BhY2l0eT0iMCI7Yi5zdGF0ZT0yO2EuQUQoZnVuY3Rpb24oKXtiLnN0YXRlPTM7ZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpfSxjLlp4KX19O2g9RkMucHJvdG90eXBlO2guaGFuZGxlRXZlbnQ9ZnVuY3Rpb24oYSl7Im1vdXNlZG93biI9PT1hLnR5cGU/dGhpcy5vTShhKToidG91Y2hzdGFydCI9PT1hLnR5cGU/dGhpcy5yTShhKTp0aGlzLnBNKCk7dGhpcy5ld3x8KHRoaXMubkQoRUMpLHRoaXMuZXc9ITApfTtoLm9NPWZ1bmN0aW9uKGEpe3ZhciBiPTA9PT1hLmJ1dHRvbnMsYz10aGlzLnhDJiZEYXRlLm5vdygpPHRoaXMueEMrODAwO3RoaXMuRXIuekh8fGJ8fGN8fCh0aGlzLmJuPSEwLElDKHRoaXMsYS5jbGllbnRYLGEuY2xpZW50WSx0aGlzLkVyLnlIKSl9OwpoLnJNPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLkVyLnpIKXt0aGlzLnhDPURhdGUubm93KCk7dGhpcy5ibj0hMDthPWEuY2hhbmdlZFRvdWNoZXM7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspSUModGhpcyxhW2JdLmNsaWVudFgsYVtiXS5jbGllbnRZLHRoaXMuRXIueUgpfX07aC5wTT1mdW5jdGlvbigpe3RoaXMuYm4mJih0aGlzLmJuPSExLHRoaXMuUXAuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj0xPT09YS5zdGF0ZXx8YS56ZC5lSSYmMD09PWEuc3RhdGU7IWEuemQua0gmJmImJkhDKGEucGEsYSl9KSl9O2guQUQ9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/MDpiO3RoaXMuUy5vYShmdW5jdGlvbigpe3JldHVybiBzZXRUaW1lb3V0KGEsYil9KX07aC5uRD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuUy5vYShmdW5jdGlvbigpe2EuZm9yRWFjaChmdW5jdGlvbihjKXtiLkVuLmFkZEV2ZW50TGlzdGVuZXIoYyxiLENDKX0pfSl9OwpoLnREPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLkVuJiYoREMuZm9yRWFjaChmdW5jdGlvbihiKXthLkVuLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixhLENDKX0pLHRoaXMuZXcmJkVDLmZvckVhY2goZnVuY3Rpb24oYil7YS5Fbi5yZW1vdmVFdmVudExpc3RlbmVyKGIsYSxDQyl9KSl9O2Z1bmN0aW9uIEdDKGEsYixjKXthPU1hdGgubWF4KE1hdGguYWJzKGEtYy5sZWZ0KSxNYXRoLmFicyhhLWMucmlnaHQpKTtiPU1hdGgubWF4KE1hdGguYWJzKGItYy50b3ApLE1hdGguYWJzKGItYy5ib3R0b20pKTtyZXR1cm4gTWF0aC5zcXJ0KGEqYStiKmIpfTt2YXIgSkM9bmV3IHkoIm1hdC1yaXBwbGUtZ2xvYmFsLW9wdGlvbnMiKSxLQz1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMubT1hO3RoaXMuaWE9ZTt0aGlzLmNwPTA7dGhpcy5zaD10aGlzLk9hPSExO3RoaXMuWXU9ZHx8e307dGhpcy55RD1uZXcgRkModGhpcyxiLGEsYyl9O0tDLnByb3RvdHlwZS5PYj1mdW5jdGlvbigpe3RoaXMuc2g9ITA7dGhpcy5EdygpfTtLQy5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMueUQudEQoKX07S0MucHJvdG90eXBlLkR3PWZ1bmN0aW9uKCl7aWYoIXRoaXMuZGlzYWJsZWQmJnRoaXMuc2gpe3ZhciBhPXRoaXMueUQsYj12eih0aGlzLnRyaWdnZXIpO2ImJmIhPT1hLkVuJiYoYS50RCgpLGEuRW49YixhLm5EKERDKSl9fTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhLQy5wcm90b3R5cGUse2Rpc2FibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuT2E9YTt0aGlzLkR3KCl9fSx0cmlnZ2VyOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TTnx8dGhpcy5tLml9LHNldDpmdW5jdGlvbihhKXt0aGlzLlNOPWE7dGhpcy5EdygpfX0seUg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybntTbjp0aGlzLlNuLGNwOnRoaXMuY3AsY29sb3I6dGhpcy5jb2xvcixhbmltYXRpb246T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5ZdS5hbmltYXRpb24pLCJOb29wQW5pbWF0aW9ucyI9PT10aGlzLmlhP3tsczowLFp4OjB9Ont9KSx0aGlzLmFuaW1hdGlvbiksZUk6dGhpcy5ZdS5lSX19fSwKekg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhIXRoaXMuWXUuZGlzYWJsZWR9fX0pO3ZhciBMQz1mdW5jdGlvbigpe307dmFyIE1DPWZ1bmN0aW9uKGEpe3RoaXMuaWE9YTt0aGlzLnN0YXRlPSJ1bmNoZWNrZWQiO3RoaXMuZGlzYWJsZWQ9ITF9O3ZhciBOQz1mdW5jdGlvbigpe307dmFyIE9DPWZ1bmN0aW9uKCl7fTtuZXcgamY7LyoKCiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQoqLwp2YXIgUEM9Im1hdC1idXR0b24gbWF0LWZsYXQtYnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gbWF0LW1pbmktZmFiIG1hdC1mYWIiLnNwbGl0KCIgIiksUUM9ZkMobEMoa0MoZnVuY3Rpb24oYSl7dGhpcy5tPWF9KSkpLFJDPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1RQy5jYWxsKHRoaXMsYSl8fHRoaXM7ZC52YT1iO2QuaWE9YztkLmtHPWQuYXYoIm1hdC1mYWIiLCJtYXQtbWluaS1mYWIiKTtkLmhHPWQuYXYoIm1hdC1pY29uLWJ1dHRvbiIpO2Zvcih2YXIgZT1uKFBDKSxmPWUubmV4dCgpOyFmLmRvbmU7Zj1lLm5leHQoKSlmPWYudmFsdWUsZC5hdihmKSYmZC5PZCgpLmNsYXNzTGlzdC5hZGQoZik7YS5pLmNsYXNzTGlzdC5hZGQoIm1hdC1idXR0b24tYmFzZSIpO2Qua0cmJihkLmNvbG9yPSJhY2NlbnQiKTtyZXR1cm4gZH07dChSQyxRQyk7aD1SQy5wcm90b3R5cGU7CmguTGM9ZnVuY3Rpb24oKXt0aGlzLnZhLlVnKHRoaXMubSwhMCl9O2guWD1mdW5jdGlvbigpe3RoaXMudmEueWYodGhpcy5tKX07aC5mb2N1cz1mdW5jdGlvbihhLGIpe1N6KHRoaXMudmEsdGhpcy5PZCgpLHZvaWQgMD09PWE/InByb2dyYW0iOmEsYil9O2guT2Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tLml9O2gudXY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Janx8dGhpcy5kaXNhYmxlZH07aC5hdj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTt2YXIgZD10aGlzO3JldHVybiBiLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIGQuT2QoKS5oYXNBdHRyaWJ1dGUoZSl9KX07dmFyIFNDPWZ1bmN0aW9uKCl7fTt2YXIgVEM9Y2coe1Q6MixnOltbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4wNH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH19Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGV9Lm1hdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1idXR0b25bZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LXJhaXNlZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXJhaXNlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtcmFpc2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXJhaXNlZC1idXR0b257dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtc3Ryb2tlZC1idXR0b257Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7cGFkZGluZzowIDE1cHg7bGluZS1oZWlnaHQ6MzRweH0ubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6LTFweDtsZWZ0Oi0xcHg7cmlnaHQ6LTFweDtib3R0b206LTFweH0ubWF0LWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo1NnB4O2hlaWdodDo1NnB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtZmFiW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LWZhYi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjE2cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtbWluaS1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWluaS1mYWJbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jZGstaGlnaC1jb250cmFzdC1ibGFjay1vbi13aGl0ZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH1cbiJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBVQyhhKXtyZXR1cm4gWigyLFtYKDY3MTA4ODY0MCwxLHtPUzowfSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsIm1hdC1idXR0b24td3JhcHBlciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDApLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1idXR0b24tcmlwcGxlIG1hdC1yaXBwbGUiXSxbIm1hdFJpcHBsZSIsIiJdXSxbWzIsIm1hdC1idXR0b24tcmlwcGxlLXJvdW5kIixudWxsXSxbMiwibWF0LXJpcHBsZS11bmJvdW5kZWQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksSSg0LDIxMjk5MixbWzEsNF1dLDAsS0MsW3osVCxOeixbMixKQ10sWzIsa3ZdXSx7U246WzAsImNlbnRlcmVkIl0sZGlzYWJsZWQ6WzEsImRpc2FibGVkIl0sdHJpZ2dlcjpbMiwidHJpZ2dlciJdfSxudWxsKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkiXV0sCm51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsNCwwLGQuaEcsZC51digpLGQuT2QoKSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9ZC5rR3x8ZC5oRyxmPUYoYyw0KS5JdDtiKGMsMywwLGUsZil9KX07dmFyIFZDPWZ1bmN0aW9uKCl7fSxXQz1mdW5jdGlvbigpe30sWEM9ZnVuY3Rpb24oYSl7dGhpcy5pYT1hfTt2YXIgWUM9ZnVuY3Rpb24oKXt9O3ZhciBaQz1jZyh7VDoyLGc6W1siLm1hdC1jYXJke3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzoxNnB4O2JvcmRlci1yYWRpdXM6NHB4fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtY2FyZHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1jYXJkIC5tYXQtZGl2aWRlci1ob3Jpem9udGFse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlfVtkaXI9cnRsXSAubWF0LWNhcmQgLm1hdC1kaXZpZGVyLWhvcml6b250YWx7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1jYXJkIC5tYXQtZGl2aWRlci1ob3Jpem9udGFsLm1hdC1kaXZpZGVyLWluc2V0e3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MH1bZGlyPXJ0bF0gLm1hdC1jYXJkIC5tYXQtZGl2aWRlci1ob3Jpem9udGFsLm1hdC1kaXZpZGVyLWluc2V0e21hcmdpbi1yaWdodDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jYXJke291dGxpbmU6c29saWQgMXB4fS5tYXQtY2FyZC1hY3Rpb25zLC5tYXQtY2FyZC1zdWJ0aXRsZSwubWF0LWNhcmQtY29udGVudHtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MTZweH0ubWF0LWNhcmQtdGl0bGV7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjhweH0ubWF0LWNhcmQtYWN0aW9uc3ttYXJnaW4tbGVmdDotOHB4O21hcmdpbi1yaWdodDotOHB4O3BhZGRpbmc6OHB4IDB9Lm1hdC1jYXJkLWFjdGlvbnMtYWxpZ24tZW5ke2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1jYXJkLWltYWdle3dpZHRoOmNhbGMoMTAwJSArIDMycHgpO21hcmdpbjowIC0xNnB4IDE2cHggLTE2cHh9Lm1hdC1jYXJkLWZvb3RlcntkaXNwbGF5OmJsb2NrO21hcmdpbjowIC0xNnB4IC0xNnB4IC0xNnB4fS5tYXQtY2FyZC1hY3Rpb25zIC5tYXQtYnV0dG9uLC5tYXQtY2FyZC1hY3Rpb25zIC5tYXQtcmFpc2VkLWJ1dHRvbiwubWF0LWNhcmQtYWN0aW9ucyAubWF0LXN0cm9rZWQtYnV0dG9ue21hcmdpbjowIDhweH0ubWF0LWNhcmQtaGVhZGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9Lm1hdC1jYXJkLWhlYWRlciAubWF0LWNhcmQtdGl0bGV7bWFyZ2luLWJvdHRvbToxMnB4fS5tYXQtY2FyZC1oZWFkZXItdGV4dHttYXJnaW46MCAxNnB4fS5tYXQtY2FyZC1hdmF0YXJ7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDtib3JkZXItcmFkaXVzOjUwJTtmbGV4LXNocmluazowO29iamVjdC1maXQ6Y292ZXJ9Lm1hdC1jYXJkLXRpdGxlLWdyb3Vwe2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ubWF0LWNhcmQtc20taW1hZ2V7d2lkdGg6ODBweDtoZWlnaHQ6ODBweH0ubWF0LWNhcmQtbWQtaW1hZ2V7d2lkdGg6MTEycHg7aGVpZ2h0OjExMnB4fS5tYXQtY2FyZC1sZy1pbWFnZXt3aWR0aDoxNTJweDtoZWlnaHQ6MTUycHh9Lm1hdC1jYXJkLXhsLWltYWdle3dpZHRoOjI0MHB4O2hlaWdodDoyNDBweDttYXJnaW46LThweH0ubWF0LWNhcmQtdGl0bGUtZ3JvdXA+Lm1hdC1jYXJkLXhsLWltYWdle21hcmdpbjotOHB4IDAgOHB4fUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LWNhcmQtdGl0bGUtZ3JvdXB7bWFyZ2luOjB9Lm1hdC1jYXJkLXhsLWltYWdle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9fS5tYXQtY2FyZD46Zmlyc3QtY2hpbGQsLm1hdC1jYXJkLWNvbnRlbnQ+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0ubWF0LWNhcmQ+Omxhc3QtY2hpbGQ6bm90KC5tYXQtY2FyZC1mb290ZXIpLC5tYXQtY2FyZC1jb250ZW50PjpsYXN0LWNoaWxkOm5vdCgubWF0LWNhcmQtZm9vdGVyKXttYXJnaW4tYm90dG9tOjB9Lm1hdC1jYXJkLWltYWdlOmZpcnN0LWNoaWxke21hcmdpbi10b3A6LTE2cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czppbmhlcml0O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmluaGVyaXR9Lm1hdC1jYXJkPi5tYXQtY2FyZC1hY3Rpb25zOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTotOHB4O3BhZGRpbmctYm90dG9tOjB9Lm1hdC1jYXJkLWFjdGlvbnMgLm1hdC1idXR0b246Zmlyc3QtY2hpbGQsLm1hdC1jYXJkLWFjdGlvbnMgLm1hdC1yYWlzZWQtYnV0dG9uOmZpcnN0LWNoaWxkLC5tYXQtY2FyZC1hY3Rpb25zIC5tYXQtc3Ryb2tlZC1idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LWNhcmQtdGl0bGU6bm90KDpmaXJzdC1jaGlsZCksLm1hdC1jYXJkLXN1YnRpdGxlOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi10b3A6LTRweH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC1zdWJ0aXRsZTpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tdG9wOi04cHh9Lm1hdC1jYXJkPi5tYXQtY2FyZC14bC1pbWFnZTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOi04cHh9Lm1hdC1jYXJkPi5tYXQtY2FyZC14bC1pbWFnZTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206LThweH1cbiJdXSwKZGF0YTp7fX0pO2Z1bmN0aW9uICRDKCl7cmV0dXJuIFooMixbTW0obnVsbCwwKSxNbShudWxsLDEpXSxudWxsLG51bGwpfTt2YXIgYUQ9Y2coe1Q6MixnOltbJy5tYXQtcHNldWRvLWNoZWNrYm94e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyOjJweCBzb2xpZDtib3JkZXItcmFkaXVzOjJweDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjA7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7Y29udGVudDoiIjtib3JkZXItYm90dG9tOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNpdGlvbjpvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlOjphZnRlcnt0b3A6NXB4O2xlZnQ6MXB4O3dpZHRoOjEwcHg7b3BhY2l0eToxO2JvcmRlci1yYWRpdXM6MnB4fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQ6OmFmdGVye3RvcDoyLjRweDtsZWZ0OjFweDt3aWR0aDo4cHg7aGVpZ2h0OjNweDtib3JkZXItbGVmdDoycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTtvcGFjaXR5OjE7Ym94LXNpemluZzpjb250ZW50LWJveH1cbiddXSwKZGF0YTp7fX0pO2Z1bmN0aW9uIGJEKCl7cmV0dXJuIFooMixbXSxudWxsLG51bGwpfTt2YXIgY0Q9Y2coe1Q6MixnOltbIi5tYXQtb3B0aW9ue3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O21heC13aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtb3B0aW9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRpb257dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0aW9uIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH0ubWF0LW9wdGlvblthcmlhLWRpc2FibGVkPXRydWVdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjMycHh9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAgLm1hdC1vcHRpb246bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjMycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbnttYXJnaW46MCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JvcmRlcjpzb2xpZCAxcHggY3VycmVudENvbG9yO21hcmdpbjowfS5tYXQtb3B0aW9uLXRleHR7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1vcHRpb24gLm1hdC1vcHRpb24tcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbiAubWF0LW9wdGlvbi1yaXBwbGV7b3BhY2l0eTouNX0ubWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3h7bWFyZ2luLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94e21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH1cbiJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBkRChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsIm1hdC1wc2V1ZG8tY2hlY2tib3giLFtbImNsYXNzIiwibWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3ggbWF0LXBzZXVkby1jaGVja2JveCJdXSxbWzIsIm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSIsbnVsbF0sWzIsIm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCIsbnVsbF0sWzIsIm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxiRCxhRCkpLEkoMSw0OTE1MixudWxsLDAsTUMsW1syLGt2XV0se3N0YXRlOlswLCJzdGF0ZSJdLGRpc2FibGVkOlsxLCJkaXNhYmxlZCJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEsMCxkLnNlbGVjdGVkPyJjaGVja2VkIjoidW5jaGVja2VkIixkLmRpc2FibGVkKX0sZnVuY3Rpb24oYixjKXt2YXIgZD0iaW5kZXRlcm1pbmF0ZSI9PT0KRihjLDEpLnN0YXRlLGU9ImNoZWNrZWQiPT09RihjLDEpLnN0YXRlLGY9RihjLDEpLmRpc2FibGVkLGc9Ik5vb3BBbmltYXRpb25zIj09PUYoYywxKS5pYTtiKGMsMCwwLGQsZSxmLGcpfSl9CmZ1bmN0aW9uIGVEKGEpe3JldHVybiBaKDIsWyhhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsZEQpKSxJKDEsMTYzODQsbnVsbCwwLHVvLFtFZixEZl0se1JhOlswLCJuZ0lmIl19LG51bGwpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJtYXQtb3B0aW9uLXRleHQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksTW0obnVsbCwwKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtb3B0aW9uLXJpcHBsZSBtYXQtcmlwcGxlIl0sWyJtYXQtcmlwcGxlIiwiIl1dLFtbMiwibWF0LXJpcHBsZS11bmJvdW5kZWQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksSSg1LDIxMjk5MixudWxsLDAsS0MsW3osVCxOeixbMixKQ10sWzIsa3ZdXSx7ZGlzYWJsZWQ6WzAsImRpc2FibGVkIl0sdHJpZ2dlcjpbMSwidHJpZ2dlciJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEsMCxkLm11bHRpcGxlKTsKYihjLDUsMCxkLmRpc2FibGVkfHxkLklqLGQuT2QoKSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9RihjLDUpLkl0O2IoYyw0LDAsZCl9KX07dmFyIGZEPWZ1bmN0aW9uKCl7dGhpcy5yb2xlPSJkaWFsb2ciO3RoaXMucmI9IiI7dGhpcy5wYz0hMDt0aGlzLnhjPSIiO3RoaXMuSGo9ITE7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD0iIjt0aGlzLm1heFdpZHRoPSI4MHZ3Ijt0aGlzLkxoPXRoaXMuSk89dGhpcy5ITz10aGlzLmRhdGE9bnVsbDt0aGlzLlpPPXRoaXMubXo9dGhpcy5Pbj0hMH07ZnVuY3Rpb24gZ0QoKXt0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggZGlhbG9nIGNvbnRlbnQgYWZ0ZXIgY29udGVudCBpcyBhbHJlYWR5IGF0dGFjaGVkIik7fXZhciBoRD1mdW5jdGlvbihhLGIsYyxkLGUpe3RoaXMub2Q9ITE7dGhpcy5tPWE7dGhpcy5RdT1iO3RoaXMuY2E9Yzt0aGlzLlc9ZTt0aGlzLmNCPW51bGw7dGhpcy50YT0iZW50ZXIiO3RoaXMuS209bmV3IHJrO3RoaXMuZ0o9ZS5KT3x8bnVsbDt0aGlzLnU9ZH07dChoRCxRQik7aD1oRC5wcm90b3R5cGU7aC5NaD1mdW5jdGlvbihhKXt0aGlzLlNkLm9jKCkmJmdEKCk7dGhpcy5JRCgpO3JldHVybiB0aGlzLlNkLk1oKGEpfTtoLk5oPWZ1bmN0aW9uKGEpe3RoaXMuU2Qub2MoKSYmZ0QoKTt0aGlzLklEKCk7cmV0dXJuIHRoaXMuU2QuTmgoYSl9O2guSU09ZnVuY3Rpb24oKXt0aGlzLm5xKCl8fHRoaXMuVy5PbiYmYUEodGhpcy5wZSl8fHRoaXMubS5pLmZvY3VzKCl9OwpoLlJOPWZ1bmN0aW9uKCl7dGhpcy5XLk9uP2JBKHRoaXMucGUpOnRoaXMubnEoKXx8dGhpcy5tLmkuZm9jdXMoKX07aC53bD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY0I7aWYodGhpcy5XLm16JiZhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZm9jdXMpe3ZhciBiPXRoaXMudS5hY3RpdmVFbGVtZW50LGM9dGhpcy5tLmk7YiYmYiE9PXRoaXMudS5ib2R5JiZiIT09YyYmIWMuY29udGFpbnMoYil8fGEuZm9jdXMoKX10aGlzLnBlJiZ0aGlzLnBlLmRlc3Ryb3koKX07aC5JRD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5wZXx8KHRoaXMucGU9dGhpcy5RdS5jcmVhdGUodGhpcy5tLmkpKTt0aGlzLnUmJih0aGlzLmNCPXRoaXMudS5hY3RpdmVFbGVtZW50LHRoaXMubS5pLmZvY3VzJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGEubS5pLmZvY3VzKCl9KSl9OwpoLm5xPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLmksYj10aGlzLnUuYWN0aXZlRWxlbWVudDtyZXR1cm4gYT09PWJ8fGEuY29udGFpbnMoYil9O2guU3Y9ZnVuY3Rpb24oYSl7ImVudGVyIj09PWEuaWI/dGhpcy5STigpOiJleGl0Ij09PWEuaWImJnRoaXMud2woKTt0aGlzLkttLmVtaXQoYSl9O2guVHY9ZnVuY3Rpb24oYSl7dGhpcy5LbS5lbWl0KGEpfTtoLnpOPWZ1bmN0aW9uKCl7dGhpcy50YT0iZXhpdCI7WWcodGhpcy5jYSl9O3ZhciBpRD1jZyh7VDoyLGc6W1siLm1hdC1kaWFsb2ctY29udGFpbmVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoyNHB4O2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzphdXRvO291dGxpbmU6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6aW5oZXJpdDttYXgtaGVpZ2h0OmluaGVyaXR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWRpYWxvZy1jb250YWluZXJ7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1kaWFsb2ctY29udGVudHtkaXNwbGF5OmJsb2NrO21hcmdpbjowIC0yNHB4O3BhZGRpbmc6MCAyNHB4O21heC1oZWlnaHQ6NjV2aDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5tYXQtZGlhbG9nLXRpdGxle21hcmdpbjowIDAgMjBweDtkaXNwbGF5OmJsb2NrfS5tYXQtZGlhbG9nLWFjdGlvbnN7cGFkZGluZzo4cHggMDtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7bWluLWhlaWdodDo1MnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOi0yNHB4fS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249ZW5kXXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1kaWFsb2ctYWN0aW9uc1thbGlnbj1jZW50ZXJde2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LWJ1dHRvbi1iYXNlKy5tYXQtYnV0dG9uLWJhc2UsLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLFtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtbWRjLWJ1dHRvbi1iYXNlKy5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjhweH1cbiJdXSwKZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6ImRpYWxvZ0NvbnRhaW5lciIsamY6W3t0eXBlOjAsbmFtZToidm9pZCwgZXhpdCIsZzp7dHlwZTo2LGc6e29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlKDAuNykifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjAsbmFtZToiZW50ZXIiLGc6e3R5cGU6NixnOnt0cmFuc2Zvcm06Im5vbmUifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6IiogPT4gZW50ZXIiLGFuaW1hdGlvbjp7dHlwZTo0LGc6e3R5cGU6NixnOnt0cmFuc2Zvcm06Im5vbmUiLG9wYWNpdHk6MX0sb2Zmc2V0Om51bGx9LGtiOiIxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSJ9LG9wdGlvbnM6bnVsbH0se3R5cGU6MSx6YzoiKiA9PiB2b2lkLCAqID0+IGV4aXQiLGFuaW1hdGlvbjp7dHlwZTo0LGc6e3R5cGU6NixnOntvcGFjaXR5OjB9LG9mZnNldDpudWxsfSxrYjoiNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSkifSwKb3B0aW9uczpudWxsfV0sb3B0aW9uczp7fX1dfX0pO2Z1bmN0aW9uIGpEKGEpe3JldHVybiBaKDAsWyhhKCkoKSxWKDAsbnVsbCxudWxsLDApKV0sbnVsbCxudWxsKX1mdW5jdGlvbiBrRChhKXtyZXR1cm4gWigwLFtYKDQwMjY1MzE4NCwxLHtTZDowfSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxqRCkpLEkoMiwyMTI5OTIsW1sxLDRdXSwwLFNCLFtVZSxFZixMb10se2N6OlswLCJwb3J0YWwiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDIsMCwiIil9LG51bGwpfQp2YXIgbEQ9UWcoIm1hdC1kaWFsb2ctY29udGFpbmVyIixoRCxmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsIm1hdC1kaWFsb2ctY29udGFpbmVyIixbWyJhcmlhLW1vZGFsIiwidHJ1ZSJdLFsiY2xhc3MiLCJtYXQtZGlhbG9nLWNvbnRhaW5lciJdLFsidGFiaW5kZXgiLCItMSJdXSxbWzEsImlkIiwwXSxbMSwicm9sZSIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzEsImFyaWEtbGFiZWwiLDBdLFsxLCJhcmlhLWRlc2NyaWJlZGJ5IiwwXSxbNDAsIkBkaWFsb2dDb250YWluZXIiLDBdXSxbWyJjb21wb25lbnQiLCJAZGlhbG9nQ29udGFpbmVyLnN0YXJ0Il0sWyJjb21wb25lbnQiLCJAZGlhbG9nQ29udGFpbmVyLmRvbmUiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwOyJjb21wb25lbnQ6QGRpYWxvZ0NvbnRhaW5lci5zdGFydCI9PT1jJiYoZT0hMSE9PUYoYiwxKS5UdihkKSYmZSk7ImNvbXBvbmVudDpAZGlhbG9nQ29udGFpbmVyLmRvbmUiPT09CmMmJihlPSExIT09RihiLDEpLlN2KGQpJiZlKTtyZXR1cm4gZX0sa0QsaUQpKSxJKDEsNDkxNTIsbnVsbCwwLGhELFt6LGNBLG5lLFsyLExvXSxmRF0sbnVsbCxudWxsKV0sbnVsbCxmdW5jdGlvbihiLGMpe3ZhciBkPUYoYywxKS5oaixlPUYoYywxKS5XLnJvbGUsZj1GKGMsMSkuVy5MaD9udWxsOkYoYywxKS5nSixnPUYoYywxKS5XLkxoLGw9RihjLDEpLlcuSE98fG51bGwsbT1GKGMsMSkudGE7YihjLDAsMCxkLGUsZixnLGwsbSl9KX0pO3ZhciBtRD0wLG5EPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO2M9dm9pZCAwPT09Yz8ibWF0LWRpYWxvZy0iK21EKys6Yzt0aGlzLnM9YTt0aGlzLm1xPWI7dGhpcy5pZD1jO3RoaXMuSGo9dGhpcy5tcS5XLkhqO3RoaXMuUGk9bmV3IFloO3RoaXMuU3A9bmV3IFloO3RoaXMuZXE9bmV3IFloO3RoaXMudGE9MDtiLmhqPWM7Yi5LbS5iKGFrKGZ1bmN0aW9uKGUpe3JldHVybiJkb25lIj09PWUuYnQmJiJlbnRlciI9PT1lLmlifSksZ2woKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7ZC5QaS5uZXh0KCk7ZC5QaS5jb21wbGV0ZSgpfSk7Yi5LbS5iKGFrKGZ1bmN0aW9uKGUpe3JldHVybiJkb25lIj09PWUuYnQmJiJleGl0Ij09PWUuaWJ9KSxnbCgpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZC5USik7ZC50QigpfSk7JGgoYS5uaCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7ZC5lcS5uZXh0KGQueEQpO2QuZXEuY29tcGxldGUoKTtkLlNwLm5leHQoZC54RCk7ZC5TcC5jb21wbGV0ZSgpOwpkLmRGPW51bGw7ZC5zLiRiKCl9KTthLkZvKCkuYihhayhmdW5jdGlvbihlKXtyZXR1cm4gMjc9PT1lLmtleUNvZGUmJiFkLkhqJiYhc0EoZSl9KSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTtkLmNsb3NlKCl9KTthLlBmKCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7ZC5Iaj9kLm1xLklNKCk6ZC5jbG9zZSgpfSl9O2g9bkQucHJvdG90eXBlO2guY2xvc2U9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLnhEPWE7dGhpcy5tcS5LbS5iKGFrKGZ1bmN0aW9uKGMpe3JldHVybiJzdGFydCI9PT1jLmJ0fSksZ2woKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2IuZXEubmV4dChhKTtiLmVxLmNvbXBsZXRlKCk7ckIoYi5zKTtiLlRKPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYi50QigpfSxjLnRvdGFsVGltZSsxMDApfSk7dGhpcy5tcS56TigpO3RoaXMudGE9MX07aC5Obj1mdW5jdGlvbigpe3JldHVybiAkaCh0aGlzLlBpKX07aC5QZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnMuUGYoKX07CmguRm89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLkZvKCl9O2guamc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zLlcuTWU7YSYmKGEubGVmdHx8YS5yaWdodCk/YS5sZWZ0P2IubGVmdChhLmxlZnQpOmIucmlnaHQoYS5yaWdodCk6KGIubGVmdCgiIiksYi51aD0iY2VudGVyIik7YSYmKGEudG9wfHxhLmJvdHRvbSk/YS50b3A/Yi50b3AoYS50b3ApOmIuYm90dG9tKGEuYm90dG9tKTooYi50b3AoIiIpLGIuVHA9ImNlbnRlciIpO3RoaXMucy5qZygpfTtoLkVrPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPyIiOmI7dGhpcy5zLlcuTWUud2lkdGgodm9pZCAwPT09YT8iIjphKS5oZWlnaHQoYik7dGhpcy5zLmpnKCk7cmV0dXJuIHRoaXN9O2guZ2V0U3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YX07aC50Qj1mdW5jdGlvbigpe3RoaXMudGE9Mjt0aGlzLnMuJGIoKX07aC5XUj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnMuVy5NZX07dmFyIG9EPW5ldyB5KCJNYXREaWFsb2dEYXRhIikscEQ9bmV3IHkoIm1hdC1kaWFsb2ctZGVmYXVsdC1vcHRpb25zIikscUQ9bmV3IHkoIm1hdC1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5Iik7ZnVuY3Rpb24gckQoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEubHAuYmxvY2soKX19dmFyIHNEPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3RoaXMudGQ9YTt0aGlzLlVjPWI7dGhpcy5sZD1kO3RoaXMuc249Zjt0aGlzLm5qPWc7dGhpcy5QQz1bXTt0aGlzLmNBPW5ldyBZaDt0aGlzLmRBPW5ldyBZaDt0aGlzLmZ1PW5ldyBNYXA7dGhpcy52ZD1lfTsKc0QucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2I9dEQoYix0aGlzLmxkfHxuZXcgZkQpO2lmKGIuaWQmJnVEKHRoaXMsYi5pZCkpdGhyb3cgRXJyb3IoJ0RpYWxvZyB3aXRoIGlkICInK2IuaWQrJyIgZXhpc3RzIGFscmVhZHkuIFRoZSBkaWFsb2cgaWQgbXVzdCBiZSB1bmlxdWUuJyk7dmFyIGQ9dGhpcy5vZyhiKSxlPXRoaXMubEooZCxiKSxmPXRoaXMubUooYSxlLGQsYik7dGhpcy4kai5sZW5ndGh8fHRoaXMucUwoKTt0aGlzLiRqLnB1c2goZik7JGgoZi5TcCkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIGMuVE0oZil9KTt0aGlzLk5uLm5leHQoZik7cmV0dXJuIGZ9O3ZhciB1RD1mdW5jdGlvbihhLGIpe3JldHVybiBhLiRqLmZpbmQoZnVuY3Rpb24oYyl7cmV0dXJuIGMuaWQ9PT1ifSl9O2g9c0QucHJvdG90eXBlO2guWD1mdW5jdGlvbigpe3RoaXMuU0oodGhpcy5QQyk7dGhpcy5jQS5jb21wbGV0ZSgpO3RoaXMuZEEuY29tcGxldGUoKX07Cmgub2c9ZnVuY3Rpb24oYSl7YT10aGlzLlZ1KGEpO3JldHVybiB0aGlzLnRkLmNyZWF0ZShhKX07aC5WdT1mdW5jdGlvbihhKXt2YXIgYj1uZXcgcEIoe01lOnRoaXMudGQucG9zaXRpb24oKS5nbG9iYWwoKSxlZzphLmVnfHx0aGlzLnZkKCkscmI6YS5yYixwYzphLnBjLGRpcmVjdGlvbjphLmRpcmVjdGlvbixtaW5XaWR0aDphLm1pbldpZHRoLG1pbkhlaWdodDphLm1pbkhlaWdodCxtYXhXaWR0aDphLm1heFdpZHRoLG1heEhlaWdodDphLm1heEhlaWdodCxyRjphLlpPfSk7YS54YyYmKGIueGM9YS54Yyk7cmV0dXJuIGJ9O2gubEo9ZnVuY3Rpb24oYSxiKXt2YXIgYz1yZSh7cGFyZW50OmImJmIua2MmJmIua2MuWnx8dGhpcy5VYyxyYzpbe1lhOmZELGtkOmJ9XX0pO3JldHVybiBhLmNiKG5ldyBPQihoRCxiLmtjLGMsYi5XbikpLmluc3RhbmNlfTsKaC5tSj1mdW5jdGlvbihhLGIsYyxkKXtjPW5ldyBuRChjLGIsZC5pZCk7aWYoYSBpbnN0YW5jZW9mIERmKWIuTmgobmV3IFBCKGEsbnVsbCx7UDpkLmRhdGEsUng6Y30pKTtlbHNle3ZhciBlPXRoaXMueHUoZCxjLGIpO2E9Yi5NaChuZXcgT0IoYSxkLmtjLGUpKTtjLmRGPWEuaW5zdGFuY2V9Yy5FayhkLndpZHRoLGQuaGVpZ2h0KS5qZyhkLnBvc2l0aW9uKTtyZXR1cm4gY307aC54dT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmYS5rYyYmYS5rYy5aO2I9W3tZYTpoRCxrZDpjfSx7WWE6b0Qsa2Q6YS5kYXRhfSx7WWE6bkQsa2Q6Yn1dOyFhLmRpcmVjdGlvbnx8ZCYmZC5nZXQoTkEsbnVsbCl8fGIucHVzaCh7WWE6TkEsa2Q6e3ZhbHVlOmEuZGlyZWN0aW9uLFFhOmZpKCl9fSk7cmV0dXJuIHJlKHtwYXJlbnQ6ZHx8dGhpcy5VYyxyYzpifSl9OwpoLlRNPWZ1bmN0aW9uKGEpe2E9dGhpcy4kai5pbmRleE9mKGEpOy0xPGEmJih0aGlzLiRqLnNwbGljZShhLDEpLHRoaXMuJGoubGVuZ3RofHwodGhpcy5mdS5mb3JFYWNoKGZ1bmN0aW9uKGIsYyl7Yj9jLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLGIpOmMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSksdGhpcy5mdS5jbGVhcigpLHRoaXMuYkEubmV4dCgpKSl9O2gucUw9ZnVuY3Rpb24oKXt2YXIgYT1kQih0aGlzLm5qKTtpZihhLnBhcmVudEVsZW1lbnQpZm9yKHZhciBiPWEucGFyZW50RWxlbWVudC5jaGlsZHJlbixjPWIubGVuZ3RoLTE7LTE8YztjLS0pe3ZhciBkPWJbY107ZD09PWF8fCJTQ1JJUFQiPT09ZC5ub2RlTmFtZXx8IlNUWUxFIj09PWQubm9kZU5hbWV8fGQuaGFzQXR0cmlidXRlKCJhcmlhLWxpdmUiKXx8KHRoaXMuZnUuc2V0KGQsZC5nZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIikpLGQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSl9fTsKaC5TSj1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS5sZW5ndGg7Yi0tOylhW2JdLmNsb3NlKCl9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc0QucHJvdG90eXBlLHskajp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc24/dGhpcy5zbi4kajp0aGlzLlBDfX0sTm46e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNuP3RoaXMuc24uTm46dGhpcy5kQX19LGJBOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNuO3JldHVybiBhP2EuYkE6dGhpcy5jQX19fSk7ZnVuY3Rpb24gdEQoYSxiKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGIpLGEpfTt2YXIgdkQ9ZnVuY3Rpb24oKXt9LHdEPWZ1bmN0aW9uKCl7fTt2YXIgeEQ9ZnVuY3Rpb24oKXt9O3ZhciB5RD1mdW5jdGlvbigpe3RoaXMuaEM9dGhpcy5CZz0hMX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyh5RC5wcm90b3R5cGUse3ZlcnRpY2FsOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CZ30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuQmc9dHooYSl9fSxIZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaEN9LHNldDpmdW5jdGlvbihhKXt0aGlzLmhDPXR6KGEpfX19KTt2YXIgekQ9ZnVuY3Rpb24oKXt9O3ZhciBBRD1jZyh7VDoyLGc6W1siLm1hdC1kaXZpZGVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLXRvcC1zdHlsZTpzb2xpZH0ubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXRvcDowO2JvcmRlci1yaWdodC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkfS5tYXQtZGl2aWRlci5tYXQtZGl2aWRlci1pbnNldHttYXJnaW4tbGVmdDo4MHB4fVtkaXI9cnRsXSAubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6ODBweH1cbiJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gQkQoKXtyZXR1cm4gWigyLFtdLG51bGwsbnVsbCl9O3ZhciBDRD1uZXcgeSgiTUFUX0FDQ09SRElPTiIpO3ZhciBERD0wLEVEPW5ldyB5KCJNQVRfRVhQQU5TSU9OX1BBTkVMX0RFRkFVTFRfT1BUSU9OUyIpLEZEPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe0pBLmNhbGwodGhpcyxhLGIsYyk7dmFyIGw9dGhpczt0aGlzLnpiPWQ7dGhpcy5pYT1mO3RoaXMuJEI9ITE7dGhpcy5DTz1uZXcgcms7dGhpcy5CTz1uZXcgcms7dGhpcy5tdj1uZXcgWWg7dGhpcy5idj0ibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItIitERCsrO3RoaXMuaXU9bmV3IFloO3RoaXMuWWI9YTt0aGlzLnU9ZTt0aGlzLml1LmIoZGwoZnVuY3Rpb24obSxwKXtyZXR1cm4gbS5jZD09PXAuY2QmJm0uaWI9PT1wLmlifSkpLnN1YnNjcmliZShmdW5jdGlvbihtKXsidm9pZCIhPT1tLmNkJiYoImV4cGFuZGVkIj09PW0uaWI/bC5DTy5lbWl0KCk6ImNvbGxhcHNlZCI9PT1tLmliJiZsLkJPLmVtaXQoKSl9KTtnJiYodGhpcy5Ecz1nLkRzKX07dChGRCxKQSk7aD1GRC5wcm90b3R5cGU7CmguVUI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYj90aGlzLk1hJiYiZGVmYXVsdCI9PT10aGlzLlliLmRpc3BsYXlNb2RlOiExfTtoLnZxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWE/ImV4cGFuZGVkIjoiY29sbGFwc2VkIn07aC50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzLk1hPSF0aGlzLk1hfTtoLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5NYT0hMX07aC5vcGVuPWZ1bmN0aW9uKCl7dGhpcy5NYT0hMH07aC5xZj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy56diYmdGhpcy5lZS5iKE5sKG51bGwpLGFrKGZ1bmN0aW9uKCl7cmV0dXJuIGEuTWEmJiFhLnZnfSksZ2woKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS52Zz1uZXcgUEIoYS56di5VRCxhLnpiKX0pfTtoLlNhPWZ1bmN0aW9uKGEpe3RoaXMubXYubmV4dChhKX07aC5YPWZ1bmN0aW9uKCl7SkEucHJvdG90eXBlLlguY2FsbCh0aGlzKTt0aGlzLml1LmNvbXBsZXRlKCk7dGhpcy5tdi5jb21wbGV0ZSgpfTsKaC5ucT1mdW5jdGlvbigpe2lmKHRoaXMudUEpe3ZhciBhPXRoaXMudS5hY3RpdmVFbGVtZW50LGI9dGhpcy51QS5pO3JldHVybiBhPT09Ynx8Yi5jb250YWlucyhhKX1yZXR1cm4hMX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhGRC5wcm90b3R5cGUse0RzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kQnx8dGhpcy5ZYiYmdGhpcy5ZYi5Ec30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuJEI9dHooYSl9fSx3bTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTk58fHRoaXMuWWImJnRoaXMuWWIud219LHNldDpmdW5jdGlvbihhKXt0aGlzLk5OPWF9fX0pO3ZhciBHRD1mdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9dGhpczt0aGlzLkJhPWE7dGhpcy5rYT1iO3RoaXMudmE9Yzt0aGlzLmNhPWQ7dGhpcy5pYT1mO3RoaXMuVUM9TWguRU1QVFk7dmFyIGw9YS5ZYj9hLlliLnlyLmIoYWsoZnVuY3Rpb24obSl7cmV0dXJuISghbS5oaWRlVG9nZ2xlJiYhbS50b2dnbGVQb3NpdGlvbil9KSk6Ymk7dGhpcy5VQz1ZaihhLmVlLGEuY2xvc2VkLGwsYS5tdi5iKGFrKGZ1bmN0aW9uKG0pe3JldHVybiEhKG0uaGlkZVRvZ2dsZXx8bS5kaXNhYmxlZHx8bS50b2dnbGVQb3NpdGlvbil9KSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBZZyhnLmNhKX0pO2EuY2xvc2VkLmIoYWsoZnVuY3Rpb24oKXtyZXR1cm4gYS5ucSgpfSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBTeihjLGIsInByb2dyYW0iKX0pO2UmJih0aGlzLmV4cGFuZGVkSGVpZ2h0PWUuZXhwYW5kZWRIZWlnaHQsdGhpcy5jb2xsYXBzZWRIZWlnaHQ9ZS5jb2xsYXBzZWRIZWlnaHQpfTsKaD1HRC5wcm90b3R5cGU7aC5Udz1mdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuQmEudG9nZ2xlKCl9O2guYVM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYS5NYX07aC52cT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkJhLnZxKCl9O2guVlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CYS5pZH07aC5YUj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkJhLndtfTtoLndOPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuQmEuRHMmJiF0aGlzLkJhLmRpc2FibGVkfTtoLkVCPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CYS5NYTtyZXR1cm4gYSYmdGhpcy5leHBhbmRlZEhlaWdodD90aGlzLmV4cGFuZGVkSGVpZ2h0OiFhJiZ0aGlzLmNvbGxhcHNlZEhlaWdodD90aGlzLmNvbGxhcHNlZEhlaWdodDpudWxsfTsKaC50Qz1mdW5jdGlvbihhKXtzd2l0Y2goYS5rZXlDb2RlKXtjYXNlIDMyOmNhc2UgMTM6c0EoYSl8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5UdygpKTticmVhaztkZWZhdWx0OnRoaXMuQmEuWWImJnRoaXMuQmEuWWIuWlIoYSl9fTtoLmZvY3VzPWZ1bmN0aW9uKGEsYil7U3oodGhpcy52YSx0aGlzLmthLHZvaWQgMD09PWE/InByb2dyYW0iOmEsYil9O2guTGM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudmEuVWcodGhpcy5rYSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2ImJmEuQmEuWWImJmEuQmEuWWIuWVIoYSl9KX07aC5YPWZ1bmN0aW9uKCl7dGhpcy5VQy51bnN1YnNjcmliZSgpO3RoaXMudmEueWYodGhpcy5rYSl9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoR0QucHJvdG90eXBlLHtkaXNhYmxlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmEuZGlzYWJsZWR9fX0pO3ZhciBIRD1mdW5jdGlvbigpe307dmFyIElEPWZ1bmN0aW9uKCl7fTt2YXIgSkQ9Y2coe1Q6MixnOltbJy5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjAgMjRweDtib3JkZXItcmFkaXVzOmluaGVyaXQ7dHJhbnNpdGlvbjpoZWlnaHQgMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpmb2N1cywubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7b3V0bGluZTpub25lfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWQ6Zm9jdXMsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbmRlZDpob3ZlcntiYWNrZ3JvdW5kOmluaGVyaXR9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmV7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2V9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmUgLm1hdC1leHBhbnNpb24taW5kaWNhdG9ye21hcmdpbjowIDE2cHggMCAwfVtkaXI9cnRsXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIubWF0LWV4cGFuc2lvbi10b2dnbGUtaW5kaWNhdG9yLWJlZm9yZSAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3J7bWFyZ2luOjAgMCAwIDE2cHh9Lm1hdC1jb250ZW50e2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246cm93O292ZXJmbG93OmhpZGRlbn0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTttYXJnaW4tcmlnaHQ6MTZweH1bZGlyPXJ0bF0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLFtkaXI9cnRsXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MTZweH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257ZmxleC1ncm93OjJ9Lm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjAgMnB4IDJweCAwO2NvbnRlbnQ6IiI7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzozcHg7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dmVydGljYWwtYWxpZ246bWlkZGxlfVxuJ11dLApkYXRhOnthbmltYXRpb246W3t0eXBlOjcsbmFtZToiaW5kaWNhdG9yUm90YXRlIixqZjpbe3R5cGU6MCxuYW1lOiJjb2xsYXBzZWQsIHZvaWQiLGc6e3R5cGU6NixnOnt0cmFuc2Zvcm06InJvdGF0ZSgwZGVnKSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MCxuYW1lOiJleHBhbmRlZCIsZzp7dHlwZTo2LGc6e3RyYW5zZm9ybToicm90YXRlKDE4MGRlZykifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6ImV4cGFuZGVkIDw9PiBjb2xsYXBzZWQsIHZvaWQgPT4gY29sbGFwc2VkIixhbmltYXRpb246e3R5cGU6NCxnOm51bGwsa2I6IjIyNW1zIGN1YmljLWJlemllcigwLjQsMC4wLDAuMiwxKSJ9LG9wdGlvbnM6bnVsbH1dLG9wdGlvbnM6e319XX19KTsKZnVuY3Rpb24gS0QoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCJzcGFuIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24taW5kaWNhdG9yIl1dLFtbMjQsIkBpbmRpY2F0b3JSb3RhdGUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuYS52cSgpKX0pfWZ1bmN0aW9uIExEKGEpe3JldHVybiBaKDIsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMywic3BhbiIsW1siY2xhc3MiLCJtYXQtY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDApLE1tKG51bGwsMSksTW0obnVsbCwyKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLEtEKSksSSg1LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsNSwwLGMuYS53TigpKX0sbnVsbCl9O3ZhciBNRD1jZyh7VDoyLGc6W1siLm1hdC1leHBhbnNpb24tcGFuZWx7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOm1hcmdpbiAyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCksLm1hdC1hY2NvcmRpb24gLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmcpe2JvcmRlci1yYWRpdXM6MH0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpmaXJzdC1vZi10eXBle2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweH0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpsYXN0LW9mLXR5cGV7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1leHBhbnNpb24tcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1leHBhbnNpb24tcGFuZWwubmctYW5pbWF0ZS1kaXNhYmxlZCwubmctYW5pbWF0ZS1kaXNhYmxlZCAubWF0LWV4cGFuc2lvbi1wYW5lbCwubWF0LWV4cGFuc2lvbi1wYW5lbC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO292ZXJmbG93OnZpc2libGV9Lm1hdC1leHBhbnNpb24tcGFuZWwtYm9keXtwYWRkaW5nOjAgMjRweCAxNnB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmd7bWFyZ2luOjE2cHggMH0ubWF0LWFjY29yZGlvbj4ubWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5nOmZpcnN0LWNoaWxkLC5tYXQtYWNjb3JkaW9uPio6Zmlyc3QtY2hpbGQ6bm90KC5tYXQtZXhwYW5zaW9uLXBhbmVsKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5ne21hcmdpbi10b3A6MH0ubWF0LWFjY29yZGlvbj4ubWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5nOmxhc3QtY2hpbGQsLm1hdC1hY2NvcmRpb24+KjpsYXN0LWNoaWxkOm5vdCgubWF0LWV4cGFuc2lvbi1wYW5lbCkgLm1hdC1leHBhbnNpb24tcGFuZWwtc3BhY2luZ3ttYXJnaW4tYm90dG9tOjB9Lm1hdC1hY3Rpb24tcm93e2JvcmRlci10b3Atc3R5bGU6c29saWQ7Ym9yZGVyLXRvcC13aWR0aDoxcHg7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7cGFkZGluZzoxNnB4IDhweCAxNnB4IDI0cHh9Lm1hdC1hY3Rpb24tcm93IGJ1dHRvbi5tYXQtYnV0dG9uLWJhc2UsLm1hdC1hY3Rpb24tcm93IGJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjhweH1bZGlyPXJ0bF0gLm1hdC1hY3Rpb24tcm93IGJ1dHRvbi5tYXQtYnV0dG9uLWJhc2UsW2Rpcj1ydGxdIC5tYXQtYWN0aW9uLXJvdyBidXR0b24ubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDo4cHh9XG4iXV0sCmRhdGE6e2FuaW1hdGlvbjpbe3R5cGU6NyxuYW1lOiJib2R5RXhwYW5zaW9uIixqZjpbe3R5cGU6MCxuYW1lOiJjb2xsYXBzZWQsIHZvaWQiLGc6e3R5cGU6NixnOntoZWlnaHQ6IjBweCIsdmlzaWJpbGl0eToiaGlkZGVuIn0sb2Zmc2V0Om51bGx9LG9wdGlvbnM6dm9pZCAwfSx7dHlwZTowLG5hbWU6ImV4cGFuZGVkIixnOnt0eXBlOjYsZzp7aGVpZ2h0OiIqIix2aXNpYmlsaXR5OiJ2aXNpYmxlIn0sb2Zmc2V0Om51bGx9LG9wdGlvbnM6dm9pZCAwfSx7dHlwZToxLHpjOiJleHBhbmRlZCA8PT4gY29sbGFwc2VkLCB2b2lkID0+IGNvbGxhcHNlZCIsYW5pbWF0aW9uOnt0eXBlOjQsZzpudWxsLGtiOiIyMjVtcyBjdWJpYy1iZXppZXIoMC40LDAuMCwwLjIsMSkifSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7ZnVuY3Rpb24gTkQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMCxudWxsLG51bGwsMCkpXSxudWxsLG51bGwpfQpmdW5jdGlvbiBPRChhKXtyZXR1cm4gWigyLFtYKDY3MTA4ODY0MCwxLHt1QTowfSksTW0obnVsbCwwKSwoYSgpKCksVygyLDAsW1sxLDBdLFsiYm9keSIsMV1dLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudCJdLFsicm9sZSIsInJlZ2lvbiJdXSxbWzI0LCJAYm9keUV4cGFuc2lvbiIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzgsImlkIiwwXV0sW1tudWxsLCJAYm9keUV4cGFuc2lvbi5kb25lIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiQGJvZHlFeHBhbnNpb24uZG9uZSI9PT1jJiYoZT0hMSE9PWYuaXUubmV4dChkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtYm9keSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDEpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsCk5EKSksSSg2LDIxMjk5MixudWxsLDAsU0IsW1VlLEVmLExvXSx7Y3o6WzAsInBvcnRhbCJdfSxudWxsKSxNbShudWxsLDIpXSxmdW5jdGlvbihiLGMpe2IoYyw2LDAsYy5hLnZnKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDIsMCxkLnZxKCksZC5idixkLmlkKX0pfTt2YXIgUEQ9ZnVuY3Rpb24oKXt9O2Z1bmN0aW9uIFFEKGEpe3JldHVybiBFcnJvcigiQSBoaW50IHdhcyBhbHJlYWR5IGRlY2xhcmVkIGZvciAnYWxpZ249XCIiK2ErIlwiJy4iKX07dmFyIFJEPWZ1bmN0aW9uKCl7fTt2YXIgU0Q9ZnVuY3Rpb24oKXt9O3ZhciBURD0wLFVEPWZDKGZ1bmN0aW9uKGEpe3RoaXMubT1hfSwicHJpbWFyeSIpLFZEPW5ldyB5KCJNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMiKSxXRD1uZXcgeSgiTWF0Rm9ybUZpZWxkIiksWEQ9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsKXt2YXIgbT1VRC5jYWxsKHRoaXMsYSl8fHRoaXM7bS5tPWE7bS5jYT1iO20uR2E9ZDttLnFxPWU7bS5lYT1mO20uUz1nO20uJHE9ITE7bS5ybj0hMTttLmFhPW5ldyBZaDttLkZ3PSExO20uSnc9IiI7bS5ldj0iIjttLmFDPSJtYXQtaGludC0iK1REKys7bS54dj0ibWF0LWZvcm0tZmllbGQtbGFiZWwtIitURCsrO20uT0w9Yz9jOnt9O20ubW89bS5CQigpO20uRWI9Ik5vb3BBbmltYXRpb25zIiE9PWw7bS5vPWUmJmUubz9lLm86ImxlZ2FjeSI7bS5aQj1lJiZudWxsIT1lLm55P2Uubnk6ITE7cmV0dXJuIG19O3QoWEQsVUQpO2g9WEQucHJvdG90eXBlOwpoLnFmPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnNFKCk7dmFyIGI9dGhpcy5sO2IuZ3MmJnRoaXMubS5pLmNsYXNzTGlzdC5hZGQoIm1hdC1mb3JtLWZpZWxkLXR5cGUtIitiLmdzKTtiLndiLmIoTmwobnVsbCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EubE8oKTthLkx3KCk7WWcoYS5jYSl9KTtiLnFjJiZiLnFjLnptJiZiLnFjLnptLmIoUmwodGhpcy5hYSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBZZyhhLmNhKX0pO3RoaXMuUy5vYShmdW5jdGlvbigpeyRoKGEuUy5yZikuYihSbChhLmFhKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS5ybiYmWUQoYSl9KX0pO1lqKHRoaXMuSmIuWmIsdGhpcy5MYi5aYikuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS5ybj0hMDtZZyhhLmNhKX0pO3RoaXMuYWIuWmIuYihObChudWxsKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS5mRCgpO1lnKGEuY2EpfSk7dGhpcy5sYi5aYi5iKE5sKG51bGwpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXthLkx3KCk7CllnKGEuY2EpfSk7dGhpcy5HYSYmdGhpcy5HYS5RYS5iKFJsKHRoaXMuYWEpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9hLlMub2EoZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtyZXR1cm4gWUQoYSl9KX0pOllEKGEpfSl9O2guSEc9ZnVuY3Rpb24oKXt0aGlzLnNFKCk7dGhpcy4kcSYmWUQodGhpcyl9O2guTGM9ZnVuY3Rpb24oKXt0aGlzLkp3PSJlbnRlciI7dGhpcy5jYS5MZygpfTtoLlg9ZnVuY3Rpb24oKXt0aGlzLmFhLm5leHQoKTt0aGlzLmFhLmNvbXBsZXRlKCl9O2guaD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmw/dGhpcy5sLnFjOm51bGw7cmV0dXJuIGImJmJbYV19O2gucEw9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLmwmJnRoaXMubC5wbGFjZWhvbGRlcnx8dGhpcy5IYil9O2guQ3E9ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuTkx9OwpoLktiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGImJih0aGlzLmwuUEh8fHRoaXMuRXcpfTtoLlViPWZ1bmN0aW9uKCl7cmV0dXJuImxlZ2FjeSI9PT10aGlzLm8mJiF0aGlzLkNxKCl8fHRoaXMuQ3EoKSYmIXRoaXMuS2IoKX07aC51Yj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkNxKCl8fCJsZWdhY3kiPT09dGhpcy5vJiZ0aGlzLnBMKCl9O2guQ0I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYiYmMDx0aGlzLmxiLmxlbmd0aCYmdGhpcy5sLmZhPyJlcnJvciI6ImhpbnQifTtoLlFSPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnViKCkmJnRoaXMueGImJih0aGlzLkViJiZ0aGlzLmhsJiYodGhpcy5Gdz0hMCxWaSh0aGlzLmhsLmksInRyYW5zaXRpb25lbmQiKS5iKGdsKCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuRnc9ITF9KSksdGhpcy5tbz0iYWx3YXlzIixZZyh0aGlzLmNhKSl9OwpoLmxPPWZ1bmN0aW9uKCl7aWYodGhpcy5sLnBsYWNlaG9sZGVyJiZ0aGlzLkhiKXRocm93IEVycm9yKCJQbGFjZWhvbGRlciBhdHRyaWJ1dGUgYW5kIGNoaWxkIGVsZW1lbnQgd2VyZSBib3RoIHNwZWNpZmllZC4iKTt9O2guZkQ9ZnVuY3Rpb24oKXt0aGlzLmtPKCk7dGhpcy5MdygpfTtoLmtPPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZih0aGlzLmFiKXt2YXIgYixjO3RoaXMuYWIuZm9yRWFjaChmdW5jdGlvbihkKXtpZigic3RhcnQiPT09ZC5hbGlnbil7aWYoYnx8YS5veSl0aHJvdyBRRCgic3RhcnQiKTtiPWR9ZWxzZSBpZigiZW5kIj09PWQuYWxpZ24pe2lmKGMpdGhyb3cgUUQoImVuZCIpO2M9ZH19KX19O2guQkI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xcSYmdGhpcy5xcS5tb3x8dGhpcy5PTC52U3x8ImF1dG8ifTsKaC5Mdz1mdW5jdGlvbigpe2lmKHRoaXMubCl7dmFyIGE9W107aWYoImhpbnQiPT09dGhpcy5DQigpKXt2YXIgYj10aGlzLmFiP3RoaXMuYWIuZmluZChmdW5jdGlvbihkKXtyZXR1cm4ic3RhcnQiPT09ZC5hbGlnbn0pOm51bGwsYz10aGlzLmFiP3RoaXMuYWIuZmluZChmdW5jdGlvbihkKXtyZXR1cm4iZW5kIj09PWQuYWxpZ259KTpudWxsO2I/YS5wdXNoKGIuaWQpOnRoaXMuZXYmJmEucHVzaCh0aGlzLmFDKTtjJiZhLnB1c2goYy5pZCl9ZWxzZSB0aGlzLmxiJiYoYT10aGlzLmxiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5pZH0pKTt0aGlzLmwuSkgoYSl9fTtoLnNFPWZ1bmN0aW9uKCl7aWYoIXRoaXMubCl0aHJvdyBFcnJvcigibWF0LWZvcm0tZmllbGQgbXVzdCBjb250YWluIGEgTWF0Rm9ybUZpZWxkQ29udHJvbC4iKTt9Owp2YXIgWUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5obD9hLmhsLmk6bnVsbDtpZigib3V0bGluZSI9PT1hLm8mJmImJmIuY2hpbGRyZW4ubGVuZ3RoJiZiLnRleHRDb250ZW50LnRyaW0oKSYmYS5lYS55YSlpZihhLkJMKCkpe3ZhciBjPTAsZD0wLGU9YS5YSi5pLGY9ZS5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCIpLGc9ZS5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiKTtpZihhLmhsJiZhLmhsLmkuY2hpbGRyZW4ubGVuZ3RoKXtkPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoMD09PWQud2lkdGgmJjA9PT1kLmhlaWdodCl7YS5ybj0hMDthLiRxPSExO3JldHVybn1jPWEuTEIoZCk7ZT1hLkxCKGIuY2hpbGRyZW5bMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2Q9MDtiPW4oYi5jaGlsZHJlbik7Zm9yKHZhciBsPWIubmV4dCgpOyFsLmRvbmU7bD1iLm5leHQoKSlkKz1sLnZhbHVlLm9mZnNldFdpZHRoOwpjPU1hdGguYWJzKGUtYyktNTtkPTA8ZD8uNzUqZCsxMDowfWZvcihiPTA7YjxmLmxlbmd0aDtiKyspZltiXS5zdHlsZS53aWR0aD1jKyJweCI7Zm9yKGY9MDtmPGcubGVuZ3RoO2YrKylnW2ZdLnN0eWxlLndpZHRoPWQrInB4IjthLnJuPWEuJHE9ITF9ZWxzZSBhLiRxPSEwfTtYRC5wcm90b3R5cGUuTEI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuR2EmJiJydGwiPT09dGhpcy5HYS52YWx1ZT9hLnJpZ2h0OmEubGVmdH07WEQucHJvdG90eXBlLkJMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLmk7aWYoYS5nZXRSb290Tm9kZSl7dmFyIGI9YS5nZXRSb290Tm9kZSgpO3JldHVybiBiJiZiIT09YX1yZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGEpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhYRC5wcm90b3R5cGUse286e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1fSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5idTt0aGlzLmJ1PWF8fHRoaXMucXEmJnRoaXMucXEub3x8ImxlZ2FjeSI7Im91dGxpbmUiPT09dGhpcy5idSYmYiE9PWEmJih0aGlzLnJuPSEwKX19LG55Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aQn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuWkI9dHooYSl9fSxFdzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuImFsd2F5cyI9PT10aGlzLm1vJiYhdGhpcy5Gd319LHhiOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ibmV2ZXIiIT09dGhpcy5tb319LG95Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCwKZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXZ9LHNldDpmdW5jdGlvbihhKXt0aGlzLmV2PWE7dGhpcy5mRCgpfX0sbW86e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJsZWdhY3kiIT09dGhpcy5vJiYibmV2ZXIiPT09dGhpcy5NdT8iYXV0byI6dGhpcy5NdX0sc2V0OmZ1bmN0aW9uKGEpe2EhPT10aGlzLk11JiYodGhpcy5NdT1hfHx0aGlzLkJCKCksWWcodGhpcy5jYSkpfX0sbDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSEt8fHRoaXMuU2J8fHRoaXMuVGJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLkhLPWF9fSxOTDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmJ8fHRoaXMuV2J9fX0pO3ZhciBaRD1mdW5jdGlvbigpe307dmFyICREPWNnKHtUOjIsZzpbWyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksb3BhY2l0eSAxMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWljb257d2lkdGg6MWVtO2hlaWdodDoxZW07Zm9udC1zaXplOmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcntkaXNwbGF5OmZsZXh9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2Vye2ZsZXg6MSAwIDFlbX0ubWF0LWVycm9ye2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWNvbnRyb2wtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdLApbJy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWZsZXh7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMDtwYWRkaW5nOi43NWVtIC43NWVtIDAgLjc1ZW19LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e291dGxpbmU6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbiddLApbJy5tYXQtaW5wdXQtZWxlbWVudHtmb250OmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpjdXJyZW50Q29sb3I7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt0ZXh0LWFsaWduOmluaGVyaXR9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tb3otdWktaW52YWxpZHtib3gtc2hhZG93Om5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtY2xlYXIsLm1hdC1pbnB1dC1lbGVtZW50OjotbXMtcmV2ZWFse2Rpc3BsYXk6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLXJlc3VsdHMtYnV0dG9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1jb250YWN0cy1hdXRvLWZpbGwtYnV0dG9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1jYXBzLWxvY2staW5kaWNhdG9yLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1jcmVkZW50aWFscy1hdXRvLWZpbGwtYnV0dG9ue3Zpc2liaWxpdHk6aGlkZGVufS5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9bW9udGhdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXdlZWtdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVde2xpbmUtaGVpZ2h0OjF9Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXdlZWtdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT10aW1lXTo6YWZ0ZXJ7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNsZWFyLWJ1dHRvbntmb250LXNpemU6Ljc1ZW19Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZX0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cmVzaXplOnZlcnRpY2FsO292ZXJmbG93OmF1dG99dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnQuY2RrLXRleHRhcmVhLWF1dG9zaXple3Jlc2l6ZTpub25lfXRleHRhcmVhLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmc6MnB4IDA7bWFyZ2luOi0ycHggMH1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnR7LW1vei1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1mbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nLXRvcDoxZW07dG9wOi0xZW07bWFyZ2luLWJvdHRvbTotMWVtfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLWV4cGFuZHtkaXNwbGF5Om5vbmV9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDpub3QoOmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy12YWx1ZXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6bm9uZX0ubWF0LWZvY3VzZWQgLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSBzZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy12YWx1ZXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29udGVudDoiIjt3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MDttYXJnaW4tdG9wOi0yLjVweDtwb2ludGVyLWV2ZW50czpub25lfVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye3JpZ2h0OmF1dG87bGVmdDowfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtaW5wdXQtZWxlbWVudHtwYWRkaW5nLXJpZ2h0OjE1cHh9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtaW5wdXQtZWxlbWVudHtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE1cHh9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDEwcHgpfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcnttYXJnaW4tdG9wOi0xMHB4fVxuJ10sClsiLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwcHgpOy1tcy10cmFuc2Zvcm06bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue3dpZHRoOjFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257Zm9udDppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2ZvbnQtc2l6ZTppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDFweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0b3A6MDtoZWlnaHQ6MnB4O292ZXJmbG93OmhpZGRlbn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtcG9zaXRpb246MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQ6bm90KC5tYXQtZm9jdXNlZCkgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtoZWlnaHQ6MXB4fVxuIl0sClsiLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcnttYXJnaW46LjI1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1mbGV4e3BhZGRpbmc6MCAuNzVlbSAwIC43NWVtO21hcmdpbi10b3A6LTAuMjVlbTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3VmZml4e3RvcDouMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LjI1ZW07bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0LC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO21pbi13aWR0aDo1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydHtib3JkZXItcmFkaXVzOjVweCAwIDAgNXB4O2JvcmRlci1yaWdodC1zdHlsZTpub25lfVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yaWdodC1zdHlsZTpzb2xpZDtib3JkZXItbGVmdC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6MCA1cHggNXB4IDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMDtib3JkZXItbGVmdC1zdHlsZTpub25lO2ZsZXgtZ3JvdzoxfVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQtc3R5bGU6bm9uZTtib3JkZXItcmFkaXVzOjVweCAwIDAgNXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci1yYWRpdXM6LjAwMDAwMXB4O2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eTowfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDEwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2ssLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre29wYWNpdHk6MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHt0cmFuc2l0aW9uOm5vbmV9XG4iXSwKWyIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdXSwKZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6InRyYW5zaXRpb25NZXNzYWdlcyIsamY6W3t0eXBlOjAsbmFtZToiZW50ZXIiLGc6e3R5cGU6NixnOntvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDAlKSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MSx6Yzoidm9pZCA9PiBlbnRlciIsYW5pbWF0aW9uOlt7dHlwZTo2LGc6e29wYWNpdHk6MCx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTEwMCUpIn0sb2Zmc2V0Om51bGx9LHt0eXBlOjQsZzpudWxsLGtiOiIzMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKSJ9XSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7CmZ1bmN0aW9uIGFFKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsOCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtb3V0bGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2FwIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5kIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUsMCxudWxsLApudWxsLDMsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2siXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg3LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg4LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gYkUoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtcHJlZml4Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLE1tKG51bGwsMCldLG51bGwsbnVsbCl9ZnVuY3Rpb24gY0UoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwzLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDIpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsMSwic3BhbiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMyxudWxsLFsiIiwiIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe2IoYywzLDAsYy5hLmwucGxhY2Vob2xkZXIpfSl9ZnVuY3Rpb24gZEUoYSl7cmV0dXJuIFooMCxbTW0obnVsbCwzKSwoYSgpKCksVigwLG51bGwsbnVsbCwwKSldLG51bGwsbnVsbCl9CmZ1bmN0aW9uIGVFKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwic3BhbiIsW1siYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJjbGFzcyIsIm1hdC1wbGFjZWhvbGRlci1yZXF1aXJlZCBtYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiAqIl0pKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gZkUoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLFtbNCwwXSxbImxhYmVsIiwxXV0sbnVsbCw4LCJsYWJlbCIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1sYWJlbCJdXSxbWzgsImlkIiwwXSxbMSwiZm9yIiwwXSxbMSwiYXJpYS1vd25zIiwwXSxbMiwibWF0LWVtcHR5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZW1wdHkiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdXSxbW251bGwsImNka09ic2VydmVDb250ZW50Il1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNka09ic2VydmVDb250ZW50Ij09PWMmJihkPSExIT09WUQoZSkmJmQpO3JldHVybiBkfSxudWxsLG51bGwpKSxJKDEsMTYzODQsbnVsbCwwLHdvLFtdLHtVajpbMCwibmdTd2l0Y2giXX0sbnVsbCksSSgyLDExOTYwMzIsbnVsbCwwLHp6LFt5eix6LFRdLHtkaXNhYmxlZDpbMCwiZGlzYWJsZWQiXX0se2V2ZW50OiJjZGtPYnNlcnZlQ29udGVudCJ9KSwKKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxjRSkpLEkoNCwyNzg1MjgsbnVsbCwwLHhvLFtFZixEZix3b10se1ZnOlswLCJuZ1N3aXRjaENhc2UiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxkRSkpLEkoNiwyNzg1MjgsbnVsbCwwLHhvLFtFZixEZix3b10se1ZnOlswLCJuZ1N3aXRjaENhc2UiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxlRSkpLEkoOCwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxLDAsZC5DcSgpKTtiKGMsMiwwLCJvdXRsaW5lIiE9ZC5vKTtiKGMsNCwwLCExKTtiKGMsNiwwLCEwKTtiKGMsOCwwLCFkLm55JiZkLmwucmVxdWlyZWQmJiFkLmwuZGlzYWJsZWQpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLGQueHYsZC5sLmlkLGQubC5pZCxkLmwuZW1wdHkmJiFkLkV3LGQubC5lbXB0eSYmCiFkLkV3LCJhY2NlbnQiPT1kLmNvbG9yLCJ3YXJuIj09ZC5jb2xvcil9KX1mdW5jdGlvbiBnRShhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1zdWZmaXgiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksTW0obnVsbCw0KV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gaEUoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLFtbMSwwXSxbInVuZGVybGluZSIsMV1dLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDAsInNwYW4iLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtcmlwcGxlIl1dLFtbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxLDAsImFjY2VudCI9PWQuY29sb3IsIndhcm4iPT1kLmNvbG9yKX0pfQpmdW5jdGlvbiBpRShhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsImRpdiIsW10sW1syNCwiQHRyYW5zaXRpb25NZXNzYWdlcyIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDUpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDAsMCxjLmEuSncpfSl9ZnVuY3Rpb24gakUoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhpbnQiXV0sW1s4LCJpZCIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxLG51bGwsWyIiLCIiXSkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywwLDAsZC5hQyk7YihjLDEsMCxkLm95KX0pfQpmdW5jdGlvbiBrRShhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDUsImRpdiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIiXV0sW1syNCwiQHRyYW5zaXRpb25NZXNzYWdlcyIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGpFKSksSSgyLDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSxNbShudWxsLDYpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLE1tKG51bGwsNyldLGZ1bmN0aW9uKGIsYyl7YihjLDIsMCxjLmEub3kpfSxmdW5jdGlvbihiLGMpe2IoYywwLDAsYy5hLkp3KX0pfQpmdW5jdGlvbiBsRShhKXtyZXR1cm4gWigyLFtYKDY3MTA4ODY0MCwxLHtWUzowfSksWCg0MDI2NTMxODQsMix7WEo6MH0pLFgoNjcxMDg4NjQwLDMseyRSOjB9KSxYKDY3MTA4ODY0MCw0LHtobDowfSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwyMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNSwwLFtbMiwwXSxbImNvbm5lY3Rpb25Db250YWluZXIiLDFdXSxudWxsLDExLCJkaXYiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtZmxleCJdXSxudWxsLFtbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJjbGljayI9PT1jJiYoZT0hMSE9PShmLmwuTnkmJmYubC5OeShkKSkmJmUpO3JldHVybiBlfSxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGFFKSksSSg3LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwKIm5nSWYiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxiRSkpLEkoOSwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCksKGEoKSgpLFcoMTAsMCxbWzMsMF0sWyJpbnB1dENvbnRhaW5lciIsMV1dLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkLWluZml4Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLE1tKG51bGwsMSksKGEoKSgpLFcoMTIsMCxudWxsLG51bGwsMiwic3BhbiIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsZkUpKSxJKDE0LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGdFKSksSSgxNiwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsCiJuZ0lmIl19LG51bGwpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsaEUpKSxJKDE4LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSwoYSgpKCksVygxOSwwLG51bGwsbnVsbCw1LCJkaXYiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgyMCwxNjM4NCxudWxsLDAsd28sW10se1VqOlswLCJuZ1N3aXRjaCJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGlFKSksSSgyMiwyNzg1MjgsbnVsbCwwLHhvLFtFZixEZix3b10se1ZnOlswLCJuZ1N3aXRjaENhc2UiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxrRSkpLEkoMjQsMjc4NTI4LG51bGwsMCx4byxbRWYsRGYsd29dLHtWZzpbMCwibmdTd2l0Y2hDYXNlIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsNywwLAoib3V0bGluZSI9PWQubyk7YihjLDksMCxkLkpiLmxlbmd0aCk7YihjLDE0LDAsZC51YigpKTtiKGMsMTYsMCxkLkxiLmxlbmd0aCk7YihjLDE4LDAsIm91dGxpbmUiIT1kLm8pO2IoYywyMCwwLGQuQ0IoKSk7YihjLDIyLDAsImVycm9yIik7YihjLDI0LDAsImhpbnQiKX0sbnVsbCl9O2Z1bmN0aW9uIG1FKGEpe3JldHVybiBFcnJvcignVW5hYmxlIHRvIGZpbmQgaWNvbiB3aXRoIHRoZSBuYW1lICInK2ErJyInKX12YXIgbkU9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5kQz1hO3RoaXMuQkQ9Yjt0aGlzLkt1PWQ7dGhpcy5Ldz1uZXcgTWFwO3RoaXMuR3E9bmV3IE1hcDt0aGlzLkFKPW5ldyBNYXA7dGhpcy5odj1uZXcgTWFwO3RoaXMuTks9bmV3IE1hcDt0aGlzLnBLPSJtYXRlcmlhbC1pY29ucyI7dGhpcy51PWN9LG9FPWZ1bmN0aW9uKGEsYixjKXtjPXZvaWQgMD09PWM/IiI6Yzt2YXIgZD1jKyI6IitiLGU9YS5Ldy5nZXQoZCk7cmV0dXJuIGU/YS5mTChlKTooYz1hLkdxLmdldChjKSk/YS5nTChiLGMpOmdpKG1FKGQpKX07aD1uRS5wcm90b3R5cGU7aC5YPWZ1bmN0aW9uKCl7dGhpcy5Ldy5jbGVhcigpO3RoaXMuR3EuY2xlYXIoKTt0aGlzLkFKLmNsZWFyKCl9OwpoLmZMPWZ1bmN0aW9uKGEpe3JldHVybiBhLmlnP2ZpKGEuaWcuY2xvbmVOb2RlKCEwKSk6dGhpcy5STChhKS5iKFVsKGZ1bmN0aW9uKGIpe3JldHVybiBhLmlnPWJ9KSx1aShmdW5jdGlvbihiKXtyZXR1cm4gYi5jbG9uZU5vZGUoITApfSkpfTtoLmdMPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcyxkPXRoaXMubEIoYSxiKTtpZihkKXJldHVybiBmaShkKTtkPWIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmlnfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjLlNMKGUpLmIoTmsoZnVuY3Rpb24oZil7Zj0iTG9hZGluZyBpY29uIHNldCBVUkw6ICIrYy5CRC5HaSg1LGUudXJsKSsiIGZhaWxlZDogIitmLm1lc3NhZ2U7Yy5LdS5oYW5kbGVFcnJvcihFcnJvcihmKSk7cmV0dXJuIGZpKG51bGwpfSkpfSk7cmV0dXJuIFRpKGQpLmIodWkoZnVuY3Rpb24oKXt2YXIgZT1jLmxCKGEsYik7aWYoIWUpdGhyb3cgbUUoYSk7cmV0dXJuIGV9KSl9OwpoLmxCPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWIubGVuZ3RoLTE7MDw9YztjLS0pe3ZhciBkPWJbY107aWYoZC5pZyYmKGQ9dGhpcy5JSyhkLmlnLGEsZC5vcHRpb25zKSkpcmV0dXJuIGR9cmV0dXJuIG51bGx9O2guUkw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztyZXR1cm4gdGhpcy5uQihhKS5iKHVpKGZ1bmN0aW9uKGMpe3JldHVybiBiLmpLKGMsYS5vcHRpb25zKX0pKX07aC5TTD1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3JldHVybiBhLmlnP2ZpKGEuaWcpOnRoaXMubkIoYSkuYih1aShmdW5jdGlvbihjKXthLmlnfHwoYS5pZz1iLkNyKGMpKTtyZXR1cm4gYS5pZ30pKX07aC5qSz1mdW5jdGlvbihhLGIpe2E9dGhpcy5DcihhKTt0aGlzLnZyKGEsYik7cmV0dXJuIGF9OwpoLklLPWZ1bmN0aW9uKGEsYixjKXthPWEucXVlcnlTZWxlY3RvcignW2lkPSInK2IrJyJdJyk7aWYoIWEpcmV0dXJuIG51bGw7YT1hLmNsb25lTm9kZSghMCk7YS5yZW1vdmVBdHRyaWJ1dGUoImlkIik7aWYoInN2ZyI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHRoaXMudnIoYSxjKTtpZigic3ltYm9sIj09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdGhpcy52cih0aGlzLk1OKGEpLGMpO2I9dGhpcy5DcigiPHN2Zz48L3N2Zz4iKTtiLmFwcGVuZENoaWxkKGEpO3JldHVybiB0aGlzLnZyKGIsYyl9O2guQ3I9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LmNyZWF0ZUVsZW1lbnQoIkRJViIpO2IuaW5uZXJIVE1MPWE7YT1iLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpO2lmKCFhKXRocm93IEVycm9yKCI8c3ZnPiB0YWcgbm90IGZvdW5kIik7cmV0dXJuIGF9OwpoLk1OPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLkNyKCI8c3ZnPjwvc3ZnPiIpLGM9YS5hdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXSxmPWUubmFtZTtlPWUudmFsdWU7ImlkIiE9PWYmJmIuc2V0QXR0cmlidXRlKGYsZSl9Zm9yKGM9MDtjPGEuY2hpbGROb2Rlcy5sZW5ndGg7YysrKWEuY2hpbGROb2Rlc1tjXS5ub2RlVHlwZT09PXRoaXMudS5FTEVNRU5UX05PREUmJmIuYXBwZW5kQ2hpbGQoYS5jaGlsZE5vZGVzW2NdLmNsb25lTm9kZSghMCkpO3JldHVybiBifTsKaC52cj1mdW5jdGlvbihhLGIpe2Euc2V0QXR0cmlidXRlKCJmaXQiLCIiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgicHJlc2VydmVBc3BlY3RSYXRpbyIsInhNaWRZTWlkIG1lZXQiKTthLnNldEF0dHJpYnV0ZSgiZm9jdXNhYmxlIiwiZmFsc2UiKTtiJiZiLkVSJiZhLnNldEF0dHJpYnV0ZSgidmlld0JveCIsYi5FUik7cmV0dXJuIGF9OwpoLm5CPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkPWEudXJsO2E9YS5vcHRpb25zO2E9bnVsbCE9PShjPW51bGw9PT1hfHx2b2lkIDA9PT1hP3ZvaWQgMDphLndpdGhDcmVkZW50aWFscykmJnZvaWQgMCE9PWM/YzohMTtpZighdGhpcy5kQyl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgSHR0cENsaWVudCBwcm92aWRlciBmb3IgdXNlIHdpdGggQW5ndWxhciBNYXRlcmlhbCBpY29ucy4gUGxlYXNlIGluY2x1ZGUgdGhlIEh0dHBDbGllbnRNb2R1bGUgZnJvbSBAYW5ndWxhci9jb21tb24vaHR0cCBpbiB5b3VyIGFwcCBpbXBvcnRzLiIpO2lmKG51bGw9PWQpdGhyb3cgRXJyb3IoJ0Nhbm5vdCBmZXRjaCBpY29uIGZyb20gVVJMICInK2QrJyIuJyk7dmFyIGU9dGhpcy5CRC5HaSg1LGQpO2lmKCFlKXRocm93IEVycm9yKCJUaGUgVVJMIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkwgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzIFwiIisKKGQrJyIuJykpO2lmKGQ9dGhpcy5odi5nZXQoZSkpcmV0dXJuIGQ7ZD10aGlzLmRDLmdldChlLHtyZXNwb25zZVR5cGU6InRleHQiLHdpdGhDcmVkZW50aWFsczphfSkuYihxbChmdW5jdGlvbigpe3JldHVybiBiLmh2LmRlbGV0ZShlKX0pLEpsKCkpO3RoaXMuaHYuc2V0KGUsZCk7cmV0dXJuIGR9O2guT1I9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuS3cuc2V0KGErIjoiK2IsYyk7cmV0dXJuIHRoaXN9O2guUFI9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLkdxLmdldChhKTtjP2MucHVzaChiKTp0aGlzLkdxLnNldChhLFtiXSk7cmV0dXJuIHRoaXN9O25FLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuRShtZChBdCw4KSxtZChhcSksbWQoTG8sOCksbWQodWQpKX0sTDpuRSxZOiJyb290In0pO25ldyBkZDtuZXcgZmQ7bmV3IGRkO25ldyBkZDt2YXIgcEU9ZkMoZnVuY3Rpb24oYSl7dGhpcy5tPWF9KSxyRT1uZXcgeSgibWF0LWljb24tbG9jYXRpb24iLHtZOiJyb290IixWOnFFfSk7ZnVuY3Rpb24gcUUoKXt2YXIgYT1tZChMbyksYj1hP2EubG9jYXRpb246bnVsbDtyZXR1cm57eXM6ZnVuY3Rpb24oKXtyZXR1cm4gYj9iLnBhdGhuYW1lK2Iuc2VhcmNoOiIifX19CnZhciBzRT0iY2xpcC1wYXRoIGNvbG9yLXByb2ZpbGUgc3JjIGN1cnNvciBmaWxsIGZpbHRlciBtYXJrZXIgbWFya2VyLXN0YXJ0IG1hcmtlci1taWQgbWFya2VyLWVuZCBtYXNrIHN0cm9rZSIuc3BsaXQoIiAiKSx0RT1zRS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIlsiK2ErIl0ifSkuam9pbigiLCAiKSx1RT0vXnVybFwoWyciXT8jKC4qPylbJyJdP1wpJC8sdkU9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1wRS5jYWxsKHRoaXMsYSl8fHRoaXM7Zi5mdj1iO2Yuamo9ZDtmLkt1PWU7Zi5mQz0hMTtmLnl1PU1oLkVNUFRZO2N8fGEuaS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3JldHVybiBmfTt0KHZFLHBFKTtoPXZFLnByb3RvdHlwZTsKaC54Tj1mdW5jdGlvbihhKXtpZighYSlyZXR1cm5bIiIsIiJdO3ZhciBiPWEuc3BsaXQoIjoiKTtzd2l0Y2goYi5sZW5ndGgpe2Nhc2UgMTpyZXR1cm5bIiIsYlswXV07Y2FzZSAyOnJldHVybiBiO2RlZmF1bHQ6dGhyb3cgRXJyb3IoJ0ludmFsaWQgaWNvbiBuYW1lOiAiJythKyciJyk7fX07aC5TYT1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2lmKGE9YS5zdmdJY29uKWlmKHRoaXMueXUudW5zdWJzY3JpYmUoKSx0aGlzLmRJKXthPW4odGhpcy54Tih0aGlzLmRJKSk7dmFyIGM9YS5uZXh0KCkudmFsdWUsZD1hLm5leHQoKS52YWx1ZTt0aGlzLnl1PW9FKHRoaXMuZnYsZCxjKS5iKGdsKCkpLnN1YnNjcmliZShmdW5jdGlvbihlKXtyZXR1cm4gYi5xTihlKX0sZnVuY3Rpb24oZSl7Yi5LdS5oYW5kbGVFcnJvcihFcnJvcigiRXJyb3IgcmV0cmlldmluZyBpY29uICIrYysiOiIrZCsiISAiK2UubWVzc2FnZSkpfSl9ZWxzZSBhLkNpJiZ0aGlzLklBKCk7dGhpcy5meCgpJiZ0aGlzLmpFKCl9OwpoLk9iPWZ1bmN0aW9uKCl7dGhpcy5meCgpJiZ0aGlzLmpFKCl9O2guSUc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlhpO2EmJmEuc2l6ZSYmKGE9dGhpcy5qai55cygpLGEhPT10aGlzLmVEJiYodGhpcy5lRD1hLHRoaXMuYkQoYSkpKX07aC5YPWZ1bmN0aW9uKCl7dGhpcy55dS51bnN1YnNjcmliZSgpO3RoaXMuWGkmJnRoaXMuWGkuY2xlYXIoKX07aC5meD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmRJfTtoLnFOPWZ1bmN0aW9uKGEpe3RoaXMuSUEoKTtmb3IodmFyIGI9YS5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLnRleHRDb250ZW50Kz0iICI7dGhpcy5lRD1iPXRoaXMuamoueXMoKTt0aGlzLnpKKGEpO3RoaXMuYkQoYik7dGhpcy5tLmkuYXBwZW5kQ2hpbGQoYSl9OwpoLklBPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLmksYj1hLmNoaWxkTm9kZXMubGVuZ3RoO2Zvcih0aGlzLlhpJiZ0aGlzLlhpLmNsZWFyKCk7Yi0tOyl7dmFyIGM9YS5jaGlsZE5vZGVzW2JdOzE9PT1jLm5vZGVUeXBlJiYic3ZnIiE9PWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKXx8YS5yZW1vdmVDaGlsZChjKX19O2guakU9ZnVuY3Rpb24oKXtpZih0aGlzLmZ4KCkpe3ZhciBhPXRoaXMubS5pO2lmKHRoaXMuQ0Ype3ZhciBiPXRoaXMuQ0Y7Yj10aGlzLmZ2Lk5LLmdldChiKXx8Yn1lbHNlIGI9dGhpcy5mdi5wSztiIT10aGlzLml3JiYodGhpcy5pdyYmYS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuaXcpLGImJmEuY2xhc3NMaXN0LmFkZChiKSx0aGlzLml3PWIpO3RoaXMuc3MhPXRoaXMuaHcmJih0aGlzLmh3JiZhLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5odyksdGhpcy5zcyYmYS5jbGFzc0xpc3QuYWRkKHRoaXMuc3MpLHRoaXMuaHc9dGhpcy5zcyl9fTsKaC5GQT1mdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBhP2EudHJpbSgpLnNwbGl0KCIgIilbMF06YX07aC5iRD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLlhpO2ImJmIuZm9yRWFjaChmdW5jdGlvbihjLGQpe2MuZm9yRWFjaChmdW5jdGlvbihlKXtkLnNldEF0dHJpYnV0ZShlLm5hbWUsInVybCgnIithKyIjIitlLnZhbHVlKyInKSIpfSl9KX07aC56Sj1mdW5jdGlvbihhKXt2YXIgYj1hLnF1ZXJ5U2VsZWN0b3JBbGwodEUpLGM9dGhpcy5YaT10aGlzLlhpfHxuZXcgTWFwO2ZvcihhPXtDbTowfTthLkNtPGIubGVuZ3RoO2E9e0NtOmEuQ219LGEuQ20rKylzRS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgZj1iW2QuQ21dLGc9Zi5nZXRBdHRyaWJ1dGUoZSk7aWYoZz1nP2cubWF0Y2godUUpOm51bGwpe3ZhciBsPWMuZ2V0KGYpO2x8fChsPVtdLGMuc2V0KGYsbCkpO2wucHVzaCh7bmFtZTplLHZhbHVlOmdbMV19KX19fShhKSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZFLnByb3RvdHlwZSx7aW5saW5lOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mQ30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuZkM9dHooYSl9fSxDRjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUEt9LHNldDpmdW5jdGlvbihhKXt0aGlzLlBLPXRoaXMuRkEoYSl9fSxzczp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT0t9LHNldDpmdW5jdGlvbihhKXt0aGlzLk9LPXRoaXMuRkEoYSl9fX0pO3ZhciB3RT1mdW5jdGlvbigpe307dmFyIHhFPWNnKHtUOjIsZzpbWyIubWF0LWljb257YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZpbGw6Y3VycmVudENvbG9yO2hlaWdodDoyNHB4O3dpZHRoOjI0cHh9Lm1hdC1pY29uLm1hdC1pY29uLWlubGluZXtmb250LXNpemU6aW5oZXJpdDtoZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O3dpZHRoOmluaGVyaXR9W2Rpcj1ydGxdIC5tYXQtaWNvbi1ydGwtbWlycm9ye3RyYW5zZm9ybTpzY2FsZSgtMSwgMSl9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue21hcmdpbjphdXRvfVxuIl1dLApkYXRhOnt9fSk7ZnVuY3Rpb24geUUoKXtyZXR1cm4gWigyLFtNbShudWxsLDApXSxudWxsLG51bGwpfTt2YXIgekU9ImJ1dHRvbiBjaGVja2JveCBmaWxlIGhpZGRlbiBpbWFnZSByYWRpbyByYW5nZSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIiksQUU9MCxCRT1tQyhmdW5jdGlvbihhLGIsYyxkKXt0aGlzLm9LPWE7dGhpcy5WQz1iO3RoaXMuV0M9Yzt0aGlzLnFjPWR9KSxDRT1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGwsbSl7dmFyIHA9QkUuY2FsbCh0aGlzLGYsZCxlLGMpfHx0aGlzO3AubT1hO3AuZWE9YjtwLnFjPWM7cC5yQT1sO3AuYng9Im1hdC1pbnB1dC0iK0FFKys7cC5mb2N1c2VkPSExO3Aud2I9bmV3IFloO3AuZ3M9Im1hdC1pbnB1dCI7cC5BYj0hMTtwLk9hPSExO3AuWWM9ITE7cC53aj0idGV4dCI7cC5sRD0hMTtwLmFNPSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayIuc3BsaXQoIiAiKS5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIER6KCkuaGFzKHIpfSk7Yz1wLm0uaTt2YXIgcT1jLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cC5nQz1nfHwKYztwLmREPXAudmFsdWU7cC5pZD1wLmlkO2IuVnQmJm0ub2EoZnVuY3Rpb24oKXthLmkuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKHIpe3I9ci50YXJnZXQ7ci52YWx1ZXx8ci5zZWxlY3Rpb25TdGFydHx8ci5zZWxlY3Rpb25FbmR8fChyLnNldFNlbGVjdGlvblJhbmdlKDEsMSksci5zZXRTZWxlY3Rpb25SYW5nZSgwLDApKX0pfSk7cC5RZD0hcC5lYS55YTtwLlZjPSJzZWxlY3QiPT09cTtwLktMPSJ0ZXh0YXJlYSI9PT1xO3AuVmMmJihwLmdzPWMubXVsdGlwbGU/Im1hdC1uYXRpdmUtc2VsZWN0LW11bHRpcGxlIjoibWF0LW5hdGl2ZS1zZWxlY3QiKTtyZXR1cm4gcH07dChDRSxCRSk7aD1DRS5wcm90b3R5cGU7aC5MYz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5lYS55YSYmdGhpcy5yQS5VZyh0aGlzLm0uaSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe2EuQWI9Yi5kRzthLndiLm5leHQoKX0pfTtoLlNhPWZ1bmN0aW9uKCl7dGhpcy53Yi5uZXh0KCl9OwpoLlg9ZnVuY3Rpb24oKXt0aGlzLndiLmNvbXBsZXRlKCk7dGhpcy5lYS55YSYmdGhpcy5yQS55Zih0aGlzLm0uaSl9O2gudGk9ZnVuY3Rpb24oKXt0aGlzLnFjJiZ0aGlzLnBJKCk7dGhpcy54SygpfTtoLmZvY3VzPWZ1bmN0aW9uKGEpe3RoaXMubS5pLmZvY3VzKGEpfTtoLiRhPWZ1bmN0aW9uKGEpe2E9PT10aGlzLmZvY3VzZWR8fHRoaXMuRGQmJmF8fCh0aGlzLmZvY3VzZWQ9YSx0aGlzLndiLm5leHQoKSl9O2guUmQ9ZnVuY3Rpb24oKXt9O2gueEs9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uaS52YWx1ZTt0aGlzLmREIT09YSYmKHRoaXMuZEQ9YSx0aGlzLndiLm5leHQoKSl9O2gubU89ZnVuY3Rpb24oKXtpZigtMTx6RS5pbmRleE9mKHRoaXMud2opKXRocm93IEVycm9yKCdJbnB1dCB0eXBlICInK3RoaXMud2orIlwiIGlzbid0IHN1cHBvcnRlZCBieSBtYXRJbnB1dC4iKTt9O2guR0w9ZnVuY3Rpb24oKXtyZXR1cm4tMTx0aGlzLmFNLmluZGV4T2YodGhpcy53ail9OwpoLkNMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLmkudmFsaWRpdHk7cmV0dXJuIGEmJmEuYmFkSW5wdXR9O2guSkg9ZnVuY3Rpb24oYSl7dGhpcy5GYj1hLmpvaW4oIiAiKX07aC5OeT1mdW5jdGlvbigpe3RoaXMuZm9jdXNlZHx8dGhpcy5mb2N1cygpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDRS5wcm90b3R5cGUse2Rpc2FibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYyYmbnVsbCE9PXRoaXMucWMuZGlzYWJsZWQ/dGhpcy5xYy5kaXNhYmxlZDp0aGlzLk9hfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5PYT10eihhKTt0aGlzLmZvY3VzZWQmJih0aGlzLmZvY3VzZWQ9ITEsdGhpcy53Yi5uZXh0KCkpfX0saWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhqfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5oaj1hfHx0aGlzLmJ4fX0scmVxdWlyZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlljfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ZYz10eihhKX19LHR5cGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndqfSwKc2V0OmZ1bmN0aW9uKGEpe3RoaXMud2o9YXx8InRleHQiO3RoaXMubU8oKTshdGhpcy5LTCYmRHooKS5oYXModGhpcy53aikmJih0aGlzLm0uaS50eXBlPXRoaXMud2opfX0sdmFsdWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdDLnZhbHVlfSxzZXQ6ZnVuY3Rpb24oYSl7YSE9PXRoaXMudmFsdWUmJih0aGlzLmdDLnZhbHVlPWEsdGhpcy53Yi5uZXh0KCkpfX0sRGQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxEfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5sRD10eihhKX19LGVtcHR5Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5HTCgpJiYhdGhpcy5tLmkudmFsdWUmJiF0aGlzLkNMKCkmJiF0aGlzLkFifX0sUEg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHRoaXMuVmMpe3ZhciBhPQp0aGlzLm0uaSxiPWEub3B0aW9uc1swXTtyZXR1cm4gdGhpcy5mb2N1c2VkfHxhLm11bHRpcGxlfHwhdGhpcy5lbXB0eXx8ISEoLTE8YS5zZWxlY3RlZEluZGV4JiZiJiZiLmxhYmVsKX1yZXR1cm4gdGhpcy5mb2N1c2VkfHwhdGhpcy5lbXB0eX19fSk7dmFyIERFPWZ1bmN0aW9uKCl7fTt2YXIgRUU9bmV3IHkoIk1BVF9NRU5VX1BBTkVMIik7dmFyIEZFPWtDKGxDKGZ1bmN0aW9uKCl7fSkpLEdFPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPUZFLmNhbGwodGhpcyl8fHRoaXM7ZS5tPWE7ZS52YT1jO2UuWGM9ZDtlLnJvbGU9Im1lbnVpdGVtIjtlLmdqPW5ldyBZaDtlLmFqPW5ldyBZaDtlLmR2PSExO2UuWnc9ITE7ZS51PWI7cmV0dXJuIGV9O3QoR0UsRkUpO2g9R0UucHJvdG90eXBlO2guZm9jdXM9ZnVuY3Rpb24oYSxiKXt0aGlzLnZhP1N6KHRoaXMudmEsdGhpcy5PZCgpLHZvaWQgMD09PWE/InByb2dyYW0iOmEsYik6dGhpcy5PZCgpLmZvY3VzKGIpO3RoaXMuYWoubmV4dCh0aGlzKX07aC5MYz1mdW5jdGlvbigpe3RoaXMudmEmJnRoaXMudmEuVWcodGhpcy5tLCExKX07aC5YPWZ1bmN0aW9uKCl7dGhpcy52YSYmdGhpcy52YS55Zih0aGlzLm0pO3RoaXMuWGMmJnRoaXMuWGMucmVtb3ZlSXRlbSYmdGhpcy5YYy5yZW1vdmVJdGVtKHRoaXMpO3RoaXMuZ2ouY29tcGxldGUoKTt0aGlzLmFqLmNvbXBsZXRlKCl9OwpoLlRjPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Ii0xIjoiMCJ9O2guT2Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tLml9O2guQkE9ZnVuY3Rpb24oYSl7dGhpcy5kaXNhYmxlZCYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX07aC5QQj1mdW5jdGlvbigpe3RoaXMuZ2oubmV4dCh0aGlzKX07aC5neT1mdW5jdGlvbigpe3ZhciBhPXRoaXMubS5pLGI9dGhpcy51P3RoaXMudS5URVhUX05PREU6MyxjPSIiO2lmKGEuY2hpbGROb2Rlcylmb3IodmFyIGQ9YS5jaGlsZE5vZGVzLmxlbmd0aCxlPTA7ZTxkO2UrKylhLmNoaWxkTm9kZXNbZV0ubm9kZVR5cGU9PT1iJiYoYys9YS5jaGlsZE5vZGVzW2VdLnRleHRDb250ZW50KTtyZXR1cm4gYy50cmltKCl9O3ZhciBJRT1uZXcgeSgibWF0LW1lbnUtZGVmYXVsdC1vcHRpb25zIix7WToicm9vdCIsVjpIRX0pO2Z1bmN0aW9uIEhFKCl7cmV0dXJue1Z5OiExLExwOiJhZnRlciIsUXQ6ImJlbG93Iix4YzoiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AifX12YXIgSkU9MCxLRT1mdW5jdGlvbihhLGIsYyl7dGhpcy5tPWE7dGhpcy5TPWI7dGhpcy5sZD1jO3RoaXMuQkU9dGhpcy5sZC5McDt0aGlzLkNFPXRoaXMubGQuUXQ7dGhpcy5HZj1uZXcgbW07dGhpcy5URD1NaC5FTVBUWTt0aGlzLlVpPXt9O3RoaXMuJHY9InZvaWQiO3RoaXMuSm09bmV3IFloO3RoaXMuWEc9dGhpcy5sZC5YR3x8IiI7dGhpcy54Yz10aGlzLmxkLnhjO3RoaXMuU0M9dGhpcy5sZC5WeTt0aGlzLlltPXRoaXMubGQucGM7dGhpcy5jbG9zZT10aGlzLmNsb3NlZD1uZXcgcms7dGhpcy5XeT0ibWF0LW1lbnUtcGFuZWwtIitKRSsrfTtoPUtFLnByb3RvdHlwZTtoLk9iPWZ1bmN0aW9uKCl7dGhpcy5zcCgpfTsKaC5xZj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5hTygpO3RoaXMuUGE9eUEodUEobmV3IEZBKHRoaXMuR2YpKSk7dGhpcy5URD10aGlzLlBhLkJ6LnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBhLmNsb3NlZC5lbWl0KCJ0YWIiKX0pO3RoaXMuR2YuWmIuYihObCh0aGlzLkdmKSxPbChmdW5jdGlvbihiKXtyZXR1cm4gWWouYXBwbHkobnVsbCxqYShiLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gYy5han0pKSl9KSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGIpe3JldHVybiB6QShhLlBhLGIpfSl9O2guWD1mdW5jdGlvbigpe3RoaXMuR2YuZGVzdHJveSgpO3RoaXMuVEQudW5zdWJzY3JpYmUoKTt0aGlzLmNsb3NlZC5jb21wbGV0ZSgpfTtoLmdqPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2YuWmIuYihObCh0aGlzLkdmKSxPbChmdW5jdGlvbihhKXtyZXR1cm4gWWouYXBwbHkobnVsbCxqYShhLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi5nan0pKSl9KSl9O2gucmVtb3ZlSXRlbT1mdW5jdGlvbigpe307CmguSGE9ZnVuY3Rpb24oYSl7dmFyIGI9YS5rZXlDb2RlLGM9dGhpcy5QYTtzd2l0Y2goYil7Y2FzZSAyNzpzQShhKXx8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlZC5lbWl0KCJrZXlkb3duIikpO2JyZWFrO2Nhc2UgMzc6dGhpcy4kcyYmImx0ciI9PT10aGlzLmRpcmVjdGlvbiYmdGhpcy5jbG9zZWQuZW1pdCgia2V5ZG93biIpO2JyZWFrO2Nhc2UgMzk6dGhpcy4kcyYmInJ0bCI9PT10aGlzLmRpcmVjdGlvbiYmdGhpcy5jbG9zZWQuZW1pdCgia2V5ZG93biIpO2JyZWFrO2Nhc2UgMzY6Y2FzZSAzNTpzQShhKXx8KDM2PT09Yj9jLkVoKDAsMSk6REEoYyksYS5wcmV2ZW50RGVmYXVsdCgpKTticmVhaztkZWZhdWx0OmlmKDM4PT09Ynx8NDA9PT1iKWMuS2Y9ImtleWJvYXJkIjtDQShjLGEpfX07CnZhciBMRT1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8icHJvZ3JhbSI6YjthLlNnPyRoKGEuUy5yZikuYihnbCgpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gYS56QihiKX0pOmEuekIoYil9O2g9S0UucHJvdG90eXBlO2guekI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QYTtiLktmPWE7Yi5FaCgwLDEpO2lmKCFiLndjJiZ0aGlzLkdmLmxlbmd0aClmb3IoYT10aGlzLkdmLmZpcnN0Lk9kKCkucGFyZW50RWxlbWVudDthOylpZigibWVudSI9PT1hLmdldEF0dHJpYnV0ZSgicm9sZSIpKXthLmZvY3VzKCk7YnJlYWt9ZWxzZSBhPWEucGFyZW50RWxlbWVudH07CmguS0g9ZnVuY3Rpb24oYSl7YT0ibWF0LWVsZXZhdGlvbi16IitNYXRoLm1pbig0K2EsMjQpO3ZhciBiPU9iamVjdC5rZXlzKHRoaXMuVWkpLmZpbmQoZnVuY3Rpb24oYyl7cmV0dXJuIGMuc3RhcnRzV2l0aCgibWF0LWVsZXZhdGlvbi16Iil9KTtiJiZiIT09dGhpcy5nd3x8KHRoaXMuZ3cmJih0aGlzLlVpW3RoaXMuZ3ddPSExKSx0aGlzLlVpW2FdPSEwLHRoaXMuZ3c9YSl9O2guc3A9ZnVuY3Rpb24oYSxiKXthPXZvaWQgMD09PWE/dGhpcy5McDphO2I9dm9pZCAwPT09Yj90aGlzLlF0OmI7dmFyIGM9dGhpcy5VaTtjWyJtYXQtbWVudS1iZWZvcmUiXT0iYmVmb3JlIj09PWE7Y1sibWF0LW1lbnUtYWZ0ZXIiXT0iYWZ0ZXIiPT09YTtjWyJtYXQtbWVudS1hYm92ZSJdPSJhYm92ZSI9PT1iO2NbIm1hdC1tZW51LWJlbG93Il09ImJlbG93Ij09PWJ9O2gueU49ZnVuY3Rpb24oKXt0aGlzLiR2PSJlbnRlciJ9O2guVU09ZnVuY3Rpb24oKXt0aGlzLiR2PSJ2b2lkIn07CmguU3Y9ZnVuY3Rpb24oYSl7dGhpcy5KbS5uZXh0KGEpO3RoaXMucUM9ITF9O2guVHY9ZnVuY3Rpb24oYSl7dGhpcy5xQz0hMDsiZW50ZXIiPT09YS5pYiYmMD09PXRoaXMuUGEuUHImJihhLmVsZW1lbnQuc2Nyb2xsVG9wPTApfTtoLmFPPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLlp0LlpiLmIoTmwodGhpcy5adCkpLnN1YnNjcmliZShmdW5jdGlvbihiKXthLkdmLnJlc2V0KGIuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLlhjPT09YX0pKTtubShhLkdmKX0pfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhLRS5wcm90b3R5cGUse0xwOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5CRX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJiZWZvcmUiIT09YSYmImFmdGVyIiE9PWEpdGhyb3cgRXJyb3IoJ3hQb3NpdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcJ2JlZm9yZVwnIG9yIGFmdGVyXCcuXG4gICAgICBFeGFtcGxlOiA8bWF0LW1lbnUgeFBvc2l0aW9uPSJiZWZvcmUiICNtZW51PSJtYXRNZW51Ij48L21hdC1tZW51PicpO3RoaXMuQkU9YTt0aGlzLnNwKCl9fSxRdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ0V9LHNldDpmdW5jdGlvbihhKXtpZigiYWJvdmUiIT09YSYmImJlbG93IiE9PWEpdGhyb3cgRXJyb3IoJ3lQb3NpdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcJ2Fib3ZlXCcgb3IgYmVsb3dcJy5cbiAgICAgIEV4YW1wbGU6IDxtYXQtbWVudSB5UG9zaXRpb249ImFib3ZlIiAjbWVudT0ibWF0TWVudSI+PC9tYXQtbWVudT4nKTsKdGhpcy5DRT1hO3RoaXMuc3AoKX19LFZ5Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TQ30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuU0M9dHooYSl9fSxwYzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWW19LHNldDpmdW5jdGlvbihhKXt0aGlzLlltPXR6KGEpfX0scmI6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9dGhpcy5FTTtjJiZjLmxlbmd0aCYmYy5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZCl7Yi5VaVtkXT0hMX0pOyh0aGlzLkVNPWEpJiZhLmxlbmd0aCYmKGEuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2IuVWlbZF09ITB9KSx0aGlzLm0uaS5jbGFzc05hbWU9IiIpfX0sY2xhc3NMaXN0Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYn0sCnNldDpmdW5jdGlvbihhKXt0aGlzLnJiPWF9fX0pO3ZhciBNRT1mdW5jdGlvbigpe0tFLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dChNRSxLRSk7dmFyIE5FPWZ1bmN0aW9uKGEsYixjKXtNRS5jYWxsKHRoaXMsYSxiLGMpfTt0KE5FLE1FKTt2YXIgT0U9bmV3IHkoIm1hdC1tZW51LXNjcm9sbC1zdHJhdGVneSIpO2Z1bmN0aW9uIFBFKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmxwLmx0KCl9fXZhciBRRT1Heih7cGFzc2l2ZTohMH0pLFNFPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCl7dmFyIG09dGhpczt0aGlzLnRkPWE7dGhpcy5rYT1iO3RoaXMuemI9Yzt0aGlzLlhjPWU7dGhpcy5UcT1mO3RoaXMuR2E9Zzt0aGlzLnZhPWw7dGhpcy5zPW51bGw7dGhpcy5sbD0hMTt0aGlzLkl2PXRoaXMuY0M9dGhpcy51dT1NaC5FTVBUWTt0aGlzLlJCPWZ1bmN0aW9uKCl7cmV0dXJuIG0ubWo9InRvdWNoIn07dGhpcy5taj1udWxsO3RoaXMubXo9ITA7dGhpcy5zUT1uZXcgcms7dGhpcy5yUT1uZXcgcms7Yi5pLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuUkIsUUUpO2YmJihmLlp3PVJFKHRoaXMpKTt0aGlzLnZkPWR9O1NFLnByb3RvdHlwZS5xZj1mdW5jdGlvbigpe3RoaXMuQ0EoKTt0aGlzLmxMKCl9OwpTRS5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMucyYmKHRoaXMucy4kYigpLHRoaXMucz1udWxsKTt0aGlzLmthLmkucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5SQixRRSk7dGhpcy5Jdi51bnN1YnNjcmliZSgpO3RoaXMudXUudW5zdWJzY3JpYmUoKTt0aGlzLmNDLnVuc3Vic2NyaWJlKCl9O3ZhciBSRT1mdW5jdGlvbihhKXtyZXR1cm4hKCFhLlRxfHwhYS5YYyl9LFRFPWZ1bmN0aW9uKGEpe2lmKCFhLmxsKXthLkNBKCk7dmFyIGI9YS5vZygpLGM9Yi5XO2Eub04oYy5NZSk7Yy5wYz1udWxsPT1hLnVhLnBjPyFSRShhKTphLnVhLnBjO2IuY2IoYS5jTCgpKTthLnVhLlNnJiZhLnVhLlNnLmNiKGEuRFMpO2EudXU9YS5XTCgpLnN1YnNjcmliZShmdW5jdGlvbigpe2EudWEuY2xvc2UuZW1pdCgpfSk7YS51TCgpO2EudWEgaW5zdGFuY2VvZiBNRSYmYS51YS55TigpfX07aD1TRS5wcm90b3R5cGU7CmguZm9jdXM9ZnVuY3Rpb24oYSxiKXt0aGlzLnZhP1N6KHRoaXMudmEsdGhpcy5rYSx2b2lkIDA9PT1hPyJwcm9ncmFtIjphLGIpOnRoaXMua2EuaS5mb2N1cyhiKX07aC50Sz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYodGhpcy5zJiZ0aGlzLk1vKXt2YXIgYj10aGlzLnVhO3RoaXMudXUudW5zdWJzY3JpYmUoKTt0aGlzLnMuZGV0YWNoKCk7dGhpcy53bCgpO2IgaW5zdGFuY2VvZiBNRT8oYi5VTSgpLGIuU2c/Yi5KbS5iKGFrKGZ1bmN0aW9uKGMpe3JldHVybiJ2b2lkIj09PWMuaWJ9KSxnbCgpLFJsKGIuU2cuUlIpKS5zdWJzY3JpYmUoe25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gYi5TZy5kZXRhY2goKX0sY29tcGxldGU6ZnVuY3Rpb24oKXtyZXR1cm4gYS51cighMSl9fSk6dGhpcy51cighMSkpOih0aGlzLnVyKCExKSxiLlNnJiZiLlNnLmRldGFjaCgpKX19OwpoLnVMPWZ1bmN0aW9uKCl7dGhpcy51YS4kcz1SRSh0aGlzKT90aGlzLlhjOnZvaWQgMDt0aGlzLnVhLmRpcmVjdGlvbj10aGlzLmRpcjt0aGlzLmxOKCk7dGhpcy51cighMCk7TEUodGhpcy51YSx0aGlzLm1qfHwicHJvZ3JhbSIpfTtoLmxOPWZ1bmN0aW9uKCl7aWYodGhpcy51YS5LSCl7Zm9yKHZhciBhPTAsYj10aGlzLnVhLiRzO2I7KWErKyxiPWIuJHM7dGhpcy51YS5LSChhKX19O2gud2w9ZnVuY3Rpb24oKXt0aGlzLm16JiYodGhpcy5taj9SRSh0aGlzKXx8dGhpcy5mb2N1cyh0aGlzLm1qKTp0aGlzLmZvY3VzKCkpO3RoaXMubWo9bnVsbH07aC51cj1mdW5jdGlvbihhKXsodGhpcy5sbD1hKT90aGlzLnNRLmVtaXQoKTp0aGlzLnJRLmVtaXQoKTtSRSh0aGlzKSYmKHRoaXMuVHEuZHY9YSl9OwpoLkNBPWZ1bmN0aW9uKCl7aWYoIXRoaXMudWEpdGhyb3cgRXJyb3IoJ21hdE1lbnVUcmlnZ2VyRm9yOiBtdXN0IHBhc3MgaW4gYW4gbWF0LW1lbnUgaW5zdGFuY2UuXG5cbiAgICBFeGFtcGxlOlxuICAgICAgPG1hdC1tZW51ICNtZW51PSJtYXRNZW51Ij48L21hdC1tZW51PlxuICAgICAgPGJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPSJtZW51Ij48L2J1dHRvbj4nKTt9O2gub2c9ZnVuY3Rpb24oKXtpZighdGhpcy5zKXt2YXIgYT10aGlzLlZ1KCk7dGhpcy5ETihhLk1lKTt0aGlzLnM9dGhpcy50ZC5jcmVhdGUoYSk7dGhpcy5zLkZvKCkuc3Vic2NyaWJlKCl9cmV0dXJuIHRoaXMuc307CmguVnU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHBCKHtNZTpIQihHQihMQih0aGlzLnRkLnBvc2l0aW9uKCksdGhpcy5rYSkpLCIubWF0LW1lbnUtcGFuZWwsIC5tYXQtbWRjLW1lbnUtcGFuZWwiKSx4Yzp0aGlzLnVhLnhjfHwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AiLHJiOnRoaXMudWEuWEcsZWc6dGhpcy52ZCgpLGRpcmVjdGlvbjp0aGlzLkdhfSl9O2guRE49ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLnVhLnNwJiZhLmR6LnN1YnNjcmliZShmdW5jdGlvbihjKXtiLnVhLnNwKCJzdGFydCI9PT1jLmZGLkFhPyJhZnRlciI6ImJlZm9yZSIsInRvcCI9PT1jLmZGLlhhPyJiZWxvdyI6ImFib3ZlIil9KX07Cmgub049ZnVuY3Rpb24oYSl7dmFyIGI9bigiYmVmb3JlIj09PXRoaXMudWEuTHA/WyJlbmQiLCJzdGFydCJdOlsic3RhcnQiLCJlbmQiXSksYz1iLm5leHQoKS52YWx1ZTtiPWIubmV4dCgpLnZhbHVlO3ZhciBkPW4oImFib3ZlIj09PXRoaXMudWEuUXQ/WyJib3R0b20iLCJ0b3AiXTpbInRvcCIsImJvdHRvbSJdKSxlPWQubmV4dCgpLnZhbHVlO2Q9ZC5uZXh0KCkudmFsdWU7dmFyIGY9bihbZSxkXSksZz1mLm5leHQoKS52YWx1ZTtmPWYubmV4dCgpLnZhbHVlO3ZhciBsPW4oW2MsYl0pLG09bC5uZXh0KCkudmFsdWU7bD1sLm5leHQoKS52YWx1ZTt2YXIgcD0wO1JFKHRoaXMpPyhsPWM9ImJlZm9yZSI9PT10aGlzLnVhLkxwPyJzdGFydCI6ImVuZCIsYj1tPSJlbmQiPT09Yz8ic3RhcnQiOiJlbmQiLHA9ImJvdHRvbSI9PT1lPzg6LTgpOnRoaXMudWEuVnl8fChnPSJ0b3AiPT09ZT8iYm90dG9tIjoidG9wIixmPSJ0b3AiPT09ZD8iYm90dG9tIjoidG9wIik7QkIoYSxbe2hjOmMsaWM6ZywKQWE6bSxYYTplLG9mZnNldFk6cH0se2hjOmIsaWM6ZyxBYTpsLFhhOmUsb2Zmc2V0WTpwfSx7aGM6YyxpYzpmLEFhOm0sWGE6ZCxvZmZzZXRZOi1wfSx7aGM6YixpYzpmLEFhOmwsWGE6ZCxvZmZzZXRZOi1wfV0pfTtoLldMPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxiPXRoaXMucy5QZigpLGM9JGgodGhpcy5zLm5oKSxkPXRoaXMuWGM/dGhpcy5YYy5jbG9zZWQ6ZmkoKSxlPXRoaXMuWGM/dGhpcy5YYy5naigpLmIoYWsoZnVuY3Rpb24oZil7cmV0dXJuIGYhPT1hLlRxfSksYWsoZnVuY3Rpb24oKXtyZXR1cm4gYS5sbH0pKTpmaSgpO3JldHVybiBZaihiLGQsZSxjKX07aC5RQj1mdW5jdGlvbihhKXswIT09YS5idXR0b25zJiYodGhpcy5taj0wPT09YS5idXR0b24/Im1vdXNlIjpudWxsLFJFKHRoaXMpJiZhLnByZXZlbnREZWZhdWx0KCkpfTsKaC5IYT1mdW5jdGlvbihhKXthPWEua2V5Q29kZTtSRSh0aGlzKSYmKDM5PT09YSYmImx0ciI9PT10aGlzLmRpcnx8Mzc9PT1hJiYicnRsIj09PXRoaXMuZGlyKSYmVEUodGhpcyl9O2guTUI9ZnVuY3Rpb24oYSl7UkUodGhpcyk/KGEuc3RvcFByb3BhZ2F0aW9uKCksVEUodGhpcykpOnRoaXMubGw/dGhpcy51YS5jbG9zZS5lbWl0KCk6VEUodGhpcyl9O2gubEw9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO1JFKHRoaXMpJiYodGhpcy5jQz10aGlzLlhjLmdqKCkuYihhayhmdW5jdGlvbihiKXtyZXR1cm4gYj09PWEuVHEmJiFiLmRpc2FibGVkfSksWmsoMCxtaykpLnN1YnNjcmliZShmdW5jdGlvbigpe2EubWo9Im1vdXNlIjthLnVhIGluc3RhbmNlb2YgTUUmJmEudWEucUM/YS51YS5KbS5iKGdsKCksWmsoMCxtayksUmwoYS5YYy5naigpKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIFRFKGEpfSk6VEUoYSl9KSl9OwpoLmNMPWZ1bmN0aW9uKCl7dGhpcy52ZyYmdGhpcy52Zy5Baz09PXRoaXMudWEuQWt8fCh0aGlzLnZnPW5ldyBQQih0aGlzLnVhLkFrLHRoaXMuemIpKTtyZXR1cm4gdGhpcy52Z307CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU0UucHJvdG90eXBlLHtTUjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LHNldDpmdW5jdGlvbihhKXt0aGlzLnVhPWF9fSx1YTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuREN9LHNldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzO2EhPT10aGlzLkRDJiYodGhpcy5EQz1hLHRoaXMuSXYudW5zdWJzY3JpYmUoKSxhJiYodGhpcy5Jdj0kaChhLmNsb3NlKS5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7Yi50SygpOyJjbGljayIhPT1jJiYidGFiIiE9PWN8fCFiLlhjfHxiLlhjLmNsb3NlZC5lbWl0KGMpfSkpKX19LE1vOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sbH19LGRpcjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2EmJgoicnRsIj09PXRoaXMuR2EudmFsdWU/InJ0bCI6Imx0ciJ9fX0pO3ZhciBVRT1mdW5jdGlvbigpe30sVkU9ZnVuY3Rpb24oKXt9O3ZhciBXRT1jZyh7VDoyLGc6W10sZGF0YTp7fX0pO2Z1bmN0aW9uIFhFKGEpe3JldHVybiBaKDIsW01tKG51bGwsMCksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LW1lbnUtcmlwcGxlIG1hdC1yaXBwbGUiXSxbIm1hdFJpcHBsZSIsIiJdXSxbWzIsIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMiwyMTI5OTIsbnVsbCwwLEtDLFt6LFQsTnosWzIsSkNdLFsyLGt2XV0se2Rpc2FibGVkOlswLCJkaXNhYmxlZCJdLHRyaWdnZXI6WzEsInRyaWdnZXIiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyLDAsZC5Janx8ZC5kaXNhYmxlZCxkLk9kKCkpfSxmdW5jdGlvbihiLGMpe3ZhciBkPUYoYywyKS5JdDtiKGMsMSwwLGQpfSl9O3ZhciBZRT1jZyh7VDoyLGc6W1snLm1hdC1tZW51LXBhbmVse21pbi13aWR0aDoxMTJweDttYXgtd2lkdGg6MjgwcHg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDttYXgtaGVpZ2h0OmNhbGMoMTAwdmggLSA0OHB4KTtib3JkZXItcmFkaXVzOjRweDtvdXRsaW5lOjA7bWluLWhlaWdodDo2NHB4fS5tYXQtbWVudS1wYW5lbC5uZy1hbmltYXRpbmd7cG9pbnRlci1ldmVudHM6bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1wYW5lbHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LW1lbnUtY29udGVudDpub3QoOmVtcHR5KXtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbWVudS1pdGVtey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW17dGV4dC1hbGlnbjpyaWdodH0ubWF0LW1lbnUtaXRlbSAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW1lbnUtaXRlbSAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVke291dGxpbmU6ZG90dGVkIDFweH0ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJ7cGFkZGluZy1yaWdodDozMnB4fS5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcjo6YWZ0ZXJ7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjVweCAwIDVweCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IGN1cnJlbnRDb2xvcjtjb250ZW50OiIiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MTZweDtwYWRkaW5nLWxlZnQ6MzJweH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntyaWdodDphdXRvO2xlZnQ6MTZweDt0cmFuc2Zvcm06cm90YXRlWSgxODBkZWcpIHRyYW5zbGF0ZVkoLTUwJSl9YnV0dG9uLm1hdC1tZW51LWl0ZW17d2lkdGg6MTAwJX0ubWF0LW1lbnUtaXRlbSAubWF0LW1lbnUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4nXV0sCmRhdGE6e2FuaW1hdGlvbjpbe3R5cGU6NyxuYW1lOiJ0cmFuc2Zvcm1NZW51IixqZjpbe3R5cGU6MCxuYW1lOiJ2b2lkIixnOnt0eXBlOjYsZzp7b3BhY2l0eTowLHRyYW5zZm9ybToic2NhbGUoMC44KSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MSx6Yzoidm9pZCA9PiBlbnRlciIsYW5pbWF0aW9uOnt0eXBlOjMsamU6W3t0eXBlOjExLGllOiIubWF0LW1lbnUtY29udGVudCwgLm1hdC1tZGMtbWVudS1jb250ZW50IixhbmltYXRpb246e3R5cGU6NCxnOnt0eXBlOjYsZzp7b3BhY2l0eToxfSxvZmZzZXQ6bnVsbH0sa2I6IjEwMG1zIGxpbmVhciJ9LG9wdGlvbnM6bnVsbH0se3R5cGU6NCxnOnt0eXBlOjYsZzp7dHJhbnNmb3JtOiJzY2FsZSgxKSJ9LG9mZnNldDpudWxsfSxrYjoiMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkifV0sb3B0aW9uczpudWxsfSxvcHRpb25zOm51bGx9LHt0eXBlOjEsemM6IiogPT4gdm9pZCIsYW5pbWF0aW9uOnt0eXBlOjQsCmc6e3R5cGU6NixnOntvcGFjaXR5OjB9LG9mZnNldDpudWxsfSxrYjoiMTAwbXMgMjVtcyBsaW5lYXIifSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fSx7dHlwZTo3LG5hbWU6ImZhZGVJbkl0ZW1zIixqZjpbe3R5cGU6MCxuYW1lOiJzaG93aW5nIixnOnt0eXBlOjYsZzp7b3BhY2l0eToxfSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6InZvaWQgPT4gKiIsYW5pbWF0aW9uOlt7dHlwZTo2LGc6e29wYWNpdHk6MH0sb2Zmc2V0Om51bGx9LHt0eXBlOjQsZzpudWxsLGtiOiI0MDBtcyAxMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKSJ9XSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7CmZ1bmN0aW9uIFpFKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC1tZW51LXBhbmVsIl0sWyJyb2xlIiwibWVudSJdLFsidGFiaW5kZXgiLCItMSJdXSxbWzgsImlkIiwwXSxbMjQsIkB0cmFuc2Zvcm1NZW51IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdXSxbW251bGwsImtleWRvd24iXSxbbnVsbCwiY2xpY2siXSxbbnVsbCwiQHRyYW5zZm9ybU1lbnUuc3RhcnQiXSxbbnVsbCwiQHRyYW5zZm9ybU1lbnUuZG9uZSJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImtleWRvd24iPT09YyYmKGU9ITEhPT1mLkhhKGQpJiZlKTsiY2xpY2siPT09YyYmKGU9ITEhPT1mLmNsb3NlZC5lbWl0KCJjbGljayIpJiZlKTsiQHRyYW5zZm9ybU1lbnUuc3RhcnQiPT09YyYmKGU9ITEhPT1mLlR2KGQpJiZlKTsiQHRyYW5zZm9ybU1lbnUuZG9uZSI9PT0KYyYmKGU9ITEhPT1mLlN2KGQpJiZlKTtyZXR1cm4gZX0sbnVsbCxudWxsKSksSSgxLDI3ODUyOCxudWxsLDAscG8sW3lmLHpmLHosWmVdLHt3eTpbMCwia2xhc3MiXSxqaTpbMSwibmdDbGFzcyJdfSxudWxsKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtbWVudS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLE1tKG51bGwsMCldLGZ1bmN0aW9uKGIsYyl7YihjLDEsMCwibWF0LW1lbnUtcGFuZWwiLGMuYS5VaSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywwLDAsZC5XeSxkLiR2LGQuTGh8fG51bGwsZC5JbHx8bnVsbCxkLklPfHxudWxsKX0pfWZ1bmN0aW9uICRFKGEpe3JldHVybiBaKDIsW1goNjcxMDg4NjQwLDEse0FrOjB9KSwoYSgpKCksVigwLFtbMSwyXV0sbnVsbCwwLG51bGwsWkUpKV0sbnVsbCxudWxsKX07dmFyIGFGPWZDKGZ1bmN0aW9uKGEpe3RoaXMubT1hfSwicHJpbWFyeSIpLGNGPW5ldyB5KCJtYXQtcHJvZ3Jlc3MtYmFyLWxvY2F0aW9uIix7WToicm9vdCIsVjpiRn0pO2Z1bmN0aW9uIGJGKCl7dmFyIGE9bWQoTG8pLGI9YT9hLmxvY2F0aW9uOm51bGw7cmV0dXJue3lzOmZ1bmN0aW9uKCl7cmV0dXJuIGI/Yi5wYXRobmFtZStiLnNlYXJjaDoiIn19fXZhciBkRj0wLGVGPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWFGLmNhbGwodGhpcyxhKXx8dGhpcztlLm09YTtlLlM9YjtlLmlhPWM7ZS50dj0hMTtlLm1hPTA7ZS52QT0wO2UuRE89bmV3IHJrO2UuZ0E9TWguRU1QVFk7ZS5tb2RlPSJkZXRlcm1pbmF0ZSI7ZS5xSD0ibWF0LXByb2dyZXNzLWJhci0iK2RGKys7ZS5KTT0idXJsKCciKyhkP2QueXMoKS5zcGxpdCgiIyIpWzBdOiIiKSsiIyIrZS5xSCsiJykiO2UudHY9Ik5vb3BBbmltYXRpb25zIj09PWM7cmV0dXJuIGV9O3QoZUYsYUYpOwplRi5wcm90b3R5cGUuRk09ZnVuY3Rpb24oKXtyZXR1cm57dHJhbnNmb3JtOiJzY2FsZVgoIit0aGlzLnZhbHVlLzEwMCsiKSJ9fTtlRi5wcm90b3R5cGUudko9ZnVuY3Rpb24oKXtyZXR1cm4iYnVmZmVyIj09PXRoaXMubW9kZT97dHJhbnNmb3JtOiJzY2FsZVgoIit0aGlzLlRPLzEwMCsiKSJ9Om51bGx9O2VGLnByb3RvdHlwZS5MYz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5TLm9hKGZ1bmN0aW9uKCl7dmFyIGI9YS5HTS5pO2EuZ0E9VmkoYiwidHJhbnNpdGlvbmVuZCIpLmIoYWsoZnVuY3Rpb24oYyl7cmV0dXJuIGMudGFyZ2V0PT09Yn0pKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXsiZGV0ZXJtaW5hdGUiIT09YS5tb2RlJiYiYnVmZmVyIiE9PWEubW9kZXx8YS5TLmdhKGZ1bmN0aW9uKCl7cmV0dXJuIGEuRE8ubmV4dCh7dmFsdWU6YS52YWx1ZX0pfSl9KX0pfTtlRi5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuZ0EudW5zdWJzY3JpYmUoKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZUYucHJvdG90eXBlLHt2YWx1ZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF9LHNldDpmdW5jdGlvbihhKXt0aGlzLm1hPU1hdGgubWF4KDAsTWF0aC5taW4oMTAwLHd6KGEpfHwwKSl9fSxUTzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudkF9LHNldDpmdW5jdGlvbihhKXt0aGlzLnZBPU1hdGgubWF4KDAsTWF0aC5taW4oMTAwLGF8fDApKX19fSk7dmFyIGZGPWZ1bmN0aW9uKCl7fTt2YXIgZ0Y9Y2coe1Q6MixnOltbJy5tYXQtcHJvZ3Jlc3MtYmFye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjRweDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjpvcGFjaXR5IDI1MG1zIGxpbmVhcjt3aWR0aDoxMDAlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHJvZ3Jlc3MtYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLWJhciAubWF0LXByb2dyZXNzLWJhci1lbGVtZW50LC5tYXQtcHJvZ3Jlc3MtYmFyIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2hlaWdodDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9Lm1hdC1wcm9ncmVzcy1iYXIgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHt3aWR0aDpjYWxjKDEwMCUgKyAxMHB4KX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3MtYmFyIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7ZGlzcGxheTpub25lfS5tYXQtcHJvZ3Jlc3MtYmFyIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcnt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zaXRpb246dHJhbnNmb3JtIDI1MG1zIGVhc2V9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXByb2dyZXNzLWJhciAubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7Ym9yZGVyLXRvcDpzb2xpZCA1cHg7b3BhY2l0eTouNX0ubWF0LXByb2dyZXNzLWJhciAubWF0LXByb2dyZXNzLWJhci1zZWNvbmRhcnl7ZGlzcGxheTpub25lfS5tYXQtcHJvZ3Jlc3MtYmFyIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGx7YW5pbWF0aW9uOm5vbmU7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyNTBtcyBlYXNlfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1wcm9ncmVzcy1iYXIgLm1hdC1wcm9ncmVzcy1iYXItZmlsbHtib3JkZXItdG9wOnNvbGlkIDRweH0ubWF0LXByb2dyZXNzLWJhciAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcnthbmltYXRpb246bm9uZTtjb250ZW50OiIiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xlZnQ6MH0ubWF0LXByb2dyZXNzLWJhcltkaXI9cnRsXSxbZGlyPXJ0bF0gLm1hdC1wcm9ncmVzcy1iYXJ7dHJhbnNmb3JtOnJvdGF0ZVkoMTgwZGVnKX0ubWF0LXByb2dyZXNzLWJhclttb2RlPXF1ZXJ5XXt0cmFuc2Zvcm06cm90YXRlWigxODBkZWcpfS5tYXQtcHJvZ3Jlc3MtYmFyW21vZGU9cXVlcnldW2Rpcj1ydGxdLFtkaXI9cnRsXSAubWF0LXByb2dyZXNzLWJhclttb2RlPXF1ZXJ5XXt0cmFuc2Zvcm06cm90YXRlWigxODBkZWcpIHJvdGF0ZVkoMTgwZGVnKX0ubWF0LXByb2dyZXNzLWJhclttb2RlPWluZGV0ZXJtaW5hdGVdIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGwsLm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1xdWVyeV0gLm1hdC1wcm9ncmVzcy1iYXItZmlsbHt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1pbmRldGVybWluYXRlXSAubWF0LXByb2dyZXNzLWJhci1wcmltYXJ5LC5tYXQtcHJvZ3Jlc3MtYmFyW21vZGU9cXVlcnldIC5tYXQtcHJvZ3Jlc3MtYmFyLXByaW1hcnl7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjthbmltYXRpb246bWF0LXByb2dyZXNzLWJhci1wcmltYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlIDIwMDBtcyBpbmZpbml0ZSBsaW5lYXI7bGVmdDotMTQ1LjE2NjYxMSV9Lm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1pbmRldGVybWluYXRlXSAubWF0LXByb2dyZXNzLWJhci1wcmltYXJ5Lm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIsLm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1xdWVyeV0gLm1hdC1wcm9ncmVzcy1iYXItcHJpbWFyeS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1iYXItcHJpbWFyeS1pbmRldGVybWluYXRlLXNjYWxlIDIwMDBtcyBpbmZpbml0ZSBsaW5lYXJ9Lm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1pbmRldGVybWluYXRlXSAubWF0LXByb2dyZXNzLWJhci1zZWNvbmRhcnksLm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1xdWVyeV0gLm1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5ey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlIDIwMDBtcyBpbmZpbml0ZSBsaW5lYXI7bGVmdDotNTQuODg4ODkxJTtkaXNwbGF5OmJsb2NrfS5tYXQtcHJvZ3Jlc3MtYmFyW21vZGU9aW5kZXRlcm1pbmF0ZV0gLm1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5Lm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIsLm1hdC1wcm9ncmVzcy1iYXJbbW9kZT1xdWVyeV0gLm1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5Lm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXJ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjthbmltYXRpb246bWF0LXByb2dyZXNzLWJhci1zZWNvbmRhcnktaW5kZXRlcm1pbmF0ZS1zY2FsZSAyMDAwbXMgaW5maW5pdGUgbGluZWFyfS5tYXQtcHJvZ3Jlc3MtYmFyW21vZGU9YnVmZmVyXSAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5key13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZC1zY3JvbGwgMjUwbXMgaW5maW5pdGUgbGluZWFyO2Rpc3BsYXk6YmxvY2t9Lm1hdC1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1wcm9ncmVzcy1iYXItZmlsbCwubWF0LXByb2dyZXNzLWJhci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlciwubWF0LXByb2dyZXNzLWJhci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXByb2dyZXNzLWJhci1idWZmZXIsLm1hdC1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1wcm9ncmVzcy1iYXItcHJpbWFyeSwubWF0LXByb2dyZXNzLWJhci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXByb2dyZXNzLWJhci1wcmltYXJ5Lm1hdC1wcm9ncmVzcy1iYXItZmlsbDo6YWZ0ZXIsLm1hdC1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5LC5tYXQtcHJvZ3Jlc3MtYmFyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtcHJvZ3Jlc3MtYmFyLXNlY29uZGFyeS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVyLC5tYXQtcHJvZ3Jlc3MtYmFyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7YW5pbWF0aW9uOm5vbmU7dHJhbnNpdGlvbi1kdXJhdGlvbjoxbXN9QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3MtYmFyLXByaW1hcnktaW5kZXRlcm1pbmF0ZS10cmFuc2xhdGV7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MjAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MzIsIDAuNDk1ODE5KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX01OS4xNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zMDI0MzUsIDAuMzgxMzUyLCAwLjU1LCAwLjk1NjM1Mik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoODMuNjcxNDIlKX0xMDAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDIwMC42MTEwNTclKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3MtYmFyLXByaW1hcnktaW5kZXRlcm1pbmF0ZS1zY2FsZXswJXt0cmFuc2Zvcm06c2NhbGVYKDAuMDgpfTM2LjY1JXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjMzNDczMSwgMC4xMjQ4MiwgMC43ODU4NDQsIDEpO3RyYW5zZm9ybTpzY2FsZVgoMC4wOCl9NjkuMTUle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMDYsIDAuMTEsIDAuNiwgMSk7dHJhbnNmb3JtOnNjYWxlWCgwLjY2MTQ3OSl9MTAwJXt0cmFuc2Zvcm06c2NhbGVYKDAuMDgpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1iYXItc2Vjb25kYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlezAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTUsIDAsIDAuNTE1MDU4LCAwLjQwOTY4NSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MjUle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzEwMzMsIDAuMjg0MDU4LCAwLjgsIDAuNzMzNzEyKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgzNy42NTE5MTMlKX00OC4zNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLjYyNzAzNSwgMC42LCAwLjkwMjAyNik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoODQuMzg2MTY1JSl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxNjAuMjc3NzgyJSl9fUBrZXlmcmFtZXMgbWF0LXByb2dyZXNzLWJhci1zZWNvbmRhcnktaW5kZXRlcm1pbmF0ZS1zY2FsZXswJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE1LCAwLCAwLjUxNTA1OCwgMC40MDk2ODUpO3RyYW5zZm9ybTpzY2FsZVgoMC4wOCl9MTkuMTUle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzEwMzMsIDAuMjg0MDU4LCAwLjgsIDAuNzMzNzEyKTt0cmFuc2Zvcm06c2NhbGVYKDAuNDU3MTA0KX00NC4xNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLjYyNzAzNSwgMC42LCAwLjkwMjAyNik7dHJhbnNmb3JtOnNjYWxlWCgwLjcyNzk2KX0xMDAle3RyYW5zZm9ybTpzY2FsZVgoMC4wOCl9fUBrZXlmcmFtZXMgbWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kLXNjcm9sbHt0b3t0cmFuc2Zvcm06dHJhbnNsYXRlWCgtOHB4KX19XG4nXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gaEYoYSl7cmV0dXJuIFooMixbWCg2NzEwODg2NDAsMSx7R006MH0pLChhKCkoKSxXKDEsMCxudWxsLG51bGwsNCwiOnN2ZzpzdmciLFtbImNsYXNzIiwibWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kIG1hdC1wcm9ncmVzcy1iYXItZWxlbWVudCJdLFsiZm9jdXNhYmxlIiwiZmFsc2UiXSxbImhlaWdodCIsIjQiXSxbIndpZHRoIiwiMTAwJSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDIsIjpzdmc6ZGVmcyIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCI6c3ZnOnBhdHRlcm4iLFtbImhlaWdodCIsIjQiXSxbInBhdHRlcm5Vbml0cyIsInVzZXJTcGFjZU9uVXNlIl0sWyJ3aWR0aCIsIjgiXSxbIngiLCI0Il0sWyJ5IiwiMCJdXSxbWzgsImlkIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMCwiOnN2ZzpjaXJjbGUiLFtbImN4IiwKIjIiXSxbImN5IiwiMiJdLFsiciIsIjIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCwwLCI6c3ZnOnJlY3QiLFtbImhlaWdodCIsIjEwMCUiXSxbIndpZHRoIiwiMTAwJSJdXSxbWzEsImZpbGwiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LXByb2dyZXNzLWJhci1idWZmZXIgbWF0LXByb2dyZXNzLWJhci1lbGVtZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNywyNzg1MjgsbnVsbCwwLEJvLFt6LHpmLFplXSx7dWk6WzAsIm5nU3R5bGUiXX0sbnVsbCksKGEoKSgpLFcoOCwwLFtbMSwwXSxbInByaW1hcnlWYWx1ZUJhciIsMV1dLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1wcm9ncmVzcy1iYXItcHJpbWFyeSBtYXQtcHJvZ3Jlc3MtYmFyLWZpbGwgbWF0LXByb2dyZXNzLWJhci1lbGVtZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsCm51bGwpKSxJKDksMjc4NTI4LG51bGwsMCxCbyxbeix6ZixaZV0se3VpOlswLCJuZ1N0eWxlIl19LG51bGwpLChhKCkoKSxXKDEwLDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtcHJvZ3Jlc3MtYmFyLXNlY29uZGFyeSBtYXQtcHJvZ3Jlc3MtYmFyLWZpbGwgbWF0LXByb2dyZXNzLWJhci1lbGVtZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsNywwLGQudkooKSk7YihjLDksMCxkLkZNKCkpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMywwLGQucUgpO2IoYyw1LDAsZC5KTSl9KX07dmFyIGlGPWZDKGZ1bmN0aW9uKGEpe3RoaXMubT1hfSwicHJpbWFyeSIpLGtGPW5ldyB5KCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1kZWZhdWx0LW9wdGlvbnMiLHtZOiJyb290IixWOmpGfSk7ZnVuY3Rpb24gakYoKXtyZXR1cm57QWQ6MTAwfX12YXIgbUY9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1pRi5jYWxsKHRoaXMsYSl8fHRoaXM7Zi5tPWE7Zi51PWM7Zi5BdT0xMDA7Zi5tYT0wO2YudXE9ITE7Zi5tb2RlPSJkZXRlcm1pbmF0ZSI7bEYuaGFzKGMuaGVhZCl8fGxGLnNldChjLmhlYWQsbmV3IFNldChbMTAwXSkpO2YudXE9Yi5VdHx8Yi5FbTtmLmVNPSJOb29wQW5pbWF0aW9ucyI9PT1kJiYhIWUmJiFlLlVSO2UmJihlLkFkJiYoZi5BZD1lLkFkKSxlLnN0cm9rZVdpZHRoJiYoZi5zdHJva2VXaWR0aD1lLnN0cm9rZVdpZHRoKSk7cmV0dXJuIGZ9O3QobUYsaUYpOwptRi5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uaTt0aGlzLlFEPUt6KGEpfHx0aGlzLnUuaGVhZDt0aGlzLnBBKCk7YS5jbGFzc0xpc3QuYWRkKCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlIisodGhpcy51cT8iLWZhbGxiYWNrIjoiIikrIi1hbmltYXRpb24iKX07bUYucHJvdG90eXBlLnBBPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5RRCxiPXRoaXMuQXUsYz1sRi5nZXQoYSk7aWYoIWN8fCFjLmhhcyhiKSl7dmFyIGQ9dGhpcy51LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZC5zZXRBdHRyaWJ1dGUoIm1hdC1zcGlubmVyLWFuaW1hdGlvbiIsYisiIik7ZC50ZXh0Q29udGVudD10aGlzLlNLKCk7YS5hcHBlbmRDaGlsZChkKTtjfHwoYz1uZXcgU2V0LGxGLnNldChhLGMpKTtjLmFkZChiKX19OwptRi5wcm90b3R5cGUuU0s9ZnVuY3Rpb24oKXtyZXR1cm4iXG4gQGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLURJQU1FVEVSIHtcbiAgICAwJSAgICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMCk7IH1cbiAgICAxMi41JSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGUoMCk7IH1cbiAgICAxMi41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH1cbiAgICAyNSUgICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDcyLjVkZWcpOyB9XG5cbiAgICAyNS4wMDAxJSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfVxuICAgIDM3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gICAgMzcuNTAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKTsgfVxuICAgIDUwJSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XG5cbiAgICA1MC4wMDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOyB9XG4gICAgNjIuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbiAgICA2Mi41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpOyB9XG4gICAgNzUlICAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgyNTEuNWRlZyk7IH1cblxuICAgIDc1LjAwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICAgIDg3LjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7IH1cbiAgICA4Ny41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpOyB9XG4gICAgMTAwJSAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cbiAgfVxuIi5yZXBsYWNlKC9TVEFSVF9WQUxVRS9nLCIiKwouOTUqdGhpcy5BbCkucmVwbGFjZSgvRU5EX1ZBTFVFL2csIiIrLjIqdGhpcy5BbCkucmVwbGFjZSgvRElBTUVURVIvZywiIit0aGlzLkFkKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobUYucHJvdG90eXBlLHtBZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQXV9LHNldDpmdW5jdGlvbihhKXt0aGlzLkF1PXd6KGEpOyF0aGlzLnVxJiZ0aGlzLlFEJiZ0aGlzLnBBKCl9fSxzdHJva2VXaWR0aDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQk58fHRoaXMuQWQvMTB9LHNldDpmdW5jdGlvbihhKXt0aGlzLkJOPXd6KGEpfX0sdmFsdWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJkZXRlcm1pbmF0ZSI9PT10aGlzLm1vZGU/dGhpcy5tYTowfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tYT1NYXRoLm1heCgwLE1hdGgubWluKDEwMCx3eihhKSkpfX0saHE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybih0aGlzLkFkLQoxMCkvMn19LG9POntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0yKnRoaXMuaHErdGhpcy5zdHJva2VXaWR0aDtyZXR1cm4iMCAwICIrYSsiICIrYX19LEFsOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMipNYXRoLlBJKnRoaXMuaHF9fSxPRDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuImRldGVybWluYXRlIj09PXRoaXMubW9kZT90aGlzLkFsKigxMDAtdGhpcy5tYSkvMTAwOnRoaXMudXEmJiJpbmRldGVybWluYXRlIj09PXRoaXMubW9kZT8uMip0aGlzLkFsOm51bGx9fSxFQTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3Ryb2tlV2lkdGgvdGhpcy5BZCoxMDB9fX0pOwp2YXIgbEY9bmV3IFdlYWtNYXAsbkY9ZnVuY3Rpb24oYSxiLGMsZCxlKXthPW1GLmNhbGwodGhpcyxhLGIsYyxkLGUpfHx0aGlzO2EubW9kZT0iaW5kZXRlcm1pbmF0ZSI7cmV0dXJuIGF9O3QobkYsbUYpO3ZhciBvRj1mdW5jdGlvbigpe307dmFyIHBGPWNnKHtUOjIsZzpbWyIubWF0LXByb2dyZXNzLXNwaW5uZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIgc3Zne3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0b3A6MDtsZWZ0OjA7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle2ZpbGw6dHJhbnNwYXJlbnQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAyMjVtcyBsaW5lYXJ9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZXt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV17YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXXt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb24tcHJvcGVydHk6c3Ryb2tlO2FuaW1hdGlvbi1kdXJhdGlvbjo0MDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSk7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWZhbGxiYWNrLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVde2FuaW1hdGlvbjptYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLWZhbGxiYWNrIDEwMDAwbXMgY3ViaWMtYmV6aWVyKDAuODcsIDAuMDMsIDAuMzMsIDEpIGluZmluaXRlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWZhbGxiYWNrLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVde3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl1dLApkYXRhOnt9fSk7ZnVuY3Rpb24gcUYoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCI6c3ZnOmNpcmNsZSIsW1siY3giLCI1MCUiXSxbImN5IiwiNTAlIl1dLFtbMSwiciIsMF0sWzQsImFuaW1hdGlvbi1uYW1lIixudWxsXSxbNCwic3Ryb2tlLWRhc2hvZmZzZXQiLCJweCJdLFs0LCJzdHJva2UtZGFzaGFycmF5IiwicHgiXSxbNCwic3Ryb2tlLXdpZHRoIiwiJSJdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDAsMCxkLmhxLCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLSIrZC5BZCxkLk9ELGQuQWwsZC5FQSl9KX0KZnVuY3Rpb24gckYoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCI6c3ZnOmNpcmNsZSIsW1siY3giLCI1MCUiXSxbImN5IiwiNTAlIl1dLFtbMSwiciIsMF0sWzQsInN0cm9rZS1kYXNob2Zmc2V0IiwicHgiXSxbNCwic3Ryb2tlLWRhc2hhcnJheSIsInB4Il0sWzQsInN0cm9rZS13aWR0aCIsIiUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywwLDAsZC5ocSxkLk9ELGQuQWwsZC5FQSl9KX0KZnVuY3Rpb24gc0YoYSl7cmV0dXJuIFooMixbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw1LCI6c3ZnOnN2ZyIsW1siZm9jdXNhYmxlIiwiZmFsc2UiXSxbInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Il1dLFtbNCwid2lkdGgiLCJweCJdLFs0LCJoZWlnaHQiLCJweCJdLFsxLCJ2aWV3Qm94IiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMSwxNjM4NCxudWxsLDAsd28sW10se1VqOlswLCJuZ1N3aXRjaCJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHFGKSksSSgzLDI3ODUyOCxudWxsLDAseG8sW0VmLERmLHdvXSx7Vmc6WzAsIm5nU3dpdGNoQ2FzZSJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHJGKSksSSg1LDI3ODUyOCxudWxsLDAseG8sW0VmLERmLHdvXSx7Vmc6WzAsIm5nU3dpdGNoQ2FzZSJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsMSwwLCJpbmRldGVybWluYXRlIj09PWMuYS5tb2RlKTsKYihjLDMsMCwhMCk7YihjLDUsMCwhMSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywwLDAsZC5BZCxkLkFkLGQub08pfSl9O3ZhciB1Rj1uZXcgeSgibWF0LXJhZGlvLWRlZmF1bHQtb3B0aW9ucyIse1k6InJvb3QiLFY6dEZ9KTtmdW5jdGlvbiB0Rigpe3JldHVybntjb2xvcjoiYWNjZW50In19dmFyIHZGPTAsd0Y9ZnVuY3Rpb24oYSxiKXt0aGlzLnNvdXJjZT1hO3RoaXMudmFsdWU9Yn0seEY9ZnVuY3Rpb24oYSl7dGhpcy5Qaz1hO3RoaXMubWE9bnVsbDt0aGlzLiRlPSJtYXQtcmFkaW8tZ3JvdXAtIit2RisrO3RoaXMubWI9bnVsbDt0aGlzLnNoPSExO3RoaXMuUXE9ImFmdGVyIjt0aGlzLlljPXRoaXMuT2E9ITE7dGhpcy5SbT1mdW5jdGlvbigpe307dGhpcy5nYj1mdW5jdGlvbigpe307dGhpcy5RYT1uZXcgcmt9O2g9eEYucHJvdG90eXBlO2guREE9ZnVuY3Rpb24oKXt0aGlzLm1iJiYhdGhpcy5tYi5jaGVja2VkJiYodGhpcy5tYi5jaGVja2VkPSEwKX07aC5xZj1mdW5jdGlvbigpe3RoaXMuc2g9ITB9O2guT049ZnVuY3Rpb24oKXt0aGlzLmdiJiZ0aGlzLmdiKCl9OwpoLmVPPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnZsJiZ0aGlzLnZsLmZvckVhY2goZnVuY3Rpb24oYil7Yi5uYW1lPWEubmFtZTtiLmxqKCl9KX07aC5nTz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1udWxsIT09dGhpcy5tYiYmdGhpcy5tYi52YWx1ZT09PXRoaXMubWE7dGhpcy52bCYmIWImJih0aGlzLm1iPW51bGwsdGhpcy52bC5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuY2hlY2tlZD1hLnZhbHVlPT09Yy52YWx1ZTtjLmNoZWNrZWQmJihhLm1iPWMpfSkpfTtoLkxkPWZ1bmN0aW9uKCl7dGhpcy5zaCYmdGhpcy5RYS5lbWl0KG5ldyB3Rih0aGlzLm1iLHRoaXMubWEpKX07aC5Gdj1mdW5jdGlvbigpe3RoaXMudmwmJnRoaXMudmwuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYS5saigpfSl9O2guSWQ9ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT1hO1lnKHRoaXMuUGspfTtoLkZkPWZ1bmN0aW9uKGEpe3RoaXMuUm09YX07aC5OZT1mdW5jdGlvbihhKXt0aGlzLmdiPWF9OwpoLlBlPWZ1bmN0aW9uKGEpe3RoaXMuZGlzYWJsZWQ9YTtZZyh0aGlzLlBrKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeEYucHJvdG90eXBlLHtuYW1lOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuJGU9YTt0aGlzLmVPKCl9fSxRajp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUXF9LHNldDpmdW5jdGlvbihhKXt0aGlzLlFxPSJiZWZvcmUiPT09YT8iYmVmb3JlIjoiYWZ0ZXIiO3RoaXMuRnYoKX19LHZhbHVlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubWEhPT1hJiYodGhpcy5tYT1hLHRoaXMuZ08oKSx0aGlzLkRBKCkpfX0sc2VsZWN0ZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1ifSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy52YWx1ZT0KKHRoaXMubWI9YSk/YS52YWx1ZTpudWxsO3RoaXMuREEoKX19LGRpc2FibGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5PYX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuT2E9dHooYSk7dGhpcy5GdigpfX0scmVxdWlyZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlljfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ZYz10eihhKTt0aGlzLkZ2KCl9fX0pO3ZhciB5Rj1mdW5jdGlvbigpe3hGLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dCh5Rix4Rik7CnZhciB6Rj1rQyhuQyhmdW5jdGlvbihhKXt0aGlzLm09YX0pKSxBRj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgbD16Ri5jYWxsKHRoaXMsYil8fHRoaXM7bC5Qaz1jO2wudmE9ZDtsLkhNPWU7bC5pYT1mO2wuaUQ9ZztsLkduPSJtYXQtcmFkaW8tIisgKyt2RjtsLmlkPWwuR247bC5RYT1uZXcgcms7bC5Taz0hMTtsLm1hPW51bGw7bC55bj1mdW5jdGlvbigpe307bC5aYT1hO2wueW49ZS5mYyhmdW5jdGlvbihtLHApe20hPT1sLmlkJiZwPT09bC5uYW1lJiYobC5jaGVja2VkPSExKX0pO3JldHVybiBsfTt0KEFGLHpGKTtoPUFGLnByb3RvdHlwZTtoLmZvY3VzPWZ1bmN0aW9uKGEpe1N6KHRoaXMudmEsdGhpcy5yaCwia2V5Ym9hcmQiLGEpfTtoLmxqPWZ1bmN0aW9uKCl7WWcodGhpcy5Qayl9O2guT2I9ZnVuY3Rpb24oKXt0aGlzLlphJiYodGhpcy5jaGVja2VkPXRoaXMuWmEudmFsdWU9PT10aGlzLm1hLHRoaXMubmFtZT10aGlzLlphLm5hbWUpfTsKaC5MYz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy52YS5VZyh0aGlzLm0sITApLnN1YnNjcmliZShmdW5jdGlvbihiKXshYiYmYS5aYSYmYS5aYS5PTigpfSl9O2guWD1mdW5jdGlvbigpe3RoaXMudmEueWYodGhpcy5tKTt0aGlzLnluKCl9O2guTGQ9ZnVuY3Rpb24oKXt0aGlzLlFhLmVtaXQobmV3IHdGKHRoaXMsdGhpcy5tYSkpfTtoLnV2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWp8fHRoaXMuZGlzYWJsZWR9O2guV3Y9ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX07aC5tTT1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2E9dGhpcy5aYSYmdGhpcy52YWx1ZSE9PXRoaXMuWmEudmFsdWU7dGhpcy5jaGVja2VkPSEwO3RoaXMuTGQoKTt0aGlzLlphJiYodGhpcy5aYS5SbSh0aGlzLnZhbHVlKSxhJiZ0aGlzLlphLkxkKCkpfTtoLmpOPWZ1bmN0aW9uKGEpe3RoaXMuT2EhPT1hJiYodGhpcy5PYT1hLFlnKHRoaXMuUGspKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQUYucHJvdG90eXBlLHtjaGVja2VkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ta30sc2V0OmZ1bmN0aW9uKGEpe2E9dHooYSk7dGhpcy5TayE9PWEmJigodGhpcy5Taz1hKSYmdGhpcy5aYSYmdGhpcy5aYS52YWx1ZSE9PXRoaXMudmFsdWU/dGhpcy5aYS5zZWxlY3RlZD10aGlzOiFhJiZ0aGlzLlphJiZ0aGlzLlphLnZhbHVlPT09dGhpcy52YWx1ZSYmKHRoaXMuWmEuc2VsZWN0ZWQ9bnVsbCksYSYmdGhpcy5ITS5ub3RpZnkodGhpcy5pZCx0aGlzLm5hbWUpLFlnKHRoaXMuUGspKX19LHZhbHVlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubWEhPT1hJiYodGhpcy5tYT1hLG51bGwhPT10aGlzLlphJiYodGhpcy5jaGVja2VkfHwodGhpcy5jaGVja2VkPXRoaXMuWmEudmFsdWU9PT0KYSksdGhpcy5jaGVja2VkJiYodGhpcy5aYS5zZWxlY3RlZD10aGlzKSkpfX0sUWo6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFxfHx0aGlzLlphJiZ0aGlzLlphLlFqfHwiYWZ0ZXIifSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5RcT1hfX0sZGlzYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hfHxudWxsIT09dGhpcy5aYSYmdGhpcy5aYS5kaXNhYmxlZH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuak4odHooYSkpfX0scmVxdWlyZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlljfHx0aGlzLlphJiZ0aGlzLlphLnJlcXVpcmVkfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5ZYz10eihhKX19LGNvbG9yOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ua3x8CnRoaXMuWmEmJnRoaXMuWmEuY29sb3J8fHRoaXMuaUQmJnRoaXMuaUQuY29sb3J8fCJhY2NlbnQifSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5Uaz1hfX0seW86e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybih0aGlzLmlkfHx0aGlzLkduKSsiLWlucHV0In19fSk7dmFyIEJGPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3JldHVybiBBRi5jYWxsKHRoaXMsYSxiLGMsZCxlLGYsZyl8fHRoaXN9O3QoQkYsQUYpO3ZhciBDRj1mdW5jdGlvbigpe307dmFyIERGPWNnKHtUOjIsZzpbWyIubWF0LXJhZGlvLWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jazstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7b3V0bGluZTowfS5tYXQtcmFkaW8tbGFiZWx7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6MTAwJX0ubWF0LXJhZGlvLWNvbnRhaW5lcntib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtmbGV4LXNocmluazowfS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JveC1zaXppbmc6Ym9yZGVyLWJveDtoZWlnaHQ6MjBweDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZSAyODBtczt3aWR0aDoyMHB4O2JvcmRlci13aWR0aDoycHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6NTAlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1yYWRpby1pbm5lci1jaXJjbGV7Ym9yZGVyLXJhZGl1czo1MCU7Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoyMHB4O2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSBlYXNlIDI4MG1zLGJhY2tncm91bmQtY29sb3IgZWFzZSAyODBtczt3aWR0aDoyMHB4O3RyYW5zZm9ybTpzY2FsZSgwLjAwMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle3RyYW5zaXRpb246bm9uZX0ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGV7dHJhbnNmb3JtOnNjYWxlKDAuNSl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGV7Ym9yZGVyOnNvbGlkIDEwcHh9Lm1hdC1yYWRpby1sYWJlbC1jb250ZW50ey13ZWJraXQtdXNlci1zZWxlY3Q6YXV0bzstbW96LXVzZXItc2VsZWN0OmF1dG87LW1zLXVzZXItc2VsZWN0OmF1dG87dXNlci1zZWxlY3Q6YXV0bztkaXNwbGF5OmlubGluZS1ibG9jaztvcmRlcjowO2xpbmUtaGVpZ2h0OmluaGVyaXQ7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjB9W2Rpcj1ydGxdIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudHtwYWRkaW5nLXJpZ2h0OjhweDtwYWRkaW5nLWxlZnQ6MH0ubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnQubWF0LXJhZGlvLWxhYmVsLWJlZm9yZXtvcmRlcjotMTtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1hdC1yYWRpby1sYWJlbC1jb250ZW50Lm1hdC1yYWRpby1sYWJlbC1iZWZvcmV7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDo4cHh9Lm1hdC1yYWRpby1kaXNhYmxlZCwubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWx7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWRpby1idXR0b24gLm1hdC1yYWRpby1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO3RvcDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1yYWRpby1idXR0b24gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSl7b3BhY2l0eTouMTZ9Lm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtcmFkaW8tY29udGFpbmVyOmhvdmVyIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMDR9Lm1hdC1yYWRpby1idXR0b246bm90KC5tYXQtcmFkaW8tZGlzYWJsZWQpLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b246bm90KC5tYXQtcmFkaW8tZGlzYWJsZWQpLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4xMn0ubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1jb250YWluZXI6aG92ZXIgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXJhZGlvLWNvbnRhaW5lcjpob3ZlciAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2Rpc3BsYXk6bm9uZX19Lm1hdC1yYWRpby1pbnB1dHtib3R0b206MDtsZWZ0OjUwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmFkaW8tZGlzYWJsZWR7b3BhY2l0eTouNX1cbiJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBFRihhKXtyZXR1cm4gWigyLFtYKDY3MTA4ODY0MCwxLHtyaDowfSksKGEoKSgpLFcoMSwwLFtbImxhYmVsIiwxXV0sbnVsbCwxMiwibGFiZWwiLFtbImNsYXNzIiwibWF0LXJhZGlvLWxhYmVsIl1dLFtbMSwiZm9yIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsNywiZGl2IixbWyJjbGFzcyIsIm1hdC1yYWRpby1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwibWF0LXJhZGlvLW91dGVyLWNpcmNsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJtYXQtcmFkaW8taW5uZXItY2lyY2xlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUsMCxbWzEsMF0sWyJpbnB1dCIsMV1dLG51bGwsMCwiaW5wdXQiLFtbImNsYXNzIiwibWF0LXJhZGlvLWlucHV0IGNkay12aXN1YWxseS1oaWRkZW4iXSwKWyJ0eXBlIiwicmFkaW8iXV0sW1s4LCJpZCIsMF0sWzgsImNoZWNrZWQiLDBdLFs4LCJkaXNhYmxlZCIsMF0sWzgsInRhYkluZGV4IiwwXSxbMSwibmFtZSIsMF0sWzEsInZhbHVlIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJhcmlhLWxhYmVsIiwwXSxbMSwiYXJpYS1sYWJlbGxlZGJ5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF1dLFtbbnVsbCwiY2hhbmdlIl0sW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiY2hhbmdlIj09PWMmJihlPSExIT09Zi5tTShkKSYmZSk7ImNsaWNrIj09PWMmJihlPSExIT09Zi5XdihkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLChhKCkoKSxXKDYsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC1yYWRpby1yaXBwbGUgbWF0LWZvY3VzLWluZGljYXRvciBtYXQtcmlwcGxlIl0sWyJtYXQtcmlwcGxlIiwiIl1dLFtbMiwibWF0LXJpcHBsZS11bmJvdW5kZWQiLG51bGxdXSxudWxsLG51bGwsCm51bGwsbnVsbCkpLEkoNywyMTI5OTIsbnVsbCwwLEtDLFt6LFQsTnosWzIsSkNdLFsyLGt2XV0se1NuOlswLCJjZW50ZXJlZCJdLGNwOlsxLCJyYWRpdXMiXSxhbmltYXRpb246WzIsImFuaW1hdGlvbiJdLGRpc2FibGVkOlszLCJkaXNhYmxlZCJdLHRyaWdnZXI6WzQsInRyaWdnZXIiXX0sbnVsbCksTm0oOCx7bHM6MH0pLChhKCkoKSxXKDksMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1yaXBwbGUtZWxlbWVudCBtYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC1yYWRpby1sYWJlbC1jb250ZW50Il1dLFtbMiwibWF0LXJhZGlvLWxhYmVsLWJlZm9yZSIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJzdHlsZSIsImRpc3BsYXk6bm9uZSJdXSxudWxsLG51bGwsbnVsbCwKbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlx1MDBhMCJdKSksTW0obnVsbCwwKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT1iKGMsOCwwLDE1MCksZj1kLnV2KCksZz1GKGMsMSk7YihjLDcsMCwhMCwyMCxlLGYsZyl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxLDAsZC55byk7YihjLDUsMCxkLnlvLGQuY2hlY2tlZCxkLmRpc2FibGVkLGQudGFiSW5kZXgsZC5uYW1lLGQudmFsdWUsZC5yZXF1aXJlZCxkLkxoLGQuSWwsZC5JTyk7dmFyIGU9RihjLDcpLkl0O2IoYyw2LDAsZSk7YihjLDEwLDAsImJlZm9yZSI9PWQuUWopfSl9O3ZhciBGRj0wLEdGPW5ldyB5KCJtYXQtc2VsZWN0LXNjcm9sbC1zdHJhdGVneSIpO2Z1bmN0aW9uIEhGKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmxwLmx0KCl9fQp2YXIgSUY9bmV3IHkoIk1BVF9TRUxFQ1RfQ09ORklHIiksSkY9ZnVuY3Rpb24oYSxiKXt0aGlzLnNvdXJjZT1hO3RoaXMudmFsdWU9Yn0sS0Y9a0MobkMobEMobUMoZnVuY3Rpb24oYSxiLGMsZCxlKXt0aGlzLm09YTt0aGlzLm9LPWI7dGhpcy5WQz1jO3RoaXMuV0M9ZDt0aGlzLnFjPWV9KSkpKSxMRj1mdW5jdGlvbihhLGIsYyxkLGUsZixnLGwsbSxwLHEscix2LHcpe3ZhciB4PUtGLmNhbGwodGhpcyxlLGQsZyxsLHApfHx0aGlzO3guTWI9YTt4LmNhPWI7eC5TPWM7eC5HYT1mO3gudG49bTt4LnFjPXA7eC5QTD12O3guZmY9ITE7eC5ZYz0hMTt4LlRkPTA7eC5JZj0hMTt4Lk9tPWZ1bmN0aW9uKHUsRCl7cmV0dXJuIHU9PT1EfTt4LmJ4PSJtYXQtc2VsZWN0LSIrRkYrKzt4LnFnPW5ldyBZaDt4LkZuPTA7eC5yZD1mdW5jdGlvbigpe307eC5xbD1mdW5jdGlvbigpe307eC55aD0iIjt4LkNsPSJ0b3AiO3guVEM9bmV3IFloO3gucGQ9MDt4LkJNPVt7aGM6InN0YXJ0IixpYzoidG9wIiwKQWE6InN0YXJ0IixYYToidG9wIn0se2hjOiJzdGFydCIsaWM6ImJvdHRvbSIsQWE6InN0YXJ0IixYYToiYm90dG9tIn1dO3guQ3U9ITE7eC5haj0hMTt4LmdzPSJtYXQtc2VsZWN0Ijt4LkxoPSIiO3guVkc9U2koZnVuY3Rpb24oKXt2YXIgdT14Lm9wdGlvbnM7cmV0dXJuIHU/dS5aYi5iKE5sKHUpLE9sKGZ1bmN0aW9uKCl7cmV0dXJuIFlqLmFwcGx5KG51bGwsamEodS5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIEQuUEd9KSkpfSkpOiRoKHguUy5yZikuYihnbCgpLE9sKGZ1bmN0aW9uKCl7cmV0dXJuIHguVkd9KSl9KTt4LnNmPW5ldyByazt4LnNNPXguc2YuYihhayhmdW5jdGlvbih1KXtyZXR1cm4gdX0pLHVpKGZ1bmN0aW9uKCl7fSkpO3guVko9eC5zZi5iKGFrKGZ1bmN0aW9uKHUpe3JldHVybiF1fSksdWkoZnVuY3Rpb24oKXt9KSk7eC54dD1uZXcgcms7eC5Haz1uZXcgcms7eC5xYyYmKHgucWMuRWY9eCk7eC54dz1yO3gudmQ9eC54dygpO3gudGFiSW5kZXg9cGFyc2VJbnQocSl8fAowO3guaWQ9eC5pZDt3JiYobnVsbCE9dy5UeCYmKHguVHg9dy5UeCksbnVsbCE9dy5HeiYmKHguR3o9dy5HeikpO3JldHVybiB4fTt0KExGLEtGKTtoPUxGLnByb3RvdHlwZTtoLk9iPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLlhiPW5ldyBHQSh0aGlzLm11bHRpcGxlKTt0aGlzLndiLm5leHQoKTt0aGlzLlRDLmIoZGwoKSxSbCh0aGlzLnFnKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS5mZD8oYS5UZD0wLGEuc2YuZW1pdCghMCkpOihhLnNmLmVtaXQoITEpLGEueWkub2Zmc2V0WD0wLFlnKGEuY2EpKX0pO3RoaXMuTWIuUWEoKS5iKFJsKHRoaXMucWcpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXthLmZmJiYoYS5HaD1hLnRyaWdnZXIuaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxZZyhhLmNhKSl9KX07CmgucWY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudEwoKTt0aGlzLlhiLldFLmIoUmwodGhpcy5xZykpLnN1YnNjcmliZShmdW5jdGlvbihiKXtiLkFPLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGMuc2VsZWN0KCl9KTtiLiRRLmZvckVhY2goZnVuY3Rpb24oYyl7cmV0dXJuIGMuU2woKX0pfSk7dGhpcy5vcHRpb25zLlpiLmIoTmwobnVsbCksUmwodGhpcy5xZykpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuV00oKTthLnhMKCl9KX07aC50aT1mdW5jdGlvbigpe3RoaXMucWMmJnRoaXMucEkoKX07aC5TYT1mdW5jdGlvbihhKXthLmRpc2FibGVkJiZ0aGlzLndiLm5leHQoKTthLnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwmJnRoaXMuUGEmJnlBKHRoaXMuUGEsdGhpcy5heCl9O2guWD1mdW5jdGlvbigpe3RoaXMucWcubmV4dCgpO3RoaXMucWcuY29tcGxldGUoKTt0aGlzLndiLmNvbXBsZXRlKCl9O2gudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5mZD90aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9OwpoLm9wZW49ZnVuY3Rpb24oKXt2YXIgYT10aGlzOyF0aGlzLmRpc2FibGVkJiZ0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5sZW5ndGgmJiF0aGlzLmZmJiYodGhpcy5HaD10aGlzLnRyaWdnZXIuaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLkZuPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy50cmlnZ2VyLmkpLmZvbnRTaXplfHwiMCIpLHRoaXMuZmY9ITAsd0EodGhpcy5QYSxudWxsKSx0aGlzLkRKKCksdGhpcy5yTCgpLFlnKHRoaXMuY2EpLCRoKHRoaXMuUy5yZikuYihnbCgpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXthLkZuJiZhLnlpLllvJiZhLnlpLllvLnppJiYoYS55aS5Zby56aS5zdHlsZS5mb250U2l6ZT1hLkZuKyJweCIpfSkpfTtoLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5mZiYmKHRoaXMuZmY9ITEsd0EodGhpcy5QYSx0aGlzLnJlKCk/InJ0bCI6Imx0ciIpLFlnKHRoaXMuY2EpLHRoaXMucWwoKSl9OwpoLklkPWZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucyYmdGhpcy5HRChhKX07aC5GZD1mdW5jdGlvbihhKXt0aGlzLnJkPWF9O2guTmU9ZnVuY3Rpb24oYSl7dGhpcy5xbD1hfTtoLlBlPWZ1bmN0aW9uKGEpe3RoaXMuZGlzYWJsZWQ9YTtZZyh0aGlzLmNhKTt0aGlzLndiLm5leHQoKX07aC5yZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkdhPyJydGwiPT09dGhpcy5HYS52YWx1ZTohMX07aC5IYT1mdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwodGhpcy5mZD90aGlzLm1MKGEpOnRoaXMua0woYSkpfTsKaC5rTD1mdW5jdGlvbihhKXt2YXIgYj1hLmtleUNvZGUsYz00MD09PWJ8fDM4PT09Ynx8Mzc9PT1ifHwzOT09PWIsZD10aGlzLlBhOyEoMDxkLm9qLmxlbmd0aHx8MTMhPT1iJiYzMiE9PWJ8fHNBKGEpKXx8KHRoaXMubXVsdGlwbGV8fGEuYWx0S2V5KSYmYz8oYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMub3BlbigpKTp0aGlzLm11bHRpcGxlfHwoYz10aGlzLnNlbGVjdGVkLDM2PT09Ynx8MzU9PT1iPygzNj09PWI/ZC5FaCgwLDEpOkRBKGQpLGEucHJldmVudERlZmF1bHQoKSk6Q0EoZCxhKSwoYT10aGlzLnNlbGVjdGVkKSYmYyE9PWEmJnRoaXMuUEwuTEUoYS5IcCwxRTQpKX07CmgubUw9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5QYSxjPWEua2V5Q29kZSxkPTQwPT09Y3x8Mzg9PT1jLGU9MDxiLm9qLmxlbmd0aDtpZigzNj09PWN8fDM1PT09YylhLnByZXZlbnREZWZhdWx0KCksMzY9PT1jP2IuRWgoMCwxKTpEQShiKTtlbHNlIGlmKGQmJmEuYWx0S2V5KWEucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKCk7ZWxzZSBpZihlfHwxMyE9PWMmJjMyIT09Y3x8IWIud2N8fHNBKGEpKWlmKCFlJiZ0aGlzLklmJiY2NT09PWMmJmEuY3RybEtleSl7YS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPXRoaXMub3B0aW9ucy5zb21lKGZ1bmN0aW9uKGcpe3JldHVybiFnLmRpc2FibGVkJiYhZy5zZWxlY3RlZH0pO3RoaXMub3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cuZGlzYWJsZWR8fChmP2cuc2VsZWN0KCk6Zy5TbCgpKX0pfWVsc2UgYz1iLlByLENBKGIsYSksdGhpcy5JZiYmZCYmYS5zaGlmdEtleSYmYi53YyYmYi5QciE9PWMmJmIud2MudmMoKTtlbHNlIGEucHJldmVudERlZmF1bHQoKSwKYi53Yy52YygpfTtoLnNkPWZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuYWo9ITAsdGhpcy53Yi5uZXh0KCkpfTtoLnFkPWZ1bmN0aW9uKCl7dGhpcy5haj0hMTt0aGlzLmRpc2FibGVkfHx0aGlzLmZkfHwodGhpcy5xbCgpLFlnKHRoaXMuY2EpLHRoaXMud2IubmV4dCgpKX07aC5pTT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy55aS5vSC5iKGdsKCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuY2EuTGcoKTthLkJKKCk7YS5CYS5pLnNjcm9sbFRvcD1hLlRkfSl9O2guYkw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50bj8ibWF0LSIrdGhpcy50bi5jb2xvcjoiIn07aC54TD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe2EuR0QoYS5xYz9hLnFjLnZhbHVlOmEubWEpO2Eud2IubmV4dCgpfSl9OwpoLkdEPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7aWYodGhpcy5tdWx0aXBsZSYmYSl7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3cgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuIik7dGhpcy5YYi5jbGVhcigpO2EuZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gYi5ERChjKX0pO3RoaXMuTEQoKX1lbHNlIHRoaXMuWGIuY2xlYXIoKSwoYT10aGlzLkREKGEpKT90aGlzLlBhLnhmKGEpOnRoaXMuZmR8fHRoaXMuUGEueGYoLTEpO1lnKHRoaXMuY2EpfTtoLkREPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz10aGlzLm9wdGlvbnMuZmluZChmdW5jdGlvbihkKXt0cnl7cmV0dXJuIG51bGwhPWQudmFsdWUmJmIuT20oZC52YWx1ZSxhKX1jYXRjaChlKXtyZXR1cm4gR2QoKSYmY29uc29sZS53YXJuKGUpLCExfX0pO2MmJnRoaXMuWGIuc2VsZWN0KGMpO3JldHVybiBjfTsKaC50TD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5QYT14QSh3QSh2QSh5QShuZXcgRUEodGhpcy5vcHRpb25zKSx0aGlzLmF4KSksdGhpcy5yZSgpPyJydGwiOiJsdHIiKSk7dGhpcy5QYS5Cei5iKFJsKHRoaXMucWcpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXthLmZkJiYoIWEubXVsdGlwbGUmJmEuUGEud2MmJmEuUGEud2MudmMoKSxhLmZvY3VzKCksYS5jbG9zZSgpKX0pO3RoaXMuUGEuUWEuYihSbCh0aGlzLnFnKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS5mZiYmYS5CYT9hLmNOKCk6YS5mZnx8YS5tdWx0aXBsZXx8IWEuUGEud2N8fGEuUGEud2MudmMoKX0pfTsKaC5XTT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1Zaih0aGlzLm9wdGlvbnMuWmIsdGhpcy5xZyk7dGhpcy5WRy5iKFJsKGIpKS5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7YS5xTShjLnNvdXJjZSxjLmxHKTtjLmxHJiYhYS5tdWx0aXBsZSYmYS5mZiYmKGEuY2xvc2UoKSxhLmZvY3VzKCkpfSk7WWouYXBwbHkobnVsbCxqYSh0aGlzLm9wdGlvbnMubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBjLnlyfSkpKS5iKFJsKGIpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtZZyhhLmNhKTthLndiLm5leHQoKX0pO3RoaXMubU4oKX07CmgucU09ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLlhiLk5mLmhhcyhhKTtudWxsIT1hLnZhbHVlfHx0aGlzLklmPyhjIT09YS5zZWxlY3RlZCYmKGEuc2VsZWN0ZWQ/dGhpcy5YYi5zZWxlY3QoYSk6dGhpcy5YYi5TbChhKSksYiYmdGhpcy5QYS54ZihhKSx0aGlzLm11bHRpcGxlJiYodGhpcy5MRCgpLGImJnRoaXMuZm9jdXMoKSkpOihhLlNsKCksdGhpcy5YYi5jbGVhcigpLHRoaXMuZ0QoYS52YWx1ZSkpO2MhPT10aGlzLlhiLk5mLmhhcyhhKSYmdGhpcy5nRCgpO3RoaXMud2IubmV4dCgpfTtoLkxEPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZih0aGlzLm11bHRpcGxlKXt2YXIgYj10aGlzLm9wdGlvbnMuRWMuc2xpY2UoKTt0aGlzLlhiLnNvcnQoZnVuY3Rpb24oYyxkKXtyZXR1cm4gYS5uUj9hLm5SKGMsZCxiKTpiLmluZGV4T2YoYyktYi5pbmRleE9mKGQpfSk7dGhpcy53Yi5uZXh0KCl9fTsKaC5nRD1mdW5jdGlvbihhKXt2YXIgYj1udWxsO3RoaXMubWE9Yj10aGlzLm11bHRpcGxlP3RoaXMuc2VsZWN0ZWQubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBjLnZhbHVlfSk6dGhpcy5zZWxlY3RlZD90aGlzLnNlbGVjdGVkLnZhbHVlOmE7dGhpcy5Hay5lbWl0KGIpO3RoaXMucmQoYik7dGhpcy54dC5lbWl0KG5ldyBKRih0aGlzLGIpKTtZZyh0aGlzLmNhKX07aC5tTj1mdW5jdGlvbigpe3RoaXMueWg9dGhpcy5vcHRpb25zLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0pLmpvaW4oIiAiKX07aC5yTD1mdW5jdGlvbigpe3RoaXMuUGEmJih0aGlzLmVtcHR5P3RoaXMuUGEuRWgoMCwxKTp0aGlzLlBhLnhmKHRoaXMuWGIuc2VsZWN0ZWRbMF0pKX07CmguY049ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLlByfHwwLGI9ekMoYSx0aGlzLm9wdGlvbnMsdGhpcy5ZZyksYz10aGlzLlprKCksZD10aGlzLkJhLmkuc2Nyb2xsVG9wO2E9KGErYikqYzt0aGlzLkJhLmkuc2Nyb2xsVG9wPWE8ZD9hOmErYz5kKzI1Nj9NYXRoLm1heCgwLGEtMjU2K2MpOmR9O2guZm9jdXM9ZnVuY3Rpb24oYSl7dGhpcy5tLmkuZm9jdXMoYSl9O2guWEs9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3B0aW9ucy5yZWR1Y2UoZnVuY3Rpb24oYixjLGQpe3JldHVybiB2b2lkIDAhPT1iP2I6YT09PWM/ZDp2b2lkIDB9LHZvaWQgMCl9OwpoLkRKPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5aaygpLGI9dGhpcy53cSgpLGM9TWF0aC5taW4oYiphLDI1Nik7YT1iKmEtYztiPXRoaXMuZW1wdHk/MDp0aGlzLlhLKHRoaXMuWGIuc2VsZWN0ZWRbMF0pO2IrPXpDKGIsdGhpcy5vcHRpb25zLHRoaXMuWWcpO2MvPTI7dGhpcy5UZD10aGlzLkVKKGIsYyxhKTt0aGlzLnBkPXRoaXMuQ0ooYixjLGEpO3RoaXMuT0ooYSl9O2guRUo9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuWmsoKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoMCxkKmEtYitkLzIpLGMpfTtoLnBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWw/bnVsbDp0aGlzLkxofHx0aGlzLnBsYWNlaG9sZGVyfTtoLmRqPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWw/dGhpcy5JbDp0aGlzLnRuJiZ0aGlzLnRuLnViKCkmJiF0aGlzLnBoKCk/dGhpcy50bi54dnx8bnVsbDpudWxsfTsKaC5jaj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZkJiZ0aGlzLlBhJiZ0aGlzLlBhLndjP3RoaXMuUGEud2MuaWQ6bnVsbH07aC5CSj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueWkuWW8uemkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYj0kQSh0aGlzLk1iKSxjPXRoaXMucmUoKSxkPXRoaXMubXVsdGlwbGU/NTY6MzI7dmFyIGU9dGhpcy5tdWx0aXBsZT80MDooZT10aGlzLlhiLnNlbGVjdGVkWzBdfHx0aGlzLm9wdGlvbnMuZmlyc3QpJiZlLmdyb3VwPzMyOjE2O2N8fChlKj0tMSk7dmFyIGY9LShhLmxlZnQrZS0oYz9kOjApKTthPWEucmlnaHQrZS1iLndpZHRoKyhjPzA6ZCk7MDxmP2UrPWYrODowPGEmJihlLT1hKzgpO3RoaXMueWkub2Zmc2V0WD1NYXRoLnJvdW5kKGUpO3RoaXMueWkuWW8uamcoKX07CmguQ0o9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuWmsoKSxlPShkLXRoaXMuR2guaGVpZ2h0KS8yLGY9TWF0aC5mbG9vcigyNTYvZCk7cmV0dXJuIHRoaXMuQ3U/MDpNYXRoLnJvdW5kKC0xKigwPT09dGhpcy5UZD9hKmQ6dGhpcy5UZD09PWM/KGEtKHRoaXMud3EoKS1mKSkqZCsoZC0odGhpcy53cSgpKmQtMjU2KSVkKTpiLWQvMiktZSl9O2guT0o9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5aaygpLGM9JEEodGhpcy5NYiksZD10aGlzLkdoLnRvcC04O2M9Yy5oZWlnaHQtdGhpcy5HaC5ib3R0b20tODt2YXIgZT1NYXRoLmFicyh0aGlzLnBkKTtiPU1hdGgubWluKHRoaXMud3EoKSpiLDI1NiktZS10aGlzLkdoLmhlaWdodDtiPmM/dGhpcy5ZSShiLGMpOmU+ZD90aGlzLlhJKGUsZCxhKTp0aGlzLkNsPXRoaXMuVHUoKX07CmguWUk9ZnVuY3Rpb24oYSxiKXthPU1hdGgucm91bmQoYS1iKTt0aGlzLlRkLT1hO3RoaXMucGQtPWE7dGhpcy5DbD10aGlzLlR1KCk7MD49dGhpcy5UZCYmKHRoaXMucGQ9dGhpcy5UZD0wLHRoaXMuQ2w9IjUwJSBib3R0b20gMHB4Iil9O2guWEk9ZnVuY3Rpb24oYSxiLGMpe2E9TWF0aC5yb3VuZChhLWIpO3RoaXMuVGQrPWE7dGhpcy5wZCs9YTt0aGlzLkNsPXRoaXMuVHUoKTt0aGlzLlRkPj1jJiYodGhpcy5UZD1jLHRoaXMucGQ9MCx0aGlzLkNsPSI1MCUgdG9wIDBweCIpfTtoLlR1PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5aaygpO3JldHVybiI1MCUgIisoTWF0aC5hYnModGhpcy5wZCktKGEtdGhpcy5HaC5oZWlnaHQpLzIrYS8yKSsicHggMHB4In07aC53cT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMubGVuZ3RoK3RoaXMuWWcubGVuZ3RofTtoLlprPWZ1bmN0aW9uKCl7cmV0dXJuIDMqdGhpcy5Gbn07aC5KSD1mdW5jdGlvbihhKXt0aGlzLkZiPWEuam9pbigiICIpfTsKaC5OeT1mdW5jdGlvbigpe3RoaXMuZm9jdXMoKTt0aGlzLm9wZW4oKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTEYucHJvdG90eXBlLHtmb2N1c2VkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hanx8dGhpcy5mZn19LHBsYWNlaG9sZGVyOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55TX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMueU09YTt0aGlzLndiLm5leHQoKX19LHJlcXVpcmVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZY30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuWWM9dHooYSk7dGhpcy53Yi5uZXh0KCl9fSxtdWx0aXBsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWZ9LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLlhiKXRocm93IEVycm9yKCJDYW5ub3QgY2hhbmdlIGBtdWx0aXBsZWAgbW9kZSBvZiBzZWxlY3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uIik7dGhpcy5JZj0KdHooYSl9fSxUeDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ3V9LHNldDpmdW5jdGlvbihhKXt0aGlzLkN1PXR6KGEpfX0sdmFsdWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxzZXQ6ZnVuY3Rpb24oYSl7YSE9PXRoaXMubWEmJih0aGlzLklkKGEpLHRoaXMubWE9YSl9fSxHejp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXh9LHNldDpmdW5jdGlvbihhKXt0aGlzLmF4PXd6KGEpfX0saWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhqfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5oaj1hfHx0aGlzLmJ4O3RoaXMud2IubmV4dCgpfX0sZmQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfX0sCnNlbGVjdGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdWx0aXBsZT90aGlzLlhiLnNlbGVjdGVkOnRoaXMuWGIuc2VsZWN0ZWRbMF19fSxBUjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5lbXB0eSlyZXR1cm4iIjtpZih0aGlzLklmKXt2YXIgYT10aGlzLlhiLnNlbGVjdGVkLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gYi5IcH0pO3RoaXMucmUoKSYmYS5yZXZlcnNlKCk7cmV0dXJuIGEuam9pbigiLCAiKX1yZXR1cm4gdGhpcy5YYi5zZWxlY3RlZFswXS5IcH19LGVtcHR5Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5YYnx8dGhpcy5YYi5PaigpfX0sUEg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZmfHwhdGhpcy5lbXB0eX19fSk7dmFyIE1GPWZ1bmN0aW9uKCl7fTt2YXIgTkY9Y2coe1Q6MixnOltbIi5tYXQtc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7b3V0bGluZTpub25lfS5tYXQtc2VsZWN0LXRyaWdnZXJ7ZGlzcGxheTppbmxpbmUtdGFibGU7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXRyaWdnZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtc2VsZWN0LXZhbHVle2Rpc3BsYXk6dGFibGUtY2VsbDttYXgtd2lkdGg6MDt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0ubWF0LXNlbGVjdC12YWx1ZS10ZXh0e3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMjUlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwgLm1hdC1zZWxlY3Q6bm90KC5tYXQtc2VsZWN0LWVtcHR5KSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZW1wdHkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtc2VsZWN0LWFycm93e3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7bWFyZ2luOjAgNHB4fS5tYXQtc2VsZWN0LXBhbmVsLXdyYXB7ZmxleC1iYXNpczoxMDAlfS5tYXQtc2VsZWN0LXBhbmVse21pbi13aWR0aDoxMTJweDttYXgtd2lkdGg6MjgwcHg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjA7bWF4LWhlaWdodDoyNTZweDttaW4td2lkdGg6MTAwJTtib3JkZXItcmFkaXVzOjRweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2VsZWN0LXBhbmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0Z3JvdXAtbGFiZWwsLm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb257Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6M2VtO2hlaWdodDozZW19Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LXNlbGVjdDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleHtjdXJzb3I6cG9pbnRlcn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt3aWR0aDpjYWxjKDEwMCUgLSAxOHB4KX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcnt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246bm9uZX0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LXNlbGVjdC1wbGFjZWhvbGRlcntjb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmU7ZGlzcGxheTpibG9ja31cbiJdXSwKZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6InRyYW5zZm9ybVBhbmVsV3JhcCIsamY6W3t0eXBlOjEsemM6IiogPT4gdm9pZCIsYW5pbWF0aW9uOnt0eXBlOjExLGllOiJAdHJhbnNmb3JtUGFuZWwiLGFuaW1hdGlvbjpbe3R5cGU6OSxvcHRpb25zOm51bGx9XSxvcHRpb25zOntvcHRpb25hbDohMH19LG9wdGlvbnM6bnVsbH1dLG9wdGlvbnM6e319LHt0eXBlOjcsbmFtZToidHJhbnNmb3JtUGFuZWwiLGpmOlt7dHlwZTowLG5hbWU6InZvaWQiLGc6e3R5cGU6NixnOnt0cmFuc2Zvcm06InNjYWxlWSgwLjgpIixtaW5XaWR0aDoiMTAwJSIsb3BhY2l0eTowfSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjAsbmFtZToic2hvd2luZyIsZzp7dHlwZTo2LGc6e29wYWNpdHk6MSxtaW5XaWR0aDoiY2FsYygxMDAlICsgMzJweCkiLHRyYW5zZm9ybToic2NhbGVZKDEpIn0sb2Zmc2V0Om51bGx9LG9wdGlvbnM6dm9pZCAwfSx7dHlwZTowLG5hbWU6InNob3dpbmctbXVsdGlwbGUiLApnOnt0eXBlOjYsZzp7b3BhY2l0eToxLG1pbldpZHRoOiJjYWxjKDEwMCUgKyA2NHB4KSIsdHJhbnNmb3JtOiJzY2FsZVkoMSkifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6InZvaWQgPT4gKiIsYW5pbWF0aW9uOnt0eXBlOjQsZzpudWxsLGtiOiIxMjBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSJ9LG9wdGlvbnM6bnVsbH0se3R5cGU6MSx6YzoiKiA9PiB2b2lkIixhbmltYXRpb246e3R5cGU6NCxnOnt0eXBlOjYsZzp7b3BhY2l0eTowfSxvZmZzZXQ6bnVsbH0sa2I6IjEwMG1zIDI1bXMgbGluZWFyIn0sb3B0aW9uczpudWxsfV0sb3B0aW9uczp7fX1dfX0pOwpmdW5jdGlvbiBPRihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwibWF0LXNlbGVjdC1wbGFjZWhvbGRlciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxLG51bGwsWyIiLCIiXSkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDEsMCxjLmEucGxhY2Vob2xkZXJ8fCJcdTAwYTAiKX0pfWZ1bmN0aW9uIFBGKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwic3BhbiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMSxudWxsLFsiIiwiIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5hLkFSfHwiXHUwMGEwIil9KX1mdW5jdGlvbiBRRihhKXtyZXR1cm4gWigwLFtNbShudWxsLDApLChhKCkoKSxWKDAsbnVsbCxudWxsLDApKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gUkYoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw1LCJzcGFuIixbWyJjbGFzcyIsIm1hdC1zZWxlY3QtdmFsdWUtdGV4dCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDEsMTYzODQsbnVsbCwwLHdvLFtdLHtVajpbMCwibmdTd2l0Y2giXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxQRikpLEkoMywxNjM4NCxudWxsLDAseW8sW0VmLERmLHdvXSxudWxsLG51bGwpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsUUYpKSxJKDUsMjc4NTI4LG51bGwsMCx4byxbRWYsRGYsd29dLHtWZzpbMCwibmdTd2l0Y2hDYXNlIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe2IoYywxLDAsISFjLmEuRmopO2IoYyw1LDAsITApfSxudWxsKX0KZnVuY3Rpb24gU0YoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwibWF0LXNlbGVjdC1wYW5lbC13cmFwIl1dLFtbMjQsIkB0cmFuc2Zvcm1QYW5lbFdyYXAiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLFtbMiwwXSxbInBhbmVsIiwxXV0sbnVsbCwyLCJkaXYiLFtdLFtbMSwiaWQiLDBdLFsyNCwiQHRyYW5zZm9ybVBhbmVsIiwwXSxbNCwidHJhbnNmb3JtT3JpZ2luIixudWxsXSxbNCwiZm9udC1zaXplIiwicHgiXV0sW1tudWxsLCJAdHJhbnNmb3JtUGFuZWwuZG9uZSJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiQHRyYW5zZm9ybVBhbmVsLmRvbmUiPT09YyYmKGU9ITEhPT1mLlRDLm5leHQoZC5pYikmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09Zi5IYShkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMiwyNzg1MjgsbnVsbCwwLHBvLFt5Zix6ZiwKeixaZV0se3d5OlswLCJrbGFzcyJdLGppOlsxLCJuZ0NsYXNzIl19LG51bGwpLE1tKG51bGwsMSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyLDAsIm1hdC1zZWxlY3QtcGFuZWwgIitCZyhkLmJMKCkpLGQucmIpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLHZvaWQgMCk7YihjLDEsMCxkLmlkKyItcGFuZWwiLGQubXVsdGlwbGU/InNob3dpbmctbXVsdGlwbGUiOiJzaG93aW5nIixkLkNsLGQuRm4pfSl9CmZ1bmN0aW9uIFRGKGEpe3JldHVybiBaKDIsW1goNjcxMDg4NjQwLDEse3RyaWdnZXI6MH0pLFgoNjcxMDg4NjQwLDIse0JhOjB9KSxYKDY3MTA4ODY0MCwzLHt5aTowfSksKGEoKSgpLFcoMywwLFtbMSwwXSxbInRyaWdnZXIiLDFdXSxudWxsLDksImRpdiIsW1siYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJjZGstb3ZlcmxheS1vcmlnaW4iLCIiXSxbImNsYXNzIiwibWF0LXNlbGVjdC10cmlnZ2VyIl1dLG51bGwsW1tudWxsLCJjbGljayJdXSxmdW5jdGlvbihiLGMpe3ZhciBkPSEwLGU9Yi5hOyJjbGljayI9PT1jJiYoZD0hMSE9PWUudG9nZ2xlKCkmJmQpO3JldHVybiBkfSxudWxsLG51bGwpKSxJKDQsMTYzODQsW1sib3JpZ2luIiw0XV0sMCxaQixbel0sbnVsbCxudWxsKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDUsImRpdiIsW1siY2xhc3MiLCJtYXQtc2VsZWN0LXZhbHVlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNiwxNjM4NCxudWxsLDAsd28sW10se1VqOlswLAoibmdTd2l0Y2giXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxPRikpLEkoOCwyNzg1MjgsbnVsbCwwLHhvLFtFZixEZix3b10se1ZnOlswLCJuZ1N3aXRjaENhc2UiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxSRikpLEkoMTAsMjc4NTI4LG51bGwsMCx4byxbRWYsRGYsd29dLHtWZzpbMCwibmdTd2l0Y2hDYXNlIl19LG51bGwpLChhKCkoKSxXKDExLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtc2VsZWN0LWFycm93LXdyYXBwZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTIsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1zZWxlY3QtYXJyb3ciXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsZnVuY3Rpb24oYixjKXt2YXIgZD0hMCxlPWIuYTsiYmFja2Ryb3BDbGljayI9PT1jJiYoZD0hMSE9PWUuY2xvc2UoKSYmCmQpOyJhdHRhY2giPT09YyYmKGQ9ITEhPT1lLmlNKCkmJmQpOyJkZXRhY2giPT09YyYmKGQ9ITEhPT1lLmNsb3NlKCkmJmQpO3JldHVybiBkfSxTRikpLEkoMTQsNjcxNzQ0LFtbMyw0XV0sMCwkQixbV0IsRGYsRWYsWUIsWzIsTkFdXSx7b3JpZ2luOlswLCJvcmlnaW4iXSxhcDpbMSwicG9zaXRpb25zIl0sb2Zmc2V0WTpbMiwib2Zmc2V0WSJdLG1pbldpZHRoOlszLCJtaW5XaWR0aCJdLHhjOls0LCJiYWNrZHJvcENsYXNzIl0sZWc6WzUsInNjcm9sbFN0cmF0ZWd5Il0sb3BlbjpbNiwib3BlbiJdLHBjOls3LCJoYXNCYWNrZHJvcCJdLHJHOls4LCJsb2NrUG9zaXRpb24iXX0se1BmOiJiYWNrZHJvcENsaWNrIixjYjoiYXR0YWNoIixkZXRhY2g6ImRldGFjaCJ9KV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDYsMCxkLmVtcHR5KTtiKGMsOCwwLCEwKTtiKGMsMTAsMCwhMSk7dmFyIGU9RihjLDQpO2IoYywxNCwwLGUsZC5CTSxkLnBkLG51bGw9PWQuR2g/bnVsbDpkLkdoLndpZHRoLAoiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AiLGQudmQsZC5mZCwiIiwiIil9LG51bGwpfTtmdW5jdGlvbiBVRihhKXt0aHJvdyBFcnJvcigiQSBkcmF3ZXIgd2FzIGFscmVhZHkgZGVjbGFyZWQgZm9yICdwb3NpdGlvbj1cIiIrYSsiXCInIik7fXZhciBXRj1uZXcgeSgiTUFUX0RSQVdFUl9ERUZBVUxUX0FVVE9TSVpFIix7WToicm9vdCIsVjpWRn0pLFhGPW5ldyB5KCJNQVRfRFJBV0VSX0NPTlRBSU5FUiIpO2Z1bmN0aW9uIFZGKCl7cmV0dXJuITF9dmFyIFlGPWZ1bmN0aW9uKGEsYixjLGQsZSl7WUEuY2FsbCh0aGlzLGMsZCxlKTt0aGlzLmNhPWE7dGhpcy5saD1ifTt0KFlGLFlBKTtZRi5wcm90b3R5cGUucWY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMubGgud3Uuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7WWcoYS5jYSl9KX07CnZhciBaRj1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgbD10aGlzO3RoaXMubT1hO3RoaXMuUXU9Yjt0aGlzLnZhPWM7dGhpcy5lYT1kO3RoaXMuUz1lO3RoaXMuRGM9Zjt0aGlzLmxoPWc7dGhpcy5zcT1udWxsO3RoaXMuZkI9ITE7dGhpcy5tYz0ic3RhcnQiO3RoaXMuRkM9Im92ZXIiO3RoaXMuWXY9dGhpcy5YQT0hMTt0aGlzLmF1PW5ldyBZaDt0aGlzLiR0PW5ldyBZaDt0aGlzLlFpPSJ2b2lkIjt0aGlzLnNmPW5ldyByayghMCk7dGhpcy5hYT1uZXcgWWg7dGhpcy5PRz1uZXcgcms7dGhpcy5Ldj1uZXcgWWg7dGhpcy5zZi5zdWJzY3JpYmUoZnVuY3Rpb24obSl7bT8obC5EYyYmKGwuc3E9bC5EYy5hY3RpdmVFbGVtZW50KSxsLkVOKCkpOmwud2woKX0pO3RoaXMuUy5vYShmdW5jdGlvbigpe1ZpKGwubS5pLCJrZXlkb3duIikuYihhayhmdW5jdGlvbihtKXtyZXR1cm4gMjc9PT1tLmtleUNvZGUmJiFsLkhqJiYhc0EobSl9KSxSbChsLmFhKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKG0pe3JldHVybiBsLlMuZ2EoZnVuY3Rpb24oKXtsLmNsb3NlKCk7Cm0uc3RvcFByb3BhZ2F0aW9uKCk7bS5wcmV2ZW50RGVmYXVsdCgpfSl9KX0pO3RoaXMuJHQuYihkbChmdW5jdGlvbihtLHApe3JldHVybiBtLmNkPT09cC5jZCYmbS5pYj09PXAuaWJ9KSkuc3Vic2NyaWJlKGZ1bmN0aW9uKG0pe3ZhciBwPW0uY2Q7bT1tLmliOygwPT09bS5pbmRleE9mKCJvcGVuIikmJiJ2b2lkIj09PXB8fCJ2b2lkIj09PW0mJjA9PT1wLmluZGV4T2YoIm9wZW4iKSkmJmwuc2YuZW1pdChsLll2KX0pfTtoPVpGLnByb3RvdHlwZTtoLkVOPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLk9uJiZ0aGlzLnBlJiZiQSh0aGlzLnBlKS50aGVuKGZ1bmN0aW9uKGIpe2J8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5tLmkuZm9jdXN8fGEubS5pLmZvY3VzKCl9KX07Cmgud2w9ZnVuY3Rpb24oKXtpZih0aGlzLk9uKXt2YXIgYT10aGlzLkRjJiZ0aGlzLkRjLmFjdGl2ZUVsZW1lbnQ7YSYmdGhpcy5tLmkuY29udGFpbnMoYSkmJih0aGlzLnNxP1N6KHRoaXMudmEsdGhpcy5zcSx0aGlzLlFDKTp0aGlzLm0uaS5ibHVyKCkpO3RoaXMuUUM9dGhpcy5zcT1udWxsfX07aC5xZj1mdW5jdGlvbigpe3RoaXMucGU9dGhpcy5RdS5jcmVhdGUodGhpcy5tLmkpO3RoaXMuZHgoKX07aC5IRz1mdW5jdGlvbigpe3RoaXMuZWEueWEmJih0aGlzLmZCPSEwKX07aC5YPWZ1bmN0aW9uKCl7dGhpcy5wZSYmdGhpcy5wZS5kZXN0cm95KCk7dGhpcy5hdS5jb21wbGV0ZSgpO3RoaXMuJHQuY29tcGxldGUoKTt0aGlzLkt2LmNvbXBsZXRlKCk7dGhpcy5hYS5uZXh0KCk7dGhpcy5hYS5jb21wbGV0ZSgpfTtoLm9wZW49ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudG9nZ2xlKCEwLGEpfTtoLmNsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9nZ2xlKCExKX07CmgudG9nZ2xlPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczthPXZvaWQgMD09PWE/IXRoaXMuZWU6YTtiPXZvaWQgMD09PWI/InByb2dyYW0iOmI7KHRoaXMuWXY9YSk/KHRoaXMuUWk9dGhpcy5mQj8ib3BlbiI6Im9wZW4taW5zdGFudCIsdGhpcy5RQz1iKToodGhpcy5RaT0idm9pZCIsdGhpcy53bCgpKTt0aGlzLmR4KCk7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGQpe2Muc2YuYihnbCgpKS5zdWJzY3JpYmUoZnVuY3Rpb24oZSl7cmV0dXJuIGQoZT8ib3BlbiI6ImNsb3NlIil9KX0pfTtoLmR4PWZ1bmN0aW9uKCl7dGhpcy5wZSYmKHRoaXMucGUuZW5hYmxlZD10aGlzLmVlJiYic2lkZSIhPT10aGlzLm1vZGUpfTtoLmJKPWZ1bmN0aW9uKGEpe3RoaXMuYXUubmV4dChhKX07aC4kST1mdW5jdGlvbihhKXt0aGlzLiR0Lm5leHQoYSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFpGLnByb3RvdHlwZSx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jfSxzZXQ6ZnVuY3Rpb24oYSl7YT0iZW5kIj09PWE/ImVuZCI6InN0YXJ0IjthIT10aGlzLm1jJiYodGhpcy5tYz1hLHRoaXMuT0cuZW1pdCgpKX19LG1vZGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZDfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5GQz1hO3RoaXMuZHgoKTt0aGlzLkt2Lm5leHQoKX19LEhqOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YQX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuWEE9dHooYSl9fSxPbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wSjtyZXR1cm4gbnVsbD09YT8ic2lkZSIhPT10aGlzLm1vZGU6CmF9LHNldDpmdW5jdGlvbihhKXt0aGlzLnBKPXR6KGEpfX0sZWU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLll2fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy50b2dnbGUodHooYSkpfX0sc006e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNmLmIoYWsoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSx1aShmdW5jdGlvbigpe30pKX19LFZKOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZi5iKGFrKGZ1bmN0aW9uKGEpe3JldHVybiFhfSksdWkoZnVuY3Rpb24oKXt9KSl9fSxKaDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubS5pP3RoaXMubS5pLm9mZnNldFdpZHRofHwwOjB9fX0pOwp2YXIgYUc9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGw9dGhpcztmPXZvaWQgMD09PWY/ITE6Zjt0aGlzLkdhPWE7dGhpcy5rYT1iO3RoaXMuUz1jO3RoaXMuY2E9ZDt0aGlzLmlhPWc7dGhpcy5LZD1uZXcgbW07dGhpcy5QZj1uZXcgcms7dGhpcy5hYT1uZXcgWWg7dGhpcy5GdT1uZXcgWWg7dGhpcy5taD17bGVmdDpudWxsLHJpZ2h0Om51bGx9O3RoaXMud3U9bmV3IFloO2EmJmEuUWEuYihSbCh0aGlzLmFhKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7bC5neCgpOyRGKGwpfSk7ZS5RYSgpLmIoUmwodGhpcy5hYSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiAkRihsKX0pO3RoaXMucUo9Zn07CmFHLnByb3RvdHlwZS5xZj1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5lQS5aYi5iKE5sKHRoaXMuZUEpLFJsKHRoaXMuYWEpKS5zdWJzY3JpYmUoZnVuY3Rpb24oYil7YS5LZC5yZXNldChiLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hYy5saHx8Yy5saD09PWF9KSk7bm0oYS5LZCl9KTt0aGlzLktkLlpiLmIoTmwobnVsbCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuZ3goKTthLktkLmZvckVhY2goZnVuY3Rpb24oYil7YS52TyhiKTthLnVPKGIpO2EudE8oYil9KTsoIWEuS2QubGVuZ3RofHxhLmNsKGEuVmQpfHxhLmNsKGEuTWQpKSYmJEYoYSk7WWcoYS5jYSl9KTt0aGlzLkZ1LmIoUWsoMTApLFJsKHRoaXMuYWEpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gJEYoYSl9KX07YUcucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt0aGlzLnd1LmNvbXBsZXRlKCk7dGhpcy5GdS5jb21wbGV0ZSgpO3RoaXMuS2QuZGVzdHJveSgpO3RoaXMuYWEubmV4dCgpO3RoaXMuYWEuY29tcGxldGUoKX07CmFHLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dGhpcy5LZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLm9wZW4oKX0pfTthRy5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLktkLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xvc2UoKX0pfTt2YXIgJEY9ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPTA7aWYoYS52aCYmYS52aC5lZSlpZigic2lkZSI9PWEudmgubW9kZSliKz1hLnZoLkpoO2Vsc2UgaWYoInB1c2giPT1hLnZoLm1vZGUpe3ZhciBkPWEudmguSmg7Yis9ZDtjLT1kfWEuQ2gmJmEuQ2guZWUmJigic2lkZSI9PWEuQ2gubW9kZT9jKz1hLkNoLkpoOiJwdXNoIj09YS5DaC5tb2RlJiYoZD1hLkNoLkpoLGMrPWQsYi09ZCkpO2I9Ynx8bnVsbDtjPWN8fG51bGw7aWYoYiE9PWEubWgubGVmdHx8YyE9PWEubWgucmlnaHQpYS5taD17bGVmdDpiLHJpZ2h0OmN9LGEuUy5nYShmdW5jdGlvbigpe3JldHVybiBhLnd1Lm5leHQoYS5taCl9KX07aD1hRy5wcm90b3R5cGU7CmgudGk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMucUomJnRoaXMudGgoKSYmdGhpcy5TLm9hKGZ1bmN0aW9uKCl7cmV0dXJuIGEuRnUubmV4dCgpfSl9O2gudk89ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthLmF1LmIoYWsoZnVuY3Rpb24oYyl7cmV0dXJuIGMuY2QhPT1jLmlifSksUmwodGhpcy5LZC5aYikpLnN1YnNjcmliZShmdW5jdGlvbihjKXsib3Blbi1pbnN0YW50IiE9PWMuaWImJiJOb29wQW5pbWF0aW9ucyIhPT1iLmlhJiZiLmthLmkuY2xhc3NMaXN0LmFkZCgibWF0LWRyYXdlci10cmFuc2l0aW9uIik7JEYoYik7WWcoYi5jYSl9KTsic2lkZSIhPT1hLm1vZGUmJmEuc2YuYihSbCh0aGlzLktkLlpiKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIGIuaU4oYS5lZSl9KX07aC51Tz1mdW5jdGlvbihhKXt2YXIgYj10aGlzO2EmJmEuT0cuYihSbCh0aGlzLktkLlpiKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7JGgoYi5TLlVvKS5iKGdsKCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2IuZ3goKX0pfSl9OwpoLnRPPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YSYmYS5Ldi5iKFJsKFlqKHRoaXMuS2QuWmIsdGhpcy5hYSkpKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXskRihiKTtZZyhiLmNhKX0pfTtoLmlOPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2EuaS5jbGFzc0xpc3Q7YT9iLmFkZCgibWF0LWRyYXdlci1jb250YWluZXItaGFzLW9wZW4iKTpiLnJlbW92ZSgibWF0LWRyYXdlci1jb250YWluZXItaGFzLW9wZW4iKX07CmguZ3g9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuVmQ9dGhpcy5NZD1udWxsO3RoaXMuS2QuZm9yRWFjaChmdW5jdGlvbihiKXsiZW5kIj09Yi5wb3NpdGlvbj8obnVsbCE9YS5NZCYmVUYoImVuZCIpLGEuTWQ9Yik6KG51bGwhPWEuVmQmJlVGKCJzdGFydCIpLGEuVmQ9Yil9KTt0aGlzLkNoPXRoaXMudmg9bnVsbDt0aGlzLkdhJiYicnRsIj09PXRoaXMuR2EudmFsdWU/KHRoaXMudmg9dGhpcy5NZCx0aGlzLkNoPXRoaXMuVmQpOih0aGlzLnZoPXRoaXMuVmQsdGhpcy5DaD10aGlzLk1kKX07aC50aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsKHRoaXMuVmQpJiYib3ZlciIhPXRoaXMuVmQubW9kZXx8dGhpcy5jbCh0aGlzLk1kKSYmIm92ZXIiIT10aGlzLk1kLm1vZGV9O2guak09ZnVuY3Rpb24oKXt0aGlzLlBmLmVtaXQoKTt0aGlzLlVKKCl9OwpoLlVKPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztbdGhpcy5WZCx0aGlzLk1kXS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGImJiFiLkhqJiZhLm11KGIpfSkuZm9yRWFjaChmdW5jdGlvbihiKXtyZXR1cm4gYi5jbG9zZSgpfSl9O2guSUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbCh0aGlzLlZkKSYmdGhpcy5tdSh0aGlzLlZkKXx8dGhpcy5jbCh0aGlzLk1kKSYmdGhpcy5tdSh0aGlzLk1kKX07aC5tdT1mdW5jdGlvbihhKXtyZXR1cm4ic2lkZSIhPT1hLm1vZGV8fCEhdGhpcy5icX07aC5jbD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYS5lZX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYUcucHJvdG90eXBlLHtzdGFydDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVmR9fSxlbmQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1kfX0scGM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmJxPyF0aGlzLlZkfHwic2lkZSIhPT10aGlzLlZkLm1vZGV8fCF0aGlzLk1kfHwic2lkZSIhPT10aGlzLk1kLm1vZGU6dGhpcy5icX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuYnE9bnVsbD09YT9udWxsOnR6KGEpfX19KTt2YXIgYkc9ZnVuY3Rpb24oYSxiLGMsZCxlKXtZRi5jYWxsKHRoaXMsYSxiLGMsZCxlKX07dChiRyxZRik7dmFyIGNHPWZ1bmN0aW9uKCl7WkYuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudkI9ITE7dGhpcy51Qj10aGlzLndCPTB9O3QoY0csWkYpO2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY0cucHJvdG90eXBlLHtkeTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudkJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLnZCPXR6KGEpfX0sS1A6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLndCfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy53Qj13eihhKX19LEpQOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Qn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudUI9d3ooYSl9fX0pOwp2YXIgZEc9ZnVuY3Rpb24oKXthRy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3QoZEcsYUcpO3ZhciBlRz1mdW5jdGlvbigpe307dmFyIGZHPWNnKHtUOjIsZzpbXSxkYXRhOnt9fSk7ZnVuY3Rpb24gZ0coKXtyZXR1cm4gWigyLFtNbShudWxsLDApXSxudWxsLG51bGwpfQp2YXIgaEc9Y2coe1Q6MixnOltdLGRhdGE6e2FuaW1hdGlvbjpbe3R5cGU6NyxuYW1lOiJ0cmFuc2Zvcm0iLGpmOlt7dHlwZTowLG5hbWU6Im9wZW4sIG9wZW4taW5zdGFudCIsZzp7dHlwZTo2LGc6e3RyYW5zZm9ybToibm9uZSIsdmlzaWJpbGl0eToidmlzaWJsZSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MCxuYW1lOiJ2b2lkIixnOnt0eXBlOjYsZzp7ImJveC1zaGFkb3ciOiJub25lIix2aXNpYmlsaXR5OiJoaWRkZW4ifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6InZvaWQgPT4gb3Blbi1pbnN0YW50IixhbmltYXRpb246e3R5cGU6NCxnOm51bGwsa2I6IjBtcyJ9LG9wdGlvbnM6bnVsbH0se3R5cGU6MSx6Yzoidm9pZCA8PT4gb3Blbiwgb3Blbi1pbnN0YW50ID0+IHZvaWQiLGFuaW1hdGlvbjp7dHlwZTo0LGc6bnVsbCxrYjoiNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSkifSxvcHRpb25zOm51bGx9XSwKb3B0aW9uczp7fX1dfX0pO2Z1bmN0aW9uIGlHKGEpe3JldHVybiBaKDIsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1kcmF3ZXItaW5uZXItY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLE1tKG51bGwsMCldLG51bGwsbnVsbCl9CnZhciBqRz1jZyh7VDoyLGc6W1siLm1hdC1kcmF3ZXItY29udGFpbmVye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW59Lm1hdC1kcmF3ZXItY29udGFpbmVyW2Z1bGxzY3JlZW5de3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtZHJhd2VyLWNvbnRhaW5lcltmdWxsc2NyZWVuXS5tYXQtZHJhd2VyLWNvbnRhaW5lci1oYXMtb3BlbntvdmVyZmxvdzpoaWRkZW59Lm1hdC1kcmF3ZXItY29udGFpbmVyLm1hdC1kcmF3ZXItY29udGFpbmVyLWV4cGxpY2l0LWJhY2tkcm9wIC5tYXQtZHJhd2VyLXNpZGV7ei1pbmRleDozfS5tYXQtZHJhd2VyLWNvbnRhaW5lci5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtZHJhd2VyLWJhY2tkcm9wLC5tYXQtZHJhd2VyLWNvbnRhaW5lci5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtZHJhd2VyLWNvbnRlbnQsLm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1kcmF3ZXItY29udGFpbmVyIC5tYXQtZHJhd2VyLWJhY2tkcm9wLC5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtZHJhd2VyLWNvbnRhaW5lciAubWF0LWRyYXdlci1jb250ZW50e3RyYW5zaXRpb246bm9uZX0ubWF0LWRyYXdlci1iYWNrZHJvcHt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO3otaW5kZXg6Mzt2aXNpYmlsaXR5OmhpZGRlbn0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due3Zpc2liaWxpdHk6dmlzaWJsZX0ubWF0LWRyYXdlci10cmFuc2l0aW9uIC5tYXQtZHJhd2VyLWJhY2tkcm9we3RyYW5zaXRpb24tZHVyYXRpb246NDAwbXM7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7dHJhbnNpdGlvbi1wcm9wZXJ0eTpiYWNrZ3JvdW5kLWNvbG9yLHZpc2liaWxpdHl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWRyYXdlci1iYWNrZHJvcHtvcGFjaXR5Oi41fS5tYXQtZHJhd2VyLWNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0b30ubWF0LWRyYXdlci10cmFuc2l0aW9uIC5tYXQtZHJhd2VyLWNvbnRlbnR7dHJhbnNpdGlvbi1kdXJhdGlvbjo0MDBtczt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTt0cmFuc2l0aW9uLXByb3BlcnR5OnRyYW5zZm9ybSxtYXJnaW4tbGVmdCxtYXJnaW4tcmlnaHR9Lm1hdC1kcmF3ZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo0O2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7ei1pbmRleDozO291dGxpbmU6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3cteTphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWRyYXdlciwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIFtkaXI9cnRsXSAubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtib3JkZXItcmlnaHQ6c29saWQgMXB4IGN1cnJlbnRDb2xvcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIFtkaXI9cnRsXSAubWF0LWRyYXdlciwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCBjdXJyZW50Q29sb3I7Ym9yZGVyLXJpZ2h0Om5vbmV9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1zaWRle3otaW5kZXg6Mn0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApfVtkaXI9cnRsXSAubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtsZWZ0OjA7cmlnaHQ6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApfS5tYXQtZHJhd2VyLWlubmVyLWNvbnRhaW5lcnt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9Lm1hdC1zaWRlbmF2LWZpeGVke3Bvc2l0aW9uOmZpeGVkfVxuIl1dLGRhdGE6e319KTsKZnVuY3Rpb24ga0coYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwibWF0LWRyYXdlci1iYWNrZHJvcCJdXSxbWzIsIm1hdC1kcmF3ZXItc2hvd24iLG51bGxdXSxbW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNsaWNrIj09PWMmJihkPSExIT09ZS5qTSgpJiZkKTtyZXR1cm4gZH0sbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuYS5JTCgpKX0pfQpmdW5jdGlvbiBsRyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDMsIm1hdC1zaWRlbmF2LWNvbnRlbnQiLFtbImNka1Njcm9sbGFibGUiLCIiXSxbImNsYXNzIiwibWF0LWRyYXdlci1jb250ZW50IG1hdC1zaWRlbmF2LWNvbnRlbnQiXV0sW1s0LCJtYXJnaW4tbGVmdCIsInB4Il0sWzQsIm1hcmdpbi1yaWdodCIsInB4Il1dLG51bGwsbnVsbCxnRyxmRykpLEkoMSwyMTI5OTIsbnVsbCwwLFlBLFt6LFZBLFQsWzIsTkFdXSxudWxsLG51bGwpLEkoMiwxMjk0MzM2LG51bGwsMCxiRyxbbmUsZEcseixWQSxUXSxudWxsLG51bGwpLE1tKDAsMildLGZ1bmN0aW9uKGIsYyl7YihjLDEsMCk7YihjLDIsMCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9RihjLDIpLmxoLm1oLmxlZnQsZT1GKGMsMikubGgubWgucmlnaHQ7YihjLDAsMCxkLGUpfSl9CmZ1bmN0aW9uIG1HKGEpe3JldHVybiBaKDIsW1goNjcxMDg4NjQwLDEse2pTOjB9KSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGtHKSksSSgyLDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSxNbShudWxsLDApLE1tKG51bGwsMSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxsRykpLEkoNiwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyLDAsZC5wYyk7YihjLDYsMCwhZC5ZSil9LG51bGwpfTt2YXIgbkc9bmV3IHkoIm1hdC1zbGlkZS10b2dnbGUtZGVmYXVsdC1vcHRpb25zIix7WToicm9vdCIsVjpmdW5jdGlvbigpe3JldHVybntvUDohMX19fSk7dmFyIG9HPTAscEc9ZnVuY3Rpb24oYSxiKXt0aGlzLnNvdXJjZT1hO3RoaXMuY2hlY2tlZD1ifSxxRz1uQyhmQyhrQyhsQyhmdW5jdGlvbihhKXt0aGlzLm09YX0pKSwiYWNjZW50IikpLHJHPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPXFHLmNhbGwodGhpcyxhKXx8dGhpczthLnZhPWI7YS5jYT1jO2EuZGVmYXVsdHM9ZTthLmlhPWY7YS5yZD1mdW5jdGlvbigpe307YS5xbD1mdW5jdGlvbigpe307YS5Hbj0ibWF0LXNsaWRlLXRvZ2dsZS0iKyArK29HO2EuWWM9ITE7YS5Taz0hMTthLm5hbWU9bnVsbDthLmlkPWEuR247YS5Raj0iYWZ0ZXIiO2EuTGg9bnVsbDthLklsPW51bGw7YS5RYT1uZXcgcms7YS5GdD1uZXcgcms7YS50YWJJbmRleD1wYXJzZUludChkKXx8MDtyZXR1cm4gYX07dChyRyxxRyk7aD1yRy5wcm90b3R5cGU7CmgucWY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudmEuVWcodGhpcy5tLCEwKS5zdWJzY3JpYmUoZnVuY3Rpb24oYil7ImtleWJvYXJkIj09PWJ8fCJwcm9ncmFtIj09PWI/YS5yaC5pLmZvY3VzKCk6Ynx8UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBhLnFsKCl9KX0pfTtoLlg9ZnVuY3Rpb24oKXt0aGlzLnZhLnlmKHRoaXMubSl9O2gua009ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLkZ0LmVtaXQoKTt0aGlzLmRlZmF1bHRzLm9QP3RoaXMucmguaS5jaGVja2VkPXRoaXMuY2hlY2tlZDoodGhpcy5jaGVja2VkPXRoaXMucmguaS5jaGVja2VkLHRoaXMuTGQoKSl9O2guV3Y9ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX07aC5JZD1mdW5jdGlvbihhKXt0aGlzLmNoZWNrZWQ9ISFhfTtoLkZkPWZ1bmN0aW9uKGEpe3RoaXMucmQ9YX07aC5OZT1mdW5jdGlvbihhKXt0aGlzLnFsPWF9OwpoLlBlPWZ1bmN0aW9uKGEpe3RoaXMuZGlzYWJsZWQ9YTtZZyh0aGlzLmNhKX07aC5mb2N1cz1mdW5jdGlvbihhKXtTeih0aGlzLnZhLHRoaXMucmgsImtleWJvYXJkIixhKX07aC50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ9IXRoaXMuY2hlY2tlZDt0aGlzLnJkKHRoaXMuY2hlY2tlZCl9O2guTGQ9ZnVuY3Rpb24oKXt0aGlzLnJkKHRoaXMuY2hlY2tlZCk7dGhpcy5RYS5lbWl0KG5ldyBwRyh0aGlzLHRoaXMuY2hlY2tlZCkpfTtoLm5NPWZ1bmN0aW9uKCl7dGhpcy5jYS5MZygpfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhyRy5wcm90b3R5cGUse3JlcXVpcmVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZY30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuWWM9dHooYSl9fSxjaGVja2VkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Ta30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuU2s9dHooYSk7WWcodGhpcy5jYSl9fSx5bzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuaWR8fHRoaXMuR24pKyItaW5wdXQifX19KTt2YXIgc0c9ZnVuY3Rpb24oKXt9LHRHPWZ1bmN0aW9uKCl7fTt2YXIgdUc9Y2coe1Q6MixnOltbIi5tYXQtc2xpZGUtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O21heC13aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OjI0cHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNnB4LCAwLCAwKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTZweCwgMCwgMCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVke29wYWNpdHk6LjM4fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbCwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2N1cnNvcjpkZWZhdWx0fS5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVse2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7b3JkZXI6MX0ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye29yZGVyOjJ9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLWJhci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDt0b3A6LTNweDtsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbjpub25lfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzZweDtoZWlnaHQ6MTRweDtmbGV4LXNocmluazowO2JvcmRlci1yYWRpdXM6OHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2JvdHRvbTowO2xlZnQ6MTBweH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtaW5wdXR7bGVmdDphdXRvO3JpZ2h0OjEwcHh9Lm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcjt0cmFuc2l0aW9uLWRlbGF5OjUwbXN9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7dHJhbnNpdGlvbjpub25lfS5tYXQtc2xpZGUtdG9nZ2xlIC5tYXQtc2xpZGUtdG9nZ2xlLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyg1MCUgLSAyMHB4KTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjEyfS5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjA0fS5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWRpc2FibGVkKS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5Om5vbmV9fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7Ym9yZGVyOjFweCBzb2xpZH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvdXRsaW5lOjJweCBkb3R0ZWQ7b3V0bGluZS1vZmZzZXQ6NXB4fVxuIl1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIHZHKGEpe3JldHVybiBaKDIsW1goNjcxMDg4NjQwLDEse2lTOjB9KSxYKDY3MTA4ODY0MCwyLHtoUzowfSksWCg2NzEwODg2NDAsMyx7cmg6MH0pLChhKCkoKSxXKDMsMCxbWyJsYWJlbCIsMV1dLG51bGwsMTMsImxhYmVsIixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtbGFiZWwiXV0sW1sxLCJmb3IiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLFtbMiwwXSxbInRvZ2dsZUJhciIsMV1dLG51bGwsNywiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtYmFyIl1dLFtbMiwibWF0LXNsaWRlLXRvZ2dsZS1iYXItbm8tc2lkZS1tYXJnaW4iLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNSwwLFtbMywwXSxbImlucHV0IiwxXV0sbnVsbCwwLCJpbnB1dCIsW1siY2xhc3MiLCJtYXQtc2xpZGUtdG9nZ2xlLWlucHV0IGNkay12aXN1YWxseS1oaWRkZW4iXSxbInJvbGUiLCJzd2l0Y2giXSxbInR5cGUiLCJjaGVja2JveCJdXSwKW1s4LCJpZCIsMF0sWzgsInJlcXVpcmVkIiwwXSxbOCwidGFiSW5kZXgiLDBdLFs4LCJjaGVja2VkIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFsxLCJuYW1lIiwwXSxbMSwiYXJpYS1jaGVja2VkIiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF1dLFtbbnVsbCwiY2hhbmdlIl0sW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiY2hhbmdlIj09PWMmJihlPSExIT09Zi5rTShkKSYmZSk7ImNsaWNrIj09PWMmJihlPSExIT09Zi5XdihkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLChhKCkoKSxXKDYsMCxbWzEsMF0sWyJ0aHVtYkNvbnRhaW5lciIsMV1dLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDcsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtdGh1bWIiXV0sCm51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDgsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtcmlwcGxlIG1hdC1mb2N1cy1pbmRpY2F0b3IgbWF0LXJpcHBsZSJdLFsibWF0LXJpcHBsZSIsIiJdXSxbWzIsIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoOSwyMTI5OTIsbnVsbCwwLEtDLFt6LFQsTnosWzIsSkNdLFsyLGt2XV0se1NuOlswLCJjZW50ZXJlZCJdLGNwOlsxLCJyYWRpdXMiXSxhbmltYXRpb246WzIsImFuaW1hdGlvbiJdLGRpc2FibGVkOlszLCJkaXNhYmxlZCJdLHRyaWdnZXI6WzQsInRyaWdnZXIiXX0sbnVsbCksTm0oMTAse2xzOjB9KSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwibWF0LXJpcHBsZS1lbGVtZW50IG1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLApXKDEyLDAsW1sibGFiZWxDb250ZW50IiwxXV0sbnVsbCw0LCJzcGFuIixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUtY29udGVudCJdXSxudWxsLFtbbnVsbCwiY2RrT2JzZXJ2ZUNvbnRlbnQiXV0sZnVuY3Rpb24oYixjKXt2YXIgZD0hMCxlPWIuYTsiY2RrT2JzZXJ2ZUNvbnRlbnQiPT09YyYmKGQ9ITEhPT1lLm5NKCkmJmQpO3JldHVybiBkfSxudWxsLG51bGwpKSxJKDEzLDExOTYwMzIsbnVsbCwwLHp6LFt5eix6LFRdLG51bGwse2V2ZW50OiJjZGtPYnNlcnZlQ29udGVudCJ9KSwoYSgpKCksVygxNCwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJzdHlsZSIsImRpc3BsYXk6bm9uZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiXHUwMGEwIl0pKSxNbShudWxsLDApXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYSxlPWIoYywxMCwwLDE1MCksZj1kLklqfHxkLmRpc2FibGVkLGc9RihjLDMpO2IoYyw5LDAsITAsMjAsZSxmLGcpfSxmdW5jdGlvbihiLApjKXt2YXIgZD1jLmE7YihjLDMsMCxkLnlvKTt2YXIgZT0hRihjLDEyKS50ZXh0Q29udGVudHx8IUYoYywxMikudGV4dENvbnRlbnQudHJpbSgpO2IoYyw0LDAsZSk7YihjLDUsMCxkLnlvLGQucmVxdWlyZWQsZC50YWJJbmRleCxkLmNoZWNrZWQsZC5kaXNhYmxlZCxkLm5hbWUsZC5jaGVja2VkLnRvU3RyaW5nKCksZC5MaCxkLklsKTtlPUYoYyw5KS5JdDtiKGMsOCwwLGUpfSl9O3ZhciB3Rz1Heih7cGFzc2l2ZTohMX0pLHhHPWZ1bmN0aW9uKCl7fSx5Rz1uQyhmQyhsQyhmdW5jdGlvbihhKXt0aGlzLm09YX0pLCJhY2NlbnQiKSksQUc9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxsKXt2YXIgbT15Ry5jYWxsKHRoaXMsYSl8fHRoaXM7bS52YT1iO20uY2E9YzttLkdhPWQ7bS5TPWY7bS5pYT1sO20ua0M9ITE7bS5Idj0xMDA7bS5obj0wO20uQ249MTttLldEPSExO20uUnc9MDttLm1hPW51bGw7bS5CZz0hMTttLlFhPW5ldyByazttLmlucHV0PW5ldyByazttLkdrPW5ldyByazttLmdiPWZ1bmN0aW9uKCl7fTttLmJyPTA7bS5ZZT0hMTttLnBDPSExO20uRnI9MDttLk9mPW51bGw7bS5SbT1mdW5jdGlvbigpe307bS5WQT1NaC5FTVBUWTttLmNyPWZ1bmN0aW9uKHApe20uZGlzYWJsZWR8fG0uWWV8fCJ0IiE9PXAudHlwZVswXSYmMCE9PXAuYnV0dG9ufHxtLlMuZ2EoZnVuY3Rpb24oKXt2YXIgcT1tLnZhbHVlLHI9ekcocCk7bS5ZZT0hMDttLmZuPXA7cC5wcmV2ZW50RGVmYXVsdCgpOwptLlB1KCk7bS5wbigpO20uc0oocCk7bS5QdSgpO20ub0Uocik7bS52RT1tLnZhbHVlO20uYUQ9cjtxIT1tLnZhbHVlJiYobS5IdSgpLG0uTGQoKSl9KX07bS5kdz1mdW5jdGlvbihwKXtpZihtLlllKXtwLnByZXZlbnREZWZhdWx0KCk7dmFyIHE9bS52YWx1ZTttLmZuPXA7bS5vRSh6RyhwKSk7cSE9bS52YWx1ZSYmbS5IdSgpfX07bS5zbD1mdW5jdGlvbihwKXtpZihtLlllKXt2YXIgcT1tLmFELHI9ekcocCk7cC5wcmV2ZW50RGVmYXVsdCgpO20uckQoKTttLnZFPW0uYUQ9bS5mbj1udWxsO20uWWU9ITE7bS52RT09bS52YWx1ZXx8bS5kaXNhYmxlZHx8IXF8fHEueD09PXIueCYmcS55PT09ci55fHxtLkxkKCl9fTttLnpFPWZ1bmN0aW9uKCl7bS5mbiYmbS5zbChtLmZuKX07bS51PWc7bS50YWJJbmRleD1wYXJzZUludChlKXx8MDtmLm9hKGZ1bmN0aW9uKCl7dmFyIHA9YS5pO3AuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixtLmNyLHdHKTtwLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAptLmNyLHdHKX0pO3JldHVybiBtfTt0KEFHLHlHKTtoPUFHLnByb3RvdHlwZTtoLmZvY3VzPWZ1bmN0aW9uKGEpe3RoaXMuUHUoYSl9O2guYmx1cj1mdW5jdGlvbigpe3RoaXMudEooKX07aC5zaj1mdW5jdGlvbigpe3JldHVybiJydGwiIT10aGlzLmVqKCl8fHRoaXMudmVydGljYWw/dGhpcy5uZDohdGhpcy5uZH07aC5laj1mdW5jdGlvbigpe3JldHVybiB0aGlzLkdhJiYicnRsIj09dGhpcy5HYS52YWx1ZT8icnRsIjoibHRyIn07aC5MYz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy52YS5VZyh0aGlzLm0sITApLnN1YnNjcmliZShmdW5jdGlvbihiKXthLnBDPSEhYiYmImtleWJvYXJkIiE9PWI7YS5jYS5MZygpfSk7dGhpcy5HYSYmKHRoaXMuVkE9dGhpcy5HYS5RYS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtZZyhhLmNhKX0pKX07CmguWD1mdW5jdGlvbigpe3ZhciBhPXRoaXMubS5pO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmNyLHdHKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuY3Isd0cpO3RoaXMuZm49bnVsbDt0aGlzLnJEKCk7dGhpcy52YS55Zih0aGlzLm0pO3RoaXMuVkEudW5zdWJzY3JpYmUoKX07aC5wbj1mdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLk9mPXRoaXMuS0IoKSx0aGlzLmxFKCkpfTtoLnNkPWZ1bmN0aW9uKCl7dGhpcy5PZj10aGlzLktCKCk7dGhpcy5sRSgpfTtoLnFkPWZ1bmN0aW9uKCl7dGhpcy5nYigpfTsKaC5ZcT1mdW5jdGlvbihhKXtpZighdGhpcy5kaXNhYmxlZCYmIXNBKGEpKXt2YXIgYj10aGlzLnZhbHVlO3N3aXRjaChhLmtleUNvZGUpe2Nhc2UgMzM6dGhpcy5ibCgxMCk7YnJlYWs7Y2FzZSAzNDp0aGlzLmJsKC0xMCk7YnJlYWs7Y2FzZSAzNTp0aGlzLnZhbHVlPXRoaXMubWF4O2JyZWFrO2Nhc2UgMzY6dGhpcy52YWx1ZT10aGlzLm1pbjticmVhaztjYXNlIDM3OnRoaXMuYmwoInJ0bCI9PXRoaXMuZWooKT8xOi0xKTticmVhaztjYXNlIDM4OnRoaXMuYmwoMSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmJsKCJydGwiPT10aGlzLmVqKCk/LTE6MSk7YnJlYWs7Y2FzZSA0MDp0aGlzLmJsKC0xKTticmVhaztkZWZhdWx0OnJldHVybn1iIT10aGlzLnZhbHVlJiYodGhpcy5IdSgpLHRoaXMuTGQoKSk7dGhpcy5ZZT0hMDthLnByZXZlbnREZWZhdWx0KCl9fTtoLlpxPWZ1bmN0aW9uKCl7dGhpcy5ZZT0hMX07aC5QZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnUuZGVmYXVsdFZpZXd8fHdpbmRvd307Cmguc0o9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51LGM9KGE9InQiPT09YS50eXBlWzBdKT8idG91Y2hlbmQiOiJtb3VzZXVwIjtiLmFkZEV2ZW50TGlzdGVuZXIoYT8idG91Y2htb3ZlIjoibW91c2Vtb3ZlIix0aGlzLmR3LHdHKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyx0aGlzLnNsLHdHKTthJiZiLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIix0aGlzLnNsLHdHKTtiPXRoaXMuUGQoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiJiZiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuekUpfTsKaC5yRD1mdW5jdGlvbigpe3ZhciBhPXRoaXMudTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5kdyx3Ryk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLnNsLHdHKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsdGhpcy5kdyx3Ryk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdGhpcy5zbCx3Ryk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGNhbmNlbCIsdGhpcy5zbCx3Ryk7YT10aGlzLlBkKCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYSYmYSYmYS5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLnpFKX07aC5ibD1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPXRoaXMuaXEoKHRoaXMudmFsdWV8fDApK3RoaXMuc3RlcCphLHRoaXMubWluLHRoaXMubWF4KX07Cmgub0U9ZnVuY3Rpb24oYSl7dGhpcy5PZiYmKGE9dGhpcy5pcSgoKHRoaXMudmVydGljYWw/YS55OmEueCktKHRoaXMudmVydGljYWw/dGhpcy5PZi50b3A6dGhpcy5PZi5sZWZ0KSkvKHRoaXMudmVydGljYWw/dGhpcy5PZi5oZWlnaHQ6dGhpcy5PZi53aWR0aCkpLHRoaXMuc2ooKSYmKGE9MS1hKSx0aGlzLnZhbHVlPTA9PT1hP3RoaXMubWluOjE9PT1hP3RoaXMubWF4OnRoaXMuaXEoTWF0aC5yb3VuZCgodGhpcy5GSihhKS10aGlzLm1pbikvdGhpcy5zdGVwKSp0aGlzLnN0ZXArdGhpcy5taW4sdGhpcy5taW4sdGhpcy5tYXgpKX07aC5MZD1mdW5jdGlvbigpe3RoaXMuUm0odGhpcy52YWx1ZSk7dGhpcy5Hay5lbWl0KHRoaXMudmFsdWUpO3RoaXMuUWEuZW1pdCh0aGlzLk9BKCkpfTtoLkh1PWZ1bmN0aW9uKCl7dGhpcy5pbnB1dC5lbWl0KHRoaXMuT0EoKSl9OwpoLmxFPWZ1bmN0aW9uKCl7aWYodGhpcy5CayYmdGhpcy5PZilpZigiYXV0byI9PXRoaXMuQmspe3ZhciBhPXRoaXMudmVydGljYWw/dGhpcy5PZi5oZWlnaHQ6dGhpcy5PZi53aWR0aDt0aGlzLkZyPU1hdGguY2VpbCgzMC8oYSp0aGlzLnN0ZXAvKHRoaXMubWF4LXRoaXMubWluKSkpKnRoaXMuc3RlcC9hfWVsc2UgdGhpcy5Gcj10aGlzLkJrKnRoaXMuc3RlcC8odGhpcy5tYXgtdGhpcy5taW4pfTtoLk9BPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT90aGlzLnZhbHVlOmE7dmFyIGI9bmV3IHhHO2Iuc291cmNlPXRoaXM7Yi52YWx1ZT1hO3JldHVybiBifTtoLmx1PWZ1bmN0aW9uKGEpe3JldHVybigoYXx8MCktdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9O2guRko9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWluK2EqKHRoaXMubWF4LXRoaXMubWluKX07CmguaXE9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBNYXRoLm1heCh2b2lkIDA9PT1iPzA6YixNYXRoLm1pbihhLHZvaWQgMD09PWM/MTpjKSl9O2guS0I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LRD90aGlzLktELmkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6bnVsbH07aC5QdT1mdW5jdGlvbihhKXt0aGlzLm0uaS5mb2N1cyhhKX07aC50Sj1mdW5jdGlvbigpe3RoaXMubS5pLmJsdXIoKX07aC5JZD1mdW5jdGlvbihhKXt0aGlzLnZhbHVlPWF9O2guRmQ9ZnVuY3Rpb24oYSl7dGhpcy5SbT1hfTtoLk5lPWZ1bmN0aW9uKGEpe3RoaXMuZ2I9YX07aC5QZT1mdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkPWF9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFHLnByb3RvdHlwZSx7WkY6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtDfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5rQz10eihhKX19LG1heDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSHZ9LHNldDpmdW5jdGlvbihhKXt0aGlzLkh2PXd6KGEsdGhpcy5Idik7dGhpcy5icj10aGlzLmx1KHRoaXMubWEpO1lnKHRoaXMuY2EpfX0sbWluOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5obn0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuaG49d3ooYSx0aGlzLmhuKTtudWxsPT09dGhpcy5tYSYmKHRoaXMudmFsdWU9dGhpcy5obik7dGhpcy5icj10aGlzLmx1KHRoaXMubWEpO1lnKHRoaXMuY2EpfX0sc3RlcDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ259LApzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5Dbj13eihhLHRoaXMuQ24pOzAhPT10aGlzLkNuJTEmJih0aGlzLnNyPXRoaXMuQ24udG9TdHJpbmcoKS5zcGxpdCgiLiIpLnBvcCgpLmxlbmd0aCk7WWcodGhpcy5jYSl9fSx5cDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV0R9LHNldDpmdW5jdGlvbihhKXt0aGlzLldEPXR6KGEpfX0sQms6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ3fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5Sdz0iYXV0byI9PT1hPyJhdXRvIjoibnVtYmVyIj09PXR5cGVvZiBhfHwic3RyaW5nIj09PXR5cGVvZiBhP3d6KGEsdGhpcy5Sdyk6MH19LHZhbHVlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5tYSYmKHRoaXMudmFsdWU9dGhpcy5obik7cmV0dXJuIHRoaXMubWF9LHNldDpmdW5jdGlvbihhKXthIT09CnRoaXMubWEmJihhPXd6KGEpLHRoaXMuc3ImJihhPXBhcnNlRmxvYXQoYS50b0ZpeGVkKHRoaXMuc3IpKSksdGhpcy5tYT1hLHRoaXMuYnI9dGhpcy5sdSh0aGlzLm1hKSxZZyh0aGlzLmNhKSl9fSx2ZXJ0aWNhbDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmd9LHNldDpmdW5jdGlvbihhKXt0aGlzLkJnPXR6KGEpfX0scVA6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJQP3RoaXMuclAodGhpcy52YWx1ZSk6dGhpcy5zciYmdGhpcy52YWx1ZSYmMCE9PXRoaXMudmFsdWUlMT90aGlzLnZhbHVlLnRvRml4ZWQodGhpcy5zcik6dGhpcy52YWx1ZXx8MH19LHVmOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pcSh0aGlzLmJyKX19LG5kOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52ZXJ0aWNhbD8KIXRoaXMuWkY6dGhpcy5aRn19LEhmOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMudWZ9fSxGaDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Nzp0aGlzLkhmJiYhdGhpcy55cD90aGlzLnBDPzEwOjc6MH19LFBOOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57dHJhbnNmb3JtOiJ0cmFuc2xhdGUiKyh0aGlzLnZlcnRpY2FsPyJZIjoiWCIpKyIoIisodGhpcy5zaigpPyItIjoiIikrdGhpcy5GaCsicHgpIHNjYWxlM2QoIisodGhpcy52ZXJ0aWNhbD8iMSwgIisoMS10aGlzLnVmKSsiLCAxIjoxLXRoaXMudWYrIiwgMSwgMSIpKyIpIn19fSxRTjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51ZjtyZXR1cm57dHJhbnNmb3JtOiJ0cmFuc2xhdGUiKwoodGhpcy52ZXJ0aWNhbD8iWSI6IlgiKSsiKCIrKHRoaXMuc2ooKT8iIjoiLSIpK3RoaXMuRmgrInB4KSBzY2FsZTNkKCIrKHRoaXMudmVydGljYWw/IjEsICIrYSsiLCAxIjphKyIsIDEsIDEiKSsiKSIsZGlzcGxheTowPT09YT8ibm9uZSI6IiJ9fX0sS046e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybnt0cmFuc2Zvcm06InRyYW5zbGF0ZSIrKHRoaXMudmVydGljYWw/IlkiOiJYIikrIigiKyh0aGlzLnZlcnRpY2FsfHwicnRsIiE9dGhpcy5laigpPyItIjoiIikrdGhpcy5Gci8yKjEwMCsiJSkifX19LExOOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0xMDAqdGhpcy5GcjthPXtiYWNrZ3JvdW5kU2l6ZTp0aGlzLnZlcnRpY2FsPyIycHggIithKyIlIjphKyIlIDJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVaKDApIHRyYW5zbGF0ZSIrKHRoaXMudmVydGljYWw/IlkiOiJYIikrIigiKyh0aGlzLnZlcnRpY2FsfHwKInJ0bCIhPXRoaXMuZWooKT8iIjoiLSIpK2EvMisiJSkiKyh0aGlzLnZlcnRpY2FsfHwicnRsIiE9dGhpcy5laigpPyIiOiIgcm90YXRlKDE4MGRlZykiKX07dGhpcy5IZiYmdGhpcy5GaCYmKGFbInBhZGRpbmciKyh0aGlzLnZlcnRpY2FsP3RoaXMubmQ/IkJvdHRvbSI6IlRvcCI6dGhpcy5uZD8iUmlnaHQiOiJMZWZ0IildPXRoaXMuRmgrInB4Iik7cmV0dXJuIGF9fSxKTjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJue3RyYW5zZm9ybToidHJhbnNsYXRlIisodGhpcy52ZXJ0aWNhbD8iWSI6IlgiKSsiKC0iKzEwMCooKCJydGwiIT10aGlzLmVqKCl8fHRoaXMudmVydGljYWw/dGhpcy5uZDohdGhpcy5uZCk/dGhpcy51ZjoxLXRoaXMudWYpKyIlKSJ9fX19KTsKZnVuY3Rpb24gekcoYSl7YT0idCI9PT1hLnR5cGVbMF0/YS50b3VjaGVzWzBdfHxhLmNoYW5nZWRUb3VjaGVzWzBdOmE7cmV0dXJue3g6YS5jbGllbnRYLHk6YS5jbGllbnRZfX07dmFyIEJHPWZ1bmN0aW9uKCl7fTt2YXIgQ0c9Y2coe1Q6MixnOltbJy5tYXQtc2xpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtvdXRsaW5lOm5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCk6YWN0aXZlLC5tYXQtc2xpZGVyLm1hdC1zbGlkZXItc2xpZGluZzpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpe2N1cnNvcjotd2Via2l0LWdyYWJiaW5nO2N1cnNvcjpncmFiYmluZ30ubWF0LXNsaWRlci13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10cmFjay1maWxse3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybS1vcmlnaW46MCAwO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7b3ZlcmZsb3c6aGlkZGVufS5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdDtiYWNrZ3JvdW5kLWNsaXA6Y29udGVudC1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1mb2N1cy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYntjdXJzb3I6LXdlYmtpdC1ncmFiO2N1cnNvcjpncmFifS5tYXQtc2xpZGVyLXRodW1ie3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMHB4O2JvdHRvbTotMTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXI6M3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwLjcpO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm9yZGVyLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1yYWRpdXMgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7ei1pbmRleDoxO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcnt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1oYXMtdGlja3MuY2RrLWZvY3VzZWQ6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciwubWF0LXNsaWRlci1oYXMtdGlja3M6aG92ZXI6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntvcGFjaXR5OjF9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3MsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3N7b3BhY2l0eToxfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tkaXNwbGF5Om5vbmV9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5OmZsZXh9Lm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYnt0cmFuc2Zvcm06c2NhbGUoMCl9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3JkZXItcmFkaXVzOjUwJSA1MCUgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7b3BhY2l0eToxfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLW1vdXNlLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstdG91Y2gtZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLXdpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0cmFuc2Zvcm06c2NhbGUoMCk7b3BhY2l0eTowfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDo0cHg7dHJhbnNmb3JtOnNjYWxlKDAuNSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLWhvcml6b250YWx7aGVpZ2h0OjQ4cHg7bWluLXdpZHRoOjEyOHB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItd3JhcHBlcntoZWlnaHQ6MnB4O3RvcDoyM3B4O2xlZnQ6OHB4O3JpZ2h0OjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2hlaWdodDoycHg7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4O3JpZ2h0OjA7dG9wOjB9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay13cmFwcGVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjJweDt3aWR0aDoxMDAlO3RyYW5zZm9ybTpzY2FsZVgoMCl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDEpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDowO291dGxpbmU6c29saWQgMnB4O3RvcDoxcHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3toZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MDt0b3A6NTAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0b3A6LTE1cHg7cmlnaHQ6LTE1cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtyaWdodDotMTRweDt0b3A6LTQwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjZweCkgc2NhbGUoMC4wMSkgcm90YXRlKDQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGVyLXZlcnRpY2Fse3dpZHRoOjQ4cHg7bWluLWhlaWdodDoxMjhweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVye3dpZHRoOjJweDt0b3A6OHB4O2JvdHRvbTo4cHg7bGVmdDoyM3B4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3dpZHRoOjJweDtib3JkZXItdG9wLXdpZHRoOjJweDtib3R0b206MDtsZWZ0OjB9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MTAwJTt3aWR0aDoycHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgwKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoxMDAlO3dpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGVZKDEpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcnt3aWR0aDoycHg7aGVpZ2h0OjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MDtvdXRsaW5lOnNvbGlkIDJweDtsZWZ0OjFweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JvdHRvbTotMTVweDtsZWZ0Oi0xNXB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze3dpZHRoOjJweDtoZWlnaHQ6MTAwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MDtsZWZ0OjUwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JvdHRvbTotMTRweDtsZWZ0Oi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItdmVydGljYWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfVtkaXI9cnRsXSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntsZWZ0OjA7cmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9Lm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci1mb2N1cy1yaW5nLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3RyYW5zaXRpb246bm9uZX1cbiddXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBERyhhKXtyZXR1cm4gWigyLFtYKDY3MTA4ODY0MCwxLHtLRDowfSksKGEoKSgpLFcoMSwwLFtbMSwwXSxbInNsaWRlcldyYXBwZXIiLDFdXSxudWxsLDE2LCJkaXYiLFtbImNsYXNzIiwibWF0LXNsaWRlci13cmFwcGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZXItdHJhY2std3JhcHBlciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg0LDI3ODUyOCxudWxsLDAsQm8sW3osemYsWmVdLHt1aTpbMCwibmdTdHlsZSJdfSxudWxsKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtc2xpZGVyLXRyYWNrLWZpbGwiXV0sbnVsbCxudWxsLG51bGwsbnVsbCwKbnVsbCkpLEkoNiwyNzg1MjgsbnVsbCwwLEJvLFt6LHpmLFplXSx7dWk6WzAsIm5nU3R5bGUiXX0sbnVsbCksKGEoKSgpLFcoNywwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwibWF0LXNsaWRlci10aWNrcy1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg4LDI3ODUyOCxudWxsLDAsQm8sW3osemYsWmVdLHt1aTpbMCwibmdTdHlsZSJdfSxudWxsKSwoYSgpKCksVyg5LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtc2xpZGVyLXRpY2tzIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMTAsMjc4NTI4LG51bGwsMCxCbyxbeix6ZixaZV0se3VpOlswLCJuZ1N0eWxlIl19LG51bGwpLChhKCkoKSxXKDExLDAsbnVsbCxudWxsLDYsImRpdiIsW1siY2xhc3MiLCJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDEyLDI3ODUyOCxudWxsLDAsQm8sW3osemYsWmVdLHt1aTpbMCwKIm5nU3R5bGUiXX0sbnVsbCksKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm1hdC1zbGlkZXItZm9jdXMtcmluZyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNCwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwibWF0LXNsaWRlci10aHVtYiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCwyLCJkaXYiLFtbImNsYXNzIiwibWF0LXNsaWRlci10aHVtYi1sYWJlbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNiwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsIm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxNyxudWxsLFsiIiwiIl0pKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDQsMCxkLlBOKTtiKGMsNiwwLGQuUU4pO2IoYyw4LDAsZC5LTik7YihjLDEwLAowLGQuTE4pO2IoYywxMiwwLGQuSk4pfSxmdW5jdGlvbihiLGMpe2IoYywxNywwLGMuYS5xUCl9KX07dmFyIEVHPW5ldyB5KCJNYXRTbmFja0JhckRhdGEiKSxGRz1mdW5jdGlvbigpe3RoaXMuJG89ImFzc2VydGl2ZSI7dGhpcy5IbD0iIjt0aGlzLmR1cmF0aW9uPTA7dGhpcy5kYXRhPW51bGw7dGhpcy50bz0iY2VudGVyIjt0aGlzLnVJPSJib3R0b20ifTt2YXIgR0c9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5vZD0hMTt0aGlzLlM9YTt0aGlzLm09Yjt0aGlzLmNhPWM7dGhpcy55dD1kO3RoaXMuYWE9ITE7dGhpcy5Vdj1uZXcgWWg7dGhpcy5OQz1uZXcgWWg7dGhpcy5RaT0idm9pZCI7dGhpcy5ZTT0iYXNzZXJ0aXZlIiE9PWQuJG98fGQuSGw/Im9mZiI9PT1kLiRvP251bGw6InN0YXR1cyI6ImFsZXJ0In07dChHRyxRQik7R0cucHJvdG90eXBlLk1oPWZ1bmN0aW9uKGEpe3RoaXMubkEoKTt0aGlzLm1BKCk7cmV0dXJuIHRoaXMuU2QuTWgoYSl9O0dHLnByb3RvdHlwZS5OaD1mdW5jdGlvbihhKXt0aGlzLm5BKCk7dGhpcy5tQSgpO3JldHVybiB0aGlzLlNkLk5oKGEpfTsKdmFyIEhHPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5jZDtiPWIuaWI7KCJ2b2lkIj09PWImJiJ2b2lkIiE9PWN8fCJoaWRkZW4iPT09YikmJmEuS0EoKTtpZigidmlzaWJsZSI9PT1iKXt2YXIgZD1hLk5DO2EuUy5nYShmdW5jdGlvbigpe2QubmV4dCgpO2QuY29tcGxldGUoKX0pfX0sSUc9ZnVuY3Rpb24oYSl7YS5hYXx8KGEuUWk9InZpc2libGUiLGEuY2EuTGcoKSl9O0dHLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7dGhpcy5hYT0hMDt0aGlzLktBKCl9O0dHLnByb3RvdHlwZS5LQT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7JGgodGhpcy5TLlVvKS5iKGdsKCkpLnN1YnNjcmliZShmdW5jdGlvbigpe2EuVXYubmV4dCgpO2EuVXYuY29tcGxldGUoKX0pfTsKR0cucHJvdG90eXBlLm1BPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLmksYj10aGlzLnl0LnJiO2ImJihBcnJheS5pc0FycmF5KGIpP2IuZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gYS5jbGFzc0xpc3QuYWRkKGMpfSk6YS5jbGFzc0xpc3QuYWRkKGIpKTsiY2VudGVyIj09PXRoaXMueXQudG8mJmEuY2xhc3NMaXN0LmFkZCgibWF0LXNuYWNrLWJhci1jZW50ZXIiKTsidG9wIj09PXRoaXMueXQudUkmJmEuY2xhc3NMaXN0LmFkZCgibWF0LXNuYWNrLWJhci10b3AiKX07R0cucHJvdG90eXBlLm5BPWZ1bmN0aW9uKCl7aWYodGhpcy5TZC5vYygpKXRocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGF0dGFjaCBzbmFjayBiYXIgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQiKTt9O3ZhciBKRz1NYXRoLnBvdygyLDMxKS0xLEtHPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLnM9Yjt0aGlzLkltPW5ldyBZaDt0aGlzLlBpPW5ldyBZaDt0aGlzLnBsPW5ldyBZaDt0aGlzLkR1PSExO3RoaXMuY3M9YTskaCh0aGlzLnBsKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gYy5UbCgpfSk7YS5Vdi5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gYy5MSygpfSl9O2g9S0cucHJvdG90eXBlO2guVGw9ZnVuY3Rpb24oKXtpZighdGhpcy5JbS5jbG9zZWQpe3ZhciBhPXRoaXMuY3M7YS5RaT0iaGlkZGVuIjthLm0uaS5zZXRBdHRyaWJ1dGUoIm1hdC1leGl0IiwiIil9Y2xlYXJUaW1lb3V0KHRoaXMuQkspfTtoLnpLPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5CSz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIGIuVGwoKX0sTWF0aC5taW4oYSxKRykpfTtoLmRTPWZ1bmN0aW9uKCl7dGhpcy5QaS5jbG9zZWR8fCh0aGlzLlBpLm5leHQoKSx0aGlzLlBpLmNvbXBsZXRlKCkpfTsKaC5MSz1mdW5jdGlvbigpe3RoaXMucy4kYigpO3RoaXMucGwuY2xvc2VkfHx0aGlzLnBsLmNvbXBsZXRlKCk7dGhpcy5JbS5uZXh0KHtxUzp0aGlzLkR1fSk7dGhpcy5JbS5jb21wbGV0ZSgpO3RoaXMuRHU9ITF9O2guTm49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jcy5OQ307dmFyIExHPWZ1bmN0aW9uKGEsYil7dGhpcy5TSD1hO3RoaXMuZGF0YT1ifTtMRy5wcm90b3R5cGUuYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5TSDthLnBsLmNsb3NlZHx8KGEuRHU9ITAsYS5wbC5uZXh0KCksYS5wbC5jb21wbGV0ZSgpKX07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhMRy5wcm90b3R5cGUse1ZQOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuZGF0YS5hY3Rpb259fX0pO3ZhciBNRz1mdW5jdGlvbigpe307dmFyIE9HPW5ldyB5KCJtYXQtc25hY2stYmFyLWRlZmF1bHQtb3B0aW9ucyIse1k6InJvb3QiLFY6Tkd9KTtmdW5jdGlvbiBORygpe3JldHVybiBuZXcgRkd9dmFyIFBHPWZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLnRkPWE7dGhpcy56Qz1iO3RoaXMuVWM9Yzt0aGlzLmt1PWQ7dGhpcy5hdz1lO3RoaXMuUkE9Zjt0aGlzLndyPW51bGx9O2g9UEcucHJvdG90eXBlO2gub3Blbj1mdW5jdGlvbihhLGIsYyl7Yj12b2lkIDA9PT1iPyIiOmI7dmFyIGQ9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuUkEpLGMpO2QuZGF0YT17bWVzc2FnZTphLGFjdGlvbjpifTtkLkhsfHwoZC5IbD1hKTtyZXR1cm4gdGhpcy5qSihMRyxkKX07aC5UbD1mdW5jdGlvbigpe3RoaXMuZGYmJnRoaXMuZGYuVGwoKX07aC5YPWZ1bmN0aW9uKCl7dGhpcy53ciYmdGhpcy53ci5UbCgpfTsKaC5vSj1mdW5jdGlvbihhLGIpe2E9YS5jYihuZXcgT0IoR0csYi5rYyxuZXcgVUIoYiYmYi5rYyYmYi5rYy5afHx0aGlzLlVjLG5ldyBXZWFrTWFwKFtbRkcsYl1dKSkpKTthLmluc3RhbmNlLnl0PWI7cmV0dXJuIGEuaW5zdGFuY2V9OwpoLmpKPWZ1bmN0aW9uKGEsYil7Yj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuZXcgRkcpLHRoaXMuUkEpLGIpO3ZhciBjPXRoaXMub2coYiksZD10aGlzLm9KKGMsYiksZT1uZXcgS0coZCxjKTtpZihhIGluc3RhbmNlb2YgRGYpZS5pbnN0YW5jZT1kLk5oKG5ldyBQQihhLG51bGwse1A6Yi5kYXRhLFNIOmV9KSk7ZWxzZXt2YXIgZj10aGlzLnh1KGIsZSk7YT1kLk1oKG5ldyBPQihhLHZvaWQgMCxmKSk7ZS5pbnN0YW5jZT1hLmluc3RhbmNlfXRoaXMua3Uub2JzZXJ2ZSgiKG1heC13aWR0aDogNTk5Ljk5cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSIpLmIoUmwoJGgoYy5uaCkpKS5zdWJzY3JpYmUoZnVuY3Rpb24oZyl7dmFyIGw9Yy56aS5jbGFzc0xpc3Q7Zy5tYXRjaGVzP2wuYWRkKCJtYXQtc25hY2stYmFyLWhhbmRzZXQiKTpsLnJlbW92ZSgibWF0LXNuYWNrLWJhci1oYW5kc2V0Iil9KTt0aGlzLlpJKGUsYik7cmV0dXJuIHRoaXMuZGY9CmV9O2guWkk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzOyRoKGEuSW0pLnN1YnNjcmliZShmdW5jdGlvbigpe2MuZGY9PWEmJihjLmRmPW51bGwpO2IuSGwmJmMuekMuY2xlYXIoKX0pO3RoaXMuZGY/KCRoKHRoaXMuZGYuSW0pLnN1YnNjcmliZShmdW5jdGlvbigpe0lHKGEuY3MpfSksdGhpcy5kZi5UbCgpKTpJRyhhLmNzKTtiLmR1cmF0aW9uJiYwPGIuZHVyYXRpb24mJmEuTm4oKS5zdWJzY3JpYmUoZnVuY3Rpb24oKXtyZXR1cm4gYS56SyhiLmR1cmF0aW9uKX0pO2IuSGwmJnRoaXMuekMuTEUoYi5IbCxiLiRvKX07Cmgub2c9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IHBCO2IuZGlyZWN0aW9uPWEuZGlyZWN0aW9uO3ZhciBjPXRoaXMudGQucG9zaXRpb24oKS5nbG9iYWwoKSxkPSJydGwiPT09YS5kaXJlY3Rpb247ZD0ibGVmdCI9PT1hLnRvfHwic3RhcnQiPT09YS50byYmIWR8fCJlbmQiPT09YS50byYmZDt2YXIgZT0hZCYmImNlbnRlciIhPT1hLnRvO2Q/Yy5sZWZ0KCIwIik6ZT9jLnJpZ2h0KCIwIik6KGMubGVmdCgiIiksYy51aD0iY2VudGVyIik7InRvcCI9PT1hLnVJP2MudG9wKCIwIik6Yy5ib3R0b20oIjAiKTtiLk1lPWM7cmV0dXJuIHRoaXMudGQuY3JlYXRlKGIpfTtoLnh1PWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBVQihhJiZhLmtjJiZhLmtjLlp8fHRoaXMuVWMsbmV3IFdlYWtNYXAoW1tLRyxiXSxbRUcsYS5kYXRhXV0pKX07CmsuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUEcucHJvdG90eXBlLHtkZjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hdztyZXR1cm4gYT9hLmRmOnRoaXMud3J9LHNldDpmdW5jdGlvbihhKXt0aGlzLmF3P3RoaXMuYXcuZGY9YTp0aGlzLndyPWF9fX0pO1BHLmhhPVRjKHtWOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQRyhtZChXQiksbWQoaUEpLG1kKGdkKSxtZChUQSksbWQoUEcsMTIpLG1kKE9HKSl9LEw6UEcsWTpNR30pO3ZhciBRRz1jZyh7VDoyLGc6W1siLm1hdC1zaW1wbGUtc25hY2tiYXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtsaW5lLWhlaWdodDoyMHB4O29wYWNpdHk6MX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257ZmxleC1zaHJpbms6MDttYXJnaW46LThweCAtOHB4IC04cHggOHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiBidXR0b257bWF4LWhlaWdodDozNnB4O21pbi13aWR0aDowfVtkaXI9cnRsXSAubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6OHB4fVxuIl1dLGRhdGE6e319KTsKZnVuY3Rpb24gUkcoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwibWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwyLCJidXR0b24iLFtbImNsYXNzIiwibWF0LWZvY3VzLWluZGljYXRvciJdLFsibWF0LWJ1dHRvbiIsIiJdXSxbWzEsImRpc2FibGVkIiwwXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxbW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNsaWNrIj09PWMmJihkPSExIT09ZS5hY3Rpb24oKSYmZCk7cmV0dXJuIGR9LFVDLFRDKSksSSgyLDQzNzQ1MjgsbnVsbCwwLFJDLFt6LFJ6LFsyLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksWSgzLDAsWyIiLCIiXSkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9RihjLDIpLmRpc2FibGVkfHxudWxsLGY9Ik5vb3BBbmltYXRpb25zIj09PQpGKGMsMikuaWE7YihjLDEsMCxlLGYpO2IoYywzLDAsZC5kYXRhLmFjdGlvbil9KX1mdW5jdGlvbiBTRyhhKXtyZXR1cm4gWigyLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInNwYW4iLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDEsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxSRykpLEkoMywxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDMsMCxjLmEuVlApfSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5hLmRhdGEubWVzc2FnZSl9KX0KdmFyIFRHPVFnKCJzaW1wbGUtc25hY2stYmFyIixMRyxmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInNpbXBsZS1zbmFjay1iYXIiLFtbImNsYXNzIiwibWF0LXNpbXBsZS1zbmFja2JhciJdXSxudWxsLG51bGwsbnVsbCxTRyxRRykpLEkoMSw0OTE1MixudWxsLDAsTEcsW0tHLEVHXSxudWxsLG51bGwpXSxudWxsLG51bGwpfSk7dmFyIFVHPWNnKHtUOjIsZzpbWyIubWF0LXNuYWNrLWJhci1jb250YWluZXJ7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjI0cHg7bWF4LXdpZHRoOjMzdnc7bWluLXdpZHRoOjM0NHB4O3BhZGRpbmc6MTRweCAxNnB4O21pbi1oZWlnaHQ6NDhweDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXI6c29saWQgMXB4fS5tYXQtc25hY2stYmFyLWhhbmRzZXR7d2lkdGg6MTAwJX0ubWF0LXNuYWNrLWJhci1oYW5kc2V0IC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcnttYXJnaW46OHB4O21heC13aWR0aDoxMDAlO21pbi13aWR0aDowO3dpZHRoOjEwMCV9XG4iXV0sZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6InN0YXRlIixqZjpbe3R5cGU6MCxuYW1lOiJ2b2lkLCBoaWRkZW4iLGc6e3R5cGU6NixnOnt0cmFuc2Zvcm06InNjYWxlKDAuOCkiLApvcGFjaXR5OjB9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MCxuYW1lOiJ2aXNpYmxlIixnOnt0eXBlOjYsZzp7dHJhbnNmb3JtOiJzY2FsZSgxKSIsb3BhY2l0eToxfSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6IiogPT4gdmlzaWJsZSIsYW5pbWF0aW9uOnt0eXBlOjQsZzpudWxsLGtiOiIxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSJ9LG9wdGlvbnM6bnVsbH0se3R5cGU6MSx6YzoiKiA9PiB2b2lkLCAqID0+IGhpZGRlbiIsYW5pbWF0aW9uOnt0eXBlOjQsZzp7dHlwZTo2LGc6e29wYWNpdHk6MH0sb2Zmc2V0Om51bGx9LGtiOiI3NW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSkifSxvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7ZnVuY3Rpb24gVkcoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMCxudWxsLG51bGwsMCkpXSxudWxsLG51bGwpfQpmdW5jdGlvbiBXRyhhKXtyZXR1cm4gWigwLFtYKDQwMjY1MzE4NCwxLHtTZDowfSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxWRykpLEkoMiwyMTI5OTIsW1sxLDRdXSwwLFNCLFtVZSxFZixMb10se2N6OlswLCJwb3J0YWwiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDIsMCwiIil9LG51bGwpfQp2YXIgWEc9UWcoInNuYWNrLWJhci1jb250YWluZXIiLEdHLGZ1bmN0aW9uKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwic25hY2stYmFyLWNvbnRhaW5lciIsW1siY2xhc3MiLCJtYXQtc25hY2stYmFyLWNvbnRhaW5lciJdXSxbWzEsInJvbGUiLDBdLFs0MCwiQHN0YXRlIiwwXV0sW1siY29tcG9uZW50IiwiQHN0YXRlLmRvbmUiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwOyJjb21wb25lbnQ6QHN0YXRlLmRvbmUiPT09YyYmKGU9ITEhPT1IRyhGKGIsMSksZCkmJmUpO3JldHVybiBlfSxXRyxVRykpLEkoMSwxODAyMjQsbnVsbCwwLEdHLFtULHosbmUsRkddLG51bGwsbnVsbCldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD1GKGMsMSkuWU0sZT1GKGMsMSkuUWk7YihjLDAsMCxkLGUpfSl9KTt2YXIgWUc9R3ooe3Bhc3NpdmU6ITB9KTtmdW5jdGlvbiBaRyhhKXtyZXR1cm4gRXJyb3IoJ1Rvb2x0aXAgcG9zaXRpb24gIicrYSsnIiBpcyBpbnZhbGlkLicpfXZhciAkRz1uZXcgeSgibWF0LXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5Iik7ZnVuY3Rpb24gYUgoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEubHAubHQoe2VSOjIwfSl9fXZhciBjSD1uZXcgeSgibWF0LXRvb2x0aXAtZGVmYXVsdC1vcHRpb25zIix7WToicm9vdCIsVjpiSH0pO2Z1bmN0aW9uIGJIKCl7cmV0dXJue3Z6OjAsbHk6MCx6UjoxNTAwfX0KdmFyIGRIPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsbCxtLHAscSl7dmFyIHI9dGhpczt0aGlzLnRkPWE7dGhpcy5tPWI7dGhpcy5EaD1jO3RoaXMuemI9ZDt0aGlzLlM9ZTt0aGlzLmVhPWY7dGhpcy5ldT1nO3RoaXMudmE9bDt0aGlzLkdhPXA7dGhpcy5sZD1xO3RoaXMubWM9ImJlbG93Ijt0aGlzLk9hPSExO3RoaXMudno9dGhpcy5sZC52ejt0aGlzLmx5PXRoaXMubGQubHk7dGhpcy5BcD0iYXV0byI7dGhpcy5VcT0iIjt0aGlzLnZuPW5ldyBNYXA7dGhpcy5hYT1uZXcgWWg7dGhpcy5IYT1mdW5jdGlvbih2KXtyLk1xKCkmJjI3PT09di5rZXlDb2RlJiYhc0EodikmJih2LnByZXZlbnREZWZhdWx0KCksdi5zdG9wUHJvcGFnYXRpb24oKSxyLlMuZ2EoZnVuY3Rpb24oKXtyZXR1cm4gci5sZigwKX0pKX07dGhpcy52ZD1tO3EmJihxLnBvc2l0aW9uJiYodGhpcy5wb3NpdGlvbj1xLnBvc2l0aW9uKSxxLkFwJiYodGhpcy5BcD1xLkFwKSk7ZS5vYShmdW5jdGlvbigpe2IuaS5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwKci5IYSl9KX07aD1kSC5wcm90b3R5cGU7aC5MYz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy51TigpO3RoaXMudmEuVWcodGhpcy5tKS5iKFJsKHRoaXMuYWEpKS5zdWJzY3JpYmUoZnVuY3Rpb24oYil7Yj8ia2V5Ym9hcmQiPT09YiYmYS5TLmdhKGZ1bmN0aW9uKCl7cmV0dXJuIGEuc2hvdygpfSk6YS5TLmdhKGZ1bmN0aW9uKCl7cmV0dXJuIGEubGYoMCl9KX0pfTtoLlg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uaTtjbGVhclRpbWVvdXQodGhpcy5Zdyk7dGhpcy5zJiYodGhpcy5zLiRiKCksdGhpcy55Yj1udWxsKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuSGEpO3RoaXMudm4uZm9yRWFjaChmdW5jdGlvbihiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihjLGIsWUcpfSk7dGhpcy52bi5jbGVhcigpO3RoaXMuYWEubmV4dCgpO3RoaXMuYWEuY29tcGxldGUoKTtyQSh0aGlzLmV1LGEsdGhpcy5tZXNzYWdlKTt0aGlzLnZhLnlmKGEpfTsKaC5zaG93PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT12b2lkIDA9PT1hP3RoaXMudno6YTtpZighdGhpcy5kaXNhYmxlZCYmdGhpcy5tZXNzYWdlJiYoIXRoaXMuTXEoKXx8dGhpcy55Yi5Cbnx8dGhpcy55Yi4kbSkpe3ZhciBjPXRoaXMub2coKTt0aGlzLnJnKCk7dGhpcy52Zz10aGlzLnZnfHxuZXcgT0IoZUgsdGhpcy56Yik7dGhpcy55Yj1jLmNiKHRoaXMudmcpLmluc3RhbmNlOyRoKHRoaXMueWIuVnYpLmIoUmwodGhpcy5hYSkpLnN1YnNjcmliZShmdW5jdGlvbigpe3JldHVybiBiLnJnKCl9KTt0aGlzLkhEKHRoaXMuVncpO3RoaXMubUUoKTt0aGlzLnliLnNob3coYSl9fTtoLmxmPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT90aGlzLmx5OmE7dGhpcy55YiYmdGhpcy55Yi5sZihhKX07aC50b2dnbGU9ZnVuY3Rpb24oKXt0aGlzLk1xKCk/dGhpcy5sZigpOnRoaXMuc2hvdygpfTtoLk1xPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLnliJiZ0aGlzLnliLmlzVmlzaWJsZSgpfTsKaC5vZz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYodGhpcy5zKXJldHVybiB0aGlzLnM7dmFyIGI9WEEodGhpcy5EaCx0aGlzLm0pO2I9QUIoQ0IoREIoSEIoTEIodGhpcy50ZC5wb3NpdGlvbigpLHRoaXMubSksIi5tYXQtdG9vbHRpcCIpLCExKSw4KSxiKTtiLmR6LmIoUmwodGhpcy5hYSkpLnN1YnNjcmliZShmdW5jdGlvbihjKXthLnliJiZjLmZSLmxRJiZhLnliLmlzVmlzaWJsZSgpJiZhLlMuZ2EoZnVuY3Rpb24oKXtyZXR1cm4gYS5sZigwKX0pfSk7dGhpcy5zPXRoaXMudGQuY3JlYXRlKHtkaXJlY3Rpb246dGhpcy5HYSxNZTpiLHJiOiJtYXQtdG9vbHRpcC1wYW5lbCIsZWc6dGhpcy52ZCgpfSk7dGhpcy5rRSgpOyRoKHRoaXMucy5uaCkuYihSbCh0aGlzLmFhKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7cmV0dXJuIGEucmcoKX0pO3JldHVybiB0aGlzLnN9O2gucmc9ZnVuY3Rpb24oKXt0aGlzLnMmJnRoaXMucy5vYygpJiZ0aGlzLnMuZGV0YWNoKCk7dGhpcy55Yj1udWxsfTsKaC5rRT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucy5XLk1lLGI9dGhpcy5aSygpLGM9dGhpcy5hTCgpO0JCKGEsW09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxiLkN5KSxjLkN5KSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYi5heSksYy5heSldKX07CmguWks9ZnVuY3Rpb24oKXt2YXIgYT0hdGhpcy5HYXx8Imx0ciI9PXRoaXMuR2EudmFsdWUsYj10aGlzLnBvc2l0aW9uO2lmKCJhYm92ZSI9PWJ8fCJiZWxvdyI9PWIpYT17aGM6ImNlbnRlciIsaWM6ImFib3ZlIj09Yj8idG9wIjoiYm90dG9tIn07ZWxzZSBpZigiYmVmb3JlIj09Ynx8ImxlZnQiPT1iJiZhfHwicmlnaHQiPT1iJiYhYSlhPXtoYzoic3RhcnQiLGljOiJjZW50ZXIifTtlbHNlIGlmKCJhZnRlciI9PWJ8fCJyaWdodCI9PWImJmF8fCJsZWZ0Ij09YiYmIWEpYT17aGM6ImVuZCIsaWM6ImNlbnRlciJ9O2Vsc2UgdGhyb3cgWkcoYik7Yj10aGlzLmxDKGEuaGMsYS5pYyk7cmV0dXJue0N5OmEsYXk6e2hjOmIueCxpYzpiLnl9fX07CmguYUw9ZnVuY3Rpb24oKXt2YXIgYT0hdGhpcy5HYXx8Imx0ciI9PXRoaXMuR2EudmFsdWUsYj10aGlzLnBvc2l0aW9uO2lmKCJhYm92ZSI9PWIpYT17QWE6ImNlbnRlciIsWGE6ImJvdHRvbSJ9O2Vsc2UgaWYoImJlbG93Ij09YilhPXtBYToiY2VudGVyIixYYToidG9wIn07ZWxzZSBpZigiYmVmb3JlIj09Ynx8ImxlZnQiPT1iJiZhfHwicmlnaHQiPT1iJiYhYSlhPXtBYToiZW5kIixYYToiY2VudGVyIn07ZWxzZSBpZigiYWZ0ZXIiPT1ifHwicmlnaHQiPT1iJiZhfHwibGVmdCI9PWImJiFhKWE9e0FhOiJzdGFydCIsWGE6ImNlbnRlciJ9O2Vsc2UgdGhyb3cgWkcoYik7Yj10aGlzLmxDKGEuQWEsYS5YYSk7cmV0dXJue0N5OmEsYXk6e0FhOmIueCxYYTpiLnl9fX07CmgubUU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMueWImJih0aGlzLnliLm1lc3NhZ2U9dGhpcy5tZXNzYWdlLHRoaXMueWIubGooKSwkaCh0aGlzLlMuVW8pLmIoZ2woKSxSbCh0aGlzLmFhKSkuc3Vic2NyaWJlKGZ1bmN0aW9uKCl7YS55YiYmYS5zLmpnKCl9KSl9O2guSEQ9ZnVuY3Rpb24oYSl7dGhpcy55YiYmKHRoaXMueWIuakk9YSx0aGlzLnliLmxqKCkpfTtoLmxDPWZ1bmN0aW9uKGEsYil7ImFib3ZlIj09PXRoaXMucG9zaXRpb258fCJiZWxvdyI9PT10aGlzLnBvc2l0aW9uPyJ0b3AiPT09Yj9iPSJib3R0b20iOiJib3R0b20iPT09YiYmKGI9InRvcCIpOiJlbmQiPT09YT9hPSJzdGFydCI6InN0YXJ0Ij09PWEmJihhPSJlbmQiKTtyZXR1cm57eDphLHk6Yn19OwpoLnVOPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztpZighdGhpcy5lYS5WdCYmIXRoaXMuZWEuSkkpdGhpcy52bi5zZXQoIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuc2hvdygpfSkuc2V0KCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe3JldHVybiBhLmxmKCl9KTtlbHNlIGlmKCJvZmYiIT09dGhpcy5BcCl7dGhpcy55SygpO3ZhciBiPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGEuWXcpO2EubGYoYS5sZC56Uil9O3RoaXMudm4uc2V0KCJ0b3VjaGVuZCIsYikuc2V0KCJ0b3VjaGNhbmNlbCIsYikuc2V0KCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe2NsZWFyVGltZW91dChhLll3KTthLll3PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gYS5zaG93KCl9LDUwMCl9KX10aGlzLnZuLmZvckVhY2goZnVuY3Rpb24oYyxkKXthLm0uaS5hZGRFdmVudExpc3RlbmVyKGQsYyxZRyl9KX07CmgueUs9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm0uaSxiPWEuc3R5bGUsYz10aGlzLkFwO2lmKCJvZmYiIT09Yyl7aWYoIm9uIj09PWN8fCJJTlBVVCIhPT1hLm5vZGVOYW1lJiYiVEVYVEFSRUEiIT09YS5ub2RlTmFtZSliLnVzZXJTZWxlY3Q9Yi5tc1VzZXJTZWxlY3Q9Yi53ZWJraXRVc2VyU2VsZWN0PWIuTW96VXNlclNlbGVjdD0ibm9uZSI7Im9uIiE9PWMmJmEuZHJhZ2dhYmxlfHwoYi53ZWJraXRVc2VyRHJhZz0ibm9uZSIpO2IudG91Y2hBY3Rpb249Im5vbmUiO2Iud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InRyYW5zcGFyZW50In19OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRILnByb3RvdHlwZSx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1jfSxzZXQ6ZnVuY3Rpb24oYSl7YSE9PXRoaXMubWMmJih0aGlzLm1jPWEsdGhpcy5zJiYodGhpcy5rRSgpLHRoaXMueWImJnRoaXMueWIuc2hvdygwKSx0aGlzLnMuamcoKSkpfX0sZGlzYWJsZWQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hfSxzZXQ6ZnVuY3Rpb24oYSl7KHRoaXMuT2E9dHooYSkpJiZ0aGlzLmxmKDApfX0sbWVzc2FnZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVXF9LHNldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzO3JBKHRoaXMuZXUsdGhpcy5tLmksdGhpcy5VcSk7dGhpcy5VcT1udWxsIT1hPygiIithKS50cmltKCk6IiI7IXRoaXMuVXEmJnRoaXMuTXEoKT8KdGhpcy5sZigwKToodGhpcy5tRSgpLHRoaXMuUy5vYShmdW5jdGlvbigpe1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt2YXIgYz1iLmV1LGQ9Yi5tLmksZT1iLm1lc3NhZ2U7Yy5HSihkLGUpJiYoInN0cmluZyIhPT10eXBlb2YgZT8oYy5GRChlKSxvQS5zZXQoZSx7Tm86ZSxpdDowfSkpOm9BLmhhcyhlKXx8Yy5lSyhlKSxjLnJDKGQsZSl8fGMuVEkoZCxlKSl9KX0pKX19LGpJOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Wd30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuVnc9YTt0aGlzLnliJiZ0aGlzLkhEKHRoaXMuVncpfX19KTt2YXIgZUg9ZnVuY3Rpb24oYSxiKXt0aGlzLmNhPWE7dGhpcy5rdT1iO3RoaXMuS249ImluaXRpYWwiO3RoaXMuanE9ITE7dGhpcy5Wdj1uZXcgWWg7dGhpcy5FTD10aGlzLmt1Lm9ic2VydmUoIihtYXgtd2lkdGg6IDU5OS45OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCksIChtYXgtd2lkdGg6IDk1OS45OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIil9OwpoPWVILnByb3RvdHlwZTtoLnNob3c9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLiRtJiYoY2xlYXJUaW1lb3V0KHRoaXMuJG0pLHRoaXMuJG09bnVsbCk7dGhpcy5qcT0hMDt0aGlzLkJuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtiLktuPSJ2aXNpYmxlIjtiLkJuPW51bGw7Yi5saigpfSxhKX07aC5sZj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuQm4mJihjbGVhclRpbWVvdXQodGhpcy5CbiksdGhpcy5Cbj1udWxsKTt0aGlzLiRtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtiLktuPSJoaWRkZW4iO2IuJG09bnVsbDtiLmxqKCl9LGEpfTtoLmlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiJ2aXNpYmxlIj09PXRoaXMuS259O2guWD1mdW5jdGlvbigpe3RoaXMuVnYuY29tcGxldGUoKX07aC5hSj1mdW5jdGlvbigpe3RoaXMuanE9ITF9OwpoLkptPWZ1bmN0aW9uKGEpe2E9YS5pYjsiaGlkZGVuIiE9PWF8fHRoaXMuaXNWaXNpYmxlKCl8fHRoaXMuVnYubmV4dCgpO2lmKCJ2aXNpYmxlIj09PWF8fCJoaWRkZW4iPT09YSl0aGlzLmpxPSEwfTtoLmlMPWZ1bmN0aW9uKCl7dGhpcy5qcSYmdGhpcy5sZigwKX07aC5saj1mdW5jdGlvbigpe1lnKHRoaXMuY2EpfTt2YXIgZkg9ZnVuY3Rpb24oKXt9O3ZhciBnSD1jZyh7VDoyLGc6W1siLm1hdC10b29sdGlwLXBhbmVse3BvaW50ZXItZXZlbnRzOm5vbmUgIWltcG9ydGFudH0ubWF0LXRvb2x0aXB7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjRweDttYXJnaW46MTRweDttYXgtd2lkdGg6MjUwcHg7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjhweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdG9vbHRpcHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXRvb2x0aXAtaGFuZHNldHttYXJnaW46MjRweDtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9XG4iXV0sZGF0YTp7YW5pbWF0aW9uOlt7dHlwZTo3LG5hbWU6InN0YXRlIixqZjpbe3R5cGU6MCxuYW1lOiJpbml0aWFsLCB2b2lkLCBoaWRkZW4iLGc6e3R5cGU6NixnOntvcGFjaXR5OjAsdHJhbnNmb3JtOiJzY2FsZSgwKSJ9LG9mZnNldDpudWxsfSxvcHRpb25zOnZvaWQgMH0se3R5cGU6MCwKbmFtZToidmlzaWJsZSIsZzp7dHlwZTo2LGc6e3RyYW5zZm9ybToic2NhbGUoMSkifSxvZmZzZXQ6bnVsbH0sb3B0aW9uczp2b2lkIDB9LHt0eXBlOjEsemM6IiogPT4gdmlzaWJsZSIsYW5pbWF0aW9uOnt0eXBlOjQsZzp7dHlwZTo1LGplOlt7dHlwZTo2LGc6e29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlKDApIixvZmZzZXQ6MH0sb2Zmc2V0Om51bGx9LHt0eXBlOjYsZzp7b3BhY2l0eTouNSx0cmFuc2Zvcm06InNjYWxlKDAuOTkpIixvZmZzZXQ6LjV9LG9mZnNldDpudWxsfSx7dHlwZTo2LGc6e29wYWNpdHk6MSx0cmFuc2Zvcm06InNjYWxlKDEpIixvZmZzZXQ6MX0sb2Zmc2V0Om51bGx9XX0sa2I6IjIwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIn0sb3B0aW9uczpudWxsfSx7dHlwZToxLHpjOiIqID0+IGhpZGRlbiIsYW5pbWF0aW9uOnt0eXBlOjQsZzp7dHlwZTo2LGc6e29wYWNpdHk6MH0sb2Zmc2V0Om51bGx9LGtiOiIxMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSJ9LApvcHRpb25zOm51bGx9XSxvcHRpb25zOnt9fV19fSk7CmZ1bmN0aW9uIGhIKGEpe3JldHVybiBaKDIsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMywiZGl2IixbWyJjbGFzcyIsIm1hdC10b29sdGlwIl1dLFtbMiwibWF0LXRvb2x0aXAtaGFuZHNldCIsbnVsbF0sWzI0LCJAc3RhdGUiLDBdXSxbW251bGwsIkBzdGF0ZS5zdGFydCJdLFtudWxsLCJAc3RhdGUuZG9uZSJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7IkBzdGF0ZS5zdGFydCI9PT1jJiYoZT0hMSE9PWYuYUooKSYmZSk7IkBzdGF0ZS5kb25lIj09PWMmJihlPSExIT09Zi5KbShkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMSwyNzg1MjgsbnVsbCwwLHBvLFt5Zix6Zix6LFplXSx7d3k6WzAsImtsYXNzIl0samk6WzEsIm5nQ2xhc3MiXX0sbnVsbCksbGgoMTMxMDcyLElvLFtuZV0pLChhKCkoKSxZKDMsbnVsbCxbIiIsIiJdKSldLGZ1bmN0aW9uKGIsYyl7YihjLDEsMCwibWF0LXRvb2x0aXAiLGMuYS5qSSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9bnVsbCwKZj1udWxsPT0oZT1iZyhjLDAsRihjLDIpLnRyYW5zZm9ybShkLkVMKSkpP251bGw6ZS5tYXRjaGVzO2IoYywwLDAsZixkLktuKTtiKGMsMywwLGQubWVzc2FnZSl9KX12YXIgaUg9UWcoIm1hdC10b29sdGlwLWNvbXBvbmVudCIsZUgsZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJtYXQtdG9vbHRpcC1jb21wb25lbnQiLFtbImFyaWEtaGlkZGVuIiwidHJ1ZSJdXSxbWzQsInpvb20iLG51bGxdXSxbWyJib2R5IiwiY2xpY2siXV0sZnVuY3Rpb24oYixjKXt2YXIgZD0hMDsiYm9keTpjbGljayI9PT1jJiYoZD0hMSE9PUYoYiwxKS5pTCgpJiZkKTtyZXR1cm4gZH0saEgsZ0gpKSxJKDEsMTgwMjI0LG51bGwsMCxlSCxbbmUsVEFdLG51bGwsbnVsbCldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD0idmlzaWJsZSI9PT1GKGMsMSkuS24/MTpudWxsO2IoYywwLDAsZCl9KX0pOy8qCgogKFRoZSBNSVQgTGljZW5zZSkKCiBDb3B5cmlnaHQgKGMpIDIwMTcgQnJhbmRvbiBSb2JlcnRzLCBNaWtlIFJ5YW4sIFZpY3RvciBTYXZraW4sIFJvYiBXb3JtYWxkCgogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKi8KZnVuY3Rpb24gakgoYSl7dmFyIGI9e2hKOiJwcm9wcyIsZlM6dm9pZCAwfTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIpcmV0dXJuIGtIKGEsZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZS0wXT1hcmd1bWVudHNbZV07cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxiLmFwcGx5KG51bGwsamEoZCkpKSx7dHlwZTphfSl9KTtzd2l0Y2goYj9iLmhKOiJlbXB0eSIpe2Nhc2UgImVtcHR5IjpyZXR1cm4ga0goYSxmdW5jdGlvbigpe3JldHVybnt0eXBlOmF9fSk7Y2FzZSAicHJvcHMiOnJldHVybiBrSChhLGZ1bmN0aW9uKGMpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse3R5cGU6YX0pfSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBjb25maWcuIik7fX0KZnVuY3Rpb24ga0goYSxiKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInR5cGUiLHt2YWx1ZTphLHdyaXRhYmxlOiExfSl9O3ZhciBsSD1mdW5jdGlvbigpe2FpLmNhbGwodGhpcyx7dHlwZToiQG5ncngvc3RvcmUvaW5pdCJ9KX07dChsSCxhaSk7bEguY3JlYXRlPWFpLmNyZWF0ZTsKbEgucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIlxuICAgICAgICBEaXNwYXRjaCBleHBlY3RlZCBhbiBvYmplY3QsIGluc3RlYWQgaXQgcmVjZWl2ZWQgYSBmdW5jdGlvbi5cbiAgICAgICAgSWYgeW91J3JlIHVzaW5nIHRoZSBjcmVhdGVBY3Rpb24gZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uXG4gICAgICAgIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYWN0aW9uLiBGb3IgZXhhbXBsZSwgc29tZUFjdGlvbiBzaG91bGQgYmUgc29tZUFjdGlvbigpLiIpO2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQWN0aW9ucyBtdXN0IGJlIG9iamVjdHMiKTtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBhLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQWN0aW9ucyBtdXN0IGhhdmUgYSB0eXBlIHByb3BlcnR5Iik7YWkucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLAphKX07bEgucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7fTtsSC5wcm90b3R5cGUuWD1mdW5jdGlvbigpe2FpLnByb3RvdHlwZS5jb21wbGV0ZS5jYWxsKHRoaXMpfTtmdW5jdGlvbiBtSChhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTtjPWIucG9wKCk7Yj1iLnJlZHVjZShmdW5jdGlvbihkLGUpe3JldHVybltdLmNvbmNhdChqYShkKSxbZS50eXBlXSl9LFtdKTtyZXR1cm57dEg6Yyx0eXBlczpifX07dmFyIG5IPW5ldyB5KCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBSb290IEd1YXJkIiksb0g9bmV3IHkoIkBuZ3J4L3N0b3JlIEludGVybmFsIEluaXRpYWwgU3RhdGUiKSxwSD1uZXcgeSgiQG5ncngvc3RvcmUgSW5pdGlhbCBTdGF0ZSIpLHFIPW5ldyB5KCJAbmdyeC9zdG9yZSBSZWR1Y2VyIEZhY3RvcnkiKSxySD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgUmVkdWNlciBGYWN0b3J5IFByb3ZpZGVyIiksc0g9bmV3IHkoIkBuZ3J4L3N0b3JlIEluaXRpYWwgUmVkdWNlcnMiKSx0SD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgSW5pdGlhbCBSZWR1Y2VycyIpLHVIPW5ldyB5KCJAbmdyeC9zdG9yZSBTdG9yZSBGZWF0dXJlcyIpLHZIPW5ldyB5KCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBTdG9yZSBSZWR1Y2VycyIpLHdIPW5ldyB5KCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIikseEg9bmV3IHkoIkBuZ3J4L3N0b3JlIEludGVybmFsIEZlYXR1cmUgQ29uZmlncyIpLAp5SD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgU3RvcmUgRmVhdHVyZXMiKSx6SD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgRmVhdHVyZSBSZWR1Y2VycyBUb2tlbiIpLEFIPW5ldyB5KCJAbmdyeC9zdG9yZSBGZWF0dXJlIFJlZHVjZXJzIiksQkg9bmV3IHkoIkBuZ3J4L3N0b3JlIFVzZXIgUHJvdmlkZWQgTWV0YSBSZWR1Y2VycyIpLENIPW5ldyB5KCJAbmdyeC9zdG9yZSBNZXRhIFJlZHVjZXJzIiksREg9bmV3IHkoIkBuZ3J4L3N0b3JlIEludGVybmFsIFJlc29sdmVkIE1ldGEgUmVkdWNlcnMiKSxFSD1uZXcgeSgiQG5ncngvc3RvcmUgVXNlciBSdW50aW1lIENoZWNrcyBDb25maWciKSxGSD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgVXNlciBSdW50aW1lIENoZWNrcyBDb25maWciKSxHSD1uZXcgeSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgUnVudGltZSBDaGVja3MiKTtmdW5jdGlvbiBISChhLGIpe2I9dm9pZCAwPT09Yj97fTpiO2Zvcih2YXIgYz1PYmplY3Qua2V5cyhhKSxkPXt9LGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTsiZnVuY3Rpb24iPT09dHlwZW9mIGFbZl0mJihkW2ZdPWFbZl0pfXZhciBnPU9iamVjdC5rZXlzKGQpO3JldHVybiBmdW5jdGlvbihsLG0pe2w9dm9pZCAwPT09bD9iOmw7Zm9yKHZhciBwPSExLHE9e30scj0wO3I8Zy5sZW5ndGg7cisrKXt2YXIgdj1nW3JdLHc9bFt2XSx4PSgwLGRbdl0pKHcsbSk7cVt2XT14O3A9cHx8eCE9PXd9cmV0dXJuIHA/cTpsfX1mdW5jdGlvbiBJSChhLGIpe3JldHVybiBPYmplY3Qua2V5cyhhKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGMhPT1ifSkucmVkdWNlKGZ1bmN0aW9uKGMsZCl7dmFyIGU9e307cmV0dXJuIE9iamVjdC5hc3NpZ24oYywoZVtkXT1hW2RdLGUpKX0se30pfQpmdW5jdGlvbiBKSChhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjLTBdPWFyZ3VtZW50c1tjXTtyZXR1cm4gZnVuY3Rpb24oZCl7aWYoMD09PWIubGVuZ3RoKXJldHVybiBkO3ZhciBlPWJbYi5sZW5ndGgtMV07cmV0dXJuIGIuc2xpY2UoMCwtMSkucmVkdWNlUmlnaHQoZnVuY3Rpb24oZixnKXtyZXR1cm4gZyhmKX0sZShkKSl9fWZ1bmN0aW9uIEtIKGEsYil7QXJyYXkuaXNBcnJheShiKSYmMDxiLmxlbmd0aCYmKGE9SkguYXBwbHkobnVsbCxbXS5jb25jYXQoamEoYiksW2FdKSkpO3JldHVybiBmdW5jdGlvbihjLGQpe3ZhciBlPWEoYyk7cmV0dXJuIGZ1bmN0aW9uKGYsZyl7Zj12b2lkIDA9PT1mP2Q6ZjtyZXR1cm4gZShmLGcpfX19CmZ1bmN0aW9uIExIKGEpe3ZhciBiPUFycmF5LmlzQXJyYXkoYSkmJjA8YS5sZW5ndGg/SkguYXBwbHkobnVsbCxqYShhKSk6ZnVuY3Rpb24oYyl7cmV0dXJuIGN9O3JldHVybiBmdW5jdGlvbihjLGQpe2M9YihjKTtyZXR1cm4gZnVuY3Rpb24oZSxmKXtlPXZvaWQgMD09PWU/ZDplO3JldHVybiBjKGUsZil9fX07dmFyIE1IPWZ1bmN0aW9uKCl7VGguYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0KE1ILFRoKTtNSC5jcmVhdGU9VGguY3JlYXRlO3ZhciBOSD1mdW5jdGlvbigpe2xILmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dChOSCxsSCk7TkguY3JlYXRlPWxILmNyZWF0ZTt2YXIgT0g9ZnVuY3Rpb24oYSxiLGMsZCl7YWkuY2FsbCh0aGlzLGQoYyxiKSk7dGhpcy5wUD1hO3RoaXMuYm09Yjt0aGlzLmxrPWM7dGhpcy5sbT1kfTt0KE9ILGFpKTtPSC5jcmVhdGU9YWkuY3JlYXRlOwp2YXIgUUg9ZnVuY3Rpb24oYSxiKXtiPWIucmVkdWNlKGZ1bmN0aW9uKGMsZCl7dmFyIGU9ZC5sayxmPWQubG0sZz1kLlNzLGw9ZC5ibTtkPWQua2V5O2U9ImZ1bmN0aW9uIj09PXR5cGVvZiBlP0xIKGcpKGUsbCk6S0goZixnKShlLGwpO2NbZF09ZTtyZXR1cm4gY30se30pO1BIKGEsYil9LFNIPWZ1bmN0aW9uKGEsYil7UkgoYSxiLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gYy5rZXl9KSl9LFBIPWZ1bmN0aW9uKGEsYil7YS5saz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYS5sayksYik7VEgoYSxPYmplY3Qua2V5cyhiKSl9LFJIPWZ1bmN0aW9uKGEsYil7Yi5mb3JFYWNoKGZ1bmN0aW9uKGMpe2EubGs9SUgoYS5sayxjKX0pO1RIKGEsYil9LFRIPWZ1bmN0aW9uKGEsYil7YS5uZXh0KGEubG0oYS5sayxhLmJtKSk7YS5wUC5uZXh0KHt0eXBlOiJAbmdyeC9zdG9yZS91cGRhdGUtcmVkdWNlcnMiLHpGOmJ9KX07T0gucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt0aGlzLmNvbXBsZXRlKCl9O3ZhciBVSD1mdW5jdGlvbigpe1loLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dChVSCxZaCk7VUguY3JlYXRlPVloLmNyZWF0ZTtVSC5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuY29tcGxldGUoKX07ZnVuY3Rpb24gVkgoYSxiKXtyZXR1cm4gYT09PWJ9ZnVuY3Rpb24gV0goYSl7dmFyIGI9dm9pZCAwPT09Yj9WSDpiO3ZhciBjPXZvaWQgMD09PWM/Vkg6Yzt2YXIgZD1udWxsLGU9bnVsbCxmO3JldHVybntRczpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PWYpcmV0dXJuIGY7aWYoIWQpcmV0dXJuIGU9YS5hcHBseShudWxsLGFyZ3VtZW50cyksZD1hcmd1bWVudHMsZTthOnt2YXIgZz1hcmd1bWVudHM7Zm9yKHZhciBsPWQsbT0wO208Zy5sZW5ndGg7bSsrKWlmKCFiKGdbbV0sbFttXSkpe2c9ITA7YnJlYWsgYX1nPSExfWlmKCFnKXJldHVybiBlO2c9YS5hcHBseShudWxsLGFyZ3VtZW50cyk7ZD1hcmd1bWVudHM7cmV0dXJuIGMoZSxnKT9lOmU9Z30scmVzZXQ6ZnVuY3Rpb24oKXtlPWQ9bnVsbH0sTkg6ZnVuY3Rpb24oZyl7Zj1nfX19CmZ1bmN0aW9uIFhIKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2MtMF09YXJndW1lbnRzW2NdO3JldHVybiBZSCgpLmFwcGx5KG51bGwsamEoYikpfWZ1bmN0aW9uIFpIKGEsYixjLGQpe2lmKHZvaWQgMD09PWMpcmV0dXJuIGI9Yi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUoYSl9KSxkLlFzLmFwcGx5KG51bGwsYik7Yj1iLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZShhLGMpfSk7cmV0dXJuIGQuUXMuYXBwbHkobnVsbCxbXS5jb25jYXQoamEoYiksW2NdKSl9CmZ1bmN0aW9uIFlIKCl7dmFyIGE9dm9pZCAwPT09YT97b1I6Wkh9OmE7cmV0dXJuIGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2QtMF09YXJndW1lbnRzW2RdO0FycmF5LmlzQXJyYXkoY1swXSkmJihkPW4oYyksYz1kLm5leHQoKS52YWx1ZSxkPWlhKGQpLGM9W10uY29uY2F0KGphKGMpLGphKGQpKSk7dmFyIGU9Yy5zbGljZSgwLGMubGVuZ3RoLTEpLGY9Y1tjLmxlbmd0aC0xXSxnPWUuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiBwLnJlbGVhc2UmJiJmdW5jdGlvbiI9PT10eXBlb2YgcC5yZWxlYXNlfSksbD1XSChmdW5jdGlvbihwKXtmb3IodmFyIHE9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDsrK3IpcVtyLTBdPWFyZ3VtZW50c1tyXTtyZXR1cm4gZi5hcHBseShudWxsLHEpfSksbT1XSChmdW5jdGlvbihwLHEpe3JldHVybiBhLm9SLmFwcGx5KG51bGwsW3AsZSxxLGxdKX0pO3JldHVybiBPYmplY3QuYXNzaWduKG0uUXMse3JlbGVhc2U6ZnVuY3Rpb24oKXttLnJlc2V0KCk7CmwucmVzZXQoKTtnLmZvckVhY2goZnVuY3Rpb24ocCl7cmV0dXJuIHAucmVsZWFzZSgpfSl9LExTOmwuUXMsTkg6bS5OSH0pfX07dmFyICRIPWZ1bmN0aW9uKCl7VGguYXBwbHkodGhpcyxhcmd1bWVudHMpfTt0KCRILFRoKTskSC5jcmVhdGU9VGguY3JlYXRlO3ZhciBiST1mdW5jdGlvbihhLGIsYyxkKXthaS5jYWxsKHRoaXMsZCk7dmFyIGU9dGhpczt0aGlzLnBSPWEuYihEbCgpKS5iKFhsKGIpKS5iKHlsKGFJLHtzdGF0ZTpkfSkpLnN1YnNjcmliZShmdW5jdGlvbihmKXt2YXIgZz1mLmFjdGlvbjtlLm5leHQoZi5zdGF0ZSk7Yy5uZXh0KGcpfSl9O3QoYkksYWkpO2JJLmNyZWF0ZT1haS5jcmVhdGU7YkkucHJvdG90eXBlLlg9ZnVuY3Rpb24oKXt0aGlzLnBSLnVuc3Vic2NyaWJlKCk7dGhpcy5jb21wbGV0ZSgpfTtmdW5jdGlvbiBhSShhLGIpe2E9dm9pZCAwPT09YT97c3RhdGU6dm9pZCAwfTphO3ZhciBjPW4oYik7Yj1jLm5leHQoKS52YWx1ZTtjPWMubmV4dCgpLnZhbHVlO3JldHVybntzdGF0ZTpjKGEuc3RhdGUsYiksYWN0aW9uOmJ9fTt2YXIgY0k9ZnVuY3Rpb24oYSxiLGMpe1RoLmNhbGwodGhpcyk7dGhpcy5Mbj1iO3RoaXMuZXo9Yzt0aGlzLnNvdXJjZT1hfTt0KGNJLFRoKTtjSS5jcmVhdGU9VGguY3JlYXRlO2g9Y0kucHJvdG90eXBlO2guc2VsZWN0PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0xXT1hcmd1bWVudHNbZF07cmV0dXJuIGRJLmNhbGwuYXBwbHkoZEksW251bGwsYV0uY29uY2F0KGphKGMpKSkodGhpcyl9O2guamI9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGNJKHRoaXMsdGhpcy5Mbix0aGlzLmV6KTtiLllzPWE7cmV0dXJuIGJ9O2gueGE9ZnVuY3Rpb24oYSl7dGhpcy5Mbi5uZXh0KGEpfTtoLm5leHQ9ZnVuY3Rpb24oYSl7dGhpcy5Mbi5uZXh0KGEpfTtoLmVycm9yPWZ1bmN0aW9uKGEpe3RoaXMuTG4uZXJyb3IoYSl9O2guY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLkxuLmNvbXBsZXRlKCl9OwpmdW5jdGlvbiBkSShhLGIsYyl7Zm9yKHZhciBkPVtdLGU9MjtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZS0yXT1hcmd1bWVudHNbZV07cmV0dXJuIGZ1bmN0aW9uKGYpe2lmKCJzdHJpbmciPT09dHlwZW9mIGEpe3ZhciBnPVtiXS5jb25jYXQoamEoZCkpLmZpbHRlcihCb29sZWFuKTtmPWYuYihJbC5hcHBseShudWxsLFthXS5jb25jYXQoamEoZykpKSl9ZWxzZSBpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpZj1mLmIodWkoZnVuY3Rpb24obCl7cmV0dXJuIGEobCxiKX0pKTtlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSAnIit0eXBlb2YgYSsiJyBpbiBzZWxlY3Qgb3BlcmF0b3IsIGV4cGVjdGVkICdzdHJpbmcnIG9yICdmdW5jdGlvbiciKTtyZXR1cm4gZi5iKGRsKCkpfX07ZnVuY3Rpb24gZUkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkKXtkPWIuYWN0aW9uP2ZJKGQpOmQ7Yz1hKGMsZCk7cmV0dXJuIGIuc3RhdGU/ZkkoYyk6Y319ZnVuY3Rpb24gZkkoYSl7T2JqZWN0LmZyZWV6ZShhKTt2YXIgYj0iZnVuY3Rpb24iPT09dHlwZW9mIGE7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSkuZm9yRWFjaChmdW5jdGlvbihjKXtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGI/ImNhbGxlciIhPT1jJiYiY2FsbGVlIiE9PWMmJiJhcmd1bWVudHMiIT09YzoxKSYmKGM9YVtjXSwoIm9iamVjdCIhPT10eXBlb2YgY3x8bnVsbD09PWMpJiYiZnVuY3Rpb24iIT09dHlwZW9mIGN8fE9iamVjdC5pc0Zyb3plbihjKXx8ZkkoYykpfSk7cmV0dXJuIGF9O2Z1bmN0aW9uIGdJKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGMsZCl7aWYoYi5hY3Rpb24pe3ZhciBlPWhJKGQpO2lJKGUsImFjdGlvbiIpfWM9YShjLGQpO2Iuc3RhdGUmJihkPWhJKGMpLGlJKGQsInN0YXRlIikpO3JldHVybiBjfX0KZnVuY3Rpb24gaEkoYSxiKXtiPXZvaWQgMD09PWI/W106YjtyZXR1cm4gdm9pZCAwIT09YSYmbnVsbCE9PWF8fDAhPT1iLmxlbmd0aD9PYmplY3Qua2V5cyhhKS5yZWR1Y2UoZnVuY3Rpb24oYyxkKXtpZihjKXJldHVybiBjO2M9YVtkXTtpZih2b2lkIDA9PT1jfHxudWxsPT09Y3x8Im51bWJlciI9PT10eXBlb2YgY3x8ImJvb2xlYW4iPT09dHlwZW9mIGN8fCJzdHJpbmciPT09dHlwZW9mIGN8fEFycmF5LmlzQXJyYXkoYykpZD0hMTtlbHNle2lmKCJvYmplY3QiIT09dHlwZW9mIGN8fG51bGw9PT1jfHxBcnJheS5pc0FycmF5KGMpKXZhciBlPSExO2Vsc2UgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYyksZT1lPT09T2JqZWN0LnByb3RvdHlwZXx8bnVsbD09PWU7ZD1lP2hJKGMsW10uY29uY2F0KGphKGIpLFtkXSkpOntwYXRoOltdLmNvbmNhdChqYShiKSxbZF0pLHZhbHVlOmN9fXJldHVybiBkfSwhMSk6e3BhdGg6WyJyb290Il0sdmFsdWU6YX19CmZ1bmN0aW9uIGlJKGEsYil7aWYoITEhPT1hKXt2YXIgYz1hLnBhdGguam9pbigiLiIpO2I9RXJyb3IoIkRldGVjdGVkIHVuc2VyaWFsaXphYmxlICIrYisnIGF0ICInK2MrJyInKTtiLnZhbHVlPWEudmFsdWU7Yi5XUz1jO3Rocm93IGI7fX07ZnVuY3Rpb24gakkoYSl7cmV0dXJuIEdkKCk/KHZvaWQgMD09PWEmJmNvbnNvbGUud2FybigiQG5ncngvc3RvcmU6IHJ1bnRpbWUgY2hlY2tzIGFyZSBjdXJyZW50bHkgb3B0LWluIGJ1dCB3aWxsIGJlIHRoZSBkZWZhdWx0IGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gd2l0aCB0aGUgcG9zc2liaWxpdHkgdG8gb3B0LW91dCwgc2VlIGh0dHBzOi8vbmdyeC5pby9ndWlkZS9taWdyYXRpb24vdjggZm9yIG1vcmUgaW5mb3JtYXRpb24uIiksT2JqZWN0LmFzc2lnbih7WUg6ITEsV0g6ITEsWEg6ITEsVkg6ITF9LGEpKTp7WUg6ITEsV0g6ITEsWEg6ITEsVkg6ITF9fWZ1bmN0aW9uIGtJKGEpe3ZhciBiPWEuV0gsYz1hLllIO3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gYnx8Yz9nSShkLHthY3Rpb246YixzdGF0ZTpjfSk6ZH19CmZ1bmN0aW9uIGxJKGEpe3ZhciBiPWEuVkgsYz1hLlhIO3JldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gYnx8Yz9lSShkLHthY3Rpb246YixzdGF0ZTpjfSk6ZH19ZnVuY3Rpb24gbUkoYSl7cmV0dXJuIGF9O3ZhciBuST1mdW5jdGlvbigpe30scEk9ZnVuY3Rpb24oYSxiLGMpe3RoaXMuekY9YTt0aGlzLmV6PWM7YT1hLm1hcChmdW5jdGlvbihkLGUpe2U9Yi5zaGlmdCgpW2VdO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2xrOmUsYm06b0koZC5ibSl9KX0pO1FIKGMsYSl9O3BJLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7U0godGhpcy5leix0aGlzLnpGKX07ZnVuY3Rpb24gcUkoYSxiKXtyZXR1cm4gYiBpbnN0YW5jZW9mIHk/YS5nZXQoYik6Yn1mdW5jdGlvbiBySShhLGIsYyl7cmV0dXJuIGMubWFwKGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGJbZV1pbnN0YW5jZW9mIHk/KGU9YS5nZXQoYltlXSkse2tleTpkLmtleSxsbTplLmxtP2UubG06SEgsU3M6ZS5Tcz9lLlNzOltdLGJtOmUuYm19KTpkfSl9ZnVuY3Rpb24gc0koYSxiKXtyZXR1cm4gYi5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGMgaW5zdGFuY2VvZiB5P2EuZ2V0KGMpOmN9KX0KZnVuY3Rpb24gb0koYSl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBhP2EoKTphfWZ1bmN0aW9uIHRJKGEsYil7cmV0dXJuIGEuY29uY2F0KGIpfWZ1bmN0aW9uIHVJKGEpe2EmJmNvbnNvbGUuZXJyb3IoIlN0b3JlTW9kdWxlLmZvclJvb3QgY2F1Z2h0Iik7cmV0dXJuImd1YXJkZWQifTtmdW5jdGlvbiB2SShhLGIpe2Zvcih2YXIgYz0wO2I8YS5sZW5ndGg7YisrKWlmKDA9PT1jKWlmKCIuIj09PWFbYl0pYz0xO2Vsc2UgaWYoImUiPT09YVtiXXx8IkUiPT09YVtiXSljPTI7ZWxzZXtpZighd0koYVtiXSkpYnJlYWt9ZWxzZSBpZigxPT09YylpZigiZSI9PT1hW2JdfHwiRSI9PT1hW2JdKWM9MjtlbHNle2lmKCF3SShhW2JdKSlicmVha31lbHNlIGlmKDI9PT1jKWlmKHdJKGFbYl0pfHwiKyI9PT1hW2JdfHwiLSI9PT1hW2JdKWM9MztlbHNlIGJyZWFrO2Vsc2UgaWYoMz09PWMmJiF3SShhW2JdKSlicmVhaztyZXR1cm4gYn1mdW5jdGlvbiB3SShhKXtyZXR1cm4iMCI8PWEmJiI5Ij49YX1mdW5jdGlvbiB4SShhKXtyZXR1cm4iLyI9PT1hfHwiXyI9PT1hfHx3SShhKX0KZnVuY3Rpb24geUkoYSxiKXtmb3IodmFyIGM9MCxkPTA7Oyl7aWYoYz09PWEubGVuZ3RoKXJldHVybiBkPT09Yi5sZW5ndGg/MDotMTtpZihkPT09Yi5sZW5ndGgpcmV0dXJuIDE7aWYod0koYVtjXSkmJndJKGJbZF0pKXt2YXIgZT1jLGY9ZDtjPXZJKGEsYysxKTtkPXZJKGIsZCsxKTtlPXBhcnNlRmxvYXQoYS5zbGljZShlLGMpKTtmPXBhcnNlRmxvYXQoYi5zbGljZShmLGQpKTtpZihlPGYpcmV0dXJuLTE7aWYoZT5mKXJldHVybiAxfWVsc2V7aWYoeEkoYVtjXSkpe2lmKCF4SShiW2RdKSlyZXR1cm4tMX1lbHNle2lmKHhJKGJbZF0pKXJldHVybiAxO2lmKGFbY108YltkXSlyZXR1cm4tMTtpZihhW2NdPmJbZF0pcmV0dXJuIDF9YysrO2QrK319fTt2YXIgekk9W3trZXk6ImhpZ2hGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkhpZ2ggZmxvcHMgY29tcHV0ZSJ9LHtrZXk6Imxvd0Zsb3BzQ29tcHV0ZVVzIixsYWJlbDoiTG93IGZsb3BzIGNvbXB1dGUifSx7a2V5OiJob3N0SW5mZWVkRHVyYXRpb25VcyIsbGFiZWw6Ikhvc3QgaW5mZWVkIn0se2tleToiaG9zdE91dGZlZWREdXJhdGlvblVzIixsYWJlbDoiSG9zdCBvdXRmZWVkIn0se2tleToiYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2UgY29tcHV0ZSJ9LHtrZXk6ImFsbFJlZHVjZVN5bmNEdXJhdGlvblVzIixsYWJlbDoiQWxsUmVkdWNlIHN5bmMifSx7a2V5OiJzZW5kRHVyYXRpb25VcyIsbGFiZWw6IlNlbmQifSx7a2V5OiJyZWN2RHVyYXRpb25VcyIsbGFiZWw6IlJlY3YifV07dmFyIEFJPXtmb286WyJvdmVydmlld19wYWdlIiwidHJhY2Vfdmlld2VyIl0sZW1wdHk6W10sYmFyOiJvdmVydmlld19wYWdlIG92ZXJ2aWV3X3BhZ2VAIGlucHV0X3BpcGVsaW5lX2FuYWx5emVyIGlucHV0X3BpcGVsaW5lX2FuYWx5emVyQCBtZW1vcnlfdmlld2VyIGtlcm5lbF9zdGF0cyBvcF9wcm9maWxlIHBvZF92aWV3ZXIgdHJhY2Vfdmlld2VyIHRyYWNlX3ZpZXdlckAgdGVuc29yZmxvd19zdGF0cyIuc3BsaXQoIiAiKX0sQkk9WyJkZXZpY2UiLCJob3N0Il0sQ0k9W3tjb2xzOlt7aWQ6InNlbGZUaW1lUGVyY2VudCIsbGFiZWw6IlRpbWUgKCUpIix0eXBlOiJudW1iZXIifSx7aWQ6ImN1bXVsYXRpdmVUaW1lUGVyY2VudCIsbGFiZWw6IkN1bXVsYXRpdmUgdGltZSAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoiY2F0ZWdvcnkiLGxhYmVsOiJDYXRlZ29yeSIsdHlwZToic3RyaW5nIn0se2lkOiJvcGVyYXRpb24iLGxhYmVsOiJPcGVyYXRpb24iLHR5cGU6InN0cmluZyJ9LHtpZDoiZmxvcFJhdGUiLApsYWJlbDoiR0ZMT1BzL1NlYyIsdHlwZToibnVtYmVyIn1dLHJvd3M6W3tjOlt7djouMTE1NTV9LHt2Oi4xMTU1NX0se3Y6IkluZmVlZERlcXVldWVUdXBsZSJ9LHt2OiJJbmZlZWRRdWV1ZS9kZXF1ZXVlIn0se3Y6MH1dfSx7Yzpbe3Y6LjAzODI3fSx7djouMTUzODN9LHt2OiIifSx7djoiYWxsLXJlZHVjZS45NTgifSx7djoxLjM5NTg2fV19LHtjOlt7djouMDE5OTF9LHt2Oi4xNzM3NH0se3Y6IkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQifSx7djoiZ3JhZGllbnRzL21uYXNfdjQvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCJ9LHt2OjE4NC4wNTcyMTUxMDEzNjU2N31dfSx7Yzpbe3Y6LjAxODY3fSx7djouMTkyNDJ9LHt2OiJDb252MkRCYWNrcHJvcElucHV0In0se3Y6ImdyYWRpZW50cy9tbmFzX3Y0L0NvbnYyREJhY2twcm9wSW5wdXQifSx7djozOTguNDA5MDR9XX0se2M6W3t2Oi4wMTg1fSx7djouMjEwOTJ9LHt2OiJDb252MkRCYWNrcHJvcElucHV0In0sCnt2OiJncmFkaWVudHMvbW5hc192NC9Db252MkRCYWNrcHJvcElucHV0In0se3Y6NDk4LjY0NjQ5fV19LHtjOlt7djouMDE3NzR9LHt2Oi4yMjg2Nn0se3Y6IiJ9LHt2OiJyZXNoYXBlLjEyMjMifSx7djowfV19LHtjOlt7djouMDE2MTZ9LHt2Oi4yNDQ4M30se3Y6IkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQifSx7djoiZ3JhZGllbnRzL21uYXNfdjQvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCJ9LHt2OjIyMS40OTA1OX1dfSx7Yzpbe3Y6LjAxNDI3fSx7djouMjU5MTF9LHt2OiJEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciJ9LHt2OiJncmFkaWVudHMvbW5hc192NC9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciJ9LHt2OjI1Ni44MjE3OX1dfSx7Yzpbe3Y6LjAxNDExfSx7djouMjczMjN9LHt2OiJDb252MkQifSx7djoibW5hc192NC9mZWF0dXJlX25ldHdvcmsvc3RlbS9jb252L0NvbnYyRF9Gb2xkIn0se3Y6NDcxLjE4ODQ3fV19LAp7Yzpbe3Y6LjAxNDA5fSx7djouMjg3MzJ9LHt2OiJDb252MkQifSx7djoibW5hc192NC9mZWF0dXJlX25ldHdvcmsvc3RlbS9jb252L0NvbnYyRCJ9LHt2OjQ2My43Mjc0fV19XSxwOntkZXZpY2VfaWRsZV90aW1lX3BlcmNlbnQ6IjEuMSUiLGZsb3BfcmF0ZV91dGlsaXphdGlvbl9yZWxhdGl2ZV90b19yb29mbGluZToiNTQuNiUiLGhvc3RfaWRsZV90aW1lX3BlcmNlbnQ6IjU5LjclIixtZW1vcnlfYndfdXRpbGl6YXRpb25fcmVsYXRpdmVfdG9faHdfbGltaXQ6IjU0LjYlIixteHVfdXRpbGl6YXRpb25fcGVyY2VudDoiMTIuOCUiLHJlbWFya19jb2xvcjoiIixyZW1hcmtfdGV4dDoiIn19LHtjb2xzOlt7aWQ6InN0ZXBudW0iLGxhYmVsOiJzdGVwbnVtIix0eXBlOiJzdHJpbmcifSx7aWQ6ImNvbXB1dGVUaW1lTXMiLGxhYmVsOiJDb21wdXRlIix0eXBlOiJudW1iZXIifSx7aWQ6ImlucHV0VGltZU1zIixsYWJlbDoiSW5wdXQiLHR5cGU6Im51bWJlciJ9LHtpZDoiaWRsZVRpbWVNcyIsCmxhYmVsOiJJZGxlIix0eXBlOiJudW1iZXIifSx7aWQ6InRvb2x0aXAiLGxhYmVsOiJ0b29sdGlwIix0eXBlOiJzdHJpbmciLHA6e3JvbGU6InRvb2x0aXAifX1dLHJvd3M6W3tjOlt7djoiMTQ5MSJ9LHt2OjEuMjM0Nn0se3Y6MS4zNTh9LHt2OjEuNDkzOH0se3Y6InN0ZXAgMTQ5MTpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDEuNDk0IG1zLCBTdGVwIHRpbWUgPSAyLjU5MyBtcyJ9XX0se2M6W3t2OiIxNDkyIn0se3Y6Ni4xNzI4fSx7djo2Ljc5MDF9LHt2OjcuNDY5MX0se3Y6InN0ZXAgMTQ5MjpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDcuNDY5IG1zLCBTdGVwIHRpbWUgPSAxMi45NjMgbXMifV19LHtjOlt7djoiMTQ5MyJ9LHt2OjMuNzAzN30se3Y6NC4wNzQxfSx7djo0LjQ4MTV9LHt2OiJzdGVwIDE0OTM6XG5UaW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEgPSA0LjQ4MSBtcywgU3RlcCB0aW1lID0gNy43NzggbXMifV19LHtjOlt7djoiMTQ5NCJ9LAp7djo4LjY0Mn0se3Y6OS41MDYyfSx7djoxMC40NTY4fSx7djoic3RlcCAxNDk0OlxuVGltZSB3YWl0aW5nIGZvciBpbnB1dCBkYXRhID0gMTAuNDU3IG1zLCBTdGVwIHRpbWUgPSAxOC4xNDggbXMifV19LHtjOlt7djoiMTQ5NSJ9LHt2OjIuNDY5MX0se3Y6Mi43MTZ9LHt2OjIuOTg3N30se3Y6InN0ZXAgMTQ5NTpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDIuOTg4IG1zLCBTdGVwIHRpbWUgPSA1LjE4NSBtcyJ9XX1dLHA6e3N0ZXB0aW1lX21zX2F2ZXJhZ2U6IjkuMyIsc3RlcHRpbWVfbXNfbWF4aW11bToiMTguMSIsc3RlcHRpbWVfbXNfbWluaW11bToiMi42IixzdGVwdGltZV9tc19zdGFuZGFyZF9kZXZpYXRpb246IjUuNiIsaWRsZV9tc19hdmVyYWdlOiI1LjQiLGlucHV0X21zX2F2ZXJhZ2U6IjQuOSIsY29tcHV0ZV9tc19hdmVyYWdlOiI0LjQifX0se2NvbHM6W10scm93czpbXSxwOntkZXZpY2VfY29yZV9jb3VudDoiMTYgKFJlcGxpY2EgY291bnQgPSAxLCBudW0gY29yZXMgcGVyIHJlcGxpY2EgPSAxNikiLApkZXZpY2VfdHlwZToiRHJhZ29uRmlzaCIsaG9zdF9jb3VudDoiMSJ9fSx7Y29sczpbe2lkOiJ0aXBfdHlwZSIsbGFiZWw6InRpcF90eXBlIix0eXBlOiJzdHJpbmcifSx7aWQ6ImxpbmsiLGxhYmVsOiJsaW5rIix0eXBlOiJzdHJpbmcifV0scm93czpbe2M6W3t2OiJob3N0In0se3Y6J0NvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOnRmLWRhdGEtdXNlckBnb29nbGUuY29tIiB0YXJnZXQ9Il9ibGFuayI+dGYtZGF0YS11c2Vyc0Bnb29nbGUuY29tPC9hPiB3aXRoIHlvdXIgaW5mb3JtYXRpb24uJ31dfSx7Yzpbe3Y6Imhvc3QifSx7djoidHJhY2Vfdmlld2VyIChVc2UgdGhlIFRyYWNlIFZpZXdlci4pIn1dfSx7Yzpbe3Y6ImRldmljZSJ9LHt2OidDb250YWN0IDxhIGhyZWY9Im1haWx0bzp0Zi1kYXRhLXVzZXJAZ29vZ2xlLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPnRmLWRhdGEtdXNlcnNAZ29vZ2xlLmNvbTwvYT4gd2l0aCB5b3VyIGluZm9ybWF0aW9uLid9XX0se2M6W3t2OiJkZXZpY2UifSwKe3Y6InRyYWNlX3ZpZXdlciAoVXNlIHRoZSBUcmFjZSBWaWV3ZXIuKSJ9XX0se2M6W3t2OiJkb2MifSx7djonPGEgaHJlZj0iaHR0cDovL3RlbnNvcmZsb3cub3JnIiB0YXJnZXQ9Il9ibGFuayI+VGVuc29yRmxvdzwvYT4nfV19LHtjOlt7djoiZG9jIn0se3Y6JzxhIGhyZWY9Imh0dHA6Ly9jbG91ZC5nb29nbGUuY29tL3RwdS8iIHRhcmdldD0iX2JsYW5rIj5DbG91ZCBUUFU8L2E+J31dfV0scDp7Ym90dGxlbmVjazoiZGV2aWNlIixzdGF0ZW1lbnQ6IigxKSBZb3VyIHByb2dyYW0gaXMgTk9UIGlucHV0LWJvdW5kIGJlY2F1c2Ugb25seSAwLjIlIG9mIHRoZSB0b3RhbCBzZXAgdGltZSBzYW1wbGVkIGlzIHdhaXRpbmcgZm9yIGlucHV0LiBUaGVyZWZvcmUsIHlvdSBzaG91bGQgZm9jdXMgb24gcmVkdWNpbmcgdGhlIFRQVSB0aW1lLiJ9fV0sREk9W3tjb2xzOlt7aWQ6InN0ZXBudW0iLGxhYmVsOiJzdGVwbnVtIix0eXBlOiJzdHJpbmcifSx7aWQ6ImNvbXB1dGVUaW1lTXMiLGxhYmVsOiJDb21wdXRlIHRpbWUgKGluIG1zKSIsCnR5cGU6Im51bWJlciJ9LHtpZDoiaW5wdXRUaW1lTXMiLGxhYmVsOiJJbnB1dCB0aW1lIChpbiBtcykiLHR5cGU6Im51bWJlciJ9LHtpZDoiaWRsZVRpbWVNcyIsbGFiZWw6IklkbGUgdGltZSAoaW4gbXMpIix0eXBlOiJudW1iZXIifSx7aWQ6InRvb2x0aXAiLGxhYmVsOiJ0b29sdGlwIix0eXBlOiJzdHJpbmciLHA6e3JvbGU6InRvb2x0aXAifX0se2lkOiJpbmZlZWRQZXJjZW50QXZlcmFnZSIsbGFiZWw6IiUgc3RlcCB0aW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEiLHR5cGU6Im51bWJlciJ9LHtpZDoiaW5mZWVkUGVyY2VudE1pbiIsbGFiZWw6IkluZmVlZCBwZXJjZW50IG1pbiIsdHlwZToibnVtYmVyIixwOntyb2xlOiJpbnRlcnZhbCJ9fSx7aWQ6ImluZmVlZFBlcmNlbnRNYXgiLGxhYmVsOiJJbmZlZWQgcGVyY2VudCBtYXgiLHR5cGU6Im51bWJlciIscDp7cm9sZToiaW50ZXJ2YWwifX1dLHJvd3M6W3tjOlt7djoiMCJ9LHt2OjEuMjM0Nn0se3Y6MS4zNTh9LHt2Oi4zNTh9LAp7djoic3RlcCAwOlxuVGltZSB3YWl0aW5nIGZvciBpbnB1dCBkYXRhID0gMS4zNTggbXMsIFN0ZXAgdGltZSA9IDEuMjM1IG1zIn0se3Y6MS4yMzQ2fSx7djouMzg1Nn0se3Y6MS4zMDQ3fV19LHtjOlt7djoiMSJ9LHt2OjYuMTcyOH0se3Y6Ni43OTAxfSx7djo1Ljc5MDF9LHt2OiJzdGVwIDE6XG5UaW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEgPSA2Ljc5MCBtcywgU3RlcCB0aW1lID0gNi4xNzMgbXMifSx7djo2LjE3Mjh9LHt2OjYuMDUzNH0se3Y6Ny4yODk0fV19LHtjOlt7djoiMiJ9LHt2OjMuNzAzN30se3Y6NC4wNzQxfSx7djozLjA3NDF9LHt2OiJzdGVwIDI6XG5UaW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEgPSA0LjA3NCBtcywgU3RlcCB0aW1lID0gMy43MDQgbXMifSx7djozLjcwMzd9LHt2OjIuODk4OX0se3Y6NC4yMTYyfV19LHtjOlt7djoiMyJ9LHt2OjguNjQyfSx7djo5LjUwNjJ9LHt2OjguNTA2Mn0se3Y6InN0ZXAgMzpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDkuNTA2IG1zLCBTdGVwIHRpbWUgPSA4LjY0MiBtcyJ9LAp7djo4LjY0Mn0se3Y6Ny45OTIyfSx7djo4LjcyNDd9XX0se2M6W3t2OiI0In0se3Y6Mi40NjkxfSx7djoyLjcxNn0se3Y6MS43MTZ9LHt2OiJzdGVwIDQ6XG5UaW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEgPSAyLjcxNiBtcywgU3RlcCB0aW1lID0gMi40NjkgbXMifSx7djoyLjQ2OTF9LHt2OjEuNjE5NH0se3Y6Mi45Njd9XX0se2M6W3t2OiI1In0se3Y6MS4yMzQ2fSx7djoxLjM1OH0se3Y6LjM1OH0se3Y6InN0ZXAgNTpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDEuMzU4IG1zLCBTdGVwIHRpbWUgPSAxLjIzNSBtcyJ9LHt2OjEuMjM0Nn0se3Y6LjY2MDl9LHt2OjIuMzM5Nn1dfSx7Yzpbe3Y6IjYifSx7djozLjcwMzd9LHt2OjQuMDc0MX0se3Y6My4wNzQxfSx7djoic3RlcCA2OlxuVGltZSB3YWl0aW5nIGZvciBpbnB1dCBkYXRhID0gNC4wNzQgbXMsIFN0ZXAgdGltZSA9IDMuNzA0IG1zIn0se3Y6My43MDM3fSx7djoyLjg3NDh9LHt2OjMuOTM5OH1dfSx7Yzpbe3Y6IjcifSwKe3Y6MS4yMzQ2fSx7djoxLjM1OH0se3Y6LjM1OH0se3Y6InN0ZXAgNzpcblRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YSA9IDEuMzU4IG1zLCBTdGVwIHRpbWUgPSAxLjIzNSBtcyJ9LHt2OjIuNDY5MX0se3Y6MS44NjM0fSx7djoyLjkyOTh9XX1dLHA6e2luZmVlZF9wZXJjZW50X2F2ZXJhZ2U6IjMuNyIsaW5mZWVkX3BlcmNlbnRfbWF4aW11bToiOC42IixpbmZlZWRfcGVyY2VudF9taW5pbXVtOiIxLjIiLGluZmVlZF9wZXJjZW50X3N0YW5kYXJkX2RldmlhdGlvbjoiMi40IixzdGVwdGltZV9tc19hdmVyYWdlOiIzLjUiLHN0ZXB0aW1lX21zX21heGltdW06IjguNiIsc3RlcHRpbWVfbXNfbWluaW11bToiMS4yIixzdGVwdGltZV9tc19zdGFuZGFyZF9kZXZpYXRpb246IjIuNSIsc3VtbWFyeV9jb25jbHVzaW9uOiIoMSkgWW91ciBwcm9ncmFtIGlzIE5PVCBpbnB1dC1ib3VuZCIsc3VtbWFyeV9uZXh0c3RlcDoiTG9vayBhdCB0aGUgc2VjdGlvbiAzIGZvciB0aGUgYnJlYWtkb3duIG9mIGlucHV0IHRpbWUgb24gdGhlIGhvc3QuIn19LAp7fSx7Y29sczpbe2lkOiJvcE5hbWUiLGxhYmVsOiJJbnB1dCBPcCIsdHlwZToic3RyaW5nIn0se2lkOiJjb3VudCIsbGFiZWw6IkNvdW50Iix0eXBlOiJudW1iZXIifSx7aWQ6InRpbWVJbk1zIixsYWJlbDoiVG90YWwgVGltZSAoaW4gbXMpIix0eXBlOiJudW1iZXIifSx7aWQ6InRpbWVJblBlcmNlbnQiLGxhYmVsOiJUb3RhbCBUaW1lIChhcyAlIG9mIHRvdGFsIGlucHV0LXByb2Nlc3NpbmcgdGltZSkiLHR5cGU6Im51bWJlciJ9LHtpZDoic2VsZlRpbWVJbk1zIixsYWJlbDoiVG90YWwgU2VsZiBUaW1lIChpbiBtcykiLHR5cGU6Im51bWJlciJ9LHtpZDoic2VsZlRpbWVJblBlcmNlbnQiLGxhYmVsOiJUb3RhbCBTZWxmIFRpbWUgKGFzICUgb2YgdG90YWwgaW5wdXQtcHJvY2Vzc2luZyB0aW1lKSIsdHlwZToibnVtYmVyIn0se2lkOiJjYXRlZ29yeSIsbGFiZWw6IkNhdGVnb3J5Iix0eXBlOiJzdHJpbmcifV0scm93czpbe2M6W3t2OiJJdGVyYXRvcjo6TW9kZWw6OlByZWZldGNoOjpNYXBBbmRCYXRjaDo6U2h1ZmZsZTo6U1NUYWJsZSJ9LAp7djoxOH0se3Y6ODk4LjEyNn0se3Y6LjAxNn0se3Y6ODk4LjEyNn0se3Y6LjAxNn0se3Y6IkFkdmFuY2VkIGZpbGUgcmVhZCJ9XX0se2M6W3t2OiJJdGVyYXRvcjo6TW9kZWw6OlByZWZldGNoOjpNYXBBbmRCYXRjaDo6UGFyYWxsZWxJbnRlcmxlYXZlIn0se3Y6Mzc0fSx7djo4MzEuMzY5fSx7djouMDE1fSx7djo4MTQuNjAzfSx7djouMDE0fSx7djoiUHJlcHJvY2Vzc2luZyJ9XX0se2M6W3t2OiJJdGVyYXRvcjo6TW9kZWw6OlByZWZldGNoOjpNYXBBbmRCYXRjaDo6U2h1ZmZsZTo6U1NUYWJsZVsyXSJ9LHt2OjEzfSx7djo4MTMuMjM2fSx7djouMDE0fSx7djo4MTMuMjM2fSx7djouMDE0fSx7djoiQWR2YW5jZWQgZmlsZSByZWFkIn1dfSx7Yzpbe3Y6ImlucHV0X3BpcGVsaW5lX3Rhc2swL3doaWxlL0luZmVlZFF1ZXVlL2VucXVldWUvNiJ9LHt2OjR9LHt2OjMwNy44MjN9LHt2Oi4wMDV9LHt2OjMwNy44MjN9LHt2Oi4wMDV9LHt2OiJFbnF1ZXVlIn1dfSx7Yzpbe3Y6Ikl0ZXJhdG9yOjpNb2RlbCJ9LAp7djoxOH0se3Y6NTM1Ljg4NH0se3Y6LjAwOX0se3Y6LjIzNH0se3Y6NC4yNDV9LHt2OiJQcmVwcm9jZXNzaW5nIn1dfV0scDp7YWR2YW5jZWRfZmlsZV9yZWFkX3VzOiI0MzA3MjA4LjgxMiIsZGVtYW5kZWRfZmlsZV9yZWFkX3VzOiIwLjAwMCIsZW5xdWV1ZV91czoiMzAwMjk1NC41NDEiLHByZXByb2Nlc3NpbmdfdXM6IjE4MDYyMC4xNzEiLHVuY2xhc3NpZmllZF9ub25lcXVldWVfdXM6IjAuMDAwIn19LHtjb2xzOlt7aWQ6ImxpbmsiLGxhYmVsOiJsaW5rIix0eXBlOiJzdHJpbmcifV0scm93czpbe2M6W3t2OiJFbnF1ZXVpbmcgZGF0YTogeW91IG1heSB3YW50IHRvIGNvbWJpbmUgc21hbGwgaW5wdXQgZGF0YSBjaHVua3MgaW50byBmZXdlciBidXQgbGFyZ2VyIGNodW5rcy4ifV19LHtjOlt7djonT3RoZXIgZGF0YSByZWFkaW5nIG9yIHByb2Nlc3Npbmc6IHlvdSBtYXkgY29uc2lkZXIgdXNpbmcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2RhdGFzZXRzIiB0YXJnZXQ9Il9ibGFuayI+RGF0YXNldCBBUEk8L2E+IChpZiB5b3UgYXJlIG5vdCB1c2luZyBpdCBub3cpJ31dfV19XSwKRUk9W3tjb2xzOlt7aWQ6InJhbmsiLGxhYmVsOiJSYW5rIix0eXBlOiJudW1iZXIifSx7aWQ6Imhvc3Rfb3JfZGV2aWNlIixsYWJlbDoiSG9zdC9kZXZpY2UiLHR5cGU6InN0cmluZyJ9LHtpZDoidHlwZSIsbGFiZWw6IlR5cGUiLHR5cGU6InN0cmluZyJ9LHtpZDoib3BlcmF0aW9uIixsYWJlbDoiT3BlcmF0aW9uIix0eXBlOiJzdHJpbmcifSx7aWQ6Im9jY3VycmVuY2VzIixsYWJlbDoiI09jY3VycmVuY2VzIix0eXBlOiJudW1iZXIifSx7aWQ6InRvdGFsX3RpbWUiLGxhYmVsOiJUb3RhbCB0aW1lICh1cykiLHR5cGU6Im51bWJlciJ9LHtpZDoiYXZnX3RpbWUiLGxhYmVsOiJBdmcuIHRpbWUgKHVzKSIsdHlwZToibnVtYmVyIn0se2lkOiJ0b3RhbF9zZWxmX3RpbWUiLGxhYmVsOiJUb3RhbCBzZWxmLXRpbWUgKHVzKSIsdHlwZToibnVtYmVyIn0se2lkOiJhdmdfc2VsZl90aW1lIixsYWJlbDoiQXZnLiBzZWxmLXRpbWUgKHVzKSIsdHlwZToibnVtYmVyIn0se2lkOiJkZXZpY2VfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLApsYWJlbDoiVG90YWwgc2VsZi10aW1lIG9uIERldmljZSAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoiZGV2aWNlX2N1bXVsYXRpdmVfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLGxhYmVsOiJDdW11bGF0aXZlIHRvdGFsLXNlbGYgdGltZSBvbiBEZXZpY2UgKCUpIix0eXBlOiJudW1iZXIifSx7aWQ6Imhvc3RfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLGxhYmVsOiJUb3RhbCBzZWxmLXRpbWUgb24gSG9zdCAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoiSG9zdF9jdW11bGF0aXZlX3RvdGFsX3NlbGZfdGltZV9wZXJjZW50IixsYWJlbDoiQ3VtdWxhdGl2ZSB0b3RhbC1zZWxmIHRpbWUgb24gSG9zdCAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoibWVhc3VyZWRfZmxvcF9yYXRlIixsYWJlbDoiTWVhc3VyZWQgR0ZMT1BzL1NlYyIsdHlwZToibnVtYmVyIn0se2lkOiJtZWFzdXJlZF9tZW1vcnlfYnciLGxhYmVsOiJNZWFzdXJlZCBNZW1vcnkgQlcgKEdCeXRlcy9TZWMpIix0eXBlOiJudW1iZXIifSwKe2lkOiJvcGVyYXRpb25hbF9pbnRlbnNpdHkiLGxhYmVsOiJPcGVyYXRpb25hbCBJbnRlbnNpdHkgKEZMT1BzL0J5dGUpIix0eXBlOiJudW1iZXIifSx7aWQ6ImJvdW5kX2J5IixsYWJlbDoiQm91bmQgYnkiLHR5cGU6InN0cmluZyJ9XSxwOnthcmNoaXRlY3R1cmVfdHlwZToiQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29yayAoQ05OKSIsZGV2aWNlX3RmX3Bwcm9mX2xpbms6IiIsaG9zdF90Zl9wcHJvZl9saW5rOiIiLHRhc2tfdHlwZToiVHJhaW5pbmcifSxyb3dzOlt7Yzpbe3Y6MX0se3Y6IkRldmljZSJ9LHt2OiJDb252MkQifSx7djoiQ29udjJEX0ZvbGQifSx7djo1MH0se3Y6NDAwMDAwMC41fSx7djo4MDAwMC4wMX0se3Y6NDAwMDAwMC41fSx7djo4MDAwMC4wMX0se3Y6LjR9LHt2Oi40fSx7djowfSx7djowfSx7djo1NDEzLjV9LHt2Ojg1fSx7djo2My43fSx7djoiTWVtb3J5In1dfSx7Yzpbe3Y6Mn0se3Y6IkRldmljZSJ9LHt2OiJDb252MkQifSx7djoiQ29udjJEIn0se3Y6NDB9LAp7djoxMjAwMDAwLjV9LHt2OjMwMDAwLjAxfSx7djoxMjAwMDAwLjV9LHt2OjMwMDAwLjAxfSx7djouMTJ9LHt2Oi41Mn0se3Y6MH0se3Y6MH0se3Y6NDQ3LjJ9LHt2OjEyMS41fSx7djozLjd9LHt2OiJNZW1vcnkifV19LHtjOlt7djozfSx7djoiRGV2aWNlIn0se3Y6IkRlcHRod2lzZUNvbnYyZE5hdGl2ZSJ9LHt2OiJEZXB0aHdpc2VDb252MmROYXRpdmUifSx7djoyNX0se3Y6MjAwMDAwMC41fSx7djo4MDAwMC4wMn0se3Y6MjAwMDAwMC41fSx7djo4MDAwMC4wMn0se3Y6LjJ9LHt2Oi43Mn0se3Y6MH0se3Y6MH0se3Y6NTM4My4yfSx7djo2Mi44fSx7djo4NS44fSx7djoiTWVtb3J5In1dfSx7Yzpbe3Y6NH0se3Y6IkRldmljZSJ9LHt2OiJNYXgifSx7djoiQmF0Y2hNYXgifSx7djoxMH0se3Y6MTMwMDAwMC41fSx7djoxMzAwMDAuMDV9LHt2OjEzMDAwMDAuNX0se3Y6MTMwMDAwLjA1fSx7djouMTN9LHt2Oi44NX0se3Y6MH0se3Y6MH0se3Y6MTExLjZ9LHt2OjIxMC41fSx7djouNX0sCnt2OiJNZW1vcnkifV19LHtjOlt7djo1fSx7djoiRGV2aWNlIn0se3Y6IklETEUifSx7djoiSURMRSJ9LHt2OjEwfSx7djoxNTAwMDAwLjV9LHt2OjE1MDAwMC4wNX0se3Y6MTUwMDAwMC41fSx7djoxNTAwMDAuMDV9LHt2Oi4xNX0se3Y6MX0se3Y6MH0se3Y6MH0se3Y6MH0se3Y6MH0se3Y6MH0se3Y6IlVua25vd24ifV19LHtjOlt7djo2fSx7djoiSG9zdCJ9LHt2OiJJRExFIn0se3Y6IklETEUifSx7djozMH0se3Y6NDUwMDAwMC4xfSx7djoxNUU1fSx7djo0NTAwMDAwLjF9LHt2OjE1RTV9LHt2OjB9LHt2OjB9LHt2Oi40NX0se3Y6LjQ1fSx7djowfSx7djowfSx7djowfSx7djoiVW5rbm93biJ9XX0se2M6W3t2Ojd9LHt2OiJIb3N0In0se3Y6Ik91dGZlZWREZXF1ZXVlVHVwbGUifSx7djoiT3V0ZmVlZERlcXVldWVUdXBsZSJ9LHt2OjIwfSx7djozMDAwMDAwLjF9LHt2OjE1RTR9LHt2OjMwMDAwMDAuMX0se3Y6MTVFNH0se3Y6MH0se3Y6MH0se3Y6LjN9LHt2Oi43NX0se3Y6MH0se3Y6MH0sCnt2OjB9LHt2OiJVbmtub3duIn1dfSx7Yzpbe3Y6OH0se3Y6Ikhvc3QifSx7djoiT3V0ZmVlZERlcXVldWVUdXBsZSJ9LHt2OiJPdXRmZWVkRGVxdWV1ZVR1cGxlXzEifSx7djoxMH0se3Y6MjUwMDAwMC4xfSx7djoyNTAwMDAuMDF9LHt2OjI1MDAwMDAuMX0se3Y6MjUwMDAwLjAxfSx7djowfSx7djowfSx7djouMjV9LHt2OjF9LHt2OjB9LHt2OjB9LHt2OjB9LHt2OiJVbmtub3duIn1dfV19LHtjb2xzOlt7aWQ6InJhbmsiLGxhYmVsOiJSYW5rIix0eXBlOiJudW1iZXIifSx7aWQ6Imhvc3Rfb3JfZGV2aWNlIixsYWJlbDoiSG9zdC9kZXZpY2UiLHR5cGU6InN0cmluZyJ9LHtpZDoidHlwZSIsbGFiZWw6IlR5cGUiLHR5cGU6InN0cmluZyJ9LHtpZDoib3BlcmF0aW9uIixsYWJlbDoiT3BlcmF0aW9uIix0eXBlOiJzdHJpbmcifSx7aWQ6Im9jY3VycmVuY2VzIixsYWJlbDoiI09jY3VycmVuY2VzIix0eXBlOiJudW1iZXIifSx7aWQ6InRvdGFsX3RpbWUiLGxhYmVsOiJUb3RhbCB0aW1lICh1cykiLAp0eXBlOiJudW1iZXIifSx7aWQ6ImF2Z190aW1lIixsYWJlbDoiQXZnLiB0aW1lICh1cykiLHR5cGU6Im51bWJlciJ9LHtpZDoidG90YWxfc2VsZl90aW1lIixsYWJlbDoiVG90YWwgc2VsZi10aW1lICh1cykiLHR5cGU6Im51bWJlciJ9LHtpZDoiYXZnX3NlbGZfdGltZSIsbGFiZWw6IkF2Zy4gc2VsZi10aW1lICh1cykiLHR5cGU6Im51bWJlciJ9LHtpZDoiZGV2aWNlX3RvdGFsX3NlbGZfdGltZV9wZXJjZW50IixsYWJlbDoiVG90YWwgc2VsZi10aW1lIG9uIERldmljZSAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoiZGV2aWNlX2N1bXVsYXRpdmVfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLGxhYmVsOiJDdW11bGF0aXZlIHRvdGFsLXNlbGYgdGltZSBvbiBEZXZpY2UgKCUpIix0eXBlOiJudW1iZXIifSx7aWQ6Imhvc3RfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLGxhYmVsOiJUb3RhbCBzZWxmLXRpbWUgb24gSG9zdCAoJSkiLHR5cGU6Im51bWJlciJ9LHtpZDoiSG9zdF9jdW11bGF0aXZlX3RvdGFsX3NlbGZfdGltZV9wZXJjZW50IiwKbGFiZWw6IkN1bXVsYXRpdmUgdG90YWwtc2VsZiB0aW1lIG9uIEhvc3QgKCUpIix0eXBlOiJudW1iZXIifSx7aWQ6Im1lYXN1cmVkX2Zsb3BfcmF0ZSIsbGFiZWw6Ik1lYXN1cmVkIEdGTE9Qcy9TZWMiLHR5cGU6Im51bWJlciJ9LHtpZDoibWVhc3VyZWRfbWVtb3J5X2J3IixsYWJlbDoiTWVhc3VyZWQgTWVtb3J5IEJXIChHQnl0ZXMvU2VjKSIsdHlwZToibnVtYmVyIn0se2lkOiJvcGVyYXRpb25hbF9pbnRlbnNpdHkiLGxhYmVsOiJPcGVyYXRpb25hbCBJbnRlbnNpdHkgKEZMT1BzL0J5dGUpIix0eXBlOiJudW1iZXIifSx7aWQ6ImJvdW5kX2J5IixsYWJlbDoiQm91bmQgYnkiLHR5cGU6InN0cmluZyJ9XSxwOnthcmNoaXRlY3R1cmVfdHlwZToiQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29yayAoQ05OKSIsZGV2aWNlX3RmX3Bwcm9mX2xpbms6IiIsaG9zdF90Zl9wcHJvZl9saW5rOiIiLHRhc2tfdHlwZToiVHJhaW5pbmcifSxyb3dzOlt7Yzpbe3Y6MX0se3Y6IkRldmljZSJ9LHt2OiJDb252MkQifSwKe3Y6IkNvbnYyRF9Gb2xkIn0se3Y6NTB9LHt2OjQwMDAwMDAuNX0se3Y6ODAwMDAuMDF9LHt2OjQwMDAwMDAuNX0se3Y6ODAwMDAuMDF9LHt2Oi40Nn0se3Y6LjQ2fSx7djowfSx7djowfSx7djo1NDEzLjV9LHt2Ojg1fSx7djo2My43fSx7djoiTWVtb3J5In1dfSx7Yzpbe3Y6Mn0se3Y6IkRldmljZSJ9LHt2OiJDb252MkQifSx7djoiQ29udjJEIn0se3Y6NDB9LHt2OjEyMDAwMDAuNX0se3Y6MzAwMDAuMDF9LHt2OjEyMDAwMDAuNX0se3Y6MzAwMDAuMDF9LHt2Oi4xNH0se3Y6LjZ9LHt2OjB9LHt2OjB9LHt2OjQ0Ny4yfSx7djoxMjEuNX0se3Y6My43fSx7djoiTWVtb3J5In1dfSx7Yzpbe3Y6M30se3Y6IkRldmljZSJ9LHt2OiJEZXB0aHdpc2VDb252MmROYXRpdmUifSx7djoiRGVwdGh3aXNlQ29udjJkTmF0aXZlIn0se3Y6MjV9LHt2OjIwMDAwMDAuNX0se3Y6ODAwMDAuMDJ9LHt2OjIwMDAwMDAuNX0se3Y6ODAwMDAuMDJ9LHt2Oi4yNH0se3Y6Ljg0fSx7djowfSx7djowfSx7djo1MzgzLjJ9LAp7djo2Mi44fSx7djo4NS44fSx7djoiTWVtb3J5In1dfSx7Yzpbe3Y6NH0se3Y6IkRldmljZSJ9LHt2OiJNYXgifSx7djoiQmF0Y2hNYXgifSx7djoxMH0se3Y6MTMwMDAwMC41fSx7djoxMzAwMDAuMDV9LHt2OjEzMDAwMDAuNX0se3Y6MTMwMDAwLjA1fSx7djouMTZ9LHt2OjF9LHt2OjB9LHt2OjB9LHt2OjExMS42fSx7djoyMTAuNX0se3Y6LjV9LHt2OiJNZW1vcnkifV19LHtjOlt7djo1fSx7djoiSG9zdCJ9LHt2OiJPdXRmZWVkRGVxdWV1ZVR1cGxlIn0se3Y6Ik91dGZlZWREZXF1ZXVlVHVwbGUifSx7djoyMH0se3Y6MzAwMDAwMC4xfSx7djoxNUU0fSx7djozMDAwMDAwLjF9LHt2OjE1RTR9LHt2OjB9LHt2OjB9LHt2Oi42N30se3Y6LjY3fSx7djowfSx7djowfSx7djowfSx7djoiVW5rbm93biJ9XX0se2M6W3t2OjZ9LHt2OiJIb3N0In0se3Y6Ik91dGZlZWREZXF1ZXVlVHVwbGUifSx7djoiT3V0ZmVlZERlcXVldWVUdXBsZV8xIn0se3Y6MTB9LHt2OjI1MDAwMDAuMX0se3Y6MjUwMDAwLjAxfSwKe3Y6MjUwMDAwMC4xfSx7djoyNTAwMDAuMDF9LHt2OjB9LHt2OjB9LHt2Oi4zM30se3Y6MX0se3Y6MH0se3Y6MH0se3Y6MH0se3Y6IlVua25vd24ifV19XX1dLEZJPXttZW1vcnlJZHM6WyIwIiwiMSIsIjIiXSxtZW1vcnlQcm9maWxlUGVyQWxsb2NhdG9yOnswOnthY3RpdmVBbGxvY2F0aW9uczpbe251bU9jY3VycmVuY2VzOiIxIixzbmFwc2hvdEluZGV4OiItMSIsc3BlY2lhbEluZGV4OiIwIn0se251bU9jY3VycmVuY2VzOiIxIixzbmFwc2hvdEluZGV4OiItMiIsc3BlY2lhbEluZGV4OiIxIn0se251bU9jY3VycmVuY2VzOiIxIixzbmFwc2hvdEluZGV4OiIyIixzcGVjaWFsSW5kZXg6Ii0xIn1dLG1lbW9yeVByb2ZpbGVTbmFwc2hvdHM6W3thY3Rpdml0eU1ldGFkYXRhOnthZGRyZXNzOiIyMjIzMzMiLGFsbG9jYXRpb25CeXRlczoiMjU2IixkYXRhVHlwZToiZmxvYXQiLG1lbW9yeUFjdGl2aXR5OiJBTExPQ0FUSU9OIixyZWdpb25UeXBlOiJvdXRwdXQiLHJlcXVlc3RlZEJ5dGVzOiIyMDAiLApzdGVwSWQ6IjAiLHRlbnNvclNoYXBlOiJbMywgMywgNTEyLCA1MTJdIix0Zk9wTmFtZToiZm9vL2JhciJ9LGFnZ3JlZ2F0aW9uU3RhdHM6e2ZyYWdtZW50YXRpb246LjEsZnJlZU1lbW9yeUJ5dGVzOiI1MDAwIixoZWFwQWxsb2NhdGVkQnl0ZXM6IjMwMDAiLHBlYWtCeXRlc0luVXNlOiI4NTAwIixzdGFja1Jlc2VydmVkQnl0ZXM6IjIwMDAifSx0aW1lT2Zmc2V0UHM6IjQwMDAwMDAwIn0se2FjdGl2aXR5TWV0YWRhdGE6e2FkZHJlc3M6IjIyMjMzMyIsYWxsb2NhdGlvbkJ5dGVzOiIyNTYiLGRhdGFUeXBlOiJmbG9hdCIsbWVtb3J5QWN0aXZpdHk6IkRFQUxMT0NBVElPTiIscmVnaW9uVHlwZToib3V0cHV0IixyZXF1ZXN0ZWRCeXRlczoiMjAwIixzdGVwSWQ6IjAiLHRlbnNvclNoYXBlOiJbMywgMywgNTEyLCA1MTJdIix0Zk9wTmFtZToiZm9vL2JhciJ9LGFnZ3JlZ2F0aW9uU3RhdHM6e2ZyYWdtZW50YXRpb246LjA4LGZyZWVNZW1vcnlCeXRlczoiNTI1NiIsaGVhcEFsbG9jYXRlZEJ5dGVzOiIyNzQ0IiwKcGVha0J5dGVzSW5Vc2U6Ijg1MDAiLHN0YWNrUmVzZXJ2ZWRCeXRlczoiMjAwMCJ9LHRpbWVPZmZzZXRQczoiNTAwMDAwMDAifSx7YWN0aXZpdHlNZXRhZGF0YTp7YWRkcmVzczoiMzQ1Njc4IixhbGxvY2F0aW9uQnl0ZXM6IjMwMCIsZGF0YVR5cGU6ImludDY0IixtZW1vcnlBY3Rpdml0eToiQUxMT0NBVElPTiIscmVnaW9uVHlwZToidGVtcCIscmVxdWVzdGVkQnl0ZXM6IjMwMCIsc3RlcElkOiIwIix0ZW5zb3JTaGFwZToiW10iLHRmT3BOYW1lOiJtdWxfZ3JhZC9TdW0ifSxhZ2dyZWdhdGlvblN0YXRzOntmcmFnbWVudGF0aW9uOi44LGZyZWVNZW1vcnlCeXRlczoiMzAwMCIsaGVhcEFsbG9jYXRlZEJ5dGVzOiI1MDAwIixwZWFrQnl0ZXNJblVzZToiOTUwMCIsc3RhY2tSZXNlcnZlZEJ5dGVzOiIyMDAwIn0sdGltZU9mZnNldFBzOiI3MDAwMDAwMCJ9XSxwcm9maWxlU3VtbWFyeTp7bWVtb3J5Q2FwYWNpdHk6IjEwMDAwIixwZWFrQnl0ZXNVc2FnZUxpZmV0aW1lOiI5NTAwIixwZWFrU3RhdHM6e2ZyYWdtZW50YXRpb246LjgsCmZyZWVNZW1vcnlCeXRlczoiMzAwMCIsaGVhcEFsbG9jYXRlZEJ5dGVzOiI1MDAwIixwZWFrQnl0ZXNJblVzZToiNzAwMCIsc3RhY2tSZXNlcnZlZEJ5dGVzOiIyMDAwIn0scGVha1N0YXRzVGltZVBzOiI3MDAwMDAwMCJ9LHNwZWNpYWxBbGxvY2F0aW9uczpbe2FkZHJlc3M6IjAiLGFsbG9jYXRpb25CeXRlczoiNDcwMCIsZGF0YVR5cGU6IklOVkFMSUQiLG1lbW9yeUFjdGl2aXR5OiJBTExPQ0FUSU9OIixyZWdpb25UeXBlOiJwZXJzaXN0IixyZXF1ZXN0ZWRCeXRlczoiNDcwMCIsc3RlcElkOiIwIix0ZW5zb3JTaGFwZToidW5rbm93biIsdGZPcE5hbWU6InByZWFsbG9jYXRlZC91bmtub3duIn0se2FkZHJlc3M6IjAiLGFsbG9jYXRpb25CeXRlczoiMjAwMCIsZGF0YVR5cGU6IklOVkFMSUQiLG1lbW9yeUFjdGl2aXR5OiJBTExPQ0FUSU9OIixyZWdpb25UeXBlOiJzdGFjayIscmVxdWVzdGVkQnl0ZXM6IjIwMDAiLHN0ZXBJZDoiMCIsdGVuc29yU2hhcGU6InVua25vd24iLHRmT3BOYW1lOiJzdGFjayJ9XX19LApudW1Ib3N0czoxfSxHST17aGxvTW9kdWxlOntuYW1lOiJHb29kIE1vZHVsZSIsZW50cnlDb21wdXRhdGlvbk5hbWU6ImNvbXAiLGVudHJ5Q29tcHV0YXRpb25JZDoiMCIsY29tcHV0YXRpb25zOlt7bmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25zOlt7bmFtZToiaW5zLTAiLG9wY29kZToiZnVzaW9uIixzaGFwZTp7ZWxlbWVudFR5cGU6IkYzMiIsbGF5b3V0Ontmb3JtYXQ6IkRFTlNFIixtYXhTcGFyc2VFbGVtZW50czoiMCJ9fSxpZDoiMCJ9LHtuYW1lOiJpbnMtMSIsb3Bjb2RlOiJmdXNpb24iLHNoYXBlOntlbGVtZW50VHlwZToiRjMyIixkaW1lbnNpb25zOlsiMzIiLCIxNiIsIjE2IiwiMzIiXSxsYXlvdXQ6e2Zvcm1hdDoiREVOU0UiLG1pbm9yVG9NYWpvcjpbIjMiLCIwIiwiMiIsIjEiXSxtYXhTcGFyc2VFbGVtZW50czoiMCJ9fSxtZXRhZGF0YTp7b3BUeXBlOiJSZWx1IixvcE5hbWU6InNlcXVlbnRpbGEvY29udjJkL1JlbHUiLHNvdXJjZUxpbmU6MH0saWQ6IjEifSx7bmFtZToiaW5zLTIiLApvcGNvZGU6ImZ1c2lvbiIsc2hhcGU6e2VsZW1lbnRUeXBlOiJGMzIiLGxheW91dDp7Zm9ybWF0OiJERU5TRSIsbWF4U3BhcnNlRWxlbWVudHM6IjAifX0saWQ6IjIifSx7bmFtZToiaW5zLTMiLG9wY29kZToiZnVzaW9uIixzaGFwZTp7ZWxlbWVudFR5cGU6IkYzMiIsbGF5b3V0Ontmb3JtYXQ6IkRFTlNFIixtYXhTcGFyc2VFbGVtZW50czoiMCJ9fSxpZDoiMyJ9LHtuYW1lOiJpbnMtNCIsb3Bjb2RlOiJmdXNpb24iLHNoYXBlOntlbGVtZW50VHlwZToiRjMyIixsYXlvdXQ6e2Zvcm1hdDoiREVOU0UiLG1heFNwYXJzZUVsZW1lbnRzOiIwIn19LGlkOiI0In1dLGlkOiIwIn1dfSxidWZmZXJBc3NpZ25tZW50Ontsb2dpY2FsQnVmZmVyczpbe2lkOiIwIixzaXplOiIxMDQ4NTc2IixkZWZpbmVkQXQ6e2NvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMCJ9fSx7aWQ6IjEiLHNpemU6IjIwOTc1MTIiLGRlZmluZWRBdDp7Y29tcHV0YXRpb25OYW1lOiJjb21wIiwKaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMSJ9fSx7aWQ6IjIiLHNpemU6IjMxNDU3MjgiLGRlZmluZWRBdDp7Y29tcHV0YXRpb25OYW1lOiJjb21wIixpbnN0cnVjdGlvbk5hbWU6Imlucy0yIn19LHtpZDoiMyIsc2l6ZToiNTI0Mjg4MCIsZGVmaW5lZEF0Ontjb21wdXRhdGlvbk5hbWU6ImNvbXAiLGluc3RydWN0aW9uTmFtZToiaW5zLTMifX0se2lkOiI0IixzaXplOiIxMDQ4NTc2IixkZWZpbmVkQXQ6e2NvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtNCJ9fV0sYnVmZmVyQWxsb2NhdGlvbnM6W3tpbmRleDoiMCIsc2l6ZToiMTA0ODU2NzYiLGlzVGhyZWFkTG9jYWw6ITAsaXNSZXN1YWJsZTohMSxpc0VudHJ5Q29tcHV0YXRpb25QYXJhbWV0ZXI6ITEsbWF5YmVMaXZlT3V0OiExLGFzc2lnbmVkOlt7bG9naWNhbEJ1ZmZlcklkOiIwIixvZmZzZXQ6IjAiLHNpemU6IjEwNDg1NzYifV19LHtpbmRleDoiMSIsc2l6ZToiMjA5NzUxMiIsaXNUaHJlYWRMb2NhbDohMCwKaXNSZXN1YWJsZTohMSxpc0VudHJ5Q29tcHV0YXRpb25QYXJhbWV0ZXI6ITEsbWF5YmVMaXZlT3V0OiExLGFzc2lnbmVkOlt7bG9naWNhbEJ1ZmZlcklkOiIxIixvZmZzZXQ6IjAiLHNpemU6IjIwOTc1MTIifV19LHtpbmRleDoiMiIsc2l6ZToiMzE0NTcyOCIsaXNUaHJlYWRMb2NhbDohMCxpc1Jlc3VhYmxlOiExLGlzRW50cnlDb21wdXRhdGlvblBhcmFtZXRlcjohMSxtYXliZUxpdmVPdXQ6ITEsYXNzaWduZWQ6W3tsb2dpY2FsQnVmZmVySWQ6IjIiLG9mZnNldDoiMCIsc2l6ZToiMzE0NTcyOCJ9XX0se2luZGV4OiIzIixzaXplOiI1MjQyODgwIixpc1RocmVhZExvY2FsOiEwLGlzUmVzdWFibGU6ITEsaXNFbnRyeUNvbXB1dGF0aW9uUGFyYW1ldGVyOiExLG1heWJlTGl2ZU91dDohMSxhc3NpZ25lZDpbe2xvZ2ljYWxCdWZmZXJJZDoiMyIsb2Zmc2V0OiIwIixzaXplOiI1MjQyODgwIn1dfSx7aW5kZXg6IjQiLHNpemU6IjEwNDg1Njc2Iixpc1RocmVhZExvY2FsOiEwLGlzUmVzdWFibGU6ITEsCmlzRW50cnlDb21wdXRhdGlvblBhcmFtZXRlcjohMSxtYXliZUxpdmVPdXQ6ITEsYXNzaWduZWQ6W3tsb2dpY2FsQnVmZmVySWQ6IjQiLG9mZnNldDoiMCIsc2l6ZToiMTA0ODU3NiJ9XX1dLGhlYXBTaW11bGF0b3JUcmFjZXM6W3tldmVudHM6W3traW5kOiJBTExPQyIsYnVmZmVySWQ6IjAiLGNvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMCJ9LHtraW5kOiJBTExPQyIsYnVmZmVySWQ6IjEiLGNvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMSJ9LHtraW5kOiJBTExPQyIsYnVmZmVySWQ6IjIiLGNvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMiJ9LHtraW5kOiJBTExPQyIsYnVmZmVySWQ6IjMiLGNvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtMyJ9LHtraW5kOiJGUkVFIixidWZmZXJJZDoiMyIsY29tcHV0YXRpb25OYW1lOiJjb21wIixpbnN0cnVjdGlvbk5hbWU6Imlucy0zIn0sCntraW5kOiJGUkVFIixidWZmZXJJZDoiMiIsY29tcHV0YXRpb25OYW1lOiJjb21wIixpbnN0cnVjdGlvbk5hbWU6Imlucy0yIn0se2tpbmQ6IkZSRUUiLGJ1ZmZlcklkOiIxIixjb21wdXRhdGlvbk5hbWU6ImNvbXAiLGluc3RydWN0aW9uTmFtZToiaW5zLTEifSx7a2luZDoiQUxMT0MiLGJ1ZmZlcklkOiI0Iixjb21wdXRhdGlvbk5hbWU6ImNvbXAiLGluc3RydWN0aW9uTmFtZToiaW5zLTQifSx7a2luZDoiRlJFRSIsYnVmZmVySWQ6IjQiLGNvbXB1dGF0aW9uTmFtZToiY29tcCIsaW5zdHJ1Y3Rpb25OYW1lOiJpbnMtNCJ9LHtraW5kOiJGUkVFIixidWZmZXJJZDoiMCIsY29tcHV0YXRpb25OYW1lOiJjb21wIixpbnN0cnVjdGlvbk5hbWU6Imlucy0wIn1dfV19fSxIST17YnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsbWV0cmljczp7dGltZToxLGZsb3BzOi40LG1lbW9yeUJhbmR3aWR0aDouMDV9LGNoaWxkcmVuOlt7bmFtZToiR29vZCBvcHMiLG1ldHJpY3M6e3RpbWU6LjYsZmxvcHM6LjR9LApjYXRlZ29yeTp7fSxjaGlsZHJlbjpbe25hbWU6IiVjb252b2x1dGlvbiIsbWV0cmljczp7dGltZTouMixmbG9wczouMTh9LHhsYTp7b3A6ImNvbnZvbHV0aW9uIixleHByZXNzaW9uOiIlY29udm9sdXRpb24gPSBzb21ldGhpbmciLHByb3ZlbmFuY2U6IkNvbnZvbHV0aW9uMkQiLGNhdGVnb3J5OiJHb29kIG9wcyIsbGF5b3V0OntkaW1lbnNpb25zOlt7c2l6ZToyMDAsYWxpZ25tZW50OjEyOCxzZW1hbnRpY3M6ImZlYXR1cmUifSx7c2l6ZTo4LGFsaWdubWVudDo4LHNlbWFudGljczoiYmF0Y2gifSx7c2l6ZToyNTYsYWxpZ25tZW50OjAsc2VtYW50aWNzOiJzcGF0aWFsIn1dfX0sY2hpbGRyZW46W119LHtuYW1lOiIlZnVzaW9uIixtZXRyaWNzOnt0aW1lOi40LGZsb3BzOi4yMn0seGxhOntvcDoiZnVzaW9uOmtPdXRwdXQiLGV4cHJlc3Npb246IiVmdXNpb24gPSBzb21ldGhpbmciLHByb3ZlbmFuY2U6IiIsY2F0ZWdvcnk6Ikdvb2Qgb3BzIn0sY2hpbGRyZW46W3tuYW1lOiIlZG90LjEiLAp4bGE6e29wOiJkb3QiLGV4cHJlc3Npb246IiVkb3QuMSA9IHNvbWV0aGluZyIscHJvdmVuYW5jZToiVGZPcEZvckZ1c2VkRG90IixjYXRlZ29yeToiR29vZCBvcHMifSxjaGlsZHJlbjpbXX0se25hbWU6IiVkb3QuMiIseGxhOntvcDoiZG90IixleHByZXNzaW9uOiIlZG90LjIgPSBzb21ldGhpbmciLHByb3ZlbmFuY2U6IiIsY2F0ZWdvcnk6Ikdvb2Qgb3BzIn0sY2hpbGRyZW46W119XX1dfSx7bmFtZToiT3ZlcmhlYWQiLG1ldHJpY3M6e3RpbWU6LjQsZmxvcHM6MH0sY2F0ZWdvcnk6e30sY2hpbGRyZW46W3tuYW1lOiIlaW5mZWVkIixtZXRyaWNzOnt0aW1lOi40LGZsb3BzOjB9LHhsYTp7b3A6ImluZmVlZCIsZXhwcmVzc2lvbjoiJWluZmVlZCA9IHNvbWV0aGluZyIscHJvdmVuYW5jZToiIixjYXRlZ29yeToiT3ZlcmhlYWQifSxjaGlsZHJlbjpbXX1dfV19LGJ5UHJvZ3JhbTp7bmFtZToiYnlQcm9ncmFtIixtZXRyaWNzOnt0aW1lOjEsZmxvcHM6LjM3LG1lbW9yeUJhbmR3aWR0aDouMDU3fSwKY2hpbGRyZW46W119fSxJST17cG9kU3RhdHNTZXF1ZW5jZTp7cG9kU3RhdHNNYXA6W3thbGxSZWR1Y2VPcERiOlt7ZGF0YVNpemU6IjMwNjYxNjMyIixkdXJhdGlvblVzOjEwODExLjUsbmFtZToiYWxsLXJlZHVjZSIscmVwbGljYUdyb3Vwczpbe3JlcGxpY2FJZHM6WyIwIl19XX0se2RhdGFTaXplOiIyMDQ4IixkdXJhdGlvblVzOjI1MjEuMTYsbmFtZToiYWxsLXJlZHVjZS4xIixyZXBsaWNhR3JvdXBzOlt7cmVwbGljYUlkczpbIjAiXX1dfSx7ZGF0YVNpemU6IjEyMzU2NjA4IixkdXJhdGlvblVzOjQ2My41NyxuYW1lOiJhbGwtcmVkdWNlLjIiLHJlcGxpY2FHcm91cHM6W3tyZXBsaWNhSWRzOlsiMCJdfV19XSxjaGFubmVsRGI6W3tjaGFubmVsSWQ6IjE2NDM2IixkYXRhU2l6ZToiMjc2NDgwMCIsZHVyYXRpb25VczozNC4wMSxobG9OYW1lczpbInNlbmQuNDIiLCJyZWN2LWRvbmUuNTIiXSxzcmNDb3JlSWRzOlswLDNdLGRzdENvcmVJZHM6WzEsMl0sc2VuZERlbGF5VXM6MH0se2NoYW5uZWxJZDoiMTc2NDMiLApkYXRhU2l6ZToiMjA0ODAiLGR1cmF0aW9uVXM6Mjc2LjYsaGxvTmFtZXM6WyJyZWN2LWRvbmUuMTAwIiwic2VuZC44MyJdLHNyY0NvcmVJZHM6WzNdLGRzdENvcmVJZHM6WzBdLHNlbmREZWxheVVzOjczLjI1fV0sY29yZUlkVG9SZXBsaWNhSWRNYXA6ezA6MCwxOjAsMjowLDM6MH0scG9kU3RhdHNQZXJDb3JlOnswOntjaGlwSWQ6MSxhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VczozMjk2LjIyLGFsbFJlZHVjZVN5bmNEdXJhdGlvblVzOi40MDU3MSxoaWdoRmxvcHNDb21wdXRlVXM6MjA3MjMzLjY4LGhvc3RJbmZlZWREdXJhdGlvblVzOjE3MTQuOTYsaG9zdE5hbWU6Im5qc3cxOjE0MDU5Iixob3N0T3V0ZmVlZER1cmF0aW9uVXM6MCxub2RlSWQ6MCxyZWN2RHVyYXRpb25Vczo0MDc3My43MixzZW5kRHVyYXRpb25VczoxODE1NC4zNSx0b3RhbER1cmF0aW9uVXM6Mzk4MjE1Ljg1fSwxOntjaGlwSWQ6MSxhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VczozMjk2LjIyLGFsbFJlZHVjZVN5bmNEdXJhdGlvblVzOi40MDU3MSwKaGlnaEZsb3BzQ29tcHV0ZVVzOjIwNzIwMS4wNixob3N0SW5mZWVkRHVyYXRpb25VczoxNzE5Ljc3LGhvc3ROYW1lOiJuanN3MToxNDA1OSIsaG9zdE91dGZlZWREdXJhdGlvblVzOjAsbm9kZUlkOjEscmVjdkR1cmF0aW9uVXM6Mzc3NzIuMDUsc2VuZER1cmF0aW9uVXM6MTczNTQuOTEsdG90YWxEdXJhdGlvblVzOjM5ODIyMy41MX0sMjp7Y2hpcElkOjAsYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXM6MzI5Ni4yMixhbGxSZWR1Y2VTeW5jRHVyYXRpb25VczozNi4wMixoaWdoRmxvcHNDb21wdXRlVXM6MjE0MTQyLjAxLGhvc3RJbmZlZWREdXJhdGlvblVzOjE3MjUuMzEsaG9zdE5hbWU6Im5qc3cxOjE0MDU5Iixob3N0T3V0ZmVlZER1cmF0aW9uVXM6LjMzLG5vZGVJZDowLHJlY3ZEdXJhdGlvblVzOjMxMjc3LjU4LHNlbmREdXJhdGlvblVzOjkyNDMuNzYsdG90YWxEdXJhdGlvblVzOjM5ODIxOC44MX0sMzp7Y2hpcElkOjAsYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXM6MzI5Ni4yMiwKYWxsUmVkdWNlU3luY0R1cmF0aW9uVXM6MzYuMDIsaGlnaEZsb3BzQ29tcHV0ZVVzOjIwOTMzMC41MSxob3N0SW5mZWVkRHVyYXRpb25VczoxNzIwLjcxLGhvc3ROYW1lOiJuanN3MToxNDA1OSIsaG9zdE91dGZlZWREdXJhdGlvblVzOjAsbm9kZUlkOjEscmVjdkR1cmF0aW9uVXM6MjIzNTYuNTEsc2VuZER1cmF0aW9uVXM6MTUwNjguNzksdG90YWxEdXJhdGlvblVzOjM5ODIyMS4wOH19LHN0ZXBOdW06MjIyfV19LHJ1bkVudmlyb25tZW50Ont0b3BvbG9neTp7eERpbWVuc2lvbjoiMiIseURpbWVuc2lvbjoiMSJ9LHRwdVR5cGU6IlRQVSB2MiJ9fSxKST1be2NvbHM6W3tpZDoicmFuayIsbGFiZWw6IlJhbmsiLHR5cGU6Im51bWJlciJ9LHtpZDoia2VybmVsX25hbWUiLGxhYmVsOiJLZXJuZWwgTmFtZSIsdHlwZToic3RyaW5nIn0se2lkOiJyZWdpc3RlcnNfcGVyX3RocmVhZCIsbGFiZWw6IlJlZ2lzdGVycyBwZXIgdGhyZWFkIix0eXBlOiJudW1iZXIifSx7aWQ6InNobWVtX2J5dGVzIiwKbGFiZWw6IlNoYXJlZCBNZW0gYnl0ZXMiLHR5cGU6Im51bWJlciJ9LHtpZDoiYmxvY2tfZGltIixsYWJlbDoiQmxvY2sgZGltIix0eXBlOiJzdHJpbmcifSx7aWQ6ImdyaWRfZGltIixsYWJlbDoiR3JpZCBkaW0iLHR5cGU6InN0cmluZyJ9LHtpZDoiaXNfb3BfdGVuc29yX2NvcmVfZWxpZ2libGUiLGxhYmVsOiJPcCBpcyBUZW5zb3JDb3JlIGVsaWdpYmxlIix0eXBlOiJib29sZWFuIn0se2lkOiJpc19rZXJuZWxfdXNpbmdfdGVuc29yX2NvcmUiLGxhYmVsOiJLZXJuZWwgdXNlcyBUZW5zb3JDb3JlIix0eXBlOiJib29sZWFuIn0se2lkOiJvcF9uYW1lIixsYWJlbDoiT3AgTmFtZSIsdHlwZToic3RyaW5nIn0se2lkOiJvY2N1cnJlbmNlcyIsbGFiZWw6Ik9jY3VycmVuY2VzIix0eXBlOiJudW1iZXIifSx7aWQ6InRvdGFsX2R1cmF0aW9uX3VzIixsYWJlbDoiVG90YWwgRHVyYXRpb24gKHVzKSIsdHlwZToibnVtYmVyIn0se2lkOiJhdmdfZHVyYXRpb25fdXMiLGxhYmVsOiJBdmcgRHVyYXRpb24gKHVzKSIsCnR5cGU6Im51bWJlciJ9LHtpZDoibWluX2R1cmF0aW9uX3VzIixsYWJlbDoiTWluIER1cmF0aW9uICh1cykiLHR5cGU6Im51bWJlciJ9LHtpZDoibWF4X2R1cmF0aW9uX3VzIixsYWJlbDoiTWF4IER1cmF0aW9uICh1cykiLHR5cGU6Im51bWJlciJ9XSxyb3dzOlt7Yzpbe3Y6MX0se3Y6InZvbHRhX3NnZW1tXzY0eDY0X25uIn0se3Y6MTI2fSx7djo4NDQ4fSx7djoiNjQsMSwxIn0se3Y6IjQsMTU0NywxIn0se3Y6ITB9LHt2OiExfSx7djoibW9kZWxfMS9kZW5zZS9NYXRNdWwifSx7djo1MjB9LHt2OjQ3Mzg1Mi42OTF9LHt2OjkxMS4yNjF9LHt2OjkwNC4xOTF9LHt2OjkyMi42MjF9XX0se2M6W3t2OjJ9LHt2OiJ2b2x0YV9zZ2VtbV8zMngxMjhfbm4ifSx7djo1NX0se3Y6MTYzODR9LHt2OiIyNTYsMSwxIn0se3Y6IjQsNzc0LDEifSx7djohMX0se3Y6ITF9LHt2OiJtb2RlbF8xL2RlbnNlXzEvTWF0TXVsIn0se3Y6NTIwfSx7djoyNjU5NjAuNzUyfSx7djo1MTEuNDYyfSx7djo1MDUuODUyfSwKe3Y6NTE5LjE3fV19LHtjOlt7djozfSx7djoidm9pZCB0ZW5zb3JmbG93OjpCaWFzTkhXQ0tlcm5lbChpbnQsIGZsb2F0IGNvbnN0KiwgZmxvYXQgY29uc3QqLCBmbG90KiwgaW50KSJ9LHt2OjIwfSx7djowfSx7djoiMTAyNCwxLDEifSx7djoiODAsMSwxIn0se3Y6ITF9LHt2OiEwfSx7djoibW9kZWxfMS9kZW5zZS9CaWFzQWRkIn0se3Y6NTIwfSx7djoxNTMwNjEuOTgxfSx7djoyOTQuMzUyfSx7djoyODkuNzkxfSx7djozMDIuMDgyfV19LHtjOlt7djo0fSx7djoidm9pZCBFaWdlbjo6aW50ZXJuYWw6OkVpZ2VuTWV0YUtlcm5lbCBjb25zdCwgRWlnZW46OmFycmF5IGNvbnN0LCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiA+LCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdD4gY29uc3QsIEVpZ2VuOjpHcHVEZXZpY2U+LCBpbnQ+KEVpZ2VuOjpUZW5zb3JFdmFsdWF0b3IgY29uc3QsIEVpZ2VuOjphcnJheSBjb25zdCwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gPiwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gY29uc3Q+IGNvbnN0LCBFaWdlbjo6R3B1RGV2aWNlPiwgaW50KSJ9LAp7djoxNn0se3Y6MH0se3Y6IjEwMjQsMSwxIn0se3Y6IjE2MCwxLDEifSx7djohMH0se3Y6ITB9LHt2OiJtb2RlbF8xL2NvbmNhdGVuYXRlL2NvbmNhdCJ9LHt2OjEwNDB9LHt2OjE0MjUzNC4yNTF9LHt2OjEzNy4wNTJ9LHt2OjEzNC4xNDJ9LHt2OjE0MS4zMTN9XX0se2M6W3t2OjV9LHt2OiJ2b2lkIEVpZ2VuOjppbnRlcm5hbDo6RWlnZW5NZXRhS2VybmVsLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiwgRWlnZW46OlRlbnNvckN3aXNlQmluYXJ5T3AsIEVpZ2VuOjpUZW5zb3JNYXAsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+IGNvbnN0LCBFaWdlbjo6VGVuc29yQ3dpc2VCaW5hcnlOdWxsYXJ5T3AsIEVpZ2VuOjpUZW5zb3JNYXAsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+IGNvbnN0PiBjb25zdD4gY29uc3Q+IGNvbnN0LCBFaWdlbjo6R3B1RGV2aWNlPiwgbG9uZz4oRWlnbmU6OlRlbnNvckV2YWx1YXRvciwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4sIEVpZ2VuOjpUZW5zb3JDd2lzZUJpbmFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdCwgRWlnZW46OlRlbnNvckN3aXNlQmluYXJ5TnVsbGFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdD4gY29uc3Q+IGNvbnN0PiBjb25zdCwgRWlnZW46OkdwdURldmljZT4sIGxvbmcpIn0sCnt2OjI2fSx7djowfSx7djoiMTAyNCwxLDEifSx7djoiMTYwLDEsMSJ9LHt2OiExfSx7djohMX0se3Y6Im1vZGVsXzEvZGVuc2UvUmVsdSJ9LHt2OjUyMH0se3Y6MTMyMDA2LjU2MX0se3Y6MjUzLjg2MX0se3Y6MjUwLjg4MX0se3Y6MjU4LjA1MX1dfSx7Yzpbe3Y6Nn0se3Y6InZvaWQgdGVuc29yZmxvdzo6R2F0aGVyT3BLZXJuZWwoZmxvYXQgY29uc3QqLCBpbnQgY29uc3QqLCBmbG9hdCosIGxvbmcgbG9uZywgbG9uZyBsb25nLCBsb25nIGxvbmcsIGxvbmcgbG9uZykifSx7djoyMn0se3Y6MH0se3Y6IjEwMjQsMSwxIn0se3Y6IjgwLDEsMSJ9LHt2OiEwfSx7djohMH0se3Y6Im1vZGVsXzEvZW1iZWRkaW5nX3VzZXIvZW1iZWRkaW5nX2xvb2t1cCJ9LHt2OjUyMH0se3Y6MTI4ODY1Ljk2Mn0se3Y6MjQ3LjgyMX0se3Y6MjQ0Ljc0Mn0se3Y6MjUzLjk1fV19LHtjOlt7djo3fSx7djoidm9pZCB0ZW5zb3JmbG93OjpHYXRoZXJPcEtlcm5lbChmbG9hdCBjb25zdCosIGludCBjb25zdCosIGZsb2F0KiwgbG9uZyBsb25nLCBsb25nIGxvbmcsIGxvbmcgbG9uZywgbG9uZyBsb25nKSJ9LAp7djoyMn0se3Y6MH0se3Y6IjEwMjQsMSwxIn0se3Y6IjgwLDEsMSJ9LHt2OiEwfSx7djohMH0se3Y6Im1vZGVsXzEvZW1iZWRkaW5nX2l0ZW0vZW1iZWRkaW5nX2xvb2t1cCJ9LHt2OjUyMH0se3Y6MTI0NTIyLjE0MX0se3Y6MjM5LjQ2MX0se3Y6MjM2LjU0Mn0se3Y6MjQ3LjgxMX1dfSx7Yzpbe3Y6OH0se3Y6InZvaWQgdGVuc29yZmxvdzo6Qmlhc05IV0NLZXJuZWwoaW50LCBmbG9hdCBjb25zdCosIGZsb2F0IGNvbnN0KiwgZmxvYXQqLCBpbnQpIn0se3Y6MjB9LHt2OjB9LHt2OiIxMDI0LDEsMSJ9LHt2OiI4MCwxLDEifSx7djohMH0se3Y6ITF9LHt2OiJtb2RlbF8xL2RlbnNlXzEvQmlhc0FkZCJ9LHt2OjUyMH0se3Y6NzY4MjguNDgxfSx7djoxNDcuNzUxfSx7djoxNDUuNDExfSx7djoxNTUuNjUyfV19LHtjOlt7djo5fSx7djoidm9sdGFfc2dlbW1fMzJ4MTI4X25uIn0se3Y6NTV9LHt2OjE2Mzg0fSx7djoiMjU2LDEsMSJ9LHt2OiIyLDc3NCwxIn0se3Y6ITF9LHt2OiExfSx7djoibW9kZWxfMS9kZW5zZV8yL01hdE11bCJ9LAp7djo1MTl9LHt2Ojc2MTU0LjY2Mn0se3Y6MTQ2LjczMX0se3Y6MTQ0LjM4Mn0se3Y6MTQ4LjQ4MX1dfSx7Yzpbe3Y6MTB9LHt2OiJ2b2lkIEVpZ2VuOjppbnRlcm5hbDo6RWlnZW5NZXRhS2VybmVsIGNvbnN0LCBFaWdlbjo6YXJyYXkgY29uc3QsIEVpZ2VuOjpUZW5zb3JNYXAsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+ID4sIEVpZ2VuOjpUZW5zb3JNYXAsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+IGNvbnN0PiBjb25zdCwgRWlnZW46OkdwdURldmljZT4sIGludD4oRWlnZW46OlRlbnNvckV2YWx1YXRvciBjb25zdCwgRWlnZW46OmFycmF5IGNvbnN0LCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiA+LCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdD4gY29uc3QsIEVpZ2VuOjpHcHVEZXZpY2U+LCBpbnQpIn0se3Y6MTZ9LHt2OjB9LHt2OiIxMDI0LDEsMSJ9LHt2OiIxNjAsMSwxIn0se3Y6ITF9LHt2OiEwfSx7djoibW9kZWxfMS9jb25jYXRlbmF0ZV8xL2NvbmNhdCJ9LAp7djoxMDM4fSx7djo3MzEzNy45NzF9LHt2OjcwLjQ2MX0se3Y6NjguNjExfSx7djo3Mi43MDJ9XX0se2M6W3t2OjExfSx7djoidm9pZCBFaWdlbjo6aW50ZXJuYWw6OkVpZ2VuTWV0YUtlcm5lbCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4sIEVpZ2VuOjpUZW5zb3JDd2lzZUJpbmFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdCwgRWlnZW46OlRlbnNvckN3aXNlQmluYXJ5TnVsbGFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdD4gY29uc3Q+IGNvbnN0PiBjb25zdCwgRWlnZW46OkdwdURldmljZT4sIGludD4oRWlnbmU6OlRlbnNvckV2YWx1YXRvciwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4sIEVpZ2VuOjpUZW5zb3JDd2lzZUJpbmFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdCwgRWlnZW46OlRlbnNvckN3aXNlQmluYXJ5TnVsbGFyeU9wLCBFaWdlbjo6VGVuc29yTWFwLCAxNiwgRWlnZW46Ok1ha2VQb2ludGVyPiBjb25zdD4gY29uc3Q+IGNvbnN0PiBjb25zdCwgRWlnZW46OkdwdURldmljZT4sIGludCkifSwKe3Y6MTZ9LHt2OjB9LHt2OiIxMDI0LDEsMSJ9LHt2OiIxNjAsMSwxIn0se3Y6ITF9LHt2OiExfSx7djoibW9kZWxfMS9lbWJlZGRpbmdfdXNlcl9taXAvc3RyaWRlZF9zbGljZSJ9LHt2OjUyMH0se3Y6NzA3OTguMTMxfSx7djoxMzYuMTUxfSx7djoxMzMuMTIxfSx7djoxNDguNDgyfV19LHtjOlt7djoxMn0se3Y6InZvaWQgRWlnZW46OmludGVybmFsOjpFaWdlbk1ldGFLZXJuZWwsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+LCBFaWdlbjo6VGVuc29yQ3dpc2VCaW5hcnlPcCwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gY29uc3QsIEVpZ2VuOjpUZW5zb3JDd2lzZUJpbmFyeU51bGxhcnlPcCwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gY29uc3Q+IGNvbnN0PiBjb25zdD4gY29uc3QsIEVpZ2VuOjpHcHVEZXZpY2U+LCBpbnQ+KEVpZ25lOjpUZW5zb3JFdmFsdWF0b3IsIDE2LCBFaWdlbjo6TWFrZVBvaW50ZXI+LCBFaWdlbjo6VGVuc29yQ3dpc2VCaW5hcnlPcCwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gY29uc3QsIEVpZ2VuOjpUZW5zb3JDd2lzZUJpbmFyeU51bGxhcnlPcCwgRWlnZW46OlRlbnNvck1hcCwgMTYsIEVpZ2VuOjpNYWtlUG9pbnRlcj4gY29uc3Q+IGNvbnN0PiBjb25zdD4gY29uc3QsIEVpZ2VuOjpHcHVEZXZpY2U+LCBpbnQpIn0sCnt2OjE2fSx7djowfSx7djoiMTAyNCwxLDEifSx7djoiMTYwLDEsMSJ9LHt2OiExfSx7djohMX0se3Y6Im1vZGVsXzEvZW1iZWRkaW5nX2l0ZW1fbWlwL3N0cmlkZWRfc2xpY2UifSx7djo1MjB9LHt2OjcwNzgzLjgyMn0se3Y6MTM2LjEyMX0se3Y6MTMzLjEyMX0se3Y6MTQ5LjUwMn1dfV0scDp7fX1dO3ZhciBLST1mdW5jdGlvbihhLGIpe3RoaXMuRXM9YTt0aGlzLkJvPSExO3RoaXMucGF0aFByZWZpeD0iIjt0aGlzLkJvPSIvIj09PWIucGF0aG5hbWU7U3RyaW5nKGIucGF0aG5hbWUpLmluY2x1ZGVzKCIvZGF0YS9wbHVnaW4vcHJvZmlsZSIpJiYodGhpcy5wYXRoUHJlZml4PVN0cmluZyhiLnBhdGhuYW1lKS5zcGxpdCgiL2RhdGEvcGx1Z2luL3Byb2ZpbGUiKVswXSl9OwpLSS5wcm90b3R5cGUuQXg9ZnVuY3Rpb24oYSl7aWYodGhpcy5CbylyZXR1cm4gZmkoe3Jlc3VsdDoiRG9uZSJ9KTthPShuZXcgcXQpLnNldCgic2VydmljZV9hZGRyIixhLndrKS5zZXQoImlzX3RwdV9uYW1lIixhLkVvLnRvU3RyaW5nKCkpLnNldCgiZHVyYXRpb24iLGEuZHVyYXRpb24udG9TdHJpbmcoKSkuc2V0KCJudW1fcmV0cnkiLGEuU28udG9TdHJpbmcoKSkuc2V0KCJ3b3JrZXJfbGlzdCIsYS5KcCkuc2V0KCJob3N0X3RyYWNlcl9sZXZlbCIsYS51by50b1N0cmluZygpKS5zZXQoImRldmljZV90cmFjZXJfbGV2ZWwiLGEuam8udG9TdHJpbmcoKSkuc2V0KCJweXRob25fdHJhY2VyX2xldmVsIixhLmJwLnRvU3RyaW5nKCkpO3JldHVybiB0aGlzLkVzLmdldCh0aGlzLnBhdGhQcmVmaXgrIi9kYXRhL3BsdWdpbi9wcm9maWxlL2NhcHR1cmVfcHJvZmlsZSIse3BhcmFtczphfSl9Owp2YXIgTEk9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQm8/ZmkoQUkpOmEuRXMuZ2V0KGEucGF0aFByZWZpeCsiL2RhdGEvcGx1Z2luL3Byb2ZpbGUvdG9vbHMiKX0sTUk9ZnVuY3Rpb24oYSxiLGMpe2lmKGEuQm8pcmV0dXJuIGZpKEJJKS5iKFprKDFFMykpO2I9KG5ldyBxdCkuc2V0KCJydW4iLGIpLnNldCgidGFnIixjKTtyZXR1cm4gYS5Fcy5nZXQoYS5wYXRoUHJlZml4KyIvZGF0YS9wbHVnaW4vcHJvZmlsZS9ob3N0cyIse3BhcmFtczpifSl9OwpLSS5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbihhLGIsYyl7aWYodGhpcy5CbylyZXR1cm4ib3ZlcnZpZXdfcGFnZSI9PT1ifHwib3ZlcnZpZXdfcGFnZUAiPT09Yj9maShDSSkuYihaaygxRTMpKToiaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXIiPT09Ynx8ImlucHV0X3BpcGVsaW5lX2FuYWx5emVyQCI9PT1iP2ZpKERJKS5iKFprKDFFMykpOiJ0ZW5zb3JmbG93X3N0YXRzIj09PWI/ZmkoRUkpLmIoWmsoMUUzKSk6Im1lbW9yeV92aWV3ZXIiPT09Yj9maShHSSkuYihaaygxRTMpKToib3BfcHJvZmlsZSI9PT1iP2ZpKEhJKS5iKFprKDFFMykpOiJwb2Rfdmlld2VyIj09PWI/ZmkoSUkpLmIoWmsoMUUzKSk6Imtlcm5lbF9zdGF0cyI9PT1iP2ZpKEpJKS5iKFprKDFFMykpOiJtZW1vcnlfcHJvZmlsZSI9PT1iP2ZpKEZJKS5iKFprKDFFMykpOmZpKFtdKS5iKFprKDFFMykpO2E9KG5ldyBxdCkuc2V0KCJydW4iLGEpLnNldCgidGFnIixiKS5zZXQoImhvc3QiLGMpO3JldHVybiB0aGlzLkVzLmdldCh0aGlzLnBhdGhQcmVmaXgrCiIvZGF0YS9wbHVnaW4vcHJvZmlsZS9kYXRhIix7cGFyYW1zOmF9KX07S0kucHJvdG90eXBlLlZsPWZ1bmN0aW9uKGEsYixjKXtpZigia2VybmVsX3N0YXRzIj09PWJ8fCJ0ZW5zb3JmbG93X3N0YXRzIj09PWIpYT0obmV3IHF0KS5zZXQoInJ1biIsYSkuc2V0KCJ0YWciLGIpLnNldCgiaG9zdCIsYykuc2V0KCJ0cXgiLCJvdXQ6Y3N2OyIpLHdpbmRvdy5vcGVuKHRoaXMucGF0aFByZWZpeCsiL2RhdGEvcGx1Z2luL3Byb2ZpbGUvZGF0YT8iK2EudG9TdHJpbmcoKSwiX2JsYW5rIil9O3ZhciBPST1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMub2I9YTt0aGlzLnphPSEwO3RoaXMubkY9dGhpcy5JeD0hMTt0aGlzLktnPVtdO3RoaXMuckg9MDtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0ZW5zb3Jib2FyZC1yZWxvYWQiLGZ1bmN0aW9uKCl7dmFyIGM9KG5ldyBEYXRlKS5nZXRUaW1lKCksZD0oYy1iLnJIKS8xRTM7Mjg8PWQmJihiLnJIPWMpO2IuemF8fGIuSXh8fCEoMjg+ZHx8MzI8ZCl8fE5JKGIpfSl9LFBJPWZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9T2JqZWN0LmtleXMoYSk7YT1PYmplY3QudmFsdWVzKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWIucHVzaCh7bmFtZTpjW2RdLGt4OmFbZF18fFtdfSk7Yi5zb3J0KGZ1bmN0aW9uKGUsZil7cmV0dXJuLXlJKGUubmFtZSxmLm5hbWUpfSk7cmV0dXJuIGJ9OwpPSS5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO0xJKHRoaXMub2IpLnN1YnNjcmliZShmdW5jdGlvbihiKXthLktnPVBJKGJ8fHt9KTthLm5GPTAhPT1hLktnLmxlbmd0aDthLnphPSExfSl9O3ZhciBOST1mdW5jdGlvbihhKXthLkl4PSEwO0xJKGEub2IpLnN1YnNjcmliZShmdW5jdGlvbihiKXtiPVBJKGJ8fHt9KTtKU09OLnN0cmluZ2lmeShiKSE9PUpTT04uc3RyaW5naWZ5KGEuS2cpJiZkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgicGx1Z2luLXJlbG9hZCIpKTthLkl4PSExfSl9O3ZhciBRST1mdW5jdGlvbihhKXtyZXR1cm4gWEgoZnVuY3Rpb24oYil7dmFyIGM9YlthXTshR2QoKXx8YSBpbiBifHxjb25zb2xlLndhcm4oJ0BuZ3J4L3N0b3JlOiBUaGUgZmVhdHVyZSBuYW1lICInK2ErIlwiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdGF0ZSwgdGhlcmVmb3JlIGNyZWF0ZUZlYXR1cmVTZWxlY3RvciBjYW5ub3QgYWNjZXNzIGl0LiAgQmUgc3VyZSBpdCBpcyBpbXBvcnRlZCBpbiBhIGxvYWRlZCBtb2R1bGUgdXNpbmcgU3RvcmVNb2R1bGUuZm9yUm9vdCgnIisoYSsiJywgLi4uKSBvciBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKCciKSsoYSsiJywgLi4uKS4gIElmIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGludGVuZGVkIHRvIGJlIHVuZGVmaW5lZCwgYXMgaXMgdGhlIGNhc2Ugd2l0aCByb3V0ZXIgc3RhdGUsIHRoaXMgZGV2ZWxvcG1lbnQtb25seSB3YXJuaW5nIG1lc3NhZ2UgY2FuIGJlIGlnbm9yZWQuIikpO3JldHVybiBjfSxmdW5jdGlvbihiKXtyZXR1cm4gYn0pfSgicm9vdCIpLApSST1YSChRSSxmdW5jdGlvbihhKXtyZXR1cm4gYS5HeX0pLFNJPVhIKFJJLGZ1bmN0aW9uKGEpe3JldHVybiBhLk9yfSksVEk9WEgoUUksZnVuY3Rpb24oYSl7cmV0dXJuIGEuVXl9KSxVST1YSChUSSxmdW5jdGlvbihhKXtyZXR1cm4gYS5Nbn0pLFZJPVhIKFFJLGZ1bmN0aW9uKGEpe3JldHVybiBhLmJ6fSksV0k9WEgoVkksZnVuY3Rpb24oYSl7cmV0dXJuIGEueWp9KSxYST1YSChRSSxmdW5jdGlvbihhKXtyZXR1cm4gYS5IZ30pLFlJPVhIKFFJLGZ1bmN0aW9uKGEpe3JldHVybiBhLkRifSksWkk9WEgoUUksZnVuY3Rpb24oYSl7cmV0dXJuIGEuanN9KTt2YXIgJEk9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuZGg9YTt0aGlzLktnPVtdO3RoaXMuemE9ITA7dGhpcy5xRz0iIjtiLnNlbGVjdChZSSkuc3Vic2NyaWJlKGZ1bmN0aW9uKGQpe2MuemE9ZC56YTtjLnFHPWQubWVzc2FnZX0pfTt2YXIgYUo9akgoIltIZWFwIG9iamVjdF0gU2V0IGFjdGl2ZSBoZWFwIG9iamVjdCIpLGJKPWpIKCJbT3AgUHJvZmlsZSBOb2RlXSBTZXQgYWN0aXZlIG9wIHByb2ZpbGUgbm9kZSIpLGNKPWpIKCJbUG9kIFZpZXdlciBJbmZvXSBTZXQgYWN0aXZlIHBvZCB2aWV3ZXIgaW5mbyIpLGRKPWpIKCJbQXBwIFN0YXRlXSBTZXQgY2FwdHVyaW5nIHByb2ZpbGUiKSxlSj1qSCgiW0FwcCBTdGF0ZV0gU2V0IGxvYWRpbmcgc3RhdGUiKSxmSj1qSCgiW0FwcCBTdGF0ZV0gU2V0IGN1cnJlbnQgdG9vbCBzdGF0ZSIpO3ZhciBoSj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7dGhpcy5vYj1hO3RoaXMuc3RvcmU9Yjt0aGlzLnVwZGF0ZT1uZXcgcms7dGhpcy5pST1bXTt0aGlzLmlwPVtdO3RoaXMudGFncz1bXTt0aGlzLkZlPVtdO3RoaXMudGs9dGhpcy5mZz10aGlzLnZrPSIiO2Iuc2VsZWN0KFpJKS5zdWJzY3JpYmUoZnVuY3Rpb24oZCl7Z0ooYyxkKX0pfSxnSj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO2Euc3RvcmUueGEoZUooe0RiOnt6YTohMCxtZXNzYWdlOiJMb2FkaW5nIGRhdGEifX0pKTt2YXIgYz1hLmlJLmZpbmQoZnVuY3Rpb24oZCl7cmV0dXJuIGQubmFtZT09PWEudmt9KTtjJiZjLmt4JiYwPGMua3gubGVuZ3RoPyhhLnRhZ3M9Yy5reCxhLmZnPWEudGFncy5maW5kKGZ1bmN0aW9uKGQpe3JldHVybiBkPT09Ynx8ZD09PWIrIkAifHxkPT09YisiIyJ9KXx8YS50YWdzWzBdLGEuSnQoKSk6KGEudGFncz1bXSxhLmZnPSIiLGEuRmU9W10sYS50az0iIixpSihhKSl9OwpoSi5wcm90b3R5cGUuSnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuc3RvcmUueGEoZUooe0RiOnt6YTohMCxtZXNzYWdlOiJMb2FkaW5nIGRhdGEifX0pKTt2YXIgYj10aGlzLnZrLGM9dGhpcy5mZzt0aGlzLkZlPVtdO3RoaXMudGs9IiI7TUkodGhpcy5vYixiLGMpLnN1YnNjcmliZShmdW5jdGlvbihkKXtkPWR8fFsiIl07MD09PWQubGVuZ3RoJiZkLnB1c2goIiIpO2Q9ZC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lPyIiOiIiPT09ZT8iZGVmYXVsdCI6ZX0pO2I9PT1hLnZrJiZjPT09YS5mZyYmKGEuRmU9ZCxhLnRrPWEuRmVbMF0saUooYSkpfSl9O3ZhciBpSj1mdW5jdGlvbihhKXthLnN0b3JlLnhhKGVKKHtEYjp7emE6ITEsbWVzc2FnZToiIn19KSk7YS51cGRhdGUuZW1pdCh7Z2E6YS52ayx0YWc6YS5mZyxob3N0OiJkZWZhdWx0Ij09PWEudGs/IiI6YS50a30pfTsKay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhoSi5wcm90b3R5cGUse0tnOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24oYSl7YSYmMDxhLmxlbmd0aCYmKHRoaXMuaUk9YSx0aGlzLmlwPWEubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBiLm5hbWV9KSx0aGlzLnZrPWFbMF0ubmFtZSxnSih0aGlzKSl9fX0pO3ZhciBqSj1mdW5jdGlvbihhKXt0aGlzLlJ4PWE7dGhpcy56eD0iQ2FwdHVyZSI7dGhpcy5ZTz0iQ2xvc2UiO3RoaXMud2s9IiI7dGhpcy5Fbz0hMTt0aGlzLkVFPSJpcCI7dGhpcy5kdXJhdGlvbj0xRTM7dGhpcy5Tbz0zO3RoaXMuSnA9IiI7dGhpcy51bz0iMiI7dGhpcy5aUD0ibG93ZXIgdHJhY2UgbGV2ZWwgdG8gcmVkdWNlIGFtb3VudCBvZiBob3N0IHRyYWNlcyBjb2xsZWN0ZWQsIHNvbWUgdG9vbHMgd2lsbCBub3QgZnVuY3Rpb24gd2VsbCB3aGVuIHRoZSBob3N0IHRyYWNlciBsZXZlbCBpcyBsZXNzIHRoYW4gaW5mbyI7dGhpcy5qbz0iMSI7dGhpcy5icD0iMCJ9O2pKLnByb3RvdHlwZS5BeD1mdW5jdGlvbigpe3RoaXMuUnguY2xvc2Uoe3drOnRoaXMud2ssRW86dGhpcy5FbyxkdXJhdGlvbjp0aGlzLmR1cmF0aW9uLFNvOnRoaXMuU28sSnA6dGhpcy5KcCx1bzpOdW1iZXIodGhpcy51byksam86TnVtYmVyKHRoaXMuam8pLGJwOk51bWJlcih0aGlzLmJwKX0pfTsKakoucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5SeC5jbG9zZSgpfTt2YXIga0o9ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5uUD1hO3RoaXMubVI9Yjt0aGlzLm9iPWM7dGhpcy5zdG9yZT1kO3RoaXMueng9IkNhcHR1cmUgUHJvZmlsZSI7dGhpcy5IZz10aGlzLnN0b3JlLnNlbGVjdChYSSl9LGxKPWZ1bmN0aW9uKGEsYil7YS5tUi5vcGVuKGIsIkNsb3NlIG5vdyEiLHtkdXJhdGlvbjo1RTN9KX07CmtKLnByb3RvdHlwZS5vcGVuRGlhbG9nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczskaCh0aGlzLm5QLm9wZW4oakopLlNwKS5zdWJzY3JpYmUoZnVuY3Rpb24oYil7YiYmKGEuc3RvcmUueGEoZEooe0hnOiEwfSkpLGEub2IuQXgoYikuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2Euc3RvcmUueGEoZEooe0hnOiExfSkpO2MmJihjLmVycm9yP2xKKGEsIkZhaWxlZCB0byBjYXB0dXJlIHByb2ZpbGU6ICIrYy5lcnJvcik6Yy5yZXN1bHQmJihsSihhLGMucmVzdWx0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInBsdWdpbi1yZWxvYWQiKSl9LDFFMykpKX0sZnVuY3Rpb24oYyl7YS5zdG9yZS54YShkSih7SGc6ITF9KSk7bEooYSwiRmFpbGVkIHRvIGNhcHR1cmUgcHJvZmlsZTogIisoYyYmYy50b1N0cmluZygpP2MudG9TdHJpbmcoKToiIikpfSkpfSl9O3ZhciBtSj1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo0MDBweH1tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMHB4fW1hdC1kaWFsb2ctYWN0aW9uc1tfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgIzAwMH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gbkooYSl7cmV0dXJuIFooMCxbbGgoMCxKbyxbXSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwyMTUsIm1hdC1kaWFsb2ctY29udGVudCIsW1siY2xhc3MiLCJtYXQtZGlhbG9nLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgyLDE2Mzg0LG51bGwsMCx2RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMjUsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwyNCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIiwKbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksCm1oKDYxNDQsbnVsbCxXRCxudWxsLFtYRF0pLEkoNiw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxLHtTYjowfSksWCgzMzU1NDQzMjAsMix7VGI6MH0pLFgoNjAzOTc5Nzc2LDMse1ZiOjB9KSxYKDMzNTU0NDMyMCw0LHtXYjowfSksWCg2MDM5Nzk3NzYsNSx7SGI6MH0pLFgoNjAzOTc5Nzc2LDYse2xiOjF9KSxYKDYwMzk3OTc3Niw3LHthYjoxfSksWCg2MDM5Nzk3NzYsOCx7SmI6MX0pLFgoNjAzOTc5Nzc2LDkse0xiOjF9KSwoYSgpKCksVygxNiwwLG51bGwsMywyLCJtYXQtbGFiZWwiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMTcsMTYzODQsW1szLDRdLFs0LDRdXSwwLFJELFtdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsbnVsbCxbIlByb2ZpbGUgU2VydmljZSBVUkwgb3IgVFBVIG5hbWUiXSkpLChhKCkoKSxXKDE5LDAsbnVsbCwxLDksImlucHV0IixbWyJjbGFzcyIsCiJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0sWyJtYXRJbnB1dCIsIiJdLFsicGxhY2Vob2xkZXIiLCJsb2NhbGhvc3Q6NjAwOSJdLFsicmVxdWlyZWQiLCIiXV0sW1sxLCJyZXF1aXJlZCIsMF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFs4LCJyZXF1aXJlZCIsMF0sWzEsInJlYWRvbmx5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsIm5nTW9kZWxDaGFuZ2UiXSxbbnVsbCwiaW5wdXQiXSwKW251bGwsImJsdXIiXSxbbnVsbCwiY29tcG9zaXRpb25zdGFydCJdLFtudWxsLCJjb21wb3NpdGlvbmVuZCJdLFtudWxsLCJmb2N1cyJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDIwKS5BcShkLnRhcmdldC52YWx1ZSkmJmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDIwKS5nYigpJiZlKTsiY29tcG9zaXRpb25zdGFydCI9PT1jJiYoZT0hMSE9PUYoYiwyMCkubHEoKSYmZSk7ImNvbXBvc2l0aW9uZW5kIj09PWMmJihlPSExIT09RihiLDIwKS5rcShkLnRhcmdldC52YWx1ZSkmJmUpOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiwyNykuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwyNykuJGEoITEpJiZlKTsiaW5wdXQiPT09YyYmKGU9ITEhPT1GKGIsMjcpLlJkKCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PWMmJihlPSExIT09KGYud2s9ZCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PWMmJihmLndrPWQudHJpbSgpKTsKcmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMjAsMTYzODQsbnVsbCwwLFN0LFtaZSx6LFsyLFJ0XV0sbnVsbCxudWxsKSxJKDIxLDE2Mzg0LG51bGwsMCxWdSxbXSx7cmVxdWlyZWQ6WzAsInJlcXVpcmVkIl19LG51bGwpLG1oKDEwMjQsbnVsbCxndSxmdW5jdGlvbihiKXtyZXR1cm5bYl19LFtWdV0pLG1oKDEwMjQsbnVsbCxQdCxmdW5jdGlvbihiKXtyZXR1cm5bYl19LFtTdF0pLEkoMjQsNjcxNzQ0LG51bGwsMCxUdSxbWzgsbnVsbF0sWzYsZ3VdLFs4LG51bGxdLFs2LFB0XV0se21vZGVsOlswLCJtb2RlbCJdfSx7dXBkYXRlOiJuZ01vZGVsQ2hhbmdlIn0pLG1oKDIwNDgsbnVsbCxWdCxudWxsLFtUdV0pLEkoMjYsMTYzODQsbnVsbCwwLFl0LFtbNCxWdF1dLG51bGwsbnVsbCksSSgyNyw1MTI4MTkyLG51bGwsMCxDRSxbeixOeixbNixWdF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0scmVxdWlyZWQ6WzEsInJlcXVpcmVkIl19LApudWxsKSxtaCgyMDQ4LFtbMSw0XSxbMiw0XV0sUEQsbnVsbCxbQ0VdKSwoYSgpKCksVygyOSwwLG51bGwsbnVsbCwxNCwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMCwwLG51bGwsbnVsbCwxMywibWF0LXJhZGlvLWdyb3VwIixbWyJhcmlhLWxhYmVsIiwiYWRkcmVzcyB0eXBlIl0sWyJjbGFzcyIsIm1hdC1yYWRpby1ncm91cCJdLFsicm9sZSIsInJhZGlvZ3JvdXAiXV0sW1syLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdXSxbW251bGwsIm5nTW9kZWxDaGFuZ2UiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJuZ01vZGVsQ2hhbmdlIj09PWMmJihlPSExIT09KGYuRUU9ZCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PQpjJiYoZi5Fbz0idHB1Ij09PWQpO3JldHVybiBlfSxudWxsLG51bGwpKSxJKDMxLDEwNjQ5NjAsbnVsbCwxLHlGLFtuZV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxMCx7dmw6MX0pLG1oKDEwMjQsbnVsbCxQdCxmdW5jdGlvbihiKXtyZXR1cm5bYl19LFt5Rl0pLEkoMzQsNjcxNzQ0LG51bGwsMCxUdSxbWzgsbnVsbF0sWzgsbnVsbF0sWzgsbnVsbF0sWzYsUHRdXSx7bW9kZWw6WzAsIm1vZGVsIl19LHt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSksbWgoMjA0OCxudWxsLFZ0LG51bGwsW1R1XSksSSgzNiwxNjM4NCxudWxsLDAsWXQsW1s0LFZ0XV0sbnVsbCxudWxsKSwoYSgpKCksWSgtMSxudWxsLFsiIEFkZHJlc3MgVHlwZTogIl0pKSwoYSgpKCksVygzOCwwLG51bGwsbnVsbCwyLCJtYXQtcmFkaW8tYnV0dG9uIixbWyJjbGFzcyIsIm1hdC1yYWRpby1idXR0b24iXSxbInZhbHVlIiwiaXAiXV0sW1syLCJtYXQtcmFkaW8tY2hlY2tlZCIsbnVsbF0sWzIsIm1hdC1yYWRpby1kaXNhYmxlZCIsCm51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzIsIm1hdC1wcmltYXJ5IixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMSwidGFiaW5kZXgiLDBdLFsxLCJpZCIsMF0sWzEsImFyaWEtbGFiZWwiLDBdLFsxLCJhcmlhLWxhYmVsbGVkYnkiLDBdLFsxLCJhcmlhLWRlc2NyaWJlZGJ5IiwwXV0sW1tudWxsLCJmb2N1cyJdXSxmdW5jdGlvbihiLGMpe3ZhciBkPSEwOyJmb2N1cyI9PT1jJiYoZD0hMSE9PUYoYiwzOSkucmguaS5mb2N1cygpJiZkKTtyZXR1cm4gZH0sRUYsREYpKSxJKDM5LDQ0NDAwNjQsW1sxMCw0XV0sMCxCRixbWzIseUZdLHosbmUsUnosSEEsWzIsa3ZdLFsyLHVGXV0se3ZhbHVlOlswLCJ2YWx1ZSJdfSxudWxsKSwoYSgpKCksWSgtMSwwLFsiSVAgQWRkcmVzcyJdKSksKGEoKSgpLFcoNDEsMCxudWxsLG51bGwsMiwibWF0LXJhZGlvLWJ1dHRvbiIsW1siY2xhc3MiLCJtYXQtcmFkaW8tYnV0dG9uIl0sWyJ2YWx1ZSIsCiJ0cHUiXV0sW1syLCJtYXQtcmFkaW8tY2hlY2tlZCIsbnVsbF0sWzIsIm1hdC1yYWRpby1kaXNhYmxlZCIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXSxbMiwibWF0LXByaW1hcnkiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImlkIiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdXSxbW251bGwsImZvY3VzIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITA7ImZvY3VzIj09PWMmJihkPSExIT09RihiLDQyKS5yaC5pLmZvY3VzKCkmJmQpO3JldHVybiBkfSxFRixERikpLEkoNDIsNDQ0MDA2NCxbWzEwLDRdXSwwLEJGLFtbMix5Rl0seixuZSxSeixIQSxbMixrdl0sWzIsdUZdXSx7dmFsdWU6WzAsInZhbHVlIl19LG51bGwpLChhKCkoKSxZKC0xLDAsWyJUUFUgTmFtZSJdKSksKGEoKSgpLFcoNDQsMCxudWxsLApudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0NSwwLG51bGwsbnVsbCwyMSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0NiwwLG51bGwsbnVsbCwyMCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSwKWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksbWgoNjE0NCxudWxsLFdELG51bGwsW1hEXSksSSg0OCw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxMSwKe1NiOjB9KSxYKDMzNTU0NDMyMCwxMix7VGI6MH0pLFgoNjAzOTc5Nzc2LDEzLHtWYjowfSksWCgzMzU1NDQzMjAsMTQse1diOjB9KSxYKDYwMzk3OTc3NiwxNSx7SGI6MH0pLFgoNjAzOTc5Nzc2LDE2LHtsYjoxfSksWCg2MDM5Nzk3NzYsMTcse2FiOjF9KSxYKDYwMzk3OTc3NiwxOCx7SmI6MX0pLFgoNjAzOTc5Nzc2LDE5LHtMYjoxfSksKGEoKSgpLFcoNTgsMCxudWxsLDEsOCwiaW5wdXQiLFtbImNsYXNzIiwibWF0LWlucHV0LWVsZW1lbnQgbWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbCJdLFsibWF0SW5wdXQiLCIiXSxbInBsYWNlaG9sZGVyIiwiUHJvZmlsaW5nIER1cmF0aW9uIChtaWxsaXNlY29uZHMpIl0sWyJ0eXBlIiwibnVtYmVyIl1dLFtbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLApbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFs4LCJyZXF1aXJlZCIsMF0sWzEsInJlYWRvbmx5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsIm5nTW9kZWxDaGFuZ2UiXSxbbnVsbCwiaW5wdXQiXSxbbnVsbCwiYmx1ciJdLFtudWxsLCJjb21wb3NpdGlvbnN0YXJ0Il0sW251bGwsImNvbXBvc2l0aW9uZW5kIl0sW251bGwsImZvY3VzIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiaW5wdXQiPT09YyYmKGU9ITEhPT1GKGIsNTkpLkFxKGQudGFyZ2V0LnZhbHVlKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsNTkpLmdiKCkmJmUpOyJjb21wb3NpdGlvbnN0YXJ0Ij09PWMmJihlPSExIT09RihiLDU5KS5scSgpJiZlKTsiY29tcG9zaXRpb25lbmQiPT09CmMmJihlPSExIT09RihiLDU5KS5rcShkLnRhcmdldC52YWx1ZSkmJmUpOyJpbnB1dCI9PT1jJiYoZT0hMSE9PUYoYiw2MCkuQWMoZC50YXJnZXQudmFsdWUpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiw2MCkuZ2IoKSYmZSk7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDY1KS4kYSghMCkmJmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDY1KS4kYSghMSkmJmUpOyJpbnB1dCI9PT1jJiYoZT0hMSE9PUYoYiw2NSkuUmQoKSYmZSk7Im5nTW9kZWxDaGFuZ2UiPT09YyYmKGU9ITEhPT0oZi5kdXJhdGlvbj1kKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoNTksMTYzODQsbnVsbCwwLFN0LFtaZSx6LFsyLFJ0XV0sbnVsbCxudWxsKSxJKDYwLDE2Mzg0LG51bGwsMCxhdSxbWmUsel0sbnVsbCxudWxsKSxtaCgxMDI0LG51bGwsUHQsZnVuY3Rpb24oYixjKXtyZXR1cm5bYixjXX0sW1N0LGF1XSksSSg2Miw2NzE3NDQsbnVsbCwwLFR1LFtbOCxudWxsXSxbOCxudWxsXSxbOCxudWxsXSwKWzYsUHRdXSx7bW9kZWw6WzAsIm1vZGVsIl19LHt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSksbWgoMjA0OCxudWxsLFZ0LG51bGwsW1R1XSksSSg2NCwxNjM4NCxudWxsLDAsWXQsW1s0LFZ0XV0sbnVsbCxudWxsKSxJKDY1LDUxMjgxOTIsbnVsbCwwLENFLFt6LE56LFs2LFZ0XSxbMixSdV0sWzIsVXVdLHFDLFs4LG51bGxdLGRDLFRdLHtwbGFjZWhvbGRlcjpbMCwicGxhY2Vob2xkZXIiXSx0eXBlOlsxLCJ0eXBlIl19LG51bGwpLG1oKDIwNDgsW1sxMSw0XSxbMTIsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFcoNjcsMCxudWxsLG51bGwsMjEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNjgsMCxudWxsLG51bGwsMjAsIm1hdC1mb3JtLWZpZWxkIixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkIl1dLFtbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsCm51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixudWxsXSxbMiwibWF0LWZvY3VzZWQiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdLFsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsCm51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSxtaCg2MTQ0LG51bGwsV0QsbnVsbCxbWERdKSxJKDcwLDc1MjAyNTYsbnVsbCw5LFhELFt6LG5lLFsyLHJDXSxbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDIwLHtTYjowfSksWCgzMzU1NDQzMjAsMjEse1RiOjB9KSxYKDYwMzk3OTc3NiwyMix7VmI6MH0pLFgoMzM1NTQ0MzIwLDIzLHtXYjowfSksWCg2MDM5Nzk3NzYsMjQse0hiOjB9KSxYKDYwMzk3OTc3NiwyNSx7bGI6MX0pLFgoNjAzOTc5Nzc2LDI2LHthYjoxfSksWCg2MDM5Nzk3NzYsMjcse0piOjF9KSxYKDYwMzk3OTc3NiwyOCx7TGI6MX0pLChhKCkoKSxXKDgwLDAsbnVsbCwxLDgsImlucHV0IixbWyJjbGFzcyIsIm1hdC1pbnB1dC1lbGVtZW50IG1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSwKWyJtYXRJbnB1dCIsIiJdLFsicGxhY2Vob2xkZXIiLCJBdXRvbWF0aWNhbGx5IHJldHJ5IE4gdGltZXMgd2hlbiBubyB0cmFjZSBldmVudCBpcyBjb2xsZWN0ZWQiXSxbInR5cGUiLCJudW1iZXIiXV0sW1syLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJtYXQtaW5wdXQtc2VydmVyIixudWxsXSxbMSwiaWQiLDBdLFsxLCJwbGFjZWhvbGRlciIsMF0sWzgsImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJuZ01vZGVsQ2hhbmdlIl0sW251bGwsImlucHV0Il0sW251bGwsImJsdXIiXSxbbnVsbCwKImNvbXBvc2l0aW9uc3RhcnQiXSxbbnVsbCwiY29tcG9zaXRpb25lbmQiXSxbbnVsbCwiZm9jdXMiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJpbnB1dCI9PT1jJiYoZT0hMSE9PUYoYiw4MSkuQXEoZC50YXJnZXQudmFsdWUpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiw4MSkuZ2IoKSYmZSk7ImNvbXBvc2l0aW9uc3RhcnQiPT09YyYmKGU9ITEhPT1GKGIsODEpLmxxKCkmJmUpOyJjb21wb3NpdGlvbmVuZCI9PT1jJiYoZT0hMSE9PUYoYiw4MSkua3EoZC50YXJnZXQudmFsdWUpJiZlKTsiaW5wdXQiPT09YyYmKGU9ITEhPT1GKGIsODIpLkFjKGQudGFyZ2V0LnZhbHVlKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsODIpLmdiKCkmJmUpOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiw4NykuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiw4NykuJGEoITEpJiZlKTsiaW5wdXQiPT09YyYmKGU9ITEhPT1GKGIsODcpLlJkKCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PQpjJiYoZT0hMSE9PShmLlNvPWQpJiZlKTtyZXR1cm4gZX0sbnVsbCxudWxsKSksSSg4MSwxNjM4NCxudWxsLDAsU3QsW1plLHosWzIsUnRdXSxudWxsLG51bGwpLEkoODIsMTYzODQsbnVsbCwwLGF1LFtaZSx6XSxudWxsLG51bGwpLG1oKDEwMjQsbnVsbCxQdCxmdW5jdGlvbihiLGMpe3JldHVybltiLGNdfSxbU3QsYXVdKSxJKDg0LDY3MTc0NCxudWxsLDAsVHUsW1s4LG51bGxdLFs4LG51bGxdLFs4LG51bGxdLFs2LFB0XV0se21vZGVsOlswLCJtb2RlbCJdfSx7dXBkYXRlOiJuZ01vZGVsQ2hhbmdlIn0pLG1oKDIwNDgsbnVsbCxWdCxudWxsLFtUdV0pLEkoODYsMTYzODQsbnVsbCwwLFl0LFtbNCxWdF1dLG51bGwsbnVsbCksSSg4Nyw1MTI4MTkyLG51bGwsMCxDRSxbeixOeixbNixWdF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0sdHlwZTpbMSwidHlwZSJdfSxudWxsKSxtaCgyMDQ4LFtbMjAsNF0sWzIxLDRdXSwKUEQsbnVsbCxbQ0VdKSwoYSgpKCksVyg4OSwwLG51bGwsbnVsbCwzOCwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg5MCwwLG51bGwsbnVsbCwzNywibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsCm51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksSSg5MSw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwyOSx7U2I6MH0pLFgoMzM1NTQ0MzIwLDMwLHtUYjowfSksWCg2MDM5Nzk3NzYsMzEse1ZiOjB9KSxYKDMzNTU0NDMyMCwKMzIse1diOjB9KSxYKDYwMzk3OTc3NiwzMyx7SGI6MH0pLFgoNjAzOTc5Nzc2LDM0LHtsYjoxfSksWCg2MDM5Nzk3NzYsMzUse2FiOjF9KSxYKDYwMzk3OTc3NiwzNix7SmI6MX0pLFgoNjAzOTc5Nzc2LDM3LHtMYjoxfSksbWgoMjA0OCxudWxsLFdELG51bGwsW1hEXSksKGEoKSgpLFcoMTAyLDAsbnVsbCwzLDIsIm1hdC1sYWJlbCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgxMDMsMTYzODQsW1szMSw0XSxbMzIsNF1dLDAsUkQsW10sbnVsbCxudWxsKSwoYSgpKCksWSgtMSxudWxsLFsiSG9zdCBUcmFjZSAoVHJhY2VNZSkgTGV2ZWwiXSkpLChhKCkoKSxXKDEwNSwxNjc3NzIxNixudWxsLDEsMjIsIm1hdC1zZWxlY3QiLFtbImNsYXNzIiwibWF0LXNlbGVjdCBtYXQtdG9vbHRpcC10cmlnZ2VyIl0sWyJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSJdLFsicm9sZSIsImxpc3Rib3giXV0sW1syLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSwKWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtbGFiZWwiLDBdLFsxLCJhcmlhLWxhYmVsbGVkYnkiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtb3ducyIsMF0sWzEsImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsMF0sWzIsIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWludmFsaWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LXJlcXVpcmVkIixudWxsXSxbMiwibWF0LXNlbGVjdC1lbXB0eSIsbnVsbF1dLFtbbnVsbCwibmdNb2RlbENoYW5nZSJdLFtudWxsLCJrZXlkb3duIl0sCltudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwxMDkpLkhhKGQpJiZlKTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMTA5KS5zZCgpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwxMDkpLnFkKCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PWMmJihlPSExIT09KGYudW89ZCkmJmUpO3JldHVybiBlfSxURixORikpLEkoMTA2LDY3MTc0NCxudWxsLDAsVHUsW1s4LG51bGxdLFs4LG51bGxdLFs4LG51bGxdLFs4LG51bGxdXSx7bW9kZWw6WzAsIm1vZGVsIl19LHt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSksbWgoMjA0OCxudWxsLFZ0LG51bGwsW1R1XSksSSgxMDgsMTYzODQsbnVsbCwwLFl0LFtbNCxWdF1dLG51bGwsbnVsbCksSSgxMDksMjA4MDc2OCxudWxsLDMsTEYsW1pBLG5lLFQscUMseixbMixOQV0sWzIsUnVdLFsyLFV1XSxbMixXRF0sWzYsVnRdLFs4LG51bGxdLEdGLAppQSxbMixJRl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMzgse29wdGlvbnM6MX0pLFgoNjAzOTc5Nzc2LDM5LHtZZzoxfSksWCg2MDM5Nzk3NzYsNDAse0ZqOjB9KSxJKDExMyw0MzQxNzYwLG51bGwsMCxkSCxbV0IseixWQSxFZixULE56LHFBLFJ6LCRHLFsyLE5BXSxbMixjSF1dLHtwb3NpdGlvbjpbMCwicG9zaXRpb24iXSxtZXNzYWdlOlsxLCJtZXNzYWdlIl19LG51bGwpLG1oKDIwNDgsW1syOSw0XSxbMzAsNF1dLFBELG51bGwsW0xGXSksbWgoMjA0OCxudWxsLHhDLG51bGwsW0xGXSksKGEoKSgpLFcoMTE2LDAsbnVsbCwxLDIsIm1hdC1vcHRpb24iLFtbImNsYXNzIiwibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwib3B0aW9uIl0sWyJ2YWx1ZSIsIjAiXV0sW1sxLCJ0YWJpbmRleCIsMF0sWzIsIm1hdC1zZWxlY3RlZCIsbnVsbF0sWzIsIm1hdC1vcHRpb24tbXVsdGlwbGUiLG51bGxdLFsyLCJtYXQtYWN0aXZlIixudWxsXSxbOCwiaWQiLDBdLFsxLAoiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMTE3KS52YygpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwxMTcpLkhhKGQpJiZlKTtyZXR1cm4gZX0sZUQsY0QpKSxJKDExNyw4NTY4ODMyLFtbMzgsNF1dLDAseUMsW3osbmUsWzIseENdLFsyLHVDXV0se3ZhbHVlOlswLCJ2YWx1ZSJdfSxudWxsKSwoYSgpKCksWSgtMSwwLFsiZGlzYWJsZSJdKSksKGEoKSgpLFcoMTE5LDAsbnVsbCwxLDIsIm1hdC1vcHRpb24iLFtbImNsYXNzIiwibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwib3B0aW9uIl0sWyJ2YWx1ZSIsIjEiXV0sW1sxLCJ0YWJpbmRleCIsMF0sWzIsIm1hdC1zZWxlY3RlZCIsbnVsbF0sWzIsIm1hdC1vcHRpb24tbXVsdGlwbGUiLApudWxsXSxbMiwibWF0LWFjdGl2ZSIsbnVsbF0sWzgsImlkIiwwXSxbMSwiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMTIwKS52YygpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwxMjApLkhhKGQpJiZlKTtyZXR1cm4gZX0sZUQsY0QpKSxJKDEyMCw4NTY4ODMyLFtbMzgsNF1dLDAseUMsW3osbmUsWzIseENdLFsyLHVDXV0se3ZhbHVlOlswLCJ2YWx1ZSJdfSxudWxsKSwoYSgpKCksWSgtMSwwLFsiY3JpdGljYWwiXSkpLChhKCkoKSxXKDEyMiwwLG51bGwsMSwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsIm9wdGlvbiJdLFsidmFsdWUiLCIyIl1dLFtbMSwidGFiaW5kZXgiLAowXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMiwibWF0LW9wdGlvbi1kaXNhYmxlZCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDEyMykudmMoKSYmZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMTIzKS5IYShkKSYmZSk7cmV0dXJuIGV9LGVELGNEKSksSSgxMjMsODU2ODgzMixbWzM4LDRdXSwwLHlDLFt6LG5lLFsyLHhDXSxbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoLTEsMCxbImluZm8iXSkpLChhKCkoKSxXKDEyNSwwLG51bGwsMSwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLApbInJvbGUiLCJvcHRpb24iXSxbInZhbHVlIiwiMyJdXSxbWzEsInRhYmluZGV4IiwwXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMiwibWF0LW9wdGlvbi1kaXNhYmxlZCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDEyNikudmMoKSYmZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMTI2KS5IYShkKSYmZSk7cmV0dXJuIGV9LGVELGNEKSksSSgxMjYsODU2ODgzMixbWzM4LDRdXSwwLHlDLFt6LG5lLFsyLHhDXSxbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoLTEsMCxbInZlcmJvc2UiXSkpLChhKCkoKSxXKDEyOCwwLG51bGwsbnVsbCwKMzEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTI5LDAsbnVsbCxudWxsLDMwLCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLApudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSxJKDEzMCw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3Niw0MSx7U2I6MH0pLFgoMzM1NTQ0MzIwLDQyLHtUYjowfSksWCg2MDM5Nzk3NzYsNDMse1ZiOjB9KSxYKDMzNTU0NDMyMCw0NCx7V2I6MH0pLFgoNjAzOTc5Nzc2LDQ1LHtIYjowfSksClgoNjAzOTc5Nzc2LDQ2LHtsYjoxfSksWCg2MDM5Nzk3NzYsNDcse2FiOjF9KSxYKDYwMzk3OTc3Niw0OCx7SmI6MX0pLFgoNjAzOTc5Nzc2LDQ5LHtMYjoxfSksbWgoMjA0OCxudWxsLFdELG51bGwsW1hEXSksKGEoKSgpLFcoMTQxLDAsbnVsbCwzLDIsIm1hdC1sYWJlbCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgxNDIsMTYzODQsW1s0Myw0XSxbNDQsNF1dLDAsUkQsW10sbnVsbCxudWxsKSwoYSgpKCksWSgtMSxudWxsLFsiRGV2aWNlIFRyYWNlIExldmVsIl0pKSwoYSgpKCksVygxNDQsMCxudWxsLDEsMTUsIm1hdC1zZWxlY3QiLFtbImNsYXNzIiwibWF0LXNlbGVjdCJdLFsicm9sZSIsImxpc3Rib3giXV0sW1syLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLApudWxsXSxbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtbGFiZWwiLDBdLFsxLCJhcmlhLWxhYmVsbGVkYnkiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtb3ducyIsMF0sWzEsImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsMF0sWzIsIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWludmFsaWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LXJlcXVpcmVkIixudWxsXSxbMiwibWF0LXNlbGVjdC1lbXB0eSIsbnVsbF1dLFtbbnVsbCwibmdNb2RlbENoYW5nZSJdLFtudWxsLCJrZXlkb3duIl0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDE0OCkuSGEoZCkmJgplKTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMTQ4KS5zZCgpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwxNDgpLnFkKCkmJmUpOyJuZ01vZGVsQ2hhbmdlIj09PWMmJihlPSExIT09KGYuam89ZCkmJmUpO3JldHVybiBlfSxURixORikpLEkoMTQ1LDY3MTc0NCxudWxsLDAsVHUsW1s4LG51bGxdLFs4LG51bGxdLFs4LG51bGxdLFs4LG51bGxdXSx7bW9kZWw6WzAsIm1vZGVsIl19LHt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSksbWgoMjA0OCxudWxsLFZ0LG51bGwsW1R1XSksSSgxNDcsMTYzODQsbnVsbCwwLFl0LFtbNCxWdF1dLG51bGwsbnVsbCksSSgxNDgsMjA4MDc2OCxudWxsLDMsTEYsW1pBLG5lLFQscUMseixbMixOQV0sWzIsUnVdLFsyLFV1XSxbMixXRF0sWzYsVnRdLFs4LG51bGxdLEdGLGlBLFsyLElGXV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3Niw1MCx7b3B0aW9uczoxfSksWCg2MDM5Nzk3NzYsNTEse1lnOjF9KSxYKDYwMzk3OTc3Niw1Mix7Rmo6MH0pLG1oKDIwNDgsCltbNDEsNF0sWzQyLDRdXSxQRCxudWxsLFtMRl0pLG1oKDIwNDgsbnVsbCx4QyxudWxsLFtMRl0pLChhKCkoKSxXKDE1NCwwLG51bGwsMSwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsIm9wdGlvbiJdLFsidmFsdWUiLCIwIl1dLFtbMSwidGFiaW5kZXgiLDBdLFsyLCJtYXQtc2VsZWN0ZWQiLG51bGxdLFsyLCJtYXQtb3B0aW9uLW11bHRpcGxlIixudWxsXSxbMiwibWF0LWFjdGl2ZSIsbnVsbF0sWzgsImlkIiwwXSxbMSwiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMTU1KS52YygpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwxNTUpLkhhKGQpJiZlKTtyZXR1cm4gZX0sCmVELGNEKSksSSgxNTUsODU2ODgzMixbWzUwLDRdXSwwLHlDLFt6LG5lLFsyLHhDXSxbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoLTEsMCxbImRpc2FibGUiXSkpLChhKCkoKSxXKDE1NywwLG51bGwsMSwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsIm9wdGlvbiJdLFsidmFsdWUiLCIxIl1dLFtbMSwidGFiaW5kZXgiLDBdLFsyLCJtYXQtc2VsZWN0ZWQiLG51bGxdLFsyLCJtYXQtb3B0aW9uLW11bHRpcGxlIixudWxsXSxbMiwibWF0LWFjdGl2ZSIsbnVsbF0sWzgsImlkIiwwXSxbMSwiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMTU4KS52YygpJiYKZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMTU4KS5IYShkKSYmZSk7cmV0dXJuIGV9LGVELGNEKSksSSgxNTgsODU2ODgzMixbWzUwLDRdXSwwLHlDLFt6LG5lLFsyLHhDXSxbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoLTEsMCxbImVuYWJsZSJdKSksKGEoKSgpLFcoMTYwLDAsbnVsbCxudWxsLDMxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDE2MSwwLG51bGwsbnVsbCwzMCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIiwKbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksCkkoMTYyLDc1MjAyNTYsbnVsbCw5LFhELFt6LG5lLFsyLHJDXSxbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDUzLHtTYjowfSksWCgzMzU1NDQzMjAsNTQse1RiOjB9KSxYKDYwMzk3OTc3Niw1NSx7VmI6MH0pLFgoMzM1NTQ0MzIwLDU2LHtXYjowfSksWCg2MDM5Nzk3NzYsNTcse0hiOjB9KSxYKDYwMzk3OTc3Niw1OCx7bGI6MX0pLFgoNjAzOTc5Nzc2LDU5LHthYjoxfSksWCg2MDM5Nzk3NzYsNjAse0piOjF9KSxYKDYwMzk3OTc3Niw2MSx7TGI6MX0pLG1oKDIwNDgsbnVsbCxXRCxudWxsLFtYRF0pLChhKCkoKSxXKDE3MywwLG51bGwsMywyLCJtYXQtbGFiZWwiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMTc0LDE2Mzg0LFtbNTUsNF0sWzU2LDRdXSwwLFJELFtdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsbnVsbCxbIlB5dGhvbiBUcmFjZSBMZXZlbCJdKSksKGEoKSgpLFcoMTc2LDAsbnVsbCwxLDE1LCJtYXQtc2VsZWN0IiwKW1siY2xhc3MiLCJtYXQtc2VsZWN0Il0sWyJyb2xlIiwibGlzdGJveCJdXSxbWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzEsImlkIiwwXSxbMSwidGFiaW5kZXgiLDBdLFsxLCJhcmlhLWxhYmVsIiwwXSxbMSwiYXJpYS1sYWJlbGxlZGJ5IiwwXSxbMSwiYXJpYS1yZXF1aXJlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLW93bnMiLDBdLFsxLCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLDBdLFsyLCJtYXQtc2VsZWN0LWRpc2FibGVkIixudWxsXSxbMiwibWF0LXNlbGVjdC1pbnZhbGlkIixudWxsXSxbMiwibWF0LXNlbGVjdC1yZXF1aXJlZCIsCm51bGxdLFsyLCJtYXQtc2VsZWN0LWVtcHR5IixudWxsXV0sW1tudWxsLCJuZ01vZGVsQ2hhbmdlIl0sW251bGwsImtleWRvd24iXSxbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMTgwKS5IYShkKSYmZSk7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDE4MCkuc2QoKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMTgwKS5xZCgpJiZlKTsibmdNb2RlbENoYW5nZSI9PT1jJiYoZT0hMSE9PShmLmJwPWQpJiZlKTtyZXR1cm4gZX0sVEYsTkYpKSxJKDE3Nyw2NzE3NDQsbnVsbCwwLFR1LFtbOCxudWxsXSxbOCxudWxsXSxbOCxudWxsXSxbOCxudWxsXV0se21vZGVsOlswLCJtb2RlbCJdfSx7dXBkYXRlOiJuZ01vZGVsQ2hhbmdlIn0pLG1oKDIwNDgsbnVsbCxWdCxudWxsLFtUdV0pLEkoMTc5LDE2Mzg0LG51bGwsMCxZdCxbWzQsVnRdXSxudWxsLG51bGwpLEkoMTgwLDIwODA3NjgsCm51bGwsMyxMRixbWkEsbmUsVCxxQyx6LFsyLE5BXSxbMixSdV0sWzIsVXVdLFsyLFdEXSxbNixWdF0sWzgsbnVsbF0sR0YsaUEsWzIsSUZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDYyLHtvcHRpb25zOjF9KSxYKDYwMzk3OTc3Niw2Myx7WWc6MX0pLFgoNjAzOTc5Nzc2LDY0LHtGajowfSksbWgoMjA0OCxbWzUzLDRdLFs1NCw0XV0sUEQsbnVsbCxbTEZdKSxtaCgyMDQ4LG51bGwseEMsbnVsbCxbTEZdKSwoYSgpKCksVygxODYsMCxudWxsLDEsMiwibWF0LW9wdGlvbiIsW1siY2xhc3MiLCJtYXQtb3B0aW9uIG1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbInJvbGUiLCJvcHRpb24iXSxbInZhbHVlIiwiMCJdXSxbWzEsInRhYmluZGV4IiwwXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMiwibWF0LW9wdGlvbi1kaXNhYmxlZCIsCm51bGxdXSxbW251bGwsImNsaWNrIl0sW251bGwsImtleWRvd24iXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwOyJjbGljayI9PT1jJiYoZT0hMSE9PUYoYiwxODcpLnZjKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDE4NykuSGEoZCkmJmUpO3JldHVybiBlfSxlRCxjRCkpLEkoMTg3LDg1Njg4MzIsW1s2Miw0XV0sMCx5QyxbeixuZSxbMix4Q10sWzIsdUNdXSx7dmFsdWU6WzAsInZhbHVlIl19LG51bGwpLChhKCkoKSxZKC0xLDAsWyJkaXNhYmxlIl0pKSwoYSgpKCksVygxODksMCxudWxsLDEsMiwibWF0LW9wdGlvbiIsW1siY2xhc3MiLCJtYXQtb3B0aW9uIG1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbInJvbGUiLCJvcHRpb24iXSxbInZhbHVlIiwiMSJdXSxbWzEsInRhYmluZGV4IiwwXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLAowXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzIsIm1hdC1vcHRpb24tZGlzYWJsZWQiLG51bGxdXSxbW251bGwsImNsaWNrIl0sW251bGwsImtleWRvd24iXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwOyJjbGljayI9PT1jJiYoZT0hMSE9PUYoYiwxOTApLnZjKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDE5MCkuSGEoZCkmJmUpO3JldHVybiBlfSxlRCxjRCkpLEkoMTkwLDg1Njg4MzIsW1s2Miw0XV0sMCx5QyxbeixuZSxbMix4Q10sWzIsdUNdXSx7dmFsdWU6WzAsInZhbHVlIl19LG51bGwpLChhKCkoKSxZKC0xLDAsWyJlbmFibGUiXSkpLChhKCkoKSxXKDE5MiwwLG51bGwsbnVsbCwyNCwiZGl2IixbXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxOTMsMCxudWxsLG51bGwsMjMsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTk0LDAsbnVsbCxudWxsLDIyLCJtYXQtZm9ybS1maWVsZCIsCltbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsCm51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksbWgoNjE0NCxudWxsLFdELG51bGwsW1hEXSksSSgxOTYsNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsNjUse1NiOjB9KSxYKDMzNTU0NDMyMCw2Nix7VGI6MH0pLFgoNjAzOTc5Nzc2LDY3LHtWYjowfSksWCgzMzU1NDQzMjAsNjgse1diOjB9KSxYKDYwMzk3OTc3Niw2OSx7SGI6MH0pLFgoNjAzOTc5Nzc2LDcwLHtsYjoxfSksWCg2MDM5Nzk3NzYsNzEse2FiOjF9KSxYKDYwMzk3OTc3NiwKNzIse0piOjF9KSxYKDYwMzk3OTc3Niw3Myx7TGI6MX0pLChhKCkoKSxXKDIwNiwwLG51bGwsMywyLCJtYXQtbGFiZWwiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMjA3LDE2Mzg0LFtbNjcsNF0sWzY4LDRdXSwwLFJELFtdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsbnVsbCxbIlN1YnNldCBvZiB3b3JrZXIgVFBVcyB0byBwcm9maWxlIChvcHRpb25hbCkiXSkpLChhKCkoKSxXKDIwOSwwLG51bGwsMSw3LCJpbnB1dCIsW1siY2xhc3MiLCJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0sWyJtYXRJbnB1dCIsIiJdLFsicGxhY2Vob2xkZXIiLCJMaXN0IG9mIElQcywgZS5nLiAxMC40LjEuMmsxMC40LjEuMyJdXSxbWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIiwKbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJtYXQtaW5wdXQtc2VydmVyIixudWxsXSxbMSwiaWQiLDBdLFsxLCJwbGFjZWhvbGRlciIsMF0sWzgsImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJuZ01vZGVsQ2hhbmdlIl0sW251bGwsImlucHV0Il0sW251bGwsImJsdXIiXSxbbnVsbCwiY29tcG9zaXRpb25zdGFydCJdLFtudWxsLCJjb21wb3NpdGlvbmVuZCJdLFtudWxsLCJmb2N1cyJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDIxMCkuQXEoZC50YXJnZXQudmFsdWUpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwyMTApLmdiKCkmJmUpOyJjb21wb3NpdGlvbnN0YXJ0Ij09PWMmJihlPSExIT09RihiLDIxMCkubHEoKSYmZSk7ImNvbXBvc2l0aW9uZW5kIj09PQpjJiYoZT0hMSE9PUYoYiwyMTApLmtxKGQudGFyZ2V0LnZhbHVlKSYmZSk7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDIxNSkuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwyMTUpLiRhKCExKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDIxNSkuUmQoKSYmZSk7Im5nTW9kZWxDaGFuZ2UiPT09YyYmKGU9ITEhPT0oZi5KcD1kKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMjEwLDE2Mzg0LG51bGwsMCxTdCxbWmUseixbMixSdF1dLG51bGwsbnVsbCksbWgoMTAyNCxudWxsLFB0LGZ1bmN0aW9uKGIpe3JldHVybltiXX0sW1N0XSksSSgyMTIsNjcxNzQ0LG51bGwsMCxUdSxbWzgsbnVsbF0sWzgsbnVsbF0sWzgsbnVsbF0sWzYsUHRdXSx7bW9kZWw6WzAsIm1vZGVsIl19LHt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSksbWgoMjA0OCxudWxsLFZ0LG51bGwsW1R1XSksSSgyMTQsMTYzODQsbnVsbCwwLFl0LFtbNCxWdF1dLG51bGwsbnVsbCksSSgyMTUsNTEyODE5MiwKbnVsbCwwLENFLFt6LE56LFs2LFZ0XSxbMixSdV0sWzIsVXVdLHFDLFs4LG51bGxdLGRDLFRdLHtwbGFjZWhvbGRlcjpbMCwicGxhY2Vob2xkZXIiXX0sbnVsbCksbWgoMjA0OCxbWzY1LDRdLFs2Niw0XV0sUEQsbnVsbCxbQ0VdKSwoYSgpKCksVygyMTcsMCxudWxsLG51bGwsOSwibWF0LWRpYWxvZy1hY3Rpb25zIixbWyJjbGFzcyIsIm1hdC1kaWFsb2ctYWN0aW9ucyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDIxOCwxNjM4NCxudWxsLDAsd0QsW10sbnVsbCxudWxsKSwoYSgpKCksVygyMTksMCxudWxsLG51bGwsMywiYnV0dG9uIixbWyJjbGFzcyIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIl1dLFtbMSwiZGlzYWJsZWQiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24oYixjKXt2YXIgZD0hMCxlPWIuYTsiY2xpY2siPT09YyYmKGQ9ITEhPT1lLkF4KCkmJmQpOwpyZXR1cm4gZH0sVUMsVEMpKSxJKDIyMCw0Mzc0NTI4LG51bGwsMCxSQyxbeixSeixbMixrdl1dLHtkaXNhYmxlZDpbMCwiZGlzYWJsZWQiXX0sbnVsbCksKGEoKSgpLFkoMjIxLDAsWyIgIiwiICJdKSksT20oMTI4LDIyMixtZSgyKSksKGEoKSgpLFcoMjIzLDAsbnVsbCxudWxsLDMsImJ1dHRvbiIsW1siY2xhc3MiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiJdXSxbWzEsImRpc2FibGVkIiwwXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxbW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNsaWNrIj09PWMmJihkPSExIT09ZS5jbG9zZSgpJiZkKTtyZXR1cm4gZH0sVUMsVEMpKSxJKDIyNCw0Mzc0NTI4LG51bGwsMCxSQyxbeixSeixbMixrdl1dLG51bGwsbnVsbCksKGEoKSgpLFkoMjI1LDAsWyIgIiwiICJdKSksT20oMTI4LDIyNixtZSgyKSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywKMjEsMCwiIik7YihjLDI0LDAsZC53ayk7YihjLDI3LDAsImxvY2FsaG9zdDo2MDA5IiwiIik7YihjLDM0LDAsZC5FRSk7YihjLDM5LDAsImlwIik7YihjLDQyLDAsInRwdSIpO2IoYyw2MiwwLGQuZHVyYXRpb24pO2IoYyw2NSwwLCJQcm9maWxpbmcgRHVyYXRpb24gKG1pbGxpc2Vjb25kcykiLCJudW1iZXIiKTtiKGMsODQsMCxkLlNvKTtiKGMsODcsMCwiQXV0b21hdGljYWxseSByZXRyeSBOIHRpbWVzIHdoZW4gbm8gdHJhY2UgZXZlbnQgaXMgY29sbGVjdGVkIiwibnVtYmVyIik7YihjLDEwNiwwLGQudW8pO2IoYywxMDksMCk7YihjLDExMywwLCJhYm92ZSIsIiIrQmcoZC5aUCkpO2IoYywxMTcsMCwiMCIpO2IoYywxMjAsMCwiMSIpO2IoYywxMjMsMCwiMiIpO2IoYywxMjYsMCwiMyIpO2IoYywxNDUsMCxkLmpvKTtiKGMsMTQ4LDApO2IoYywxNTUsMCwiMCIpO2IoYywxNTgsMCwiMSIpO2IoYywxNzcsMCxkLmJwKTtiKGMsMTgwLDApO2IoYywxODcsMCwiMCIpO2IoYywxOTAsMCwiMSIpOwpiKGMsMjEyLDAsZC5KcCk7YihjLDIxNSwwLCJMaXN0IG9mIElQcywgZS5nLiAxMC40LjEuMmsxMC40LjEuMyIpO2IoYywyMjAsMCwhZC53ayl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9InN0YW5kYXJkIj09RihjLDYpLm8sZj0iZmlsbCI9PUYoYyw2KS5vLGc9Im91dGxpbmUiPT1GKGMsNikubyxsPSJsZWdhY3kiPT1GKGMsNikubyxtPUYoYyw2KS5sLmZhLHA9RihjLDYpLnhiLHE9RihjLDYpLktiKCkscj1GKGMsNikudWIoKSx2PUYoYyw2KS5VYigpLHc9RihjLDYpLmwuZGlzYWJsZWQseD1GKGMsNikubC5BYix1PUYoYyw2KS5sLmZvY3VzZWQsRD0iYWNjZW50Ij09RihjLDYpLmNvbG9yLEg9Indhcm4iPT1GKGMsNikuY29sb3IsRT1GKGMsNikuaCgidW50b3VjaGVkIiksTj1GKGMsNikuaCgidG91Y2hlZCIpLE09RihjLDYpLmgoInByaXN0aW5lIiksSj1GKGMsNikuaCgiZGlydHkiKSxRPUYoYyw2KS5oKCJ2YWxpZCIpLFU9RihjLDYpLmgoImludmFsaWQiKSxyYT1GKGMsNikuaCgicGVuZGluZyIpLApFYT0hRihjLDYpLkViO2IoYyw0LDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYSxFYV0pO3ZhciBCPUYoYywyMSkucmVxdWlyZWQ/IiI6bnVsbCxHPUYoYywyNikucGksSz1GKGMsMjYpLm9pLG1hPUYoYywyNikubmksa2E9RihjLDI2KS5raSwkYT1GKGMsMjYpLnJpLE89RihjLDI2KS5saSxTPUYoYywyNikubWksZGE9RihjLDI3KS5RZCxDPUYoYywyNykuaWQsUD1GKGMsMjcpLnBsYWNlaG9sZGVyLFI9RihjLDI3KS5kaXNhYmxlZCxiYT1GKGMsMjcpLnJlcXVpcmVkLHVhPUYoYywyNykuRGQmJiFGKGMsMjcpLlZjfHxudWxsLEphPUYoYywyNykuRmJ8fG51bGwsdGE9RihjLDI3KS5mYSx3YT1GKGMsMjcpLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDE5LDEsW0IsRyxLLG1hLGthLCRhLE8sUyxkYSxDLFAsUixiYSx1YSxKYSx0YSx3YV0pO3ZhciBUYT1GKGMsMzYpLnBpLFFiPUYoYywzNikub2ksUmI9RihjLDM2KS5uaSxVYT1GKGMsMzYpLmtpLHNjPUYoYywKMzYpLnJpLEJlPUYoYywzNikubGksU2I9RihjLDM2KS5taTtiKGMsMzAsMCxUYSxRYixSYixVYSxzYyxCZSxTYik7dmFyIFliPUYoYywzOSkuY2hlY2tlZCxpYz1GKGMsMzkpLmRpc2FibGVkLHliPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMzkpLmlhLFNkPSJwcmltYXJ5Ij09PUYoYywzOSkuY29sb3IsYWo9ImFjY2VudCI9PT1GKGMsMzkpLmNvbG9yLGJqPSJ3YXJuIj09PUYoYywzOSkuY29sb3IsY2o9RihjLDM5KS5pZDtiKGMsMzgsMSxbWWIsaWMseWIsU2QsYWosYmosLTEsY2osbnVsbCxudWxsLG51bGxdKTt2YXIgZGo9RihjLDQyKS5jaGVja2VkLGVqPUYoYyw0MikuZGlzYWJsZWQsZmo9Ik5vb3BBbmltYXRpb25zIj09PUYoYyw0MikuaWEsZ2o9InByaW1hcnkiPT09RihjLDQyKS5jb2xvcixoaj0iYWNjZW50Ij09PUYoYyw0MikuY29sb3IsaWo9Indhcm4iPT09RihjLDQyKS5jb2xvcixqaj1GKGMsNDIpLmlkO2IoYyw0MSwxLFtkaixlaixmaixnaixoaixpaiwtMSxqaixudWxsLApudWxsLG51bGxdKTt2YXIga2o9InN0YW5kYXJkIj09RihjLDQ4KS5vLGxqPSJmaWxsIj09RihjLDQ4KS5vLG1qPSJvdXRsaW5lIj09RihjLDQ4KS5vLG5qPSJsZWdhY3kiPT1GKGMsNDgpLm8sb2o9RihjLDQ4KS5sLmZhLHBqPUYoYyw0OCkueGIscWo9RihjLDQ4KS5LYigpLHJqPUYoYyw0OCkudWIoKSxzaj1GKGMsNDgpLlViKCksdGo9RihjLDQ4KS5sLmRpc2FibGVkLHVqPUYoYyw0OCkubC5BYix2aj1GKGMsNDgpLmwuZm9jdXNlZCx3aj0iYWNjZW50Ij09RihjLDQ4KS5jb2xvcix4aj0id2FybiI9PUYoYyw0OCkuY29sb3IseWo9RihjLDQ4KS5oKCJ1bnRvdWNoZWQiKSx6aj1GKGMsNDgpLmgoInRvdWNoZWQiKSxBaj1GKGMsNDgpLmgoInByaXN0aW5lIiksQmo9RihjLDQ4KS5oKCJkaXJ0eSIpLENqPUYoYyw0OCkuaCgidmFsaWQiKSxEaj1GKGMsNDgpLmgoImludmFsaWQiKSxFaj1GKGMsNDgpLmgoInBlbmRpbmciKSxGaj0hRihjLDQ4KS5FYjtiKGMsNDYsMSxba2osbGosbWosbmosCm9qLHBqLHFqLHJqLHNqLHRqLHVqLHZqLHdqLHhqLHlqLHpqLEFqLEJqLENqLERqLEVqLEZqXSk7dmFyIEdqPUYoYyw2NCkucGksSGo9RihjLDY0KS5vaSxJaj1GKGMsNjQpLm5pLEpqPUYoYyw2NCkua2ksS2o9RihjLDY0KS5yaSxMaj1GKGMsNjQpLmxpLE1qPUYoYyw2NCkubWksTmo9RihjLDY1KS5RZCxPaj1GKGMsNjUpLmlkLFBqPUYoYyw2NSkucGxhY2Vob2xkZXIsUWo9RihjLDY1KS5kaXNhYmxlZCxSaj1GKGMsNjUpLnJlcXVpcmVkLFNqPUYoYyw2NSkuRGQmJiFGKGMsNjUpLlZjfHxudWxsLFRqPUYoYyw2NSkuRmJ8fG51bGwsVWo9RihjLDY1KS5mYSxWaj1GKGMsNjUpLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDU4LDEsW0dqLEhqLElqLEpqLEtqLExqLE1qLE5qLE9qLFBqLFFqLFJqLFNqLFRqLFVqLFZqXSk7dmFyIFdqPSJzdGFuZGFyZCI9PUYoYyw3MCkubyxDcj0iZmlsbCI9PUYoYyw3MCkubyxEcj0ib3V0bGluZSI9PUYoYyw3MCkubyxFcj0ibGVnYWN5Ij09RihjLDcwKS5vLApGcj1GKGMsNzApLmwuZmEsR3I9RihjLDcwKS54YixIcj1GKGMsNzApLktiKCksSXI9RihjLDcwKS51YigpLEpyPUYoYyw3MCkuVWIoKSxLcj1GKGMsNzApLmwuZGlzYWJsZWQsTHI9RihjLDcwKS5sLkFiLE1yPUYoYyw3MCkubC5mb2N1c2VkLE5yPSJhY2NlbnQiPT1GKGMsNzApLmNvbG9yLFdMPSJ3YXJuIj09RihjLDcwKS5jb2xvcixYTD1GKGMsNzApLmgoInVudG91Y2hlZCIpLFlMPUYoYyw3MCkuaCgidG91Y2hlZCIpLFpMPUYoYyw3MCkuaCgicHJpc3RpbmUiKSwkTD1GKGMsNzApLmgoImRpcnR5IiksYU09RihjLDcwKS5oKCJ2YWxpZCIpLGJNPUYoYyw3MCkuaCgiaW52YWxpZCIpLGNNPUYoYyw3MCkuaCgicGVuZGluZyIpLGRNPSFGKGMsNzApLkViO2IoYyw2OCwxLFtXaixDcixEcixFcixGcixHcixIcixJcixKcixLcixMcixNcixOcixXTCxYTCxZTCxaTCwkTCxhTSxiTSxjTSxkTV0pO3ZhciBlTT1GKGMsODYpLnBpLGZNPUYoYyw4Nikub2ksZ009RihjLDg2KS5uaSxoTT1GKGMsCjg2KS5raSxpTT1GKGMsODYpLnJpLGpNPUYoYyw4NikubGksa009RihjLDg2KS5taSxsTT1GKGMsODcpLlFkLG1NPUYoYyw4NykuaWQsbk09RihjLDg3KS5wbGFjZWhvbGRlcixvTT1GKGMsODcpLmRpc2FibGVkLHBNPUYoYyw4NykucmVxdWlyZWQscU09RihjLDg3KS5EZCYmIUYoYyw4NykuVmN8fG51bGwsck09RihjLDg3KS5GYnx8bnVsbCxzTT1GKGMsODcpLmZhLHRNPUYoYyw4NykucmVxdWlyZWQudG9TdHJpbmcoKTtiKGMsODAsMSxbZU0sZk0sZ00saE0saU0sak0sa00sbE0sbU0sbk0sb00scE0scU0sck0sc00sdE1dKTt2YXIgdU09InN0YW5kYXJkIj09RihjLDkxKS5vLHZNPSJmaWxsIj09RihjLDkxKS5vLHdNPSJvdXRsaW5lIj09RihjLDkxKS5vLHhNPSJsZWdhY3kiPT1GKGMsOTEpLm8seU09RihjLDkxKS5sLmZhLHpNPUYoYyw5MSkueGIsQU09RihjLDkxKS5LYigpLEJNPUYoYyw5MSkudWIoKSxDTT1GKGMsOTEpLlViKCksRE09RihjLDkxKS5sLmRpc2FibGVkLEVNPUYoYywKOTEpLmwuQWIsRk09RihjLDkxKS5sLmZvY3VzZWQsR009ImFjY2VudCI9PUYoYyw5MSkuY29sb3IsSE09Indhcm4iPT1GKGMsOTEpLmNvbG9yLElNPUYoYyw5MSkuaCgidW50b3VjaGVkIiksSk09RihjLDkxKS5oKCJ0b3VjaGVkIiksS009RihjLDkxKS5oKCJwcmlzdGluZSIpLExNPUYoYyw5MSkuaCgiZGlydHkiKSxNTT1GKGMsOTEpLmgoInZhbGlkIiksTk09RihjLDkxKS5oKCJpbnZhbGlkIiksT009RihjLDkxKS5oKCJwZW5kaW5nIiksUE09IUYoYyw5MSkuRWI7YihjLDkwLDEsW3VNLHZNLHdNLHhNLHlNLHpNLEFNLEJNLENNLERNLEVNLEZNLEdNLEhNLElNLEpNLEtNLExNLE1NLE5NLE9NLFBNXSk7dmFyIFFNPUYoYywxMDgpLnBpLFJNPUYoYywxMDgpLm9pLFNNPUYoYywxMDgpLm5pLFRNPUYoYywxMDgpLmtpLFVNPUYoYywxMDgpLnJpLFZNPUYoYywxMDgpLmxpLFdNPUYoYywxMDgpLm1pLFhNPUYoYywxMDkpLmlkLFlNPUYoYywxMDkpLnRhYkluZGV4LFpNPUYoYywxMDkpLnBoKCksCiRNPUYoYywxMDkpLmRqKCksYU49RihjLDEwOSkucmVxdWlyZWQudG9TdHJpbmcoKSxiTj1GKGMsMTA5KS5kaXNhYmxlZC50b1N0cmluZygpLGNOPUYoYywxMDkpLmZhLGROPUYoYywxMDkpLmZkP0YoYywxMDkpLnloOm51bGwsZU49RihjLDEwOSkubXVsdGlwbGUsZk49RihjLDEwOSkuRmJ8fG51bGwsZ049RihjLDEwOSkuY2ooKSxoTj1GKGMsMTA5KS5kaXNhYmxlZCxpTj1GKGMsMTA5KS5mYSxqTj1GKGMsMTA5KS5yZXF1aXJlZCxrTj1GKGMsMTA5KS5lbXB0eTtiKGMsMTA1LDEsW1FNLFJNLFNNLFRNLFVNLFZNLFdNLFhNLFlNLFpNLCRNLGFOLGJOLGNOLGROLGVOLGZOLGdOLGhOLGlOLGpOLGtOXSk7dmFyIGxOPUYoYywxMTcpLlRjKCksbU49RihjLDExNykuc2VsZWN0ZWQsbk49RihjLDExNykubXVsdGlwbGUsb049RihjLDExNykuYWN0aXZlLHBOPUYoYywxMTcpLmlkLHFOPUYoYywxMTcpLnFlKCksck49RihjLDExNykuZGlzYWJsZWQudG9TdHJpbmcoKSxzTj1GKGMsMTE3KS5kaXNhYmxlZDsKYihjLDExNiwwLGxOLG1OLG5OLG9OLHBOLHFOLHJOLHNOKTt2YXIgdE49RihjLDEyMCkuVGMoKSx1Tj1GKGMsMTIwKS5zZWxlY3RlZCx2Tj1GKGMsMTIwKS5tdWx0aXBsZSx3Tj1GKGMsMTIwKS5hY3RpdmUseE49RihjLDEyMCkuaWQseU49RihjLDEyMCkucWUoKSx6Tj1GKGMsMTIwKS5kaXNhYmxlZC50b1N0cmluZygpLEFOPUYoYywxMjApLmRpc2FibGVkO2IoYywxMTksMCx0Tix1Tix2Tix3Tix4Tix5Tix6TixBTik7dmFyIEJOPUYoYywxMjMpLlRjKCksQ049RihjLDEyMykuc2VsZWN0ZWQsRE49RihjLDEyMykubXVsdGlwbGUsRU49RihjLDEyMykuYWN0aXZlLEZOPUYoYywxMjMpLmlkLEdOPUYoYywxMjMpLnFlKCksSE49RihjLDEyMykuZGlzYWJsZWQudG9TdHJpbmcoKSxJTj1GKGMsMTIzKS5kaXNhYmxlZDtiKGMsMTIyLDAsQk4sQ04sRE4sRU4sRk4sR04sSE4sSU4pO3ZhciBKTj1GKGMsMTI2KS5UYygpLEtOPUYoYywxMjYpLnNlbGVjdGVkLExOPUYoYywxMjYpLm11bHRpcGxlLApNTj1GKGMsMTI2KS5hY3RpdmUsTk49RihjLDEyNikuaWQsT049RihjLDEyNikucWUoKSxQTj1GKGMsMTI2KS5kaXNhYmxlZC50b1N0cmluZygpLFFOPUYoYywxMjYpLmRpc2FibGVkO2IoYywxMjUsMCxKTixLTixMTixNTixOTixPTixQTixRTik7dmFyIFJOPSJzdGFuZGFyZCI9PUYoYywxMzApLm8sU049ImZpbGwiPT1GKGMsMTMwKS5vLFROPSJvdXRsaW5lIj09RihjLDEzMCkubyxVTj0ibGVnYWN5Ij09RihjLDEzMCkubyxWTj1GKGMsMTMwKS5sLmZhLFdOPUYoYywxMzApLnhiLFhOPUYoYywxMzApLktiKCksWU49RihjLDEzMCkudWIoKSxaTj1GKGMsMTMwKS5VYigpLCROPUYoYywxMzApLmwuZGlzYWJsZWQsYU89RihjLDEzMCkubC5BYixiTz1GKGMsMTMwKS5sLmZvY3VzZWQsY089ImFjY2VudCI9PUYoYywxMzApLmNvbG9yLGRPPSJ3YXJuIj09RihjLDEzMCkuY29sb3IsZU89RihjLDEzMCkuaCgidW50b3VjaGVkIiksZk89RihjLDEzMCkuaCgidG91Y2hlZCIpLGdPPUYoYywxMzApLmgoInByaXN0aW5lIiksCmhPPUYoYywxMzApLmgoImRpcnR5IiksaU89RihjLDEzMCkuaCgidmFsaWQiKSxqTz1GKGMsMTMwKS5oKCJpbnZhbGlkIiksa089RihjLDEzMCkuaCgicGVuZGluZyIpLGxPPSFGKGMsMTMwKS5FYjtiKGMsMTI5LDEsW1JOLFNOLFROLFVOLFZOLFdOLFhOLFlOLFpOLCROLGFPLGJPLGNPLGRPLGVPLGZPLGdPLGhPLGlPLGpPLGtPLGxPXSk7dmFyIG1PPUYoYywxNDcpLnBpLG5PPUYoYywxNDcpLm9pLG9PPUYoYywxNDcpLm5pLHBPPUYoYywxNDcpLmtpLHFPPUYoYywxNDcpLnJpLHJPPUYoYywxNDcpLmxpLHNPPUYoYywxNDcpLm1pLHRPPUYoYywxNDgpLmlkLHVPPUYoYywxNDgpLnRhYkluZGV4LHZPPUYoYywxNDgpLnBoKCksd089RihjLDE0OCkuZGooKSx4Tz1GKGMsMTQ4KS5yZXF1aXJlZC50b1N0cmluZygpLHlPPUYoYywxNDgpLmRpc2FibGVkLnRvU3RyaW5nKCksek89RihjLDE0OCkuZmEsQU89RihjLDE0OCkuZmQ/RihjLDE0OCkueWg6bnVsbCxCTz1GKGMsMTQ4KS5tdWx0aXBsZSwKQ089RihjLDE0OCkuRmJ8fG51bGwsRE89RihjLDE0OCkuY2ooKSxFTz1GKGMsMTQ4KS5kaXNhYmxlZCxGTz1GKGMsMTQ4KS5mYSxHTz1GKGMsMTQ4KS5yZXF1aXJlZCxITz1GKGMsMTQ4KS5lbXB0eTtiKGMsMTQ0LDEsW21PLG5PLG9PLHBPLHFPLHJPLHNPLHRPLHVPLHZPLHdPLHhPLHlPLHpPLEFPLEJPLENPLERPLEVPLEZPLEdPLEhPXSk7dmFyIElPPUYoYywxNTUpLlRjKCksSk89RihjLDE1NSkuc2VsZWN0ZWQsS089RihjLDE1NSkubXVsdGlwbGUsTE89RihjLDE1NSkuYWN0aXZlLE1PPUYoYywxNTUpLmlkLE5PPUYoYywxNTUpLnFlKCksT089RihjLDE1NSkuZGlzYWJsZWQudG9TdHJpbmcoKSxQTz1GKGMsMTU1KS5kaXNhYmxlZDtiKGMsMTU0LDAsSU8sSk8sS08sTE8sTU8sTk8sT08sUE8pO3ZhciBRTz1GKGMsMTU4KS5UYygpLFJPPUYoYywxNTgpLnNlbGVjdGVkLFNPPUYoYywxNTgpLm11bHRpcGxlLFRPPUYoYywxNTgpLmFjdGl2ZSxVTz1GKGMsMTU4KS5pZCxWTz1GKGMsMTU4KS5xZSgpLApXTz1GKGMsMTU4KS5kaXNhYmxlZC50b1N0cmluZygpLFhPPUYoYywxNTgpLmRpc2FibGVkO2IoYywxNTcsMCxRTyxSTyxTTyxUTyxVTyxWTyxXTyxYTyk7dmFyIFlPPSJzdGFuZGFyZCI9PUYoYywxNjIpLm8sWk89ImZpbGwiPT1GKGMsMTYyKS5vLCRPPSJvdXRsaW5lIj09RihjLDE2MikubyxhUD0ibGVnYWN5Ij09RihjLDE2MikubyxiUD1GKGMsMTYyKS5sLmZhLGNQPUYoYywxNjIpLnhiLGRQPUYoYywxNjIpLktiKCksZVA9RihjLDE2MikudWIoKSxmUD1GKGMsMTYyKS5VYigpLGdQPUYoYywxNjIpLmwuZGlzYWJsZWQsaFA9RihjLDE2MikubC5BYixpUD1GKGMsMTYyKS5sLmZvY3VzZWQsalA9ImFjY2VudCI9PUYoYywxNjIpLmNvbG9yLGtQPSJ3YXJuIj09RihjLDE2MikuY29sb3IsbFA9RihjLDE2MikuaCgidW50b3VjaGVkIiksbVA9RihjLDE2MikuaCgidG91Y2hlZCIpLG5QPUYoYywxNjIpLmgoInByaXN0aW5lIiksb1A9RihjLDE2MikuaCgiZGlydHkiKSxwUD1GKGMsMTYyKS5oKCJ2YWxpZCIpLApxUD1GKGMsMTYyKS5oKCJpbnZhbGlkIiksclA9RihjLDE2MikuaCgicGVuZGluZyIpLHNQPSFGKGMsMTYyKS5FYjtiKGMsMTYxLDEsW1lPLFpPLCRPLGFQLGJQLGNQLGRQLGVQLGZQLGdQLGhQLGlQLGpQLGtQLGxQLG1QLG5QLG9QLHBQLHFQLHJQLHNQXSk7dmFyIHRQPUYoYywxNzkpLnBpLHVQPUYoYywxNzkpLm9pLHZQPUYoYywxNzkpLm5pLHdQPUYoYywxNzkpLmtpLHhQPUYoYywxNzkpLnJpLHlQPUYoYywxNzkpLmxpLHpQPUYoYywxNzkpLm1pLEFQPUYoYywxODApLmlkLEJQPUYoYywxODApLnRhYkluZGV4LENQPUYoYywxODApLnBoKCksRFA9RihjLDE4MCkuZGooKSxFUD1GKGMsMTgwKS5yZXF1aXJlZC50b1N0cmluZygpLEZQPUYoYywxODApLmRpc2FibGVkLnRvU3RyaW5nKCksR1A9RihjLDE4MCkuZmEsSFA9RihjLDE4MCkuZmQ/RihjLDE4MCkueWg6bnVsbCxJUD1GKGMsMTgwKS5tdWx0aXBsZSxKUD1GKGMsMTgwKS5GYnx8bnVsbCxLUD1GKGMsMTgwKS5jaigpLExQPUYoYywKMTgwKS5kaXNhYmxlZCxNUD1GKGMsMTgwKS5mYSxOUD1GKGMsMTgwKS5yZXF1aXJlZCxPUD1GKGMsMTgwKS5lbXB0eTtiKGMsMTc2LDEsW3RQLHVQLHZQLHdQLHhQLHlQLHpQLEFQLEJQLENQLERQLEVQLEZQLEdQLEhQLElQLEpQLEtQLExQLE1QLE5QLE9QXSk7dmFyIFBQPUYoYywxODcpLlRjKCksUVA9RihjLDE4Nykuc2VsZWN0ZWQsUlA9RihjLDE4NykubXVsdGlwbGUsU1A9RihjLDE4NykuYWN0aXZlLFRQPUYoYywxODcpLmlkLFVQPUYoYywxODcpLnFlKCksVlA9RihjLDE4NykuZGlzYWJsZWQudG9TdHJpbmcoKSxXUD1GKGMsMTg3KS5kaXNhYmxlZDtiKGMsMTg2LDAsUFAsUVAsUlAsU1AsVFAsVVAsVlAsV1ApO3ZhciBYUD1GKGMsMTkwKS5UYygpLFlQPUYoYywxOTApLnNlbGVjdGVkLFpQPUYoYywxOTApLm11bHRpcGxlLCRQPUYoYywxOTApLmFjdGl2ZSxhUT1GKGMsMTkwKS5pZCxiUT1GKGMsMTkwKS5xZSgpLGNRPUYoYywxOTApLmRpc2FibGVkLnRvU3RyaW5nKCksZFE9RihjLAoxOTApLmRpc2FibGVkO2IoYywxODksMCxYUCxZUCxaUCwkUCxhUSxiUSxjUSxkUSk7YihjLDE5MiwwLCFkLkVvKTt2YXIgZVE9InN0YW5kYXJkIj09RihjLDE5NikubyxmUT0iZmlsbCI9PUYoYywxOTYpLm8sZ1E9Im91dGxpbmUiPT1GKGMsMTk2KS5vLGhRPSJsZWdhY3kiPT1GKGMsMTk2KS5vLGlRPUYoYywxOTYpLmwuZmEsalE9RihjLDE5NikueGIsa1E9RihjLDE5NikuS2IoKSxsUT1GKGMsMTk2KS51YigpLG1RPUYoYywxOTYpLlViKCksblE9RihjLDE5NikubC5kaXNhYmxlZCxvUT1GKGMsMTk2KS5sLkFiLHBRPUYoYywxOTYpLmwuZm9jdXNlZCxxUT0iYWNjZW50Ij09RihjLDE5NikuY29sb3IsclE9Indhcm4iPT1GKGMsMTk2KS5jb2xvcixzUT1GKGMsMTk2KS5oKCJ1bnRvdWNoZWQiKSx0UT1GKGMsMTk2KS5oKCJ0b3VjaGVkIiksdVE9RihjLDE5NikuaCgicHJpc3RpbmUiKSx2UT1GKGMsMTk2KS5oKCJkaXJ0eSIpLHdRPUYoYywxOTYpLmgoInZhbGlkIikseFE9RihjLDE5NikuaCgiaW52YWxpZCIpLAp5UT1GKGMsMTk2KS5oKCJwZW5kaW5nIikselE9IUYoYywxOTYpLkViO2IoYywxOTQsMSxbZVEsZlEsZ1EsaFEsaVEsalEsa1EsbFEsbVEsblEsb1EscFEscVEsclEsc1EsdFEsdVEsdlEsd1EseFEseVEselFdKTt2YXIgQVE9RihjLDIxNCkucGksQlE9RihjLDIxNCkub2ksQ1E9RihjLDIxNCkubmksRFE9RihjLDIxNCkua2ksRVE9RihjLDIxNCkucmksRlE9RihjLDIxNCkubGksR1E9RihjLDIxNCkubWksSFE9RihjLDIxNSkuUWQsSVE9RihjLDIxNSkuaWQsSlE9RihjLDIxNSkucGxhY2Vob2xkZXIsS1E9RihjLDIxNSkuZGlzYWJsZWQsTFE9RihjLDIxNSkucmVxdWlyZWQsTVE9RihjLDIxNSkuRGQmJiFGKGMsMjE1KS5WY3x8bnVsbCxOUT1GKGMsMjE1KS5GYnx8bnVsbCxPUT1GKGMsMjE1KS5mYSxQUT1GKGMsMjE1KS5yZXF1aXJlZC50b1N0cmluZygpO2IoYywyMDksMSxbQVEsQlEsQ1EsRFEsRVEsRlEsR1EsSFEsSVEsSlEsS1EsTFEsTVEsTlEsT1EsUFFdKTt2YXIgUVE9RihjLDIyMCkuZGlzYWJsZWR8fApudWxsLFJRPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMjIwKS5pYTtiKGMsMjE5LDAsUVEsUlEpO3ZhciBTUT1iZyhjLDIyMSxiKGMsMjIyLDAsRihjLDApLGQuengpKTtiKGMsMjIxLDAsU1EpO3ZhciBUUT1GKGMsMjI0KS5kaXNhYmxlZHx8bnVsbCxVUT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDIyNCkuaWE7YihjLDIyMywwLFRRLFVRKTt2YXIgVlE9YmcoYywyMjUsYihjLDIyNiwwLEYoYywwKSxkLllPKSk7YihjLDIyNSwwLFZRKX0pfXZhciBvSj1RZygiY2FwdHVyZS1wcm9maWxlLWRpYWxvZyIsakosZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJjYXB0dXJlLXByb2ZpbGUtZGlhbG9nIixbXSxudWxsLG51bGwsbnVsbCxuSixtSikpLEkoMSw0OTE1MixudWxsLDAsakosW25EXSxudWxsLG51bGwpXSxudWxsLG51bGwpfSk7dmFyIHBKPWZ1bmN0aW9uKCl7fTt2YXIgcUo9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoNTAlIC0gMTBweCk7bGVmdDpjYWxjKDUwJSAtIDEwcHgpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgIzAwMH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gckooYSl7cmV0dXJuIFooMCxbbGgoMCxKbyxbXSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCw4LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsNywiYnV0dG9uIixbWyJjbGFzcyIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIl1dLFtbMSwiZGlzYWJsZWQiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXV0sZnVuY3Rpb24oYixjKXt2YXIgZD0hMCxlPWIuYTsiY2xpY2siPT09YyYmKGQ9ITEhPT1lLm9wZW5EaWFsb2coKSYmZCk7cmV0dXJuIGR9LFVDLFRDKSksSSgzLDQzNzQ1MjgsbnVsbCwwLFJDLFt6LFJ6LFsyLGt2XV0se2Rpc2FibGVkOlswLCJkaXNhYmxlZCJdfSxudWxsKSxsaCgxMzEwNzIsSW8sW25lXSksKGEoKSgpLFkoNSwwLFsiICIsIiAiXSkpLE9tKDEyOCw2LG1lKDIpKSwoYSgpKCksVyg3LDAsbnVsbCwwLDIsCiJtYXQtc3Bpbm5lciIsW1siY2xhc3MiLCJtYXQtc3Bpbm5lciBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciJdLFsiZGlhbWV0ZXIiLCIyMCJdLFsibW9kZSIsImluZGV0ZXJtaW5hdGUiXSxbInJvbGUiLCJwcm9ncmVzc2JhciJdXSxbWzQsInZpc2liaWxpdHkiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzQsIndpZHRoIiwicHgiXSxbNCwiaGVpZ2h0IiwicHgiXV0sbnVsbCxudWxsLHNGLHBGKSksSSg4LDExNDY4OCxudWxsLDAsbkYsW3osTnosWzIsTG9dLFsyLGt2XSxrRl0se0FkOlswLCJkaWFtZXRlciJdfSxudWxsKSxsaCgxMzEwNzIsSW8sW25lXSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9YmcoYywzLEYoYyw0KS50cmFuc2Zvcm0oZC5IZykpO2IoYywzLDAsZSk7YihjLDgsMCwiMjAiKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT1GKGMsMykuZGlzYWJsZWR8fG51bGwsZj0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDMpLmlhO2IoYywyLDAsZSwKZik7ZT1iZyhjLDUsYihjLDYsMCxGKGMsMCksZC56eCkpO2IoYyw1LDAsZSk7ZT1iZyhjLDcsRihjLDkpLnRyYW5zZm9ybShkLkhnKSk/InZpc2libGUiOiJoaWRkZW4iO2Y9RihjLDgpLmVNO3ZhciBnPUYoYyw4KS5BZCxsPUYoYyw4KS5BZDtiKGMsNywwLGUsZixnLGwpfSl9O3ZhciBzSj1mdW5jdGlvbigpe307dmFyIHRKPXtCRjE2OjIsQzY0OjgsRjE2OjIsRjMyOjQsRjY0OjgsUFJFRDoxLFRPS0VOOjAsUzg6MSxTMTY6MixTMzI6NCxTNjQ6OCxVODoxLFUxNjoyLFUzMjo0LFU2NDo4fSx1Sj0iI2U5MWU2MyAjMjE5NmYzICM4MWM3ODQgIzRkZDBlMSAjM2Y1MWI1ICNlNTM5MzUgI2ZmOTEwMCAjYjM5ZGRiICM5MGE0YWUgIzI2YzZkYSAjYWQxNDU3ICMwM2E5ZjQgIzIxOTZmMyAjYzIxODViICM3OTU1NDggI2Y5YTgyNSAjMDBiZmE1ICM4ODBlNGYgI2Q1MDBmOSAjY2U5M2Q4ICNlYzQwN2EgIzRjYWY1MCAjZmY4ZjAwICNmZmNhMjggI2FiNDdiYyAjMDBlNWZmICNmZjk4MDAgIzQwYzRmZiAjMWU4OGU1ICM5ZmE4ZGEgI2JmMzYwYyAjMDBiOGQ0ICNmNTdmMTcgIzY0YjVmNiAjZTA0MGZiICNmZmFiOTEgIzRjYWY1MCAjMDE1NzliICM2NmJiNmEgI2VmOWE5YSAjNTU4YjJmICNmYjhjMDAgI2ZmNDA4MSAjMDBlNjc2ICMzODhlM2MgIzQyNDI0MiAjNmQ0YzQxICNjNjI4MjggIzYxNjE2MSAjMDA4OTdiICM0NDhhZmYgIzBkNDdhMSAjNjA3ZDhiICM2NzNhYjcgIzAwYzg1MyAjMmU3ZDMyICNmZmE3MjYgIzVlMzViMSAjYmE2OGM4ICM4ZDZlNjMgIzAwYmNkNCAjZmY2ZjAwICNmNDUxMWUgI2ZmMTc0NCAjOWU5ZTllICNkODFiNjAgIzRhMTQ4YyAjMjZhNjlhICM2ODlmMzggIzdiMWZhMiAjYjBiZWM1ICMzMDRmZmUgI2Y0OGZiMSAjZmZkNjAwICNmZmI3NGQgIzhiYzM0YSAjMzAzZjlmICM1ZDQwMzcgIzgwY2JjNCAjZmZjYzgwICMwMGFjYzEgIzNlMjcyMyAjZmY1MjUyICNmZjcwNDMgI2U5MWU2MyAjZWE4MGZjICNlNjUxMDAgI2Q4NDMxNSAjMjEyMTIxICNmZjU3MjIgIzE5NzZkMiAjMjk2MmZmICNiZGJkYmQgIzM5NDlhYiAjNjlmMGFlICNkNTAwMDAgI2ZmZDc0MCAjYzBjYTMzICNmZjZlNDAgIzAwYjBmZiAjMjk3OWZmICNlNjRhMTkgIzdjNGRmZiAjNjA3ZDhiICMwMDk2ODggI2ZmYjMwMCAjYzUxMTYyICNmZmM0MDAgIzI5YjZmNiAjM2Q1YWZlICM3NmZmMDMgI2NkZGMzOSAjYjM4OGZmICM1YzZiYzAgIzllOWQyNCAjN2NiMzQyICNlZjUzNTAgI2ZkZDgzNSAjZWY2YzAwICM0ZmMzZjcgIzYyMDBlYSAjMDA0ZDQwICNmZjhhNjUgI2ZmYWIwMCAjODBkZWVhICMwMDk3YTcgIzdlNTdjMiAjZmY2ZDAwICMxNTY1YzAgIzQ1NWE2NCAjZmZjMTA3ICM0NTI3YTAgI2ZmNTcyMiAjZjQ0MzM2ICNmNTdjMDAgIzgyNzcxNyAjYTVkNmE3ICM4MmIxZmYgIzljMjdiMCAjZmY4MGFiICNlMWJlZTcgIzc4OTA5YyAjMzExYjkyICMwMDY5NWMgIzRlMzQyZSAjM2Y1MWI1ICM2NTFmZmYgIzllOWU5ZSAjODFkNGZhICNmOGJiZDAgI2I3MWMxYyAjMDA5MWVhICM2NzNhYjcgI2ExODg3ZiAjNGRiNmFjICNmZmEwMDAgIzZhMWI5YSAjNDNhMDQ3ICNiY2FhYTQgIzU0NmU3YSAjYWVlYTAwICNlNTczNzMgI2ZmY2NiYyAjMDA2MDY0ICNmYmMwMmQgI2ZmZWIzYiAjOGJjMzRhICMwMzliZTUgIzhlMjRhYSAjODBkOGZmICMwMDk2ODggIzljY2M2NSAjNTEyZGE4ICNmZmMxMDcgIzc1NzU3NSAjMDI3N2JkICNmZjNkMDAgIzMzNjkxZSAjMDNhOWY0ICMwMDgzOGYgI2ZmOGE4MCAjMjgzNTkzICNmNTAwNTcgIzFhMjM3ZSAjOTBjYWY5ICM5YzI3YjAgI2FhMDBmZiAjYWVkNTgxICNhZmI0MmIgIzk1NzVjZCAjZDMyZjJmICM2NGRkMTcgI2Y0NDMzNiAjNzk1NTQ4ICNjZGRjMzkgI2ZmOWU4MCAjNzk4NmNiICNkZDJjMDAgIzAyODhkMSAjZmY5ODAwICMyNjMyMzggIzAwNzk2YiAjNDJhNWY1ICM4YzllZmYgIzFiNWUyMCAjZmZhYjQwICM1MzZkZmUgIzAwYmNkNCAjZjA2MjkyIi5zcGxpdCgiICIpLAp2Sj0iaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXIgbWVtb3J5X3Byb2ZpbGUgbWVtb3J5X3ZpZXdlciBvcF9wcm9maWxlIHBvZF92aWV3ZXIgdGVuc29yZmxvd19zdGF0cyB0cmFjZV92aWV3ZXIiLnNwbGl0KCIgIik7ZnVuY3Rpb24gd0ooYSl7cmV0dXJuIHRKLmhhc093blByb3BlcnR5KGEpP3RKW2FdOihjb25zb2xlLmVycm9yKCJVbmhhbmRsZWQgcHJpbWl0aXZlIHR5cGUgIithKSwwKX1mdW5jdGlvbiB4SihhKXthPU51bWJlcihhKTtyZXR1cm4gaXNOYU4oYSk/MDphfWZ1bmN0aW9uIHlKKGEsYixjLGQpe3JldHVybiJyZ2JhKCIrTWF0aC5yb3VuZCgyNTUqYSkudG9TdHJpbmcoKSsiLCIrTWF0aC5yb3VuZCgyNTUqYikudG9TdHJpbmcoKSsiLCIrTWF0aC5yb3VuZCgyNTUqYykudG9TdHJpbmcoKSsiLCIrZC50b1N0cmluZygpKyIpIn0KZnVuY3Rpb24gekooYSxiLGMsZCl7dm9pZCAwPT09YiYmKGI9MSk7dm9pZCAwPT09YyYmKGM9MSk7dm9pZCAwPT09ZCYmKGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZSl9KTtpZihpc05hTihhKSlyZXR1cm4geUooYixiLGIsYyk7YT1kKGEpO3JldHVybi41PmE/eUooYiwyKmEqYiwwLGMpOnlKKDIqKDEtYSkqYixiLDAsYyl9ZnVuY3Rpb24gQUooYSl7cmV0dXJuIGEmJmEubWV0cmljcyYmYS5tZXRyaWNzLnRpbWU/KGEubWV0cmljcy5mbG9wc3x8MCkvYS5tZXRyaWNzLnRpbWU6TmFOfWZ1bmN0aW9uIEJKKGEpe3JldHVybiBhJiZhLm1ldHJpY3MmJmEubWV0cmljcy5tZW1vcnlCYW5kd2lkdGg/YS5tZXRyaWNzLm1lbW9yeUJhbmR3aWR0aDpOYU59ZnVuY3Rpb24gQ0ooYSl7cmV0dXJuISFhJiYhIWEubWV0cmljcyYmISFhLm1ldHJpY3MudGltZX0KZnVuY3Rpb24gREooYSl7cmV0dXJuIGlzTmFOKGEpPyItIjoxLjk5NTw9YT8iMjAwJSI6MUUtNT5hPyIwLjAwJSI6TnVtYmVyKCgxMDAqYSkudG9QcmVjaXNpb24oMikpLnRvU3RyaW5nKCkrIiUifWZ1bmN0aW9uIEVKKGEpe3JldHVybiBhJiZhLm1ldHJpY3M/KGEubWV0cmljcy50aW1lfHwwKSooMS1NYXRoLm1heChBSihhKSxCSihhKSkpOk5hTn0KZnVuY3Rpb24gRkooYSxiKXtzd2l0Y2goYil7Y2FzZSAiaGlnaEZsb3BzQ29tcHV0ZVVzIjpyZXR1cm4gYS5oaWdoRmxvcHNDb21wdXRlVXN8fDA7Y2FzZSAibG93RmxvcHNDb21wdXRlVXMiOnJldHVybiBhLmxvd0Zsb3BzQ29tcHV0ZVVzfHwwO2Nhc2UgImhvc3RJbmZlZWREdXJhdGlvblVzIjpyZXR1cm4gYS5ob3N0SW5mZWVkRHVyYXRpb25Vc3x8MDtjYXNlICJob3N0T3V0ZmVlZER1cmF0aW9uVXMiOnJldHVybiBhLmhvc3RPdXRmZWVkRHVyYXRpb25Vc3x8MDtjYXNlICJhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VcyI6cmV0dXJuIGEuYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXN8fDA7Y2FzZSAiYWxsUmVkdWNlU3luY0R1cmF0aW9uVXMiOnJldHVybiBhLmFsbFJlZHVjZVN5bmNEdXJhdGlvblVzfHwwO2Nhc2UgInNlbmREdXJhdGlvblVzIjpyZXR1cm4gYS5zZW5kRHVyYXRpb25Vc3x8MDtjYXNlICJyZWN2RHVyYXRpb25VcyI6cmV0dXJuIGEucmVjdkR1cmF0aW9uVXN8fDA7CmRlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybigiTm8gdmFsaWQgcHJvcGVydHkgbmFtZSBvZiBQb2RTdGF0c1JlY29yZCIpLDB9fWZ1bmN0aW9uIEdKKGEpe2E9dm9pZCAwPT09YT8iIjphO3ZKLmZvckVhY2goZnVuY3Rpb24oYil7YT1hLnJlcGxhY2UobmV3IFJlZ0V4cChiLCJnIiksIjxhPiIrKHZvaWQgMD09PWI/IiI6YikrIjwvYT4iKX0pO3JldHVybiBhfWZ1bmN0aW9uIEhKKGEpe3ZhciBiPXtpbmZvOltdLHdhcm5pbmdzOltdLGVycm9yczpbXX07aWYoIWF8fCFhLnJvd3MpcmV0dXJuIGI7YS5yb3dzLmZvckVhY2goZnVuY3Rpb24oYyl7IkVSUk9SIj09PVN0cmluZyhjLmNbMF0udik/Yi5lcnJvcnMucHVzaChTdHJpbmcoYy5jWzFdLnYpKToiV0FSTklORyI9PT1TdHJpbmcoYy5jWzBdLnYpP2Iud2FybmluZ3MucHVzaChTdHJpbmcoYy5jWzFdLnYpKTpiLmluZm8ucHVzaChTdHJpbmcoYy5jWzFdLnYpKX0pO3JldHVybiBifTt2YXIgSUo9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLnN0b3JlPWE7dGhpcy5URj1udWxsO3RoaXMuc3RvcmUuc2VsZWN0KFNJKS5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7Yi51cGRhdGUoYyl9KX07CklKLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7aWYodGhpcy5URj1hKXt2YXIgYj1hLklpfHwwLGM9YS5DUnx8MDt0aGlzLmluc3RydWN0aW9uTmFtZT1hLmluc3RydWN0aW9uTmFtZTt0aGlzLm9wY29kZT1hLm9wY29kZT9hLm9wY29kZSsiIG9wZXJhdGlvbiI6IiI7dGhpcy5zaXplPWIudG9GaXhlZCgxKTt0aGlzLnNoYXBlPWEuc2hhcGU7dGhpcy50Zk9wTmFtZT1hLnRmT3BOYW1lO3RoaXMuYmk9YS5iaTtjPyh0aGlzLkp6PWMudG9GaXhlZCgxKSx0aGlzLnBhZGRpbmc9KGItYykudG9GaXhlZCgxKSxhPWMvYix0aGlzLmV4cGFuc2lvbj0oMS9hKS50b0ZpeGVkKDEpLHRoaXMuY29sb3I9ekooYSwuNykpOih0aGlzLmV4cGFuc2lvbj10aGlzLnBhZGRpbmc9dGhpcy5Kej0iIix0aGlzLmNvbG9yPSJyZ2IoMTkyLDE5MiwxOTIpIil9fTt2YXIgSko9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoyMHB4fW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2JvcmRlci1yYWRpdXM6MDtwYWRkaW5nOjB9LmluZm8taGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjE2cHg7ZGlzcGxheTpmbGV4fS5pbmZvLWhlYWRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czoyMHB4O21hcmdpbjo1cHggMTBweCA1cHggMH0uaW5mby1oZWFkZXItY29udGVudC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjI2MHB4O2hlaWdodDo1MHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5pbmZvLWhlYWRlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5pbmZvLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6NTAwfS5pbmZvLWhlYWRlci1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGE7Zm9udC1zdHlsZTppdGFsaWN9LmluZm8tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YTtmb250LXNpemU6MTZweDtwYWRkaW5nOjE2cHg7d29yZC1icmVhazpicmVhay13b3JkfS5pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjE2cHh9LnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDA7bWFyZ2luLWJvdHRvbTo0cHh9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIEtKKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsNTEsImRpdiIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCw1MCwibWF0LWNhcmQiLFtbImNsYXNzIiwibWF0LWNhcmQgbWF0LWZvY3VzLWluZGljYXRvciJdXSxbWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLCRDLFpDKSksSSgyLDQ5MTUyLG51bGwsMCxYQyxbWzIsa3ZdXSxudWxsLG51bGwpLChhKCkoKSxXKDMsMCxudWxsLDAsNDgsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwibWF0LWNhcmQtY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDQsMTYzODQsbnVsbCwwLFZDLFtdLG51bGwsbnVsbCksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCw3LCJkaXYiLFtbImNsYXNzIiwiaW5mby1oZWFkZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLApXKDYsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyLWNpcmNsZSJdXSxbWzQsImJhY2tncm91bmQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNywwLG51bGwsbnVsbCw1LCJkaXYiLFtbImNsYXNzIiwiaW5mby1oZWFkZXItY29udGVudC1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mby1oZWFkZXItY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg5LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJpbmZvLWhlYWRlci10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxMCxudWxsLFsiIiwiIl0pKSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiaW5mby1oZWFkZXItc3ViaGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsCm51bGwpKSwoYSgpKCksWSgxMixudWxsLFsiIiwiIl0pKSwoYSgpKCksVygxMywwLG51bGwsbnVsbCwzOCwiZGl2IixbWyJjbGFzcyIsImluZm8tY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mbyJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwidGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlNpemU6ICJdKSksKGEoKSgpLFcoMTcsMCxudWxsLG51bGwsMSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxOCxudWxsLFsiIiwiIE1pQiJdKSksKGEoKSgpLFcoMTksMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksCihhKCkoKSxXKDIwLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiVW5wYWRkZWQgU2l6ZTogIl0pKSwoYSgpKCksVygyMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDIzLG51bGwsWyIiLCIgTWlCIl0pKSwoYSgpKCksVygyNCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mbyJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyNSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwidGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkV4dHJhIG1lbW9yeSBkdWUgdG8gcGFkZGluZzogIl0pKSwoYSgpKCksVygyNywwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSwKWSgyOCxudWxsLFsiIiwiIE1pQiJdKSksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsNywiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMzAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJFeHBhbnNpb246ICJdKSksKGEoKSgpLFcoMzIsMCxudWxsLG51bGwsNCwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMywwLG51bGwsbnVsbCwxLCJzcGFuIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgzNCxudWxsLFsiIiwiIl0pKSwoYSgpKCksVygzNSwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJYIl0pKSwoYSgpKCksVygzNywwLG51bGwsCm51bGwsNCwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMzgsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJTaGFwZSAoYW5kIG1pbm9yLXRvLW1ham9yIG9yZGVyKTogIl0pKSwoYSgpKCksVyg0MCwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDQxLG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDQyLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJpbmZvIl1dLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiVGYgT3AgTmFtZTo6ICJdKSksCihhKCkoKSxXKDQ1LDAsbnVsbCxudWxsLDEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNDYsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoNDcsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNDgsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJBbGxvY2F0aW9uIFR5cGU6ICJdKSksKGEoKSgpLFcoNTAsMCxudWxsLG51bGwsMSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg1MSxudWxsLFsiIiwiIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLCFkLlRGKTt2YXIgZT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDIpLmlhO2IoYywxLDAsZSk7YihjLDYsMCxkLmNvbG9yKTtiKGMsMTAsCjAsZC5pbnN0cnVjdGlvbk5hbWUpO2IoYywxMiwwLGQub3Bjb2RlKTtiKGMsMTQsMCwhZC5zaXplKTtiKGMsMTgsMCxkLnNpemUpO2IoYywxOSwwLCFkLkp6KTtiKGMsMjMsMCxkLkp6KTtiKGMsMjQsMCwhZC5wYWRkaW5nKTtiKGMsMjgsMCxkLnBhZGRpbmcpO2IoYywyOSwwLCFkLmV4cGFuc2lvbik7YihjLDM0LDAsZC5leHBhbnNpb24pO2IoYywzNywwLCFkLnNoYXBlKTtiKGMsNDEsMCxkLnNoYXBlKTtiKGMsNDIsMCwhZC50Zk9wTmFtZSk7YihjLDQ2LDAsZC50Zk9wTmFtZSk7YihjLDQ3LDAsIWQuYmkpO2IoYyw1MSwwLGQuYmkpfSl9O3ZhciBMSj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuc3RvcmU9YTt0aGlzLnByb3ZlbmFuY2U9dGhpcy5leHByZXNzaW9uPXRoaXMuUW49dGhpcy5Mbz10aGlzLm5vPXRoaXMudXRpbGl6YXRpb249dGhpcy4kSD10aGlzLm5hbWU9dGhpcy5jb2xvcj0iIjt0aGlzLlBGPXRoaXMuS0Y9dGhpcy5JRj0hMTt0aGlzLmRpbWVuc2lvbnM9W107dGhpcy5zdG9yZS5zZWxlY3QoVUkpLnN1YnNjcmliZShmdW5jdGlvbihjKXtiLnVwZGF0ZShjKX0pfSxNSj1mdW5jdGlvbihhKXtpZighYXx8IWEuYWxpZ25tZW50KXJldHVybiIiO2E9KGEuc2l6ZXx8MCkvYS5hbGlnbm1lbnQ7cmV0dXJuIHpKKGEvTWF0aC5jZWlsKGEpLDEsLjI1LGZ1bmN0aW9uKGIpe3JldHVybiAxLU1hdGguc3FydCgxLWIpfSl9OwpMSi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZT1hfHx2b2lkIDApdGhpcy5jb2xvcj16SihBSih0aGlzLm5vZGUpLC43LDEsTWF0aC5zcXJ0KSx0aGlzLm5hbWU9dGhpcy5ub2RlLm5hbWV8fCIiLHRoaXMuJEg9dGhpcy5ub2RlP3RoaXMubm9kZS54bGEmJnRoaXMubm9kZS54bGEuY2F0ZWdvcnk/dGhpcy5ub2RlLnhsYS5jYXRlZ29yeSsiIG9wZXJhdGlvbiI6dGhpcy5ub2RlLmNhdGVnb3J5PyJPcGVyYXRpb24gY2F0ZWdvcnkiOiJVbmtub3duIjoiIixDSih0aGlzLm5vZGUpPyhhPUFKKHRoaXMubm9kZSksdGhpcy51dGlsaXphdGlvbj1ESihhKSx0aGlzLm5vPXpKKE1hdGgubWluKGEsMSksLjcsMSxNYXRoLnNxcnQpKTp0aGlzLnV0aWxpemF0aW9uPSIiLChhPXRoaXMubm9kZSkmJmEubWV0cmljcyYmYS5tZXRyaWNzLm1lbW9yeUJhbmR3aWR0aD8oYT1CSih0aGlzLm5vZGUpLHRoaXMuTG89REooYSksdGhpcy5Rbj16SihNYXRoLm1heCgxLWEsMCksLjcsCjEsTWF0aC5zcXJ0KSk6dGhpcy5Mbz0iIix0aGlzLmV4cHJlc3Npb249dGhpcy5ub2RlLnhsYSYmdGhpcy5ub2RlLnhsYS5leHByZXNzaW9uP3RoaXMubm9kZS54bGEuZXhwcmVzc2lvbjoiIix0aGlzLnByb3ZlbmFuY2U9dGhpcy5ub2RlLnhsYSYmdGhpcy5ub2RlLnhsYS5wcm92ZW5hbmNlP3RoaXMubm9kZS54bGEucHJvdmVuYW5jZToiIix0aGlzLklGPSEhdGhpcy5ub2RlLnhsYSYmIXRoaXMubm9kZS5tZXRyaWNzLHRoaXMuS0Y9ISF0aGlzLm5vZGUuY2F0ZWdvcnksdGhpcy5QRj0hIXRoaXMubm9kZS54bGEmJiEhdGhpcy5ub2RlLnhsYS5sYXlvdXQmJiEhdGhpcy5ub2RlLnhsYS5sYXlvdXQuZGltZW5zaW9ucyYmMDx0aGlzLm5vZGUueGxhLmxheW91dC5kaW1lbnNpb25zLmxlbmd0aCx0aGlzLm5vZGUueGxhJiZ0aGlzLm5vZGUueGxhLmxheW91dCYmKHRoaXMuZGltZW5zaW9ucz10aGlzLm5vZGUueGxhLmxheW91dC5kaW1lbnNpb25zfHxbXSl9O3ZhciBOSj1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjIwcHh9bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZSAhaW1wb3J0YW50O2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MH0uaW5mby1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MTZweDtkaXNwbGF5OmZsZXh9LmluZm8taGVhZGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtib3JkZXItcmFkaXVzOjIwcHg7bWFyZ2luOjVweCAxMHB4IDVweCAwfS5pbmZvLWhlYWRlci1jb250ZW50LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjYwcHg7aGVpZ2h0OjUwcHg7cG9zaXRpb246cmVsYXRpdmV9LmluZm8taGVhZGVyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9LmluZm8taGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweDtmb250LXdlaWdodDo1MDB9LmluZm8taGVhZGVyLXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YTtmb250LXN0eWxlOml0YWxpY30uaW5mby1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhO2ZvbnQtc2l6ZToxNnB4O3BhZGRpbmc6MTZweH0uaW5mb1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbToxNnB4fS50aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO21hcmdpbi1ib3R0b206NHB4fS5iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7aGVpZ2h0OjI0cHh9LmJhcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjI0cHg7bGluZS1oZWlnaHQ6MjRweH0uZXhwcmVzc2lvbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazt3b3JkLXdyYXA6YnJlYWstd29yZH0udW5hdmFpbGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM2NjZ9LmxheW91dFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTp0YWJsZTt3aWR0aDoxMDAlO2JvcmRlci1zcGFjaW5nOjE2cHggNXB4O21hcmdpbi1sZWZ0Oi0xMHB4fS5sYXlvdXRbX25nY29udGVudC0lQ09NUCVdID4gKltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTp0YWJsZS1yb3d9LmxheW91dFtfbmdjb250ZW50LSVDT01QJV0gPiAqW19uZ2NvbnRlbnQtJUNPTVAlXSA+ICpbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6dGFibGUtY2VsbH0uc2l6ZVtfbmdjb250ZW50LSVDT01QJV0sIC5zaXplLXhbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjIwJX0uc2l6ZS14W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpib2xkO2NvbG9yOiM4ODh9LnNlbWFudGljc1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOnNtYWxsZXI7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojNDhjO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2lkdGg6MzAlfS5hbGlnbm1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BhZGRpbmc6OHB4O21hcmdpbi10b3A6LThweDt3aWR0aDo0NSU7Ym94LXNpemluZzpib3JkZXItYm94fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBPSihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDExLCJkaXYiLFtbImNsYXNzIiwibGF5b3V0Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDIsImRpdiIsW1siY2xhc3MiLCJzaXplLXgiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJkaXYiLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJ4Il0pKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDYsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsInNpemUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNyxudWxsLFsiIiwKIiJdKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsInNlbWFudGljcyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg5LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDEwLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwiYWxpZ25tZW50Il1dLFtbNCwiYmFja2dyb3VuZC1jb2xvciIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxMSxudWxsLFsiICIsIiAiXSkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDMsMCwhYy5jb250ZXh0LmluZGV4KTtiKGMsNywwLGMuY29udGV4dC5QLnNpemUpO2IoYyw5LDAsYy5jb250ZXh0LlAuc2VtYW50aWNzKTt2YXIgZD1NSihjLmNvbnRleHQuUCk7YihjLDEwLDAsZCk7aWYoKGQ9Yy5jb250ZXh0LlApJiZkLmFsaWdubWVudCl7dmFyIGU9ZC5zaXplfHwwLGY9TWF0aC5jZWlsKGUvZC5hbGlnbm1lbnQpLGc9MT09PWY/IiI6IjogIitmLnRvU3RyaW5nKCkrIiB4ICIrCmQuYWxpZ25tZW50LnRvU3RyaW5nKCk7ZD0wPT09ZSVkLmFsaWdubWVudD8iRXhhY3QgZml0IitnOiJQYWQgdG8gIisoZipkLmFsaWdubWVudCkudG9TdHJpbmcoKStnfWVsc2UgZD0iIjtiKGMsMTEsMCxkKX0pfQpmdW5jdGlvbiBQSihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDQ2LCJkaXYiLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsNDUsIm1hdC1jYXJkIixbWyJjbGFzcyIsIm1hdC1jYXJkIG1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sW1syLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCwkQyxaQykpLEkoMiw0OTE1MixudWxsLDAsWEMsW1syLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksVygzLDAsbnVsbCwwLDQzLCJtYXQtY2FyZC1jb250ZW50IixbWyJjbGFzcyIsIm1hdC1jYXJkLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg0LDE2Mzg0LG51bGwsMCxWQyxbXSxudWxsLG51bGwpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsNywiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSwKVyg2LDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJpbmZvLWhlYWRlci1jaXJjbGUiXV0sW1s0LCJiYWNrZ3JvdW5kIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDcsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyLWNvbnRlbnQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDgsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiaW5mby1oZWFkZXItdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMTAsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMTEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyLXN1YmhlYWRlciJdXSxudWxsLG51bGwsbnVsbCxudWxsLApudWxsKSksKGEoKSgpLFkoMTIsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsMzMsImRpdiIsW1siY2xhc3MiLCJpbmZvLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTQsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJGTE9QUyB1dGlsaXphdGlvbjoiXSkpLChhKCkoKSxXKDE3LDAsbnVsbCxudWxsLDIsImRpdiIsW1siY2xhc3MiLCJiYXItY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDE4LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJiYXIiXV0sW1s0LCJ3aWR0aCIsbnVsbF0sWzQsImJhY2tncm91bmQtY29sb3IiLApudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDE5LG51bGwsWyIgXHUwMGEwIiwiICJdKSksKGEoKSgpLFcoMjAsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJNZW1vcnkgYmFuZHdpZHRoIHV0aWxpemF0aW9uOiJdKSksKGEoKSgpLFcoMjMsMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsImJhci1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjQsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImJhciJdXSxbWzQsIndpZHRoIixudWxsXSxbNCwiYmFja2dyb3VuZC1jb2xvciIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgyNSwKbnVsbCxbIiBcdTAwYTAiLCIgIl0pKSwoYSgpKCksVygyNiwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mbyJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyNywwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwidGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlhMQSBFeHByZXNzaW9uOiJdKSksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsMSwiY29kZSIsW1siY2xhc3MiLCJleHByZXNzaW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDMwLG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDMxLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJpbmZvIl1dLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDMyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLApudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlRlbnNvckZsb3cgTmFtZToiXSkpLChhKCkoKSxXKDM0LDAsbnVsbCxudWxsLDEsImNvZGUiLFtbImNsYXNzIiwiZXhwcmVzc2lvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgzNSxudWxsLFsiIiwiIl0pKSwoYSgpKCksVygzNiwwLG51bGwsbnVsbCwyLCJkaXYiLFtbImNsYXNzIiwiaW5mbyJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzNywwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwidW5hdmFpbGFibGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBQZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBmb3IgaW5kaXZpZHVhbCBmdXNlZCBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUuICJdKSksKGEoKSgpLFcoMzksMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsImluZm8iXV0sW1s4LCJoaWRkZW4iLDBdXSwKbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQwLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ1bmF2YWlsYWJsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIFNlbGVjdCBpdGVtcyB3aXRoaW4gdGhpcyBjYXRlZ29yeSBmb3IgcGVyZm9ybWFjZSBkZXRhaWxzLiAiXSkpLChhKCkoKSxXKDQyLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJpbmZvIl1dLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiTGF5b3V0OiJdKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxPSikpLEkoNDYsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsCjQ2LDAsYy5hLmRpbWVuc2lvbnMpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLCFkLm5vZGUpO3ZhciBlPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMikuaWE7YihjLDEsMCxlKTtiKGMsNiwwLGQuY29sb3IpO2IoYywxMCwwLGQubmFtZSk7YihjLDEyLDAsZC4kSCk7YihjLDE0LDAsIWQudXRpbGl6YXRpb24pO2IoYywxOCwwLGQudXRpbGl6YXRpb24sZC5ubyk7YihjLDE5LDAsZC51dGlsaXphdGlvbik7YihjLDIwLDAsIWQuTG8pO2IoYywyNCwwLGQuTG8sZC5Rbik7YihjLDI1LDAsZC5Mbyk7YihjLDI2LDAsIWQuZXhwcmVzc2lvbik7YihjLDMwLDAsZC5leHByZXNzaW9uKTtiKGMsMzEsMCwhZC5wcm92ZW5hbmNlKTtiKGMsMzUsMCxkLnByb3ZlbmFuY2UpO2IoYywzNiwwLCFkLklGKTtiKGMsMzksMCwhZC5LRik7YihjLDQyLDAsIWQuUEYpfSl9O3ZhciBRSj1mdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuc3RvcmU9YTt0aGlzLm5hbWU9IiI7dGhpcy5kZXRhaWxzPVtdO3RoaXMuZGVzY3JpcHRpb249dGhpcy5yZXBsaWNhR3JvdXBzPXRoaXMuaGxvTmFtZXM9IiI7dGhpcy5zdG9yZS5zZWxlY3QoV0kpLnN1YnNjcmliZShmdW5jdGlvbihjKXtiLnVwZGF0ZShjKX0pfSxSSj1mdW5jdGlvbihhLGIpe3ZhciBjPU51bWJlcihiLmRhdGFTaXplfHwiMCIpO2I9TnVtYmVyKGIuZHVyYXRpb25Vc3x8IjAiKTthLmRldGFpbHMucHVzaCh7dGl0bGU6IkRhdGEgVHJhbnNmZXJyZWQiLHZhbHVlOihjLzEwNDg1NzYpLnRvRml4ZWQoMikrIiBNaUIifSk7YS5kZXRhaWxzLnB1c2goe3RpdGxlOiJMYXRlbmN5Iix2YWx1ZTpiLnRvRml4ZWQoMikrIiBVcyJ9KTthLmRldGFpbHMucHVzaCh7dGl0bGU6IkJXIix2YWx1ZTooMCE9PWI/Yy9iLzEwNzMuNzQ6MCkudG9GaXhlZCgyKSsiIEdpQi9zIn0pfSxTSj1mdW5jdGlvbihhLGIpe2EuaW5mbz1iOwphLm5hbWU9Yi5uYW1lfHwiIjtSSihhLGIpOyhiLnJlcGxpY2FHcm91cHN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MucmVwbGljYUlkcyYmMDxjLnJlcGxpY2FJZHMubGVuZ3RoJiYoYS5yZXBsaWNhR3JvdXBzKz0ieyIrYy5yZXBsaWNhSWRzLmpvaW4oIiwiKSsifSAiKX0pO2EuZGVzY3JpcHRpb249Yi5kZXNjcmlwdGlvbnx8IiJ9LFRKPWZ1bmN0aW9uKGEsYil7YS5pbmZvPWI7YS5uYW1lPSJDaGFubmVsICMgIisoYi5jaGFubmVsSWR8fDApLnRvU3RyaW5nKCk7UkooYSxiKTthLmRldGFpbHMucHVzaCh7dGl0bGU6IlNlbmQgRGVsYXkiLHZhbHVlOihOdW1iZXIoYi5zZW5kRGVsYXlVc3x8IjAiKS8xMDQ4NTc2KS50b0ZpeGVkKDIpKyIgVXMifSk7KGIuaGxvTmFtZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MmJihhLmhsb05hbWVzKz0nIicrYysnIiAnKX0pO2EuZGVzY3JpcHRpb249Yi5kZXNjcmlwdGlvbnx8IiJ9LFVKPWZ1bmN0aW9uKGEsYil7YS5pbmZvPWI7YS5uYW1lPQoiU3RlcCBicmVha2Rvd24gb2YgY2hpcCAiKyhiLmNoaXBJZHx8MCkudG9TdHJpbmcoKTthLmRlc2NyaXB0aW9uPSIiO3ZhciBjPWIudG90YWxEdXJhdGlvblVzfHwwO2MmJnpJLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGU9RkooYixkLmtleSk7YS5kZXRhaWxzLnB1c2goe3RpdGxlOmQubGFiZWwsdmFsdWU6ZS50b0ZpeGVkKDIpKyIgVXMgKCIrKGUvYykudG9GaXhlZCgyKSsiJSkifSl9KX07UUoucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLmRldGFpbHM9W107dGhpcy5yZXBsaWNhR3JvdXBzPXRoaXMuaGxvTmFtZXM9IiI7YT9hLmhhc093blByb3BlcnR5KCJjaGFubmVsSWQiKT9USih0aGlzLGEpOmEuaGFzT3duUHJvcGVydHkoImNoaXBJZCIpP1VKKHRoaXMsYSk6U0oodGhpcyxhKTp0aGlzLmluZm89dm9pZCAwfTt2YXIgVko9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoyMHB4fW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2JvcmRlci1yYWRpdXM6MDtwYWRkaW5nOjB9LmluZm8taGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjE2cHg7Zm9udC1zaXplOjIwcHg7Zm9udC13ZWlnaHQ6NTAwfS5pbmZvLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGE7cGFkZGluZzoxNnB4fS5pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjE2cHh9LnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDA7bWFyZ2luLWJvdHRvbTo0cHh9LnNjcm9sbC14LWF1dG9bX25nY29udGVudC0lQ09NUCVde292ZXJmbG93LXg6YXV0b31jb2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Il1dLApkYXRhOnt9fSk7ZnVuY3Rpb24gV0ooYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mbyJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgyLG51bGwsWyIiLCI6ICJdKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDQsbnVsbCxbIiIsIiJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMiwwLGMuY29udGV4dC5QLnRpdGxlKTtiKGMsNCwwLGMuY29udGV4dC5QLnZhbHVlKX0pfQpmdW5jdGlvbiBYSihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDI0LCJkaXYiLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMjMsIm1hdC1jYXJkIixbWyJjbGFzcyIsIm1hdC1jYXJkIG1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sW1syLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCwkQyxaQykpLEkoMiw0OTE1MixudWxsLDAsWEMsW1syLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksVygzLDAsbnVsbCwwLDIxLCJtYXQtY2FyZC1jb250ZW50IixbWyJjbGFzcyIsIm1hdC1jYXJkLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg0LDE2Mzg0LG51bGwsMCxWQyxbXSxudWxsLG51bGwpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImluZm8taGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSwKWSg2LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDcsMCxudWxsLG51bGwsMTcsImRpdiIsW1siY2xhc3MiLCJpbmZvLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxXSikpLEkoOSwyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpLChhKCkoKSxXKDEwLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJpbmZvIHNjcm9sbC14LWF1dG8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJIbG8gTmFtZXMiXSkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDEsImNvZGUiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDE0LG51bGwsWyIiLAoiIl0pKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiaW5mbyBzY3JvbGwteC1hdXRvIl1dLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDE2LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJ0aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiUmVwbGljYSBHcm91cHMiXSkpLChhKCkoKSxXKDE4LDAsbnVsbCxudWxsLDEsImNvZGUiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDE5LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDIwLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJpbmZvIHNjcm9sbC14LWF1dG8iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSwKWSgtMSxudWxsLFsiRGVzY3JpcHRpb24iXSkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDEsImNvZGUiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDI0LG51bGwsWyIiLCIiXSkpXSxmdW5jdGlvbihiLGMpe2IoYyw5LDAsYy5hLmRldGFpbHMpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLCFkLmluZm8pO3ZhciBlPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMikuaWE7YihjLDEsMCxlKTtiKGMsNiwwLGQubmFtZSk7YihjLDEwLDAsIWQuaGxvTmFtZXMpO2IoYywxNCwwLGQuaGxvTmFtZXMpO2IoYywxNSwwLCFkLnJlcGxpY2FHcm91cHMpO2IoYywxOSwwLGQucmVwbGljYUdyb3Vwcyk7YihjLDIwLDAsIWQuZGVzY3JpcHRpb24pO2IoYywyNCwwLGQuZGVzY3JpcHRpb24pfSl9O3ZhciBZSj1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfS5idXR0b24tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjIwcHh9Lml0ZW0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjIwcHggMjBweCAwIDIwcHh9Lm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206MH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gWkooYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsIm9wdGlvbiJdXSxbWzEsInRhYmluZGV4IiwwXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMiwibWF0LW9wdGlvbi1kaXNhYmxlZCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDEpLnZjKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDEpLkhhKGQpJiZlKTtyZXR1cm4gZX0sZUQsY0QpKSxJKDEsODU2ODgzMixbWzEwLDRdXSwwLHlDLFt6LG5lLFsyLHhDXSwKWzIsdUNdXSx7dmFsdWU6WzAsInZhbHVlIl19LG51bGwpLChhKCkoKSxZKDIsMCxbIiAiLCIgIl0pKV0sZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMuY29udGV4dC5QKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1GKGMsMSkuVGMoKSxlPUYoYywxKS5zZWxlY3RlZCxmPUYoYywxKS5tdWx0aXBsZSxnPUYoYywxKS5hY3RpdmUsbD1GKGMsMSkuaWQsbT1GKGMsMSkucWUoKSxwPUYoYywxKS5kaXNhYmxlZC50b1N0cmluZygpLHE9RihjLDEpLmRpc2FibGVkO2IoYywwLDAsZCxlLGYsZyxsLG0scCxxKTtiKGMsMiwwLGMuY29udGV4dC5QKX0pfQpmdW5jdGlvbiAkSihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDIsIm1hdC1vcHRpb24iLFtbImNsYXNzIiwibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwib3B0aW9uIl1dLFtbMSwidGFiaW5kZXgiLDBdLFsyLCJtYXQtc2VsZWN0ZWQiLG51bGxdLFsyLCJtYXQtb3B0aW9uLW11bHRpcGxlIixudWxsXSxbMiwibWF0LWFjdGl2ZSIsbnVsbF0sWzgsImlkIiwwXSxbMSwiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMSkudmMoKSYmZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMSkuSGEoZCkmJmUpO3JldHVybiBlfSxlRCxjRCkpLEkoMSw4NTY4ODMyLFtbMjIsNF1dLDAseUMsW3osbmUsWzIseENdLApbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoMiwwLFsiICIsIiAiXSkpXSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlApfSxmdW5jdGlvbihiLGMpe3ZhciBkPUYoYywxKS5UYygpLGU9RihjLDEpLnNlbGVjdGVkLGY9RihjLDEpLm11bHRpcGxlLGc9RihjLDEpLmFjdGl2ZSxsPUYoYywxKS5pZCxtPUYoYywxKS5xZSgpLHA9RihjLDEpLmRpc2FibGVkLnRvU3RyaW5nKCkscT1GKGMsMSkuZGlzYWJsZWQ7YihjLDAsMCxkLGUsZixnLGwsbSxwLHEpO2Q9KGQ9Yy5jb250ZXh0LlApJiZkLmxlbmd0aCYmKCJAIj09PWRbZC5sZW5ndGgtMV18fCIjIj09PWRbZC5sZW5ndGgtMV0pP2Quc2xpY2UoMCwtMSk6ZHx8IiI7YihjLDIsMCxkKX0pfQpmdW5jdGlvbiBhSyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDIsIm1hdC1vcHRpb24iLFtbImNsYXNzIiwibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwib3B0aW9uIl1dLFtbMSwidGFiaW5kZXgiLDBdLFsyLCJtYXQtc2VsZWN0ZWQiLG51bGxdLFsyLCJtYXQtb3B0aW9uLW11bHRpcGxlIixudWxsXSxbMiwibWF0LWFjdGl2ZSIsbnVsbF0sWzgsImlkIiwwXSxbMSwiYXJpYS1zZWxlY3RlZCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsyLCJtYXQtb3B0aW9uLWRpc2FibGVkIixudWxsXV0sW1tudWxsLCJjbGljayJdLFtudWxsLCJrZXlkb3duIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsiY2xpY2siPT09YyYmKGU9ITEhPT1GKGIsMSkudmMoKSYmZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMSkuSGEoZCkmJmUpO3JldHVybiBlfSxlRCxjRCkpLEkoMSw4NTY4ODMyLFtbMzQsNF1dLDAseUMsW3osbmUsWzIseENdLApbMix1Q11dLHt2YWx1ZTpbMCwidmFsdWUiXX0sbnVsbCksKGEoKSgpLFkoMiwwLFsiICIsIiAiXSkpXSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlApfSxmdW5jdGlvbihiLGMpe3ZhciBkPUYoYywxKS5UYygpLGU9RihjLDEpLnNlbGVjdGVkLGY9RihjLDEpLm11bHRpcGxlLGc9RihjLDEpLmFjdGl2ZSxsPUYoYywxKS5pZCxtPUYoYywxKS5xZSgpLHA9RihjLDEpLmRpc2FibGVkLnRvU3RyaW5nKCkscT1GKGMsMSkuZGlzYWJsZWQ7YihjLDAsMCxkLGUsZixnLGwsbSxwLHEpO2IoYywyLDAsYy5jb250ZXh0LlApfSl9CmZ1bmN0aW9uIGJLKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsImJ1dHRvbi1jb250YWluZXIgaG9yaXpvbnRhbC1jZW50ZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJjYXB0dXJlLXByb2ZpbGUiLFtdLG51bGwsbnVsbCxudWxsLHJKLHFKKSksSSgyLDQ5MTUyLG51bGwsMCxrSixbc0QsUEcsS0ksY0ldLG51bGwsbnVsbCksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwyNSwiZGl2IixbWyJjbGFzcyIsIml0ZW0tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDUsMjc4NTI4LG51bGwsMCxwbyxbeWYsemYseixaZV0se2ppOlswLCJuZ0NsYXNzIl19LG51bGwpLE5tKDYseyJtYXQtc3ViaGVhZGluZy0yIjowLGRpc2FibGVkOjF9KSwoYSgpKCksClkoNyxudWxsLFsiIFJ1bnMgKCIsIikgIl0pKSwoYSgpKCksVyg4LDAsbnVsbCxudWxsLDIwLCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJmdWxsLXdpZHRoIG1hdC1mb3JtLWZpZWxkIl1dLFtbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsCm51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixudWxsXSxbMiwibWF0LWZvY3VzZWQiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdLFsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLEkoOSw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxLHtTYjowfSksWCgzMzU1NDQzMjAsMix7VGI6MH0pLFgoNjAzOTc5Nzc2LDMse1ZiOjB9KSxYKDMzNTU0NDMyMCw0LHtXYjowfSksWCg2MDM5Nzk3NzYsNSx7SGI6MH0pLFgoNjAzOTc5Nzc2LAo2LHtsYjoxfSksWCg2MDM5Nzk3NzYsNyx7YWI6MX0pLFgoNjAzOTc5Nzc2LDgse0piOjF9KSxYKDYwMzk3OTc3Niw5LHtMYjoxfSksbWgoMjA0OCxudWxsLFdELG51bGwsW1hEXSksKGEoKSgpLFcoMjAsMCxudWxsLDEsOCwibWF0LXNlbGVjdCIsW1siY2xhc3MiLCJtYXQtc2VsZWN0Il0sWyJwYW5lbENsYXNzIiwicGFuZWwtb3ZlcnJpZGUiXSxbInJvbGUiLCJsaXN0Ym94Il1dLFtbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtbGFiZWwiLDBdLFsxLCJhcmlhLWxhYmVsbGVkYnkiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtb3ducyIsMF0sWzEsImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsMF0sWzIsIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWludmFsaWQiLApudWxsXSxbMiwibWF0LXNlbGVjdC1yZXF1aXJlZCIsbnVsbF0sWzIsIm1hdC1zZWxlY3QtZW1wdHkiLG51bGxdXSxbW251bGwsInZhbHVlQ2hhbmdlIl0sW251bGwsInNlbGVjdGlvbkNoYW5nZSJdLFtudWxsLCJrZXlkb3duIl0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDIyKS5IYShkKSYmZSk7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDIyKS5zZCgpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwyMikucWQoKSYmZSk7InZhbHVlQ2hhbmdlIj09PWMmJihlPSExIT09KGYudms9ZCkmJmUpOyJzZWxlY3Rpb25DaGFuZ2UiPT09YyYmKGU9ITEhPT1nSihmKSYmZSk7cmV0dXJuIGV9LFRGLE5GKSksbWgoNjE0NCxudWxsLHhDLG51bGwsW0xGXSksSSgyMiwyMDgwNzY4LG51bGwsMyxMRixbWkEsbmUsVCxxQyx6LFsyLE5BXSxbMixSdV0sWzIsVXVdLFsyLFdEXSxbOCwKbnVsbF0sWzgsbnVsbF0sR0YsaUEsWzIsSUZdXSx7ZGlzYWJsZWQ6WzAsImRpc2FibGVkIl0scmI6WzEsInBhbmVsQ2xhc3MiXSx2YWx1ZTpbMiwidmFsdWUiXX0se3h0OiJzZWxlY3Rpb25DaGFuZ2UiLEdrOiJ2YWx1ZUNoYW5nZSJ9KSxYKDYwMzk3OTc3NiwxMCx7b3B0aW9uczoxfSksWCg2MDM5Nzk3NzYsMTEse1lnOjF9KSxYKDYwMzk3OTc3NiwxMix7Rmo6MH0pLG1oKDIwNDgsW1sxLDRdLFsyLDRdXSxQRCxudWxsLFtMRl0pLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsMSwxLG51bGwsWkopKSxJKDI4LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsMjUsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMCwwLG51bGwsbnVsbCwzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMzEsMjc4NTI4LApudWxsLDAscG8sW3lmLHpmLHosWmVdLHtqaTpbMCwibmdDbGFzcyJdfSxudWxsKSxObSgzMix7Im1hdC1zdWJoZWFkaW5nLTIiOjAsZGlzYWJsZWQ6MX0pLChhKCkoKSxZKDMzLG51bGwsWyIgVG9vbHMgKCIsIikgIl0pKSwoYSgpKCksVygzNCwwLG51bGwsbnVsbCwyMCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwiZnVsbC13aWR0aCBtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLApudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSxJKDM1LDc1MjAyNTYsbnVsbCw5LFhELFt6LG5lLFsyLHJDXSxbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDEzLHtTYjowfSksWCgzMzU1NDQzMjAsCjE0LHtUYjowfSksWCg2MDM5Nzk3NzYsMTUse1ZiOjB9KSxYKDMzNTU0NDMyMCwxNix7V2I6MH0pLFgoNjAzOTc5Nzc2LDE3LHtIYjowfSksWCg2MDM5Nzk3NzYsMTgse2xiOjF9KSxYKDYwMzk3OTc3NiwxOSx7YWI6MX0pLFgoNjAzOTc5Nzc2LDIwLHtKYjoxfSksWCg2MDM5Nzk3NzYsMjEse0xiOjF9KSxtaCgyMDQ4LG51bGwsV0QsbnVsbCxbWERdKSwoYSgpKCksVyg0NiwwLG51bGwsMSw4LCJtYXQtc2VsZWN0IixbWyJjbGFzcyIsIm1hdC1zZWxlY3QiXSxbInBhbmVsQ2xhc3MiLCJwYW5lbC1vdmVycmlkZSJdLFsicm9sZSIsImxpc3Rib3giXV0sW1sxLCJpZCIsMF0sWzEsInRhYmluZGV4IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMSwiYXJpYS1pbnZhbGlkIiwwXSxbMSwiYXJpYS1vd25zIiwwXSxbMSwiYXJpYS1tdWx0aXNlbGVjdGFibGUiLDBdLFsxLCJhcmlhLWRlc2NyaWJlZGJ5IiwKMF0sWzEsImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsMF0sWzIsIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWludmFsaWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LXJlcXVpcmVkIixudWxsXSxbMiwibWF0LXNlbGVjdC1lbXB0eSIsbnVsbF1dLFtbbnVsbCwidmFsdWVDaGFuZ2UiXSxbbnVsbCwic2VsZWN0aW9uQ2hhbmdlIl0sW251bGwsImtleWRvd24iXSxbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsNDgpLkhhKGQpJiZlKTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsNDgpLnNkKCkmJmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDQ4KS5xZCgpJiZlKTsidmFsdWVDaGFuZ2UiPT09YyYmKGU9ITEhPT0oZi5mZz1kKSYmZSk7InNlbGVjdGlvbkNoYW5nZSI9PT1jJiYoZT0hMSE9PWYuSnQoKSYmZSk7cmV0dXJuIGV9LFRGLE5GKSksbWgoNjE0NCwKbnVsbCx4QyxudWxsLFtMRl0pLEkoNDgsMjA4MDc2OCxudWxsLDMsTEYsW1pBLG5lLFQscUMseixbMixOQV0sWzIsUnVdLFsyLFV1XSxbMixXRF0sWzgsbnVsbF0sWzgsbnVsbF0sR0YsaUEsWzIsSUZdXSx7ZGlzYWJsZWQ6WzAsImRpc2FibGVkIl0scmI6WzEsInBhbmVsQ2xhc3MiXSx2YWx1ZTpbMiwidmFsdWUiXX0se3h0OiJzZWxlY3Rpb25DaGFuZ2UiLEdrOiJ2YWx1ZUNoYW5nZSJ9KSxYKDYwMzk3OTc3NiwyMix7b3B0aW9uczoxfSksWCg2MDM5Nzk3NzYsMjMse1lnOjF9KSxYKDYwMzk3OTc3NiwyNCx7Rmo6MH0pLG1oKDIwNDgsW1sxMyw0XSxbMTQsNF1dLFBELG51bGwsW0xGXSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCwxLDEsbnVsbCwkSikpLEkoNTQsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKSwoYSgpKCksVyg1NSwwLG51bGwsbnVsbCwyNSwiZGl2IixbWyJjbGFzcyIsIml0ZW0tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLApudWxsLG51bGwpKSwoYSgpKCksVyg1NiwwLG51bGwsbnVsbCwzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNTcsMjc4NTI4LG51bGwsMCxwbyxbeWYsemYseixaZV0se2ppOlswLCJuZ0NsYXNzIl19LG51bGwpLE5tKDU4LHsibWF0LXN1YmhlYWRpbmctMiI6MCxkaXNhYmxlZDoxfSksKGEoKSgpLFkoNTksbnVsbCxbIiBIb3N0cyAoIiwiKSAiXSkpLChhKCkoKSxXKDYwLDAsbnVsbCxudWxsLDIwLCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJmdWxsLXdpZHRoIG1hdC1mb3JtLWZpZWxkIl1dLFtbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsCm51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixudWxsXSxbMiwibWF0LWZvY3VzZWQiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdLFsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLApJKDYxLDc1MjAyNTYsbnVsbCw5LFhELFt6LG5lLFsyLHJDXSxbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDI1LHtTYjowfSksWCgzMzU1NDQzMjAsMjYse1RiOjB9KSxYKDYwMzk3OTc3NiwyNyx7VmI6MH0pLFgoMzM1NTQ0MzIwLDI4LHtXYjowfSksWCg2MDM5Nzk3NzYsMjkse0hiOjB9KSxYKDYwMzk3OTc3NiwzMCx7bGI6MX0pLFgoNjAzOTc5Nzc2LDMxLHthYjoxfSksWCg2MDM5Nzk3NzYsMzIse0piOjF9KSxYKDYwMzk3OTc3NiwzMyx7TGI6MX0pLG1oKDIwNDgsbnVsbCxXRCxudWxsLFtYRF0pLChhKCkoKSxXKDcyLDAsbnVsbCwxLDgsIm1hdC1zZWxlY3QiLFtbImNsYXNzIiwibWF0LXNlbGVjdCJdLFsicGFuZWxDbGFzcyIsInBhbmVsLW92ZXJyaWRlIl0sWyJyb2xlIiwibGlzdGJveCJdXSxbWzEsImlkIiwwXSxbMSwidGFiaW5kZXgiLDBdLFsxLCJhcmlhLWxhYmVsIiwwXSxbMSwiYXJpYS1sYWJlbGxlZGJ5IiwwXSxbMSwiYXJpYS1yZXF1aXJlZCIsCjBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMSwiYXJpYS1pbnZhbGlkIiwwXSxbMSwiYXJpYS1vd25zIiwwXSxbMSwiYXJpYS1tdWx0aXNlbGVjdGFibGUiLDBdLFsxLCJhcmlhLWRlc2NyaWJlZGJ5IiwwXSxbMSwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwwXSxbMiwibWF0LXNlbGVjdC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1zZWxlY3QtaW52YWxpZCIsbnVsbF0sWzIsIm1hdC1zZWxlY3QtcmVxdWlyZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWVtcHR5IixudWxsXV0sW1tudWxsLCJ2YWx1ZUNoYW5nZSJdLFtudWxsLCJzZWxlY3Rpb25DaGFuZ2UiXSxbbnVsbCwia2V5ZG93biJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiw3NCkuSGEoZCkmJmUpOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiw3NCkuc2QoKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsNzQpLnFkKCkmJgplKTsidmFsdWVDaGFuZ2UiPT09YyYmKGU9ITEhPT0oZi50az1kKSYmZSk7InNlbGVjdGlvbkNoYW5nZSI9PT1jJiYoZT0hMSE9PWlKKGYpJiZlKTtyZXR1cm4gZX0sVEYsTkYpKSxtaCg2MTQ0LG51bGwseEMsbnVsbCxbTEZdKSxJKDc0LDIwODA3NjgsbnVsbCwzLExGLFtaQSxuZSxULHFDLHosWzIsTkFdLFsyLFJ1XSxbMixVdV0sWzIsV0RdLFs4LG51bGxdLFs4LG51bGxdLEdGLGlBLFsyLElGXV0se2Rpc2FibGVkOlswLCJkaXNhYmxlZCJdLHJiOlsxLCJwYW5lbENsYXNzIl0sdmFsdWU6WzIsInZhbHVlIl19LHt4dDoic2VsZWN0aW9uQ2hhbmdlIixHazoidmFsdWVDaGFuZ2UifSksWCg2MDM5Nzk3NzYsMzQse29wdGlvbnM6MX0pLFgoNjAzOTc5Nzc2LDM1LHtZZzoxfSksWCg2MDM5Nzk3NzYsMzYse0ZqOjB9KSxtaCgyMDQ4LFtbMjUsNF0sWzI2LDRdXSxQRCxudWxsLFtMRl0pLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsMSwxLG51bGwsYUspKSxJKDgwLDI3ODUyOCxudWxsLDAscm8sCltFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpLChhKCkoKSxXKDgxLDAsbnVsbCxudWxsLDIsImRpdiIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoODIsMCxudWxsLG51bGwsMSwiYnVmZmVyLWRldGFpbHMiLFtdLG51bGwsbnVsbCxudWxsLEtKLEpKKSksSSg4Myw0OTE1MixudWxsLDAsSUosW2NJXSxudWxsLG51bGwpLChhKCkoKSxXKDg0LDAsbnVsbCxudWxsLDIsImRpdiIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoODUsMCxudWxsLG51bGwsMSwib3AtZGV0YWlscyIsW10sbnVsbCxudWxsLG51bGwsUEosTkopKSxJKDg2LDQ5MTUyLG51bGwsMCxMSixbY0ldLG51bGwsbnVsbCksKGEoKSgpLFcoODcsMCxudWxsLG51bGwsMiwiZGl2IixbXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg4OCwwLG51bGwsbnVsbCwxLCJwb2Qtdmlld2VyLWRldGFpbHMiLApbXSxudWxsLG51bGwsbnVsbCxYSixWSikpLEkoODksNDkxNTIsbnVsbCwwLFFKLFtjSV0sbnVsbCxudWxsKSwoYSgpKCksVyg5MCwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9YihjLDYsMCwhMCwhZC5pcC5sZW5ndGgpO2IoYyw1LDAsZSk7YihjLDIyLDAsIWQuaXAubGVuZ3RoLCJwYW5lbC1vdmVycmlkZSIsZC52ayk7YihjLDI4LDAsZC5pcCk7ZT1iKGMsMzIsMCwhMCwhZC50YWdzLmxlbmd0aCk7YihjLDMxLDAsZSk7YihjLDQ4LDAsIWQudGFncy5sZW5ndGgsInBhbmVsLW92ZXJyaWRlIixkLmZnKTtiKGMsNTQsMCxkLnRhZ3MpO2U9YihjLDU4LDAsITAsIWQuRmUubGVuZ3RoKTtiKGMsNTcsMCxlKTtiKGMsNzQsMCwhZC5GZS5sZW5ndGgsInBhbmVsLW92ZXJyaWRlIixkLnRrKTtiKGMsODAsMCxkLkZlKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDcsMCxkLmlwLmxlbmd0aCk7dmFyIGU9CiJzdGFuZGFyZCI9PUYoYyw5KS5vLGY9ImZpbGwiPT1GKGMsOSkubyxnPSJvdXRsaW5lIj09RihjLDkpLm8sbD0ibGVnYWN5Ij09RihjLDkpLm8sbT1GKGMsOSkubC5mYSxwPUYoYyw5KS54YixxPUYoYyw5KS5LYigpLHI9RihjLDkpLnViKCksdj1GKGMsOSkuVWIoKSx3PUYoYyw5KS5sLmRpc2FibGVkLHg9RihjLDkpLmwuQWIsdT1GKGMsOSkubC5mb2N1c2VkLEQ9ImFjY2VudCI9PUYoYyw5KS5jb2xvcixIPSJ3YXJuIj09RihjLDkpLmNvbG9yLEU9RihjLDkpLmgoInVudG91Y2hlZCIpLE49RihjLDkpLmgoInRvdWNoZWQiKSxNPUYoYyw5KS5oKCJwcmlzdGluZSIpLEo9RihjLDkpLmgoImRpcnR5IiksUT1GKGMsOSkuaCgidmFsaWQiKSxVPUYoYyw5KS5oKCJpbnZhbGlkIikscmE9RihjLDkpLmgoInBlbmRpbmciKSxFYT0hRihjLDkpLkViO2IoYyw4LDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYSxFYV0pO3ZhciBCPUYoYywyMikuaWQsRz1GKGMsMjIpLnRhYkluZGV4LApLPUYoYywyMikucGgoKSxtYT1GKGMsMjIpLmRqKCksa2E9RihjLDIyKS5yZXF1aXJlZC50b1N0cmluZygpLCRhPUYoYywyMikuZGlzYWJsZWQudG9TdHJpbmcoKSxPPUYoYywyMikuZmEsUz1GKGMsMjIpLmZkP0YoYywyMikueWg6bnVsbCxkYT1GKGMsMjIpLm11bHRpcGxlLEM9RihjLDIyKS5GYnx8bnVsbCxQPUYoYywyMikuY2ooKSxSPUYoYywyMikuZGlzYWJsZWQsYmE9RihjLDIyKS5mYSx1YT1GKGMsMjIpLnJlcXVpcmVkLEphPUYoYywyMikuZW1wdHk7YihjLDIwLDEsW0IsRyxLLG1hLGthLCRhLE8sUyxkYSxDLFAsUixiYSx1YSxKYV0pO2IoYywzMywwLGQudGFncy5sZW5ndGgpO3ZhciB0YT0ic3RhbmRhcmQiPT1GKGMsMzUpLm8sd2E9ImZpbGwiPT1GKGMsMzUpLm8sVGE9Im91dGxpbmUiPT1GKGMsMzUpLm8sUWI9ImxlZ2FjeSI9PUYoYywzNSkubyxSYj1GKGMsMzUpLmwuZmEsVWE9RihjLDM1KS54YixzYz1GKGMsMzUpLktiKCksQmU9RihjLDM1KS51YigpLFNiPUYoYywzNSkuVWIoKSwKWWI9RihjLDM1KS5sLmRpc2FibGVkLGljPUYoYywzNSkubC5BYix5Yj1GKGMsMzUpLmwuZm9jdXNlZCxTZD0iYWNjZW50Ij09RihjLDM1KS5jb2xvcixhaj0id2FybiI9PUYoYywzNSkuY29sb3IsYmo9RihjLDM1KS5oKCJ1bnRvdWNoZWQiKSxjaj1GKGMsMzUpLmgoInRvdWNoZWQiKSxkaj1GKGMsMzUpLmgoInByaXN0aW5lIiksZWo9RihjLDM1KS5oKCJkaXJ0eSIpLGZqPUYoYywzNSkuaCgidmFsaWQiKSxnaj1GKGMsMzUpLmgoImludmFsaWQiKSxoaj1GKGMsMzUpLmgoInBlbmRpbmciKSxpaj0hRihjLDM1KS5FYjtiKGMsMzQsMSxbdGEsd2EsVGEsUWIsUmIsVWEsc2MsQmUsU2IsWWIsaWMseWIsU2QsYWosYmosY2osZGosZWosZmosZ2osaGosaWpdKTt2YXIgamo9RihjLDQ4KS5pZCxraj1GKGMsNDgpLnRhYkluZGV4LGxqPUYoYyw0OCkucGgoKSxtaj1GKGMsNDgpLmRqKCksbmo9RihjLDQ4KS5yZXF1aXJlZC50b1N0cmluZygpLG9qPUYoYyw0OCkuZGlzYWJsZWQudG9TdHJpbmcoKSwKcGo9RihjLDQ4KS5mYSxxaj1GKGMsNDgpLmZkP0YoYyw0OCkueWg6bnVsbCxyaj1GKGMsNDgpLm11bHRpcGxlLHNqPUYoYyw0OCkuRmJ8fG51bGwsdGo9RihjLDQ4KS5jaigpLHVqPUYoYyw0OCkuZGlzYWJsZWQsdmo9RihjLDQ4KS5mYSx3aj1GKGMsNDgpLnJlcXVpcmVkLHhqPUYoYyw0OCkuZW1wdHk7YihjLDQ2LDEsW2pqLGtqLGxqLG1qLG5qLG9qLHBqLHFqLHJqLHNqLHRqLHVqLHZqLHdqLHhqXSk7YihjLDU5LDAsZC5GZS5sZW5ndGgpO3ZhciB5aj0ic3RhbmRhcmQiPT1GKGMsNjEpLm8semo9ImZpbGwiPT1GKGMsNjEpLm8sQWo9Im91dGxpbmUiPT1GKGMsNjEpLm8sQmo9ImxlZ2FjeSI9PUYoYyw2MSkubyxDaj1GKGMsNjEpLmwuZmEsRGo9RihjLDYxKS54YixFaj1GKGMsNjEpLktiKCksRmo9RihjLDYxKS51YigpLEdqPUYoYyw2MSkuVWIoKSxIaj1GKGMsNjEpLmwuZGlzYWJsZWQsSWo9RihjLDYxKS5sLkFiLEpqPUYoYyw2MSkubC5mb2N1c2VkLEtqPSJhY2NlbnQiPT1GKGMsCjYxKS5jb2xvcixMaj0id2FybiI9PUYoYyw2MSkuY29sb3IsTWo9RihjLDYxKS5oKCJ1bnRvdWNoZWQiKSxOaj1GKGMsNjEpLmgoInRvdWNoZWQiKSxPaj1GKGMsNjEpLmgoInByaXN0aW5lIiksUGo9RihjLDYxKS5oKCJkaXJ0eSIpLFFqPUYoYyw2MSkuaCgidmFsaWQiKSxSaj1GKGMsNjEpLmgoImludmFsaWQiKSxTaj1GKGMsNjEpLmgoInBlbmRpbmciKSxUaj0hRihjLDYxKS5FYjtiKGMsNjAsMSxbeWosemosQWosQmosQ2osRGosRWosRmosR2osSGosSWosSmosS2osTGosTWosTmosT2osUGosUWosUmosU2osVGpdKTt2YXIgVWo9RihjLDc0KS5pZCxWaj1GKGMsNzQpLnRhYkluZGV4LFdqPUYoYyw3NCkucGgoKSxDcj1GKGMsNzQpLmRqKCksRHI9RihjLDc0KS5yZXF1aXJlZC50b1N0cmluZygpLEVyPUYoYyw3NCkuZGlzYWJsZWQudG9TdHJpbmcoKSxGcj1GKGMsNzQpLmZhLEdyPUYoYyw3NCkuZmQ/RihjLDc0KS55aDpudWxsLEhyPUYoYyw3NCkubXVsdGlwbGUsSXI9RihjLDc0KS5GYnx8Cm51bGwsSnI9RihjLDc0KS5jaigpLEtyPUYoYyw3NCkuZGlzYWJsZWQsTHI9RihjLDc0KS5mYSxNcj1GKGMsNzQpLnJlcXVpcmVkLE5yPUYoYyw3NCkuZW1wdHk7YihjLDcyLDEsW1VqLFZqLFdqLENyLERyLEVyLEZyLEdyLEhyLElyLEpyLEtyLExyLE1yLE5yXSk7YihjLDgxLDAsIm1lbW9yeV92aWV3ZXIiIT1kLmZnKTtiKGMsODQsMCwib3BfcHJvZmlsZSIhPWQuZmcpO2IoYyw4NywwLCJwb2Rfdmlld2VyIiE9ZC5mZyl9KX07dmFyIGNLPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9bWF0LXNpZGVuYXYtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9bWF0LXNpZGVuYXZbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7d2lkdGg6MzQwcHg7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlfW1hdC1wcm9ncmVzcy1iYXJbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjMwMHB4O21hcmdpbjowIGF1dG99LnByb2dyZXNzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzo1MHB4fS5sb2FkaW5nLW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde3dpZHRoOmZpdC1jb250ZW50O21hcmdpbjowIGF1dG99Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIGRLKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMTgsIm1hdC1zaWRlbmF2LWNvbnRhaW5lciIsW1siY2xhc3MiLCJtYXQtZHJhd2VyLWNvbnRhaW5lciBtYXQtc2lkZW5hdi1jb250YWluZXIiXSxbImZ1bGxzY3JlZW4iLCIiXV0sW1syLCJtYXQtZHJhd2VyLWNvbnRhaW5lci1leHBsaWNpdC1iYWNrZHJvcCIsbnVsbF1dLG51bGwsbnVsbCxtRyxqRykpLEkoMSwxNDkwOTQ0LG51bGwsMixkRyxbWzIsTkFdLHosVCxuZSxaQSxXRixbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMSx7ZUE6MX0pLFgoNjAzOTc5Nzc2LDIse1lKOjB9KSxtaCgyMDQ4LG51bGwsWEYsbnVsbCxbZEddKSwoYSgpKCksVyg1LDAsbnVsbCwwLDMsIm1hdC1zaWRlbmF2IixbWyJjbGFzcyIsIm1hdC1kcmF3ZXIgbWF0LXNpZGVuYXYiXSxbIm1vZGUiLCJzaWRlIl0sWyJvcGVuZWQiLCIiXSxbInRhYkluZGV4IiwiLTEiXV0sW1sxLCJhbGlnbiIsMF0sWzIsIm1hdC1kcmF3ZXItZW5kIiwKbnVsbF0sWzIsIm1hdC1kcmF3ZXItb3ZlciIsbnVsbF0sWzIsIm1hdC1kcmF3ZXItcHVzaCIsbnVsbF0sWzIsIm1hdC1kcmF3ZXItc2lkZSIsbnVsbF0sWzIsIm1hdC1kcmF3ZXItb3BlbmVkIixudWxsXSxbMiwibWF0LXNpZGVuYXYtZml4ZWQiLG51bGxdLFs0LCJ0b3AiLCJweCJdLFs0LCJib3R0b20iLCJweCJdLFs0MCwiQHRyYW5zZm9ybSIsMF1dLFtbImNvbXBvbmVudCIsIkB0cmFuc2Zvcm0uc3RhcnQiXSxbImNvbXBvbmVudCIsIkB0cmFuc2Zvcm0uZG9uZSJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNvbXBvbmVudDpAdHJhbnNmb3JtLnN0YXJ0Ij09PWMmJihlPSExIT09RihiLDYpLmJKKGQpJiZlKTsiY29tcG9uZW50OkB0cmFuc2Zvcm0uZG9uZSI9PT1jJiYoZT0hMSE9PUYoYiw2KS4kSShkKSYmZSk7cmV0dXJuIGV9LGlHLGhHKSksSSg2LDMzMjU5NTIsW1sxLDRdXSwwLGNHLFt6LGNBLFJ6LE56LFQsWzIsTG9dLFsyLFhGXV0se21vZGU6WzAsIm1vZGUiXSxlZTpbMSwKIm9wZW5lZCJdfSxudWxsKSwoYSgpKCksVyg3LDAsbnVsbCwwLDEsInNpZGVuYXYiLFtdLG51bGwsW1tudWxsLCJ1cGRhdGUiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuYTsidXBkYXRlIj09PWMmJihlLnphPSExLGUuZGgubmF2aWdhdGUoW2QudGFnfHwiZW1wdHkiLGRdKSk7cmV0dXJuITB9LGJLLFlKKSksSSg4LDQ5MTUyLG51bGwsMCxoSixbS0ksY0ldLHtLZzpbMCwiZGF0YXNldHMiXX0se3VwZGF0ZToidXBkYXRlIn0pLChhKCkoKSxXKDksMCxudWxsLDEsOSwibWF0LXNpZGVuYXYtY29udGVudCIsW1siY2xhc3MiLCJtYXQtZHJhd2VyLWNvbnRlbnQgbWF0LXNpZGVuYXYtY29udGVudCJdXSxbWzQsIm1hcmdpbi1sZWZ0IiwicHgiXSxbNCwibWFyZ2luLXJpZ2h0IiwicHgiXV0sbnVsbCxudWxsLGdHLGZHKSksSSgxMCwxMjk0MzM2LFtbMiw0XV0sMCxiRyxbbmUsZEcseixWQSxUXSxudWxsLG51bGwpLChhKCkoKSxXKDExLDAsbnVsbCwwLDQsImRpdiIsW1siY2xhc3MiLCJwcm9ncmVzcy1jb250YWluZXIiXV0sCltbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJsb2FkaW5nLW1lc3NhZ2UiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMTMsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMTQsMCxudWxsLG51bGwsMSwibWF0LXByb2dyZXNzLWJhciIsW1siYXJpYS12YWx1ZW1heCIsIjEwMCJdLFsiYXJpYS12YWx1ZW1pbiIsIjAiXSxbImNsYXNzIiwibWF0LXByb2dyZXNzLWJhciJdLFsiY29sb3IiLCJwcmltYXJ5Il0sWyJtb2RlIiwiaW5kZXRlcm1pbmF0ZSJdLFsicm9sZSIsInByb2dyZXNzYmFyIl1dLFtbMSwiYXJpYS12YWx1ZW5vdyIsMF0sWzEsIm1vZGUiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxoRixnRikpLEkoMTUsNDM3NDUyOCxudWxsLDAsZUYsW3osVCxbMixrdl0sWzIsY0ZdXSx7Y29sb3I6WzAsImNvbG9yIl0sbW9kZTpbMSwKIm1vZGUiXX0sbnVsbCksKGEoKSgpLFcoMTYsMCxudWxsLDAsMiwiZGl2IixbXSxbWzgsImNsYXNzTmFtZSIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNywxNjc3NzIxNixudWxsLG51bGwsMSwicm91dGVyLW91dGxldCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgxOCwyMTI5OTIsbnVsbCwwLFR5LFt4eSxFZixVZSxbOCxudWxsXSxuZV0sbnVsbCxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEsMCk7YihjLDYsMCwic2lkZSIsIiIpO2IoYyw4LDAsZC5LZyk7YihjLDEwLDApO2IoYywxNSwwLCJwcmltYXJ5IiwiaW5kZXRlcm1pbmF0ZSIpO2IoYywxOCwwKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT1GKGMsMSkuYnE7YihjLDAsMCxlKTtlPSJlbmQiPT09RihjLDYpLnBvc2l0aW9uO3ZhciBmPSJvdmVyIj09PUYoYyw2KS5tb2RlLGc9InB1c2giPT09RihjLDYpLm1vZGUsbD0ic2lkZSI9PT1GKGMsNikubW9kZSxtPUYoYyw2KS5lZSwKcD1GKGMsNikuZHkscT1GKGMsNikuZHk/RihjLDYpLktQOm51bGwscj1GKGMsNikuZHk/RihjLDYpLkpQOm51bGwsdj1GKGMsNikuUWk7YihjLDUsMCxudWxsLGUsZixnLGwsbSxwLHEscix2KTtlPUYoYywxMCkubGgubWgubGVmdDtmPUYoYywxMCkubGgubWgucmlnaHQ7YihjLDksMCxlLGYpO2IoYywxMSwwLCFkLnphKTtiKGMsMTMsMCxkLnFHKTtlPSJpbmRldGVybWluYXRlIj09PUYoYywxNSkubW9kZXx8InF1ZXJ5Ij09PUYoYywxNSkubW9kZT9udWxsOkYoYywxNSkudmFsdWU7Zj1GKGMsMTUpLm1vZGU7Zz1GKGMsMTUpLnR2O2IoYywxNCwwLGUsZixnKTtiKGMsMTYsMCxkLnphPyJoaWRkZW4tY29udGVudCI6ImZ1bGwtaGVpZ2h0Iil9KX07dmFyIGVLPWZ1bmN0aW9uKCl7dGhpcy5iUT0hISh3aW5kb3cucGFyZW50LlRFTlNPUkJPQVJEX0VOVnx8e30pLklOX0NPTEFCfTt2YXIgZks9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2t9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjU0MHB4O21hcmdpbjo4MHB4IGF1dG8gMCBhdXRvfSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBnSyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDcsImRpdiIsW1siY2xhc3MiLCJjb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJoMyIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlByb2ZpbGluZyBpc24ndCBzdXBwb3J0ZWQgaW4gQ29sYWIgeWV0LiJdKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCw0LCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIFBsZWFzZSBzZWUgIl0pKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDEsImEiLFtbImhyZWYiLCJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkxMyJdLFsicmVsIiwibm9vcGVuZXIiXSxbInRhcmdldCIsIl9ibGFuayJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSwKbnVsbCxbIkdpdEh1YiBpc3N1ZSAjMTkxMyJdKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIl0pKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gaEsoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyMiwiZGl2IixbWyJjbGFzcyIsImNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsImgzIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiTm8gcHJvZmlsZSBkYXRhIHdhcyBmb3VuZC4iXSkpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsImhvcml6b250YWwtY2VudGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMSwiY2FwdHVyZS1wcm9maWxlIixbXSxudWxsLG51bGwsbnVsbCxySixxSikpLEkoNSw0OTE1MixudWxsLDAsa0osW3NELFBHLEtJLGNJXSxudWxsLG51bGwpLChhKCkoKSxXKDYsMCxudWxsLG51bGwsMSwicCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBJZiB5b3UgaGF2ZSBhIG1vZGVsIHJ1bm5pbmcgb24gQ1BVLCBHUFUsIG9yIEdvb2dsZSBDbG91ZCBUUFUsIHlvdSBtYXkgYmUgYWJsZSB0byB1c2UgdGhlIGFib3ZlIGJ1dHRvbiB0byBjYXB0dXJlIGEgcHJvZmlsZS4gIl0pKSwKKGEoKSgpLFcoOCwwLG51bGwsbnVsbCw0LCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIElmIHlvdSdyZSBhIENQVSBvciBHUFUgdXNlciwgcGxlYXNlIHVzZSB0aGUgSVAgYWRkcmVzcyBvcHRpb24uIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlICJdKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMSwiYSIsW1siaHJlZiIsImh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9naXRodWIvdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9kb2NzL3RlbnNvcmJvYXJkX3Byb2ZpbGluZ19rZXJhcy5pcHluYiJdLFsicmVsIiwibm9vcGVuZXIiXSxbInRhcmdldCIsIl9ibGFuayJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsidHV0b3JpYWwiXSkpLChhKCkoKSxZKC0xLG51bGwsWyIgb24gaG93IHRvIHN0YXJ0IGEgVGVuc29yRmxvdyBwcm9maWxlciBzZXJ2ZXIgYW5kIHByb2ZpbGUgYSBLZXJhcyBtb2RlbCBvbiBhIEdQVS4gIl0pKSwKKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsNCwicCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBJZiB5b3UncmUgYSBUUFUgdXNlciwgcGxlYXNlIHVzZSB0aGUgVFBVIG5hbWUgb3B0aW9uIGFuZCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZSAiXSkpLChhKCkoKSxXKDE1LDAsbnVsbCxudWxsLDEsImEiLFtbImhyZWYiLCJodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vdHB1L2RvY3MvY2xvdWQtdHB1LXRvb2xzIl0sWyJyZWwiLCJub29wZW5lciJdLFsidGFyZ2V0IiwiX2JsYW5rIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJ0dXRvcmlhbCJdKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBvbiBob3cgdG8gaW50ZXJwcmV0aW5nIHRoZSBwcm9maWxpbmcgcmVzdWx0cy4gIl0pKSwoYSgpKCksVygxOCwwLG51bGwsbnVsbCw0LCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksClkoLTEsbnVsbCxbIiBJZiB5b3UgdGhpbmsgcHJvZmlsaW5nIGlzIGRvbmUgcHJvcGVybHksIHBsZWFzZSBzZWUgdGhlIHBhZ2Ugb2YgIl0pKSwoYSgpKCksVygyMCwwLG51bGwsbnVsbCwxLCJhIixbWyJocmVmIiwiaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL3RwdS9kb2NzL3Ryb3VibGVzaG9vdGluZyJdLFsicmVsIiwibm9vcGVuZXIiXSxbInRhcmdldCIsIl9ibGFuayJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiR29vZ2xlIENsb3VkIFRQVSBUcm91Ymxlc2hvb3RpbmcgYW5kIEZBUSJdKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4gIl0pKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gaUsoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxnSykpLEkoMSwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXSxKeTpbMSwibmdJZkVsc2UiXX0sbnVsbCksKGEoKSgpLFYoMCxbWyJub19wcm9maWxlX2RhdGEiLDJdXSxudWxsLDAsbnVsbCxoSykpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYS5iUSxlPUYoYywyKTtiKGMsMSwwLGQsZSl9LG51bGwpfXZhciBqSz1RZygiZW1wdHktcGFnZSIsZUssZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJlbXB0eS1wYWdlIixbXSxudWxsLG51bGwsbnVsbCxpSyxmSykpLEkoMSw0OTE1MixudWxsLDAsZUssW10sbnVsbCxudWxsKV0sbnVsbCxudWxsKX0pO3ZhciBrSz1mdW5jdGlvbigpe307dmFyIGxLPSJpbmZlZWRfcGVyY2VudF9hdmVyYWdlIGluZmVlZF9wZXJjZW50X21heGltdW0gaW5mZWVkX3BlcmNlbnRfbWluaW11bSBpbmZlZWRfcGVyY2VudF9zdGFuZGFyZF9kZXZpYXRpb24gc3RlcHRpbWVfbXNfYXZlcmFnZSBzdGVwdGltZV9tc19tYXhpbXVtIHN0ZXB0aW1lX21zX21pbmltdW0gc3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9uIHN1bW1hcnlfY29uY2x1c2lvbiBzdW1tYXJ5X25leHRzdGVwIi5zcGxpdCgiICIpLG1LPVsiYWR2YW5jZWRfZmlsZV9yZWFkX3VzIiwiZGVtYW5kZWRfZmlsZV9yZWFkX3VzIiwiZW5xdWV1ZV91cyIsInByZXByb2Nlc3NpbmdfdXMiLCJ1bmNsYXNzaWZpZWRfbm9uZXF1ZXVlX3VzIl0sbks9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5vYj1iO3RoaXMuc3RvcmU9Yzt0aGlzLmh0PXRoaXMuUWc9dGhpcy5XaD1udWxsO3RoaXMuTkY9ITA7dGhpcy5kaWFnbm9zdGljcz17aW5mbzpbXSx3YXJuaW5nczpbXSxlcnJvcnM6W119OwphLnBhcmFtcy5zdWJzY3JpYmUoZnVuY3Rpb24oZSl7ZC51cGRhdGUoZSl9KX0sb0s9ZnVuY3Rpb24oYSxiLGMpe2M9dm9pZCAwPT09Yz9bXTpjO2lmKCFhKXJldHVybnt9O2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZT1hW2RdO2lmKGUmJihlLmNvbHMmJmUuY29scy5maW5kKGZ1bmN0aW9uKGYpe3JldHVybiBmLmlkPT09Yn0pfHxlLnAmJk9iamVjdC5rZXlzKGUucCkuZmluZChmdW5jdGlvbihmKXtyZXR1cm4gYy5pbmNsdWRlcyhmKX0pKSlyZXR1cm4gZX1yZXR1cm57fX07Cm5LLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuZ2F8fCIiLGQ9YS50YWd8fCJpbnB1dF9waXBlbGluZV9hbmFseXplciI7YT1hLmhvc3R8fCIiO3RoaXMuc3RvcmUueGEoZUooe0RiOnt6YTohMCxtZXNzYWdlOiJMb2FkaW5nIGRhdGEifX0pKTt0aGlzLm9iLmdldERhdGEoYyxkLGEpLnN1YnNjcmliZShmdW5jdGlvbihlKXtiLnN0b3JlLnhhKGVKKHtEYjp7emE6ITEsbWVzc2FnZToiIn19KSk7ZT1lfHxbXTtiLldoPW9LKGUsInN0ZXBudW0iLGxLKTtiLlFnPW9LKGUsIm9wTmFtZSIsbUspO2IuaHQ9b0soZSwibGluayIpO2IuZGlhZ25vc3RpY3M9SEoob0soZSwic2V2ZXJpdHkiKSk7ZT1iLldofHx7fTtlLnA9ZS5wfHx7fTtiLk5GPSEhZS5yb3dzJiYwPGUucm93cy5sZW5ndGh9KX07dmFyIHBLPWZ1bmN0aW9uKCl7dGhpcy5kaWFnbm9zdGljcz17aW5mbzpbXSx3YXJuaW5nczpbXSxlcnJvcnM6W119fTt2YXIgcUs9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY30uY2FsbG91dFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzowO2JvcmRlci1sZWZ0Om5vbmUgIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjRweH0uY2FsbG91dFtfbmdjb250ZW50LSVDT01QJV0gICBoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MjRweDtmb250LXdlaWdodDo1MDA7cGFkZGluZzo4cHggMTZweDttYXJnaW46MDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMH0uY2FsbG91dFtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjE2cHg7bWFyZ2luOjA7Zm9udC1zaXplOjE0cHh9LmNhbGxvdXRbX25nY29udGVudC0lQ09NUCVdID4gW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmZpcnN0LWNoaWxkKXtwYWRkaW5nOjEycHggMjRweH0uY2FsbG91dC5pcy1jcml0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNkZDAwMzE7YmFja2dyb3VuZDpyZ2JhKDIyMSwwLDQ5LC4wNSl9LmNhbGxvdXQuaXMtY3JpdGljYWxbX25nY29udGVudC0lQ09NUCVdICAgaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNkZDAwMzF9LmNhbGxvdXQuaXMtaW1wb3J0YW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDE1MiwwLC4wNSl9LmNhbGxvdXQuaXMtaW1wb3J0YW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGhlYWRlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZhMDAwfS5jYWxsb3V0LmlzLWhlbHBmdWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMTk3NmQyO2JhY2tncm91bmQ6cmdiYSgyNSwxMTgsMjEwLC4wNSl9LmNhbGxvdXQuaXMtaGVscGZ1bFtfbmdjb250ZW50LSVDT01QJV0gICBoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzE5NzZkMn0iXV0sCmRhdGE6e319KTtmdW5jdGlvbiBySyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsImxpIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxLG51bGwsWyIgIiwiICJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMuY29udGV4dC5QKX0pfQpmdW5jdGlvbiBzSyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJjYWxsb3V0IGlzLWNyaXRpY2FsIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiaGVhZGVyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRXJyb3JzIl0pKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHJLKSksSSg0LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDQsMCxjLmEuZGlhZ25vc3RpY3MuZXJyb3JzKX0sbnVsbCl9CmZ1bmN0aW9uIHRLKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwibGkiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDEsbnVsbCxbIiAiLCIgIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlApfSl9CmZ1bmN0aW9uIHVLKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImNhbGxvdXQgaXMtaW1wb3J0YW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiaGVhZGVyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiV2FybmluZ3MiXSkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsdEspKSxJKDQsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsNCwwLGMuYS5kaWFnbm9zdGljcy53YXJuaW5ncyl9LG51bGwpfQpmdW5jdGlvbiB2SyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsImxpIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxLG51bGwsWyIgIiwiICJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMuY29udGV4dC5QKX0pfQpmdW5jdGlvbiB3SyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJjYWxsb3V0IGlzLWhlbHBmdWwiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJoZWFkZXIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJJbmZvIl0pKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHZLKSksSSg0LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDQsMCxjLmEuZGlhZ25vc3RpY3MuaW5mbyl9LG51bGwpfQpmdW5jdGlvbiB4SyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHNLKSksSSgxLDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHVLKSksSSgzLDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHdLKSksSSg1LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEsMCxkLmRpYWdub3N0aWNzLmVycm9ycy5sZW5ndGgpO2IoYywzLDAsZC5kaWFnbm9zdGljcy53YXJuaW5ncy5sZW5ndGgpO2IoYyw1LDAsZC5kaWFnbm9zdGljcy5pbmZvLmxlbmd0aCl9LG51bGwpfTt2YXIgeUs9ZnVuY3Rpb24oKXt0aGlzLmNJPXRoaXMuenQ9IiJ9O2suT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeUsucHJvdG90eXBlLHtXaDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsc2V0OmZ1bmN0aW9uKGEpe2E9YXx8e307YS5wPWEucHx8e307dGhpcy56dD1hLnAuc3VtbWFyeV9jb25jbHVzaW9ufHwiIjt0aGlzLmNJPShhLnAuc3VtbWFyeV9uZXh0c3RlcHx8IiIpLnJlcGxhY2UoL3NlY3Rpb24gMi9nLCJEZXZpY2Utc2lkZSBhbmFseXNpcyBkZXRhaWxzIHNlY3Rpb24iKS5yZXBsYWNlKC9zZWN0aW9uIDMvZywiSG9zdC1zaWRlIGFuYWx5c2lzIGRldGFpbHMgc2VjdGlvbiIpO3RoaXMuenQuaW5jbHVkZXMoIkhJR0hMWSIpfHx0aGlzLnp0LmluY2x1ZGVzKCJNT0RFUkFURSIpfX19KTt2YXIgeks9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoyMHB4fS5zdW1tYXJ5LWNvbmNsdXNpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi10b3A6LTE2cHh9LnN1bW1hcnktbmV4dHN0ZXBbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTE2cHh9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIEFLKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiU3VtbWFyeSBvZiBpbnB1dC1waXBlbGluZSBhbmFseXNpcyJdKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwic3VtbWFyeS1jb25jbHVzaW9uIGRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDMsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJSZWNvbW1lbmRhdGlvbiBmb3IgbmV4dCBzdGVwOiJdKSksKGEoKSgpLApXKDcsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsInN1bW1hcnktbmV4dHN0ZXAgZGVzY3JpcHRpb24iXV0sW1s4LCJpbm5lckhUTUwiLDFdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDMsMCxkLnp0KTtiKGMsNywwLGQuY0kpfSl9O3ZhciBCSz1bInN0ZXBudW0iLCJpbmZlZWRQZXJjZW50QXZlcmFnZSIsImluZmVlZFBlcmNlbnRNaW4iLCJpbmZlZWRQZXJjZW50TWF4Il0sQ0s9WyJzdGVwbnVtIiwiY29tcHV0ZVRpbWVNcyIsImlucHV0VGltZU1zIiwiaWRsZVRpbWVNcyIsInRvb2x0aXAiXSxESz0ic3RlcG51bSBkZXZpY2VDb21wdXRlVGltZU1zIGRldmljZVRvRGV2aWNlVGltZU1zIGhvc3RDb21wdXRlVGltZU1zIGtlcm5lbExhdW5jaFRpbWVNcyBpbmZlZWRUaW1lTXMgb3V0ZmVlZFRpbWVNcyBjb21waWxlVGltZU1zIG90aGVyVGltZU1zIHRvb2x0aXAiLnNwbGl0KCIgIiksRUs9WyJncmVlbiIsImNyaW1zb24iLCJibHVlIl0sRks9IiM5Q0NDNjUgI0ZGRUIzQiAjNjRCNUY2ICNGRjk4MDAgI0I3MUMxQyBibGFjayAjMDA2OTVDICM1RTM1QjEiLnNwbGl0KCIgIiksR0s9ZnVuY3Rpb24oKXt0aGlzLmdpPSEwO3RoaXMuc3k9bnVsbDt0aGlzLmVpPXt9O3RoaXMuSmk9e307dGhpcy5Ncz10aGlzLlFyPW51bGx9OwpHSy5wcm90b3R5cGUuTGM9ZnVuY3Rpb24oKXt0aGlzLmphKCl9O0dLLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMuTGEoKX07CkdLLnByb3RvdHlwZS5MYT1mdW5jdGlvbigpe2lmKHRoaXMuc3kmJnRoaXMuTXMmJnRoaXMuUXIpe3ZhciBhPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUodGhpcy5zeSksYj1hLmNsb25lKCk7aWYodGhpcy5RciYmYil7Zm9yKHZhciBjPTAsZD10aGlzLmdpP0NLOkRLLGU9dGhpcy5naT9FSzpGSztjPGIuZ2V0TnVtYmVyT2ZDb2x1bW5zKCk7KWQuaW5jbHVkZXMoYi5nZXRDb2x1bW5JZChjKSk/YysrOmIucmVtb3ZlQ29sdW1uKGMpO3RoaXMuUXIuZHJhdyhiLHtoQXhpczp7dGl0bGU6IlN0ZXAgTnVtYmVyIn0sdkF4aXM6e3RpdGxlOiJNaWxsaXNlY29uZHMiLGZvcm1hdDoiIyMjLiMjIyNtcyIsbWluVmFsdWU6MH0sY2hhcnRBcmVhOntsZWZ0OjEwMCx0b3A6MTAsd2lkdGg6IjY1JSIsaGVpZ2h0OiI5MCUifSx3aWR0aDo4MjAsaGVpZ2h0OjMwMCxjb2xvcnM6ZSxiYWNrZ3JvdW5kQ29sb3I6e2ZpbGw6InRyYW5zcGFyZW50In0saXNTdGFja2VkOiEwfSl9YT1hLmNsb25lKCk7CmlmKHRoaXMuTXMmJmEpe2ZvcihiPTA7YjxhLmdldE51bWJlck9mQ29sdW1ucygpOylCSy5pbmNsdWRlcyhhLmdldENvbHVtbklkKGIpKT9iKys6YS5yZW1vdmVDb2x1bW4oYik7dGhpcy5Ncy5kcmF3KGEse2hBeGlzOnt0aXRsZToiU3RlcCBOdW1iZXIifSx2QXhpczp7dGl0bGU6IiUgb2Ygc3RlcCB0aW1lIixmb3JtYXQ6IiMjIy4jIyMnJScifSxjaGFydEFyZWE6e2xlZnQ6MTAwLHRvcDoxMCx3aWR0aDoiNjUlIixoZWlnaHQ6IjkwJSJ9LHdpZHRoOjgyMCxoZWlnaHQ6MzAwLGxlZ2VuZDoibm9uZSIsbGluZVdpZHRoOjEsY29sb3JzOlsibm9uZSJdLGJhY2tncm91bmRDb2xvcjp7ZmlsbDoidHJhbnNwYXJlbnQifSxpbnRlcnZhbHM6e3N0eWxlOiJib3hlcyIsY29sb3I6InJlZCJ9fSl9fX07CkdLLnByb3RvdHlwZS5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTtnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7YS5Rcj1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQXJlYUNoYXJ0KGEuR08uaSk7YS5Ncz1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uTGluZUNoYXJ0KGEub1EuaSk7YS5MYSgpfSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEdLLnByb3RvdHlwZSx7V2g6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihhKXthPSh0aGlzLnN5PWEpfHx7fTthLnA9YS5wfHx7fTthLnJvd3MmJjAhPT1hLnJvd3MubGVuZ3RoJiYodGhpcy5naT0iVFBVIj09PShhLnAuaGFyZHdhcmVfdHlwZXx8IlRQVSIpLHRoaXMuSmkuc3g9YS5wLnN0ZXB0aW1lX21zX2F2ZXJhZ2V8fCIiLHRoaXMuSmkubWF4PWEucC5zdGVwdGltZV9tc19tYXhpbXVtfHwiIix0aGlzLkppLm1pbj1hLnAuc3RlcHRpbWVfbXNfbWluaW11bXx8IiIsdGhpcy5KaS55ej1hLnAuc3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9ufHwiIix0aGlzLmVpLnN4PWEucC5pbmZlZWRfcGVyY2VudF9hdmVyYWdlfHwiIix0aGlzLmVpLm1heD1hLnAuaW5mZWVkX3BlcmNlbnRfbWF4aW11bXx8IiIsdGhpcy5laS5taW49YS5wLmluZmVlZF9wZXJjZW50X21pbmltdW18fCIiLHRoaXMuZWkueXo9YS5wLmluZmVlZF9wZXJjZW50X3N0YW5kYXJkX2RldmlhdGlvbnx8CiIiKX19fSk7dmFyIEhLPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MjBweH0uY29udGVudC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjMycHg7bWFyZ2luLXRvcDotMTZweH0uY29udGVudC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowfS5zdWItc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIycHg7bWFyZ2luLWxlZnQ6OHB4fS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTo0cHh9LmNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDotNTJweH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gSUsoYSl7cmV0dXJuIFooMCxbWCg2NzEwODg2NDAsMSx7R086MH0pLFgoNjcxMDg4NjQwLDIse29ROjB9KSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDM1LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRGV2aWNlLXNpZGUgYW5hbHlzaXMgZGV0YWlscyJdKSksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhlYWRsaW5lIHN1Yi1zZWN0aW9uLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJEZXZpY2Ugc3RlcCB0aW1lIl0pKSwoYSgpKCksVyg3LDAsbnVsbCxudWxsLDEwLCJkaXYiLFtbImNsYXNzIiwiY29udGVudC1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksCihhKCkoKSxXKDgsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRGV2aWNlIHN0ZXAtdGltZSBzdGF0aXN0aWNzIl0pKSwoYSgpKCksVygxMCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDExLG51bGwsWyIgQXZlcmFnZTogIiwiIG1zIChcdTAzYzMgPSAiLCIgbXMpICJdKSksKGEoKSgpLFcoMTIsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInByaW1hcnktY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxMyxudWxsLFsiIFJhbmdlOiAiLCIgLSAiLCIgbXMgIl0pKSwoYSgpKCksVygxNCwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsMSwKImRpdiIsW1siY2xhc3MiLCJtYXQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlN0ZXAgVGltZSAoaW4gbWlsbGlzZWNvbmRzKSJdKSksKGEoKSgpLFcoMTcsMCxbWzEsMF0sWyJhcmVhQ2hhcnQiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJjaGFydCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxOCwwLG51bGwsbnVsbCwwLCJiciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTksMCxudWxsLG51bGwsMTgsImRpdiIsW10sW1s4LCJjbGFzc05hbWUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSBzdWItc2VjdGlvbi10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIFJhbmdlIG9mIGRldmljZSB0aW1lIHdhaXRpbmcgZm9yIGlucHV0IGRhdGEgYWNyb3NzIGNvcmVzIGF0IGVhY2ggc3RlcCAiXSkpLAooYSgpKCksVygyMiwwLG51bGwsbnVsbCwxNSwiZGl2IixbWyJjbGFzcyIsImNvbnRlbnQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiUgb2YgZGV2aWNlIHN0ZXAgdGltZSB3YWl0aW5nIGZvciBpbnB1dCBkYXRhIl0pKSwoYSgpKCksVygyNSwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiAoYXZlcmFnZSBvdmVyIHRoZSAiXSkpLChhKCkoKSxXKDI3LDAsbnVsbCxudWxsLDEsImkiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJtYXhpbXVtIl0pKSwoYSgpKCksWSgtMSxudWxsLFsiIHdhaXRpbmcgdGltZSBhY3Jvc3MgY29yZXMgYXQgZWFjaCBzdGVwKSAiXSkpLAooYSgpKCksVygzMCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDMxLG51bGwsWyIgQXZlcmFnZTogIiwiICUgKFx1MDNjMyA9ICIsIiBtcykgIl0pKSwoYSgpKCksVygzMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDMzLG51bGwsWyIgUmFuZ2U6ICIsIiAtICIsIiAlICJdKSksKGEoKSgpLFcoMzQsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDM1LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBSYW5nZSBvZiBkZXZpY2UgdGltZSB3YWl0aW5nIGZvciBpbnB1dCBkYXRhIGFjcnNzcyBjb3JlcyBhdCBlYWNoIHN0ZXAgKGluICUgb2Ygc3RlcCB0aW1lKSAiXSkpLAooYSgpKCksVygzNywwLFtbMiwwXSxbImxpbmVDaGFydCIsMV1dLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImNoYXJ0Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxMSwwLGQuSmkuc3gsZC5KaS55eik7YihjLDEzLDAsZC5KaS5taW4sZC5KaS5tYXgpO2IoYywxOSwwLGQuZ2k/ImZ1bGwtaGVpZ2h0IjoiaGlkZGVuLWNvbnRlbnQiKTtiKGMsMzEsMCxkLmVpLnN4LGQuZWkueXopO2IoYywzMywwLGQuZWkubWluLGQuZWkubWF4KX0pfTt2YXIgSks9ZnVuY3Rpb24oKXt0aGlzLlFnPW51bGw7dGhpcy5Ccz0hMTt0aGlzLnNIPVtdO3RoaXMudGFibGU9dGhpcy5acj1udWxsfTtoPUpLLnByb3RvdHlwZTtoLkxjPWZ1bmN0aW9uKCl7dGhpcy5qYSgpfTtoLlNhPWZ1bmN0aW9uKCl7dGhpcy5MYSgpfTsKaC5MYT1mdW5jdGlvbigpe2lmKHRoaXMuUWcmJnRoaXMuWnImJnRoaXMudGFibGUpe2lmKHRoaXMuUWcmJnRoaXMuWnIpe3ZhciBhPXRoaXMuUWcucHx8e307YT1nb29nbGUudmlzdWFsaXphdGlvbi5hcnJheVRvRGF0YVRhYmxlKFsiSW5wdXQgdGltZSBicmVha2Rvd247T3RoZXIgZGF0YSByZWFkaW5nIG9yIHByb2Nlc3NpbmcgKGluIG1zKTtSZWFkaW5nIGRhdGEgZnJvbSBmaWxlcyBvbiBkZW1hbmQgKGluIG1zKTtSZWFkaW5nIGRhdGEgZnJvbSBmaWxlcyBpbiBhZHZhbmNlIFtpbmNsdWRpbmcgY2FjaGluZywgcHJlZmV0Y2hpbmcsIGludGVybGVhdmluZ10gKGluIG1zKTtEYXRhIHByZXByb2Nlc3NpbmcgKGluIG1zKTtFbnF1ZXVpbmcgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCB0byBkZXZpY2UgKGluIG1zKSIuc3BsaXQoIjsiKSxbIiIsTnVtYmVyKGEudW5jbGFzc2lmaWVkX25vbmVxdWV1ZV91cykvMUUzLE51bWJlcihhLmRlbWFuZGVkX2ZpbGVfcmVhZF91cykvMUUzLE51bWJlcihhLmFkdmFuY2VkX2ZpbGVfcmVhZF91cykvCjFFMyxOdW1iZXIoYS5wcmVwcm9jZXNzaW5nX3VzKS8xRTMsTnVtYmVyKGEuZW5xdWV1ZV91cykvMUUzXV0pO3RoaXMuWnIuZHJhdyhhLHtiYXI6e2dyb3VwV2lkdGg6IjQ1JSJ9LGNoYXJ0QXJlYTp7bGVmdDo0MCx3aWR0aDoiNTAlIixoZWlnaHQ6IjkwJSJ9LHdpZHRoOjgwMCxoZWlnaHQ6MzAwLGNvbG9yczpbInJlZCIsImJsdWUiLCJvcmFuZ2UiLCJncmVlbiIsInB1cnBsZSJdLGJhY2tncm91bmRDb2xvcjp7ZmlsbDoidHJhbnNwYXJlbnQifSxpc1N0YWNrZWQ6InBlcmNlbnQifSl9dGhpcy5wYigpfX07CmgucGI9ZnVuY3Rpb24oKXtpZih0aGlzLlFnJiZ0aGlzLnRhYmxlKXt2YXIgYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKHRoaXMuUWcpO2lmKDE+YS5nZXROdW1iZXJPZlJvd3MoKSl0aGlzLkJzPSExO2Vsc2V7dGhpcy5Ccz0hMDtmb3IodmFyIGI9MCxjPTAsZD0wLGU9MCxmPTAsZz0wLGw9MCxtPTA7bTxhLmdldE51bWJlck9mQ29sdW1ucygpO20rKylzd2l0Y2goYS5nZXRDb2x1bW5JZChtKSl7Y2FzZSAib3BOYW1lIjpiPW07YnJlYWs7Y2FzZSAiY291bnQiOmM9bTticmVhaztjYXNlICJ0aW1lSW5NcyI6ZD1tO2JyZWFrO2Nhc2UgInRpbWVJblBlcmNlbnQiOmU9bTticmVhaztjYXNlICJzZWxmVGltZUluTXMiOmY9bTticmVhaztjYXNlICJzZWxmVGltZUluUGVyY2VudCI6Zz1tO2JyZWFrO2Nhc2UgImNhdGVnb3J5IjpsPW19bT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uTnVtYmVyRm9ybWF0KHtwYXR0ZXJuOiIjIy4jJSJ9KTttLmZvcm1hdChhLGUpO20uZm9ybWF0KGEsCmcpO209bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7ZnJhY3Rpb25EaWdpdHM6MH0pO20uZm9ybWF0KGEsZCk7bS5mb3JtYXQoYSxmKTthLnNldFByb3BlcnR5KDAsYiwic3R5bGUiLCJ3aWR0aDogNDAlIik7YS5zZXRQcm9wZXJ0eSgwLGMsInN0eWxlIiwid2lkdGg6IDE1JSIpO2Euc2V0UHJvcGVydHkoMCxkLCJzdHlsZSIsIndpZHRoOiAxMCUiKTthLnNldFByb3BlcnR5KDAsZSwic3R5bGUiLCJ3aWR0aDogNSUiKTthLnNldFByb3BlcnR5KDAsZiwic3R5bGUiLCJ3aWR0aDogMTAlIik7YS5zZXRQcm9wZXJ0eSgwLGcsInN0eWxlIiwid2lkdGg6IDUlIik7YS5zZXRQcm9wZXJ0eSgwLGwsInN0eWxlIiwid2lkdGg6IDE1JSIpO3RoaXMudGFibGUuZHJhdyhhLHtzaG93Um93TnVtYmVyOiExLGNzc0NsYXNzTmFtZXM6e29kZFRhYmxlUm93OiJnb29nbGUtY2hhcnQtdGFibGUtb2RkLXRhYmxlLXJvdyIsaGVhZGVyQ2VsbDoiZ29vZ2xlLWNoYXJ0LXRhYmxlLWhlYWRlci1jZWxsIiwKdGFibGVDZWxsOiJnb29nbGUtY2hhcnQtdGFibGUtdGFibGUtY2VsbCJ9fSl9fX07aC5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsiY29yZWNoYXJ0IiwidGFibGUiXX0pO2dvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soZnVuY3Rpb24oKXthLlpyPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChhLiRPLmkpO2EudGFibGU9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlKGEuQmYuaSk7YS5MYSgpfSl9OwprLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEpLLnByb3RvdHlwZSx7aHQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHNldDpmdW5jdGlvbihhKXt2YXIgYj10aGlzO2E9YXx8e307YS5yb3dzPWEucm93c3x8W107YS5yb3dzLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5jJiZjLmNbMF0mJmMuY1swXS52JiZiLnNILnB1c2goU3RyaW5nKGMuY1swXS52KSl9KX19fSk7dmFyIEtLPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9bWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lICFpbXBvcnRhbnQ7bWFyZ2luOjhweDttYXJnaW46MH1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpe21hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbjo4cHggOHB4IDAgOHB4fW1hdC1wYW5lbC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fW1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2VlZSAhaW1wb3J0YW50fS5tYXQtZXhwYW5kZWRbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5zZWN0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2VlZTtwYWRkaW5nOjIwcHh9LmNvbnRlbnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDozMnB4fS5jb2x1bW4tY2hhcnRbX25nY29udGVudC0lQ09NUCVdLCAucmVjb21tZW5kYXRpb25zW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhO21hcmdpbi10b3A6LTE2cHh9Il1dLApkYXRhOnt9fSk7ZnVuY3Rpb24gTEsoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCJkaXYiLFtdLFtbOCwiaW5uZXJIVE1MIiwxXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDAsMCxjLmNvbnRleHQuUCl9KX0KZnVuY3Rpb24gTUsoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwic2VjdGlvbi1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhlYWRsaW5lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJIb3N0LXNpZGUgYW5hbHlzaXMgZGV0YWlscyJdKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiSG9zdCBzaWRlIGFuYWx5c2lzIGNhbiBub3QgYmUgZG9uZSB3aXRob3V0IGluc3RydW1lbnRhdGlvbi4iXSkpXSxudWxsLG51bGwpfQpmdW5jdGlvbiBOSyhhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHskTzowfSksWCg2NzEwODg2NDAsMix7QmY6MH0pLChhKCkoKSxXKDIsMCxudWxsLG51bGwsMjMsImRpdiIsW10sW1s4LCJjbGFzc05hbWUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxMSwiZGl2IixbWyJjbGFzcyIsInNlY3Rpb24tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiSG9zdC1zaWRlIGFuYWx5c2lzIGRldGFpbHMiXSkpLChhKCkoKSxXKDYsMCxudWxsLG51bGwsOCwiZGl2IixbWyJjbGFzcyIsImNvbnRlbnQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDcsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsCiJtYXQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkJyZWFrZG93biBvZiBpbnB1dCBwcm9jZXNzaW5nIHRpbWUgb24gdGhlIGhvc3QiXSkpLChhKCkoKSxXKDksMCxbWzEsMF0sWyJjb2x1bW5DaGFydCIsMV1dLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImNvbHVtbi1jaGFydCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxMCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJXaGF0IGNhbiBiZSBkb25lIHRvIHJlZHVjZSBhYm92ZSBjb21wb25lbnRzIG9mIHRoZSBob3N0IGlucHV0IHRpbWU6Il0pKSwoYSgpKCksVygxMiwwLG51bGwsbnVsbCwyLCJkaXYiLFtbImNsYXNzIiwicmVjb21tZW5kYXRpb25zIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsCm51bGwsMSxudWxsLExLKSksSSgxNCwyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpLChhKCkoKSxXKDE1LDE2Nzc3MjE2LG51bGwsbnVsbCw5LCJtYXQtZXhwYW5zaW9uLXBhbmVsIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwiXV0sW1syLCJtYXQtZXhwYW5kZWQiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzIsIm1hdC1leHBhbnNpb24tcGFuZWwtc3BhY2luZyIsbnVsbF1dLG51bGwsbnVsbCxPRCxNRCkpLEkoMTYsMTc1MzA4OCxudWxsLDEsRkQsW1szLENEXSxuZSxIQSxFZixMbyxbMixrdl0sWzIsRURdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDMse3p2OjB9KSxtaCgyNTYsbnVsbCxDRCx2b2lkIDAsW10pLChhKCkoKSxXKDE5LDAsbnVsbCwwLDQsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIG1hdC1mb2N1cy1pbmRpY2F0b3IiXSwKWyJyb2xlIiwiYnV0dG9uIl1dLFtbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtY29udHJvbHMiLDBdLFsxLCJhcmlhLWV4cGFuZGVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzIsIm1hdC1leHBhbmRlZCIsbnVsbF0sWzIsIm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1hZnRlciIsbnVsbF0sWzIsIm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmUiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzQsImhlaWdodCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDIwKS5UdygpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwyMCkudEMoZCkmJmUpO3JldHVybiBlfSxMRCxKRCkpLEkoMjAsNDM3NDUyOCxudWxsLDAsR0QsW0ZELHosUnosbmUsWzIsRURdLFsyLGt2XV0sbnVsbCxudWxsKSwKKGEoKSgpLFcoMjEsMCxudWxsLDAsMiwibWF0LXBhbmVsLXRpdGxlIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMjIsMTYzODQsbnVsbCwwLEhELFtdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsbnVsbCxbIklucHV0IE9wIHN0YXRpc3RpY3MiXSkpLChhKCkoKSxXKDI0LDAsW1syLDBdLFsidGFibGUiLDFdXSwxLDAsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjUsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsTUspKSxJKDI3LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDE0LDAsZC5zSCk7YihjLDI3LDAsIWQuQnMpfSxmdW5jdGlvbihiLGMpe2IoYywyLDAsYy5hLkJzPwoiZnVsbC1oZWlnaHQiOiJoaWRkZW4tY29udGVudCIpO3ZhciBkPUYoYywxNikuTWEsZT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDE2KS5pYSxmPUYoYywxNikuVUIoKTtiKGMsMTUsMCxkLGUsZik7ZD1GKGMsMjApLkJhLmJ2O2U9RihjLDIwKS5kaXNhYmxlZD8tMTowO2Y9RihjLDIwKS5CYS5pZDt2YXIgZz1GKGMsMjApLkJhLk1hLGw9RihjLDIwKS5CYS5kaXNhYmxlZCxtPUYoYywyMCkuQmEuTWEscD0iYWZ0ZXIiPT09RihjLDIwKS5CYS53bSxxPSJiZWZvcmUiPT09RihjLDIwKS5CYS53bSxyPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMjApLmlhLHY9RihjLDIwKS5FQigpO2IoYywxOSwwLGQsZSxmLGcsbCxtLHAscSxyLHYpfSl9O3ZhciBPSz1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9ja30iXV0sZGF0YTp7fX0pOwpmdW5jdGlvbiBQSyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGlhZ25vc3RpY3MtdmlldyIsW10sbnVsbCxudWxsLG51bGwseEsscUspKSxJKDIsNDkxNTIsbnVsbCwwLHBLLFtdLHtkaWFnbm9zdGljczpbMCwiZGlhZ25vc3RpY3MiXX0sbnVsbCksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJhbmFseXNpcy1zdW1tYXJ5IixbXSxudWxsLG51bGwsbnVsbCxBSyx6SykpLEkoNCw0OTE1MixudWxsLDAseUssW10se1doOlswLCJkZXZpY2VBbmFseXNpcyJdfSxudWxsKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDEsIm1hdC1kaXZpZGVyIixbWyJjbGFzcyIsIm1hdC1kaXZpZGVyIl0sWyJyb2xlIiwic2VwYXJhdG9yIl1dLFtbMSwiYXJpYS1vcmllbnRhdGlvbiIsMF0sWzIsIm1hdC1kaXZpZGVyLXZlcnRpY2FsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaG9yaXpvbnRhbCIsCm51bGxdLFsyLCJtYXQtZGl2aWRlci1pbnNldCIsbnVsbF1dLG51bGwsbnVsbCxCRCxBRCkpLEkoNiw0OTE1MixudWxsLDAseUQsW10sbnVsbCxudWxsKSwoYSgpKCksVyg3LDAsbnVsbCxudWxsLDQsImRpdiIsW10sW1s4LCJjbGFzc05hbWUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCwxLCJkZXZpY2Utc2lkZS1hbmFseXNpcy1kZXRhaWwiLFtdLG51bGwsbnVsbCxudWxsLElLLEhLKSksSSg5LDQ3Njc3NDQsbnVsbCwwLEdLLFtdLHtXaDpbMCwiZGV2aWNlQW5hbHlzaXMiXX0sbnVsbCksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMSwibWF0LWRpdmlkZXIiLFtbImNsYXNzIiwibWF0LWRpdmlkZXIiXSxbInJvbGUiLCJzZXBhcmF0b3IiXV0sW1sxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLApudWxsXV0sbnVsbCxudWxsLEJELEFEKSksSSgxMSw0OTE1MixudWxsLDAseUQsW10sbnVsbCxudWxsKSwoYSgpKCksVygxMiwwLG51bGwsbnVsbCwxLCJob3N0LXNpZGUtYW5hbHlzaXMtZGV0YWlsIixbXSxudWxsLG51bGwsbnVsbCxOSyxLSykpLEkoMTMsNDc2Nzc0NCxudWxsLDAsSkssW10se1FnOlswLCJob3N0QW5hbHlzaXMiXSxodDpbMSwicmVjb21tZW5kYXRpb24iXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyLDAsZC5kaWFnbm9zdGljcyk7YihjLDQsMCxkLldoKTtiKGMsOSwwLGQuV2gpO2IoYywxMywwLGQuUWcsZC5odCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9RihjLDYpLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiLGY9RihjLDYpLnZlcnRpY2FsLGc9IUYoYyw2KS52ZXJ0aWNhbCxsPUYoYyw2KS5IZTtiKGMsNSwwLGUsZixnLGwpO2IoYyw3LDAsZC5ORj8iZnVsbC1oZWlnaHQiOiJoaWRkZW4tY29udGVudCIpO2U9RihjLDExKS52ZXJ0aWNhbD8KInZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsMTEpLnZlcnRpY2FsO2c9IUYoYywxMSkudmVydGljYWw7bD1GKGMsMTEpLkhlO2IoYywxMCwwLGUsZixnLGwpfSl9dmFyIFFLPVFnKCJpbnB1dC1waXBlbGluZSIsbkssZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJpbnB1dC1waXBlbGluZSIsW10sbnVsbCxudWxsLG51bGwsUEssT0spKSxJKDEsNDkxNTIsbnVsbCwwLG5LLFt4dyxLSSxjSV0sbnVsbCxudWxsKV0sbnVsbCxudWxsKX0pO3ZhciBSSz1mdW5jdGlvbigpe307dmFyIFNLPWZ1bmN0aW9uKCl7fTt2YXIgVEs9ZnVuY3Rpb24oKXt9O3ZhciBVSz1mdW5jdGlvbigpe307dmFyIFZLPWZ1bmN0aW9uKCl7fTt2YXIgV0s9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5vYj1iO3RoaXMuc3RvcmU9Yzt0aGlzLmRhdGE9bnVsbDt0aGlzLmhvc3Q9dGhpcy5nYT0iIjt0aGlzLnJvPSExO2EucGFyYW1zLnN1YnNjcmliZShmdW5jdGlvbihlKXtkLnVwZGF0ZShlKX0pfTtXSy5wcm90b3R5cGUuVmw9ZnVuY3Rpb24oKXt0aGlzLm9iLlZsKHRoaXMuZ2EsImtlcm5lbF9zdGF0cyIsdGhpcy5ob3N0KX07CldLLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLmdhPWEuZ2F8fCIiO3RoaXMuaG9zdD1hLmhvc3R8fCIiO3RoaXMuc3RvcmUueGEoZUooe0RiOnt6YTohMCxtZXNzYWdlOiJMb2FkaW5nIGRhdGEifX0pKTt0aGlzLm9iLmdldERhdGEodGhpcy5nYSwia2VybmVsX3N0YXRzIix0aGlzLmhvc3QpLnN1YnNjcmliZShmdW5jdGlvbihjKXtiLnN0b3JlLnhhKGVKKHtEYjp7emE6ITEsbWVzc2FnZToiIn19KSk7Yi5kYXRhPShjfHxbe31dKVswXTtiLnJvPSEhYi5kYXRhLnJvd3MmJjA8Yi5kYXRhLnJvd3MubGVuZ3RofSl9O3ZhciBYSz1mdW5jdGlvbigpe3RoaXMuaGk9bnVsbDt0aGlzLnRvdGFsPXRoaXMuY291bnQ9MH07aD1YSy5wcm90b3R5cGU7aC5PYj1mdW5jdGlvbigpe3RoaXMuamEoKX07aC5TYT1mdW5jdGlvbigpe3RoaXMuTGEoKX07CmguZ2V0RGF0YVRhYmxlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuaGkpcmV0dXJuIG51bGw7aWYodGhpcy5kYXRhVGFibGUpcmV0dXJuIHRoaXMuZGF0YVRhYmxlO2Zvcih2YXIgYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKHRoaXMuaGkpLGI9MCxjPTAsZD0wO2Q8YS5nZXROdW1iZXJPZkNvbHVtbnMoKTtkKyspc3dpdGNoKGEuZ2V0Q29sdW1uSWQoZCkpe2Nhc2UgImtlcm5lbF9uYW1lIjpiPWQ7YnJlYWs7Y2FzZSAidG90YWxfZHVyYXRpb25fdXMiOmM9ZH1hPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLmdyb3VwKGEsW2JdLFt7Y29sdW1uOmMsYWdncmVnYXRpb246Z29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5zdW0sdHlwZToibnVtYmVyIn1dKTthLnNvcnQoW3tjb2x1bW46MSxkZXNjOiEwfSx7Y29sdW1uOjAsbVM6ITB9XSk7YS5hZGRDb2x1bW4oe3R5cGU6InN0cmluZyIscm9sZToidG9vbHRpcCIscDp7aHRtbDohMH19KTt0aGlzLnRvdGFsPWEuZ2V0TnVtYmVyT2ZSb3dzKCk7CnRoaXMuY291bnQ9TWF0aC5taW4odGhpcy50b3RhbCwxMCk7cmV0dXJuIHRoaXMuZGF0YVRhYmxlPShuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVZpZXcoYSkpLnRvRGF0YVRhYmxlKCl9OwpoLkxhPWZ1bmN0aW9uKCl7aWYodGhpcy5uYSl7dmFyIGE9dGhpcy5nZXREYXRhVGFibGUoKTtpZihhKXtmb3IodmFyIGI9MCxjPTA7Yzx0aGlzLmNvdW50O2MrKyliKz1hLmdldFZhbHVlKGMsMSk7Zm9yKGM9MDtjPHRoaXMuY291bnQ7YysrKXt2YXIgZD1hLmdldFZhbHVlKGMsMCksZT1hLmdldFZhbHVlKGMsMSk7YS5zZXRDZWxsKGMsMiwnPGRpdiBzdHlsZT0icGFkZGluZzo1cHg7Ij48Yj4nK2QrIjwvYj48YnIvPiIrZS50b0ZpeGVkKDIpKyIgdXMgKCIrKGUvYioxMDApLnRvRml4ZWQoMSkrIiklPC9kaXY+Iil9YT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVZpZXcoYSk7dGhpcy50b3RhbD50aGlzLmNvdW50JiZhLmhpZGVSb3dzKHRoaXMuY291bnQsdGhpcy50b3RhbC0xKTt0aGlzLm5hLmRyYXcoYSx7YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsd2lkdGg6NzAwLGhlaWdodDoyNTAsY2hhcnRBcmVhOntsZWZ0OjAsd2lkdGg6IjkwJSIsaGVpZ2h0OiI5MCUifSwKbGVnZW5kOnt0ZXh0U3R5bGU6e2ZvbnRTaXplOjEwfX0sc2xpY2VWaXNpYmlsaXR5VGhyZXNob2xkOi4wMSx0b29sdGlwOntpc0h0bWw6ITB9fSl9fX07aC5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTtnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7YS5uYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uUGllQ2hhcnQoYS55Yy5pKTthLkxhKCl9KX07dmFyIFlLPWZ1bmN0aW9uKGEsYil7Yj1OdW1iZXIoYik7YiE9PWEuY291bnQmJihhLmNvdW50PWIsYS5MYSgpKX07dmFyIFpLPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjgwMHB4O2hlaWdodDpmaXQtY29udGVudDttYXJnaW46OHB4IDhweCA4cHggMH0uY29udHJvbFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6Zml0LWNvbnRlbnQ7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbnRyb2wtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7bWFyZ2luOi0yMHB4IDAgLTI0cHh9LmNvdW50LWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo1MHB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiAkSyhhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHt5YzowfSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwyNiwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMyxudWxsLFsiVG9wICIsIiBLZXJuZWxzIHdpdGggaGlnaGVzdCBUb3RhbCBEdXJhdGlvbiJdKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwyMiwiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCwxNywiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBTaG93IHRvcFx1MDBhMCAiXSkpLChhKCkoKSxXKDcsMCxudWxsLG51bGwsMTQsIm1hdC1mb3JtLWZpZWxkIiwKW1siY2xhc3MiLCJjb3VudC1pbnB1dCBtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixudWxsXSxbMiwibWF0LWZvY3VzZWQiLG51bGxdLApbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSxtaCg2MTQ0LG51bGwsV0QsbnVsbCxbWERdKSxJKDksNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMix7U2I6MH0pLFgoMzM1NTQ0MzIwLDMse1RiOjB9KSxYKDYwMzk3OTc3Niw0LHtWYjowfSksWCgzMzU1NDQzMjAsNSx7V2I6MH0pLFgoNjAzOTc5Nzc2LDYse0hiOjB9KSxYKDYwMzk3OTc3Niw3LHtsYjoxfSksWCg2MDM5Nzk3NzYsOCx7YWI6MX0pLApYKDYwMzk3OTc3Niw5LHtKYjoxfSksWCg2MDM5Nzk3NzYsMTAse0xiOjF9KSwoYSgpKCksVygxOSwwLG51bGwsMSwyLCJpbnB1dCIsW1siY2xhc3MiLCJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0sWyJtYXRJbnB1dCIsIiJdLFsidHlwZSIsIm51bWJlciJdXSxbWzgsIm1pbiIsMF0sWzgsIm1heCIsMF0sWzgsInN0ZXAiLDBdLFsyLCJtYXQtaW5wdXQtc2VydmVyIixudWxsXSxbMSwiaWQiLDBdLFsxLCJwbGFjZWhvbGRlciIsMF0sWzgsImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJpbnB1dCJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMjApLiRhKCEwKSYmCmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDIwKS4kYSghMSkmJmUpOyJpbnB1dCI9PT1jJiYoZT0hMSE9PUYoYiwyMCkuUmQoKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09WUsoZixkLnRhcmdldC52YWx1ZSkmJmUpO3JldHVybiBlfSxudWxsLG51bGwpKSxJKDIwLDUxMjgxOTIsbnVsbCwwLENFLFt6LE56LFs4LG51bGxdLFsyLFJ1XSxbMixVdV0scUMsWzgsbnVsbF0sZEMsVF0se3R5cGU6WzAsInR5cGUiXSx2YWx1ZTpbMSwidmFsdWUiXX0sbnVsbCksbWgoMjA0OCxbWzIsNF0sWzMsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFkoLTEsbnVsbCxbIiBcdTAwYTBLZXJuZWxzICJdKSksKGEoKSgpLFcoMjMsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyNCwwLG51bGwsbnVsbCwyLCJtYXQtc2xpZGVyIixbWyJjbGFzcyIsIm1hdC1zbGlkZXIgbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsInNsaWRlciJdXSxbWzgsCiJ0YWJJbmRleCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsxLCJhcmlhLXZhbHVlbWF4IiwwXSxbMSwiYXJpYS12YWx1ZW1pbiIsMF0sWzEsImFyaWEtdmFsdWVub3ciLDBdLFsxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LXNsaWRlci1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1zbGlkZXItaGFzLXRpY2tzIixudWxsXSxbMiwibWF0LXNsaWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LXNsaWRlci1heGlzLWludmVydGVkIixudWxsXSxbMiwibWF0LXNsaWRlci1pbnZlcnQtbW91c2UtY29vcmRzIixudWxsXSxbMiwibWF0LXNsaWRlci1zbGlkaW5nIixudWxsXSxbMiwibWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIixudWxsXSxbMiwibWF0LXNsaWRlci12ZXJ0aWNhbCIsbnVsbF0sWzIsIm1hdC1zbGlkZXItbWluLXZhbHVlIixudWxsXSxbMiwibWF0LXNsaWRlci1oaWRlLWxhc3QtdGljayIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwKbnVsbF1dLFtbbnVsbCwiY2hhbmdlIl0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXSxbbnVsbCwia2V5ZG93biJdLFtudWxsLCJrZXl1cCJdLFtudWxsLCJtb3VzZWVudGVyIl0sW251bGwsInNlbGVjdHN0YXJ0Il1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMjYpLnNkKCkmJmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDI2KS5xZCgpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwyNikuWXEoZCkmJmUpOyJrZXl1cCI9PT1jJiYoZT0hMSE9PUYoYiwyNikuWnEoKSYmZSk7Im1vdXNlZW50ZXIiPT09YyYmKGU9ITEhPT1GKGIsMjYpLnBuKCkmJmUpOyJzZWxlY3RzdGFydCI9PT1jJiYoZT0hMSE9PWQucHJldmVudERlZmF1bHQoKSYmZSk7ImNoYW5nZSI9PT1jJiYoZT0hMSE9PVlLKGYsZC52YWx1ZSkmJmUpO3JldHVybiBlfSxERyxDRykpLG1oKDUxMjAsbnVsbCxQdCxmdW5jdGlvbihiKXtyZXR1cm5bYl19LApbQUddKSxJKDI2LDQzNzQ1MjgsbnVsbCwwLEFHLFt6LFJ6LG5lLFsyLE5BXSxbOCxudWxsXSxULExvLFsyLGt2XV0se21heDpbMCwibWF4Il0sbWluOlsxLCJtaW4iXSxzdGVwOlsyLCJzdGVwIl0sdmFsdWU6WzMsInZhbHVlIl19LHtRYToiY2hhbmdlIn0pLChhKCkoKSxXKDI3LDAsW1sxLDBdLFsiY2hhcnQiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJjaGFydCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDIwLDAsIm51bWJlciIsZC5jb3VudCk7YihjLDI2LDAsZC50b3RhbCwxLDEsZC5jb3VudCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywzLDAsZC5jb3VudCk7dmFyIGU9InN0YW5kYXJkIj09RihjLDkpLm8sZj0iZmlsbCI9PUYoYyw5KS5vLGc9Im91dGxpbmUiPT1GKGMsOSkubyxsPSJsZWdhY3kiPT1GKGMsOSkubyxtPUYoYyw5KS5sLmZhLHA9RihjLDkpLnhiLHE9RihjLDkpLktiKCkscj1GKGMsOSkudWIoKSwKdj1GKGMsOSkuVWIoKSx3PUYoYyw5KS5sLmRpc2FibGVkLHg9RihjLDkpLmwuQWIsdT1GKGMsOSkubC5mb2N1c2VkLEQ9ImFjY2VudCI9PUYoYyw5KS5jb2xvcixIPSJ3YXJuIj09RihjLDkpLmNvbG9yLEU9RihjLDkpLmgoInVudG91Y2hlZCIpLE49RihjLDkpLmgoInRvdWNoZWQiKSxNPUYoYyw5KS5oKCJwcmlzdGluZSIpLEo9RihjLDkpLmgoImRpcnR5IiksUT1GKGMsOSkuaCgidmFsaWQiKSxVPUYoYyw5KS5oKCJpbnZhbGlkIikscmE9RihjLDkpLmgoInBlbmRpbmciKSxFYT0hRihjLDkpLkViO2IoYyw3LDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYSxFYV0pO2U9ZC50b3RhbDtmPUYoYywyMCkuUWQ7Zz1GKGMsMjApLmlkO2w9RihjLDIwKS5wbGFjZWhvbGRlcjttPUYoYywyMCkuZGlzYWJsZWQ7cD1GKGMsMjApLnJlcXVpcmVkO3E9RihjLDIwKS5EZCYmIUYoYywyMCkuVmN8fG51bGw7cj1GKGMsMjApLkZifHxudWxsO3Y9RihjLDIwKS5mYTt3PQpGKGMsMjApLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDE5LDEsWzEsZSwxLGYsZyxsLG0scCxxLHIsdix3XSk7ZT1GKGMsMjYpLnRhYkluZGV4O2Y9RihjLDI2KS5kaXNhYmxlZDtnPUYoYywyNikubWF4O2w9RihjLDI2KS5taW47bT1GKGMsMjYpLnZhbHVlO3A9RihjLDI2KS52ZXJ0aWNhbD8idmVydGljYWwiOiJob3Jpem9udGFsIjtxPUYoYywyNikuZGlzYWJsZWQ7cj1GKGMsMjYpLkJrO3Y9IUYoYywyNikudmVydGljYWw7dz1GKGMsMjYpLm5kO3g9RihjLDI2KS5zaigpO3U9RihjLDI2KS5ZZTtEPUYoYywyNikueXA7SD1GKGMsMjYpLnZlcnRpY2FsO0U9RihjLDI2KS5IZjtOPUYoYywyNikuZGlzYWJsZWR8fEYoYywyNikuSGYmJkYoYywyNikuRmgmJkYoYywyNikubmQ7TT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDI2KS5pYTtiKGMsMjQsMSxbZSxmLGcsbCxtLHAscSxyLHYsdyx4LHUsRCxILEUsTixNXSl9KX07dmFyIGFMPWZ1bmN0aW9uKCl7dGhpcy5oaT1udWxsO3RoaXMuRGE9e3Jhbms6MCxrZXJuZWxOYW1lOjAscmVnaXN0ZXJzUGVyVGhyZWFkOjAsc2htZW1CeXRlczowLGJsb2NrRGltOjAsZ3JpZERpbTowLGlzS2VybmVsVXNpbmdUZW5zb3JDb3JlOjAsaXNPcFRlbnNvckNvcmVFbGlnaWJsZTowLG9wTmFtZTowLG9jY3VycmVuY2VzOjAsdG90YWxEdXJhdGlvblVzOjAsYXZnRHVyYXRpb25VczowLG1pbkR1cmF0aW9uVXM6MCxtYXhEdXJhdGlvblVzOjB9O3RoaXMuZGF0YVRhYmxlPW51bGw7dGhpcy5xcz10aGlzLnBzPSIiO3RoaXMuc29ydEFzY2VuZGluZz0hMDt0aGlzLnNvcnRDb2x1bW49MDt0aGlzLnRhYmxlPW51bGw7dGhpcy56YT0hMH07aD1hTC5wcm90b3R5cGU7aC5PYj1mdW5jdGlvbigpe3RoaXMuamEoKX07aC5TYT1mdW5jdGlvbigpe3RoaXMuZGF0YVRhYmxlPW51bGw7dGhpcy5wYigpfTsKaC4kbj1mdW5jdGlvbigpe3RoaXMudGFibGUmJnRoaXMuaGkmJiF0aGlzLmRhdGFUYWJsZSYmKHRoaXMuZGF0YVRhYmxlPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUodGhpcy5oaSkpfTtoLnBiPWZ1bmN0aW9uKCl7aWYodGhpcy50YWJsZSYmdGhpcy5oaSl7dmFyIGE9dGhpcy5wbygpO2EmJnRoaXMudGFibGUuZHJhdyhhLHthbGxvd0h0bWw6ITAsYWx0ZXJuYXRpbmdSb3dTdHlsZTohMCxzaG93Um93TnVtYmVyOiExLHdpZHRoOiIxMDAlIixjc3NDbGFzc05hbWVzOntvZGRUYWJsZVJvdzoiZ29vZ2xlLWNoYXJ0LXRhYmxlLW9kZC10YWJsZS1yb3ciLGhlYWRlckNlbGw6Imdvb2dsZS1jaGFydC10YWJsZS1oZWFkZXItY2VsbCIsdGFibGVDZWxsOiJnb29nbGUtY2hhcnQtdGFibGUtdGFibGUtY2VsbCJ9LHNvcnQ6ImV2ZW50Iixzb3J0QXNjZW5kaW5nOnRoaXMuc29ydEFzY2VuZGluZyxzb3J0Q29sdW1uOnRoaXMuc29ydENvbHVtbixwYWdlOiJlbmFibGUiLHBhZ2VTaXplOjEwMH0pfX07CmgucG89ZnVuY3Rpb24oKXtpZighdGhpcy5kYXRhVGFibGUmJih0aGlzLiRuKCksdGhpcy5kYXRhVGFibGUpKWZvcih2YXIgYT0wO2E8dGhpcy5kYXRhVGFibGUuZ2V0TnVtYmVyT2ZDb2x1bW5zKCk7YSsrKXN3aXRjaCh0aGlzLmRhdGFUYWJsZS5nZXRDb2x1bW5JZChhKSl7Y2FzZSAicmFuayI6dGhpcy5EYS5yYW5rPWE7YnJlYWs7Y2FzZSAia2VybmVsX25hbWUiOnRoaXMuRGEua2VybmVsTmFtZT1hO2JyZWFrO2Nhc2UgInJlZ2lzdGVyc19wZXJfdGhyZWFkIjp0aGlzLkRhLnJlZ2lzdGVyc1BlclRocmVhZD1hO2JyZWFrO2Nhc2UgInNobWVtX2J5dGVzIjp0aGlzLkRhLnNobWVtQnl0ZXM9YTticmVhaztjYXNlICJibG9ja19kaW0iOnRoaXMuRGEuYmxvY2tEaW09YTticmVhaztjYXNlICJncmlkX2RpbSI6dGhpcy5EYS5ncmlkRGltPWE7YnJlYWs7Y2FzZSAiaXNfa2VybmVsX3VzaW5nX3RlbnNvcl9jb3JlIjp0aGlzLkRhLmlzS2VybmVsVXNpbmdUZW5zb3JDb3JlPWE7YnJlYWs7Y2FzZSAiaXNfb3BfdGVuc29yX2NvcmVfZWxpZ2libGUiOnRoaXMuRGEuaXNPcFRlbnNvckNvcmVFbGlnaWJsZT0KYTticmVhaztjYXNlICJvcF9uYW1lIjp0aGlzLkRhLm9wTmFtZT1hO2JyZWFrO2Nhc2UgIm9jY3VycmVuY2VzIjp0aGlzLkRhLm9jY3VycmVuY2VzPWE7YnJlYWs7Y2FzZSAidG90YWxfZHVyYXRpb25fdXMiOnRoaXMuRGEudG90YWxEdXJhdGlvblVzPWE7YnJlYWs7Y2FzZSAiYXZnX2R1cmF0aW9uX3VzIjp0aGlzLkRhLmF2Z0R1cmF0aW9uVXM9YTticmVhaztjYXNlICJtaW5fZHVyYXRpb25fdXMiOnRoaXMuRGEubWluRHVyYXRpb25Vcz1hO2JyZWFrO2Nhc2UgIm1heF9kdXJhdGlvbl91cyI6dGhpcy5EYS5tYXhEdXJhdGlvblVzPWF9dGhpcy5kYXRhVGFibGUmJih0aGlzLmRhdGFUYWJsZS5zZXRQcm9wZXJ0eSgwLHRoaXMuRGEua2VybmVsTmFtZSwic3R5bGUiLCJ3aWR0aDogMzAlIiksdGhpcy5kYXRhVGFibGUuc2V0UHJvcGVydHkoMCx0aGlzLkRhLm9wTmFtZSwic3R5bGUiLCJ3aWR0aDogMjUlIikpO2E9dGhpcy53eigpO2lmKCFhKXJldHVybiBudWxsO2Euc2V0Q29sdW1ucyhbdGhpcy5EYS5yYW5rLAp0aGlzLkRhLmtlcm5lbE5hbWUsdGhpcy5EYS5yZWdpc3RlcnNQZXJUaHJlYWQsdGhpcy5EYS5zaG1lbUJ5dGVzLHRoaXMuRGEuYmxvY2tEaW0sdGhpcy5EYS5ncmlkRGltLHRoaXMuRGEuaXNLZXJuZWxVc2luZ1RlbnNvckNvcmUsdGhpcy5EYS5pc09wVGVuc29yQ29yZUVsaWdpYmxlLHRoaXMuRGEub3BOYW1lLHRoaXMuRGEub2NjdXJyZW5jZXMsdGhpcy5EYS50b3RhbER1cmF0aW9uVXMsdGhpcy5EYS5hdmdEdXJhdGlvblVzLHRoaXMuRGEubWluRHVyYXRpb25Vcyx0aGlzLkRhLm1heER1cmF0aW9uVXNdKTtyZXR1cm4gYX07CmgucW89ZnVuY3Rpb24oKXtpZighdGhpcy5kYXRhVGFibGUpcmV0dXJuIG51bGw7dmFyIGE9W107aWYodGhpcy5wcy50cmltKCkpe3ZhciBiPXRoaXMucHMudHJpbSgpLnRvTG93ZXJDYXNlKCk7YS5wdXNoKHtjb2x1bW46MSx0ZXN0OmZ1bmN0aW9uKGUpe3JldHVybiAwPD1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihiKX19KX1pZih0aGlzLnFzLnRyaW0oKSl7dmFyIGM9dGhpcy5xcy50cmltKCkudG9Mb3dlckNhc2UoKTthLnB1c2goe2NvbHVtbjo4LHRlc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIDA8PWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGMpfX0pfWlmKDA8YS5sZW5ndGgpe3ZhciBkPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyh0aGlzLmRhdGFUYWJsZSk7ZC5zZXRSb3dzKHRoaXMuZGF0YVRhYmxlLmdldEZpbHRlcmVkUm93cyhhKSk7cmV0dXJuIGQudG9EYXRhVGFibGUoKX1yZXR1cm4gdGhpcy5kYXRhVGFibGV9OwpoLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJ0YWJsZSJdfSk7Z29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe2EudGFibGU9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlKGEuQmYuaSk7Z29vZ2xlLnZpc3VhbGl6YXRpb24uZXZlbnRzLmFkZExpc3RlbmVyKGEudGFibGUsInNvcnQiLGZ1bmN0aW9uKGIpe2Euc29ydENvbHVtbj1iLmNvbHVtbjthLnNvcnRBc2NlbmRpbmc9Yi5hc2NlbmRpbmc7YS5wYigpfSk7YS5wYigpfSl9OwpoLnd6PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xbygpO2lmKCFhKXJldHVybiBudWxsO3ZhciBiPWEuZ2V0U29ydGVkUm93cyh7Y29sdW1uOnRoaXMuc29ydENvbHVtbixkZXNjOiF0aGlzLnNvcnRBc2NlbmRpbmd9KTtpZigwIT09dGhpcy5zb3J0Q29sdW1ufHx0aGlzLnNvcnRBc2NlbmRpbmcpYi5mb3JFYWNoKGZ1bmN0aW9uKGUsZil7YS5zZXRDZWxsKGUsMCxmKzEpfSk7ZWxzZXt2YXIgYz1iLmxlbmd0aDtiLmZvckVhY2goZnVuY3Rpb24oZSl7YS5zZXRDZWxsKGUsMCxjLS0pfSl9dmFyIGQ9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFWaWV3KGEpO2Quc2V0Um93cyhiKTtyZXR1cm4gZH07dmFyIGJMPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MjBweH1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgOHB4fW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzc3O3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0udGFibGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgI2VlZX0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gY0woYSl7cmV0dXJuIFooMCxbWCg2NzEwODg2NDAsMSx7QmY6MH0pLChhKCkoKSxXKDEsMCxudWxsLG51bGwsNDAsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhlYWRsaW5lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJHUFUgS2VybmVscyJdKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwxOCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSwKWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksbWgoNjE0NCwKbnVsbCxXRCxudWxsLFtYRF0pLEkoNiw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwyLHtTYjowfSksWCgzMzU1NDQzMjAsMyx7VGI6MH0pLFgoNjAzOTc5Nzc2LDQse1ZiOjB9KSxYKDMzNTU0NDMyMCw1LHtXYjowfSksWCg2MDM5Nzk3NzYsNix7SGI6MH0pLFgoNjAzOTc5Nzc2LDcse2xiOjF9KSxYKDYwMzk3OTc3Niw4LHthYjoxfSksWCg2MDM5Nzk3NzYsOSx7SmI6MX0pLFgoNjAzOTc5Nzc2LDEwLHtMYjoxfSksKGEoKSgpLFcoMTYsMCxudWxsLDEsMiwiaW5wdXQiLFtbImNsYXNzIiwibWF0LWlucHV0LWVsZW1lbnQgbWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbCJdLFsibWF0SW5wdXQiLCIiXSxbInBsYWNlaG9sZGVyIiwiS2VybmVsIE5hbWUiXV0sW1syLCJtYXQtaW5wdXQtc2VydmVyIixudWxsXSxbMSwiaWQiLDBdLFsxLCJwbGFjZWhvbGRlciIsMF0sWzgsImRpc2FibGVkIiwKMF0sWzgsInJlcXVpcmVkIiwwXSxbMSwicmVhZG9ubHkiLDBdLFsxLCJhcmlhLWRlc2NyaWJlZGJ5IiwwXSxbMSwiYXJpYS1pbnZhbGlkIiwwXSxbMSwiYXJpYS1yZXF1aXJlZCIsMF1dLFtbbnVsbCwiaW5wdXQiXSxbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDE3KS4kYSghMCkmJmUpOyJibHVyIj09PWMmJihlPSExIT09RihiLDE3KS4kYSghMSkmJmUpOyJpbnB1dCI9PT1jJiYoZT0hMSE9PUYoYiwxNykuUmQoKSYmZSk7ImlucHV0Ij09PWMmJihmLnBzPWQudGFyZ2V0LnZhbHVlLGU9ITEhPT1mLnBiKCkmJmUpO3JldHVybiBlfSxudWxsLG51bGwpKSxJKDE3LDUxMjgxOTIsbnVsbCwwLENFLFt6LE56LFs4LG51bGxdLFsyLFJ1XSxbMixVdV0scUMsWzgsbnVsbF0sZEMsVF0se3BsYWNlaG9sZGVyOlswLCJwbGFjZWhvbGRlciJdLHZhbHVlOlsxLCJ2YWx1ZSJdfSxudWxsKSxtaCgyMDQ4LApbWzIsNF0sWzMsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFcoMTksMCxudWxsLDQsMywibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24gbm90cmFuc2xhdGUiXSxbIm1hdFN1ZmZpeCIsIiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF0sWzIsIm1hdC1pY29uLW5vLWNvbG9yIixudWxsXV0sbnVsbCxudWxsLHlFLHhFKSksSSgyMCwxNjM4NCxbWzEwLDRdXSwwLFNELFtdLG51bGwsbnVsbCksSSgyMSw5MTU4NjU2LG51bGwsMCx2RSxbeixuRSxbOCxudWxsXSxyRSx1ZF0sbnVsbCxudWxsKSwoYSgpKCksWSgtMSwwLFsic2VhcmNoIl0pKSwoYSgpKCksVygyMywwLG51bGwsbnVsbCwxOCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwibWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIiwKbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSwKWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLG1oKDYxNDQsbnVsbCxXRCxudWxsLFtYRF0pLEkoMjUsNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMTEse1NiOjB9KSxYKDMzNTU0NDMyMCwxMix7VGI6MH0pLFgoNjAzOTc5Nzc2LDEzLHtWYjowfSksWCgzMzU1NDQzMjAsMTQse1diOjB9KSxYKDYwMzk3OTc3NiwxNSx7SGI6MH0pLFgoNjAzOTc5Nzc2LDE2LHtsYjoxfSksWCg2MDM5Nzk3NzYsMTcse2FiOjF9KSxYKDYwMzk3OTc3NiwxOCx7SmI6MX0pLFgoNjAzOTc5Nzc2LDE5LHtMYjoxfSksKGEoKSgpLFcoMzUsMCxudWxsLDEsMiwiaW5wdXQiLFtbImNsYXNzIiwibWF0LWlucHV0LWVsZW1lbnQgbWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbCJdLFsibWF0SW5wdXQiLCIiXSxbInBsYWNlaG9sZGVyIiwKIk9wIE5hbWUiXV0sW1syLCJtYXQtaW5wdXQtc2VydmVyIixudWxsXSxbMSwiaWQiLDBdLFsxLCJwbGFjZWhvbGRlciIsMF0sWzgsImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJpbnB1dCJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMzYpLiRhKCEwKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMzYpLiRhKCExKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDM2KS5SZCgpJiZlKTsiaW5wdXQiPT09YyYmKGYucXM9ZC50YXJnZXQudmFsdWUsZT0hMSE9PWYucGIoKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMzYsNTEyODE5MixudWxsLDAsQ0UsW3osTnosWzgsbnVsbF0sWzIsClJ1XSxbMixVdV0scUMsWzgsbnVsbF0sZEMsVF0se3BsYWNlaG9sZGVyOlswLCJwbGFjZWhvbGRlciJdLHZhbHVlOlsxLCJ2YWx1ZSJdfSxudWxsKSxtaCgyMDQ4LFtbMTEsNF0sWzEyLDRdXSxQRCxudWxsLFtDRV0pLChhKCkoKSxXKDM4LDAsbnVsbCw0LDMsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIG5vdHJhbnNsYXRlIl0sWyJtYXRTdWZmaXgiLCIiXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdLFsyLCJtYXQtaWNvbi1uby1jb2xvciIsbnVsbF1dLG51bGwsbnVsbCx5RSx4RSkpLEkoMzksMTYzODQsW1sxOSw0XV0sMCxTRCxbXSxudWxsLG51bGwpLEkoNDAsOTE1ODY1NixudWxsLDAsdkUsW3osbkUsWzgsbnVsbF0sckUsdWRdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsMCxbInNlYXJjaCJdKSksKGEoKSgpLFcoNDIsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQzLDAsbnVsbCwKbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQ0LDAsW1sxLDBdLFsidGFibGUiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJ0YWJsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDE3LDAsIktlcm5lbCBOYW1lIixkLnBzKTtiKGMsMjEsMCk7YihjLDM2LDAsIk9wIE5hbWUiLGQucXMpO2IoYyw0MCwwKX0sZnVuY3Rpb24oYixjKXt2YXIgZD0ic3RhbmRhcmQiPT1GKGMsNikubyxlPSJmaWxsIj09RihjLDYpLm8sZj0ib3V0bGluZSI9PUYoYyw2KS5vLGc9ImxlZ2FjeSI9PUYoYyw2KS5vLGw9RihjLDYpLmwuZmEsbT1GKGMsNikueGIscD1GKGMsNikuS2IoKSxxPUYoYyw2KS51YigpLHI9RihjLDYpLlViKCksdj1GKGMsNikubC5kaXNhYmxlZCx3PUYoYyw2KS5sLkFiLHg9RihjLDYpLmwuZm9jdXNlZCx1PSJhY2NlbnQiPT1GKGMsNikuY29sb3IsRD0id2FybiI9PUYoYyw2KS5jb2xvciwKSD1GKGMsNikuaCgidW50b3VjaGVkIiksRT1GKGMsNikuaCgidG91Y2hlZCIpLE49RihjLDYpLmgoInByaXN0aW5lIiksTT1GKGMsNikuaCgiZGlydHkiKSxKPUYoYyw2KS5oKCJ2YWxpZCIpLFE9RihjLDYpLmgoImludmFsaWQiKSxVPUYoYyw2KS5oKCJwZW5kaW5nIikscmE9IUYoYyw2KS5FYjtiKGMsNCwxLFtkLGUsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYV0pO2Q9RihjLDE3KS5RZDtlPUYoYywxNykuaWQ7Zj1GKGMsMTcpLnBsYWNlaG9sZGVyO2c9RihjLDE3KS5kaXNhYmxlZDtsPUYoYywxNykucmVxdWlyZWQ7bT1GKGMsMTcpLkRkJiYhRihjLDE3KS5WY3x8bnVsbDtwPUYoYywxNykuRmJ8fG51bGw7cT1GKGMsMTcpLmZhO3I9RihjLDE3KS5yZXF1aXJlZC50b1N0cmluZygpO2IoYywxNiwwLGQsZSxmLGcsbCxtLHAscSxyKTtkPUYoYywyMSkuaW5saW5lO2U9InByaW1hcnkiIT09RihjLDIxKS5jb2xvciYmImFjY2VudCIhPT1GKGMsMjEpLmNvbG9yJiYKIndhcm4iIT09RihjLDIxKS5jb2xvcjtiKGMsMTksMCxkLGUpO2Q9InN0YW5kYXJkIj09RihjLDI1KS5vO2U9ImZpbGwiPT1GKGMsMjUpLm87Zj0ib3V0bGluZSI9PUYoYywyNSkubztnPSJsZWdhY3kiPT1GKGMsMjUpLm87bD1GKGMsMjUpLmwuZmE7bT1GKGMsMjUpLnhiO3A9RihjLDI1KS5LYigpO3E9RihjLDI1KS51YigpO3I9RihjLDI1KS5VYigpO3Y9RihjLDI1KS5sLmRpc2FibGVkO3c9RihjLDI1KS5sLkFiO3g9RihjLDI1KS5sLmZvY3VzZWQ7dT0iYWNjZW50Ij09RihjLDI1KS5jb2xvcjtEPSJ3YXJuIj09RihjLDI1KS5jb2xvcjtIPUYoYywyNSkuaCgidW50b3VjaGVkIik7RT1GKGMsMjUpLmgoInRvdWNoZWQiKTtOPUYoYywyNSkuaCgicHJpc3RpbmUiKTtNPUYoYywyNSkuaCgiZGlydHkiKTtKPUYoYywyNSkuaCgidmFsaWQiKTtRPUYoYywyNSkuaCgiaW52YWxpZCIpO1U9RihjLDI1KS5oKCJwZW5kaW5nIik7cmE9IUYoYywyNSkuRWI7YihjLDIzLDEsW2QsZSxmLGcsbCxtLApwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYV0pO2Q9RihjLDM2KS5RZDtlPUYoYywzNikuaWQ7Zj1GKGMsMzYpLnBsYWNlaG9sZGVyO2c9RihjLDM2KS5kaXNhYmxlZDtsPUYoYywzNikucmVxdWlyZWQ7bT1GKGMsMzYpLkRkJiYhRihjLDM2KS5WY3x8bnVsbDtwPUYoYywzNikuRmJ8fG51bGw7cT1GKGMsMzYpLmZhO3I9RihjLDM2KS5yZXF1aXJlZC50b1N0cmluZygpO2IoYywzNSwwLGQsZSxmLGcsbCxtLHAscSxyKTtkPUYoYyw0MCkuaW5saW5lO2U9InByaW1hcnkiIT09RihjLDQwKS5jb2xvciYmImFjY2VudCIhPT1GKGMsNDApLmNvbG9yJiYid2FybiIhPT1GKGMsNDApLmNvbG9yO2IoYywzOCwwLGQsZSl9KX07dmFyIGRMPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfS5zZWN0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoyMHB4fS5yb3dbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleH0uZmxleC1zcGFjZVtfbmdjb250ZW50LSVDT01QJV17ZmxleDoxfS5zYXZlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy10b3A6OHB4O3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOjEzMHB4fS5zYXZlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7Y29sb3I6Izc3NztjdXJzb3I6cG9pbnRlcn0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gZUwoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxNSwiZGl2IixbWyJjbGFzcyIsInNlY3Rpb24tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMTAsImRpdiIsW1siY2xhc3MiLCJyb3ciXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwyLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDMsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiR1BVIEtlcm5lbCBTdGF0cyJdKSksKGEoKSgpLFcoNSwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiZmxleC1zcGFjZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg2LDAsbnVsbCxudWxsLDUsImRpdiIsW1siY2xhc3MiLAoic2F2ZS1idXR0b24iXV0sbnVsbCxbW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNsaWNrIj09PWMmJihkPSExIT09ZS5WbCgpJiZkKTtyZXR1cm4gZH0sbnVsbCxudWxsKSksKGEoKSgpLFcoNywwLG51bGwsbnVsbCwyLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiBub3RyYW5zbGF0ZSJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF0sWzIsIm1hdC1pY29uLW5vLWNvbG9yIixudWxsXV0sbnVsbCxudWxsLHlFLHhFKSksSSg4LDkxNTg2NTYsbnVsbCwwLHZFLFt6LG5FLFs4LG51bGxdLHJFLHVkXSxudWxsLG51bGwpLChhKCkoKSxZKC0xLDAsWyJzYXZlX2FsdCJdKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRXhwb3J0IGFzIENTViJdKSksKGEoKSgpLFcoMTIsMCwKbnVsbCxudWxsLDMsImRpdiIsW10sW1s4LCJjbGFzc05hbWUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDE0LDAsbnVsbCxudWxsLDEsImtlcm5lbC1zdGF0cy1jaGFydCIsW10sbnVsbCxudWxsLG51bGwsJEssWkspKSxJKDE1LDYzODk3NixudWxsLDAsWEssW10se2hpOlswLCJrZXJuZWxTdGF0c0RhdGEiXX0sbnVsbCksKGEoKSgpLFcoMTYsMCxudWxsLG51bGwsNCwiZGl2IixbXSxbWzgsImNsYXNzTmFtZSIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNywwLG51bGwsbnVsbCwxLCJtYXQtZGl2aWRlciIsW1siY2xhc3MiLCJtYXQtZGl2aWRlciJdLFsicm9sZSIsInNlcGFyYXRvciJdXSxbWzEsImFyaWEtb3JpZW50YXRpb24iLDBdLFsyLCJtYXQtZGl2aWRlci12ZXJ0aWNhbCIsbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWhvcml6b250YWwiLApudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLG51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDE4LDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDE5LDAsbnVsbCxudWxsLDEsImtlcm5lbC1zdGF0cy10YWJsZSIsW10sbnVsbCxudWxsLG51bGwsY0wsYkwpKSxJKDIwLDYzODk3NixudWxsLDAsYUwsW10se2hpOlswLCJrZXJuZWxTdGF0c0RhdGEiXX0sbnVsbCksKGEoKSgpLFcoMjEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInNlY3Rpb24tY29udGFpbmVyIl1dLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIgVGhlcmUgaXMgbm8gR1BVIGRhdGEgdG8gZGlzcGxheSBiZWNhdXNlIHRoZXJlIHdlcmUgbm8ga2VybmVscyBpbiB0aGUgY2FwdHVyZSBkdXJhdGlvbi5cbiJdKSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYyw4LDApO2IoYywxNSwwLGQuZGF0YSk7YihjLDIwLDAsZC5kYXRhKX0sCmZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9RihjLDgpLmlubGluZSxmPSJwcmltYXJ5IiE9PUYoYyw4KS5jb2xvciYmImFjY2VudCIhPT1GKGMsOCkuY29sb3ImJiJ3YXJuIiE9PUYoYyw4KS5jb2xvcjtiKGMsNywwLGUsZik7YihjLDEyLDAsZC5ybz8iZnVsbC1oZWlnaHQiOiJoaWRkZW4tY29udGVudCIpO2IoYywxNiwwLGQucm8/ImZ1bGwtaGVpZ2h0IjoiaGlkZGVuLWNvbnRlbnQiKTtlPUYoYywxOCkudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsMTgpLnZlcnRpY2FsO3ZhciBnPSFGKGMsMTgpLnZlcnRpY2FsLGw9RihjLDE4KS5IZTtiKGMsMTcsMCxlLGYsZyxsKTtiKGMsMjEsMCxkLnJvKX0pfQp2YXIgZkw9UWcoImtlcm5lbC1zdGF0cyIsV0ssZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJrZXJuZWwtc3RhdHMiLFtdLG51bGwsbnVsbCxudWxsLGVMLGRMKSksSSgxLDQ5MTUyLG51bGwsMCxXSyxbeHcsS0ksY0ldLG51bGwsbnVsbCldLG51bGwsbnVsbCl9KTt2YXIgZ0w9ZnVuY3Rpb24oKXt9O3ZhciBoTD1mdW5jdGlvbigpe307dmFyIGlMPWZ1bmN0aW9uKCl7fTt2YXIgakw9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5vYj1iO3RoaXMuc3RvcmU9Yzt0aGlzLmRhdGE9bnVsbDt0aGlzLmhvc3Q9dGhpcy5nYT0iIjt0aGlzLml5PSExO3RoaXMubWVtb3J5SWRzPVtdO3RoaXMudWs9IiI7YS5wYXJhbXMuc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe2QudXBkYXRlKGUpfSl9OwpqTC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5nYT1hLmdhfHwiIjt0aGlzLmhvc3Q9YS5ob3N0fHwiIjt0aGlzLnN0b3JlLnhhKGVKKHtEYjp7emE6ITAsbWVzc2FnZToiTG9hZGluZyBkYXRhIn19KSk7dGhpcy5vYi5nZXREYXRhKHRoaXMuZ2EsIm1lbW9yeV9wcm9maWxlIix0aGlzLmhvc3QpLnN1YnNjcmliZShmdW5jdGlvbihjKXtiLnN0b3JlLnhhKGVKKHtEYjp7emE6ITEsbWVzc2FnZToiIn19KSk7KGIuZGF0YT1jKSYmYy5tZW1vcnlJZHMmJmMubnVtSG9zdHMmJjA8Yy5udW1Ib3N0cyYmMDxjLm1lbW9yeUlkcy5sZW5ndGgmJihiLml5PSEwLGIubWVtb3J5SWRzPWMubWVtb3J5SWRzLCIiPT09Yi51ayYmKGIudWs9Yy5tZW1vcnlJZHNbMF0pKX0pfTt2YXIga0w9ZnVuY3Rpb24oKXt0aGlzLlNqPW51bGw7dGhpcy5KZT0iIjt0aGlzLmRhdGFUYWJsZT1udWxsO3RoaXMuTmc9IiI7dGhpcy50YWJsZT1udWxsfTtoPWtMLnByb3RvdHlwZTtoLk9iPWZ1bmN0aW9uKCl7dGhpcy5qYSgpfTtoLlNhPWZ1bmN0aW9uKCl7dGhpcy5kYXRhVGFibGU9bnVsbDt0aGlzLnBiKCl9OwpoLiRuPWZ1bmN0aW9uKCl7aWYodGhpcy50YWJsZSYmdGhpcy5TaiYmdGhpcy5Tai5tZW1vcnlQcm9maWxlUGVyQWxsb2NhdG9yJiYhdGhpcy5kYXRhVGFibGUpe3RoaXMuZGF0YVRhYmxlPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGU7dGhpcy5kYXRhVGFibGUuYWRkQ29sdW1uKCJzdHJpbmciLCJPcCBOYW1lIik7dGhpcy5kYXRhVGFibGUuYWRkQ29sdW1uKCJudW1iZXIiLCJBbGxvY2F0aW9uIFNpemUgKEdpQnMpIik7dGhpcy5kYXRhVGFibGUuYWRkQ29sdW1uKCJudW1iZXIiLCJSZXF1ZXN0ZWQgU2l6ZSAoR2lCcykiKTt0aGlzLmRhdGFUYWJsZS5hZGRDb2x1bW4oIm51bWJlciIsIk9jY3VycmVuY2VzIik7dGhpcy5kYXRhVGFibGUuYWRkQ29sdW1uKCJzdHJpbmciLCJSZWdpb24gdHlwZSIpO3RoaXMuZGF0YVRhYmxlLmFkZENvbHVtbigic3RyaW5nIiwiRGF0YSB0eXBlIik7dGhpcy5kYXRhVGFibGUuYWRkQ29sdW1uKCJzdHJpbmciLCJTaGFwZSIpO3ZhciBhPXRoaXMuU2oubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvclt0aGlzLkplXS5tZW1vcnlQcm9maWxlU25hcHNob3RzLApiPXRoaXMuU2oubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvclt0aGlzLkplXS5hY3RpdmVBbGxvY2F0aW9ucyxjPXRoaXMuU2oubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvclt0aGlzLkplXS5zcGVjaWFsQWxsb2NhdGlvbnM7aWYoYSYmYiYmYyl7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBlPU51bWJlcihiW2RdLnNuYXBzaG90SW5kZXgpLGY9TnVtYmVyKGJbZF0uc3BlY2lhbEluZGV4KTtpZigwPD1lKXtpZighKGUgaW4gYSkpY29udGludWU7ZT1hW2VdLmFjdGl2aXR5TWV0YWRhdGF9ZWxzZSBlPWNbZl07ZSYmdGhpcy5kYXRhVGFibGUuYWRkUm93KFtlLnRmT3BOYW1lLHRoaXMuR2MoZS5hbGxvY2F0aW9uQnl0ZXMpLHRoaXMuR2MoZS5yZXF1ZXN0ZWRCeXRlcyksTnVtYmVyKGJbZF0ubnVtT2NjdXJyZW5jZXMpLGUucmVnaW9uVHlwZSxlLmRhdGFUeXBlLGUudGVuc29yU2hhcGVdKX1hPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5OdW1iZXJGb3JtYXQoe2ZyYWN0aW9uRGlnaXRzOjN9KTsKYS5mb3JtYXQodGhpcy5kYXRhVGFibGUsMSk7YS5mb3JtYXQodGhpcy5kYXRhVGFibGUsMil9fX07aC5wYj1mdW5jdGlvbigpe2lmKHRoaXMudGFibGUmJnRoaXMuU2ope3ZhciBhPXRoaXMucG8oKTthJiZ0aGlzLnRhYmxlLmRyYXcoYSx7YWxsb3dIdG1sOiEwLGFsdGVybmF0aW5nUm93U3R5bGU6ITAsc2hvd1Jvd051bWJlcjohMSx3aWR0aDoiMTAwJSIsaGVpZ2h0OiI2MDBweCIsY3NzQ2xhc3NOYW1lczp7b2RkVGFibGVSb3c6Imdvb2dsZS1jaGFydC10YWJsZS1vZGQtdGFibGUtcm93IixoZWFkZXJDZWxsOiJnb29nbGUtY2hhcnQtdGFibGUtaGVhZGVyLWNlbGwiLHRhYmxlQ2VsbDoiZ29vZ2xlLWNoYXJ0LXRhYmxlLXRhYmxlLWNlbGwifX0pfX07CmgucG89ZnVuY3Rpb24oKXt0aGlzLmRhdGFUYWJsZXx8dGhpcy4kbigpO3ZhciBhPXRoaXMucW8oKTtpZighYSlyZXR1cm4gbnVsbDthPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyhhKTthLnNldFJvd3MoYS5nZXRGaWx0ZXJlZFJvd3MoW3tjb2x1bW46MixtaW5WYWx1ZTouMDAxfV0pKTtyZXR1cm4gYX07aC5xbz1mdW5jdGlvbigpe2lmKCF0aGlzLmRhdGFUYWJsZSlyZXR1cm4gbnVsbDt2YXIgYT1bXTtpZih0aGlzLk5nLnRyaW0oKSl7dmFyIGI9dGhpcy5OZy50cmltKCkudG9Mb3dlckNhc2UoKTthLnB1c2goe2NvbHVtbjowLHRlc3Q6ZnVuY3Rpb24oZCl7cmV0dXJuIDA8PWQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGIpfX0pfWlmKDA8YS5sZW5ndGgpe3ZhciBjPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyh0aGlzLmRhdGFUYWJsZSk7Yy5zZXRSb3dzKHRoaXMuZGF0YVRhYmxlLmdldEZpbHRlcmVkUm93cyhhKSk7cmV0dXJuIGMudG9EYXRhVGFibGUoKX1yZXR1cm4gdGhpcy5kYXRhVGFibGV9OwpoLkdjPWZ1bmN0aW9uKGEpe3JldHVybiBhP051bWJlcihhKS9NYXRoLnBvdygyLDMwKTowfTtoLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJ0YWJsZSJdfSk7Z29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe2EudGFibGU9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlKGEuQmYuaSk7YS5wYigpfSl9O3ZhciBsTD1mdW5jdGlvbigpe307dmFyIG1MPWZ1bmN0aW9uKGEpe3RoaXMuRHg9YTt0aGlzLmRhdGE9bnVsbDt0aGlzLkplPSIiO3RoaXMudGl0bGU9Ik1lbW9yeSBQcm9maWxlIFN1bW1hcnkiO3RoaXMuS0c9dGhpcy5KRz0wO3RoaXMuRUY9dGhpcy5HRj10aGlzLlNGPXRoaXMuVEg9dGhpcy5nST10aGlzLmpIPXRoaXMuaEg9dGhpcy54Rz0iIn07bUwucHJvdG90eXBlLkxjPWZ1bmN0aW9uKCl7bkwodGhpcyk7dGhpcy5EeC5MZygpfTttTC5wcm90b3R5cGUuU2E9ZnVuY3Rpb24oKXtuTCh0aGlzKX07CnZhciBuTD1mdW5jdGlvbihhKXtpZihhLmRhdGEmJmEuZGF0YS5tZW1vcnlJZHMmJmEuZGF0YS5tZW1vcnlJZHMubGVuZ3RoJiZhLmRhdGEubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvcil7dmFyIGI9YS5kYXRhLm1lbW9yeVByb2ZpbGVQZXJBbGxvY2F0b3JbYS5KZV0ucHJvZmlsZVN1bW1hcnksYz1hLmRhdGEubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvclthLkplXS5tZW1vcnlQcm9maWxlU25hcHNob3RzO2lmKGImJmMpe3ZhciBkPWIucGVha1N0YXRzO2lmKGQpe2Zvcih2YXIgZT0wLGY9MCxnPTA7ZzxjLmxlbmd0aDtnKyspe3ZhciBsPWNbZ107aWYoIWx8fCFsLmFjdGl2aXR5TWV0YWRhdGF8fCFsLmFjdGl2aXR5TWV0YWRhdGEubWVtb3J5QWN0aXZpdHkpcmV0dXJuOyJBTExPQ0FUSU9OIj09PWwuYWN0aXZpdHlNZXRhZGF0YS5tZW1vcnlBY3Rpdml0eT9lKys6IkRFQUxMT0NBVElPTiI9PT1sLmFjdGl2aXR5TWV0YWRhdGEubWVtb3J5QWN0aXZpdHkmJmYrK31hLkpHPWU7YS5LRz0KZjthLnhHPWEuR2MoYi5tZW1vcnlDYXBhY2l0eSkudG9GaXhlZCgyKTthLmhIPWEuR2MoYi5wZWFrQnl0ZXNVc2FnZUxpZmV0aW1lKS50b0ZpeGVkKDIpO2EuZ0k9YS5jdChiLnBlYWtTdGF0c1RpbWVQcykudG9GaXhlZCgxKTthLmpIPWEuR2MoZC5wZWFrQnl0ZXNJblVzZSkudG9GaXhlZCgyKTthLlRIPWEuR2MoZC5zdGFja1Jlc2VydmVkQnl0ZXMpLnRvRml4ZWQoMik7YS5TRj1hLkdjKGQuaGVhcEFsbG9jYXRlZEJ5dGVzKS50b0ZpeGVkKDIpO2EuR0Y9YS5HYyhkLmZyZWVNZW1vcnlCeXRlcykudG9GaXhlZCgyKTthLkVGPSgxMDAqKGQuZnJhZ21lbnRhdGlvbnx8MCkpLnRvRml4ZWQoMikrIiUifX19fTttTC5wcm90b3R5cGUuR2M9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/TnVtYmVyKGEpL01hdGgucG93KDIsMzApOjB9O21MLnByb3RvdHlwZS5jdD1mdW5jdGlvbihhKXtyZXR1cm4gYT9OdW1iZXIoYSkvTWF0aC5wb3coMTAsOSk6MH07dmFyIG9MPWZ1bmN0aW9uKCl7fTt2YXIgcEw9ZnVuY3Rpb24oKXt0aGlzLlJzPW51bGw7dGhpcy5KZT0iIjt0aGlzLnRpdGxlPSJNZW1vcnkgVGltZWxpbmUgR3JhcGgiO3RoaXMuaGVpZ2h0PTQ2NTt0aGlzLndpZHRoPTA7dGhpcy5uYT1udWxsfTtoPXBMLnByb3RvdHlwZTtoLkxjPWZ1bmN0aW9uKCl7dGhpcy5qYSgpfTtoLlNhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS53aWR0aD0wO2EuTGEoKX0sMTAwKX07CmguTGE9ZnVuY3Rpb24oKXtpZih0aGlzLnljJiZ0aGlzLm5hJiYiIiE9PXRoaXMuSmUmJnRoaXMuUnMmJnRoaXMuUnMubWVtb3J5UHJvZmlsZVBlckFsbG9jYXRvcil7dGhpcy53aWR0aD1NYXRoLm1pbigxNTAwLHRoaXMueWMuaS5vZmZzZXRXaWR0aCk7dmFyIGE9dGhpcy5Scy5tZW1vcnlQcm9maWxlUGVyQWxsb2NhdG9yW3RoaXMuSmVdLm1lbW9yeVByb2ZpbGVTbmFwc2hvdHM7aWYoYSl7YS5zb3J0KGZ1bmN0aW9uKGUsZil7cmV0dXJuIE51bWJlcihlLnRpbWVPZmZzZXRQcyktTnVtYmVyKGYudGltZU9mZnNldFBzKX0pO3ZhciBiPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGU7Yi5hZGRDb2x1bW4oIm51bWJlciIsInRpbWVzdGFtcChwcykiKTtiLmFkZENvbHVtbigibnVtYmVyIiwic3RhY2siKTtiLmFkZENvbHVtbigibnVtYmVyIiwiaGVhcCIpO2IuYWRkQ29sdW1uKHt0eXBlOiJzdHJpbmciLHJvbGU6InRvb2x0aXAifSk7Yi5hZGRDb2x1bW4oIm51bWJlciIsImZyZWUiKTsKYi5hZGRDb2x1bW4oIm51bWJlciIsImZyYWdtZW50YXRpb24iKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXS5hZ2dyZWdhdGlvblN0YXRzO2QmJmFbY10udGltZU9mZnNldFBzJiZiLmFkZFJvdyhbdGhpcy5jdChhW2NdLnRpbWVPZmZzZXRQcyksdGhpcy5HYyhkLnN0YWNrUmVzZXJ2ZWRCeXRlcyksdGhpcy5HYyhkLmhlYXBBbGxvY2F0ZWRCeXRlcykscUwodGhpcyxhW2NdKSx0aGlzLkdjKGQuZnJlZU1lbW9yeUJ5dGVzKSwxMDAqKGQuZnJhZ21lbnRhdGlvbnx8MCldKX10aGlzLm5hLmRyYXcoYix7Y3VydmVUeXBlOiJub25lIixjaGFydEFyZWE6e2xlZnQ6NjAscmlnaHQ6NjAsd2lkdGg6IjEwMCUifSxoQXhpczp7dGl0bGU6IlRpbWVzdGFtcCAobXMpIix0ZXh0U3R5bGU6e2JvbGQ6ITB9fSx2QXhlczp7MDp7dGl0bGU6Ik1lbW9yeSBVc2FnZSAoR2lCcykiLG1pblZhbHVlOjAsdGV4dFN0eWxlOntib2xkOiEwfX0sMTp7dGl0bGU6IkZyYWdtZW50YXRpb24gKCUpIiwKbWluVmFsdWU6MCxtYXhWYWx1ZToxMDAsdGV4dFN0eWxlOntib2xkOiEwfX19LHNlcmllczp7MDp7dGFyZ2V0QXhpc0luZGV4OjB9LDE6e3RhcmdldEF4aXNJbmRleDowfSwyOnt0YXJnZXRBeGlzSW5kZXg6MH0sMzp7dGFyZ2V0QXhpc0luZGV4OjEsdHlwZToibGluZSIsbGluZURhc2hTdHlsZTpbNCw0XX19LGxlZ2VuZDp7cG9zaXRpb246InRvcCJ9LHRvb2x0aXA6e3RyaWdnZXI6InNlbGVjdGlvbiJ9LGNvbG9yczpbInJlZCIsIm9yYW5nZSIsImdyZWVuIl0saGVpZ2h0OnRoaXMuaGVpZ2h0LGlzU3RhY2tlZDohMCxleHBsb3Jlcjp7YWN0aW9uczpbImRyYWdUb1pvb20iLCJyaWdodENsaWNrVG9SZXNldCJdLG1heFpvb21JbjouMDAxLG1heFpvb21PdXQ6MTB9fSl9fX07aC5HYz1mdW5jdGlvbihhKXtyZXR1cm4gYT9OdW1iZXIoYSkvTWF0aC5wb3coMiwzMCk6MH07aC5jdD1mdW5jdGlvbihhKXtyZXR1cm4gYT9OdW1iZXIoYSkvTWF0aC5wb3coMTAsOSk6MH07CnZhciBxTD1mdW5jdGlvbihhLGIpe2lmKCFiKXJldHVybiIiO3ZhciBjPWEuY3QoYi50aW1lT2Zmc2V0UHMpLGQ9Yi5hZ2dyZWdhdGlvblN0YXRzO2I9Yi5hY3Rpdml0eU1ldGFkYXRhO2lmKCEoZCYmYiYmYi5yZXF1ZXN0ZWRCeXRlcyYmYi5hbGxvY2F0aW9uQnl0ZXMmJmIubWVtb3J5QWN0aXZpdHkpKXJldHVybiIiO3ZhciBlPWEuR2MoYi5yZXF1ZXN0ZWRCeXRlcyksZj1hLkdjKGIuYWxsb2NhdGlvbkJ5dGVzKTsiREVBTExPQ0FUSU9OIj09PWIubWVtb3J5QWN0aXZpdHkmJihlPS1lLGY9LWYpO2E9YS5HYyhOdW1iZXIoZC5zdGFja1Jlc2VydmVkQnl0ZXMpK051bWJlcihkLmhlYXBBbGxvY2F0ZWRCeXRlcykpLnRvRml4ZWQoNCk7Yz0idGltZXN0YW1wKG1zKTogIitjLnRvRml4ZWQoMSk7Yys9IlxuZXZlbnQ6ICIrYi5tZW1vcnlBY3Rpdml0eS50b0xvd2VyQ2FzZSgpOzA8TnVtYmVyKGIucmVxdWVzdGVkQnl0ZXMpJiYoYys9IlxucmVxdWVzdGVkX3NpemUoR2lCcyk6ICIrZS50b0ZpeGVkKDQpKTsKYys9IlxuYWxsb2NhdGlvbl9zaXplKEdpQnMpOiAiK2YudG9GaXhlZCg0KTtiLnRmT3BOYW1lJiYoYys9IlxudGZfb3A6ICIrYi50Zk9wTmFtZSk7Yi5zdGVwSWQmJihjKz0iXG5zdGVwX2lkOiAiK2Iuc3RlcElkKTtiLnJlZ2lvblR5cGUmJihjKz0iXG5yZWdpb25fdHlwZTogIitiLnJlZ2lvblR5cGUpO2IuZGF0YVR5cGUmJiJJTlZBTElEIiE9PWIuZGF0YVR5cGUmJihjKz0iXG5kYXRhX3R5cGU6ICIrYi5kYXRhVHlwZSk7Yi50ZW5zb3JTaGFwZSYmKGMrPSJcbnRlbnNvcl9zaGFwZTogIitiLnRlbnNvclNoYXBlKTtyZXR1cm4gYysoIlxuXG5tZW1vcnlfaW5fdXNlKEdpQnMpOiAiK2EpfTsKcEwucHJvdG90eXBlLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pO2dvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soZnVuY3Rpb24oKXthLm5hPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5BcmVhQ2hhcnQoYS55Yy5pKTthLkxhKCl9KX07dmFyIHJMPWZ1bmN0aW9uKCl7fTt2YXIgc0w9ZnVuY3Rpb24oKXt9O3ZhciB0TD1mdW5jdGlvbihhKXthPWF8fHt9O3RoaXMubG9naWNhbEJ1ZmZlcklkPXhKKGEubG9naWNhbEJ1ZmZlcklkKTt0aGlzLm9mZnNldD14SihhLm9mZnNldCk7dGhpcy5zaXplPXhKKGEuc2l6ZSl9O3ZhciB2TD1mdW5jdGlvbihhKXthPWF8fHt9O3RoaXMuaW5kZXg9eEooYS5pbmRleCk7dGhpcy5zaXplPXhKKGEuc2l6ZSk7dGhpcy5pc1RocmVhZExvY2FsPWEuaXNUaHJlYWRMb2NhbHx8ITE7dGhpcy5hc3NpZ25lZD11TChhKTt0aGlzLmJpPWEuaXNFbnRyeUNvbXB1dGF0aW9uUGFyYW1ldGVyPyJQYXJhbWV0ZXIiOmEubWF5YmVMaXZlT3V0PyJPdXRwdXQiOmEuaXNUaHJlYWRMb2NhbD8iVGhyZWFkLWxvY2FsIjoiVGVtcG9yYXJ5In0sdUw9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXNzaWduZWQ/YS5hc3NpZ25lZC5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIG5ldyB0TChiKX0pOltdfTt2YXIgeEw9ZnVuY3Rpb24oYSxiLGMpe2I9dm9pZCAwPT09Yj9bXTpiO2M9dm9pZCAwPT09Yz8iIjpjO2E9YXx8e307dGhpcy5mb3JtYXQ9YS5mb3JtYXR8fCIiO3RoaXMubWlub3JUb01ham9yPVtdO3RoaXMuZGltZW5zaW9ucz1bXTt0aGlzLndHPTA7YS5taW5vclRvTWFqb3ImJih0aGlzLm1pbm9yVG9NYWpvcj1hLm1pbm9yVG9NYWpvci5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIE51bWJlcihkKX0pLHRoaXMuZGltZW5zaW9ucz13TChiLHRoaXMubWlub3JUb01ham9yLGMpKX0sd0w9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdO2I9bihiKTtmb3IodmFyIGU9Yi5uZXh0KCk7IWUuZG9uZTtlPWIubmV4dCgpKXtlPWFbZS52YWx1ZV07dmFyIGY9MDswPT09ZC5sZW5ndGg/Zj0xMjg6MT09PWQubGVuZ3RoJiYoZj0yPj1lPyJCRjE2Ij09PWM/NDoyOjQ+PWU/NDo4KTtkLnB1c2goe3NpemU6ZSxhbGlnbm1lbnQ6Zn0pfXJldHVybiBkfSx5TD1mdW5jdGlvbihhKXtyZXR1cm4iU1BBUlNFIj09PQphLmZvcm1hdD8ic3BhcnNleyIrYS53Ry50b1N0cmluZygpKyJ9IjoiREVOU0UiPT09YS5mb3JtYXQ/InsiK2EubWlub3JUb01ham9yLmpvaW4oKSsifSI6IiJ9O3ZhciB6TD1mdW5jdGlvbihhKXthPWF8fHt9O3RoaXMuZWxlbWVudFR5cGU9YS5lbGVtZW50VHlwZXx8IiI7dGhpcy5kaW1lbnNpb25zPVtdO3RoaXMudHVwbGVTaGFwZXM9W107YS5kaW1lbnNpb25zJiYodGhpcy5kaW1lbnNpb25zPWEuZGltZW5zaW9ucy5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIE51bWJlcihiKX0pKTthLnR1cGxlU2hhcGVzJiYodGhpcy50dXBsZVNoYXBlcz1hLnR1cGxlU2hhcGVzLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gbmV3IHpMKGIpfSkpO2EubGF5b3V0JiYodGhpcy5sYXlvdXQ9bmV3IHhMKGEubGF5b3V0LHRoaXMuZGltZW5zaW9ucyxhLmVsZW1lbnRUeXBlKSl9LEFMPWZ1bmN0aW9uKGEpe2lmKCJUVVBMRSI9PT1hLmVsZW1lbnRUeXBlKXJldHVybiIoIithLnR1cGxlU2hhcGVzLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gQUwoYyl9KS5qb2luKCIsICIpKyIpIjt2YXIgYj1hLmVsZW1lbnRUeXBlKyJbIithLmRpbWVuc2lvbnMuam9pbigpKyJdIjtyZXR1cm4iT1BBUVVFIiE9PQphLmVsZW1lbnRUeXBlJiYiVE9LRU4iIT09YS5lbGVtZW50VHlwZSYmMDxhLmRpbWVuc2lvbnMubGVuZ3RoJiZhLmxheW91dD9iK3lMKGEubGF5b3V0KTpifSxCTD1mdW5jdGlvbihhLGIpe3JldHVybiBiLnJlZHVjZShmdW5jdGlvbihjLGQpe3JldHVybiBjLnR1cGxlU2hhcGVzW2RdfSxhKX0sQ0w9ZnVuY3Rpb24oYSl7aWYoIlRPS0VOIj09PWEuZWxlbWVudFR5cGUpcmV0dXJuIDA7aWYoIlRVUExFIj09PWEuZWxlbWVudFR5cGUpcmV0dXJuIDgqYS50dXBsZVNoYXBlcy5sZW5ndGg7dmFyIGI9MDtpZihhLmxheW91dCYmIkRFTlNFIiE9PWEubGF5b3V0LmZvcm1hdCkiU1BBUlNFIj09PWEubGF5b3V0LmZvcm1hdCYmKGM9YS5sYXlvdXQud0csYj1jKndKKGEuZWxlbWVudFR5cGUpLGIrPWMqYS5kaW1lbnNpb25zLmxlbmd0aCo4KTtlbHNle3ZhciBjPWEuZGltZW5zaW9ucy5yZWR1Y2UoZnVuY3Rpb24oZCxlKXtyZXR1cm4gZCplfSwxKTtiKz1jKndKKGEuZWxlbWVudFR5cGUpfXJldHVybiBifTt2YXIgREw9ZnVuY3Rpb24oYSl7YT1hfHx7fTt0aGlzLm5hbWU9YS5uYW1lfHwiIjt0aGlzLm9wY29kZT1hLm9wY29kZXx8IiI7YS5zaGFwZSYmKHRoaXMuc2hhcGU9bmV3IHpMKGEuc2hhcGUpKTthLm1ldGFkYXRhJiYodGhpcy50Zk9wTmFtZT1hLm1ldGFkYXRhLm9wTmFtZXx8IiIpfTt2YXIgRkw9ZnVuY3Rpb24oYSl7YT1hfHx7fTt0aGlzLmlkPXhKKGEuaWQpO3RoaXMuc2l6ZT14SihhLnNpemUpO3RoaXMuY29sb3I9eEooYS5jb2xvcik7dGhpcy5pbnN0cnVjdGlvbk5hbWU9dGhpcy5jb21wdXRhdGlvbk5hbWU9IiI7dGhpcy5zaGFwZUluZGV4PVtdO2EuZGVmaW5lZEF0JiZFTCh0aGlzLGEuZGVmaW5lZEF0KX0sRUw9ZnVuY3Rpb24oYSxiKXtiJiYoYS5jb21wdXRhdGlvbk5hbWU9Yi5jb21wdXRhdGlvbk5hbWV8fCIiLGEuaW5zdHJ1Y3Rpb25OYW1lPWIuaW5zdHJ1Y3Rpb25OYW1lfHwiIixiLnNoYXBlSW5kZXgmJihhLnNoYXBlSW5kZXg9Yi5zaGFwZUluZGV4Lm1hcChmdW5jdGlvbihjKXtyZXR1cm4gTnVtYmVyKGMpfSkpKX07dmFyIElMPWZ1bmN0aW9uKGEpe3RoaXMuVU89W107dGhpcy53bz17fTt0aGlzLkZzPXt9O3RoaXMuSHk9e307dGhpcy5Iej1uZXcgU2V0O3RoaXMucno9bmV3IFNldDt0aGlzLm5JPXRoaXMuJHk9dGhpcy5udD10aGlzLkVHPTA7dGhpcy5pSD1bXTt0aGlzLmF6PTA7dGhpcy5FZT1bXTt0aGlzLk1pPVtdO3RoaXMuZGU9W107dGhpcy5Lbz1bXTt0aGlzLlVyPVtdO3RoaXMuRnk9W107dGhpcy5Jbz17fTt0aGlzLlJIPTE2Mzg0O3ZhciBiPWEuaGxvTW9kdWxlO2lmKGIpe2I9bihiLmNvbXB1dGF0aW9uc3x8W10pO2Zvcih2YXIgYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpe2M9bihjLnZhbHVlLmluc3RydWN0aW9uc3x8W10pO2Zvcih2YXIgZD1jLm5leHQoKTshZC5kb25lO2Q9Yy5uZXh0KCkpZD1kLnZhbHVlLGQubmFtZSYmKHRoaXMuSHlbZC5uYW1lXT1uZXcgREwoZCkpfX1lbHNlIGNvbnNvbGUud2FybigiTWlzc2luZyBobG9Nb2R1bGUsIHNraXBwaW5nIHVucGFkZGVkIGFsbG9jYXRpb24gc2l6ZSBhbmFseXNpcyIpOwppZihhPWEuYnVmZmVyQXNzaWdubWVudCl7aWYoYj1hLmxvZ2ljYWxCdWZmZXJzKWZvcihiPW4oYiksYz1iLm5leHQoKTshYy5kb25lO2M9Yi5uZXh0KCkpYz1jLnZhbHVlLGMuaWQmJihjPW5ldyBGTChjKSx0aGlzLlVPLnB1c2goYyksdGhpcy53b1tjLmlkXT1jLHRoaXMuSHouYWRkKGMuaWQpKTtpZihiPWEuYnVmZmVyQWxsb2NhdGlvbnMpZm9yKGI9bihiKSxjPWIubmV4dCgpOyFjLmRvbmU7Yz1iLm5leHQoKSl7ZD1jLnZhbHVlO2M9bmV3IHZMKGQpO2Q9bihkLmFzc2lnbmVkfHxbXSk7Zm9yKHZhciBlPWQubmV4dCgpOyFlLmRvbmU7ZT1kLm5leHQoKSllPWUudmFsdWUsZS5sb2dpY2FsQnVmZmVySWQmJih0aGlzLkZzW3hKKGUubG9naWNhbEJ1ZmZlcklkKV09Yyl9YTp7aWYoYT1hLmhlYXBTaW11bGF0b3JUcmFjZXMpZm9yKGE9bihhKSxiPWEubmV4dCgpOyFiLmRvbmU7Yj1hLm5leHQoKSlmb3IoYj1iLnZhbHVlLGM9bihiLmV2ZW50c3x8W10pLGQ9Yy5uZXh0KCk7IWQuZG9uZTtkPQpjLm5leHQoKSlpZihkPWQudmFsdWUsZC5idWZmZXJJZCYmKGQ9dGhpcy53b1t4SihkLmJ1ZmZlcklkKV0pKXtpZigwIT1kLmNvbG9yKWJyZWFrO2E9YjticmVhayBhfWE9bnVsbH1hP0dMKHRoaXMsYSk6Y29uc29sZS53YXJuKCJNaXNzaW5nIGhibSBoZWFwIHNpbXVsYXRvciB0cmFjZS4iKX1lbHNlIGNvbnNvbGUud2FybigiTm8gYnVmZmVyIGFzc2lnbm1lbnQgaW5mbyIpO0hMKHRoaXMpfSxKTD1mdW5jdGlvbihhLGIsYyl7aWYoYilpZihiLnNpemU8PWEuUkgpYS5udCs9Yi5zaXplO2Vsc2UgaWYoYi5pbnN0cnVjdGlvbk5hbWUpe3ZhciBkPWEuSHlbYi5pbnN0cnVjdGlvbk5hbWVdO2lmKGQmJmQuc2hhcGUpe3ZhciBlPUJMKGQuc2hhcGUsYi5zaGFwZUluZGV4KTtlJiYoYj1iJiZkP3tpbnN0cnVjdGlvbk5hbWU6Yi5pbnN0cnVjdGlvbk5hbWUsbG9naWNhbEJ1ZmZlcklkOmIuaWQsQ1I6ZT9DTChlKS8xMDQ4NTc2OjAsdGZPcE5hbWU6ZC50Zk9wTmFtZSxvcGNvZGU6ZC5vcGNvZGUsCklpOmIuc2l6ZS8xMDQ4NTc2LGNvbG9yOmEuRUcrKyxzaGFwZTplP0FMKGUpOiIiLGJpOmN9Om51bGwpJiZhLmRlLnB1c2goYil9fX0sS0w9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wO2IuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1hLkZzW2RdOyFlfHxlLmlzVGhyZWFkTG9jYWx8fGEucnouaGFzKGUuaW5kZXgpfHwoYS5yei5hZGQoZS5pbmRleCksYys9ZS5zaXplLEpMKGEsYS53b1tkXSxlLmJpKSl9KTtyZXR1cm4gY30sR0w9ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1bXSxkPVtdLGU9W10sZj1bXSxnPTAsbD0wLG09MCxwPTAscT0wLHI9e307Yj1uKGIuZXZlbnRzfHxbXSk7Zm9yKHZhciB2PWIubmV4dCgpOyF2LmRvbmU7cj17a2c6ci5rZ30sdj1iLm5leHQoKSl7dj12LnZhbHVlO2MucHVzaChnLzEwNDg1NzYpO2QucHVzaChsLzEwNDg1NzYpO3Iua2c9eEoodi5idWZmZXJJZCk7dmFyIHc9YS53b1tyLmtnXTthLkh6LmRlbGV0ZShyLmtnKTt2YXIgeD1hLkZzW3Iua2ddO3gmJgphLnJ6LmFkZCh4LmluZGV4KTt4PW51bGw7aWYody5pbnN0cnVjdGlvbk5hbWUmJiIiIT13Lmluc3RydWN0aW9uTmFtZSl7dmFyIHU9YS5IeVt3Lmluc3RydWN0aW9uTmFtZV07dSYmdS5zaGFwZSYmKHg9QkwodS5zaGFwZSx3LnNoYXBlSW5kZXgpKX1zd2l0Y2godi5raW5kKXtjYXNlICJBTExPQyI6Y2FzZSAiU0hBUkVfV0lUSCI6ZS5wdXNoKHIua2cpO2crPXcuc2l6ZTt4JiYobCs9Q0woeCkpO2EuSW9bci5rZ109W2MubGVuZ3RoLTEsLTFdO2c+bSYmKG09ZyxwPWwscT1jLmxlbmd0aC0xLGY9ZS5zbGljZSgpKTticmVhaztjYXNlICJGUkVFIjplPWUuZmlsdGVyKGZ1bmN0aW9uKEgpe3JldHVybiBmdW5jdGlvbihFKXtyZXR1cm4gRSE9PUgua2d9fShyKSk7Zy09dy5zaXplO3gmJihsLT1DTCh4KSk7YS5Jb1tyLmtnXVsxXT1jLmxlbmd0aC0xOzA+ZyYmY29uc29sZS5lcnJvcigiaGVhcF9zaXplX2J5dGVzIDwgMCIpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5sb2coIkVSUk9SOiB1bmtub3duIGhlYXAgZXZlbnQga2luZDoiKwp2LnRvU3RyaW5nKCkpfX1jLnB1c2goZy8xMDQ4NTc2KTtkLnB1c2gobC8xMDQ4NTc2KTtlPUtMKGEsYS5Ieik7YS4keT1tK2U7YS5uST1wK2U7YS5pSD1mO2EuYXo9cTt2YXIgRD1lLzEwNDg1NzY7YS5FZT1jLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gSCtEfSk7YS5NaT1kLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gSCtEfSl9fSxITD1mdW5jdGlvbihhKXtmb3IodmFyIGI9bihhLmlIKSxjPWIubmV4dCgpOyFjLmRvbmU7Yz1iLm5leHQoKSl7Yz1jLnZhbHVlO3ZhciBkPWEuRnNbY107SkwoYSxhLndvW2NdLGQ/ZC5iaToiIil9MCE9YS5udCYmKGI9InNtYWxsICg8IisoYS5SSC8xMDI0KS50b1N0cmluZygpKyIgS2lCKSIsYS5kZS5wdXNoKHtpbnN0cnVjdGlvbk5hbWU6YixJaTphLm50LzEwNDg1NzYsY29sb3I6YS5FRysrLGJpOmJ9KSk7Yj1hLmRlLm1hcChmdW5jdGlvbihlLGYpe3JldHVybntkUTpmLEZrOmV9fSk7Yi5zb3J0KGZ1bmN0aW9uKGUsZil7cmV0dXJuKGYmJmYuRmsmJmYuRmsuSWk/CmYuRmsuSWk6MCktKGUmJmUuRmsmJmUuRmsuSWk/ZS5Gay5JaTowKX0pO2EuS289Yi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuRmt9KTthLlVyPWIubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRRfSk7YS5GeS5sZW5ndGg9YS5kZS5sZW5ndGg7Zm9yKGI9MDtiPGEuVXIubGVuZ3RoO2IrKylhLkZ5W2EuVXJbYl1dPWJ9O3ZhciBMTD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpczt0aGlzLm9iPWI7dGhpcy5zdG9yZT1jO3RoaXMuSXo9dGhpcy5nSD10aGlzLkFHPSIiO3RoaXMuc3o9dGhpcy5zZWxlY3RlZEluZGV4PS0xO3RoaXMuaHk9ITE7YS5wYXJhbXMuc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe2QudXBkYXRlKGUpfSl9O0xMLnByb3RvdHlwZS5YPWZ1bmN0aW9uKCl7TUwodGhpcyl9Owp2YXIgTUw9ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/bnVsbDpiO2Euc3RvcmUueGEoYUooe09yOmJ9KSk7Yj9hLkNnPXtzaXplOmIuSWl8fDAsbng6TkwoYSxiLmxvZ2ljYWxCdWZmZXJJZHx8MCwwKSxGRjpOTChhLGIubG9naWNhbEJ1ZmZlcklkfHwwLDEpLGNvbG9yOnVKWyhiLmNvbG9yfHwwKSV1Si5sZW5ndGhdfTooYS5DZz12b2lkIDAsYS5zZWxlY3RlZEluZGV4PS0xLGEuc3o9LTEpfSxOTD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEudXNhZ2UmJmEudXNhZ2UuSW8mJmEudXNhZ2UuSW9bYl0/YS51c2FnZS5Jb1tiXVtjXSsxOjB9OwpMTC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5zdG9yZS54YShlSih7RGI6e3phOiEwLG1lc3NhZ2U6IkxvYWRpbmcgZGF0YSJ9fSkpO3RoaXMub2IuZ2V0RGF0YShhLmdhfHwiIiwibWVtb3J5X3ZpZXdlciIsYS5ob3N0fHwiIikuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2Iuc3RvcmUueGEoZUooe0RiOnt6YTohMSxtZXNzYWdlOiIifX0pKTtjJiZjLmhsb01vZHVsZSYmYy5idWZmZXJBc3NpZ25tZW50JiYoYi5BRz1jLmhsb01vZHVsZS5uYW1lfHwiIixiLnVzYWdlPW5ldyBJTChjKSxiLmdIPShiLnVzYWdlLiR5LzEwNDg1NzYpLnRvRml4ZWQoMiksYi5Jej0oYi51c2FnZS5uSS8xMDQ4NTc2KS50b0ZpeGVkKDIpLGIuRWU9Yi51c2FnZS5FZSxiLk1pPWIudXNhZ2UuTWksYi5pbT17c2l6ZTpiLnVzYWdlLiR5LzEwNDg1NzYsbng6Yi51c2FnZS5heisxLEZGOmIudXNhZ2UuYXorMn0sYi5kZT1iLnVzYWdlLmRlLGIuS289Yi51c2FnZS5LbyxiLmh5PSEhYi5FZSYmCjA8Yi5FZS5sZW5ndGgpfSl9O3ZhciBPTD1mdW5jdGlvbigpe3RoaXMudGl0bGU9IiI7dGhpcy5zZWxlY3RlZEluZGV4PS0xO3RoaXMuc2VsZWN0ZWQ9bmV3IHJrO3RoaXMubmE9bnVsbH07T0wucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7dGhpcy5qYSgpfTtPTC5wcm90b3R5cGUuU2E9ZnVuY3Rpb24oYSl7YS5tYXhIZWFwJiZ0aGlzLkxhKCk7YS5zZWxlY3RlZEluZGV4JiZ0aGlzLm5hJiZ0aGlzLm5hLnNldFNlbGVjdGlvbihbe3JvdzowLGNvbHVtbjp0aGlzLnNlbGVjdGVkSW5kZXgrMX1dKX07Ck9MLnByb3RvdHlwZS5MYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYodGhpcy5uYSYmdGhpcy5kZSl7dmFyIGI9WzBdLmNvbmNhdCh0aGlzLmRlLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZD9kLklpfHwwOjB9KSksYz10aGlzLmRlLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdUpbKGQuY29sb3J8fDApJXVKLmxlbmd0aF19KTtiPWdvb2dsZS52aXN1YWxpemF0aW9uLmFycmF5VG9EYXRhVGFibGUoW0FycmF5KGIubGVuZ3RoKS5maWxsKCIiKSxiXSk7dGhpcy5uYS5kcmF3KGIse2Jhcjp7Z3JvdXBXaWR0aDoiMTAwJSJ9LGNvbG9yczpjLGNoYXJ0QXJlYTp7bGVmdDowLHJpZ2h0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiMTAwJSJ9LGlzU3RhY2tlZDoicGVyY2VudCIsbGVnZW5kOntwb3NpdGlvbjoibm9uZSJ9LG9yaWVudGF0aW9uOiJ2ZXJ0aWNhbCIsdG9vbHRpcDp7dHJpZ2dlcjoibm9uZSJ9LGhBeGlzOntiYXNlbGluZUNvbG9yOiJ0cmFuc3BhcmVudCJ9LHZBeGlzOntiYXNlbGluZUNvbG9yOiJ0cmFuc3BhcmVudCJ9fSk7Cmdvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcih0aGlzLm5hLCJjbGljayIsZnVuY3Rpb24oKXthLm5hJiZhLm5hLnNldFNlbGVjdGlvbihbXSl9KTtnb29nbGUudmlzdWFsaXphdGlvbi5ldmVudHMuYWRkTGlzdGVuZXIodGhpcy5uYSwib25tb3VzZW91dCIsZnVuY3Rpb24oKXthLm5hJiZhLm5hLnNldFNlbGVjdGlvbihbXSk7YS5zZWxlY3RlZC5lbWl0KC0xKX0pO2dvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcih0aGlzLm5hLCJvbm1vdXNlb3ZlciIsZnVuY3Rpb24oZCl7ZD1kfHx7fTt2YXIgZT1bXTtlLnB1c2goZCk7YS5uYSYmYS5uYS5zZXRTZWxlY3Rpb24oZSk7YS5zZWxlY3RlZC5lbWl0KChkLmNvbHVtbnx8MCktMSl9KX19OwpPTC5wcm90b3R5cGUuamE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2dvb2dsZSYmZ29vZ2xlLmNoYXJ0c3x8c2V0VGltZW91dChmdW5jdGlvbigpe2EuamEoKX0sMTAwKTtnb29nbGUuY2hhcnRzLmxvYWQoImN1cnJlbnQiLHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7Z29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe2EubmE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGEueWMuaSk7YS5MYSgpfSl9O3ZhciBQTD1mdW5jdGlvbigpe307dmFyIFFMPWZ1bmN0aW9uKCl7dGhpcy5aeT10aGlzLm5hPXRoaXMuTnI9bnVsbDt0aGlzLmNtPXRoaXMubWF4U2l6ZT0wfTtRTC5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXt0aGlzLmphKCl9O1FMLnByb3RvdHlwZS5TYT1mdW5jdGlvbihhKXsoYS5oZWFwU2l6ZXN8fGEudW5wYWRkZWRIZWFwU2l6ZXMpJiZ0aGlzLkxhKCk7YS5wZWFrSW5mbyYmUkwodGhpcyk7YS5hY3RpdmVJbmZvJiZTTCh0aGlzKX07CnZhciBTTD1mdW5jdGlvbihhKXtpZihhLk5yKWlmKGEuQ2cpe3ZhciBiPWdvb2dsZS52aXN1YWxpemF0aW9uLmFycmF5VG9EYXRhVGFibGUoW1siWCIsIlNpemUiXSxbYS5DZy5ueCxhLkNnLnNpemVdLFthLkNnLkZGLGEuQ2cuc2l6ZV1dKTthLk5yLmRyYXcoYix7YXJlYU9wYWNpdHk6LjcsYmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsY2hhcnRBcmVhOntsZWZ0OjUwLHJpZ2h0OjUwLHdpZHRoOiI5MCUiLGhlaWdodDoiOTAlIn0sY29sb3JzOlthLkNnLmNvbG9yfHwiIl0sZm9jdXNUYXJnZXQ6Im5vbmUiLGhBeGlzOntiYXNlbGluZUNvbG9yOiJ0cmFuc3BhcmVudCIsZ3JpZGxpbmVzOntjb2xvcjoidHJhbnNwYXJlbnQifSx0ZXh0UG9zaXRpb246Im5vbmUiLHZpZXdXaW5kb3c6e21pbjowLG1heDphLmNtfX0sdkF4aXM6e2Jhc2VsaW5lQ29sb3I6InRyYW5zcGFyZW50IixncmlkbGluZXM6e2NvbG9yOiJ0cmFuc3BhcmVudCJ9LHRleHRQb3NpdGlvbjoibm9uZSIsdmlld1dpbmRvdzp7bWluOjAsCm1heDphLm1heFNpemV9fSxsZWdlbmQ6e3Bvc2l0aW9uOiJub25lIn0sbGluZVdpZHRoOjJ9KX1lbHNlIGEuTnIuY2xlYXJDaGFydCgpfTsKUUwucHJvdG90eXBlLkxhPWZ1bmN0aW9uKCl7aWYodGhpcy5uYSYmdGhpcy5FZSYmdGhpcy5NaSl7dmFyIGE9W107dGhpcy5jbT10aGlzLkVlLmxlbmd0aC0xO2Zvcih2YXIgYj0wO2I8dGhpcy5FZS5sZW5ndGg7YisrKXRoaXMubWF4U2l6ZT1NYXRoLm1heCh0aGlzLm1heFNpemUsTWF0aC5tYXgodGhpcy5FZVtiXSx0aGlzLk1pW2JdKSksYS5wdXNoKFtiLHRoaXMuRWVbYl0sdGhpcy5NaVtiXV0pO3RoaXMubWF4U2l6ZT1NYXRoLnJvdW5kKDEuMSp0aGlzLm1heFNpemUpO2I9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZTtiLmFkZENvbHVtbigibnVtYmVyIiwiWCIpO2IuYWRkQ29sdW1uKCJudW1iZXIiLCJTaXplIik7Yi5hZGRDb2x1bW4oIm51bWJlciIsIlVucGFkZGVkIFNpemUiKTtiLmFkZFJvd3MoYSk7dGhpcy5uYS5kcmF3KGIse2JhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQiLGNoYXJ0QXJlYTp7bGVmdDo1MCxyaWdodDo1MCx3aWR0aDoiOTAlIixoZWlnaHQ6IjkwJSJ9LApmb2N1c1RhcmdldDoibm9uZSIsaEF4aXM6e2Jhc2VsaW5lQ29sb3I6InRyYW5zcGFyZW50Iix2aWV3V2luZG93OnttaW46MCxtYXg6dGhpcy5jbX19LHZBeGlzOntiYXNlbGluZUNvbG9yOiJ0cmFuc3BhcmVudCIsdmlld1dpbmRvdzp7bWluOjAsbWF4OnRoaXMubWF4U2l6ZX19LGxlZ2VuZDp7cG9zaXRpb246InRvcCJ9fSl9fTsKdmFyIFJMPWZ1bmN0aW9uKGEpe2lmKGEuWnkmJmEuaW0pe3ZhciBiPU1hdGgubWF4KE1hdGgucm91bmQoYS5jbS81MCksMSksYz1NYXRoLm1heChNYXRoLnJvdW5kKGEuaW0ubngtYi8yKSwwKTtiPWdvb2dsZS52aXN1YWxpemF0aW9uLmFycmF5VG9EYXRhVGFibGUoW1siWCIsIlNpemUiXSxbYyxhLmltLnNpemVdLFtNYXRoLm1pbihjK2IsYS5jbSksYS5pbS5zaXplXV0pO2EuWnkuZHJhdyhiLHtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixjaGFydEFyZWE6e2xlZnQ6NTAscmlnaHQ6NTAsd2lkdGg6IjkwJSIsaGVpZ2h0OiI5MCUifSxjb2xvcnM6WyIjMDBmZjAwIl0sZm9jdXNUYXJnZXQ6Im5vbmUiLGhBeGlzOntiYXNlbGluZUNvbG9yOiJ0cmFuc3BhcmVudCIsZ3JpZGxpbmVzOntjb2xvcjoidHJhbnNwYXJlbnQifSx0ZXh0UG9zaXRpb246Im5vbmUiLHZpZXdXaW5kb3c6e21pbjowLG1heDphLmNtfX0sdkF4aXM6e2Jhc2VsaW5lQ29sb3I6InRyYW5zcGFyZW50IixncmlkbGluZXM6e2NvbG9yOiJ0cmFuc3BhcmVudCJ9LAp0ZXh0UG9zaXRpb246Im5vbmUiLHZpZXdXaW5kb3c6e21pbjowLG1heDphLm1heFNpemV9fSxsZWdlbmQ6e3Bvc2l0aW9uOiJub25lIn0sbGluZVdpZHRoOjB9KX19O1FMLnByb3RvdHlwZS5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTtnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7YS5Ocj1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQXJlYUNoYXJ0KGEuek8uaSk7YS5uYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uTGluZUNoYXJ0KGEueWMuaSk7YS5aeT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQXJlYUNoYXJ0KGEuUlEuaSk7UkwoYSk7U0woYSk7YS5MYSgpfSl9O3ZhciBUTD1mdW5jdGlvbigpe307dmFyIFVMPWZ1bmN0aW9uKCl7fTt2YXIgVkw9ZnVuY3Rpb24oKXt9O1ZMLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9QUooYSk7dGhpcy5ubz16SihNYXRoLm1pbihiLDEpLC43LDEsTWF0aC5zcXJ0KTt0aGlzLnJJPURKKGIpO2I9QkooYSk7dGhpcy5Rbj16SihNYXRoLm1heCgxLWIsMCksLjcsMSxNYXRoLnNxcnQpO3RoaXMueUc9REooYil9ZWxzZSB0aGlzLnJJPXRoaXMueUc9dGhpcy5ubz10aGlzLlFuPXZvaWQgMH07dmFyIFdRPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzO3RoaXMub2I9Yjt0aGlzLnN0b3JlPWM7dGhpcy5wcm9maWxlPW51bGw7dGhpcy5kYXRhPW5ldyBWTDt0aGlzLlFlPXRoaXMueWU9dGhpcy56bz10aGlzLmt5PSExO3RoaXMuSGM9MTA7YS5wYXJhbXMuc3Vic2NyaWJlKGZ1bmN0aW9uKGUpe2QudXBkYXRlKGUpfSl9LFhRPWZ1bmN0aW9uKGEpe2EucGs9YS5wcm9maWxlP2Eua3k/YS56bz9hLnByb2ZpbGUuYnlDYXRlZ29yeTphLnByb2ZpbGUuYnlQcm9ncmFtOmEucHJvZmlsZS5ieUNhdGVnb3J5fHxhLnByb2ZpbGUuYnlQcm9ncmFtOnZvaWQgMH07CldRLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczt0aGlzLnN0b3JlLnhhKGVKKHtEYjp7emE6ITAsbWVzc2FnZToiTG9hZGluZyBkYXRhIn19KSk7dGhpcy5vYi5nZXREYXRhKGEuZ2F8fCIiLCJvcF9wcm9maWxlIixhLmhvc3R8fCIiKS5zdWJzY3JpYmUoZnVuY3Rpb24oYyl7Yi5zdG9yZS54YShlSih7RGI6e3phOiExLG1lc3NhZ2U6IiJ9fSkpO2IucHJvZmlsZT1jO2Iua3k9ISFiLnByb2ZpbGUmJiEhYi5wcm9maWxlLmJ5Q2F0ZWdvcnkmJiEhYi5wcm9maWxlLmJ5UHJvZ3JhbTtiLnpvPSExO2IuSGM9MTA7WFEoYik7Yi5kYXRhLnVwZGF0ZShiLnBrKX0pfTt2YXIgWVE9ZnVuY3Rpb24oYSl7dGhpcy5zdG9yZT1hO3RoaXMuUWU9dGhpcy55ZT0hMTt0aGlzLkhjPTEwfTtZUS5wcm90b3R5cGUuWD1mdW5jdGlvbigpe3RoaXMuc3RvcmUueGEoYkooe01uOm51bGx9KSl9O3ZhciBaUT1mdW5jdGlvbigpe3RoaXMubGV2ZWw9MDt0aGlzLlFlPXRoaXMueWU9ITE7dGhpcy5IYz0xMDt0aGlzLnZvPW5ldyByazt0aGlzLnNlbGVjdGVkPW5ldyByazt0aGlzLmNoaWxkcmVuPVtdO3RoaXMuTWE9ITE7dGhpcy5BRj10aGlzLnR4PSIiO3RoaXMubXk9ITE7dGhpcy51dGlsaXphdGlvbj10aGlzLmZJPXRoaXMucHJvdmVuYW5jZT10aGlzLnVmPXRoaXMub2Zmc2V0PXRoaXMubmFtZT0iIn07ClpRLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMubm9kZT8oMD09PXRoaXMubGV2ZWwmJih0aGlzLk1hPSEwKSx0aGlzLmNoaWxkcmVuPSRRKHRoaXMpLHRoaXMubm9kZSYmdGhpcy5ub2RlLm1ldHJpY3MmJnRoaXMubm9kZS5tZXRyaWNzLnRpbWU/dGhpcy50eD10aGlzLnVmPURKKHRoaXMubm9kZS5tZXRyaWNzLnRpbWUpOih0aGlzLnR4PSIwIix0aGlzLnVmPSIiKSx0aGlzLkFGPXpKKEFKKHRoaXMubm9kZSksLjcsMSxNYXRoLnNxcnQpLHRoaXMubXk9IUNKKHRoaXMubm9kZSksdGhpcy5uYW1lPXRoaXMubm9kZSYmdGhpcy5ub2RlLm5hbWU/dGhpcy5ub2RlLm5hbWU6IiIsdGhpcy5vZmZzZXQ9dGhpcy5sZXZlbC50b1N0cmluZygpKyJlbSIsdGhpcy5wcm92ZW5hbmNlPXRoaXMubm9kZSYmdGhpcy5ub2RlLnhsYSYmdGhpcy5ub2RlLnhsYS5wcm92ZW5hbmNlP3RoaXMubm9kZS54bGEucHJvdmVuYW5jZS5yZXBsYWNlKC9eLiooOnxcLykvLCIiKToiIix0aGlzLmZJPURKKEVKKHRoaXMubm9kZSkpLAp0aGlzLnV0aWxpemF0aW9uPURKKEFKKHRoaXMubm9kZSkpKTp0aGlzLmNoaWxkcmVuPVtdfTsKdmFyIGFSPWZ1bmN0aW9uKGEpe2lmKCEoYS5RZSYmYS5ub2RlJiZhLm5vZGUuY2hpbGRyZW4mJjAhPT1hLm5vZGUuY2hpbGRyZW4ubGVuZ3RoJiZhLm5vZGUubWV0cmljcyYmYS5ub2RlLm1ldHJpY3MudGltZSkpcmV0dXJuIGEuSGM7Zm9yKHZhciBiPTAsYz0uOSphLm5vZGUubWV0cmljcy50aW1lLGQ9TWF0aC5taW4oYS5IYyxhLm5vZGUuY2hpbGRyZW4ubGVuZ3RoKSxlPTA7ZTxkO2UrKyl7aWYoYj49YylyZXR1cm4gZTt2YXIgZj1hLm5vZGUuY2hpbGRyZW5bZV07ZiYmZi5tZXRyaWNzJiZmLm1ldHJpY3MudGltZSYmKGIrPWYubWV0cmljcy50aW1lKX1yZXR1cm4gYS5IY30sJFE9ZnVuY3Rpb24oYSl7aWYoIWEubm9kZXx8IWEubm9kZS5jaGlsZHJlbilyZXR1cm5bXTt2YXIgYj1bXTtiPWFSKGEpO2I9YS5sZXZlbD9hLm5vZGUuY2hpbGRyZW4uc2xpY2UoMCxiKTphLm5vZGUuY2hpbGRyZW4uc2xpY2UoKTthLnllJiZiLnNvcnQoZnVuY3Rpb24oYyxkKXtyZXR1cm4gRUooZCktRUooYyl9KTsKcmV0dXJuIGJ9O3ZhciBiUj1mdW5jdGlvbigpe307dmFyIGNSPWZ1bmN0aW9uKCl7fTt2YXIgZFI9ZnVuY3Rpb24oKXt9O3ZhciBlUj1mdW5jdGlvbigpe3RoaXMuZ2U9W107dGhpcy5kaWFnbm9zdGljcz17aW5mbzpbXSx3YXJuaW5nczpbXSxlcnJvcnM6W119O3RoaXMuQlE9dGhpcy5ydW5FbnZpcm9ubWVudD10aGlzLmVwPXRoaXMucWI9dGhpcy5rZj1udWxsfTtrLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVSLnByb3RvdHlwZSx7U3I6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5nZT1hfX19KTt2YXIgZlI9ZnVuY3Rpb24oYSxiLGMpe2VSLmNhbGwodGhpcyk7dmFyIGQ9dGhpczt0aGlzLm9iPWI7dGhpcy5zdG9yZT1jO2EucGFyYW1zLnN1YnNjcmliZShmdW5jdGlvbihlKXtkLnVwZGF0ZShlKX0pfTt0KGZSLGVSKTsKZlIucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLGM9YS5nYXx8IiIsZD1hLnRhZ3x8Im92ZXJ2aWV3X3BhZ2UiO2E9YS5ob3N0fHwiIjt0aGlzLnN0b3JlLnhhKGVKKHtEYjp7emE6ITAsbWVzc2FnZToiTG9hZGluZyBkYXRhIn19KSk7dGhpcy5vYi5nZXREYXRhKGMsZCxhKS5zdWJzY3JpYmUoZnVuY3Rpb24oZSl7Yi5zdG9yZS54YShlSih7RGI6e3phOiExLG1lc3NhZ2U6IiJ9fSkpO2U9ZXx8W107Yi5rZj1lWzBdO2IucWI9ZVsxXTtiLnJ1bkVudmlyb25tZW50PWVbMl07Yi5lcD1lWzNdO2IuQlE9ZVs1XTtiLmRpYWdub3N0aWNzPUhKKGVbNl0pO2U9KGIucWJ8fHt9KS5wfHx7fTtiLlNyLnB1c2goIklkbGU6ICIrKGUuaWRsZV9tc19hdmVyYWdlfHwiIikrIiBtcyIpO2IuU3IucHVzaCgiSW5wdXQ6ICIrKGUuaW5wdXRfbXNfYXZlcmFnZXx8IiIpKyIgbXMiKTtiLlNyLnB1c2goIkNvbXB1dGU6ICIrKGUuY29tcHV0ZV9tc19hdmVyYWdlfHwiIikrIiBtcyIpfSl9O3ZhciBnUj1mdW5jdGlvbigpe307dmFyIGhSPVt7dGl0bGU6IkFsbCBPdGhlcnMgVGltZSIsT2g6Im90aGVyX3RpbWVfbXNfYXZnIixIaToib3RoZXJfdGltZV9tc19zZHYifSx7dGl0bGU6IkNvbXBpbGF0aW9uIFRpbWUiLE9oOiJjb21waWxlX3RpbWVfbXNfYXZnIixIaToiY29tcGlsZV90aW1lX21zX3NkdiJ9LHt0aXRsZToiT3V0cHV0IFRpbWUiLE9oOiJvdXRmZWVkX3RpbWVfbXNfYXZnIixIaToib3V0ZmVlZF90aW1lX21zX3NkdiJ9LHt0aXRsZToiSW5wdXQgVGltZSIsT2g6ImluZmVlZF90aW1lX21zX2F2ZyIsSGk6ImluZmVlZF90aW1lX21zX3NkdiJ9LHt0aXRsZToiS2VybmVsIExhdW5jaCBUaW1lIixPaDoia2VybmVsX2xhdW5jaF90aW1lX21zX2F2ZyIsSGk6Imtlcm5lbF9sYXVuY2hfdGltZV9tc19zZHYifSx7dGl0bGU6Ikhvc3QgQ29tcHV0ZSBUaW1lIixPaDoiaG9zdF9jb21wdXRlX3RpbWVfbXNfYXZnIixIaToiaG9zdF9jb21wdXRlX3RpbWVfbXNfc2R2In0se3RpdGxlOiJEZXZpY2UgdG8gRGV2aWNlIFRpbWUiLApPaDoiZGV2aWNlX3RvX2RldmljZV90aW1lX21zX2F2ZyIsSGk6ImRldmljZV90b19kZXZpY2VfdGltZV9tc19zZHYifSx7dGl0bGU6IkRldmljZSBDb21wdXRlIFRpbWUiLE9oOiJkZXZpY2VfY29tcHV0ZV90aW1lX21zX2F2ZyIsSGk6ImRldmljZV9jb21wdXRlX3RpbWVfbXNfc2R2In1dLGlSPWZ1bmN0aW9uKCl7dGhpcy5HUD1bXTt0aGlzLlFFPSIiO3RoaXMudGl0bGU9IlBlcmZvcm1hbmNlIFN1bW1hcnkiO3RoaXMuZ2k9ITA7dGhpcy5BdD1bXTt0aGlzLkFmPVtdO3RoaXMuano9dGhpcy5rej10aGlzLkJGPXRoaXMuREc9IiI7dGhpcy5NUD0iVGhlIGZpcnN0IG51bWJlciBzaG93cyB0aGUgaGFyZHdhcmUgdXRpbGl6YXRpb24gYmFzZWQgb24gdGhlIGhhcmR3YXJlIHBlcmZvcm1hbmNlIGNvdW50ZXIuIFRoZSBzZWNvbmQgb25lIHNob3dzIHRoZSBwZXJmb3JtYW5jZSBjb21wYXJlZCB0byB0aGUgcHJvZ3JhbSdzIG9wdGltYWwgcGVyZm9ybWFuY2UgY29uc2lkZXJpbmcgdGhlIGluc3RydWN0aW9uIG1peCAoaS5lLiwgdGhlIHJhdGlvIG9mIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYW5kIG1lbW9yeSBvcGVyYXRpb25zKS4iOwp0aGlzLndSPSJJdCBpcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIFRGIG9wcyBleGVjdXRlZCBvbiB0aGUgaG9zdCBhbmQgZGV2aWNlLiI7dGhpcy5GUT0iT3V0IG9mIHRoZSB0b3RhbCBvcCBleGVjdXRpb24gdGltZSBvbiBob3N0IChkZXZpY2UpLCBleGNsdWRpbmcgaWRsZSB0aW1lLCB0aGUgcGVyY2VudGFnZSBvZiB3aGljaCB1c2VkIGVhZ2VyIGV4ZWN1dGlvbi4ifTsKaVIucHJvdG90eXBlLlNhPWZ1bmN0aW9uKCl7aWYodGhpcy5rZiYmdGhpcy5xYilpZih0aGlzLmdpPSJUUFUiPT09alIodGhpcywiaGFyZHdhcmVfdHlwZSIsIlRQVSIpKXt2YXIgYT0odGhpcy5rZnx8e30pLnB8fHt9LGI9KHRoaXMucWJ8fHt9KS5wfHx7fTt0aGlzLkRHPWEubXh1X3V0aWxpemF0aW9uX3BlcmNlbnR8fCIiO3RoaXMuQkY9YS5mbG9wX3JhdGVfdXRpbGl6YXRpb25fcmVsYXRpdmVfdG9fcm9vZmxpbmV8fCIiO3RoaXMua3o9YS5yZW1hcmtfdGV4dHx8IiI7dGhpcy5qej1hLnJlbWFya19jb2xvcnx8IiI7dGhpcy5BZj1bXS5jb25jYXQoamEodGhpcy5HUCkpO3RoaXMuQXQ9W107dGhpcy5nZSYmdGhpcy5nZS5sZW5ndGgmJnRoaXMuQWYucHVzaCh7dGl0bGU6IkF2ZXJhZ2UgU3RlcCBUaW1lIixVaDpbImxvd2VyIGlzIGJldHRlciIsIihcdTAzYzMgPSAiKyhiLnN0ZXB0aW1lX21zX3N0YW5kYXJkX2RldmlhdGlvbnx8IiIpKyIgbXMpIl0sdmFsdWU6Yi5zdGVwdGltZV9tc19hdmVyYWdlKwoiIG1zIix0STp0aGlzLlFFLGdlOltdLmNvbmNhdChqYSh0aGlzLmdlfHxbXSkpfSk7dGhpcy5BZi5wdXNoKHt0aXRsZToiSG9zdCBJZGxlIFRpbWUiLFVoOlsibG93ZXIgaXMgYmV0dGVyIl0sdmFsdWU6YS5ob3N0X2lkbGVfdGltZV9wZXJjZW50fSk7dGhpcy5BZi5wdXNoKHt0aXRsZToiVFBVIElkbGUgVGltZSIsVWg6WyJsb3dlciBpcyBiZXR0ZXIiXSx2YWx1ZTphLmRldmljZV9pZGxlX3RpbWVfcGVyY2VudH0pO3RoaXMuQXQucHVzaCh7dGl0bGU6Ik1lbW9yeSBCYW5kd2lkdGggVXRpbGl6YXRpb24iLFVoOlsiaGlnaGVyIGlzIGJldHRlciJdLHZhbHVlOmEubWVtb3J5X2J3X3V0aWxpemF0aW9uX3JlbGF0aXZlX3RvX2h3X2xpbWl0fSl9ZWxzZSBrUih0aGlzKX07CnZhciBqUj1mdW5jdGlvbihhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7YT0oYS5xYnx8e30pLnB8fHt9O3N3aXRjaChiKXtjYXNlICJoYXJkd2FyZV90eXBlIjpyZXR1cm4gYS5oYXJkd2FyZV90eXBlfHxjO2Nhc2UgIm90aGVyX3RpbWVfbXNfYXZnIjpyZXR1cm4gYS5vdGhlcl90aW1lX21zX2F2Z3x8YztjYXNlICJvdGhlcl90aW1lX21zX3NkdiI6cmV0dXJuIGEub3RoZXJfdGltZV9tc19zZHZ8fGM7Y2FzZSAiY29tcGlsZV90aW1lX21zX2F2ZyI6cmV0dXJuIGEuY29tcGlsZV90aW1lX21zX2F2Z3x8YztjYXNlICJjb21waWxlX3RpbWVfbXNfc2R2IjpyZXR1cm4gYS5jb21waWxlX3RpbWVfbXNfc2R2fHxjO2Nhc2UgIm91dGZlZWRfdGltZV9tc19hdmciOnJldHVybiBhLm91dGZlZWRfdGltZV9tc19hdmd8fGM7Y2FzZSAib3V0ZmVlZF90aW1lX21zX3NkdiI6cmV0dXJuIGEub3V0ZmVlZF90aW1lX21zX3Nkdnx8YztjYXNlICJpbmZlZWRfdGltZV9tc19hdmciOnJldHVybiBhLmluZmVlZF90aW1lX21zX2F2Z3x8CmM7Y2FzZSAiaW5mZWVkX3RpbWVfbXNfc2R2IjpyZXR1cm4gYS5pbmZlZWRfdGltZV9tc19zZHZ8fGM7Y2FzZSAia2VybmVsX2xhdW5jaF90aW1lX21zX2F2ZyI6cmV0dXJuIGEua2VybmVsX2xhdW5jaF90aW1lX21zX2F2Z3x8YztjYXNlICJrZXJuZWxfbGF1bmNoX3RpbWVfbXNfc2R2IjpyZXR1cm4gYS5rZXJuZWxfbGF1bmNoX3RpbWVfbXNfc2R2fHxjO2Nhc2UgImhvc3RfY29tcHV0ZV90aW1lX21zX2F2ZyI6cmV0dXJuIGEuaG9zdF9jb21wdXRlX3RpbWVfbXNfYXZnfHxjO2Nhc2UgImhvc3RfY29tcHV0ZV90aW1lX21zX3NkdiI6cmV0dXJuIGEuaG9zdF9jb21wdXRlX3RpbWVfbXNfc2R2fHxjO2Nhc2UgImRldmljZV90b19kZXZpY2VfdGltZV9tc19hdmciOnJldHVybiBhLmRldmljZV90b19kZXZpY2VfdGltZV9tc19hdmd8fGM7Y2FzZSAiZGV2aWNlX3RvX2RldmljZV90aW1lX21zX3NkdiI6cmV0dXJuIGEuZGV2aWNlX3RvX2RldmljZV90aW1lX21zX3Nkdnx8YztjYXNlICJkZXZpY2VfY29tcHV0ZV90aW1lX21zX2F2ZyI6cmV0dXJuIGEuZGV2aWNlX2NvbXB1dGVfdGltZV9tc19hdmd8fApjO2Nhc2UgImRldmljZV9jb21wdXRlX3RpbWVfbXNfc2R2IjpyZXR1cm4gYS5kZXZpY2VfY29tcHV0ZV90aW1lX21zX3Nkdnx8Y31yZXR1cm4gY30sa1I9ZnVuY3Rpb24oYSl7dmFyIGI9KGEua2Z8fHt9KS5wfHx7fSxjPShhLnFifHx7fSkucHx8e307YS5rej1iLnJlbWFya190ZXh0fHwiIjthLmp6PWIucmVtYXJrX2NvbG9yfHwiIjthLkFmPVtdO2EuQXQ9W107YS5BZi5wdXNoKHt0aXRsZToiQXZlcmFnZSBTdGVwIFRpbWUiLFVoOlsibG93ZXIgaXMgYmV0dGVyIiwiKFx1MDNjMyA9ICIrKGMuc3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9ufHwiIikrIiBtcykiXSx2YWx1ZTpjLnN0ZXB0aW1lX21zX2F2ZXJhZ2UrIiBtcyIsdEk6YS5RRX0pO2hSLmZvckVhY2goZnVuY3Rpb24oZCl7YS5BZi5wdXNoKHt0eXBlOiJsaXN0Iix0aXRsZTpkLnRpdGxlLFVoOlsiKFx1MDNjMyA9ICAiK2pSKGEsZC5IaSkrIiBtcykiXSx2YWx1ZTpqUihhLGQuT2gpKyIgbXMifSl9KTthLkFmLnB1c2goe3RpdGxlOiJURiBPcCBQbGFjZW1lbnQiLAp0b29sdGlwOmEud1IsZ2U6WyJIb3N0OiAiKyhiLmhvc3RfdGZfb3BfcGVyY2VudHx8IiIpLCJEZXZpY2U6ICIrKGIuZGV2aWNlX3RmX29wX3BlcmNlbnR8fCIiKV19KTthLkFmLnB1c2goe3RpdGxlOiJPcCBUaW1lIFNwZW50IG9uIEVhZ2VyIEV4ZWN1dGlvbiIsVWg6WyJsb3dlciBpcyBiZXR0ZXIiXSx0b29sdGlwOmEuRlEsZ2U6WyJIb3N0OiAiKyhiLmhvc3Rfb3BfdGltZV9lYWdlcl9wZXJjZW50fHwiIiksIkRldmljZTogIisoYi5kZXZpY2Vfb3BfdGltZV9lYWdlcl9wZXJjZW50fHwiIildfSk7YS5BZi5wdXNoKHt0aXRsZToiRGV2aWNlIENvbXB1dGUgUHJlY2lzaW9ucyIsVWg6WyJvdXQgb2YgVG90YWwgRGV2aWNlIFRpbWUiXSxnZTpbIjE2LWJpdDogIisoYi5kZXZpY2VfY29tcHV0ZV8xNmJpdF9wZXJjZW50fHwiIiksIjMyLWJpdDogIisoYi5kZXZpY2VfY29tcHV0ZV8zMmJpdF9wZXJjZW50fHwiIildfSl9O3ZhciBsUj1mdW5jdGlvbigpe307dmFyIG1SPWZ1bmN0aW9uKCl7dGhpcy50aXRsZT0iUmVjb21tZW5kYXRpb24gZm9yIE5leHQgU3RlcCI7dGhpcy54ej1bXTt0aGlzLmhJPVtdfTttUi5wcm90b3R5cGUuU2E9ZnVuY3Rpb24oKXt0aGlzLiRHKCk7dGhpcy5hSCgpfTttUi5wcm90b3R5cGUuJEc9ZnVuY3Rpb24oKXt9O21SLnByb3RvdHlwZS5hSD1mdW5jdGlvbigpe307bVIucHJvdG90eXBlLlNHPWZ1bmN0aW9uKCl7fTt2YXIgblI9W3tpZDoiZWFnZXJfc3RhdGVtZW50X2h0bWwifSx7aWQ6InRmX2Z1bmN0aW9uX3N0YXRlbWVudF9odG1sIn0se2lkOiJzdGF0ZW1lbnQifSx7aWQ6Imtlcm5lbF9sYXVuY2hfc3RhdGVtZW50In0se2lkOiJhbGxfb3RoZXJfc3RhdGVtZW50In0se2lkOiJwcmVjaXNpb25fc3RhdGVtZW50In1dLG9SPWZ1bmN0aW9uKGEpe21SLmNhbGwodGhpcyk7dGhpcy5zdG9yZT1hfTt0KG9SLG1SKTsKdmFyIHBSPWZ1bmN0aW9uKGEsYil7dmFyIGM9dm9pZCAwPT09Yz8iIjpjO2E9KGEuZXB8fHt9KS5wfHx7fTtzd2l0Y2goYil7Y2FzZSAiYm90dGxlbmVjayI6cmV0dXJuIGEuYm90dGxlbmVja3x8YztjYXNlICJlYWdlcl9zdGF0ZW1lbnRfaHRtbCI6cmV0dXJuIGEuZWFnZXJfc3RhdGVtZW50X2h0bWx8fGM7Y2FzZSAidGZfZnVuY3Rpb25fc3RhdGVtZW50X2h0bWwiOnJldHVybiBhLnRmX2Z1bmN0aW9uX3N0YXRlbWVudF9odG1sfHxjO2Nhc2UgInN0YXRlbWVudCI6cmV0dXJuIGEuc3RhdGVtZW50fHxjO2Nhc2UgImtlcm5lbF9sYXVuY2hfc3RhdGVtZW50IjpyZXR1cm4gYS5rZXJuZWxfbGF1bmNoX3N0YXRlbWVudHx8YztjYXNlICJhbGxfb3RoZXJfc3RhdGVtZW50IjpyZXR1cm4gYS5hbGxfb3RoZXJfc3RhdGVtZW50fHxjO2Nhc2UgInByZWNpc2lvbl9zdGF0ZW1lbnQiOnJldHVybiBhLnByZWNpc2lvbl9zdGF0ZW1lbnR8fGN9cmV0dXJuIGN9OwpvUi5wcm90b3R5cGUuJEc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMueHo9W107blIuZm9yRWFjaChmdW5jdGlvbihiKXsoYj1wUihhLGIuaWQpKSYmYS54ei5wdXNoKHt2YWx1ZTpifSl9KX07Cm9SLnByb3RvdHlwZS5hSD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZXB8fHt9LGI9W10sYz1bXSxkPVtdLGU9W107YS5yb3dzPWEucm93c3x8W107YS5yb3dzLmZvckVhY2goZnVuY3Rpb24oZil7aWYoZi5jJiZmLmNbMF0mJmYuY1swXS52JiZmLmNbMV0mJmYuY1sxXS52KXN3aXRjaChmLmNbMF0udil7Y2FzZSAiaG9zdCI6Yi5wdXNoKEdKKFN0cmluZyhmLmNbMV0udikpKTticmVhaztjYXNlICJkZXZpY2UiOmMucHVzaChHSihTdHJpbmcoZi5jWzFdLnYpKSk7YnJlYWs7Y2FzZSAiZG9jIjpkLnB1c2goU3RyaW5nKGYuY1sxXS52KSk7YnJlYWs7Y2FzZSAiZmFxIjplLnB1c2goU3RyaW5nKGYuY1sxXS52KSl9fSk7YT1wUih0aGlzLCJib3R0bGVuZWNrIik7ImRldmljZSI9PT1hP2IubGVuZ3RoPTA6Imhvc3QiPT09YSYmKGMubGVuZ3RoPTApO3RoaXMuaEk9W3t0aXRsZToiVG9vbCB0cm91Ymxlc2hvb3RpbmcgLyBGQVEiLHZtOmV9LHt0aXRsZToiTmV4dCB0b29scyB0byB1c2UgZm9yIHJlZHVjaW5nIHRoZSBpbnB1dCB0aW1lIiwKdm06YixPejohMH0se3RpdGxlOiJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIERldmljZSB0aW1lIix2bTpjLE96OiEwfSx7dGl0bGU6Ik90aGVyIHVzZWZ1bCByZXNvdXJjZXMiLHZtOmR9XS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIDA8Zi52bS5sZW5ndGh9KX07b1IucHJvdG90eXBlLlNHPWZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiYiQSI9PT1hLnRhcmdldC50YWdOYW1lJiYoYT1hLnRhcmdldC5pbm5lclRleHQsR0ooYSk9PT0iPGE+Iisodm9pZCAwPT09YT8iIjphKSsiPC9hPiImJnRoaXMuc3RvcmUueGEoZkooe2pzOmF9KSkpfTt2YXIgcVI9ZnVuY3Rpb24oKXt9O3ZhciByUj1mdW5jdGlvbigpe3RoaXMudGl0bGU9IlJ1biBFbnZpcm9ubWVudCI7dGhpcy5VRj10aGlzLmRldmljZVR5cGU9dGhpcy5xRj0iIn07ay5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhyUi5wcm90b3R5cGUse3J1bkVudmlyb25tZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxzZXQ6ZnVuY3Rpb24oYSl7YT1hfHx7fTthLnA9YS5wfHx7fTt0aGlzLnFGPWEucC5kZXZpY2VfY29yZV9jb3VudHx8IiI7dGhpcy5kZXZpY2VUeXBlPWEucC5kZXZpY2VfdHlwZXx8IiI7dGhpcy5VRj1hLnAuaG9zdF9jb3VudHx8IiJ9fX0pO3ZhciBzUj1mdW5jdGlvbigpe307dmFyIHRSPVsic3RlcG51bSIsImNvbXB1dGVUaW1lTXMiLCJpbnB1dFRpbWVNcyIsImlkbGVUaW1lTXMiLCJ0b29sdGlwIl0sdVI9InN0ZXBudW0gZGV2aWNlQ29tcHV0ZVRpbWVNcyBkZXZpY2VUb0RldmljZVRpbWVNcyBob3N0Q29tcHV0ZVRpbWVNcyBrZXJuZWxMYXVuY2hUaW1lTXMgaW5mZWVkVGltZU1zIG91dGZlZWRUaW1lTXMgY29tcGlsZVRpbWVNcyBvdGhlclRpbWVNcyB0b29sdGlwIi5zcGxpdCgiICIpLHZSPVsiZ3JlZW4iLCJjcmltc29uIiwiYmx1ZSJdLHdSPSIjOUNDQzY1ICNGRkVCM0IgIzY0QjVGNiAjRkY5ODAwICNCNzFDMUMgYmxhY2sgIzAwNjk1QyAjNUUzNUIxIi5zcGxpdCgiICIpLHhSPWZ1bmN0aW9uKCl7dGhpcy5xYj1udWxsO3RoaXMuYlA9dFI7dGhpcy5hUD12Ujt0aGlzLnRpdGxlPSJTdGVwLXRpbWUgR3JhcGgiO3RoaXMuaGVpZ2h0PTMwMDt0aGlzLndpZHRoPTA7dGhpcy5uYT1udWxsfTt4Ui5wcm90b3R5cGUuTGM9ZnVuY3Rpb24oKXt0aGlzLmphKCl9Owp4Ui5wcm90b3R5cGUuU2E9ZnVuY3Rpb24oKXt0aGlzLndpZHRoPTA7dGhpcy5MYSgpfTsKeFIucHJvdG90eXBlLkxhPWZ1bmN0aW9uKCl7aWYodGhpcy55Yyl7dmFyIGE9TWF0aC5taW4oODAwLHRoaXMueWMuaS5vZmZzZXRXaWR0aCk7aWYodGhpcy5uYSYmdGhpcy5xYiYmdGhpcy53aWR0aCE9PWEpe3RoaXMud2lkdGg9YTthPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUodGhpcy5xYik7dmFyIGI9dGhpcy5iUCxjPXRoaXMuYVA7dGhpcy5oZWlnaHQ9MzAwO3RoaXMucWIucD10aGlzLnFiLnB8fHt9OyJUUFUiIT09KHRoaXMucWIucC5oYXJkd2FyZV90eXBlfHwiVFBVIikmJihiPXVSLGM9d1IsdGhpcy5oZWlnaHQ9NDAwKTtmb3IodmFyIGQ9MDtkPGEuZ2V0TnVtYmVyT2ZDb2x1bW5zKCk7KWIuaW5jbHVkZXMoYS5nZXRDb2x1bW5JZChkKSk/ZCsrOmEucmVtb3ZlQ29sdW1uKGQpO2I9e3RpdGxlOiJTdGVwIFRpbWUgKGluIG1pbGxpc2Vjb25kcykiLHRpdGxlVGV4dFN0eWxlOntib2xkOiEwfSxoQXhpczp7dGl0bGU6IlN0ZXAgTnVtYmVyIixzaG93VGV4dEV2ZXJ5Ok1hdGgubWF4KDEsCk1hdGguZmxvb3IoYS5nZXROdW1iZXJPZlJvd3MoKS8xMCkpLHRleHRTdHlsZTp7Ym9sZDohMH19LHZBeGlzOntmb3JtYXQ6IiMjIy4jIyMjIixtaW5WYWx1ZTowLHRleHRTdHlsZTp7Ym9sZDohMH19LGNoYXJ0QXJlYTp7bGVmdDo1MCx3aWR0aDoiNjAlIn0sY29sb3JzOmMsaGVpZ2h0OnRoaXMuaGVpZ2h0LGlzU3RhY2tlZDohMH07dGhpcy5uYS5kcmF3KGEsYil9fX07eFIucHJvdG90eXBlLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pO2dvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soZnVuY3Rpb24oKXthLm5hPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5BcmVhQ2hhcnQoYS55Yy5pKTthLkxhKCl9KX07dmFyIHlSPWZ1bmN0aW9uKCl7fTt2YXIgelI9ZnVuY3Rpb24oKXt0aGlzLnFiPXRoaXMua2Y9bnVsbDt0aGlzLmVRPSEwO3RoaXMudGl0bGU9IlRvcCBUZW5zb3JGbG93IG9wZXJhdGlvbnMgb24gVFBVIjt0aGlzLnRhYmxlPW51bGx9O3pSLnByb3RvdHlwZS5MYz1mdW5jdGlvbigpe3RoaXMuamEoKX07elIucHJvdG90eXBlLlNhPWZ1bmN0aW9uKCl7dGhpcy5wYigpfTsKelIucHJvdG90eXBlLnBiPWZ1bmN0aW9uKCl7aWYodGhpcy50YWJsZSYmdGhpcy5rZiYmdGhpcy5xYil7dmFyIGE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSh0aGlzLmtmKTtpZighKDE+YS5nZXROdW1iZXJPZkNvbHVtbnMoKSkpe3RoaXMucWIucD10aGlzLnFiLnB8fHt9O3RoaXMudGl0bGU9IlRvcCAiK1N0cmluZyhhLmdldE51bWJlck9mUm93cygpKSsiIFRlbnNvckZsb3cgb3BlcmF0aW9ucyBvbiAiKyh0aGlzLnFiLnAuaGFyZHdhcmVfdHlwZXx8IlRQVSIpO2Zvcih2YXIgYj0wLGM9MCxkPTAsZT0wLGY9MCxnPTA7ZzxhLmdldE51bWJlck9mQ29sdW1ucygpO2crKylzd2l0Y2goYS5nZXRDb2x1bW5JZChnKSl7Y2FzZSAic2VsZlRpbWVQZXJjZW50IjpiPWc7YnJlYWs7Y2FzZSAiY3VtdWxhdGl2ZVRpbWVQZXJjZW50IjpjPWc7YnJlYWs7Y2FzZSAiY2F0ZWdvcnkiOmQ9ZzticmVhaztjYXNlICJvcGVyYXRpb24iOmU9ZzticmVhaztjYXNlICJmbG9wUmF0ZSI6Zj0KZ31nPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5OdW1iZXJGb3JtYXQoe3BhdHRlcm46IiMjLiMlIn0pO2cuZm9ybWF0KGEsYik7Zy5mb3JtYXQoYSxjKTsobmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7ZnJhY3Rpb25EaWdpdHM6MX0pKS5mb3JtYXQoYSxmKTthLnNldFByb3BlcnR5KDAsYiwic3R5bGUiLCJ3aWR0aDogMTAlIik7YS5zZXRQcm9wZXJ0eSgwLGMsInN0eWxlIiwid2lkdGg6IDEwJSIpO2Euc2V0UHJvcGVydHkoMCxkLCJzdHlsZSIsIndpZHRoOiAyMCUiKTthLnNldFByb3BlcnR5KDAsZSwic3R5bGUiLCJ3aWR0aDogNTAlIik7YS5zZXRQcm9wZXJ0eSgwLGYsInN0eWxlIiwiZGlzcGxheTogMTAlIik7IlRQVSIhPT0odGhpcy5xYi5wLmhhcmR3YXJlX3R5cGV8fCJUUFUiKSYmYS5yZW1vdmVDb2x1bW4oNCk7dGhpcy50YWJsZS5kcmF3KGEse3Nob3dSb3dOdW1iZXI6ITEsY3NzQ2xhc3NOYW1lczp7b2RkVGFibGVSb3c6Imdvb2dsZS1jaGFydC10YWJsZS1vZGQtdGFibGUtcm93IiwKaGVhZGVyQ2VsbDoiZ29vZ2xlLWNoYXJ0LXRhYmxlLWhlYWRlci1jZWxsIix0YWJsZUNlbGw6Imdvb2dsZS1jaGFydC10YWJsZS10YWJsZS1jZWxsIn0sd2lkdGg6IjEwMCUifSl9fX07elIucHJvdG90eXBlLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJ0YWJsZSJdfSk7Z29vZ2xlLmNoYXJ0cy5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe2EudGFibGU9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLlRhYmxlKGEuQmYuaSk7YS5wYigpfSl9O3ZhciBBUj1mdW5jdGlvbigpe307dmFyIEJSPWZ1bmN0aW9uKCl7fTt2YXIgQ1I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5vYj1iO3RoaXMuc3RvcmU9Yzt0aGlzLmRhdGE9bnVsbDt0aGlzLlBzPXRoaXMuaWk9MDt0aGlzLnd0PSIiO3RoaXMuZGlhZ25vc3RpY3M9e2luZm86W10sd2FybmluZ3M6W10sZXJyb3JzOltdfTt0aGlzLm1IPXpJO2EucGFyYW1zLnN1YnNjcmliZShmdW5jdGlvbihlKXtkLnVwZGF0ZShlKX0pfSxEUj1mdW5jdGlvbihhLGIpe2lmKGEuZGF0YSYmYS5kYXRhLnBvZFN0YXRzU2VxdWVuY2UmJmEuZGF0YS5wb2RTdGF0c1NlcXVlbmNlLnBvZFN0YXRzTWFwKXt2YXIgYz1hLmRhdGEucG9kU3RhdHNTZXF1ZW5jZS5wb2RTdGF0c01hcFtiLWEuaWldO2M/KGEud3Q9MDxiPj4wP2IudG9TdHJpbmcoKToiaW5jb21wbGV0ZSBzdGVwIixhLmFsbFJlZHVjZU9wRGI9KGMuYWxsUmVkdWNlT3BEYnx8W10pLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24oZCxlKXtyZXR1cm4oZC5kdXJhdGlvblVzfHwwKTwoZS5kdXJhdGlvblVzfHwwKT8KMTotMX0pLGEuR0U9YS5hbGxSZWR1Y2VPcERiLm1hcChmdW5jdGlvbihkKXt2YXIgZT1kLm5hbWV8fCIiO2U9ZS5yZXBsYWNlKC9sbC1yZWR1Y2UufHVzaW9uLnxsbC1yZWR1Y2V8dXNpb24vLCIiKTtlPWUucmVwbGFjZSgvYWxsLXRvLWFsbC58YWxsLXRvLWFsbC8sImwiKTtlPTE8ZS5sZW5ndGg/ZTplKyIwIjtyZXR1cm5bZSxkLmR1cmF0aW9uVXNdfSksYS5HRS51bnNoaWZ0KFsibmFtZSIsIkR1cmF0aW9uICh1cykiXSksYS5jaGFubmVsRGI9KGMuY2hhbm5lbERifHxbXSkuc29ydChmdW5jdGlvbihkLGUpe3JldHVybihkLmNoYW5uZWxJZHx8IjAiKT4oZS5jaGFubmVsSWR8fCIwIik/MTotMX0pLGEuRXg9KGMuY2hhbm5lbERifHxbXSkuc2xpY2UoMCkuc29ydChmdW5jdGlvbihkLGUpe3JldHVybihkLmR1cmF0aW9uVXN8fDApPChlLmR1cmF0aW9uVXN8fDApPzE6LTF9KSxhLlhFPWEuRXgubWFwKGZ1bmN0aW9uKGQpe3JldHVybltkLmNoYW5uZWxJZCxkLmR1cmF0aW9uVXNdfSksCmEuWEUudW5zaGlmdChbImNoYW5uZWxJZCIsIkR1cmF0aW9uICh1cykiXSksYS5jb3JlSWRUb1JlcGxpY2FJZE1hcD1jLmNvcmVJZFRvUmVwbGljYUlkTWFwfHx7fSxhLnBvZFN0YXRzUGVyQ29yZT1jLnBvZFN0YXRzUGVyQ29yZSxhLnBvZFN0YXRzUGVyQ29yZSYmT2JqZWN0LnZhbHVlcyhhLnBvZFN0YXRzUGVyQ29yZSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1kLnRvdGFsRHVyYXRpb25Vc3x8MDthLm1ILmZvckVhY2goZnVuY3Rpb24oZil7Imxvd0Zsb3BzQ29tcHV0ZVVzIiE9PWYua2V5JiYoZS09RkooZCxmLmtleSkpfSk7ZC5sb3dGbG9wc0NvbXB1dGVVcz1lfSksYS5kdD1PYmplY3QudmFsdWVzKGEucG9kU3RhdHNQZXJDb3JlfHx7fSkubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBkfSksYS5kdC5zb3J0KGZ1bmN0aW9uKGQsZSl7cmV0dXJuIGQuY2hpcElkPT09ZS5jaGlwSWQ/KGQubm9kZUlkfHwwKT4oZS5ub2RlSWR8fDApPzE6LTE6KGQuY2hpcElkfHwwKT4oZS5jaGlwSWR8fAowKT8xOi0xfSksYS5sSD1hLmR0Lm1hcChmdW5jdGlvbihkKXtyZXR1cm5bIigiKyhkLmNoaXBJZHx8MCkudG9TdHJpbmcoKSsiLCIrKGQubm9kZUlkfHwwKS50b1N0cmluZygpKyIpIixkLmhpZ2hGbG9wc0NvbXB1dGVVc3x8MCxkLmxvd0Zsb3BzQ29tcHV0ZVVzfHwwLGQuaG9zdEluZmVlZER1cmF0aW9uVXN8fDAsZC5ob3N0T3V0ZmVlZER1cmF0aW9uVXN8fDAsZC5hbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25Vc3x8MCxkLmFsbFJlZHVjZVN5bmNEdXJhdGlvblVzfHwwLGQuc2VuZER1cmF0aW9uVXN8fDAsZC5yZWN2RHVyYXRpb25Vc3x8MF19KSxiPXpJLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5sYWJlbH0pLGIudW5zaGlmdCgibWV0cmljcyIpLGEubEgudW5zaGlmdChiKSk6KGEud3Q9IiIsYS5jaGFubmVsRGI9dm9pZCAwLGEucG9kU3RhdHNQZXJDb3JlPXZvaWQgMCl9ZWxzZSBhLnd0PSIiLGEuY2hhbm5lbERiPXZvaWQgMCxhLnBvZFN0YXRzUGVyQ29yZT12b2lkIDB9OwpDUi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5zdG9yZS54YShlSih7RGI6e3phOiEwLG1lc3NhZ2U6IkxvYWRpbmcgZGF0YSJ9fSkpO3RoaXMub2IuZ2V0RGF0YShhLmdhfHwiIiwicG9kX3ZpZXdlciIsYS5ob3N0fHwiIikuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2Iuc3RvcmUueGEoZUooe0RiOnt6YTohMSxtZXNzYWdlOiIifX0pKTtiLmRhdGE9YzsoYz1iLmRhdGEpJiZjLmRpYWdub3N0aWNzJiYoYi5kaWFnbm9zdGljcy5pbmZvPWMuZGlhZ25vc3RpY3MuaW5mb3x8W10sYi5kaWFnbm9zdGljcy53YXJuaW5ncz1jLmRpYWdub3N0aWNzLndhcm5pbmdzfHxbXSxiLmRpYWdub3N0aWNzLmVycm9ycz1jLmRpYWdub3N0aWNzLmVycm9yc3x8W10pO2IuaWk9MDtiLlBzPTA7Yi5kYXRhJiZiLmRhdGEucG9kU3RhdHNTZXF1ZW5jZSYmYi5kYXRhLnBvZFN0YXRzU2VxdWVuY2UucG9kU3RhdHNNYXAmJihjPWIuZGF0YS5wb2RTdGF0c1NlcXVlbmNlLnBvZFN0YXRzTWFwWzBdKSYmCihiLmlpPWMuc3RlcE51bXx8MCxiLlBzPU1hdGgubWF4KGIuaWksYi5paStiLmRhdGEucG9kU3RhdHNTZXF1ZW5jZS5wb2RTdGF0c01hcC5sZW5ndGgtMSkpO0RSKGIsYi5paSk7Yi5ydW5FbnZpcm9ubWVudD1iLmRhdGE/Yi5kYXRhLnJ1bkVudmlyb25tZW50OnZvaWQgMH0pfTt2YXIgRVI9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPW5ldyByazt0aGlzLm5hPW51bGw7dGhpcy5GeD01MDB9O0VSLnByb3RvdHlwZS5PYj1mdW5jdGlvbigpe3RoaXMuamEoKX07RVIucHJvdG90eXBlLlNhPWZ1bmN0aW9uKCl7dGhpcy5MYSgpfTsKRVIucHJvdG90eXBlLkxhPWZ1bmN0aW9uKCl7aWYodGhpcy5uYSYmdGhpcy5kYXRhKXt0aGlzLkZ4PU1hdGgubWF4KDUwMCw1MCp0aGlzLmRhdGEubGVuZ3RoKTt2YXIgYT13aW5kb3cuZ29vZ2xlLnZpc3VhbGl6YXRpb24uYXJyYXlUb0RhdGFUYWJsZSh0aGlzLmRhdGEpO3RoaXMubmEuZHJhdyhhLHtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixjaGFydEFyZWE6e2xlZnQ6NTAscmlnaHQ6MjAsdG9wOjUwLGJvdHRvbToyMH0sZm9jdXNUYXJnZXQ6ImNhdGVnb3J5Iixpc1N0YWNrZWQ6ITAsbGVnZW5kOntwb3NpdGlvbjoidG9wIixtYXhMaW5lczozLHRleHRTdHlsZTp7Zm9udFNpemU6MTJ9fSxoQXhpczp7dGV4dFN0eWxlOntmb250U2l6ZToxMn19LHZBeGlzOnt0ZXh0U3R5bGU6e2ZvbnRTaXplOjEyfX0sb3JpZW50YXRpb246Imhvcml6b250YWwiLHRvb2x0aXA6e3RyaWdnZXI6Im5vbmUifSx3aWR0aDp0aGlzLkZ4fSl9fTsKRVIucHJvdG90eXBlLmphPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztnb29nbGUmJmdvb2dsZS5jaGFydHN8fHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmphKCl9LDEwMCk7Z29vZ2xlLmNoYXJ0cy5sb2FkKCJjdXJyZW50Iix7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pO2dvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soZnVuY3Rpb24oKXthLm5hPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5CYXJDaGFydChhLnljLmkpO2dvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihhLm5hLCJvbm1vdXNlb3ZlciIsZnVuY3Rpb24oYil7Yj1ifHx7fTthLnNlbGVjdGVkLmVtaXQoYi5yb3d8fDApfSk7YS5MYSgpfSl9O3ZhciBGUj1mdW5jdGlvbigpe307dmFyIEdSPSIjZmZmZmQ5ICNlZGY4YjEgI2M3ZTliNCAjN2ZjZGJiICM0MWI2YzQgIzFkOTFjMCAjMjI1ZWE4ICMyNTM0OTQgIzA4MWQ1OCIuc3BsaXQoIiAiKSxJUj1mdW5jdGlvbihhKXt0aGlzLndQPWE7dGhpcy5zZWxlY3RlZD1uZXcgcms7dGhpcy5GZT1bXTt0aGlzLmxhYmVscz1bXTt0aGlzLmo9W107dGhpcy5hRj1bXTt0aGlzLmNoYW5uZWxzPVtdO3RoaXMucHg9W107dGhpcy50cHVUeXBlPSIiO3RoaXMuTWo9dGhpcy4kbD10aGlzLm1mPXRoaXMuZHM9dGhpcy5icz10aGlzLnlEaW1lbnNpb249dGhpcy54RGltZW5zaW9uPTA7dGhpcy5uZj10aGlzLktjPTE7dGhpcy5Oaj0wO3RoaXMuUW89Mjt0aGlzLnFwPXRoaXMucHA9IiI7dGhpcy5ybT10aGlzLnNrPXRoaXMueHk9dGhpcy5jeT10aGlzLmNoYW5uZWxDb3VudD0wO3RoaXMuc2E9IiI7dGhpcy5sST10aGlzLmtJPTA7SFIodGhpcyl9O0lSLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMudXBkYXRlKCl9Owp2YXIgSFI9ZnVuY3Rpb24oYSl7dmFyIGI9R1IubGVuZ3RoO2EuYUY9R1IubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJue2NvbG9yOmMsbGFiZWw6KGQvYikudG9GaXhlZCgxKX19KX0sSlI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTYrYS5NaisxKzUsZT0xNiphLlFvKzk7dmFyIGY9MzQrKDYrYS5OaisxKzUpKk1hdGguZmxvb3IoYiUoYS5tZiphLktjKS9hLktjKTtmPWYrMTErYiVhLktjKmU7ZD0yOCtkKk1hdGguZmxvb3IoTWF0aC5mbG9vcihiLyhhLm1mKmEuS2MpKS9hLm5mKTtkPWQrMTErTWF0aC5mbG9vcihiLyhhLm1mKmEuS2MpKSVhLm5mKjQwO3JldHVybnt4OmYrKDQrMTYqYykseTpkKzR9fSxLUj1mdW5jdGlvbihhKXthLnB4PVtdO2lmKGEucnVuRW52aXJvbm1lbnQmJmEucnVuRW52aXJvbm1lbnQudG9wb2xvZ3kmJmEucG9kU3RhdHNQZXJDb3JlJiZhLmNoYW5uZWxEYil7dmFyIGI9YS5jaGFubmVsRGJbYS5za107aWYoYiYmYi5zcmNDb3JlSWRzJiZiLmRzdENvcmVJZHMpZm9yKHZhciBjPQpNYXRoLm1pbihiLnNyY0NvcmVJZHMubGVuZ3RoLGIuZHN0Q29yZUlkcy5sZW5ndGgpLGQ9MDtkPGM7ZCsrKXt2YXIgZT1iLnNyY0NvcmVJZHNbZF18fDAsZj1iLmRzdENvcmVJZHNbZF18fDA7ZT1KUihhLE1hdGguZmxvb3IoZS8yKSxlJjEpO2Y9SlIoYSxNYXRoLmZsb29yKGYvMiksZiYxKTt2YXIgZz1lLngtZi54LGw9ZS55LWYueTthLnB4LnB1c2goe3g6Zi54KzErNy41LHk6Zi55KzErMTUsc2NhbGU6TWF0aC5zcXJ0KGcqZytsKmwpLzEwMCxyb3RhdGU6TWF0aC5hdGFuMihmLnktZS55LGYueC1lLngpfSl9fX0sTFI9ZnVuY3Rpb24oYSl7YS5ydW5FbnZpcm9ubWVudCYmYS5ydW5FbnZpcm9ubWVudC50b3BvbG9neSYmYS5wb2RTdGF0c1BlckNvcmUmJmEuY2hhbm5lbERiPyhhLmNoYW5uZWxzPWEuY2hhbm5lbERiLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gTnVtYmVyKGIuY2hhbm5lbElkfHwwKX0pLGEuY2hhbm5lbENvdW50PWEuY2hhbm5lbERiLmxlbmd0aC0xLGEuY3k9YS5jaGFubmVsc1swXSwKYS54eT1hLmNoYW5uZWxzW2EuY2hhbm5lbENvdW50XSxhLnNrPTAsYS5ybT1hLmNoYW5uZWxzWzBdLEtSKGEpLGEuc2VsZWN0ZWQuZW1pdCgwKSk6KGEuY2hhbm5lbENvdW50PTAsYS5jeT0wLGEueHk9MCxhLnNrPTAsYS5ybT0wKX07SVIucHJvdG90eXBlLkp0PWZ1bmN0aW9uKCl7dGhpcy5GZT1bXTtpZih0aGlzLnJ1bkVudmlyb25tZW50JiZ0aGlzLnJ1bkVudmlyb25tZW50LnRvcG9sb2d5KWZvcih2YXIgYT02K3RoaXMuTmorMSs1LGI9Nit0aGlzLk1qKzErNSxjPTA7Yzx0aGlzLiRsO2MrKylmb3IodmFyIGQ9MDtkPHRoaXMubWY7ZCsrKXRoaXMuRmUucHVzaCh7eDozOSthKmQseTozMytiKmN9KX07CnZhciBNUj1mdW5jdGlvbihhKXthLmo9W107YS5ydW5FbnZpcm9ubWVudCYmYS5ydW5FbnZpcm9ubWVudC50b3BvbG9neSYmYS5wb2RTdGF0c1BlckNvcmUmJk9iamVjdC52YWx1ZXMoYS5wb2RTdGF0c1BlckNvcmUpLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGM9Yi5jaGlwSWR8fDA7Yj1iLm5vZGVJZHx8MDt2YXIgZD1KUihhLGMsYik7ZC5pZD0ibm9kZS0iK2MudG9TdHJpbmcoKSsiLSIrYi50b1N0cmluZygpO2Euai5wdXNoKGQpfSl9LE5SPWZ1bmN0aW9uKGEsYixjKXtiJiZjPyhhLnBwPWIsYS5xcD0iQ29sb3I6ICIrYyxhLnBvZFN0YXRzUGVyQ29yZSYmT2JqZWN0LnZhbHVlcyhhLnBvZFN0YXRzUGVyQ29yZSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1hLndQLmkucXVlcnlTZWxlY3RvcigiI25vZGUtIisoKGQuY2hpcElkfHwwKS50b1N0cmluZygpKyItIisoZC5ub2RlSWR8fDApLnRvU3RyaW5nKCkpKTtpZihlKXt2YXIgZj1GSihkLGIpO2Y9ZC50b3RhbER1cmF0aW9uVXM/CmYvZC50b3RhbER1cmF0aW9uVXM6MDtkPU1hdGguZmxvb3IoKGZ8fDApKkdSLmxlbmd0aCk7ZD1NYXRoLm1pbihkLEdSLmxlbmd0aC0xKTtlLnN0eWxlLmJhY2tncm91bmRDb2xvcj1HUltkXX19KSk6KGEucHA9IiIsYS5xcD0iUGxlYXNlIHNlbGVjdCBhIG1ldHJpYyIpfSxPUj1mdW5jdGlvbihhLGIpe2Euc2E9IiI7dmFyIGM9bnVsbCxkPSIiO2lmKChjPU9iamVjdC5lbnRyaWVzKGEucG9kU3RhdHNQZXJDb3JlfHx7fSkuZmluZChmdW5jdGlvbihnKXtnPW4oZyk7Zy5uZXh0KCk7Zz1nLm5leHQoKS52YWx1ZTtyZXR1cm4gYj09PSJub2RlLSIrKGcuY2hpcElkfHwwKS50b1N0cmluZygpKyItIisoZy5ub2RlSWR8fDApLnRvU3RyaW5nKCl9KSkmJjI9PWMubGVuZ3RoJiYoZD1jWzBdLGM9Y1sxXSkpe3ZhciBlPWMuY2hpcElkfHwwLGY9Yy5ub2RlSWR8fDA7YS5zYSs9InBvczogKCI7YS5zYSs9KGUlKGEubWYqYS5LYykpLnRvU3RyaW5nKCk7YS5zYSs9IiwiO2Euc2ErPU1hdGguZmxvb3IoZS8KKGEubWYqYS5LYykpLnRvU3RyaW5nKCk7YS5zYSs9IilcbiI7YS5zYSs9Imhvc3Q6ICIrKGMuaG9zdE5hbWV8fCIiKSsiXG4iO2Euc2ErPSJjaGlwIGlkOiAiK2UudG9TdHJpbmcoKSsiXG4iO2Euc2ErPSJub2RlIGlkOiAiK2YudG9TdHJpbmcoKSsiXG4iO2EuY29yZUlkVG9SZXBsaWNhSWRNYXAmJnZvaWQgMCE9PWEuY29yZUlkVG9SZXBsaWNhSWRNYXBbZF0mJihhLnNhKz0icmVwbGljYSBpZDogIithLmNvcmVJZFRvUmVwbGljYUlkTWFwW2RdLnRvU3RyaW5nKCkrIlxuIik7YS5wcCYmYS5xcCYmKGQ9RkooYyxhLnBwKSxhLnNhKz1hLnFwLnJlcGxhY2UoIkNvbG9yOiAiLCIiKSxhLnNhKz0iIHNwZW5kcyAiLGEuc2ErPWQudG9GaXhlZCgyKSxhLnNhKz0idXMgaW4gdG90YWwsICIsYS5zYSs9InRha2luZyAiLGEuc2ErPWMudG90YWxEdXJhdGlvblVzPygxMDAqZC9jLnRvdGFsRHVyYXRpb25VcykudG9GaXhlZCgyKToiMC4wMCIsYS5zYSs9IiUgb2YgYSBzdGVwLiIpO2M9SlIoYSxlLApmKTthLmtJPWMueCsyMDthLmxJPWMueSszNX19LFBSPWZ1bmN0aW9uKGEsYil7YS5zaz1iO2Eucm09YS5jaGFubmVsc1tiXTtLUihhKTthLnNlbGVjdGVkLmVtaXQoYnx8MCl9OwpJUi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7aWYodGhpcy5ydW5FbnZpcm9ubWVudCl7dGhpcy50cHVUeXBlPXRoaXMucnVuRW52aXJvbm1lbnQudHB1VHlwZXx8IiI7c3dpdGNoKHRoaXMucnVuRW52aXJvbm1lbnQudHB1VHlwZSl7Y2FzZSAiSmVsbHlGaXNoIjpjYXNlICJUUFUgdjIiOnRoaXMuUW89dGhpcy5uZj10aGlzLktjPTI7YnJlYWs7Y2FzZSAiRHJhZ29uRmlzaCI6Y2FzZSAiVFBVIHYzIjp0aGlzLktjPTQ7dGhpcy5Rbz10aGlzLm5mPTI7YnJlYWs7ZGVmYXVsdDp0aGlzLm5mPXRoaXMuS2M9MSx0aGlzLlFvPTIsY29uc29sZS53YXJuKCJUUFUgdHlwZTogIix2b2lkIDAsImlzIG5vdCBzdXBwb3J0ZWQgYnkgcG9kIHZpZXdlci4iKX1pZih0aGlzLnJ1bkVudmlyb25tZW50LnRvcG9sb2d5KXt0aGlzLnhEaW1lbnNpb249eEoodGhpcy5ydW5FbnZpcm9ubWVudC50b3BvbG9neS54RGltZW5zaW9uKTt0aGlzLnlEaW1lbnNpb249eEoodGhpcy5ydW5FbnZpcm9ubWVudC50b3BvbG9neS55RGltZW5zaW9uKTsKdGhpcy5Oaj0oMTYqdGhpcy5Rbys5KSp0aGlzLktjKzEwO3RoaXMuTWo9NDAqdGhpcy5uZisxMDt2YXIgYT02K3RoaXMuTmorNSsxLGI9Nit0aGlzLk1qKzUrMTt0aGlzLm1mPU1hdGguZmxvb3IodGhpcy54RGltZW5zaW9uL3RoaXMuS2MpOzAhPT10aGlzLnhEaW1lbnNpb24ldGhpcy5LYyYmdGhpcy5tZisrO3RoaXMuZHM9YSp0aGlzLm1mKzM4O3RoaXMuJGw9TWF0aC5mbG9vcih0aGlzLnlEaW1lbnNpb24vdGhpcy5uZik7MCE9PXRoaXMueURpbWVuc2lvbiV0aGlzLm5mJiZ0aGlzLiRsKys7dGhpcy5icz1iKnRoaXMuJGwrMzJ9ZWxzZSB0aGlzLk1qPXRoaXMuTmo9dGhpcy4kbD10aGlzLm1mPXRoaXMuYnM9dGhpcy5kcz10aGlzLnlEaW1lbnNpb249dGhpcy54RGltZW5zaW9uPTB9ZWxzZSB0aGlzLnRwdVR5cGU9IiIsdGhpcy5Naj10aGlzLk5qPXRoaXMuJGw9dGhpcy5tZj10aGlzLmJzPXRoaXMuZHM9dGhpcy55RGltZW5zaW9uPXRoaXMueERpbWVuc2lvbj0wO3RoaXMubGFiZWxzPQpbXTtpZih0aGlzLnJ1bkVudmlyb25tZW50JiZ0aGlzLnJ1bkVudmlyb25tZW50LnRvcG9sb2d5KXthPTM0O2I9MTY7Zm9yKHZhciBjPTA7Yzx0aGlzLnhEaW1lbnNpb247YysrKTA9PT1jJXRoaXMuS2MmJihhKz0xMSksYSs9MjAsdGhpcy5sYWJlbHMucHVzaCh7aWQ6Yy50b1N0cmluZygpLHg6YSx5OmJ9KSxhKz0yMSxjJXRoaXMuS2M9PT10aGlzLktjLTEmJihhKz0xMSk7YT0xOTtiPTI4O2ZvcihjPTA7Yzx0aGlzLnlEaW1lbnNpb247YysrKTA9PT1jJXRoaXMubmYmJihiKz0xMSksYis9MjAsdGhpcy5sYWJlbHMucHVzaCh7aWQ6Yy50b1N0cmluZygpLHg6YSx5OmJ9KSxiKz0yMCxjJXRoaXMubmY9PT10aGlzLm5mLTEmJihiKz0xMSl9dGhpcy5KdCgpO01SKHRoaXMpO05SKHRoaXMsIiIsIiIpO0xSKHRoaXMpfTt2YXIgUVI9ZnVuY3Rpb24oKXt9O3ZhciBSUj1mdW5jdGlvbigpe307dmFyIFNSPWZ1bmN0aW9uKCl7fTt2YXIgVFI9ZnVuY3Rpb24oKXt9O3ZhciBVUj1mdW5jdGlvbigpe307dmFyIFZSPWZ1bmN0aW9uKCl7fTt2YXIgV1I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5vYj1iO3RoaXMuc3RvcmU9Yzt0aGlzLk9jPXRoaXMuZGF0YT1udWxsO3RoaXMuaG9zdD10aGlzLmdhPSIiO3RoaXMuR3M9Ik5vIjt0aGlzLiRQPVsiWWVzIiwiTm8iXTt0aGlzLlN5PSJEZXZpY2UiO3RoaXMuVHk9Ikhvc3QiO3RoaXMuVEc9Ik5hbWUiO3RoaXMuVUc9IlR5cGUiO3RoaXMud3A9dGhpcy5hcmNoaXRlY3R1cmU9IiI7dGhpcy5ybz0hMDt0aGlzLkxqPSExO2EucGFyYW1zLnN1YnNjcmliZShmdW5jdGlvbihlKXtkLkdzPSJObyI7ZC51cGRhdGUoZSl9KX07V1IucHJvdG90eXBlLlZsPWZ1bmN0aW9uKCl7dGhpcy5vYi5WbCh0aGlzLmdhLCJ0ZW5zb3JmbG93X3N0YXRzIix0aGlzLmhvc3QpfTsKdmFyIFlSPWZ1bmN0aW9uKGEsYil7Yj12b2lkIDA9PT1iPyJObyI6YjthLkdzPWI7YS5kYXRhPyhhLk9jPSJZZXMiPT09Yj9hLmRhdGFbMF18fG51bGw6YS5kYXRhWzFdfHxudWxsLGEuT2MmJmEuT2MucCYmKGEuYXJjaGl0ZWN0dXJlPWEuT2MucC5hcmNoaXRlY3R1cmVfdHlwZXx8IiIsYS53cD1hLk9jLnAudGFza190eXBlfHwiIiksYS5Maj0hMSxhLk9jJiZhLk9jLnJvd3MmJihhLkxqPSEhYS5PYy5yb3dzLmZpbmQoZnVuY3Rpb24oYyl7cmV0dXJuIGMmJmMuYyYmYy5jWzFdJiYiRGV2aWNlIj09PWMuY1sxXS52fSkpKTphLk9jPW51bGx9OwpXUi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5nYT1hLmdhfHwiIjt0aGlzLmhvc3Q9YS5ob3N0fHwiIjt0aGlzLnN0b3JlLnhhKGVKKHtEYjp7emE6ITAsbWVzc2FnZToiTG9hZGluZyBkYXRhIn19KSk7dGhpcy5vYi5nZXREYXRhKHRoaXMuZ2EsInRlbnNvcmZsb3dfc3RhdHMiLHRoaXMuaG9zdCkuc3Vic2NyaWJlKGZ1bmN0aW9uKGMpe2Iuc3RvcmUueGEoZUooe0RiOnt6YTohMSxtZXNzYWdlOiIifX0pKTtiLmRhdGE9Y3x8W107WVIoYil9KX07dmFyIFpSPWZ1bmN0aW9uKCl7fTt2YXIgJFI9ZnVuY3Rpb24oKXt9O3ZhciBhUz1mdW5jdGlvbigpe3RoaXMuamM9bnVsbDt0aGlzLkNkPSIiO3RoaXMudGFibGU9bnVsbDt0aGlzLnRpdGxlPSIifTthUy5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXt0aGlzLmphKCl9O2FTLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMucGIoKX07CmFTLnByb3RvdHlwZS5wYj1mdW5jdGlvbigpe2lmKHRoaXMudGFibGUmJnRoaXMuamMmJnRoaXMuQ2Qpe2lmKCJEZXZpY2UiPT09dGhpcy5DZClpZih0aGlzLnRhYmxlJiZ0aGlzLmpjJiYiRGV2aWNlIj09PXRoaXMuQ2Qpe3RoaXMudGl0bGU9IkRldmljZS1zaWRlIFRlbnNvckZsb3cgb3BlcmF0aW9ucyAoZ3JvdXBlZCBieSBUWVBFKSI7dmFyIGE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSh0aGlzLmpjKTthPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyhhKTthLnNldFJvd3MoYS5nZXRGaWx0ZXJlZFJvd3MoW3tjb2x1bW46MSx2YWx1ZToiRGV2aWNlIn1dKSk7YS5zZXRDb2x1bW5zKFsyLDQsNyw5XSk7YT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5ncm91cChhLFswXSxbe2NvbHVtbjoxLGFnZ3JlZ2F0aW9uOmdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuc3VtLHR5cGU6Im51bWJlciJ9LHtjb2x1bW46MixhZ2dyZWdhdGlvbjpnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLnN1bSwKdHlwZToibnVtYmVyIn0se2NvbHVtbjozLGFnZ3JlZ2F0aW9uOmdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuc3VtLHR5cGU6Im51bWJlciJ9XSk7YS5zb3J0KHtjb2x1bW46MixkZXNjOiEwfSk7KG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5OdW1iZXJGb3JtYXQoe2ZyYWN0aW9uRGlnaXRzOjB9KSkuZm9ybWF0KGEsMik7KG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5OdW1iZXJGb3JtYXQoe3BhdHRlcm46IiMjLiMlIn0pKS5mb3JtYXQoYSwzKTthPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyhhKTthLnNldENvbHVtbnMoWzAsMSwyLDNdKX1lbHNlIGE9bnVsbDtlbHNlIHRoaXMudGFibGUmJnRoaXMuamMmJiJIb3N0Ij09PXRoaXMuQ2Q/KHRoaXMudGl0bGU9Ikhvc3Qtc2lkZSBUZW5zb3JGbG93IG9wZXJhdGlvbnMgKGdyb3VwZWQgYnkgVFlQRSkiLGE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSh0aGlzLmpjKSxhPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyhhKSwKYS5zZXRSb3dzKGEuZ2V0RmlsdGVyZWRSb3dzKFt7Y29sdW1uOjEsdmFsdWU6Ikhvc3QifV0pKSxhLnNldENvbHVtbnMoWzIsNCw3LDExXSksYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5ncm91cChhLFswXSxbe2NvbHVtbjoxLGFnZ3JlZ2F0aW9uOmdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuc3VtLHR5cGU6Im51bWJlciJ9LHtjb2x1bW46MixhZ2dyZWdhdGlvbjpnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLnN1bSx0eXBlOiJudW1iZXIifSx7Y29sdW1uOjMsYWdncmVnYXRpb246Z29vZ2xlLnZpc3VhbGl6YXRpb24uZGF0YS5zdW0sdHlwZToibnVtYmVyIn1dKSxhLnNvcnQoe2NvbHVtbjoyLGRlc2M6ITB9KSwobmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7ZnJhY3Rpb25EaWdpdHM6MH0pKS5mb3JtYXQoYSwyKSwobmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7cGF0dGVybjoiIyMuIyUifSkpLmZvcm1hdChhLDMpLGE9Cm5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVmlldyhhKSk6YT1udWxsO2lmKGEpe3ZhciBiPXthbGxvd0h0bWw6ITAsYWx0ZXJuYXRpbmdSb3dTdHlsZTohMCxzaG93Um93TnVtYmVyOiExLHdpZHRoOiIxMDAlIixoZWlnaHQ6MjA+YS5nZXROdW1iZXJPZlJvd3MoKT8iIjoiNjAwcHgiLGNzc0NsYXNzTmFtZXM6e29kZFRhYmxlUm93OiJnb29nbGUtY2hhcnQtdGFibGUtb2RkLXRhYmxlLXJvdyIsaGVhZGVyQ2VsbDoiZ29vZ2xlLWNoYXJ0LXRhYmxlLWhlYWRlci1jZWxsIix0YWJsZUNlbGw6Imdvb2dsZS1jaGFydC10YWJsZS10YWJsZS1jZWxsIn19O3RoaXMudGFibGUuZHJhdyhhLGIpfX19OwphUy5wcm90b3R5cGUuamE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2dvb2dsZSYmZ29vZ2xlLmNoYXJ0c3x8c2V0VGltZW91dChmdW5jdGlvbigpe2EuamEoKX0sMTAwKTtnb29nbGUuY2hhcnRzLmxvYWQoImN1cnJlbnQiLHtwYWNrYWdlczpbInRhYmxlIl19KTtnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7YS50YWJsZT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uVGFibGUoYS5CZi5pKTthLnBiKCl9KX07dmFyIGJTPWZ1bmN0aW9uKCl7fTt2YXIgY1M9ZnVuY3Rpb24oKXt0aGlzLmpjPW51bGw7dGhpcy50aXRsZT10aGlzLmdtPXRoaXMuQ2Q9IiI7dGhpcy5uYT1udWxsfTtjUy5wcm90b3R5cGUuT2I9ZnVuY3Rpb24oKXt0aGlzLmphKCl9O2NTLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMuTGEoKX07CmNTLnByb3RvdHlwZS5MYT1mdW5jdGlvbigpe2lmKHRoaXMubmEmJnRoaXMuamMmJnRoaXMuQ2QmJnRoaXMuZ20pe3ZhciBhPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUodGhpcy5qYyksYj1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uTnVtYmVyRm9ybWF0KHtmcmFjdGlvbkRpZ2l0czowfSksYz1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVZpZXcoYSk7Yy5zZXRSb3dzKGMuZ2V0RmlsdGVyZWRSb3dzKFt7Y29sdW1uOjEsdmFsdWU6dGhpcy5DZH1dKSk7dGhpcy50aXRsZT0iT04gIitTdHJpbmcodGhpcy5DZCkudG9VcHBlckNhc2UoKSsiOiBUT1RBTCBTRUxGLVRJTUUiOyJUeXBlIj09PXRoaXMuZ20/KHRoaXMudGl0bGUrPSIgKEdST1VQRUQgQlkgVFlQRSkiLGE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLmRhdGEuZ3JvdXAoYyxbMl0sW3tjb2x1bW46NyxhZ2dyZWdhdGlvbjpnb29nbGUudmlzdWFsaXphdGlvbi5kYXRhLnN1bSx0eXBlOiJudW1iZXIifV0pLAphLnNvcnQoe2NvbHVtbjoxLGRlc2M6ITB9KSxiLmZvcm1hdChhLDEpLGM9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFWaWV3KGEpKTooYi5mb3JtYXQoYSw3KSxjLnNldENvbHVtbnMoWzMsN10pKTt0aGlzLm5hLmRyYXcoYyx7YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsd2lkdGg6NDAwLGhlaWdodDoyMDAsY2hhcnRBcmVhOntsZWZ0OjAsd2lkdGg6IjEwMCUiLGhlaWdodDoiODAlIn0sbGVnZW5kOnt0ZXh0U3R5bGU6e2ZvbnRTaXplOjEwfX0sc2xpY2VWaXNpYmlsaXR5VGhyZXNob2xkOi4wMX0pfX07CmNTLnByb3RvdHlwZS5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTtnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7YS5uYT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uUGllQ2hhcnQoYS55Yy5pKTthLkxhKCl9KX07dmFyIGRTPWZ1bmN0aW9uKCl7fTt2YXIgZVM9ZnVuY3Rpb24oKXt0aGlzLmpjPW51bGw7dGhpcy5Maj0hMTt0aGlzLmRhdGFUYWJsZT1udWxsO3RoaXMuTmc9dGhpcy5ycz10aGlzLm9zPSIiO3RoaXMuc29ydEFzY2VuZGluZz0hMDt0aGlzLnNvcnRDb2x1bW49LTE7dGhpcy50YWJsZT1udWxsO3RoaXMuR3Q9IiI7dGhpcy56YT0hMH07aD1lUy5wcm90b3R5cGU7aC5PYj1mdW5jdGlvbigpe3RoaXMuamEoKX07aC5TYT1mdW5jdGlvbigpe3RoaXMuZGF0YVRhYmxlPW51bGw7dGhpcy5wYigpfTsKaC4kbj1mdW5jdGlvbigpe2lmKHRoaXMudGFibGUmJnRoaXMuamMmJiF0aGlzLmRhdGFUYWJsZSl7dmFyIGE9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSh0aGlzLmpjKSxiPWEuZ2V0TnVtYmVyT2ZSb3dzKCk7dGhpcy5kYXRhVGFibGU9YS5jbG9uZSgpO3RoaXMuR3Q9IiI7MUUzPGImJih0aGlzLkd0PVN0cmluZyhiKSx0aGlzLmRhdGFUYWJsZS5yZW1vdmVSb3dzKDFFMyxiLTFFMykpO2E9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7ZnJhY3Rpb25EaWdpdHM6MH0pO2EuZm9ybWF0KHRoaXMuZGF0YVRhYmxlLDUpO2EuZm9ybWF0KHRoaXMuZGF0YVRhYmxlLDYpO2EuZm9ybWF0KHRoaXMuZGF0YVRhYmxlLDcpO2EuZm9ybWF0KHRoaXMuZGF0YVRhYmxlLDgpO2E9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7cGF0dGVybjoiIyMuIyUifSk7YS5mb3JtYXQodGhpcy5kYXRhVGFibGUsOSk7YS5mb3JtYXQodGhpcy5kYXRhVGFibGUsCjExKTt0aGlzLmRhdGFUYWJsZS5pbnNlcnRDb2x1bW4oMSwibnVtYmVyIiwiUmFuayIpfX07aC5wYj1mdW5jdGlvbigpe2lmKHRoaXMudGFibGUmJnRoaXMuamMpe3ZhciBhPXRoaXMucG8oKTthJiZ0aGlzLnRhYmxlLmRyYXcoYSx7YWxsb3dIdG1sOiEwLGFsdGVybmF0aW5nUm93U3R5bGU6ITAsc2hvd1Jvd051bWJlcjohMSx3aWR0aDoiMTAwJSIsaGVpZ2h0OiI2MDBweCIsY3NzQ2xhc3NOYW1lczp7b2RkVGFibGVSb3c6Imdvb2dsZS1jaGFydC10YWJsZS1vZGQtdGFibGUtcm93IixoZWFkZXJDZWxsOiJnb29nbGUtY2hhcnQtdGFibGUtaGVhZGVyLWNlbGwiLHRhYmxlQ2VsbDoiZ29vZ2xlLWNoYXJ0LXRhYmxlLXRhYmxlLWNlbGwifSxzb3J0OiJldmVudCIsc29ydEFzY2VuZGluZzp0aGlzLnNvcnRBc2NlbmRpbmcsc29ydENvbHVtbjp0aGlzLnNvcnRDb2x1bW59KX19OwpoLnBvPWZ1bmN0aW9uKCl7dGhpcy5kYXRhVGFibGV8fHRoaXMuJG4oKTt2YXIgYT10aGlzLnd6KCk7aWYoIWEpcmV0dXJuIG51bGw7YS5oaWRlQ29sdW1ucyhbMF0pO3JldHVybiBhfTsKaC5xbz1mdW5jdGlvbigpe2lmKCF0aGlzLmRhdGFUYWJsZSlyZXR1cm4gbnVsbDt2YXIgYT1bXTtpZih0aGlzLm9zLnRyaW0oKSl7dmFyIGI9dGhpcy5vcy50cmltKCkudG9Mb3dlckNhc2UoKTthLnB1c2goe2NvbHVtbjoyLHRlc3Q6ZnVuY3Rpb24oZil7cmV0dXJuIDA8PWYudG9Mb3dlckNhc2UoKS5pbmRleE9mKGIpfX0pfWlmKHRoaXMucnMudHJpbSgpKXt2YXIgYz10aGlzLnJzLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2EucHVzaCh7Y29sdW1uOjMsdGVzdDpmdW5jdGlvbihmKXtyZXR1cm4gMDw9Zi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoYyl9fSl9aWYodGhpcy5OZy50cmltKCkpe3ZhciBkPXRoaXMuTmcudHJpbSgpLnRvTG93ZXJDYXNlKCk7YS5wdXNoKHtjb2x1bW46NCx0ZXN0OmZ1bmN0aW9uKGYpe3JldHVybiAwPD1mLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihkKX19KX1pZigwPGEubGVuZ3RoKXt2YXIgZT1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVZpZXcodGhpcy5kYXRhVGFibGUpOwplLnNldFJvd3ModGhpcy5kYXRhVGFibGUuZ2V0RmlsdGVyZWRSb3dzKGEpKTtyZXR1cm4gZS50b0RhdGFUYWJsZSgpfXJldHVybiB0aGlzLmRhdGFUYWJsZX07aC5qYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7Z29vZ2xlJiZnb29nbGUuY2hhcnRzfHxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5qYSgpfSwxMDApO2dvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOlsidGFibGUiXX0pO2dvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soZnVuY3Rpb24oKXthLnRhYmxlPW5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5UYWJsZShhLkJmLmkpO2dvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihhLnRhYmxlLCJzb3J0IixmdW5jdGlvbihiKXthLnNvcnRDb2x1bW49Yi5jb2x1bW47YS5zb3J0QXNjZW5kaW5nPWIuYXNjZW5kaW5nO2EucGIoKX0pO2EucGIoKX0pfTsKaC53ej1mdW5jdGlvbigpe3ZhciBhPXRoaXMucW8oKTtpZighYSlyZXR1cm4gbnVsbDt2YXIgYj10aGlzLnNvcnRDb2x1bW4rMTtpZigwPT09dGhpcy5zb3J0Q29sdW1ufHwxMD09PXRoaXMuc29ydENvbHVtbnx8MTI9PT10aGlzLnNvcnRDb2x1bW4pYj10aGlzLnNvcnRDb2x1bW47dmFyIGM9YS5nZXRTb3J0ZWRSb3dzKHtjb2x1bW46YixkZXNjOiF0aGlzLnNvcnRBc2NlbmRpbmd9KSxkPTAsZT0wO2lmKDAhPT1ifHx0aGlzLnNvcnRBc2NlbmRpbmcpe2lmKGMuZm9yRWFjaChmdW5jdGlvbihtLHApe2Euc2V0Q2VsbChtLDEscCsxKTtkKz1hLmdldFZhbHVlKG0sMTApOzEwMDxkJiYoZD0xMDApO2Euc2V0Q2VsbChtLDExLGQpO2UrPWEuZ2V0VmFsdWUobSwxMik7MTAwPGUmJihlPTEwMCk7YS5zZXRDZWxsKG0sMTMsZSl9KSwhdGhpcy5zb3J0QXNjZW5kaW5nJiYoMTA9PT10aGlzLnNvcnRDb2x1bW58fDEyPT09dGhpcy5zb3J0Q29sdW1uKSl7dmFyIGY9MTA9PT10aGlzLnNvcnRDb2x1bW4/CmQ6ZSxnPTEwPT09dGhpcy5zb3J0Q29sdW1uPzExOjEzO2MuZm9yRWFjaChmdW5jdGlvbihtKXthLnNldENlbGwobSxnLGYpO2YtPWEuZ2V0VmFsdWUobSxnLTEpOzA+ZiYmKGY9MCl9KX19ZWxzZXt2YXIgbD1jLmxlbmd0aDtjLmZvckVhY2goZnVuY3Rpb24obSl7YS5zZXRDZWxsKG0sMSxsLS0pO2QrPWEuZ2V0VmFsdWUobSwxMCk7YS5zZXRDZWxsKG0sMTEsZCk7ZSs9YS5nZXRWYWx1ZShtLDEyKTthLnNldENlbGwobSwxMyxlKX0pfWI9bmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLk51bWJlckZvcm1hdCh7cGF0dGVybjoiIyMuIyUifSk7Yi5mb3JtYXQoYSwxMSk7Yi5mb3JtYXQoYSwxMyk7Yj1uZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVZpZXcoYSk7Yi5zZXRSb3dzKGMpO3JldHVybiBifTt2YXIgZlM9ZnVuY3Rpb24oKXt9O3ZhciBnUz1mdW5jdGlvbigpe307dmFyIGhTPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLnBhdGhQcmVmaXg9dGhpcy51cmw9IiI7U3RyaW5nKGEucGF0aG5hbWUpLmluY2x1ZGVzKCIvZGF0YS9wbHVnaW4vcHJvZmlsZSIpJiYodGhpcy5wYXRoUHJlZml4PVN0cmluZyhhLnBhdGhuYW1lKS5zcGxpdCgiL2RhdGEvcGx1Z2luL3Byb2ZpbGUiKVswXSk7Yi5wYXJhbXMuc3Vic2NyaWJlKGZ1bmN0aW9uKGQpe2MudXBkYXRlKGQpfSl9O2hTLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7YT0obmV3IHF0KS5zZXQoInJ1biIsYS5nYSkuc2V0KCJ0YWciLGEudGFnKS5zZXQoImhvc3QiLGEuaG9zdCk7dGhpcy51cmw9dGhpcy5wYXRoUHJlZml4KyIvZGF0YS9wbHVnaW4vcHJvZmlsZS90cmFjZV92aWV3ZXJfaW5kZXguaHRtbD9pc19zdHJlYW1pbmc9ZmFsc2UmdHJhY2VfZGF0YV91cmw9IitlbmNvZGVVUklDb21wb25lbnQodGhpcy5wYXRoUHJlZml4KyIvZGF0YS9wbHVnaW4vcHJvZmlsZS9kYXRhPyIrYS50b1N0cmluZygpKX07dmFyIGlTPWZ1bmN0aW9uKCl7fTtpUy5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgaG8oYSl9O3ZhciBqUz1mdW5jdGlvbigpe307dmFyIGtTPWZ1bmN0aW9uKCl7fTt2YXIgbFM9ZnVuY3Rpb24oKXt9O25ldyBkZDtuZXcgZmQ7bmV3IGNkKGFwKTtuZXcgZGQ7dmFyIG1TPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MjBweH1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgOHB4fW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzc3O3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0udGFibGVbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIC0yMHB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBuUyhhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHtCZjowfSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwyMSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtaGVhZGxpbmUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIk1lbW9yeSBCcmVha2Rvd24gVGFibGUiXSkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMTgsIm1hdC1mb3JtLWZpZWxkIixbWyJjbGFzcyIsIm1hdC1mb3JtLWZpZWxkIl1dLFtbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsCm51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oYXMtbGFiZWwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixudWxsXSxbMiwibWF0LWZvY3VzZWQiLG51bGxdLFsyLCJtYXQtYWNjZW50IixudWxsXSxbMiwibWF0LXdhcm4iLG51bGxdLFsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLAptaCg2MTQ0LG51bGwsV0QsbnVsbCxbWERdKSxJKDYsNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMix7U2I6MH0pLFgoMzM1NTQ0MzIwLDMse1RiOjB9KSxYKDYwMzk3OTc3Niw0LHtWYjowfSksWCgzMzU1NDQzMjAsNSx7V2I6MH0pLFgoNjAzOTc5Nzc2LDYse0hiOjB9KSxYKDYwMzk3OTc3Niw3LHtsYjoxfSksWCg2MDM5Nzk3NzYsOCx7YWI6MX0pLFgoNjAzOTc5Nzc2LDkse0piOjF9KSxYKDYwMzk3OTc3NiwxMCx7TGI6MX0pLChhKCkoKSxXKDE2LDAsbnVsbCwxLDIsImlucHV0IixbWyJjbGFzcyIsIm1hdC1pbnB1dC1lbGVtZW50IG1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSxbIm1hdElucHV0IiwiIl0sWyJwbGFjZWhvbGRlciIsIk9wZXJhdGlvbiJdXSxbWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwKImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJpbnB1dCJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMTcpLiRhKCEwKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMTcpLiRhKCExKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDE3KS5SZCgpJiZlKTsiaW5wdXQiPT09YyYmKGYuTmc9ZC50YXJnZXQudmFsdWUsZT0hMSE9PWYucGIoKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMTcsNTEyODE5MixudWxsLDAsQ0UsW3osTnosWzgsbnVsbF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0sdmFsdWU6WzEsInZhbHVlIl19LApudWxsKSxtaCgyMDQ4LFtbMiw0XSxbMyw0XV0sUEQsbnVsbCxbQ0VdKSwoYSgpKCksVygxOSwwLG51bGwsNCwzLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiBub3RyYW5zbGF0ZSJdLFsibWF0U3VmZml4IiwiIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXSxbMiwibWF0LWljb24tbm8tY29sb3IiLG51bGxdXSxudWxsLG51bGwseUUseEUpKSxJKDIwLDE2Mzg0LFtbMTAsNF1dLDAsU0QsW10sbnVsbCxudWxsKSxJKDIxLDkxNTg2NTYsbnVsbCwwLHZFLFt6LG5FLFs4LG51bGxdLHJFLHVkXSxudWxsLG51bGwpLChhKCkoKSxZKC0xLDAsWyJzZWFyY2giXSkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDEsImRpdiIsW10sW1s0LCJkaXNwbGF5IixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIgTm90ZTogU2hvd2luZyBhY3RpdmUgbWVtb3J5IGFsbG9jYXRpb25zIGF0IHBlYWsgdXNhZ2Ugd2l0aGluIHRoZSBwcm9maWxpbmcgd2luZG93LiBUbyBhdm9pZCBzbHVnZ2lzaG5lc3MsIG9ubHkgdGhlIGFsbG9jYXRpb25zIHdpdGggc2l6ZSBvdmVyIDFNaUIgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy5cbiJdKSksCihhKCkoKSxXKDI1LDAsbnVsbCxudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyNiwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDI3LDAsW1sxLDBdLFsidGFibGUiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJ0YWJsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKV0sZnVuY3Rpb24oYixjKXtiKGMsMTcsMCwiT3BlcmF0aW9uIixjLmEuTmcpO2IoYywyMSwwKX0sZnVuY3Rpb24oYixjKXt2YXIgZD0ic3RhbmRhcmQiPT1GKGMsNikubyxlPSJmaWxsIj09RihjLDYpLm8sZj0ib3V0bGluZSI9PUYoYyw2KS5vLGc9ImxlZ2FjeSI9PUYoYyw2KS5vLGw9RihjLDYpLmwuZmEsbT1GKGMsNikueGIscD1GKGMsNikuS2IoKSxxPUYoYyw2KS51YigpLHI9RihjLDYpLlViKCksdj1GKGMsNikubC5kaXNhYmxlZCx3PUYoYyw2KS5sLkFiLHg9RihjLDYpLmwuZm9jdXNlZCx1PSJhY2NlbnQiPT0KRihjLDYpLmNvbG9yLEQ9Indhcm4iPT1GKGMsNikuY29sb3IsSD1GKGMsNikuaCgidW50b3VjaGVkIiksRT1GKGMsNikuaCgidG91Y2hlZCIpLE49RihjLDYpLmgoInByaXN0aW5lIiksTT1GKGMsNikuaCgiZGlydHkiKSxKPUYoYyw2KS5oKCJ2YWxpZCIpLFE9RihjLDYpLmgoImludmFsaWQiKSxVPUYoYyw2KS5oKCJwZW5kaW5nIikscmE9IUYoYyw2KS5FYjtiKGMsNCwxLFtkLGUsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYV0pO2Q9RihjLDE3KS5RZDtlPUYoYywxNykuaWQ7Zj1GKGMsMTcpLnBsYWNlaG9sZGVyO2c9RihjLDE3KS5kaXNhYmxlZDtsPUYoYywxNykucmVxdWlyZWQ7bT1GKGMsMTcpLkRkJiYhRihjLDE3KS5WY3x8bnVsbDtwPUYoYywxNykuRmJ8fG51bGw7cT1GKGMsMTcpLmZhO3I9RihjLDE3KS5yZXF1aXJlZC50b1N0cmluZygpO2IoYywxNiwwLGQsZSxmLGcsbCxtLHAscSxyKTtkPUYoYywyMSkuaW5saW5lO2U9InByaW1hcnkiIT09RihjLAoyMSkuY29sb3ImJiJhY2NlbnQiIT09RihjLDIxKS5jb2xvciYmIndhcm4iIT09RihjLDIxKS5jb2xvcjtiKGMsMTksMCxkLGUpO2IoYywyMywwLCEwKX0pfTt2YXIgb1M9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlO2ZsZXgtZ3JvdzoxfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDttYXJnaW46OHB4O2hlaWdodDpjYWxjKDEwMCUgLSA0OHB4KX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpe21hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fW1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2NvbG9yOiMwMDA7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NDAwO21hcmdpbi1ib3R0b206MjVweH1iW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDB9dWxbX25nY29udGVudC0lQ09NUCVde2xpc3Qtc3R5bGUtcG9zaXRpb246b3V0c2lkZTttYXJnaW4tdG9wOi0xNnB4O3BhZGRpbmctaW5saW5lLXN0YXJ0OjIwcHh9dGFibGVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9Lml0ZW0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjE2cHh9Lml0ZW0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSA+IHRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItc3BhY2luZzowfS5pdGVtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gPiB0ZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzowfS5pdGVtLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWxlZnQ6MHB4O21pbi13aWR0aDoxMDBweDt3aWR0aDoyMCU7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6NTAwfS5mbG9wcy11dGlsaXphdGlvbi10b29sdGlwLXRhcmdldFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2U4NzEwYTtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2U4NzEwYX0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gcFMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw3NiwibWF0LWNhcmQiLFtbImNsYXNzIiwibWF0LWNhcmQgbWF0LWZvY3VzLWluZGljYXRvciJdXSxbWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLCRDLFpDKSksSSgxLDQ5MTUyLG51bGwsMCxYQyxbWzIsa3ZdXSxudWxsLG51bGwpLChhKCkoKSxXKDIsMCxudWxsLDAsMiwibWF0LWNhcmQtdGl0bGUiLFtbImNsYXNzIiwibWF0LWNhcmQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSgzLDE2Mzg0LG51bGwsMCxXQyxbXSxudWxsLG51bGwpLChhKCkoKSxZKDQsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoNSwwLG51bGwsMCw3MSwibWF0LWNhcmQtY29udGVudCIsW1siY2xhc3MiLCJtYXQtY2FyZC1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNiwxNjM4NCxudWxsLDAsVkMsW10sbnVsbCxudWxsKSwoYSgpKCksVyg3LAowLG51bGwsbnVsbCw5LCJkaXYiLFtbImNsYXNzIiwiaXRlbS1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCw4LCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOSwwLG51bGwsbnVsbCw3LCJ0ciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsNCwidGQiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDExLDAsbnVsbCxudWxsLDEsImIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJNZW1vcnkgSUQiXSkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJkZXNjcmlwdGlvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsic2hvdyBtZW1vcnkgcHJvZmlsZSBmb3Igc2VsZWN0ZWQgZGV2aWNlIl0pKSwKKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsMSwidGQiLFtbImNsYXNzIiwiaXRlbS12YWx1ZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxNbShudWxsLDApLChhKCkoKSxXKDE3LDAsbnVsbCxudWxsLDgsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxOCwwLG51bGwsbnVsbCw3LCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTksMCxudWxsLG51bGwsNiwidHIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIwLDAsbnVsbCxudWxsLDIsInRkIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyMSwwLG51bGwsbnVsbCwxLCJiIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiI0FsbG9jYXRpb24iXSkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDIsInRkIixbWyJjbGFzcyIsCiJpdGVtLXZhbHVlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDI0LDAsbnVsbCxudWxsLDEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMjUsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMjYsMCxudWxsLG51bGwsOCwiZGl2IixbWyJjbGFzcyIsIml0ZW0tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDI3LDAsbnVsbCxudWxsLDcsInRhYmxlIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyOCwwLG51bGwsbnVsbCw2LCJ0ciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsMiwidGQiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDMwLDAsbnVsbCxudWxsLDEsImIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIjRGVhbGxvY2F0aW9uIl0pKSwKKGEoKSgpLFcoMzIsMCxudWxsLG51bGwsMiwidGQiLFtbImNsYXNzIiwiaXRlbS12YWx1ZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMywwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDM0LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDM1LDAsbnVsbCxudWxsLDgsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzNiwwLG51bGwsbnVsbCw3LCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMzcsMCxudWxsLG51bGwsNiwidHIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDM4LDAsbnVsbCxudWxsLDIsInRkIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzOSwwLG51bGwsbnVsbCwxLCJiIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwKKGEoKSgpLFkoLTEsbnVsbCxbIk1lbW9yeSBDYXBhY2l0eSJdKSksKGEoKSgpLFcoNDEsMCxudWxsLG51bGwsMiwidGQiLFtbImNsYXNzIiwiaXRlbS12YWx1ZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0MiwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDQzLG51bGwsWyIiLCIgR2lCcyJdKSksKGEoKSgpLFcoNDQsMCxudWxsLG51bGwsMTAsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0NSwwLG51bGwsbnVsbCw5LCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNDYsMCxudWxsLG51bGwsOCwidHIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQ3LDAsbnVsbCxudWxsLDQsInRkIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0OCwKMCxudWxsLG51bGwsMSwiYiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlBlYWsgSGVhcCBVc2FnZSJdKSksKGEoKSgpLFcoNTAsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJoaWdoIHdhdGVyIG1hcmsgaW4gbGlmZXRpbWUiXSkpLChhKCkoKSxXKDUyLDAsbnVsbCxudWxsLDIsInRkIixbWyJjbGFzcyIsIml0ZW0tdmFsdWUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNTMsMCxudWxsLG51bGwsMSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg1NCxudWxsLFsiIiwiIEdpQnMiXSkpLChhKCkoKSxXKDU1LDAsbnVsbCxudWxsLDEwLCJkaXYiLFtbImNsYXNzIiwiaXRlbS1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNTYsCjAsbnVsbCxudWxsLDksInRhYmxlIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg1NywwLG51bGwsbnVsbCw4LCJ0ciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNTgsMCxudWxsLG51bGwsNCwidGQiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDU5LDAsbnVsbCxudWxsLDEsImIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJQZWFrIE1lbW9yeSBVc2FnZSJdKSksKGEoKSgpLFcoNjEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJzdGFjayArIGhlYXAsIHdpdGhpbiBwcm9maWxpbmcgd2luZG93Il0pKSwoYSgpKCksVyg2MywwLG51bGwsbnVsbCwyLCJ0ZCIsW1siY2xhc3MiLCJpdGVtLXZhbHVlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLAooYSgpKCksVyg2NCwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDY1LG51bGwsWyIiLCIgR2lCcyJdKSksKGEoKSgpLFcoNjYsMCxudWxsLG51bGwsMTAsInVsIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg2NywwLG51bGwsbnVsbCwxLCJsaSIsW1siY2xhc3MiLCJwcmltYXJ5LWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNjgsbnVsbCxbIlRpbWVzdGFtcDogIiwiIG1zIl0pKSwoYSgpKCksVyg2OSwwLG51bGwsbnVsbCwxLCJsaSIsW1siY2xhc3MiLCJwcmltYXJ5LWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNzAsbnVsbCxbIlN0YWNrIFJlc2VydmF0aW9uOiAiLCIgR2lCcyJdKSksKGEoKSgpLFcoNzEsMCxudWxsLG51bGwsMSwibGkiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsCm51bGwpKSwoYSgpKCksWSg3MixudWxsLFsiSGVhcCBBbGxvY2F0aW9uOiAiLCIgR2lCcyJdKSksKGEoKSgpLFcoNzMsMCxudWxsLG51bGwsMSwibGkiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDc0LG51bGwsWyJGcmVlIE1lbW9yeTogIiwiIEdpQnMiXSkpLChhKCkoKSxXKDc1LDAsbnVsbCxudWxsLDEsImxpIixbWyJjbGFzcyIsInByaW1hcnktY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg3NixudWxsLFsiRnJhZ21lbnRhdGlvbjogIiwiIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYSxlPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMSkuaWE7YihjLDAsMCxlKTtiKGMsNCwwLGQudGl0bGUpO2IoYywyNSwwLGQuSkcpO2IoYywzNCwwLGQuS0cpO2IoYyw0MywwLGQueEcpO2IoYyw1NCwwLGQuaEgpO2IoYyw2NSwwLGQuakgpO2IoYyw2OCwwLGQuZ0kpO2IoYywKNzAsMCxkLlRIKTtiKGMsNzIsMCxkLlNGKTtiKGMsNzQsMCxkLkdGKTtiKGMsNzYsMCxkLkVGKX0pfTt2YXIgcVM9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlO2ZsZXgtZ3JvdzoxfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDttYXJnaW46OHB4O2hlaWdodDpjYWxjKDEwMCUgLSA0OHB4KX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpe21hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fW1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4O2NvbG9yOiMwMDA7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NDAwfS5jaGFydFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgYXV0bzttYXgtd2lkdGg6MTUwMHB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiByUyhhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHt5YzowfSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCw5LCJtYXQtY2FyZCIsW1siY2xhc3MiLCJtYXQtY2FyZCBtYXQtZm9jdXMtaW5kaWNhdG9yIl1dLFtbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsJEMsWkMpKSxJKDIsNDkxNTIsbnVsbCwwLFhDLFtbMixrdl1dLG51bGwsbnVsbCksKGEoKSgpLFcoMywwLG51bGwsMCwyLCJtYXQtY2FyZC10aXRsZSIsW1siY2xhc3MiLCJtYXQtY2FyZC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDQsMTYzODQsbnVsbCwwLFdDLFtdLG51bGwsbnVsbCksKGEoKSgpLFkoNSxudWxsLFsiIiwiIl0pKSwoYSgpKCksVyg2LDAsbnVsbCwwLDQsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwibWF0LWNhcmQtY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDcsMTYzODQsbnVsbCwwLFZDLFtdLG51bGwsCm51bGwpLChhKCkoKSxXKDgsMCxudWxsLG51bGwsMSwiZGl2IixbXSxbWzQsImRpc3BsYXkiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBUaXBzOiBab29tIGluOiBsZWZ0IGNsaWNrIGFuZCBkcmFnOyBab29tIG91dDogcmlnaHQgY2xpY2s7IE1ldGFkYXRhOiBjbGljayBvbiBoZWFwIGRhdGEgcG9pbnQuICJdKSksKGEoKSgpLFcoMTAsMCxbWzEsMF0sWyJjaGFydCIsMV1dLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImNoYXJ0Il1dLFtbNCwiaGVpZ2h0IixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9Ik5vb3BBbmltYXRpb25zIj09PUYoYywyKS5pYTtiKGMsMSwwLGUpO2IoYyw1LDAsZC50aXRsZSk7YihjLDgsMCwhMCk7YihjLDEwLDAsZC5oZWlnaHQrInB4Iil9KX07dmFyIHNTPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo4MHB4O21hcmdpbi1sZWZ0Oi0xMHB4fS5lcnJvci1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZWQ7Zm9udC1zaXplOi41Y207Zm9udC13ZWlnaHQ6Ym9sZGVyO21hcmdpbi10b3A6LjVjbTttYXJnaW4tYm90dG9tOi41Y207dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO3dpZHRoOjEwMCV9LmxlZnQtY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjMzLjMzMyV9LnJpZ2h0LWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDo2Ni42NjclfS5mdWxsLWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlO3dpZHRoOjEwMCV9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogODYwcHgpe1tfbmdob3N0LSVDT01QJV17d2lkdGg6Zml0LWNvbnRlbnR9fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7LmxlZnQtY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnJpZ2h0LWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX19Lm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctbGVmdDoxMHB4O21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjB9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWxlZnQ6MTBweH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gdFMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyLCJtYXQtb3B0aW9uIixbWyJjbGFzcyIsIm1hdC1vcHRpb24gbWF0LWZvY3VzLWluZGljYXRvciJdLFsicm9sZSIsIm9wdGlvbiJdXSxbWzEsInRhYmluZGV4IiwwXSxbMiwibWF0LXNlbGVjdGVkIixudWxsXSxbMiwibWF0LW9wdGlvbi1tdWx0aXBsZSIsbnVsbF0sWzIsIm1hdC1hY3RpdmUiLG51bGxdLFs4LCJpZCIsMF0sWzEsImFyaWEtc2VsZWN0ZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMiwibWF0LW9wdGlvbi1kaXNhYmxlZCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDEpLnZjKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDEpLkhhKGQpJiZlKTtyZXR1cm4gZX0sZUQsY0QpKSxJKDEsODU2ODgzMixbWzEwLDRdXSwwLHlDLFt6LG5lLFsyLHhDXSwKWzIsdUNdXSx7dmFsdWU6WzAsInZhbHVlIl19LG51bGwpLChhKCkoKSxZKDIsMCxbIiAiLCIgIl0pKV0sZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMuY29udGV4dC5QKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1GKGMsMSkuVGMoKSxlPUYoYywxKS5zZWxlY3RlZCxmPUYoYywxKS5tdWx0aXBsZSxnPUYoYywxKS5hY3RpdmUsbD1GKGMsMSkuaWQsbT1GKGMsMSkucWUoKSxwPUYoYywxKS5kaXNhYmxlZC50b1N0cmluZygpLHE9RihjLDEpLmRpc2FibGVkO2IoYywwLDAsZCxlLGYsZyxsLG0scCxxKTtiKGMsMiwwLGMuY29udGV4dC5QKX0pfQpmdW5jdGlvbiB1UyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDM0LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImVycm9yLW1lc3NhZ2UiXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBUaGVyZSBpcyBubyBtZW1vcnkgcHJvZmlsZSB0byBkaXNwbGF5IGJlY2F1c2UgdGhlcmUgd2VyZSBubyBtZW1vcnkgYWN0aXZpdHkgZGF0YSBpbiB0aGUgY2FwdHVyZWQgZHVyYXRpb24uICJdKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwzMSwiZGl2IixbXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDMwLCJkaXYiLFtbImNsYXNzIiwiY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsMjMsCiJkaXYiLFtbImNsYXNzIiwibGVmdC1jb2x1bW4iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwyMiwibWVtb3J5LXByb2ZpbGUtc3VtbWFyeSIsW10sbnVsbCxudWxsLG51bGwscFMsb1MpKSxJKDcsNDc2Nzc0NCxudWxsLDAsbUwsW25lXSx7ZGF0YTpbMCwiZGF0YSJdLEplOlsxLCJtZW1vcnlJZCJdfSxudWxsKSwoYSgpKCksVyg4LDAsbnVsbCwwLDIwLCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLApudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSxJKDksNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLApbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDEse1NiOjB9KSxYKDMzNTU0NDMyMCwyLHtUYjowfSksWCg2MDM5Nzk3NzYsMyx7VmI6MH0pLFgoMzM1NTQ0MzIwLDQse1diOjB9KSxYKDYwMzk3OTc3Niw1LHtIYjowfSksWCg2MDM5Nzk3NzYsNix7bGI6MX0pLFgoNjAzOTc5Nzc2LDcse2FiOjF9KSxYKDYwMzk3OTc3Niw4LHtKYjoxfSksWCg2MDM5Nzk3NzYsOSx7TGI6MX0pLG1oKDIwNDgsbnVsbCxXRCxudWxsLFtYRF0pLChhKCkoKSxXKDIwLDAsbnVsbCwxLDgsIm1hdC1zZWxlY3QiLFtbImNsYXNzIiwibWF0LXNlbGVjdCJdLFsicm9sZSIsImxpc3Rib3giXV0sW1sxLCJpZCIsMF0sWzEsInRhYmluZGV4IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMSwiYXJpYS1pbnZhbGlkIiwwXSxbMSwiYXJpYS1vd25zIiwwXSxbMSwKImFyaWEtbXVsdGlzZWxlY3RhYmxlIiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsMF0sWzIsIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LWludmFsaWQiLG51bGxdLFsyLCJtYXQtc2VsZWN0LXJlcXVpcmVkIixudWxsXSxbMiwibWF0LXNlbGVjdC1lbXB0eSIsbnVsbF1dLFtbbnVsbCwidmFsdWVDaGFuZ2UiXSxbbnVsbCwia2V5ZG93biJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwyMikuSGEoZCkmJmUpOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiwyMikuc2QoKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMjIpLnFkKCkmJmUpOyJ2YWx1ZUNoYW5nZSI9PT1jJiYoZT0hMSE9PShmLnVrPWQpJiZlKTtyZXR1cm4gZX0sVEYsTkYpKSxtaCg2MTQ0LG51bGwseEMsbnVsbCxbTEZdKSwKSSgyMiwyMDgwNzY4LG51bGwsMyxMRixbWkEsbmUsVCxxQyx6LFsyLE5BXSxbMixSdV0sWzIsVXVdLFsyLFdEXSxbOCxudWxsXSxbOCxudWxsXSxHRixpQSxbMixJRl1dLHt2YWx1ZTpbMCwidmFsdWUiXX0se0drOiJ2YWx1ZUNoYW5nZSJ9KSxYKDYwMzk3OTc3NiwxMCx7b3B0aW9uczoxfSksWCg2MDM5Nzk3NzYsMTEse1lnOjF9KSxYKDYwMzk3OTc3NiwxMix7Rmo6MH0pLG1oKDIwNDgsW1sxLDRdLFsyLDRdXSxQRCxudWxsLFtMRl0pLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsMSwxLG51bGwsdFMpKSxJKDI4LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsInJpZ2h0LWNvbHVtbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMCwwLG51bGwsbnVsbCwxLCJtZW1vcnktdGltZWxpbmUtZ3JhcGgiLFtdLG51bGwsW1sid2luZG93IiwicmVzaXplIl1dLApmdW5jdGlvbihiLGMpeyJ3aW5kb3c6cmVzaXplIj09PWMmJkYoYiwzMSkuTGEoKTtyZXR1cm4hMH0sclMscVMpKSxJKDMxLDQ3Njc3NDQsbnVsbCwwLHBMLFtdLHtSczpbMCwibWVtb3J5UHJvZmlsZVByb3RvT3JOdWxsIl0sSmU6WzEsIm1lbW9yeUlkIl19LG51bGwpLChhKCkoKSxXKDMyLDAsbnVsbCxudWxsLDIsImRpdiIsW1siY2xhc3MiLCJmdWxsLWNvbHVtbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMywwLG51bGwsbnVsbCwxLCJtZW1vcnktYnJlYWtkb3duLXRhYmxlIixbXSxudWxsLG51bGwsbnVsbCxuUyxtUykpLEkoMzQsNjM4OTc2LG51bGwsMCxrTCxbXSx7U2o6WzAsIm1lbW9yeVByb2ZpbGVEYXRhIl0sSmU6WzEsIm1lbW9yeUlkIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsNywwLGQuZGF0YSxkLnVrKTtiKGMsMjIsMCxkLnVrKTtiKGMsMjgsMCxkLm1lbW9yeUlkcyk7YihjLDMxLDAsZC5kYXRhLGQudWspO2IoYywKMzQsMCxkLmRhdGEsZC51ayl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxLDAsZC5peSk7YihjLDMsMCwhZC5peSk7dmFyIGU9InN0YW5kYXJkIj09RihjLDkpLm8sZj0iZmlsbCI9PUYoYyw5KS5vLGc9Im91dGxpbmUiPT1GKGMsOSkubyxsPSJsZWdhY3kiPT1GKGMsOSkubyxtPUYoYyw5KS5sLmZhLHA9RihjLDkpLnhiLHE9RihjLDkpLktiKCkscj1GKGMsOSkudWIoKSx2PUYoYyw5KS5VYigpLHc9RihjLDkpLmwuZGlzYWJsZWQseD1GKGMsOSkubC5BYix1PUYoYyw5KS5sLmZvY3VzZWQsRD0iYWNjZW50Ij09RihjLDkpLmNvbG9yLEg9Indhcm4iPT1GKGMsOSkuY29sb3IsRT1GKGMsOSkuaCgidW50b3VjaGVkIiksTj1GKGMsOSkuaCgidG91Y2hlZCIpLE09RihjLDkpLmgoInByaXN0aW5lIiksSj1GKGMsOSkuaCgiZGlydHkiKSxRPUYoYyw5KS5oKCJ2YWxpZCIpLFU9RihjLDkpLmgoImludmFsaWQiKSxyYT1GKGMsOSkuaCgicGVuZGluZyIpLEVhPSFGKGMsOSkuRWI7YihjLAo4LDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYSxFYV0pO2U9RihjLDIyKS5pZDtmPUYoYywyMikudGFiSW5kZXg7Zz1GKGMsMjIpLnBoKCk7bD1GKGMsMjIpLmRqKCk7bT1GKGMsMjIpLnJlcXVpcmVkLnRvU3RyaW5nKCk7cD1GKGMsMjIpLmRpc2FibGVkLnRvU3RyaW5nKCk7cT1GKGMsMjIpLmZhO3I9RihjLDIyKS5mZD9GKGMsMjIpLnloOm51bGw7dj1GKGMsMjIpLm11bHRpcGxlO3c9RihjLDIyKS5GYnx8bnVsbDt4PUYoYywyMikuY2ooKTt1PUYoYywyMikuZGlzYWJsZWQ7RD1GKGMsMjIpLmZhO0g9RihjLDIyKS5yZXF1aXJlZDtFPUYoYywyMikuZW1wdHk7YihjLDIwLDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFXSl9KX0KdmFyIHZTPVFnKCJtZW1vcnktcHJvZmlsZSIsakwsZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJtZW1vcnktcHJvZmlsZSIsW10sbnVsbCxudWxsLG51bGwsdVMsc1MpKSxJKDEsNDkxNTIsbnVsbCwwLGpMLFt4dyxLSSxjSV0sbnVsbCxudWxsKV0sbnVsbCxudWxsKX0pO3ZhciB3Uz1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW46MjBweH0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTE2cHh9LmNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjI0cHg7d2lkdGg6MTIwMHB4O2hlaWdodDoxMDBweH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24geFMoYSl7cmV0dXJuIFooMCxbWCg2NzEwODg2NDAsMSx7eWM6MH0pLChhKCkoKSxXKDEsMCxudWxsLG51bGwsNSwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtaGVhZGxpbmUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMyxudWxsLFsiIiwiIl0pKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJkZXNjcmlwdGlvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiSG92ZXIgb3ZlciBhIGJhciBmb3IgYnVmZmVyIGRldGFpbHMgdG8gYXBwZWFyIG9uIHRoZSBsZWZ0LiJdKSksKGEoKSgpLFcoNiwwLFtbMSwwXSxbImNoYXJ0IiwxXV0sbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsCjMsMCxjLmEudGl0bGUpfSl9O3ZhciB5Uz1jZyh7VDowLGc6W1siW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbjoyMHB4fS5jaGFydC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEyMDBweDtoZWlnaHQ6MzgwcHh9LmNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTIwMHB4O2hlaWdodDozODBweH0iXV0sZGF0YTp7fX0pOwpmdW5jdGlvbiB6UyhhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHt6TzowfSksWCg2NzEwODg2NDAsMix7eWM6MH0pLFgoNjcxMDg4NjQwLDMse1JROjB9KSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDYsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhlYWRsaW5lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJXb3JraW5nIFNwYWNlIFNpemUgKE1pQikgdnMgUHJvZ3JhbSBPcmRlciAoSExPIFNlcXVlbmNlKSJdKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwzLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQtY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDcsMCxbWzMsMF0sWyJwZWFrQ2hhcnQiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJjaGFydCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwKKGEoKSgpLFcoOCwwLFtbMiwwXSxbImNoYXJ0IiwxXV0sbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOSwwLFtbMSwwXSxbImFjdGl2ZUNoYXJ0IiwxXV0sbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsbnVsbCl9O3ZhciBBUz1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9ja30uc2VjdGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MjBweH0uc3ViLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDB9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIEJTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsOSwiZGl2IixbWyJjbGFzcyIsInNlY3Rpb24tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgyLG51bGwsWyJNb2R1bGUgbmFtZTogIiwiIl0pKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDYsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwic3ViLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDUsbnVsbCxbIlBlYWsgbWVtb3J5IGFsbG9jYXRpb24gaXMgIiwiIE1pQiJdKSksKGEoKSgpLFcoNiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sW1s4LAoiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDcsbnVsbCxbIiAoIiwiIE1pQiB3aXRob3V0IHBhZGRpbmcpICJdKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBNb2RpZnlpbmcgeW91ciBtb2RlbCdzIGFyY2hpdGVjdHVyZSwgYmF0Y2ggc2l6ZSBhbmQgZGF0YSBkaW1lbnNpb25zIG1heSBoZWxwIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludC4gIl0pKSwoYSgpKCksVygxMCwwLG51bGwsbnVsbCwxLCJtYXQtZGl2aWRlciIsW1siY2xhc3MiLCJtYXQtZGl2aWRlciJdLFsicm9sZSIsInNlcGFyYXRvciJdXSxbWzEsImFyaWEtb3JpZW50YXRpb24iLDBdLFsyLCJtYXQtZGl2aWRlci12ZXJ0aWNhbCIsbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWhvcml6b250YWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1pbnNldCIsCm51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDExLDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDEyLDAsbnVsbCxudWxsLDEwLCJkaXYiLFtdLFtbOCwiY2xhc3NOYW1lIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDEsInByb2dyYW0tb3JkZXItY2hhcnQiLFtdLG51bGwsbnVsbCxudWxsLHpTLHlTKSksSSgxNCw2Mzg5NzYsbnVsbCwwLFFMLFtdLHtFZTpbMCwiaGVhcFNpemVzIl0sTWk6WzEsInVucGFkZGVkSGVhcFNpemVzIl0saW06WzIsInBlYWtJbmZvIl0sQ2c6WzMsImFjdGl2ZUluZm8iXX0sbnVsbCksKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsMSwibWF0LWRpdmlkZXIiLFtbImNsYXNzIiwibWF0LWRpdmlkZXIiXSxbInJvbGUiLCJzZXBhcmF0b3IiXV0sW1sxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIiwKbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWluc2V0IixudWxsXV0sbnVsbCxudWxsLEJELEFEKSksSSgxNiw0OTE1MixudWxsLDAseUQsW10sbnVsbCxudWxsKSwoYSgpKCksVygxNywwLG51bGwsbnVsbCwxLCJtYXgtaGVhcC1jaGFydCIsW10sbnVsbCxbW251bGwsInNlbGVjdGVkIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLmE7InNlbGVjdGVkIj09PWMmJmUudXNhZ2UmJigtMT09PWQ/TUwoZSk6KE1MKGUsZS51c2FnZS5kZVtkXSksZS5zej1lLnVzYWdlLkZ5W2RdKSk7cmV0dXJuITB9LHhTLHdTKSksSSgxOCw2Mzg5NzYsbnVsbCwwLE9MLFtdLHtkZTpbMCwibWF4SGVhcCJdLHRpdGxlOlsxLCJ0aXRsZSJdLHNlbGVjdGVkSW5kZXg6WzIsInNlbGVjdGVkSW5kZXgiXX0se3NlbGVjdGVkOiJzZWxlY3RlZCJ9KSwoYSgpKCksVygxOSwwLG51bGwsbnVsbCwxLCJtYXQtZGl2aWRlciIsW1siY2xhc3MiLCJtYXQtZGl2aWRlciJdLFsicm9sZSIsInNlcGFyYXRvciJdXSxbWzEsImFyaWEtb3JpZW50YXRpb24iLAowXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLG51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDIwLDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDIxLDAsbnVsbCxudWxsLDEsIm1heC1oZWFwLWNoYXJ0IixbXSxudWxsLFtbbnVsbCwic2VsZWN0ZWQiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuYTsic2VsZWN0ZWQiPT09YyYmZS51c2FnZSYmKC0xPT09ZD9NTChlKTooTUwoZSxlLnVzYWdlLktvW2RdKSxlLnNlbGVjdGVkSW5kZXg9ZS51c2FnZS5VcltkXSkpO3JldHVybiEwfSx4Uyx3UykpLEkoMjIsNjM4OTc2LG51bGwsMCxPTCxbXSx7ZGU6WzAsIm1heEhlYXAiXSx0aXRsZTpbMSwidGl0bGUiXSxzZWxlY3RlZEluZGV4OlsyLCJzZWxlY3RlZEluZGV4Il19LHtzZWxlY3RlZDoic2VsZWN0ZWQifSksKGEoKSgpLFcoMjMsMCxudWxsLG51bGwsCjEsImRpdiIsW1siY2xhc3MiLCJzZWN0aW9uLWNvbnRhaW5lciJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIFRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheS5cbiJdKSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywxNCwwLGQuRWUsZC5NaSxkLmltLGQuQ2cpO2IoYywxOCwwLGQuZGUsIkJ5IFByb2dyYW0gT3JkZXIiLGQuc2VsZWN0ZWRJbmRleCk7YihjLDIyLDAsZC5LbywiQnkgU2l6ZSIsZC5zeil9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyLDAsZC5BRyk7YihjLDUsMCxkLmdIKTtiKGMsNiwwLCFkLkl6KTtiKGMsNywwLGQuSXopO3ZhciBlPUYoYywxMSkudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCIsZj1GKGMsMTEpLnZlcnRpY2FsLGc9IUYoYywxMSkudmVydGljYWwsbD1GKGMsMTEpLkhlO2IoYywxMCwwLGUsZixnLGwpO2IoYywxMiwwLGQuaHk/ImZ1bGwtaGVpZ2h0IjoiaGlkZGVuLWNvbnRlbnQiKTsKZT1GKGMsMTYpLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiO2Y9RihjLDE2KS52ZXJ0aWNhbDtnPSFGKGMsMTYpLnZlcnRpY2FsO2w9RihjLDE2KS5IZTtiKGMsMTUsMCxlLGYsZyxsKTtlPUYoYywyMCkudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsMjApLnZlcnRpY2FsO2c9IUYoYywyMCkudmVydGljYWw7bD1GKGMsMjApLkhlO2IoYywxOSwwLGUsZixnLGwpO2IoYywyMywwLGQuaHkpfSl9dmFyIENTPVFnKCJtZW1vcnktdmlld2VyIixMTCxmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsIm1lbW9yeS12aWV3ZXIiLFtdLG51bGwsbnVsbCxudWxsLEJTLEFTKSksSSgxLDE4MDIyNCxudWxsLDAsTEwsW3h3LEtJLGNJXSxudWxsLG51bGwpXSxudWxsLG51bGwpfSk7dmFyIERTPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5yb3dbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1zZWxmOmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO3otaW5kZXg6MH0ucm93LmV4cGFuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KTtmb250LXdlaWdodDpib2xkfS5yb3dbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDUpfS5yb3dbX25nY29udGVudC0lQ09NUCVdID4gKltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtO292ZXJmbG93OmhpZGRlbjtmbGV4LXNocmluazowO2JveC1zaXppbmc6Ym9yZGVyLWJveH0uYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Ym90dG9tOjA7ei1pbmRleDotMjtiYWNrZ3JvdW5kLWNvbG9yOiNjZGU7cGFkZGluZzowICFpbXBvcnRhbnR9LnJvdy1mb2N1c1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JvdHRvbTowO3otaW5kZXg6LTE7d2lkdGg6OHB4O2JhY2tncm91bmQtY29sb3I6I2U4NzEwYTtwYWRkaW5nOjAgIWltcG9ydGFudH0udGltZVtfbmdjb250ZW50LSVDT01QJV0sIC53YXN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAudXRpbGl6YXRpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjIwcHg7Zm9udC1zaXplOnNtYWxsZXI7d2lkdGg6NjBweH0udGltZVtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1sZWZ0OjIwcHggIWltcG9ydGFudDt3aWR0aDo4MHB4fS5uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NDAlfS5kaXNjbG9zdXJlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxZW19LnByb3ZlbmFuY2VbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDAgIWltcG9ydGFudH0udXRpbGl6YXRpb25bX25nY29udGVudC0lQ09NUCVde2FsaWduLXNlbGY6c3RyZXRjaDt0ZXh0LWFsaWduOnJpZ2h0fS5mbGFtZS1jb2xvci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoxMHB4IDIwcHggMTBweCAxMHB4O3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyLXJhZGl1czo4cHh9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIEVTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwib3AtdGFibGUtZW50cnkiLFtdLG51bGwsW1tudWxsLCJob3ZlciJdLFtudWxsLCJzZWxlY3RlZCJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImhvdmVyIj09PWMmJihlPSExIT09Zi52by5lbWl0KGQpJiZlKTsic2VsZWN0ZWQiPT09YyYmKGU9ITEhPT1mLnNlbGVjdGVkLmVtaXQoZCkmJmUpO3JldHVybiBlfSxGUyxEUykpLEkoMSw1NzM0NDAsbnVsbCwwLFpRLFtdLHtsZXZlbDpbMCwibGV2ZWwiXSxub2RlOlsxLCJub2RlIl0sc206WzIsInNlbGVjdGVkTm9kZSJdLHllOlszLCJieVdhc3RlZCJdLFFlOls0LCJzaG93UDkwIl0sSGM6WzUsImNoaWxkcmVuQ291bnQiXX0se3ZvOiJob3ZlciIsc2VsZWN0ZWQ6InNlbGVjdGVkIn0pXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMSwwLGQubGV2ZWwrMSxjLmNvbnRleHQuUCxkLnNtLGQueWUsZC5RZSxkLkhjKX0sbnVsbCl9CmZ1bmN0aW9uIEZTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMjAsImRpdiIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwxOSwiZGl2IixbWyJjbGFzcyIsInJvdyJdXSxudWxsLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwibW91c2VlbnRlciJdLFtudWxsLCJtb3VzZWxlYXZlIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITAsZT1iLmE7ImNsaWNrIj09PWMmJihlLk1hPSFlLk1hLGUuc2VsZWN0ZWQuZW1pdChlLm5vZGUpKTsibW91c2VlbnRlciI9PT1jJiYoZD0hMSE9PWUudm8uZW1pdChlLm5vZGUpJiZkKTsibW91c2VsZWF2ZSI9PT1jJiYoZD0hMSE9PWUudm8uZW1pdChudWxsKSYmZCk7cmV0dXJuIGR9LG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImJhciJdXSxbWzQsIndpZHRoIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSwKVygzLDAsbnVsbCxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJyb3ctZm9jdXMiXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsInRpbWUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNSxudWxsLFsiIiwiIl0pKSwoYSgpKCksVyg2LDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwid2FzdGVkIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDcsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoOCwwLG51bGwsbnVsbCw3LCJzcGFuIixbWyJjbGFzcyIsIm5hbWUiXV0sW1s0LCJwYWRkaW5nLWxlZnQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOSwwLG51bGwsbnVsbCw1LCJzcGFuIixbWyJjbGFzcyIsImRpc2Nsb3N1cmUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsCjQsInNwYW4iLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDExLDAsbnVsbCxudWxsLDEsInNwYW4iLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJcdTI1YjYiXSkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDEsInNwYW4iLFtdLFtbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJcdTI1YmMiXSkpLChhKCkoKSxZKDE1LG51bGwsWyIgIiwiICJdKSksKGEoKSgpLFcoMTYsMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJwcm92ZW5hbmNlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDE3LG51bGwsWyIiLCJcdTAwYTAiXSkpLChhKCkoKSxXKDE4LDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwidXRpbGl6YXRpb24iXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksCihhKCkoKSxZKDE5LG51bGwsWyIgIiwiICJdKSksKGEoKSgpLFcoMjAsMCxudWxsLG51bGwsMCwic3BhbiIsW1siY2xhc3MiLCJmbGFtZS1jb2xvci1jaXJjbGUiXV0sW1s4LCJoaWRkZW4iLDBdLFs0LCJiYWNrZ3JvdW5kLWNvbG9yIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIxLDAsbnVsbCxudWxsLDIsImRpdiIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxFUykpLEkoMjMsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsMjMsMCxjLmEuY2hpbGRyZW4pfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMCwwLCFkLmxldmVsKTtiKGMsMiwwLGQudHgpO2IoYywzLDAsZC5ub2RlIT09ZC5zbSk7YihjLDUsMCxkLnVmKTtiKGMsNywwLGQuZkkpO2IoYyw4LDAsZC5vZmZzZXQpO2IoYywKMTAsMCwhZC5jaGlsZHJlbi5sZW5ndGgpO2IoYywxMSwwLGQuTWEpO2IoYywxMywwLCFkLk1hKTtiKGMsMTUsMCxkLm5hbWUpO2IoYywxNywwLGQucHJvdmVuYW5jZSk7YihjLDE4LDAsZC5teSk7YihjLDE5LDAsZC51dGlsaXphdGlvbik7YihjLDIwLDAsZC5teSxkLkFGKTtiKGMsMjEsMCwhZC5NYSl9KX07dmFyIEdTPWNnKHtUOjAsZzpbWyIuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTpzbWFsbGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzY2NjtwYWRkaW5nLWJvdHRvbTouMjVlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7d2hpdGUtc3BhY2U6bm93cmFwfS5oZWFkZXJbX25nY29udGVudC0lQ09NUCVdID4gKltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIC41ZW0gMDtvdmVyZmxvdzpoaWRkZW47ZmxleC1zaHJpbms6MDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnRpbWVbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctbGVmdDoyMHB4ICFpbXBvcnRhbnQ7d2lkdGg6ODBweH0ud2FzdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnV0aWxpemF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo2MHB4fS5uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttaW4td2lkdGg6NDAlO3BhZGRpbmctbGVmdDoyZW0gIWltcG9ydGFudH0ucHJvdmVuYW5jZVtfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDEgMCAhaW1wb3J0YW50fS51dGlsaXphdGlvbltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpyaWdodH0uZmxhbWUtY29sb3ItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAyMHB4IDAgMTBweDt3aWR0aDoxNnB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBIUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDExLCJkaXYiLFtbImNsYXNzIiwiaGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJ0aW1lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJUaW1lIl0pKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwid2FzdGVkIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJXYXN0ZWQiXSkpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJuYW1lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJOYW1lIl0pKSwoYSgpKCksVyg3LDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwicHJvdmVuYW5jZSJdXSxudWxsLG51bGwsbnVsbCwKbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlRlbnNvckZsb3cgT3AiXSkpLChhKCkoKSxXKDksMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJ1dGlsaXphdGlvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRkxPUFMiXSkpLChhKCkoKSxXKDExLDAsbnVsbCxudWxsLDAsInNwYW4iLFtbImNsYXNzIiwiZmxhbWUtY29sb3ItY2lyY2xlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEyLDAsbnVsbCxudWxsLDEsIm9wLXRhYmxlLWVudHJ5IixbXSxudWxsLFtbbnVsbCwiaG92ZXIiXSxbbnVsbCwic2VsZWN0ZWQiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuYTsiaG92ZXIiPT09YyYmZS5zdG9yZS54YShiSih7TW46ZHx8ZS5zbXx8bnVsbH0pKTsic2VsZWN0ZWQiPT09YyYmKGUuc209ZCk7cmV0dXJuITB9LEZTLERTKSksSSgxMyw1NzM0NDAsbnVsbCwwLFpRLFtdLHtsZXZlbDpbMCwibGV2ZWwiXSwKbm9kZTpbMSwibm9kZSJdLHNtOlsyLCJzZWxlY3RlZE5vZGUiXSx5ZTpbMywiYnlXYXN0ZWQiXSxRZTpbNCwic2hvd1A5MCJdLEhjOls1LCJjaGlsZHJlbkNvdW50Il19LHt2bzoiaG92ZXIiLHNlbGVjdGVkOiJzZWxlY3RlZCJ9KV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEzLDAsMCxkLnBrLGQuc20sZC55ZSxkLlFlLGQuSGMpfSxudWxsKX07dmFyIElTPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoyMHB4fS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMTZweH0uY29udHJvbC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwYWRkaW5nLXRvcDozMnB4fS5jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6MzJweH0ub3BzLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDozMnB4O3RleHQtYWxpZ246Y2VudGVyfS5jb250cm9sLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O21hcmdpbi1ib3R0b206MTZweH0ub3BzLWNvbnRyb2wtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7bWFyZ2luOi0yMHB4IDAgLTI0cHh9LmNoaWxkcmVuLWNvdW50LWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo1MHB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBKUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDYzLCJkaXYiLFtbImNsYXNzIiwiY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsOCwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDMsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiBPdmVyYWxsIFRQVSBGTE9QUyB1dGlsaXphdGlvbiBpcyAiXSkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMSwic3BhbiIsW10sW1s0LCJjb2xvciIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg1LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDYsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiIE1lbW9yeSBiYW5kd2lkdGggdXRpbGl6YXRpb24gaXMgIl0pKSwKKGEoKSgpLFcoOCwwLG51bGwsbnVsbCwxLCJzcGFuIixbXSxbWzQsImNvbG9yIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDksbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMTEsImRpdiIsW1siY2xhc3MiLCJkZXNjcmlwdGlvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwxLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIgTW9kaWZ5aW5nIHlvdXIgbW9kZWwncyBhcmNoaXRlY3R1cmUsIGRhdGEgZGltZW5zaW9ucywgYW5kIGltcHJvdmluZyB0aGUgZWZmaWNpZW5jeSBvZiBDUFUgb3BlcmF0aW9ucyBtYXkgaGVscCByZWFjaCB0aGUgVFBVJ3MgRkxPUFMgcG90ZW50aWFsLiAiXSkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbJyAiSWRsZSIgcmVwcmVzZW50cyB0aGUgcG9ydGlvbiBvZiB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgb24gZGV2aWNlIHRoYXQgaXMgaWRsZS4gJ10pKSwKKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsNiwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNiwwLG51bGwsbnVsbCwxLCJzcGFuIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiV2FzdGVkIHRpbWUgaXMgZGVmaW5lZCBieSAiXSkpLChhKCkoKSxXKDE4LDAsbnVsbCxudWxsLDEsImNvZGUiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJSdW50aW1lRnJhY3Rpb24gKiAoMSAtIG1heChGbG9wc1V0aWxpemF0aW9uLCBNZW1vcnlVdGlsaXphdGlvbikpIl0pKSwoYSgpKCksVygyMCwwLG51bGwsbnVsbCwxLCJzcGFuIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiLiJdKSksKGEoKSgpLFcoMjIsMCxudWxsLG51bGwsNDEsImRpdiIsW1siY2xhc3MiLCJjb250cm9sLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwKKGEoKSgpLFcoMjMsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wiXV0sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjQsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkJ5IGNhdGVnb3J5Il0pKSwoYSgpKCksVygyNiwwLG51bGwsbnVsbCwyLCJtYXQtc2xpZGUtdG9nZ2xlIixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUiXV0sW1s4LCJpZCIsMF0sWzEsInRhYmluZGV4IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzIsIm1hdC1jaGVja2VkIixudWxsXSxbMiwibWF0LWRpc2FibGVkIixudWxsXSxbMiwibWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwidG9nZ2xlQ2hhbmdlIl1dLApmdW5jdGlvbihiLGMpe3ZhciBkPWIuYTsidG9nZ2xlQ2hhbmdlIj09PWMmJihkLnpvPSFkLnpvLFhRKGQpKTtyZXR1cm4hMH0sdkcsdUcpKSxtaCg1MTIwLG51bGwsUHQsZnVuY3Rpb24oYil7cmV0dXJuW2JdfSxbckddKSxJKDI4LDEyMjg4MDAsbnVsbCwwLHJHLFt6LFJ6LG5lLFs4LG51bGxdLG5HLFsyLGt2XV0se2NoZWNrZWQ6WzAsImNoZWNrZWQiXX0se0Z0OiJ0b2dnbGVDaGFuZ2UifSksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsMjIsImRpdiIsW1siY2xhc3MiLCJvcHMtY29udHJvbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMCwwLG51bGwsbnVsbCwxNywiZGl2IixbWyJjbGFzcyIsIm9wcy1jb250cm9sLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIgU2hvdyB0b3BcdTAwYTAgIl0pKSwoYSgpKCksVygzMiwwLG51bGwsbnVsbCwxNCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwiY2hpbGRyZW4tY291bnQtaW5wdXQgbWF0LWZvcm0tZmllbGQiXV0sCltbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sClsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLG1oKDYxNDQsbnVsbCxXRCxudWxsLFtYRF0pLEkoMzQsNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMSx7U2I6MH0pLFgoMzM1NTQ0MzIwLDIse1RiOjB9KSxYKDYwMzk3OTc3NiwzLHtWYjowfSksWCgzMzU1NDQzMjAsNCx7V2I6MH0pLFgoNjAzOTc5Nzc2LDUse0hiOjB9KSxYKDYwMzk3OTc3Niw2LHtsYjoxfSksWCg2MDM5Nzk3NzYsNyx7YWI6MX0pLFgoNjAzOTc5Nzc2LDgse0piOjF9KSxYKDYwMzk3OTc3Niw5LHtMYjoxfSksCihhKCkoKSxXKDQ0LDAsbnVsbCwxLDIsImlucHV0IixbWyJjbGFzcyIsIm1hdC1pbnB1dC1lbGVtZW50IG1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSxbIm1hdElucHV0IiwiIl0sWyJ0eXBlIiwibnVtYmVyIl1dLFtbOCwibWluIiwwXSxbOCwibWF4IiwwXSxbOCwic3RlcCIsMF0sWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFs4LCJyZXF1aXJlZCIsMF0sWzEsInJlYWRvbmx5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsImlucHV0Il0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiw0NSkuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiw0NSkuJGEoITEpJiZlKTsKImlucHV0Ij09PWMmJihlPSExIT09RihiLDQ1KS5SZCgpJiZlKTsiaW5wdXQiPT09YyYmKGYuSGM9TWF0aC5tYXgoTWF0aC5taW4oMTAqTWF0aC5yb3VuZChkLnRhcmdldC52YWx1ZS8xMCksMTAwKSwxMCkpO3JldHVybiBlfSxudWxsLG51bGwpKSxJKDQ1LDUxMjgxOTIsbnVsbCwwLENFLFt6LE56LFs4LG51bGxdLFsyLFJ1XSxbMixVdV0scUMsWzgsbnVsbF0sZEMsVF0se3R5cGU6WzAsInR5cGUiXSx2YWx1ZTpbMSwidmFsdWUiXX0sbnVsbCksbWgoMjA0OCxbWzEsNF0sWzIsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFkoLTEsbnVsbCxbIiBcdTAwYTBvcHMgIl0pKSwoYSgpKCksVyg0OCwwLG51bGwsbnVsbCwzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQ5LDAsbnVsbCxudWxsLDIsIm1hdC1zbGlkZXIiLFtbImNsYXNzIiwibWF0LXNsaWRlciBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwic2xpZGVyIl1dLFtbOCwidGFiSW5kZXgiLAowXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzEsImFyaWEtdmFsdWVtYXgiLDBdLFsxLCJhcmlhLXZhbHVlbWluIiwwXSxbMSwiYXJpYS12YWx1ZW5vdyIsMF0sWzEsImFyaWEtb3JpZW50YXRpb24iLDBdLFsyLCJtYXQtc2xpZGVyLWRpc2FibGVkIixudWxsXSxbMiwibWF0LXNsaWRlci1oYXMtdGlja3MiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhvcml6b250YWwiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWludmVydC1tb3VzZS1jb29yZHMiLG51bGxdLFsyLCJtYXQtc2xpZGVyLXNsaWRpbmciLG51bGxdLFsyLCJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmciLG51bGxdLFsyLCJtYXQtc2xpZGVyLXZlcnRpY2FsIixudWxsXSxbMiwibWF0LXNsaWRlci1taW4tdmFsdWUiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxbW251bGwsCiJjaGFuZ2UiXSxbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdLFtudWxsLCJrZXlkb3duIl0sW251bGwsImtleXVwIl0sW251bGwsIm1vdXNlZW50ZXIiXSxbbnVsbCwic2VsZWN0c3RhcnQiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiw1MSkuc2QoKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsNTEpLnFkKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDUxKS5ZcShkKSYmZSk7ImtleXVwIj09PWMmJihlPSExIT09RihiLDUxKS5acSgpJiZlKTsibW91c2VlbnRlciI9PT1jJiYoZT0hMSE9PUYoYiw1MSkucG4oKSYmZSk7InNlbGVjdHN0YXJ0Ij09PWMmJihlPSExIT09ZC5wcmV2ZW50RGVmYXVsdCgpJiZlKTsiY2hhbmdlIj09PWMmJihmLkhjPU1hdGgubWF4KE1hdGgubWluKDEwKk1hdGgucm91bmQoZC52YWx1ZS8xMCksMTAwKSwxMCkpO3JldHVybiBlfSxERyxDRykpLG1oKDUxMjAsbnVsbCxQdCxmdW5jdGlvbihiKXtyZXR1cm5bYl19LApbQUddKSxJKDUxLDQzNzQ1MjgsbnVsbCwwLEFHLFt6LFJ6LG5lLFsyLE5BXSxbOCxudWxsXSxULExvLFsyLGt2XV0se21heDpbMCwibWF4Il0sbWluOlsxLCJtaW4iXSxzdGVwOlsyLCJzdGVwIl0sdmFsdWU6WzMsInZhbHVlIl19LHtRYToiY2hhbmdlIn0pLChhKCkoKSxXKDUyLDAsbnVsbCxudWxsLDUsImRpdiIsW1siY2xhc3MiLCJjb250cm9sIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJjb250cm9sLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJTb3J0IGJ5IHdhc3RlZCB0aW1lIl0pKSwoYSgpKCksVyg1NSwwLG51bGwsbnVsbCwyLCJtYXQtc2xpZGUtdG9nZ2xlIixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUiXV0sW1s4LCJpZCIsMF0sWzEsInRhYmluZGV4IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsCjBdLFsyLCJtYXQtY2hlY2tlZCIsbnVsbF0sWzIsIm1hdC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1zbGlkZS10b2dnbGUtbGFiZWwtYmVmb3JlIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxbW251bGwsInRvZ2dsZUNoYW5nZSJdXSxmdW5jdGlvbihiLGMpe3ZhciBkPWIuYTsidG9nZ2xlQ2hhbmdlIj09PWMmJihkLnllPSFkLnllKTtyZXR1cm4hMH0sdkcsdUcpKSxtaCg1MTIwLG51bGwsUHQsZnVuY3Rpb24oYil7cmV0dXJuW2JdfSxbckddKSxJKDU3LDEyMjg4MDAsbnVsbCwwLHJHLFt6LFJ6LG5lLFs4LG51bGxdLG5HLFsyLGt2XV0se2NoZWNrZWQ6WzAsImNoZWNrZWQiXX0se0Z0OiJ0b2dnbGVDaGFuZ2UifSksKGEoKSgpLFcoNTgsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNTksMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImNvbnRyb2wtdGl0bGUiXV0sCm51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJUb3AgOTAlIl0pKSwoYSgpKCksVyg2MSwwLG51bGwsbnVsbCwyLCJtYXQtc2xpZGUtdG9nZ2xlIixbWyJjbGFzcyIsIm1hdC1zbGlkZS10b2dnbGUiXV0sW1s4LCJpZCIsMF0sWzEsInRhYmluZGV4IiwwXSxbMSwiYXJpYS1sYWJlbCIsMF0sWzEsImFyaWEtbGFiZWxsZWRieSIsMF0sWzIsIm1hdC1jaGVja2VkIixudWxsXSxbMiwibWF0LWRpc2FibGVkIixudWxsXSxbMiwibWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLFtbbnVsbCwidG9nZ2xlQ2hhbmdlIl1dLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yi5hOyJ0b2dnbGVDaGFuZ2UiPT09YyYmKGQuUWU9IWQuUWUpO3JldHVybiEwfSx2Ryx1RykpLG1oKDUxMjAsbnVsbCxQdCxmdW5jdGlvbihiKXtyZXR1cm5bYl19LFtyR10pLEkoNjMsMTIyODgwMCxudWxsLDAsckcsW3osUnosCm5lLFs4LG51bGxdLG5HLFsyLGt2XV0se2NoZWNrZWQ6WzAsImNoZWNrZWQiXX0se0Z0OiJ0b2dnbGVDaGFuZ2UifSksKGEoKSgpLFcoNjQsMCxudWxsLG51bGwsMSwib3AtdGFibGUiLFtdLG51bGwsbnVsbCxudWxsLEhTLEdTKSksSSg2NSwxODAyMjQsbnVsbCwwLFlRLFtjSV0se3BrOlswLCJyb290Tm9kZSJdLHllOlsxLCJieVdhc3RlZCJdLFFlOlsyLCJzaG93UDkwIl0sSGM6WzMsImNoaWxkcmVuQ291bnQiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hO2IoYywyOCwwLGQuem8pO2IoYyw0NSwwLCJudW1iZXIiLGQuSGMpO2IoYyw1MSwwLDEwMCwxMCwxMCxkLkhjKTtiKGMsNTcsMCxkLnllKTtiKGMsNjMsMCxkLlFlKTtiKGMsNjUsMCxkLnBrLGQueWUsZC5RZSxkLkhjKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDQsMCxkLmRhdGEubm8pO2IoYyw1LDAsZC5kYXRhLnJJKTtiKGMsOCwwLGQuZGF0YS5Rbik7YihjLDksMCxkLmRhdGEueUcpO2IoYywyMywwLAohZC5reSk7dmFyIGU9RihjLDI4KS5pZCxmPUYoYywyOCkuZGlzYWJsZWQ/bnVsbDotMSxnPUYoYywyOCkuY2hlY2tlZCxsPUYoYywyOCkuZGlzYWJsZWQsbT0iYmVmb3JlIj09RihjLDI4KS5RaixwPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsMjgpLmlhO2IoYywyNiwwLGUsZixudWxsLG51bGwsZyxsLG0scCk7ZT0ic3RhbmRhcmQiPT1GKGMsMzQpLm87Zj0iZmlsbCI9PUYoYywzNCkubztnPSJvdXRsaW5lIj09RihjLDM0KS5vO2w9ImxlZ2FjeSI9PUYoYywzNCkubzttPUYoYywzNCkubC5mYTtwPUYoYywzNCkueGI7dmFyIHE9RihjLDM0KS5LYigpLHI9RihjLDM0KS51YigpLHY9RihjLDM0KS5VYigpLHc9RihjLDM0KS5sLmRpc2FibGVkLHg9RihjLDM0KS5sLkFiLHU9RihjLDM0KS5sLmZvY3VzZWQsRD0iYWNjZW50Ij09RihjLDM0KS5jb2xvcixIPSJ3YXJuIj09RihjLDM0KS5jb2xvcixFPUYoYywzNCkuaCgidW50b3VjaGVkIiksTj1GKGMsMzQpLmgoInRvdWNoZWQiKSxNPUYoYywKMzQpLmgoInByaXN0aW5lIiksSj1GKGMsMzQpLmgoImRpcnR5IiksUT1GKGMsMzQpLmgoInZhbGlkIiksVT1GKGMsMzQpLmgoImludmFsaWQiKSxyYT1GKGMsMzQpLmgoInBlbmRpbmciKSxFYT0hRihjLDM0KS5FYjtiKGMsMzIsMSxbZSxmLGcsbCxtLHAscSxyLHYsdyx4LHUsRCxILEUsTixNLEosUSxVLHJhLEVhXSk7ZT1GKGMsNDUpLlFkO2Y9RihjLDQ1KS5pZDtnPUYoYyw0NSkucGxhY2Vob2xkZXI7bD1GKGMsNDUpLmRpc2FibGVkO209RihjLDQ1KS5yZXF1aXJlZDtwPUYoYyw0NSkuRGQmJiFGKGMsNDUpLlZjfHxudWxsO3E9RihjLDQ1KS5GYnx8bnVsbDtyPUYoYyw0NSkuZmE7dj1GKGMsNDUpLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDQ0LDEsWzEwLDEwMCwxMCxlLGYsZyxsLG0scCxxLHIsdl0pO2U9RihjLDUxKS50YWJJbmRleDtmPUYoYyw1MSkuZGlzYWJsZWQ7Zz1GKGMsNTEpLm1heDtsPUYoYyw1MSkubWluO209RihjLDUxKS52YWx1ZTtwPUYoYyw1MSkudmVydGljYWw/CiJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiO3E9RihjLDUxKS5kaXNhYmxlZDtyPUYoYyw1MSkuQms7dj0hRihjLDUxKS52ZXJ0aWNhbDt3PUYoYyw1MSkubmQ7eD1GKGMsNTEpLnNqKCk7dT1GKGMsNTEpLlllO0Q9RihjLDUxKS55cDtIPUYoYyw1MSkudmVydGljYWw7RT1GKGMsNTEpLkhmO049RihjLDUxKS5kaXNhYmxlZHx8RihjLDUxKS5IZiYmRihjLDUxKS5GaCYmRihjLDUxKS5uZDtNPSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsNTEpLmlhO2IoYyw0OSwxLFtlLGYsZyxsLG0scCxxLHIsdix3LHgsdSxELEgsRSxOLE1dKTtlPUYoYyw1NykuaWQ7Zj1GKGMsNTcpLmRpc2FibGVkP251bGw6LTE7Zz1GKGMsNTcpLmNoZWNrZWQ7bD1GKGMsNTcpLmRpc2FibGVkO209ImJlZm9yZSI9PUYoYyw1NykuUWo7cD0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDU3KS5pYTtiKGMsNTUsMCxlLGYsbnVsbCxudWxsLGcsbCxtLHApO2U9RihjLDYzKS5pZDtmPUYoYyw2MykuZGlzYWJsZWQ/bnVsbDotMTtnPQpGKGMsNjMpLmNoZWNrZWQ7bD1GKGMsNjMpLmRpc2FibGVkO209ImJlZm9yZSI9PUYoYyw2MykuUWo7cD0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDYzKS5pYTtiKGMsNjEsMCxlLGYsbnVsbCxudWxsLGcsbCxtLHApfSl9dmFyIEtTPVFnKCJvcC1wcm9maWxlIixXUSxmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsIm9wLXByb2ZpbGUiLFtdLG51bGwsbnVsbCxudWxsLEpTLElTKSksSSgxLDQ5MTUyLG51bGwsMCxXUSxbeHcsS0ksY0ldLG51bGwsbnVsbCldLG51bGwsbnVsbCl9KTt2YXIgTFM9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlfVtfbmdob3N0LSVDT01QJV06bm90KC5kYXJrLXRoZW1lKSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7W19uZ2hvc3QtJUNPTVAlXTpub3QoLmRhcmstdGhlbWUpICAgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDpjYWxjKDEwMCUgLSA0OHB4KX1tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMH1iW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDB9dWxbX25nY29udGVudC0lQ09NUCVde2xpc3Qtc3R5bGUtcG9zaXRpb246b3V0c2lkZTttYXJnaW4tdG9wOi0xNnB4O3BhZGRpbmctaW5saW5lLXN0YXJ0OjIwcHh9dGFibGVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9dGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdWxbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowfS5pdGVtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbToxNnB4fS5pdGVtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gPiB0YWJsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXNwYWNpbmc6MH0uaXRlbS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdID4gdGRbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MH0uaXRlbS12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1sZWZ0OjhweDttaW4td2lkdGg6ODBweDt3aWR0aDoyMCU7Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6NTAwfS5pdGVtLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMHB4fS5mbG9wcy11dGlsaXphdGlvbi10b29sdGlwLXRhcmdldFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2U4NzEwYTtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2U4NzEwYTtjdXJzb3I6cG9pbnRlcn0udG9vbHRpcC1pY29uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LnRvb2x0aXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2U4NzEwYTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTJweDtsZWZ0OjRweDtmb250LXNpemU6MjBweDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4O2N1cnNvcjpwb2ludGVyfS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXXtmbGV4LWdyb3c6MTtib3JkZXI6bm9uZX0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICBtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjhweH1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpey5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZjtwYWRkaW5nOjE2cHg7bWFyZ2luOi0xNnB4IC0xNnB4IDE2cHh9Il1dLApkYXRhOnt9fSk7ZnVuY3Rpb24gTVMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMCxudWxsLG51bGwsMCkpXSxudWxsLG51bGwpfWZ1bmN0aW9uIE5TKGEpe3JldHVybiBaKDAsWyhhKCkoKSxWKDAsbnVsbCxudWxsLDAsbnVsbCxNUykpXSxudWxsLG51bGwpfWZ1bmN0aW9uIE9TKGEpe3JldHVybiBaKDAsWyhhKCkoKSxWKDAsbnVsbCxudWxsLDApKV0sbnVsbCxudWxsKX1mdW5jdGlvbiBQUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVigwLG51bGwsbnVsbCwwLG51bGwsT1MpKV0sbnVsbCxudWxsKX1mdW5jdGlvbiBRUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVigwLG51bGwsbnVsbCwwKSldLG51bGwsbnVsbCl9ZnVuY3Rpb24gUlMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMCxudWxsLG51bGwsMCxudWxsLFFTKSldLG51bGwsbnVsbCl9CmZ1bmN0aW9uIFNTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMixudWxsLFJTKSksSSgyLDU0MDY3MixudWxsLDAsQ28sW0VmXSx7dmk6WzAsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sZG06WzEsIm5nVGVtcGxhdGVPdXRsZXQiXX0sbnVsbCksTm0oMyx7UDowfSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9YihjLDMsMCxjLnBhcmVudC5jb250ZXh0LlApLGU9RihjLnBhcmVudC5wYXJlbnQucGFyZW50LDM3KTtiKGMsMiwwLGQsZSl9LG51bGwpfWZ1bmN0aW9uIFRTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxWKDAsbnVsbCxudWxsLDApKV0sbnVsbCxudWxsKX1mdW5jdGlvbiBVUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVigwLG51bGwsbnVsbCwwLG51bGwsVFMpKV0sbnVsbCxudWxsKX0KZnVuY3Rpb24gVlMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw0LCJ1bCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwzLCJsaSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDIsbnVsbCxVUykpLEkoMyw1NDA2NzIsbnVsbCwwLENvLFtFZl0se3ZpOlswLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCJdLGRtOlsxLCJuZ1RlbXBsYXRlT3V0bGV0Il19LG51bGwpLE5tKDQse1A6MH0pXSxmdW5jdGlvbihiLGMpe3ZhciBkPWIoYyw0LDAsYy5wYXJlbnQuY29udGV4dC5QKSxlPUYoYy5wYXJlbnQucGFyZW50LnBhcmVudCwzNyk7YihjLDMsMCxkLGUpfSxudWxsKX0KZnVuY3Rpb24gV1MoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMSwyNzg1MjgsbnVsbCwwLHBvLFt5Zix6Zix6LFplXSx7amk6WzAsIm5nQ2xhc3MiXX0sbnVsbCksTm0oMix7Iml0ZW0tZGVzY3JpcHRpb24iOjAsZGVzY3JpcHRpb246MX0pLChhKCkoKSxZKDMsbnVsbCxbIiAiLCIgIl0pKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1iKGMsMiwwLCJsaXN0Ij09Yy5wYXJlbnQuY29udGV4dC5QLnR5cGUsITApO2IoYywxLDAsZCl9LGZ1bmN0aW9uKGIsYyl7YihjLDMsMCxjLmNvbnRleHQuUCl9KX0KZnVuY3Rpb24gWFMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyLCJ0ZCIsW1siY2xhc3MiLCJpdGVtLXZhbHVlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbXSxbWzQsImNvbG9yIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDIsbnVsbCxbIiIsIiJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMucGFyZW50LmNvbnRleHQuUC50SSk7YihjLDIsMCxjLnBhcmVudC5jb250ZXh0LlAudmFsdWUpfSl9ZnVuY3Rpb24gWVMoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJsaSIsW1siY2xhc3MiLCJwcmltYXJ5LWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMSxudWxsLFsiIiwiIl0pKV0sbnVsbCxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlApfSl9CmZ1bmN0aW9uIFpTKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMiwidWwiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsWVMpKSxJKDIsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsMiwwLGMucGFyZW50LmNvbnRleHQuUC5nZSl9LG51bGwpfQpmdW5jdGlvbiAkUyhhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDE0LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMTEsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEwLCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCw5LCJ0ciIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCw2LCJ0ZCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxTUykpLEkoNiwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxWUykpLEkoOCwxNjM4NCwKbnVsbCwwLHVvLFtFZixEZl0se1JhOlswLCJuZ0lmIl19LG51bGwpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsV1MpKSxJKDEwLDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxYUykpLEkoMTIsMTYzODQsbnVsbCwwLHVvLFtFZixEZl0se1JhOlswLCJuZ0lmIl19LG51bGwpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsWlMpKSxJKDE0LDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsNiwwLCJsaXN0IiE9PWMuY29udGV4dC5QLnR5cGUpO2IoYyw4LDAsImxpc3QiPT09Yy5jb250ZXh0LlAudHlwZSk7YihjLDEwLDAsYy5jb250ZXh0LlAuVWgpO2IoYywxMiwwLGMuY29udGV4dC5QLnZhbHVlKTtiKGMsMTQsMCxudWxsPT1jLmNvbnRleHQuUC5nZT9udWxsOmMuY29udGV4dC5QLmdlLmxlbmd0aCl9LApudWxsKX1mdW5jdGlvbiBhVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLCRTKSksSSgxLDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFYoMCxudWxsLG51bGwsMCkpXSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlApfSxudWxsKX0KZnVuY3Rpb24gYlQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw0LCJzcGFuIixbWyJjbGFzcyIsInRvb2x0aXAtaWNvbi1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwxNjc3NzIxNixudWxsLG51bGwsMywibWF0LWljb24iLFtbImNsYXNzIiwidG9vbHRpcC1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdC10b29sdGlwLXRyaWdnZXIiXSxbIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXSxbMiwibWF0LWljb24tbm8tY29sb3IiLG51bGxdXSxudWxsLG51bGwseUUseEUpKSxJKDIsOTE1ODY1NixudWxsLDAsdkUsW3osbkUsWzgsbnVsbF0sckUsdWRdLG51bGwsbnVsbCksSSgzLDQzNDE3NjAsbnVsbCwwLGRILFtXQix6LFZBLEVmLFQsTnoscUEsUnosJEcsWzIsTkFdLFsyLGNIXV0se3Bvc2l0aW9uOlswLCJwb3NpdGlvbiJdLG1lc3NhZ2U6WzEsCiJtZXNzYWdlIl19LG51bGwpLChhKCkoKSxZKC0xLDAsWyIgaW5mbyAiXSkpXSxmdW5jdGlvbihiLGMpe2IoYywyLDApO2IoYywzLDAsImFib3ZlIixjLnBhcmVudC5jb250ZXh0LlAudG9vbHRpcCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9RihjLDIpLmlubGluZSxlPSJwcmltYXJ5IiE9PUYoYywyKS5jb2xvciYmImFjY2VudCIhPT1GKGMsMikuY29sb3ImJiJ3YXJuIiE9PUYoYywyKS5jb2xvcjtiKGMsMSwwLGQsZSl9KX0KZnVuY3Rpb24gY1QoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJiIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgxLG51bGwsWyIiLCIiXSkpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsYlQpKSxJKDMsMTYzODQsbnVsbCwwLHVvLFtFZixEZl0se1JhOlswLCJuZ0lmIl19LG51bGwpLChhKCkoKSxWKDAsbnVsbCxudWxsLDApKV0sZnVuY3Rpb24oYixjKXtiKGMsMywwLGMuY29udGV4dC5QLnRvb2x0aXApfSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5jb250ZXh0LlAudGl0bGUpfSl9CmZ1bmN0aW9uIGRUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMzUsIm1hdC1jYXJkIixbWyJjbGFzcyIsIm1hdC1jYXJkIG1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sW1syLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCwkQyxaQykpLEkoMSw0OTE1MixudWxsLDAsWEMsW1syLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksVygyLDAsbnVsbCwwLDIsIm1hdC1jYXJkLXRpdGxlIixbWyJjbGFzcyIsIm1hdC1jYXJkLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMywxNjM4NCxudWxsLDAsV0MsW10sbnVsbCxudWxsKSwoYSgpKCksWSg0LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDUsMCxudWxsLDAsMzAsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwibWF0LWNhcmQtY29udGVudCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDYsMTYzODQsbnVsbCwwLFZDLFtdLG51bGwsbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsCm51bGwsbnVsbCwyLG51bGwsTlMpKSxJKDgsNTQwNjcyLG51bGwsMCxDbyxbRWZdLHt2aTpbMCwibmdUZW1wbGF0ZU91dGxldENvbnRleHQiXSxkbTpbMSwibmdUZW1wbGF0ZU91dGxldCJdfSxudWxsKSxObSg5LHtQOjB9KSwoYSgpKCksVygxMCwwLG51bGwsbnVsbCwxOCwiZGl2IixbXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwxMSwiZGl2IixbWyJjbGFzcyIsIml0ZW0tY29udGFpbmVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEyLDAsbnVsbCxudWxsLDEwLCJ0YWJsZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsOSwidHIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDE0LDAsbnVsbCxudWxsLDgsInRkIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCwKMSwiYiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkZMT1BTIFV0aWxpemF0aW9uIl0pKSwoYSgpKCksVygxNywwLG51bGwsbnVsbCw1LCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiAoaGlnaGVyIGlzIGJldHRlciwgIl0pKSwoYSgpKCksVygxOSwxNjc3NzIxNixudWxsLG51bGwsMiwic3BhbiIsW1siY2xhc3MiLCJmbG9wcy11dGlsaXphdGlvbi10b29sdGlwLXRhcmdldCBtYXQtdG9vbHRpcC10cmlnZ2VyIl0sWyJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDIwLDQzNDE3NjAsbnVsbCwwLGRILFtXQix6LFZBLEVmLFQsTnoscUEsUnosJEcsWzIsTkFdLFsyLGNIXV0se3Bvc2l0aW9uOlswLCJwb3NpdGlvbiJdLG1lc3NhZ2U6WzEsIm1lc3NhZ2UiXX0sbnVsbCksKGEoKSgpLFkoLTEsCm51bGwsWyIgd2h5IHR3byBudW1iZXJzPyAiXSkpLChhKCkoKSxZKC0xLG51bGwsWyIgKSAiXSkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDUsInVsIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyNCwwLG51bGwsbnVsbCwxLCJsaSIsW1siY2xhc3MiLCJwcmltYXJ5LWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMjUsbnVsbCxbIlV0aWxpemF0aW9uIG9mIFRQVSBNYXRyaXggVW5pdHM6ICIsIiJdKSksKGEoKSgpLFcoMjYsMCxudWxsLG51bGwsMiwibGkiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDI3LG51bGwsWyIgQ29tcGFyZWQgdG8gUHJvZ3JhbSdzIE9wdGltYWwgRkxPUFM6ICIsIiAiXSkpLE1tKG51bGwsMCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDIsbnVsbCxQUykpLEkoMzAsNTQwNjcyLG51bGwsMCxDbyxbRWZdLHt2aTpbMCwKIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sZG06WzEsIm5nVGVtcGxhdGVPdXRsZXQiXX0sbnVsbCksTm0oMzEse1A6MH0pLChhKCkoKSxXKDMyLDAsbnVsbCxudWxsLDIsImRpdiIsW1siY2xhc3MiLCJpdGVtLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMywwLG51bGwsbnVsbCwxLCJiIixbXSxbWzQsImNvbG9yIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDM0LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDM1LDAsbnVsbCxudWxsLDAsInAiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDAsW1sic3VtbWFyeUluZm8iLDJdXSxudWxsLDAsbnVsbCxhVCkpLChhKCkoKSxWKDAsW1sidGl0bGVBbmRUb29sdGlwIiwyXV0sbnVsbCwwLG51bGwsY1QpKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT1iKGMsOSwwLGQuQWYpLGY9RihjLDM2KTtiKGMsOCwwLGUsZik7YihjLDIwLDAsImFib3ZlIiwKZC5NUCk7ZT1iKGMsMzEsMCxkLkF0KTtmPUYoYywzNik7YihjLDMwLDAsZSxmKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDEpLmlhO2IoYywwLDAsZSk7YihjLDQsMCxkLnRpdGxlKTtiKGMsMTAsMCwhZC5naSk7YihjLDI1LDAsZC5ERyk7YihjLDI3LDAsZC5CRik7YihjLDMzLDAsZC5qeik7YihjLDM0LDAsZC5reil9KX07dmFyIGVUPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlO2JvcmRlci1yaWdodDoxcHggc29saWQgI2VlZTtmbGV4LWdyb3c6MX1bX25naG9zdC0lQ09NUCVdOm5vdCguZGFyay10aGVtZSkgICBtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lICFpbXBvcnRhbnQ7bWFyZ2luOjhweH1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpe1tfbmdob3N0LSVDT01QJV06bm90KC5kYXJrLXRoZW1lKSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6Y2FsYygxMDAlIC0gNDhweCl9bWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Y29sb3I6IzAwMDtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo0MDB9Yltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwfXVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaXN0LXN0eWxlLXBvc2l0aW9uOm91dHNpZGU7bWFyZ2luLXRvcDotMTZweDtwYWRkaW5nLWlubGluZS1zdGFydDoyMHB4fS5ib3R0bGVuZWNrLXN0YXRlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjEwcHggMH0uYm90dGxlbmVjay10aXBzW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MTZweCAwfS5kb2N1bWVudGF0aW9uLXRpcHNbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoxNnB4IDB9LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVde2JvcmRlcjpub25lfS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzNmNTFiNTtjb2xvcjojZmZmO3BhZGRpbmc6MTZweDttYXJnaW46LTE2cHggLTE2cHggMTZweH0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICAuYm90dGxlbmVjay1zdGF0ZW1lbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGRlcjtmb250LXN0eWxlOml0YWxpY30iXV0sCmRhdGE6e319KTtmdW5jdGlvbiBmVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDAsImxpIixbWyJjbGFzcyIsImJvdHRsZW5lY2stc3RhdGVtZW50Il1dLFtbNCwiY29sb3IiLG51bGxdLFs4LCJpbm5lckhUTUwiLDFdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuY29udGV4dC5QLmNvbG9yLGMuY29udGV4dC5QLnZhbHVlKX0pfWZ1bmN0aW9uIGdUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMCwibGkiLFtdLFtbOCwiaW5uZXJIVE1MIiwxXV0sW1tudWxsLCJjbGljayJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImNsaWNrIj09PWMmJihlPSExIT09Zi5TRyhkKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDAsMCxjLmNvbnRleHQuUCl9KX0KZnVuY3Rpb24gaFQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyLCJ1bCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxnVCkpLEkoMiwyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe2IoYywyLDAsYy5wYXJlbnQuY29udGV4dC5QLnZtKX0sbnVsbCl9ZnVuY3Rpb24gaVQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwwLCJsaSIsW10sW1s4LCJpbm5lckhUTUwiLDFdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuY29udGV4dC5QKX0pfQpmdW5jdGlvbiBqVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDIsInVsIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGlUKSksSSgyLDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCldLGZ1bmN0aW9uKGIsYyl7YihjLDIsMCxjLnBhcmVudC5jb250ZXh0LlAudm0pfSxudWxsKX0KZnVuY3Rpb24ga1QoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw4LCJkaXYiLFtbImNsYXNzIiwiYm90dGxlbmVjay10aXBzIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMSwyNzg1MjgsbnVsbCwwLEJvLFt6LHpmLFplXSx7dWk6WzAsIm5nU3R5bGUiXX0sbnVsbCksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwyLCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDEsImIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDQsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxoVCkpLEkoNiwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxqVCkpLEkoOCwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXX0sbnVsbCldLGZ1bmN0aW9uKGIsCmMpe2IoYywxLDAsYy5jb250ZXh0LlAuc3R5bGUpO2IoYyw2LDAsYy5jb250ZXh0LlAuT3opO2IoYyw4LDAsIWMuY29udGV4dC5QLk96KX0sZnVuY3Rpb24oYixjKXtiKGMsNCwwLGMuY29udGV4dC5QLnRpdGxlKX0pfQpmdW5jdGlvbiBsVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDExLCJtYXQtY2FyZCIsW1siY2xhc3MiLCJtYXQtY2FyZCBtYXQtZm9jdXMtaW5kaWNhdG9yIl1dLFtbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsJEMsWkMpKSxJKDEsNDkxNTIsbnVsbCwwLFhDLFtbMixrdl1dLG51bGwsbnVsbCksKGEoKSgpLFcoMiwwLG51bGwsMCwyLCJtYXQtY2FyZC10aXRsZSIsW1siY2xhc3MiLCJtYXQtY2FyZC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSxJKDMsMTYzODQsbnVsbCwwLFdDLFtdLG51bGwsbnVsbCksKGEoKSgpLFkoNCxudWxsLFsiIiwiIl0pKSwoYSgpKCksVyg1LDAsbnVsbCwwLDYsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50IG1hdC1jYXJkLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg2LDE2Mzg0LG51bGwsMCxWQyxbXSxudWxsLG51bGwpLAooYSgpKCksVyg3LDAsbnVsbCxudWxsLDIsInVsIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLGZUKSksSSg5LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxrVCkpLEkoMTEsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDksMCxkLnh6KTtiKGMsMTEsMCxkLmhJKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDEpLmlhO2IoYywwLDAsZSk7YihjLDQsMCxkLnRpdGxlKX0pfTt2YXIgbVQ9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlO2ZsZXgtZ3JvdzoxfVtfbmdob3N0LSVDT01QJV06bm90KC5kYXJrLXRoZW1lKSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7W19uZ2hvc3QtJUNPTVAlXTpub3QoLmRhcmstdGhlbWUpICAgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDpjYWxjKDEwMCUgLSA0OHB4KX1tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMH1iW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDB9LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVde2JvcmRlcjpub25lfS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzNmNTFiNTtjb2xvcjojZmZmO3BhZGRpbmc6MTZweDttYXJnaW46LTE2cHggLTE2cHggMTZweH0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICAua2V5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo1MDB9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIG5UKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMjgsIm1hdC1jYXJkIixbWyJjbGFzcyIsIm1hdC1jYXJkIG1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sW1syLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCwkQyxaQykpLEkoMSw0OTE1MixudWxsLDAsWEMsW1syLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksVygyLDAsbnVsbCwwLDIsIm1hdC1jYXJkLXRpdGxlIixbWyJjbGFzcyIsIm1hdC1jYXJkLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoMywxNjM4NCxudWxsLDAsV0MsW10sbnVsbCxudWxsKSwoYSgpKCksWSg0LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDUsMCxudWxsLDAsMjMsIm1hdC1jYXJkLWNvbnRlbnQiLFtbImNsYXNzIiwicHJpbWFyeS1jb250ZW50IG1hdC1jYXJkLWNvbnRlbnQiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg2LDE2Mzg0LG51bGwsMCxWQyxbXSxudWxsLApudWxsKSxNbShudWxsLDApLChhKCkoKSxXKDgsMCxudWxsLG51bGwsNSwicCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoOSwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsImtleS1sYWJlbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiTnVtYmVyIG9mIEhvc3RzIHVzZWQiXSkpLChhKCkoKSxZKC0xLG51bGwsWyI6ICJdKSksKGEoKSgpLFcoMTIsMCxudWxsLG51bGwsMSwic3BhbiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMTMsbnVsbCxbIiIsIiJdKSksTW0obnVsbCwxKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCw1LCJwIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNiwwLG51bGwsbnVsbCwxLCJzcGFuIixbWyJjbGFzcyIsImtleS1sYWJlbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiRGV2aWNlIHR5cGUiXSkpLAooYSgpKCksWSgtMSxudWxsLFsiOiAiXSkpLChhKCkoKSxXKDE5LDAsbnVsbCxudWxsLDEsInNwYW4iLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDIwLG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDIxLDAsbnVsbCxudWxsLDUsInAiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIyLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwia2V5LWxhYmVsIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJOdW1iZXIgb2YgZGV2aWNlIGNvcmVzIl0pKSwoYSgpKCksWSgtMSxudWxsLFsiOiAiXSkpLChhKCkoKSxXKDI1LDAsbnVsbCxudWxsLDEsInNwYW4iLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDI2LG51bGwsWyIiLCIiXSkpLE1tKG51bGwsMiksKGEoKSgpLFcoMjgsMCxudWxsLG51bGwsMCwicCIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYiwKYyl7dmFyIGQ9Yy5hLGU9Ik5vb3BBbmltYXRpb25zIj09PUYoYywxKS5pYTtiKGMsMCwwLGUpO2IoYyw0LDAsZC50aXRsZSk7YihjLDEzLDAsZC5VRik7YihjLDIwLDAsZC5kZXZpY2VUeXBlKTtiKGMsMjYsMCxkLnFGKX0pfTt2YXIgb1Q9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWVlfVtfbmdob3N0LSVDT01QJV06bm90KC5kYXJrLXRoZW1lKSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmUgIWltcG9ydGFudDttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7W19uZ2hvc3QtJUNPTVAlXTpub3QoLmRhcmstdGhlbWUpICAgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo1MDBweH19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDpjYWxjKDEwMCUgLSA0OHB4KX1tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMH0uY2hhcnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIGF1dG87bWF4LXdpZHRoOjgwMHB4fS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXXtib3JkZXI6bm9uZX0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICBtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjhweH1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpey5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzZjUxYjU7Y29sb3I6I2ZmZjtwYWRkaW5nOjE2cHg7bWFyZ2luOi0xNnB4IC0xNnB4IDE2cHh9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIHBUKGEpe3JldHVybiBaKDAsW1goNjcxMDg4NjQwLDEse3ljOjB9KSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDcsIm1hdC1jYXJkIixbWyJjbGFzcyIsIm1hdC1jYXJkIG1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sW1syLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCwkQyxaQykpLEkoMiw0OTE1MixudWxsLDAsWEMsW1syLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksVygzLDAsbnVsbCwwLDIsIm1hdC1jYXJkLXRpdGxlIixbWyJjbGFzcyIsIm1hdC1jYXJkLXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNCwxNjM4NCxudWxsLDAsV0MsW10sbnVsbCxudWxsKSwoYSgpKCksWSg1LG51bGwsWyIiLCIiXSkpLChhKCkoKSxXKDYsMCxudWxsLDAsMiwibWF0LWNhcmQtY29udGVudCIsW1siY2xhc3MiLCJtYXQtY2FyZC1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLEkoNywxNjM4NCxudWxsLDAsVkMsW10sbnVsbCwKbnVsbCksKGEoKSgpLFcoOCwwLFtbMSwwXSxbImNoYXJ0IiwxXV0sbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQiXV0sW1s0LCJoZWlnaHQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD1jLmEsZT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDIpLmlhO2IoYywxLDAsZSk7YihjLDUsMCxkLnRpdGxlKTtiKGMsOCwwLGQuaGVpZ2h0KyJweCIpfSl9O3ZhciBxVD1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV06bm90KC5kYXJrLXRoZW1lKSAgIG1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZSAhaW1wb3J0YW50O21hcmdpbjo4cHg7bWFyZ2luOjB9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTE0MHB4KXtbX25naG9zdC0lQ09NUCVdOm5vdCguZGFyay10aGVtZSkgICBtYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6NTAwcHh9fW1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46OHB4IDhweCAwfW1hdC1wYW5lbC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjQwMDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fW1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2VlZSAhaW1wb3J0YW50fS5tYXQtZXhwYW5kZWRbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXXtib3JkZXI6bm9uZX0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICBtYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46OHB4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExNDBweCl7LmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17bWluLXdpZHRoOjUwMHB4fX0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICBtYXQtcGFuZWwtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2ZmZn0uZGFyay10aGVtZVtfbmdob3N0LSVDT01QJV0gICBtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojM2Y1MWI1O21hcmdpbjowfS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmRhcmstdGhlbWVbX25naG9zdC0lQ09NUCVdICAgbWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izc4ODVjYiAhaW1wb3J0YW50fS5kYXJrLXRoZW1lW19uZ2hvc3QtJUNPTVAlXSAgIC50YWJsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoxOHB4fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiByVChhKXtyZXR1cm4gWigwLFtYKDY3MTA4ODY0MCwxLHtCZjowfSksKGEoKSgpLFcoMSwxNjc3NzIxNixudWxsLG51bGwsMTAsIm1hdC1leHBhbnNpb24tcGFuZWwiLFtbImNsYXNzIiwibWF0LWV4cGFuc2lvbi1wYW5lbCJdXSxbWzIsIm1hdC1leHBhbmRlZCIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXSxbMiwibWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5nIixudWxsXV0sbnVsbCxudWxsLE9ELE1EKSksSSgyLDE3NTMwODgsbnVsbCwxLEZELFtbMyxDRF0sbmUsSEEsRWYsTG8sWzIsa3ZdLFsyLEVEXV0se01hOlswLCJleHBhbmRlZCJdfSxudWxsKSxYKDYwMzk3OTc3NiwyLHt6djowfSksbWgoMjU2LG51bGwsQ0Qsdm9pZCAwLFtdKSwoYSgpKCksVyg1LDAsbnVsbCwwLDQsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIixbWyJjbGFzcyIsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIG1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbInJvbGUiLAoiYnV0dG9uIl1dLFtbMSwiaWQiLDBdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtY29udHJvbHMiLDBdLFsxLCJhcmlhLWV4cGFuZGVkIiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzIsIm1hdC1leHBhbmRlZCIsbnVsbF0sWzIsIm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1hZnRlciIsbnVsbF0sWzIsIm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmUiLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzQsImhlaWdodCIsbnVsbF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwia2V5ZG93biJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDYpLlR3KCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDYpLnRDKGQpJiZlKTtyZXR1cm4gZX0sTEQsSkQpKSxJKDYsNDM3NDUyOCxudWxsLDAsR0QsW0ZELHosUnosbmUsWzIsRURdLFsyLGt2XV0sbnVsbCxudWxsKSwoYSgpKCksClcoNywwLG51bGwsMCwyLCJtYXQtcGFuZWwtdGl0bGUiLFtbImNsYXNzIiwibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksSSg4LDE2Mzg0LG51bGwsMCxIRCxbXSxudWxsLG51bGwpLChhKCkoKSxZKDksbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoMTAsMCxbWzEsMF0sWyJ0YWJsZSIsMV1dLDEsMCwiZGl2IixbWyJjbGFzcyIsInRhYmxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDExLDAsbnVsbCwxLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKV0sZnVuY3Rpb24oYixjKXtiKGMsMiwwLGMuYS5lUSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9RihjLDIpLk1hLGY9Ik5vb3BBbmltYXRpb25zIj09PUYoYywyKS5pYSxnPUYoYywyKS5VQigpO2IoYywxLDAsZSxmLGcpO2U9RihjLDYpLkJhLmJ2O2Y9RihjLDYpLmRpc2FibGVkPy0xOjA7Zz1GKGMsNikuQmEuaWQ7dmFyIGw9CkYoYyw2KS5CYS5NYSxtPUYoYyw2KS5CYS5kaXNhYmxlZCxwPUYoYyw2KS5CYS5NYSxxPSJhZnRlciI9PT1GKGMsNikuQmEud20scj0iYmVmb3JlIj09PUYoYyw2KS5CYS53bSx2PSJOb29wQW5pbWF0aW9ucyI9PT1GKGMsNikuaWEsdz1GKGMsNikuRUIoKTtiKGMsNSwwLGUsZixnLGwsbSxwLHEscix2LHcpO2IoYyw5LDAsZC50aXRsZSl9KX07dmFyIHNUPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDt3aWR0aDoxMDAlfS5sZWZ0LWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDozMy4zMzMlfS5yaWdodC1jb2x1bW5bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47d2lkdGg6NjYuNjY3JX0uZnVsbC1jb2x1bW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDoxcHggc29saWQgI2VlZTt3aWR0aDoxMDAlfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDg2MHB4KXtbX25naG9zdC0lQ09NUCVde3dpZHRoOmZpdC1jb250ZW50fX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTQwcHgpey5sZWZ0LWNvbHVtbltfbmdjb250ZW50LSVDT01QJV0sIC5yaWdodC1jb2x1bW5bX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9fSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiB0VChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDE2LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGlhZ25vc3RpY3MtdmlldyIsW10sbnVsbCxudWxsLG51bGwseEsscUspKSxJKDIsNDkxNTIsbnVsbCwwLHBLLFtdLHtkaWFnbm9zdGljczpbMCwiZGlhZ25vc3RpY3MiXX0sbnVsbCksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxMywiZGl2IixbWyJjbGFzcyIsImNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJsZWZ0LWNvbHVtbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDEsInBlcmZvcm1hbmNlLXN1bW1hcnkiLFtdLG51bGwsbnVsbCxudWxsLGRULExTKSksSSg2LDU3MzQ0MCxudWxsLDAsaVIsW10se2tmOlswLCJnZW5lcmFsQW5hbHlzaXMiXSwKcWI6WzEsImlucHV0UGlwZWxpbmVBbmFseXNpcyJdLGdlOlsyLCJwcm9wZXJ0eVZhbHVlcyJdfSxudWxsKSwoYSgpKCksVyg3LDAsbnVsbCxudWxsLDEsInJ1bi1lbnZpcm9ubWVudC12aWV3IixbXSxudWxsLG51bGwsbnVsbCxuVCxtVCkpLEkoOCw0OTE1MixudWxsLDAsclIsW10se3J1bkVudmlyb25tZW50OlswLCJydW5FbnZpcm9ubWVudCJdfSxudWxsKSwoYSgpKCksVyg5LDAsbnVsbCxudWxsLDQsImRpdiIsW1siY2xhc3MiLCJyaWdodC1jb2x1bW4iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMTAsMCxudWxsLG51bGwsMSwic3RlcC10aW1lLWdyYXBoIixbXSxudWxsLFtbIndpbmRvdyIsInJlc2l6ZSJdXSxmdW5jdGlvbihiLGMpeyJ3aW5kb3c6cmVzaXplIj09PWMmJkYoYiwxMSkuTGEoKTtyZXR1cm4hMH0scFQsb1QpKSxJKDExLDQ3Njc3NDQsbnVsbCwwLHhSLFtdLHtxYjpbMCwiaW5wdXRQaXBlbGluZUFuYWx5c2lzIl19LG51bGwpLChhKCkoKSxXKDEyLAowLG51bGwsbnVsbCwxLCJyZWNvbW1lbmRhdGlvbi1yZXN1bHQtdmlldyIsW10sbnVsbCxudWxsLG51bGwsbFQsZVQpKSxJKDEzLDU3MzQ0MCxudWxsLDAsb1IsW2NJXSx7ZXA6WzAsInJlY29tbWVuZGF0aW9uUmVzdWx0Il19LG51bGwpLChhKCkoKSxXKDE0LDAsbnVsbCxudWxsLDIsImRpdiIsW1siY2xhc3MiLCJmdWxsLWNvbHVtbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNSwwLG51bGwsbnVsbCwxLCJ0b3Atb3BzLXRhYmxlIixbXSxudWxsLG51bGwsbnVsbCxyVCxxVCkpLEkoMTYsNDc2Nzc0NCxudWxsLDAselIsW10se2tmOlswLCJnZW5lcmFsQW5hbHlzaXMiXSxxYjpbMSwiaW5wdXRQaXBlbGluZUFuYWx5c2lzIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsMiwwLGQuZGlhZ25vc3RpY3MpO2IoYyw2LDAsZC5rZixkLnFiLGQuU3IpO2IoYyw4LDAsZC5ydW5FbnZpcm9ubWVudCk7YihjLDExLDAsZC5xYik7YihjLDEzLDAsZC5lcCk7CmIoYywxNiwwLGQua2YsZC5xYil9LG51bGwpfXZhciB1VD1RZygib3ZlcnZpZXciLGZSLGZ1bmN0aW9uKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMSwib3ZlcnZpZXciLFtdLG51bGwsbnVsbCxudWxsLHRULHNUKSksSSgxLDQ5MTUyLG51bGwsMCxmUixbeHcsS0ksY0ldLG51bGwsbnVsbCldLG51bGwsbnVsbCl9KTt2YXIgdlQ9Y2coe1Q6MCxnOltbIltfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW46MjBweCAwfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvO292ZXJmbG93LXk6aGlkZGVufS5jaGFydFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjMwMHB4fSJdXSxkYXRhOnt9fSk7ZnVuY3Rpb24gd1QoYSl7cmV0dXJuIFooMCxbWCg2NzEwODg2NDAsMSx7eWM6MH0pLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygyLDAsW1sxLDBdLFsiY2hhcnQiLDFdXSxudWxsLDAsImRpdiIsW1siY2xhc3MiLCJjaGFydCJdXSxbWzQsIndpZHRoIixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDIsMCxjLmEuRngrInB4Iil9KX07dmFyIHhUPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3BhZGRpbmctdG9wOjIwcHh9LnRvcG9sb2d5LWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzttYXJnaW4tdG9wOi0zMnB4fS5jb250cm9sLXJvdy1sZWZ0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7bWFyZ2luLXJpZ2h0OjMycHg7ZmxleC1mbG93OnJvdyBub3dyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2xpbmUtaGVpZ2h0OjUwcHg7dGV4dC1hbGlnbjpib3R0b207anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnR9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowO2hlaWdodDowfS5sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAudGl0bGVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDotN3B4O2xlZnQ6LTE1cHg7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MTRweDt3aWR0aDozMHB4O3RleHQtYWxpZ246Y2VudGVyfS5ob3N0W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjhweDtib3JkZXI6MXB4IHNvbGlkICMzMzM7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6MXB4IHNvbGlkICMzMzM7d2lkdGg6MTVweDtoZWlnaHQ6MzBweDtiYWNrZ3JvdW5kLWNvbG9yOiMxZDkxYzA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDFzfS5jb2xvci10YWJsZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDpub3dyYXA7cGFkZGluZzoyMHB4IDIwcHggMH0uY29sb3ItY2VsbFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMjJweDtib3JkZXI6MXB4IHNvbGlkICMzMzM7d2lkdGg6MTVweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjRweH0uY29sb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjYwcHg7bWFyZ2luOjhweCAwO3RleHQtYWxpZ246Y2VudGVyfS5zZWxlY3RlZC1tZXRyaWMtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtwYWRkaW5nLXJpZ2h0OjhweH0uc2VsZWN0ZWQtbWV0cmljLWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGQ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMil9LmNoYW5uZWwtaW5wdXRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjcwcHh9LmFycm93LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0uYXJyb3ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHN2Z1tfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0uYXJyb3dbX25nY29udGVudC0lQ09NUCVde2ZpbGw6cmVkO3RyYW5zZm9ybS1vcmlnaW46MHB4IDBweH0ubm9kZS10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cGFkZGluZzoxMHB4O2JvcmRlci1yYWRpdXM6OHB4O3dpZHRoOjIwMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjIwcHg7Zm9udC1mYW1pbHk6c2Fucy1zZXJpZjtwb2ludGVyLWV2ZW50czpub25lfS5ub2RlLXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdID4gcHJlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MDt3aGl0ZS1zcGFjZTpwcmUtd3JhcH0uY29udHJvbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2OH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24geVQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCw0LCJidXR0b24iLFtbImNsYXNzIiwibWF0LWZvY3VzLWluZGljYXRvciJdLFsibWF0LW1lbnUtaXRlbSIsIiJdXSxbWzEsInJvbGUiLDBdLFsyLCJtYXQtbWVudS1pdGVtIixudWxsXSxbMiwibWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCIsbnVsbF0sWzIsIm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyIixudWxsXSxbMSwidGFiaW5kZXgiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMSwiZGlzYWJsZWQiLDBdXSxbW251bGwsImNsaWNrIl0sW251bGwsIm1vdXNlZW50ZXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJjbGljayI9PT1jJiYoZT0hMSE9PUYoYiwzKS5CQShkKSYmZSk7Im1vdXNlZW50ZXIiPT09YyYmKGU9ITEhPT1GKGIsMykuUEIoKSYmZSk7ImNsaWNrIj09PWMmJihlPSExIT09TlIoZixiLmNvbnRleHQuUC5rZXksYi5jb250ZXh0LlAubGFiZWwpJiZlKTsKcmV0dXJuIGV9LFhFLFdFKSksSSgxLDI3ODUyOCxudWxsLDAscG8sW3lmLHpmLHosWmVdLHtqaTpbMCwibmdDbGFzcyJdfSxudWxsKSxObSgyLHsic2VsZWN0ZWQtbWV0cmljLWl0ZW0iOjB9KSxJKDMsNDM3NDUyOCxbWzEsNF0sWzIsNF1dLDAsR0UsW3osTG8sUnosWzIsRUVdXSxudWxsLG51bGwpLChhKCkoKSxZKDQsMCxbIiAiLCIgIl0pKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1iKGMsMiwwLGMuYS5wcD09PWMuY29udGV4dC5QLmtleSk7YihjLDEsMCxkKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1GKGMsMykucm9sZSxlPUYoYywzKS5kdixmPUYoYywzKS5adyxnPUYoYywzKS5UYygpLGw9RihjLDMpLmRpc2FibGVkLnRvU3RyaW5nKCksbT1GKGMsMykuZGlzYWJsZWR8fG51bGw7YihjLDAsMCxkLCEwLGUsZixnLGwsbSk7YihjLDQsMCxjLmNvbnRleHQuUC5sYWJlbCl9KX0KZnVuY3Rpb24gelQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwyLCJkaXYiLFtbImNsYXNzIiwibGFiZWwiXV0sW1s0LCJ0b3AiLG51bGxdLFs0LCJsZWZ0IixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsInRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDIsbnVsbCxbIiIsIiJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuY29udGV4dC5QLnkrInB4IixjLmNvbnRleHQuUC54KyJweCIpO2IoYywyLDAsYy5jb250ZXh0LlAuaWQpfSl9CmZ1bmN0aW9uIEFUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImhvc3QiXV0sW1s0LCJ3aWR0aCIsbnVsbF0sWzQsImhlaWdodCIsbnVsbF0sWzQsInRvcCIsbnVsbF0sWzQsImxlZnQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDAsMCxkLk5qKyJweCIsZC5NaisicHgiLGMuY29udGV4dC5QLnkrInB4IixjLmNvbnRleHQuUC54KyJweCIpfSl9CmZ1bmN0aW9uIEJUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsIm5vZGUiXV0sW1s4LCJpZCIsMF0sWzQsInRvcCIsbnVsbF0sWzQsImxlZnQiLG51bGxdXSxbW251bGwsIm1vdXNlZW50ZXIiXSxbbnVsbCwibW91c2VsZWF2ZSJdXSxmdW5jdGlvbihiLGMpe3ZhciBkPSEwLGU9Yi5hOyJtb3VzZWVudGVyIj09PWMmJihkPSExIT09T1IoZSxiLmNvbnRleHQuUC5pZCkmJmQpOyJtb3VzZWxlYXZlIj09PWMmJihlLnNhPSIiKTtyZXR1cm4gZH0sbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuY29udGV4dC5QLmlkLGMuY29udGV4dC5QLnkrInB4IixjLmNvbnRleHQuUC54KyJweCIpfSl9CmZ1bmN0aW9uIENUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImFycm93LWNvbnRhaW5lciJdXSxbWzQsInRvcCIsbnVsbF0sWzQsImxlZnQiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMSwwLG51bGwsbnVsbCwzLCI6c3ZnOnN2ZyIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwyLCI6c3ZnOmciLFtbImNsYXNzIiwiYXJyb3ciXV0sW1s0LCJ0cmFuc2Zvcm0iLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwwLCI6c3ZnOnBvbHlnb24iLFtbInBvaW50cyIsIjMsMCAtNiwtNSAtNiw1Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMCwiOnN2Zzpwb2x5Z29uIixbWyJwb2ludHMiLCIwLC0xLjUgLTEwMCwtMS41LCAtMTAwLDEuNSAwLDEuNSJdXSxbWzQsInRyYW5zZm9ybSIsCm51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMCwwLGMuY29udGV4dC5QLnkrInB4IixjLmNvbnRleHQuUC54KyJweCIpO2IoYywyLDAsInJvdGF0ZSgiK2MuY29udGV4dC5QLnJvdGF0ZSsicmFkKSIpO2IoYyw0LDAsInNjYWxlWCgiK2MuY29udGV4dC5QLnNjYWxlKyIpIil9KX0KZnVuY3Rpb24gRFQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwzLCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImNvbG9yLWNlbGwiXV0sW1s0LCJiYWNrZ3JvdW5kQ29sb3IiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiY29sb3ItbGFiZWwiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMyxudWxsLFsiXHUyMjY1ICIsIiJdKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMSwwLGMuY29udGV4dC5QLmNvbG9yKTtiKGMsMywwLGMuY29udGV4dC5QLmxhYmVsKX0pfQpmdW5jdGlvbiBFVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDU3LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDEsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgyLG51bGwsWyIgIiwiICIsIngiLCIgIl0pKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDM5LCJkaXYiLFtbImNsYXNzIiwidG9wb2xvZ3ktaGVhZGVyIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQsMCxudWxsLG51bGwsMTcsImRpdiIsW1siY2xhc3MiLCJjb250cm9sLXJvdy1sZWZ0Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsMSwic3BhbiIsW1siY2xhc3MiLCJzZWxlY3RlZC1tZXRyaWMtbGFiZWwgY29udHJvbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSg2LG51bGwsClsiIiwiIl0pKSwoYSgpKCksVyg3LDE2Nzc3MjE2LG51bGwsbnVsbCw1LCJidXR0b24iLFtbImFyaWEtaGFzcG9wdXAiLCJ0cnVlIl0sWyJhcmlhLWxhYmVsIiwiTWV0cmljIG1lbnUiXSxbImNsYXNzIiwibWF0LWZvY3VzLWluZGljYXRvciBtYXQtbWVudS10cmlnZ2VyIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiXV0sW1sxLCJkaXNhYmxlZCIsMF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXSxbMSwiYXJpYS1leHBhbmRlZCIsMF0sWzEsImFyaWEtY29udHJvbHMiLDBdXSxbW251bGwsIm1vdXNlZG93biJdLFtudWxsLCJrZXlkb3duIl0sW251bGwsImNsaWNrIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMDsibW91c2Vkb3duIj09PWMmJihlPSExIT09RihiLDkpLlFCKGQpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiw5KS5IYShkKSYmZSk7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDkpLk1CKGQpJiZlKTtyZXR1cm4gZX0sVUMsVEMpKSxJKDgsNDM3NDUyOCwKbnVsbCwwLFJDLFt6LFJ6LFsyLGt2XV0sbnVsbCxudWxsKSxJKDksMTE5NjAzMixudWxsLDAsU0UsW1dCLHosRWYsT0UsWzIsTUVdLFs4LG51bGxdLFsyLE5BXSxSel0se3VhOlswLCJtZW51Il19LG51bGwpLChhKCkoKSxXKDEwLDAsbnVsbCwwLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIG5vdHJhbnNsYXRlIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXSxbMiwibWF0LWljb24tbm8tY29sb3IiLG51bGxdXSxudWxsLG51bGwseUUseEUpKSxJKDExLDkxNTg2NTYsbnVsbCwwLHZFLFt6LG5FLFs4LG51bGxdLHJFLHVkXSxudWxsLG51bGwpLChhKCkoKSxZKC0xLDAsWyJhcnJvd19kcm9wX2Rvd24iXSkpLChhKCkoKSxXKDEzLDAsbnVsbCxudWxsLDgsIm1hdC1tZW51IixbXSxudWxsLG51bGwsbnVsbCwkRSxZRSkpLG1oKDYxNDQsbnVsbCxNRSxudWxsLFtORV0pLG1oKDYxNDQsbnVsbCxFRSxudWxsLFtNRV0pLEkoMTYsMTI5NDMzNixbWyJtZWN0aWNNZW51IiwKNF1dLDMsTkUsW3osVCxJRV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxLHtadDoxfSksWCg2MDM5Nzk3NzYsMix7aXRlbXM6MX0pLFgoNjAzOTc5Nzc2LDMse1NnOjB9KSwoYSgpKCksVigxNjc3NzIxNixudWxsLDAsMSxudWxsLHlUKSksSSgyMSwyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpLChhKCkoKSxXKDIyLDAsbnVsbCxudWxsLDIwLCJkaXYiLFtbImNsYXNzIiwiY29udHJvbC1yb3ctbGVmdCAiXV0sW1s0LCJ2aXNpYmlsaXR5IixudWxsXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDEsInNwYW4iLFtbImNsYXNzIiwiY29udHJvbCJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiUExFQVNFIFNFTEVDVCBBIENIQU5ORUwgSURcdTAwYTAiXSkpLChhKCkoKSxXKDI1LDAsbnVsbCxudWxsLDIsIm1hdC1zbGlkZXIiLFtbImNsYXNzIiwibWF0LXNsaWRlciBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sClsicm9sZSIsInNsaWRlciJdXSxbWzgsInRhYkluZGV4IiwwXSxbMSwiYXJpYS1kaXNhYmxlZCIsMF0sWzEsImFyaWEtdmFsdWVtYXgiLDBdLFsxLCJhcmlhLXZhbHVlbWluIiwwXSxbMSwiYXJpYS12YWx1ZW5vdyIsMF0sWzEsImFyaWEtb3JpZW50YXRpb24iLDBdLFsyLCJtYXQtc2xpZGVyLWRpc2FibGVkIixudWxsXSxbMiwibWF0LXNsaWRlci1oYXMtdGlja3MiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhvcml6b250YWwiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWludmVydC1tb3VzZS1jb29yZHMiLG51bGxdLFsyLCJtYXQtc2xpZGVyLXNsaWRpbmciLG51bGxdLFsyLCJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmciLG51bGxdLFsyLCJtYXQtc2xpZGVyLXZlcnRpY2FsIixudWxsXSxbMiwibWF0LXNsaWRlci1taW4tdmFsdWUiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLApudWxsXV0sW1tudWxsLCJjaGFuZ2UiXSxbbnVsbCwiZm9jdXMiXSxbbnVsbCwiYmx1ciJdLFtudWxsLCJrZXlkb3duIl0sW251bGwsImtleXVwIl0sW251bGwsIm1vdXNlZW50ZXIiXSxbbnVsbCwic2VsZWN0c3RhcnQiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiwyNykuc2QoKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMjcpLnFkKCkmJmUpOyJrZXlkb3duIj09PWMmJihlPSExIT09RihiLDI3KS5ZcShkKSYmZSk7ImtleXVwIj09PWMmJihlPSExIT09RihiLDI3KS5acSgpJiZlKTsibW91c2VlbnRlciI9PT1jJiYoZT0hMSE9PUYoYiwyNykucG4oKSYmZSk7InNlbGVjdHN0YXJ0Ij09PWMmJihlPSExIT09ZC5wcmV2ZW50RGVmYXVsdCgpJiZlKTsiY2hhbmdlIj09PWMmJihlPSExIT09UFIoZixkLnZhbHVlKSYmZSk7cmV0dXJuIGV9LERHLENHKSksbWgoNTEyMCxudWxsLFB0LGZ1bmN0aW9uKGIpe3JldHVybltiXX0sCltBR10pLEkoMjcsNDM3NDUyOCxudWxsLDAsQUcsW3osUnosbmUsWzIsTkFdLFs4LG51bGxdLFQsTG8sWzIsa3ZdXSx7bWF4OlswLCJtYXgiXSxtaW46WzEsIm1pbiJdLHN0ZXA6WzIsInN0ZXAiXSx2YWx1ZTpbMywidmFsdWUiXX0se1FhOiJjaGFuZ2UifSksKGEoKSgpLFcoMjgsMCxudWxsLG51bGwsMTQsIm1hdC1mb3JtLWZpZWxkIixbWyJjbGFzcyIsImNoYW5uZWwtaW5wdXQgbWF0LWZvcm0tZmllbGQiXV0sW1syLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IiwKbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLFsyLCJtYXQtd2FybiIsbnVsbF0sWzIsIm5nLXVudG91Y2hlZCIsbnVsbF0sWzIsIm5nLXRvdWNoZWQiLG51bGxdLFsyLCJuZy1wcmlzdGluZSIsbnVsbF0sWzIsIm5nLWRpcnR5IixudWxsXSxbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksbWgoNjE0NCxudWxsLFdELG51bGwsW1hEXSksSSgzMCw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLApWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsNCx7U2I6MH0pLFgoMzM1NTQ0MzIwLDUse1RiOjB9KSxYKDYwMzk3OTc3Niw2LHtWYjowfSksWCgzMzU1NDQzMjAsNyx7V2I6MH0pLFgoNjAzOTc5Nzc2LDgse0hiOjB9KSxYKDYwMzk3OTc3Niw5LHtsYjoxfSksWCg2MDM5Nzk3NzYsMTAse2FiOjF9KSxYKDYwMzk3OTc3NiwxMSx7SmI6MX0pLFgoNjAzOTc5Nzc2LDEyLHtMYjoxfSksKGEoKSgpLFcoNDAsMCxudWxsLDEsMiwiaW5wdXQiLFtbImNsYXNzIiwibWF0LWlucHV0LWVsZW1lbnQgbWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbCJdLFsibWF0SW5wdXQiLCIiXSxbInR5cGUiLCJudW1iZXIiXV0sW1s4LCJtaW4iLDBdLFs4LCJtYXgiLDBdLFs4LCJzdGVwIiwwXSxbMiwibWF0LWlucHV0LXNlcnZlciIsbnVsbF0sWzEsImlkIiwwXSxbMSwicGxhY2Vob2xkZXIiLDBdLFs4LCJkaXNhYmxlZCIsMF0sWzgsInJlcXVpcmVkIiwwXSxbMSwicmVhZG9ubHkiLAowXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsImNoYW5nZSJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl0sW251bGwsImlucHV0Il1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsNDEpLiRhKCEwKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsNDEpLiRhKCExKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDQxKS5SZCgpJiZlKTtpZigiY2hhbmdlIj09PWMpaWYoYz1kLnRhcmdldC52YWx1ZSxjPGYucm0pe2ZvcihkPWYuc2stMTswPD1kJiYhKGYuY2hhbm5lbHNbZF08PWMpOylkLS07UFIoZixNYXRoLm1heCgwLGQpKX1lbHNlIGlmKGM+Zi5ybSl7Zm9yKGQ9Zi5zaysxO2Q8PWYuY2hhbm5lbENvdW50JiYhKGYuY2hhbm5lbHNbZF0+PWMpOylkKys7UFIoZixNYXRoLm1pbihmLmNoYW5uZWxDb3VudCxkKSl9cmV0dXJuIGV9LApudWxsLG51bGwpKSxJKDQxLDUxMjgxOTIsbnVsbCwwLENFLFt6LE56LFs4LG51bGxdLFsyLFJ1XSxbMixVdV0scUMsWzgsbnVsbF0sZEMsVF0se3R5cGU6WzAsInR5cGUiXSx2YWx1ZTpbMSwidmFsdWUiXX0sbnVsbCksbWgoMjA0OCxbWzQsNF0sWzUsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFcoNDMsMCxudWxsLG51bGwsMTEsImRpdiIsW1siY2xhc3MiLCJjb250YWluZXIiXV0sW1s0LCJ3aWR0aCIsbnVsbF0sWzQsImhlaWdodCIsbnVsbF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLHpUKSksSSg0NSwyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpLChhKCkoKSxWKDE2Nzc3MjE2LG51bGwsbnVsbCwxLG51bGwsQVQpKSxJKDQ3LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsCm51bGwsQlQpKSxJKDQ5LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxDVCkpLEkoNTEsMjc4NTI4LG51bGwsMCxybyxbRWYsRGYseWZdLHtVYTpbMCwibmdGb3JPZiJdfSxudWxsKSwoYSgpKCksVyg1MiwwLG51bGwsbnVsbCwyLCJkaXYiLFtbImNsYXNzIiwibm9kZS10b29sdGlwIG1hdC1lbGV2YXRpb24tejIiXV0sW1s0LCJsZWZ0IixudWxsXSxbNCwidG9wIixudWxsXSxbOCwiaGlkZGVuIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDUzLDAsbnVsbCxudWxsLDEsInByZSIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNTQsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoNTUsMCxudWxsLG51bGwsMiwiZGl2IixbWyJjbGFzcyIsImNvbG9yLXRhYmxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxWKDE2Nzc3MjE2LApudWxsLG51bGwsMSxudWxsLERUKSksSSg1NywyNzg1MjgsbnVsbCwwLHJvLFtFZixEZix5Zl0se1VhOlswLCJuZ0Zvck9mIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYSxlPUYoYywxNik7YihjLDksMCxlKTtiKGMsMTEsMCk7YihjLDE2LDApO2IoYywyMSwwLGQudFEpO2IoYywyNywwLGQuY2hhbm5lbENvdW50LDAsMSxkLnNrKTtiKGMsNDEsMCwibnVtYmVyIixkLnJtKTtiKGMsNDUsMCxkLmxhYmVscyk7YihjLDQ3LDAsZC5GZSk7YihjLDQ5LDAsZC5qKTtiKGMsNTEsMCxkLnB4KTtiKGMsNTcsMCxkLmFGKX0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDIsMCxkLnRwdVR5cGUsZC54RGltZW5zaW9uLGQueURpbWVuc2lvbik7YihjLDYsMCxkLnFwKTt2YXIgZT1GKGMsOCkuZGlzYWJsZWR8fG51bGwsZj0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDgpLmlhLGc9RihjLDkpLk1vfHxudWxsLGw9RihjLDkpLk1vP0YoYyw5KS51YS5XeTpudWxsO2IoYyw3LDAsZSxmLGcsCmwpO2U9RihjLDExKS5pbmxpbmU7Zj0icHJpbWFyeSIhPT1GKGMsMTEpLmNvbG9yJiYiYWNjZW50IiE9PUYoYywxMSkuY29sb3ImJiJ3YXJuIiE9PUYoYywxMSkuY29sb3I7YihjLDEwLDAsZSxmKTtiKGMsMjIsMCxkLmNoYW5uZWxEYiYmZC5jaGFubmVsRGIubGVuZ3RoPyJ2aXNpYmxlIjoiaGlkZGVuIik7ZT1GKGMsMjcpLnRhYkluZGV4O2Y9RihjLDI3KS5kaXNhYmxlZDtnPUYoYywyNykubWF4O2w9RihjLDI3KS5taW47dmFyIG09RihjLDI3KS52YWx1ZSxwPUYoYywyNykudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCIscT1GKGMsMjcpLmRpc2FibGVkLHI9RihjLDI3KS5Cayx2PSFGKGMsMjcpLnZlcnRpY2FsLHc9RihjLDI3KS5uZCx4PUYoYywyNykuc2ooKSx1PUYoYywyNykuWWUsRD1GKGMsMjcpLnlwLEg9RihjLDI3KS52ZXJ0aWNhbCxFPUYoYywyNykuSGYsTj1GKGMsMjcpLmRpc2FibGVkfHxGKGMsMjcpLkhmJiZGKGMsMjcpLkZoJiZGKGMsMjcpLm5kLE09Ik5vb3BBbmltYXRpb25zIj09PQpGKGMsMjcpLmlhO2IoYywyNSwxLFtlLGYsZyxsLG0scCxxLHIsdix3LHgsdSxELEgsRSxOLE1dKTtlPSJzdGFuZGFyZCI9PUYoYywzMCkubztmPSJmaWxsIj09RihjLDMwKS5vO2c9Im91dGxpbmUiPT1GKGMsMzApLm87bD0ibGVnYWN5Ij09RihjLDMwKS5vO209RihjLDMwKS5sLmZhO3A9RihjLDMwKS54YjtxPUYoYywzMCkuS2IoKTtyPUYoYywzMCkudWIoKTt2PUYoYywzMCkuVWIoKTt3PUYoYywzMCkubC5kaXNhYmxlZDt4PUYoYywzMCkubC5BYjt1PUYoYywzMCkubC5mb2N1c2VkO0Q9ImFjY2VudCI9PUYoYywzMCkuY29sb3I7SD0id2FybiI9PUYoYywzMCkuY29sb3I7RT1GKGMsMzApLmgoInVudG91Y2hlZCIpO049RihjLDMwKS5oKCJ0b3VjaGVkIik7TT1GKGMsMzApLmgoInByaXN0aW5lIik7dmFyIEo9RihjLDMwKS5oKCJkaXJ0eSIpLFE9RihjLDMwKS5oKCJ2YWxpZCIpLFU9RihjLDMwKS5oKCJpbnZhbGlkIikscmE9RihjLDMwKS5oKCJwZW5kaW5nIiksRWE9IUYoYywzMCkuRWI7CmIoYywyOCwxLFtlLGYsZyxsLG0scCxxLHIsdix3LHgsdSxELEgsRSxOLE0sSixRLFUscmEsRWFdKTtlPWQuY3k7Zj1kLnh5O2c9RihjLDQxKS5RZDtsPUYoYyw0MSkuaWQ7bT1GKGMsNDEpLnBsYWNlaG9sZGVyO3A9RihjLDQxKS5kaXNhYmxlZDtxPUYoYyw0MSkucmVxdWlyZWQ7cj1GKGMsNDEpLkRkJiYhRihjLDQxKS5WY3x8bnVsbDt2PUYoYyw0MSkuRmJ8fG51bGw7dz1GKGMsNDEpLmZhO3g9RihjLDQxKS5yZXF1aXJlZC50b1N0cmluZygpO2IoYyw0MCwxLFtlLGYsMSxnLGwsbSxwLHEscix2LHcseF0pO2IoYyw0MywwLGQuZHMrInB4IixkLmJzKyJweCIpO2IoYyw1MiwwLGQua0krInB4IixkLmxJKyJweCIsIWQuc2EpO2IoYyw1NCwwLGQuc2EpfSl9O3ZhciBGVD1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9ja30uc2VjdGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MjBweH1tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMDBweH0uY2hhcnQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O3BhZGRpbmctYm90dG9tOjhweH0uY29udHJvbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2OH0iXV0sCmRhdGE6e319KTsKZnVuY3Rpb24gR1QoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJkaWFnbm9zdGljcy12aWV3IixbXSxudWxsLG51bGwsbnVsbCx4SyxxSykpLEkoMSw0OTE1MixudWxsLDAscEssW10se2RpYWdub3N0aWNzOlswLCJkaWFnbm9zdGljcyJdfSxudWxsKSwoYSgpKCksVygyLDAsbnVsbCxudWxsLDEwLCJkaXYiLFtbImNsYXNzIiwic2VjdGlvbi1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LWhlYWRsaW5lIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJQb2QgVmlld2VyIl0pKSwoYSgpKCksVyg1LDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJjb250cm9sIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDYsbnVsbCxbIlNlbGVjdGVkIHN0ZXA6ICIsIiJdKSksKGEoKSgpLFcoNywwLApudWxsLG51bGwsMywiZGl2IixbXSxbWzgsImNsYXNzTmFtZSIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVyg4LDAsbnVsbCxudWxsLDIsIm1hdC1zbGlkZXIiLFtbImNsYXNzIiwibWF0LXNsaWRlciBtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJyb2xlIiwic2xpZGVyIl1dLFtbOCwidGFiSW5kZXgiLDBdLFsxLCJhcmlhLWRpc2FibGVkIiwwXSxbMSwiYXJpYS12YWx1ZW1heCIsMF0sWzEsImFyaWEtdmFsdWVtaW4iLDBdLFsxLCJhcmlhLXZhbHVlbm93IiwwXSxbMSwiYXJpYS1vcmllbnRhdGlvbiIsMF0sWzIsIm1hdC1zbGlkZXItZGlzYWJsZWQiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhhcy10aWNrcyIsbnVsbF0sWzIsIm1hdC1zbGlkZXItaG9yaXpvbnRhbCIsbnVsbF0sWzIsIm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCIsbnVsbF0sWzIsIm1hdC1zbGlkZXItaW52ZXJ0LW1vdXNlLWNvb3JkcyIsbnVsbF0sWzIsIm1hdC1zbGlkZXItc2xpZGluZyIsbnVsbF0sWzIsCiJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmciLG51bGxdLFsyLCJtYXQtc2xpZGVyLXZlcnRpY2FsIixudWxsXSxbMiwibWF0LXNsaWRlci1taW4tdmFsdWUiLG51bGxdLFsyLCJtYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxbW251bGwsImNoYW5nZSJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl0sW251bGwsImtleWRvd24iXSxbbnVsbCwia2V5dXAiXSxbbnVsbCwibW91c2VlbnRlciJdLFtudWxsLCJzZWxlY3RzdGFydCJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImZvY3VzIj09PWMmJihlPSExIT09RihiLDEwKS5zZCgpJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwxMCkucWQoKSYmZSk7ImtleWRvd24iPT09YyYmKGU9ITEhPT1GKGIsMTApLllxKGQpJiZlKTsia2V5dXAiPT09YyYmKGU9ITEhPT1GKGIsMTApLlpxKCkmJmUpOyJtb3VzZWVudGVyIj09PWMmJihlPQohMSE9PUYoYiwxMCkucG4oKSYmZSk7InNlbGVjdHN0YXJ0Ij09PWMmJihlPSExIT09ZC5wcmV2ZW50RGVmYXVsdCgpJiZlKTsiY2hhbmdlIj09PWMmJihlPSExIT09RFIoZixkLnZhbHVlKSYmZSk7cmV0dXJuIGV9LERHLENHKSksbWgoNTEyMCxudWxsLFB0LGZ1bmN0aW9uKGIpe3JldHVybltiXX0sW0FHXSksSSgxMCw0Mzc0NTI4LG51bGwsMCxBRyxbeixSeixuZSxbMixOQV0sWzgsbnVsbF0sVCxMbyxbMixrdl1dLHttYXg6WzAsIm1heCJdLG1pbjpbMSwibWluIl0sc3RlcDpbMiwic3RlcCJdfSx7UWE6ImNoYW5nZSJ9KSwoYSgpKCksVygxMSwwLG51bGwsbnVsbCwxLCJ0b3BvbG9neS1ncmFwaCIsW10sbnVsbCxbW251bGwsInNlbGVjdGVkIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLmE7InNlbGVjdGVkIj09PWMmJmUuc3RvcmUueGEoY0ooe3lqOmUuY2hhbm5lbERiP2UuY2hhbm5lbERiW2RdOm51bGx9KSk7cmV0dXJuITB9LEVULHhUKSksSSgxMiw1NzM0NDAsbnVsbCwwLElSLApbel0se2NoYW5uZWxEYjpbMCwiY2hhbm5lbERiIl0sY29yZUlkVG9SZXBsaWNhSWRNYXA6WzEsImNvcmVJZFRvUmVwbGljYUlkTWFwIl0sdFE6WzIsIm1ldHJpY01hcCJdLHBvZFN0YXRzUGVyQ29yZTpbMywicG9kU3RhdHNQZXJDb3JlIl0scnVuRW52aXJvbm1lbnQ6WzQsInJ1bkVudmlyb25tZW50Il19LHtzZWxlY3RlZDoic2VsZWN0ZWQifSksKGEoKSgpLFcoMTMsMCxudWxsLG51bGwsOSwiZGl2IixbXSxbWzgsImNsYXNzTmFtZSIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNCwwLG51bGwsbnVsbCwxLCJtYXQtZGl2aWRlciIsW1siY2xhc3MiLCJtYXQtZGl2aWRlciJdLFsicm9sZSIsInNlcGFyYXRvciJdXSxbWzEsImFyaWEtb3JpZW50YXRpb24iLDBdLFsyLCJtYXQtZGl2aWRlci12ZXJ0aWNhbCIsbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWhvcml6b250YWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1pbnNldCIsbnVsbF1dLG51bGwsbnVsbCxCRCxBRCkpLEkoMTUsCjQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDE2LDAsbnVsbCxudWxsLDYsImRpdiIsW1siY2xhc3MiLCJzZWN0aW9uLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxNywwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiY2hhcnQtdGl0bGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkxhdGVuY3kgb2YgU2VuZCBhbmQgUmVjdiBjaGFubmVscyJdKSksKGEoKSgpLFcoMTksMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIoeC1heGlzOiBjaGFubmVsIGlkLCB5LWF4aXM6IHRpbWUodXMpKSJdKSksKGEoKSgpLFcoMjEsMCxudWxsLG51bGwsMSwic3RhY2stYmFyLWNoYXJ0IixbXSxudWxsLFtbbnVsbCwic2VsZWN0ZWQiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPQpiLmE7InNlbGVjdGVkIj09PWMmJmUuc3RvcmUueGEoY0ooe3lqOmUuRXg/ZS5FeFtkXTpudWxsfSkpO3JldHVybiEwfSx3VCx2VCkpLEkoMjIsNjM4OTc2LG51bGwsMCxFUixbXSx7ZGF0YTpbMCwiZGF0YSJdfSx7c2VsZWN0ZWQ6InNlbGVjdGVkIn0pLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDksImRpdiIsW10sW1s4LCJjbGFzc05hbWUiLDBdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjQsMCxudWxsLG51bGwsMSwibWF0LWRpdmlkZXIiLFtbImNsYXNzIiwibWF0LWRpdmlkZXIiXSxbInJvbGUiLCJzZXBhcmF0b3IiXV0sW1sxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLG51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDI1LDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDI2LDAsbnVsbCwKbnVsbCw2LCJkaXYiLFtbImNsYXNzIiwic2VjdGlvbi1jb250YWluZXIiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMjcsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImNoYXJ0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJEdXJhdGlvbiBvZiBhbGwtcmVkdWNlIG9yIGFsbC10by1hbGwgb3BzIl0pKSwoYSgpKCksVygyOSwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIiAoeC1heGlzOiBzaG9ydCBuYW1lcyBmb3IgYWxsLXJlZHVjZXMgb3BzIChhIykgb3IgZnVzaW9uIChmIykgb3IgYWxsLXRvLWFsbCAobCMpLCB5LWF4aXM6IHRpbWUodXMpKSAiXSkpLChhKCkoKSxXKDMxLDAsbnVsbCxudWxsLDEsInN0YWNrLWJhci1jaGFydCIsW10sbnVsbCxbW251bGwsInNlbGVjdGVkIl1dLApmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5hOyJzZWxlY3RlZCI9PT1jJiZlLnN0b3JlLnhhKGNKKHt5ajplLmFsbFJlZHVjZU9wRGI/ZS5hbGxSZWR1Y2VPcERiW2RdOm51bGx9KSk7cmV0dXJuITB9LHdULHZUKSksSSgzMiw2Mzg5NzYsbnVsbCwwLEVSLFtdLHtkYXRhOlswLCJkYXRhIl19LHtzZWxlY3RlZDoic2VsZWN0ZWQifSksKGEoKSgpLFcoMzMsMCxudWxsLG51bGwsMSwibWF0LWRpdmlkZXIiLFtbImNsYXNzIiwibWF0LWRpdmlkZXIiXSxbInJvbGUiLCJzZXBhcmF0b3IiXV0sW1sxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLG51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDM0LDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDM1LDAsbnVsbCxudWxsLDYsImRpdiIsW1siY2xhc3MiLCJzZWN0aW9uLWNvbnRhaW5lciJdXSwKbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMzYsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImNoYXJ0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJTdGVwIGJyZWFrZG93biJdKSksKGEoKSgpLFcoMzgsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyIoeC1heGlzOiBnbG9iYWwgY2hpcCBpZCwgbm9kZSBpZCwgeS1heGlzOiB0aW1lKHVzKSkiXSkpLChhKCkoKSxXKDQwLDAsbnVsbCxudWxsLDEsInN0YWNrLWJhci1jaGFydCIsW10sbnVsbCxbW251bGwsInNlbGVjdGVkIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1iLmE7InNlbGVjdGVkIj09PWMmJmUuc3RvcmUueGEoY0ooe3lqOmUuZHQ/ZS5kdFtkXTpudWxsfSkpO3JldHVybiEwfSx3VCx2VCkpLEkoNDEsNjM4OTc2LG51bGwsMCxFUiwKW10se2RhdGE6WzAsImRhdGEiXX0se3NlbGVjdGVkOiJzZWxlY3RlZCJ9KV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEsMCxkLmRpYWdub3N0aWNzKTtiKGMsMTAsMCxkLlBzLGQuaWksMSk7YihjLDEyLDAsZC5jaGFubmVsRGIsZC5jb3JlSWRUb1JlcGxpY2FJZE1hcCxkLm1ILGQucG9kU3RhdHNQZXJDb3JlLGQucnVuRW52aXJvbm1lbnQpO2IoYywyMiwwLGQuWEUpO2IoYywzMiwwLGQuR0UpO2IoYyw0MSwwLGQubEgpfSxmdW5jdGlvbihiLGMpe3ZhciBkPWMuYTtiKGMsNiwwLGQud3QpO2IoYyw3LDAsZC5paT09ZC5Qcz8iaGlkZGVuLWNvbnRlbnQiOiJmdWxsLWhlaWdodCIpO3ZhciBlPUYoYywxMCkudGFiSW5kZXgsZj1GKGMsMTApLmRpc2FibGVkLGc9RihjLDEwKS5tYXgsbD1GKGMsMTApLm1pbixtPUYoYywxMCkudmFsdWUscD1GKGMsMTApLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiLHE9RihjLDEwKS5kaXNhYmxlZCxyPUYoYywxMCkuQmssdj0hRihjLAoxMCkudmVydGljYWwsdz1GKGMsMTApLm5kLHg9RihjLDEwKS5zaigpLHU9RihjLDEwKS5ZZSxEPUYoYywxMCkueXAsSD1GKGMsMTApLnZlcnRpY2FsLEU9RihjLDEwKS5IZixOPUYoYywxMCkuZGlzYWJsZWR8fEYoYywxMCkuSGYmJkYoYywxMCkuRmgmJkYoYywxMCkubmQsTT0iTm9vcEFuaW1hdGlvbnMiPT09RihjLDEwKS5pYTtiKGMsOCwxLFtlLGYsZyxsLG0scCxxLHIsdix3LHgsdSxELEgsRSxOLE1dKTtiKGMsMTMsMCxkLmNoYW5uZWxEYiYmZC5jaGFubmVsRGIubGVuZ3RoPyJmdWxsLWhlaWdodCI6ImhpZGRlbi1jb250ZW50Iik7ZT1GKGMsMTUpLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiO2Y9RihjLDE1KS52ZXJ0aWNhbDtnPSFGKGMsMTUpLnZlcnRpY2FsO2w9RihjLDE1KS5IZTtiKGMsMTQsMCxlLGYsZyxsKTtiKGMsMjMsMCxkLmFsbFJlZHVjZU9wRGImJmQuYWxsUmVkdWNlT3BEYi5sZW5ndGg/ImZ1bGwtaGVpZ2h0IjoiaGlkZGVuLWNvbnRlbnQiKTtlPUYoYywKMjUpLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiO2Y9RihjLDI1KS52ZXJ0aWNhbDtnPSFGKGMsMjUpLnZlcnRpY2FsO2w9RihjLDI1KS5IZTtiKGMsMjQsMCxlLGYsZyxsKTtlPUYoYywzNCkudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsMzQpLnZlcnRpY2FsO2c9IUYoYywzNCkudmVydGljYWw7bD1GKGMsMzQpLkhlO2IoYywzMywwLGUsZixnLGwpfSl9dmFyIEhUPVFnKCJwb2Qtdmlld2VyIixDUixmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInBvZC12aWV3ZXIiLFtdLG51bGwsbnVsbCxudWxsLEdULEZUKSksSSgxLDQ5MTUyLG51bGwsMCxDUixbeHcsS0ksY0ldLG51bGwsbnVsbCldLG51bGwsbnVsbCl9KTt2YXIgSVQ9Y2coe1Q6MCxnOltbIi5ob3Jpem9udGFsLWNlbnRlcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmZ1bGwtd2lkdGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmZ1bGwtaGVpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX0uZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0uaGlkZGVuLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO292ZXJmbG93OmhpZGRlbn0ucHJpbWFyeS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNGE0YTRhfS5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzVmNjM2ODtmb250LXNpemU6MTRweDtmb250LXN0eWxlOml0YWxpY31bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoyMHB4fS50YWJsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjZWVlfSJdXSxkYXRhOnt9fSk7CmZ1bmN0aW9uIEpUKGEpe3JldHVybiBaKDAsW1goNjcxMDg4NjQwLDEse0JmOjB9KSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtaGVhZGxpbmUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoMixudWxsLFsiIiwiIl0pKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNCwwLFtbMSwwXSxbInRhYmxlIiwxXV0sbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwidGFibGUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSldLG51bGwsZnVuY3Rpb24oYixjKXtiKGMsMiwwLGMuYS50aXRsZSl9KX07dmFyIEtUPWNnKHtUOjAsZzpbWyIuaG9yaXpvbnRhbC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5mdWxsLWhlaWdodFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LmRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9LmhpZGRlbi1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW59LnByaW1hcnktY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzRhNGE0YX0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM1ZjYzNjg7Zm9udC1zaXplOjE0cHg7Zm9udC1zdHlsZTppdGFsaWN9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjQ1MHB4O2hlaWdodDpmaXQtY29udGVudDttYXJnaW46OHB4IDhweCA4cHggMH0uZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTE2cHh9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIExUKGEpe3JldHVybiBaKDAsW1goNjcxMDg4NjQwLDEse3ljOjB9KSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDUsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoMiwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKDMsbnVsbCxbIiIsIiJdKSksKGEoKSgpLFcoNCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwiZGVzY3JpcHRpb24iXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIihpbiBtaWNyb3NlY29uZHMpIG9mIGEgVGVuc29yRmxvdyBvcGVyYXRpb24iXSkpLChhKCkoKSxXKDYsMCxbWzEsMF0sWyJjaGFydCIsMV1dLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsImNoYXJ0Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpXSxudWxsLGZ1bmN0aW9uKGIsYyl7YihjLDMsMCxjLmEudGl0bGUpfSl9O3ZhciBNVD1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9jaztwYWRkaW5nOjIwcHh9bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDhweH1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc3Nzt2ZXJ0aWNhbC1hbGlnbjpib3R0b219LnRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkICNlZWV9Il1dLApkYXRhOnt9fSk7CmZ1bmN0aW9uIE5UKGEpe3JldHVybiBaKDAsW1goNjcxMDg4NjQwLDEse0JmOjB9KSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDU5LCJkaXYiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC1oZWFkbGluZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsiVGVuc29yRmxvdyBvcGVyYXRpb25zIl0pKSwoYSgpKCksVyg0LDAsbnVsbCxudWxsLDE4LCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWludmFsaWQiLApudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLFsyLCJuZy12YWxpZCIsbnVsbF0sWzIsIm5nLWludmFsaWQiLG51bGxdLFsyLCJuZy1wZW5kaW5nIixudWxsXSxbMiwiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG51bGxdXSxudWxsLG51bGwsbEUsJEQpKSwKbWgoNjE0NCxudWxsLFdELG51bGwsW1hEXSksSSg2LDc1MjAyNTYsbnVsbCw5LFhELFt6LG5lLFsyLHJDXSxbMixOQV0sWzIsVkRdLE56LFQsWzIsa3ZdXSxudWxsLG51bGwpLFgoNjAzOTc5Nzc2LDIse1NiOjB9KSxYKDMzNTU0NDMyMCwzLHtUYjowfSksWCg2MDM5Nzk3NzYsNCx7VmI6MH0pLFgoMzM1NTQ0MzIwLDUse1diOjB9KSxYKDYwMzk3OTc3Niw2LHtIYjowfSksWCg2MDM5Nzk3NzYsNyx7bGI6MX0pLFgoNjAzOTc5Nzc2LDgse2FiOjF9KSxYKDYwMzk3OTc3Niw5LHtKYjoxfSksWCg2MDM5Nzk3NzYsMTAse0xiOjF9KSwoYSgpKCksVygxNiwwLG51bGwsMSwyLCJpbnB1dCIsW1siY2xhc3MiLCJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0sWyJtYXRJbnB1dCIsIiJdLFsicGxhY2Vob2xkZXIiLCJIb3N0L2RldmljZSJdXSxbWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwKImRpc2FibGVkIiwwXSxbOCwicmVxdWlyZWQiLDBdLFsxLCJyZWFkb25seSIsMF0sWzEsImFyaWEtZGVzY3JpYmVkYnkiLDBdLFsxLCJhcmlhLWludmFsaWQiLDBdLFsxLCJhcmlhLXJlcXVpcmVkIiwwXV0sW1tudWxsLCJpbnB1dCJdLFtudWxsLCJmb2N1cyJdLFtudWxsLCJibHVyIl1dLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZT0hMCxmPWIuYTsiZm9jdXMiPT09YyYmKGU9ITEhPT1GKGIsMTcpLiRhKCEwKSYmZSk7ImJsdXIiPT09YyYmKGU9ITEhPT1GKGIsMTcpLiRhKCExKSYmZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDE3KS5SZCgpJiZlKTsiaW5wdXQiPT09YyYmKGYub3M9ZC50YXJnZXQudmFsdWUsZT0hMSE9PWYucGIoKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoMTcsNTEyODE5MixudWxsLDAsQ0UsW3osTnosWzgsbnVsbF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0sdmFsdWU6WzEsInZhbHVlIl19LApudWxsKSxtaCgyMDQ4LFtbMiw0XSxbMyw0XV0sUEQsbnVsbCxbQ0VdKSwoYSgpKCksVygxOSwwLG51bGwsNCwzLCJtYXQtaWNvbiIsW1siY2xhc3MiLCJtYXQtaWNvbiBub3RyYW5zbGF0ZSJdLFsibWF0U3VmZml4IiwiIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXSxbMiwibWF0LWljb24tbm8tY29sb3IiLG51bGxdXSxudWxsLG51bGwseUUseEUpKSxJKDIwLDE2Mzg0LFtbMTAsNF1dLDAsU0QsW10sbnVsbCxudWxsKSxJKDIxLDkxNTg2NTYsbnVsbCwwLHZFLFt6LG5FLFs4LG51bGxdLHJFLHVkXSxudWxsLG51bGwpLChhKCkoKSxZKC0xLDAsWyJzZWFyY2giXSkpLChhKCkoKSxXKDIzLDAsbnVsbCxudWxsLDE4LCJtYXQtZm9ybS1maWVsZCIsW1siY2xhc3MiLCJtYXQtZm9ybS1maWVsZCJdXSxbWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLG51bGxdLApbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtYXV0b2ZpbGxlZCIsbnVsbF0sWzIsIm1hdC1mb2N1c2VkIixudWxsXSxbMiwibWF0LWFjY2VudCIsbnVsbF0sWzIsIm1hdC13YXJuIixudWxsXSxbMiwibmctdW50b3VjaGVkIixudWxsXSxbMiwibmctdG91Y2hlZCIsbnVsbF0sWzIsIm5nLXByaXN0aW5lIixudWxsXSxbMiwibmctZGlydHkiLG51bGxdLApbMiwibmctdmFsaWQiLG51bGxdLFsyLCJuZy1pbnZhbGlkIixudWxsXSxbMiwibmctcGVuZGluZyIsbnVsbF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixudWxsXV0sbnVsbCxudWxsLGxFLCREKSksbWgoNjE0NCxudWxsLFdELG51bGwsW1hEXSksSSgyNSw3NTIwMjU2LG51bGwsOSxYRCxbeixuZSxbMixyQ10sWzIsTkFdLFsyLFZEXSxOeixULFsyLGt2XV0sbnVsbCxudWxsKSxYKDYwMzk3OTc3NiwxMSx7U2I6MH0pLFgoMzM1NTQ0MzIwLDEyLHtUYjowfSksWCg2MDM5Nzk3NzYsMTMse1ZiOjB9KSxYKDMzNTU0NDMyMCwxNCx7V2I6MH0pLFgoNjAzOTc5Nzc2LDE1LHtIYjowfSksWCg2MDM5Nzk3NzYsMTYse2xiOjF9KSxYKDYwMzk3OTc3NiwxNyx7YWI6MX0pLFgoNjAzOTc5Nzc2LDE4LHtKYjoxfSksWCg2MDM5Nzk3NzYsMTkse0xiOjF9KSwoYSgpKCksVygzNSwwLG51bGwsMSwyLCJpbnB1dCIsW1siY2xhc3MiLCJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0sClsibWF0SW5wdXQiLCIiXSxbInBsYWNlaG9sZGVyIiwiVHlwZSJdXSxbWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFs4LCJyZXF1aXJlZCIsMF0sWzEsInJlYWRvbmx5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsImlucHV0Il0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiwzNikuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiwzNikuJGEoITEpJiZlKTsiaW5wdXQiPT09YyYmKGU9ITEhPT1GKGIsMzYpLlJkKCkmJmUpOyJpbnB1dCI9PT1jJiYoZi5ycz1kLnRhcmdldC52YWx1ZSxlPSExIT09Zi5wYigpJiZlKTtyZXR1cm4gZX0sbnVsbCxudWxsKSksSSgzNiw1MTI4MTkyLApudWxsLDAsQ0UsW3osTnosWzgsbnVsbF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0sdmFsdWU6WzEsInZhbHVlIl19LG51bGwpLG1oKDIwNDgsW1sxMSw0XSxbMTIsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFcoMzgsMCxudWxsLDQsMywibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24gbm90cmFuc2xhdGUiXSxbIm1hdFN1ZmZpeCIsIiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF0sWzIsIm1hdC1pY29uLW5vLWNvbG9yIixudWxsXV0sbnVsbCxudWxsLHlFLHhFKSksSSgzOSwxNjM4NCxbWzE5LDRdXSwwLFNELFtdLG51bGwsbnVsbCksSSg0MCw5MTU4NjU2LG51bGwsMCx2RSxbeixuRSxbOCxudWxsXSxyRSx1ZF0sbnVsbCxudWxsKSwoYSgpKCksWSgtMSwwLFsic2VhcmNoIl0pKSwoYSgpKCksVyg0MiwwLG51bGwsbnVsbCwxOCwibWF0LWZvcm0tZmllbGQiLFtbImNsYXNzIiwKIm1hdC1mb3JtLWZpZWxkIl1dLFtbMiwibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IixudWxsXSxbMiwibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLG51bGxdLFsyLCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbnVsbF0sWzIsIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG51bGxdLFsyLCJtYXQtZm9jdXNlZCIsbnVsbF0sWzIsIm1hdC1hY2NlbnQiLG51bGxdLApbMiwibWF0LXdhcm4iLG51bGxdLFsyLCJuZy11bnRvdWNoZWQiLG51bGxdLFsyLCJuZy10b3VjaGVkIixudWxsXSxbMiwibmctcHJpc3RpbmUiLG51bGxdLFsyLCJuZy1kaXJ0eSIsbnVsbF0sWzIsIm5nLXZhbGlkIixudWxsXSxbMiwibmctaW52YWxpZCIsbnVsbF0sWzIsIm5nLXBlbmRpbmciLG51bGxdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF1dLG51bGwsbnVsbCxsRSwkRCkpLG1oKDYxNDQsbnVsbCxXRCxudWxsLFtYRF0pLEkoNDQsNzUyMDI1NixudWxsLDksWEQsW3osbmUsWzIsckNdLFsyLE5BXSxbMixWRF0sTnosVCxbMixrdl1dLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMjAse1NiOjB9KSxYKDMzNTU0NDMyMCwyMSx7VGI6MH0pLFgoNjAzOTc5Nzc2LDIyLHtWYjowfSksWCgzMzU1NDQzMjAsMjMse1diOjB9KSxYKDYwMzk3OTc3NiwyNCx7SGI6MH0pLFgoNjAzOTc5Nzc2LDI1LHtsYjoxfSksWCg2MDM5Nzk3NzYsMjYse2FiOjF9KSxYKDYwMzk3OTc3NiwKMjcse0piOjF9KSxYKDYwMzk3OTc3NiwyOCx7TGI6MX0pLChhKCkoKSxXKDU0LDAsbnVsbCwxLDIsImlucHV0IixbWyJjbGFzcyIsIm1hdC1pbnB1dC1lbGVtZW50IG1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSxbIm1hdElucHV0IiwiIl0sWyJwbGFjZWhvbGRlciIsIk9wZXJhdGlvbiJdXSxbWzIsIm1hdC1pbnB1dC1zZXJ2ZXIiLG51bGxdLFsxLCJpZCIsMF0sWzEsInBsYWNlaG9sZGVyIiwwXSxbOCwiZGlzYWJsZWQiLDBdLFs4LCJyZXF1aXJlZCIsMF0sWzEsInJlYWRvbmx5IiwwXSxbMSwiYXJpYS1kZXNjcmliZWRieSIsMF0sWzEsImFyaWEtaW52YWxpZCIsMF0sWzEsImFyaWEtcmVxdWlyZWQiLDBdXSxbW251bGwsImlucHV0Il0sW251bGwsImZvY3VzIl0sW251bGwsImJsdXIiXV0sZnVuY3Rpb24oYixjLGQpe3ZhciBlPSEwLGY9Yi5hOyJmb2N1cyI9PT1jJiYoZT0hMSE9PUYoYiw1NSkuJGEoITApJiZlKTsiYmx1ciI9PT1jJiYoZT0hMSE9PUYoYiw1NSkuJGEoITEpJiYKZSk7ImlucHV0Ij09PWMmJihlPSExIT09RihiLDU1KS5SZCgpJiZlKTsiaW5wdXQiPT09YyYmKGYuTmc9ZC50YXJnZXQudmFsdWUsZT0hMSE9PWYucGIoKSYmZSk7cmV0dXJuIGV9LG51bGwsbnVsbCkpLEkoNTUsNTEyODE5MixudWxsLDAsQ0UsW3osTnosWzgsbnVsbF0sWzIsUnVdLFsyLFV1XSxxQyxbOCxudWxsXSxkQyxUXSx7cGxhY2Vob2xkZXI6WzAsInBsYWNlaG9sZGVyIl0sdmFsdWU6WzEsInZhbHVlIl19LG51bGwpLG1oKDIwNDgsW1syMCw0XSxbMjEsNF1dLFBELG51bGwsW0NFXSksKGEoKSgpLFcoNTcsMCxudWxsLDQsMywibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24gbm90cmFuc2xhdGUiXSxbIm1hdFN1ZmZpeCIsIiJdLFsicm9sZSIsImltZyJdXSxbWzIsIm1hdC1pY29uLWlubGluZSIsbnVsbF0sWzIsIm1hdC1pY29uLW5vLWNvbG9yIixudWxsXV0sbnVsbCxudWxsLHlFLHhFKSksSSg1OCwxNjM4NCxbWzI4LDRdXSwwLFNELFtdLG51bGwsbnVsbCksSSg1OSw5MTU4NjU2LApudWxsLDAsdkUsW3osbkUsWzgsbnVsbF0sckUsdWRdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsMCxbInNlYXJjaCJdKSksKGEoKSgpLFcoNjEsMCxudWxsLG51bGwsMSwiZGl2IixbXSxbWzQsImRpc3BsYXkiLG51bGxdXSxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoNjIsbnVsbCxbIiBOb3RlOiBUbyBhdm9pZCBzbHVnZ2lzaG5lc3MsIG9ubHkgdGhlIDEwMDAgbW9zdCB0aW1lLWNvbnN1bWluZyBvcGVyYXRpb25zIG91dCBvZiB0aGUgdG90YWwgIiwiIG9wZXJhdGlvbnMgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy5cbiJdKSksKGEoKSgpLFcoNjMsMCxudWxsLG51bGwsMCwiYnIiLFtdLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDY0LDAsbnVsbCxudWxsLDEsImRpdiIsW10sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFcoNjUsMCxbWzEsMF0sWyJ0YWJsZSIsMV1dLG51bGwsMCwiZGl2IixbWyJjbGFzcyIsInRhYmxlIl1dLG51bGwsCm51bGwsbnVsbCxudWxsLG51bGwpKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDE3LDAsIkhvc3QvZGV2aWNlIixkLm9zKTtiKGMsMjEsMCk7YihjLDM2LDAsIlR5cGUiLGQucnMpO2IoYyw0MCwwKTtiKGMsNTUsMCwiT3BlcmF0aW9uIixkLk5nKTtiKGMsNTksMCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9InN0YW5kYXJkIj09RihjLDYpLm8sZj0iZmlsbCI9PUYoYyw2KS5vLGc9Im91dGxpbmUiPT1GKGMsNikubyxsPSJsZWdhY3kiPT1GKGMsNikubyxtPUYoYyw2KS5sLmZhLHA9RihjLDYpLnhiLHE9RihjLDYpLktiKCkscj1GKGMsNikudWIoKSx2PUYoYyw2KS5VYigpLHc9RihjLDYpLmwuZGlzYWJsZWQseD1GKGMsNikubC5BYix1PUYoYyw2KS5sLmZvY3VzZWQsRD0iYWNjZW50Ij09RihjLDYpLmNvbG9yLEg9Indhcm4iPT1GKGMsNikuY29sb3IsRT1GKGMsNikuaCgidW50b3VjaGVkIiksTj1GKGMsNikuaCgidG91Y2hlZCIpLE09RihjLDYpLmgoInByaXN0aW5lIiksCko9RihjLDYpLmgoImRpcnR5IiksUT1GKGMsNikuaCgidmFsaWQiKSxVPUYoYyw2KS5oKCJpbnZhbGlkIikscmE9RihjLDYpLmgoInBlbmRpbmciKSxFYT0hRihjLDYpLkViO2IoYyw0LDEsW2UsZixnLGwsbSxwLHEscix2LHcseCx1LEQsSCxFLE4sTSxKLFEsVSxyYSxFYV0pO3ZhciBCPUYoYywxNykuUWQsRz1GKGMsMTcpLmlkLEs9RihjLDE3KS5wbGFjZWhvbGRlcixtYT1GKGMsMTcpLmRpc2FibGVkLGthPUYoYywxNykucmVxdWlyZWQsJGE9RihjLDE3KS5EZCYmIUYoYywxNykuVmN8fG51bGwsTz1GKGMsMTcpLkZifHxudWxsLFM9RihjLDE3KS5mYSxkYT1GKGMsMTcpLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDE2LDAsQixHLEssbWEsa2EsJGEsTyxTLGRhKTt2YXIgQz1GKGMsMjEpLmlubGluZSxQPSJwcmltYXJ5IiE9PUYoYywyMSkuY29sb3ImJiJhY2NlbnQiIT09RihjLDIxKS5jb2xvciYmIndhcm4iIT09RihjLDIxKS5jb2xvcjtiKGMsMTksMCxDLFApO3ZhciBSPSJzdGFuZGFyZCI9PQpGKGMsMjUpLm8sYmE9ImZpbGwiPT1GKGMsMjUpLm8sdWE9Im91dGxpbmUiPT1GKGMsMjUpLm8sSmE9ImxlZ2FjeSI9PUYoYywyNSkubyx0YT1GKGMsMjUpLmwuZmEsd2E9RihjLDI1KS54YixUYT1GKGMsMjUpLktiKCksUWI9RihjLDI1KS51YigpLFJiPUYoYywyNSkuVWIoKSxVYT1GKGMsMjUpLmwuZGlzYWJsZWQsc2M9RihjLDI1KS5sLkFiLEJlPUYoYywyNSkubC5mb2N1c2VkLFNiPSJhY2NlbnQiPT1GKGMsMjUpLmNvbG9yLFliPSJ3YXJuIj09RihjLDI1KS5jb2xvcixpYz1GKGMsMjUpLmgoInVudG91Y2hlZCIpLHliPUYoYywyNSkuaCgidG91Y2hlZCIpLFNkPUYoYywyNSkuaCgicHJpc3RpbmUiKSxhaj1GKGMsMjUpLmgoImRpcnR5IiksYmo9RihjLDI1KS5oKCJ2YWxpZCIpLGNqPUYoYywyNSkuaCgiaW52YWxpZCIpLGRqPUYoYywyNSkuaCgicGVuZGluZyIpLGVqPSFGKGMsMjUpLkViO2IoYywyMywxLFtSLGJhLHVhLEphLHRhLHdhLFRhLFFiLFJiLFVhLHNjLEJlLFNiLFliLGljLAp5YixTZCxhaixiaixjaixkaixlal0pO3ZhciBmaj1GKGMsMzYpLlFkLGdqPUYoYywzNikuaWQsaGo9RihjLDM2KS5wbGFjZWhvbGRlcixpaj1GKGMsMzYpLmRpc2FibGVkLGpqPUYoYywzNikucmVxdWlyZWQsa2o9RihjLDM2KS5EZCYmIUYoYywzNikuVmN8fG51bGwsbGo9RihjLDM2KS5GYnx8bnVsbCxtaj1GKGMsMzYpLmZhLG5qPUYoYywzNikucmVxdWlyZWQudG9TdHJpbmcoKTtiKGMsMzUsMCxmaixnaixoaixpaixqaixraixsaixtaixuaik7dmFyIG9qPUYoYyw0MCkuaW5saW5lLHBqPSJwcmltYXJ5IiE9PUYoYyw0MCkuY29sb3ImJiJhY2NlbnQiIT09RihjLDQwKS5jb2xvciYmIndhcm4iIT09RihjLDQwKS5jb2xvcjtiKGMsMzgsMCxvaixwaik7dmFyIHFqPSJzdGFuZGFyZCI9PUYoYyw0NCkubyxyaj0iZmlsbCI9PUYoYyw0NCkubyxzaj0ib3V0bGluZSI9PUYoYyw0NCkubyx0aj0ibGVnYWN5Ij09RihjLDQ0KS5vLHVqPUYoYyw0NCkubC5mYSx2aj1GKGMsNDQpLnhiLHdqPUYoYywKNDQpLktiKCkseGo9RihjLDQ0KS51YigpLHlqPUYoYyw0NCkuVWIoKSx6aj1GKGMsNDQpLmwuZGlzYWJsZWQsQWo9RihjLDQ0KS5sLkFiLEJqPUYoYyw0NCkubC5mb2N1c2VkLENqPSJhY2NlbnQiPT1GKGMsNDQpLmNvbG9yLERqPSJ3YXJuIj09RihjLDQ0KS5jb2xvcixFaj1GKGMsNDQpLmgoInVudG91Y2hlZCIpLEZqPUYoYyw0NCkuaCgidG91Y2hlZCIpLEdqPUYoYyw0NCkuaCgicHJpc3RpbmUiKSxIaj1GKGMsNDQpLmgoImRpcnR5IiksSWo9RihjLDQ0KS5oKCJ2YWxpZCIpLEpqPUYoYyw0NCkuaCgiaW52YWxpZCIpLEtqPUYoYyw0NCkuaCgicGVuZGluZyIpLExqPSFGKGMsNDQpLkViO2IoYyw0MiwxLFtxaixyaixzaix0aix1aix2aix3aix4aix5aix6aixBaixCaixDaixEaixFaixGaixHaixIaixJaixKaixLaixMal0pO3ZhciBNaj1GKGMsNTUpLlFkLE5qPUYoYyw1NSkuaWQsT2o9RihjLDU1KS5wbGFjZWhvbGRlcixQaj1GKGMsNTUpLmRpc2FibGVkLFFqPUYoYyw1NSkucmVxdWlyZWQsClJqPUYoYyw1NSkuRGQmJiFGKGMsNTUpLlZjfHxudWxsLFNqPUYoYyw1NSkuRmJ8fG51bGwsVGo9RihjLDU1KS5mYSxVaj1GKGMsNTUpLnJlcXVpcmVkLnRvU3RyaW5nKCk7YihjLDU0LDAsTWosTmosT2osUGosUWosUmosU2osVGosVWopO3ZhciBWaj1GKGMsNTkpLmlubGluZSxXaj0icHJpbWFyeSIhPT1GKGMsNTkpLmNvbG9yJiYiYWNjZW50IiE9PUYoYyw1OSkuY29sb3ImJiJ3YXJuIiE9PUYoYyw1OSkuY29sb3I7YihjLDU3LDAsVmosV2opO2IoYyw2MSwwLGQuR3Q/ImJsb2NrIjoibm9uZSIpO2IoYyw2MiwwLGQuR3QpfSl9O3ZhciBPVD1jZyh7VDowLGc6W1siLmhvcml6b250YWwtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOmNlbnRlcn0uZnVsbC13aWR0aFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5oaWRkZW4tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVufS5wcmltYXJ5LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM0YTRhNGF9LmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNWY2MzY4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc3R5bGU6aXRhbGljfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpibG9ja30uc2VjdGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MjBweH0uaGVhZGVyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi10b3A6LTE2cHh9LnJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4fS5mbGV4LXNwYWNlW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjF9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjMDAwO2JvcmRlci1yYWRpdXM6MDtjb2xvcjojNzc3fS5pZGxlLWJ1dHRvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTE2cHh9LnNhdmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLXRvcDo4cHg7dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6MTMwcHh9LnNhdmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcntjb2xvcjojNzc3O2N1cnNvcjpwb2ludGVyfSJdXSwKZGF0YTp7fX0pOwpmdW5jdGlvbiBQVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDIsImJ1dHRvbiIsW1siY2xhc3MiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0sWyJtYXQtbWVudS1pdGVtIiwiIl1dLFtbMSwicm9sZSIsMF0sWzIsIm1hdC1tZW51LWl0ZW0iLG51bGxdLFsyLCJtYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkIixudWxsXSxbMiwibWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXIiLG51bGxdLFsxLCJ0YWJpbmRleCIsMF0sWzEsImFyaWEtZGlzYWJsZWQiLDBdLFsxLCJkaXNhYmxlZCIsMF1dLFtbbnVsbCwiY2xpY2siXSxbbnVsbCwibW91c2VlbnRlciJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITAsZj1iLmE7ImNsaWNrIj09PWMmJihlPSExIT09RihiLDEpLkJBKGQpJiZlKTsibW91c2VlbnRlciI9PT1jJiYoZT0hMSE9PUYoYiwxKS5QQigpJiZlKTsiY2xpY2siPT09YyYmKGU9ITEhPT1ZUihmLGIuY29udGV4dC5QKSYmZSk7cmV0dXJuIGV9LFhFLFdFKSksSSgxLAo0Mzc0NTI4LFtbMSw0XSxbMiw0XV0sMCxHRSxbeixMbyxSeixbMixFRV1dLHtkaXNhYmxlZDpbMCwiZGlzYWJsZWQiXX0sbnVsbCksKGEoKSgpLFkoMiwwLFsiICIsIiAiXSkpXSxmdW5jdGlvbihiLGMpe2IoYywxLDAsYy5hLkdzPT1jLmNvbnRleHQuUCl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9RihjLDEpLnJvbGUsZT1GKGMsMSkuZHYsZj1GKGMsMSkuWncsZz1GKGMsMSkuVGMoKSxsPUYoYywxKS5kaXNhYmxlZC50b1N0cmluZygpLG09RihjLDEpLmRpc2FibGVkfHxudWxsO2IoYywwLDAsZCwhMCxlLGYsZyxsLG0pO2IoYywyLDAsYy5jb250ZXh0LlApfSl9CmZ1bmN0aW9uIFFUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsNDcsImRpdiIsW1siY2xhc3MiLCJzZWN0aW9uLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDE1LCJkaXYiLFtbImNsYXNzIiwicm93Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDIsMCxudWxsLG51bGwsNywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJtYXQtaGVhZGxpbmUiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIlRlbnNvckZsb3cgU3RhdHMiXSkpLChhKCkoKSxXKDUsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsImhlYWRlci1jb250ZW50Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDYsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsCiJkZXNjcmlwdGlvbiJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksWSgtMSxudWxsLFsnICgxKSBJbiB0aGUgY2hhcnRzIGFuZCB0YWJsZSBiZWxvdywgIklETEUiIHJlcHJlc2VudHMgdGhlIHBvcnRpb24gb2YgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIG9uIGRldmljZSAob3IgaG9zdCkgdGhhdCBpcyBpZGxlLiAnXSkpLChhKCkoKSxXKDgsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsImRlc2NyaXB0aW9uIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWycgKDIpIEluIHRoZSBwaWUgY2hhcnRzLCB0aGUgIk90aGVyIiBzZWN0b3IgcmVwcmVzZW50cyB0aGUgc3VtIG9mIHNlY3RvcnMgdGhhdCBhcmUgdG9vIHNtYWxsIHRvIGJlIHNob3duIGluZGl2aWR1YWxseS4gJ10pKSwoYSgpKCksVygxMCwwLG51bGwsbnVsbCwwLCJkaXYiLFtbImNsYXNzIiwiZmxleC1zcGFjZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwKKGEoKSgpLFcoMTEsMCxudWxsLG51bGwsNSwiZGl2IixbWyJjbGFzcyIsInNhdmUtYnV0dG9uIl1dLG51bGwsW1tudWxsLCJjbGljayJdXSxmdW5jdGlvbihiLGMpe3ZhciBkPSEwLGU9Yi5hOyJjbGljayI9PT1jJiYoZD0hMSE9PWUuVmwoKSYmZCk7cmV0dXJuIGR9LG51bGwsbnVsbCkpLChhKCkoKSxXKDEyLDAsbnVsbCxudWxsLDIsIm1hdC1pY29uIixbWyJjbGFzcyIsIm1hdC1pY29uIG5vdHJhbnNsYXRlIl0sWyJyb2xlIiwiaW1nIl1dLFtbMiwibWF0LWljb24taW5saW5lIixudWxsXSxbMiwibWF0LWljb24tbm8tY29sb3IiLG51bGxdXSxudWxsLG51bGwseUUseEUpKSxJKDEzLDkxNTg2NTYsbnVsbCwwLHZFLFt6LG5FLFs4LG51bGxdLHJFLHVkXSxudWxsLG51bGwpLChhKCkoKSxZKC0xLDAsWyJzYXZlX2FsdCJdKSksKGEoKSgpLFcoMTUsMCxudWxsLG51bGwsMSwiZGl2IixbWyJjbGFzcyIsIm1hdC10aXRsZSJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksClkoLTEsbnVsbCxbIkV4cG9ydCBhcyBDU1YiXSkpLChhKCkoKSxXKDE3LDAsbnVsbCxudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxOCwwLG51bGwsbnVsbCwxLCJkaXYiLFtbImNsYXNzIiwibWF0LXRpdGxlIl1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxZKC0xLG51bGwsWyJJbmNsdWRlIElETEUgdGltZSBpbiBzdGF0aXN0aWNzIl0pKSwoYSgpKCksVygyMCwwLG51bGwsbnVsbCw4LCJtYXQtbWVudSIsW10sbnVsbCxudWxsLG51bGwsJEUsWUUpKSxtaCg2MTQ0LG51bGwsTUUsbnVsbCxbTkVdKSxtaCg2MTQ0LG51bGwsRUUsbnVsbCxbTUVdKSxJKDIzLDEyOTQzMzYsW1siaWRsZU9wdGlvbnMiLDRdXSwzLE5FLFt6LFQsSUVdLG51bGwsbnVsbCksWCg2MDM5Nzk3NzYsMSx7WnQ6MX0pLFgoNjAzOTc5Nzc2LDIse2l0ZW1zOjF9KSxYKDYwMzk3OTc3NiwzLHtTZzowfSksKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCwwLDEsbnVsbCwKUFQpKSxJKDI4LDI3ODUyOCxudWxsLDAscm8sW0VmLERmLHlmXSx7VWE6WzAsIm5nRm9yT2YiXX0sbnVsbCksKGEoKSgpLFcoMjksMCxudWxsLG51bGwsNywiZGl2IixbWyJjbGFzcyIsImlkbGUtYnV0dG9uLWNvbnRhaW5lciJdXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzMCwxNjc3NzIxNixudWxsLG51bGwsNiwiYnV0dG9uIixbWyJhcmlhLWhhc3BvcHVwIiwidHJ1ZSJdLFsiY2xhc3MiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIG1hdC1tZW51LXRyaWdnZXIiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIl1dLFtbMSwiZGlzYWJsZWQiLDBdLFsyLCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbnVsbF0sWzEsImFyaWEtZXhwYW5kZWQiLDBdLFsxLCJhcmlhLWNvbnRyb2xzIiwwXV0sW1tudWxsLCJtb3VzZWRvd24iXSxbbnVsbCwia2V5ZG93biJdLFtudWxsLCJjbGljayJdXSxmdW5jdGlvbihiLGMsZCl7dmFyIGU9ITA7Im1vdXNlZG93biI9PT1jJiYoZT0hMSE9PQpGKGIsMzIpLlFCKGQpJiZlKTsia2V5ZG93biI9PT1jJiYoZT0hMSE9PUYoYiwzMikuSGEoZCkmJmUpOyJjbGljayI9PT1jJiYoZT0hMSE9PUYoYiwzMikuTUIoZCkmJmUpO3JldHVybiBlfSxVQyxUQykpLEkoMzEsNDM3NDUyOCxudWxsLDAsUkMsW3osUnosWzIsa3ZdXSxudWxsLG51bGwpLEkoMzIsMTE5NjAzMixudWxsLDAsU0UsW1dCLHosRWYsT0UsWzIsTUVdLFs4LG51bGxdLFsyLE5BXSxSel0se3VhOlswLCJtZW51Il19LG51bGwpLChhKCkoKSxZKDMzLDAsWyIgIiwiICJdKSksKGEoKSgpLFcoMzQsMCxudWxsLDAsMiwibWF0LWljb24iLFtbImNsYXNzIiwibWF0LWljb24gbm90cmFuc2xhdGUiXSxbInJvbGUiLCJpbWciXV0sW1syLCJtYXQtaWNvbi1pbmxpbmUiLG51bGxdLFsyLCJtYXQtaWNvbi1uby1jb2xvciIsbnVsbF1dLG51bGwsbnVsbCx5RSx4RSkpLEkoMzUsOTE1ODY1NixudWxsLDAsdkUsW3osbkUsWzgsbnVsbF0sckUsdWRdLG51bGwsbnVsbCksKGEoKSgpLFkoLTEsCjAsWyJhcnJvd19kcm9wX2Rvd24iXSkpLChhKCkoKSxXKDM3LDAsbnVsbCxudWxsLDAsImJyIixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygzOCwwLG51bGwsbnVsbCw0LCJkaXYiLFtdLFtbOCwiY2xhc3NOYW1lIiwwXV0sbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDM5LDAsbnVsbCxudWxsLDEsInNlbGYtdGltZS1jaGFydCIsW10sbnVsbCxudWxsLG51bGwsTFQsS1QpKSxJKDQwLDYzODk3NixudWxsLDAsY1MsW10se2pjOlswLCJ0ZW5zb3JmbG93U3RhdHNEYXRhIl0sQ2Q6WzEsIm9wRXhlY3V0b3IiXSxnbTpbMiwib3BLaW5kIl19LG51bGwpLChhKCkoKSxXKDQxLDAsbnVsbCxudWxsLDEsInNlbGYtdGltZS1jaGFydCIsW10sbnVsbCxudWxsLG51bGwsTFQsS1QpKSxJKDQyLDYzODk3NixudWxsLDAsY1MsW10se2pjOlswLCJ0ZW5zb3JmbG93U3RhdHNEYXRhIl0sQ2Q6WzEsIm9wRXhlY3V0b3IiXSxnbTpbMiwib3BLaW5kIl19LG51bGwpLChhKCkoKSwKVyg0MywwLG51bGwsbnVsbCw0LCJkaXYiLFtbImNsYXNzIiwicm93Il1dLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkpLChhKCkoKSxXKDQ0LDAsbnVsbCxudWxsLDEsInNlbGYtdGltZS1jaGFydCIsW10sbnVsbCxudWxsLG51bGwsTFQsS1QpKSxJKDQ1LDYzODk3NixudWxsLDAsY1MsW10se2pjOlswLCJ0ZW5zb3JmbG93U3RhdHNEYXRhIl0sQ2Q6WzEsIm9wRXhlY3V0b3IiXSxnbTpbMiwib3BLaW5kIl19LG51bGwpLChhKCkoKSxXKDQ2LDAsbnVsbCxudWxsLDEsInNlbGYtdGltZS1jaGFydCIsW10sbnVsbCxudWxsLG51bGwsTFQsS1QpKSxJKDQ3LDYzODk3NixudWxsLDAsY1MsW10se2pjOlswLCJ0ZW5zb3JmbG93U3RhdHNEYXRhIl0sQ2Q6WzEsIm9wRXhlY3V0b3IiXSxnbTpbMiwib3BLaW5kIl19LG51bGwpLChhKCkoKSxXKDQ4LDAsbnVsbCxudWxsLDEsIm1hdC1kaXZpZGVyIixbWyJjbGFzcyIsIm1hdC1kaXZpZGVyIl0sWyJyb2xlIiwic2VwYXJhdG9yIl1dLFtbMSwiYXJpYS1vcmllbnRhdGlvbiIsCjBdLFsyLCJtYXQtZGl2aWRlci12ZXJ0aWNhbCIsbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWhvcml6b250YWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1pbnNldCIsbnVsbF1dLG51bGwsbnVsbCxCRCxBRCkpLEkoNDksNDkxNTIsbnVsbCwwLHlELFtdLG51bGwsbnVsbCksKGEoKSgpLFcoNTAsMCxudWxsLG51bGwsMSwic3RhdHMtdGFibGUiLFtdLG51bGwsbnVsbCxudWxsLE5ULE1UKSksSSg1MSw2Mzg5NzYsbnVsbCwwLGVTLFtdLHtqYzpbMCwidGVuc29yZmxvd1N0YXRzRGF0YSJdLExqOlsxLCJoYXNEZXZpY2VEYXRhIl19LG51bGwpLChhKCkoKSxXKDUyLDAsbnVsbCxudWxsLDEsIm1hdC1kaXZpZGVyIixbWyJjbGFzcyIsIm1hdC1kaXZpZGVyIl0sWyJyb2xlIiwic2VwYXJhdG9yIl1dLFtbMSwiYXJpYS1vcmllbnRhdGlvbiIsMF0sWzIsIm1hdC1kaXZpZGVyLXZlcnRpY2FsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaG9yaXpvbnRhbCIsbnVsbF0sWzIsIm1hdC1kaXZpZGVyLWluc2V0IiwKbnVsbF1dLG51bGwsbnVsbCxCRCxBRCkpLEkoNTMsNDkxNTIsbnVsbCwwLHlELFtdLG51bGwsbnVsbCksKGEoKSgpLFcoNTQsMCxudWxsLG51bGwsMSwib3BlcmF0aW9ucy10YWJsZSIsW10sW1s4LCJoaWRkZW4iLDBdXSxudWxsLG51bGwsSlQsSVQpKSxJKDU1LDYzODk3NixudWxsLDAsYVMsW10se2pjOlswLCJ0ZW5zb3JmbG93U3RhdHNEYXRhIl0sQ2Q6WzEsIm9wRXhlY3V0b3IiXX0sbnVsbCksKGEoKSgpLFcoNTYsMCxudWxsLG51bGwsMSwibWF0LWRpdmlkZXIiLFtbImNsYXNzIiwibWF0LWRpdmlkZXIiXSxbInJvbGUiLCJzZXBhcmF0b3IiXV0sW1sxLCJhcmlhLW9yaWVudGF0aW9uIiwwXSxbMiwibWF0LWRpdmlkZXItdmVydGljYWwiLG51bGxdLFsyLCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIixudWxsXSxbMiwibWF0LWRpdmlkZXItaW5zZXQiLG51bGxdXSxudWxsLG51bGwsQkQsQUQpKSxJKDU3LDQ5MTUyLG51bGwsMCx5RCxbXSxudWxsLG51bGwpLChhKCkoKSxXKDU4LDAsCm51bGwsbnVsbCwxLCJvcGVyYXRpb25zLXRhYmxlIixbXSxudWxsLG51bGwsbnVsbCxKVCxJVCkpLEkoNTksNjM4OTc2LG51bGwsMCxhUyxbXSx7amM6WzAsInRlbnNvcmZsb3dTdGF0c0RhdGEiXSxDZDpbMSwib3BFeGVjdXRvciJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXt2YXIgZD1jLmE7YihjLDEzLDApO2IoYywyMywwKTtiKGMsMjgsMCxkLiRQKTt2YXIgZT1GKGMsMjMpO2IoYywzMiwwLGUpO2IoYywzNSwwKTtiKGMsNDAsMCxkLk9jLGQuU3ksZC5VRyk7YihjLDQyLDAsZC5PYyxkLlN5LGQuVEcpO2IoYyw0NSwwLGQuT2MsZC5UeSxkLlVHKTtiKGMsNDcsMCxkLk9jLGQuVHksZC5URyk7YihjLDUxLDAsZC5PYyxkLkxqKTtiKGMsNTUsMCxkLk9jLGQuU3kpO2IoYyw1OSwwLGQuT2MsZC5UeSl9LGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9RihjLDEzKS5pbmxpbmUsZj0icHJpbWFyeSIhPT1GKGMsMTMpLmNvbG9yJiYiYWNjZW50IiE9PUYoYywxMykuY29sb3ImJiJ3YXJuIiE9PQpGKGMsMTMpLmNvbG9yO2IoYywxMiwwLGUsZik7ZT1GKGMsMzEpLmRpc2FibGVkfHxudWxsO2Y9Ik5vb3BBbmltYXRpb25zIj09PUYoYywzMSkuaWE7dmFyIGc9RihjLDMyKS5Nb3x8bnVsbCxsPUYoYywzMikuTW8/RihjLDMyKS51YS5XeTpudWxsO2IoYywzMCwwLGUsZixnLGwpO2IoYywzMywwLGQuR3MpO2U9RihjLDM1KS5pbmxpbmU7Zj0icHJpbWFyeSIhPT1GKGMsMzUpLmNvbG9yJiYiYWNjZW50IiE9PUYoYywzNSkuY29sb3ImJiJ3YXJuIiE9PUYoYywzNSkuY29sb3I7YihjLDM0LDAsZSxmKTtiKGMsMzgsMCxkLkxqPyJyb3cgZnVsbC1oZWlnaHQiOiJyb3cgaGlkZGVuLWNvbnRlbnQiKTtlPUYoYyw0OSkudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsNDkpLnZlcnRpY2FsO2c9IUYoYyw0OSkudmVydGljYWw7bD1GKGMsNDkpLkhlO2IoYyw0OCwwLGUsZixnLGwpO2U9RihjLDUzKS52ZXJ0aWNhbD8idmVydGljYWwiOiJob3Jpem9udGFsIjtmPUYoYyw1MykudmVydGljYWw7Cmc9IUYoYyw1MykudmVydGljYWw7bD1GKGMsNTMpLkhlO2IoYyw1MiwwLGUsZixnLGwpO2IoYyw1NCwwLCFkLkxqKTtlPUYoYyw1NykudmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCI7Zj1GKGMsNTcpLnZlcnRpY2FsO2c9IUYoYyw1NykudmVydGljYWw7bD1GKGMsNTcpLkhlO2IoYyw1NiwwLGUsZixnLGwpfSl9dmFyIFJUPVFnKCJ0ZW5zb3JmbG93LXN0YXRzIixXUixmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInRlbnNvcmZsb3ctc3RhdHMiLFtdLG51bGwsbnVsbCxudWxsLFFULE9UKSksSSgxLDQ5MTUyLG51bGwsMCxXUixbeHcsS0ksY0ldLG51bGwsbnVsbCldLG51bGwsbnVsbCl9KTt2YXIgU1Q9Y2coe1Q6MCxnOltbImlmcmFtZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3h9Il1dLGRhdGE6e319KTtmdW5jdGlvbiBUVChhKXtyZXR1cm4gWigwLFtsaCgwLGlTLFtdKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsImlmcmFtZSIsW10sW1s4LCJzcmMiLDVdXSxudWxsLG51bGwsbnVsbCxudWxsKSksT20oMTI4LDIsbWUoMikpXSxudWxsLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLGU9YmcoYywxLGIoYywyLDAsRihjLDApLGQudXJsKSk7YihjLDEsMCxlKX0pfXZhciBVVD1RZygidHJhY2Utdmlld2VyIixoUyxmdW5jdGlvbihhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsInRyYWNlLXZpZXdlciIsW10sbnVsbCxudWxsLG51bGwsVFQsU1QpKSxJKDEsNDkxNTIsbnVsbCwwLGhTLFtPbyx4d10sbnVsbCxudWxsKV0sbnVsbCxudWxsKX0pO3ZhciBWVD1jZyh7VDowLGc6W1sibWF0LXByb2dyZXNzLWJhcltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MzAwcHg7bWFyZ2luOjAgYXV0b30ucHJvZ3Jlc3MtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjUwcHh9LmxvYWRpbmctbWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6Zml0LWNvbnRlbnQ7bWFyZ2luOjAgYXV0b30iXV0sZGF0YTp7fX0pO2Z1bmN0aW9uIFdUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMiwiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsIm1haW4tcGFnZSIsW10sbnVsbCxudWxsLG51bGwsZEssY0spKSxJKDIsNDkxNTIsbnVsbCwwLCRJLFtJeSxjSV0se0tnOlswLCJkYXRhc2V0cyJdfSxudWxsKV0sZnVuY3Rpb24oYixjKXtiKGMsMiwwLGMuYS5LZyl9LG51bGwpfQpmdW5jdGlvbiBYVChhKXtyZXR1cm4gWigwLFsoYSgpKCksVygwLDAsbnVsbCxudWxsLDEsImVtcHR5LXBhZ2UiLFtdLG51bGwsbnVsbCxudWxsLGlLLGZLKSksSSgxLDQ5MTUyLG51bGwsMCxlSyxbXSxudWxsLG51bGwpXSxudWxsLG51bGwpfWZ1bmN0aW9uIFlUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsMywiZGl2IixbXSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVigxNjc3NzIxNixudWxsLG51bGwsMSxudWxsLFdUKSksSSgyLDE2Mzg0LG51bGwsMCx1byxbRWYsRGZdLHtSYTpbMCwibmdJZiJdLEp5OlsxLCJuZ0lmRWxzZSJdfSxudWxsKSwoYSgpKCksVigwLFtbImVtcHR5cGFnZSIsMl1dLG51bGwsMCxudWxsLFhUKSldLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9Yy5hLm5GLGU9RihjLDMpO2IoYywyLDAsZCxlKX0sbnVsbCl9CmZ1bmN0aW9uIFpUKGEpe3JldHVybiBaKDAsWyhhKCkoKSxXKDAsMCxudWxsLG51bGwsNCwiZGl2IixbWyJjbGFzcyIsInByb2dyZXNzLWNvbnRhaW5lciJdXSxbWzgsImhpZGRlbiIsMF1dLG51bGwsbnVsbCxudWxsLG51bGwpKSwoYSgpKCksVygxLDAsbnVsbCxudWxsLDEsImRpdiIsW1siY2xhc3MiLCJsb2FkaW5nLW1lc3NhZ2UiXV0sbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSksKGEoKSgpLFkoLTEsbnVsbCxbIkxvYWRpbmcgZGF0YSJdKSksKGEoKSgpLFcoMywwLG51bGwsbnVsbCwxLCJtYXQtcHJvZ3Jlc3MtYmFyIixbWyJhcmlhLXZhbHVlbWF4IiwiMTAwIl0sWyJhcmlhLXZhbHVlbWluIiwiMCJdLFsiY2xhc3MiLCJtYXQtcHJvZ3Jlc3MtYmFyIl0sWyJjb2xvciIsInByaW1hcnkiXSxbIm1vZGUiLCJpbmRldGVybWluYXRlIl0sWyJyb2xlIiwicHJvZ3Jlc3NiYXIiXV0sW1sxLCJhcmlhLXZhbHVlbm93IiwwXSxbMSwibW9kZSIsMF0sWzIsIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwKbnVsbF1dLG51bGwsbnVsbCxoRixnRikpLEkoNCw0Mzc0NTI4LG51bGwsMCxlRixbeixULFsyLGt2XSxbMixjRl1dLHtjb2xvcjpbMCwiY29sb3IiXSxtb2RlOlsxLCJtb2RlIl19LG51bGwpXSxmdW5jdGlvbihiLGMpe2IoYyw0LDAsInByaW1hcnkiLCJpbmRldGVybWluYXRlIil9LGZ1bmN0aW9uKGIsYyl7YihjLDAsMCwhYy5hLnphKTt2YXIgZD0iaW5kZXRlcm1pbmF0ZSI9PT1GKGMsNCkubW9kZXx8InF1ZXJ5Ij09PUYoYyw0KS5tb2RlP251bGw6RihjLDQpLnZhbHVlLGU9RihjLDQpLm1vZGUsZj1GKGMsNCkudHY7YihjLDMsMCxkLGUsZil9KX0KZnVuY3Rpb24gJFQoYSl7cmV0dXJuIFooMCxbKGEoKSgpLFYoMTY3NzcyMTYsbnVsbCxudWxsLDEsbnVsbCxZVCkpLEkoMSwxNjM4NCxudWxsLDAsdW8sW0VmLERmXSx7UmE6WzAsIm5nSWYiXSxKeTpbMSwibmdJZkVsc2UiXX0sbnVsbCksKGEoKSgpLFYoMCxbWyJwcm9ncmVzc19iYXIiLDJdXSxudWxsLDAsbnVsbCxaVCkpXSxmdW5jdGlvbihiLGMpe3ZhciBkPSFjLmEuemEsZT1GKGMsMik7YihjLDEsMCxkLGUpfSxudWxsKX12YXIgYVU9UWcoImFwcCIsT0ksZnVuY3Rpb24oYSl7cmV0dXJuIFooMCxbKGEoKSgpLFcoMCwwLG51bGwsbnVsbCwxLCJhcHAiLFtdLG51bGwsbnVsbCxudWxsLCRULFZUKSksSSgxLDExNDY4OCxudWxsLDAsT0ksW0tJXSxudWxsLG51bGwpXSxmdW5jdGlvbihiLGMpe2IoYywxLDApfSxudWxsKX0pO3ZhciBiVT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXSxkPTE7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2QtMV09YXJndW1lbnRzW2RdO3ZhciBlPW5ldyBNYXA7ZD17fTtjPW4oYyk7Zm9yKHZhciBmPWMubmV4dCgpOyFmLmRvbmU7ZD17RG06ZC5EbX0sZj1jLm5leHQoKSl7ZC5EbT1mLnZhbHVlO2Y9e307Zm9yKHZhciBnPW4oZC5EbS50eXBlcyksbD1nLm5leHQoKTshbC5kb25lO2Y9e1J0OmYuUnR9LGw9Zy5uZXh0KCkpbD1sLnZhbHVlLGUuaGFzKGwpPyhmLlJ0PWUuZ2V0KGwpLGUuc2V0KGwsZnVuY3Rpb24obSxwKXtyZXR1cm4gZnVuY3Rpb24ocSxyKXtyZXR1cm4gbS5EbS50SChwLlJ0KHEscikscil9fShkLGYpKSk6ZS5zZXQobCxkLkRtLnRIKX1yZXR1cm4gZnVuY3Rpb24obSxwKXttPXZvaWQgMD09PW0/YTptO3ZhciBxPWUuZ2V0KHAudHlwZSk7cmV0dXJuIHE/cShtLHApOm19fSh7R3k6e09yOm51bGx9LFV5OntNbjpudWxsfSxiejp7eWo6bnVsbH0sSGc6ITEsRGI6e3phOiExLAptZXNzYWdlOiIifSxqczoiIn0sbUgoYUosZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtHeTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYS5HeSkse09yOmIuT3J9KX0pfSksbUgoYkosZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtVeTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYS5VeSkse01uOmIuTW59KX0pfSksbUgoY0osZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtiejpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYS5ieikse3lqOmIueWp9KX0pfSksbUgoZEosZnVuY3Rpb24oYSxiKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtIZzpiLkhnfSl9KSxtSChlSixmdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sCmEpLHtEYjpiLkRifSl9KSxtSChmSixmdW5jdGlvbihhLGIpe3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2pzOmIuanN9KX0pKTtmdW5jdGlvbiBjVShhLGIpe3JldHVybiBiVShhLGIpfTt2YXIgZFU9ZnVuY3Rpb24oKXt9O25ldyBjZCh6SCk7bmV3IGRkO25ldyBmZDtuZXcgY2QodkgpO3ZhciBlVT1mdW5jdGlvbigpe307dmFyIGZVOwpmVT1uZXcgJG4oZVUsW09JXSxmdW5jdGlvbigpe3JldHVybiBHZyhbQSg1MTIsVWUsVmUsW1s4LFtsRCxpSCxYRyxURyxvSixzeixqSyx1VCxRSyxmTCx2UyxDUyxLUyxIVCxSVCxVVCxhVV1dLFszLFVlXSxwZF0pLEEoNTEyMCxRZSx3bSxbWzMsUWVdXSksQSg0NjA4LHpvLEFvLFtRZV0pLEEoNTEyMCx3aCx4bSxbVF0pLEEoNTEyMCxKZSxLZSxbXSksQSg1MTIwLHlmLHVtLFtdKSxBKDUxMjAsemYsdm0sW10pLEEoNDYwOCxhcSxmcSxbTG9dKSxBKDYxNDQsaGYsbnVsbCxbYXFdKSxBKDQ2MDgsTXAsT3AsW10pLEEoNTEyMCx2cCxmdW5jdGlvbihhLGIsYyxkLGUsZixnLGwpe3JldHVybltuZXcgS3AoYSxiLGMpLG5ldyBWcChkKSxuZXcgUXAoZSxmLGcsbCldfSxbTG8sVCxOZSxMbyxMbyxNcCxQZSxbMixOcF1dKSxBKDQ2MDgsd3Asd3AsW3ZwLFRdKSxBKDEzNTY4MCxBcCxBcCxbTG9dKSxBKDQ2MDgsR3AsR3AsW3dwLEFwLEplXSksQSg1MTIwLFZyLGh2LFtdKSxBKDUxMjAsU3IsaXYsCltdKSxBKDQ2MDgsUXMsZ3YsW0xvLFZyLFNyXSksQSg1MTIwLFllLGp2LFtHcCxRcyxUXSksQSg2MTQ0LHlwLG51bGwsW0FwXSksQSg0NjA4LEJrLEJrLFtUXSksQSg0NjA4LEp0LEt0LFtMbyxOZSxIdF0pLEEoNDYwOCxMdCxMdCxbSnQsSXRdKSxBKDUxMjAsQ3QsZnVuY3Rpb24oYSl7cmV0dXJuW2FdfSxbTHRdKSxBKDQ2MDgsRnQsRnQsW10pLEEoNjE0NCxFdCxudWxsLFtGdF0pLEEoNDYwOCxHdCxHdCxbRXRdKSxBKDYxNDQsaXQsbnVsbCxbR3RdKSxBKDQ2MDgsaHQsTXQsW2l0LHBlXSksQSg0NjA4LEF0LEF0LFtodF0pLEEoNDYwOCxXQixXQixbb0IsY0IsVWUsS0IsZUIscGUsVCxMbyxOQSxbMixjcF1dKSxBKDUxMjAsWUIsYUMsW1dCXSksQSg1MTIwLHFELHJELFtXQl0pLEEoMTM1NjgwLHNELHNELFtXQixwZSxbMixjcF0sWzIscERdLHFELFszLHNEXSxjQl0pLEEoNDYwOCxidSxidSxbXSksQSg0NjA4LHh6LHh6LFtdKSxBKDQ2MDgscUMscUMsW10pLEEoNTEyMCxHRixIRixbV0JdKSwKQSg1MTIwLCRHLGFILFtXQl0pLEEoNTEyMCxPRSxQRSxbV0JdKSxBKDUxMjAseHcsbHosW0l5XSksQSg0NjA4LFh5LFh5LFtdKSxBKDYxNDQsVnksbnVsbCxbWHldKSxBKDEzNTY4MCxZeSxZeSxbSXksa20seWgscGUsVnldKSxBKDQ2MDgsV3ksV3ksW10pLEEoNTEyMCxieixoeixbSXksZXAsZXpdKSxBKDUxMjAscHosb3osW216XSksQSg1MTIwLE9lLGZ1bmN0aW9uKGEpe3JldHVyblthXX0sW3B6XSksQSg0NjA4LG9xLFl1LFtZZSxMb10pLEEoNDYwOCxLSSxLSSxbQXQsT29dKSxBKDEwNzM3NDIzMzYsS28sS28sW10pLEEoMTAyNCx1ZCxjcSxbXSksQSgxMDI0LGJtLGZ1bmN0aW9uKCl7cmV0dXJuW25ldyBibSgiUm91dGVyIixJeSldfSxbXSksQSg1MTIsbXosbXosW3BlXSksQSgxMDI0LEdlLGZ1bmN0aW9uKGEsYil7cmV0dXJuW3RwKGEpLGIuRU8uYmluZChiKV19LFtbMixibV0sbXpdKSxBKDUxMixIZSxIZSxbWzIsR2VdXSksQSgxMzE1ODQsZm0sZm0sW1QsUGUscGUsdWQsVWUsCkhlXSksQSgxMDczNzQyMzM2LHltLHltLFtmbV0pLEEoMTA3Mzc0MjMzNixlcSxlcSxbWzMsZXFdXSksQSgxMDczNzQyMzM2LGlxLGlxLFtdKSxBKDEwNzM3NDIzMzYsTnQsTnQsW10pLEEoMTA3Mzc0MjMzNixPdCxPdCxbXSksQSgxMDczNzQyMzM2LE9BLE9BLFtdKSxBKDEwNzM3NDIzMzYsakMsakMsW2RBLFsyLGlDXSxbMixMb11dKSxBKDEwNzM3NDIzMzYsZkYsZkYsW10pLEEoMTA3Mzc0MjMzNixMeixMeixbXSksQSgxMDczNzQyMzM2LExDLExDLFtdKSxBKDEwNzM3NDIzMzYsU0MsU0MsW10pLEEoMTA3Mzc0MjMzNixUQixUQixbXSksQSgxMDczNzQyMzM2LG1CLG1CLFtdKSxBKDEwNzM3NDIzMzYsbkIsbkIsW10pLEEoMTA3Mzc0MjMzNixiQyxiQyxbXSksQSgxMDczNzQyMzM2LHhELHhELFtdKSxBKDEwNzM3NDIzMzYsb0Ysb0YsW10pLEEoMTA3Mzc0MjMzNixXdSxXdSxbXSksQSgxMDczNzQyMzM2LFh1LFh1LFtdKSxBKDEwNzM3NDIzMzYsQXosQXosW10pLEEoMTA3Mzc0MjMzNiwKWkQsWkQsW10pLEEoMTA3Mzc0MjMzNixlQyxlQyxbXSksQSgxMDczNzQyMzM2LERFLERFLFtdKSxBKDEwNzM3NDIzMzYsQ0YsQ0YsW10pLEEoMTA3Mzc0MjMzNixOQyxOQyxbXSksQSgxMDczNzQyMzM2LE9DLE9DLFtdKSxBKDEwNzM3NDIzMzYsTUYsTUYsW10pLEEoMTA3Mzc0MjMzNixqQSxqQSxbZEFdKSxBKDEwNzM3NDIzMzYsZkgsZkgsW10pLEEoMTA3Mzc0MjMzNixwSixwSixbXSksQSgxMDczNzQyMzM2LE1HLE1HLFtdKSxBKDEwNzM3NDIzMzYsc0osc0osW10pLEEoMTA3Mzc0MjMzNixrSyxrSyxbXSksQSgxMDczNzQyMzM2LGVHLGVHLFtdKSxBKDEwNzM3NDIzMzYsWUMsWUMsW10pLEEoMTA3Mzc0MjMzNixTUixTUixbXSksQSgxMDczNzQyMzM2LFRSLFRSLFtdKSxBKDEwNzM3NDIzMzYsVVIsVVIsW10pLEEoMTA3Mzc0MjMzNixWUixWUixbXSksQSgxMDczNzQyMzM2LGpTLGpTLFtdKSxBKDEwNzM3NDIzMzYsa1Msa1MsW10pLEEoMTA3Mzc0MjMzNixSSyxSSyxbXSksQSgxMDczNzQyMzM2LAp3RSx3RSxbXSksQSgxMDczNzQyMzM2LGxSLGxSLFtdKSxBKDEwNzM3NDIzMzYscVIscVIsW10pLEEoMTA3Mzc0MjMzNixzUixzUixbXSksQSgxMDczNzQyMzM2LHlSLHlSLFtdKSxBKDEwNzM3NDIzMzYsS0EsS0EsW10pLEEoMTA3Mzc0MjMzNixJRCxJRCxbXSksQSgxMDczNzQyMzM2LEFSLEFSLFtdKSxBKDEwNzM3NDIzMzYsZ1IsZ1IsW10pLEEoMTA3Mzc0MjMzNixCUixCUixbXSksQSgxMDczNzQyMzM2LFNLLFNLLFtdKSxBKDEwNzM3NDIzMzYsVEssVEssW10pLEEoMTA3Mzc0MjMzNixVSyxVSyxbXSksQSgxMDczNzQyMzM2LHpELHpELFtdKSxBKDEwNzM3NDIzMzYsVkssVkssW10pLEEoMTA3Mzc0MjMzNixCRyxCRyxbXSksQSgxMDczNzQyMzM2LGdMLGdMLFtdKSxBKDEwNzM3NDIzMzYsaEwsaEwsW10pLEEoMTA3Mzc0MjMzNixpTCxpTCxbXSksQSgxMDczNzQyMzM2LG9MLG9MLFtdKSxBKDEwNzM3NDIzMzYsckwsckwsW10pLEEoMTA3Mzc0MjMzNixsTCxsTCxbXSksQSgxMDczNzQyMzM2LApzTCxzTCxbXSksQSgxMDczNzQyMzM2LFBMLFBMLFtdKSxBKDEwNzM3NDIzMzYsVEwsVEwsW10pLEEoMTA3Mzc0MjMzNixVTCxVTCxbXSksQSgxMDczNzQyMzM2LHNHLHNHLFtdKSxBKDEwNzM3NDIzMzYsdEcsdEcsW10pLEEoMTA3Mzc0MjMzNixiUixiUixbXSksQSgxMDczNzQyMzM2LGNSLGNSLFtdKSxBKDEwNzM3NDIzMzYsZFIsZFIsW10pLEEoMTA3Mzc0MjMzNixGUixGUixbXSksQSgxMDczNzQyMzM2LFVFLFVFLFtdKSxBKDEwNzM3NDIzMzYsVkUsVkUsW10pLEEoMTA3Mzc0MjMzNixRUixRUixbXSksQSgxMDczNzQyMzM2LFJSLFJSLFtdKSxBKDEwNzM3NDIzMzYsWlIsWlIsW10pLEEoMTA3Mzc0MjMzNiwkUiwkUixbXSksQSgxMDczNzQyMzM2LGJTLGJTLFtdKSxBKDEwNzM3NDIzMzYsZFMsZFMsW10pLEEoMTA3Mzc0MjMzNixmUyxmUyxbXSksQSgxMDczNzQyMzM2LGdTLGdTLFtdKSxBKDEwMjQsZnosanosW1szLEl5XV0pLEEoNTEyLFp2LCR2LFtdKSxBKDUxMix4eSx4eSxbXSksCkEoMjU2LGV6LHt9LFtdKSxBKDEwMjQsWW8saXosW09vLFsyLGFwXSxlel0pLEEoNTEyLGNwLGNwLFtZbyxPb10pLEEoNTEyLHloLHloLFtdKSxBKDUxMixrbSxxbSxbeWgsWzIsb21dXSksQSgxMDI0LHV5LGZ1bmN0aW9uKCl7cmV0dXJuW1t7cGF0aDoiZW1wdHkiLGE6ZUt9LHtwYXRoOiJvdmVydmlld19wYWdlIixhOmZSfSx7cGF0aDoib3ZlcnZpZXdfcGFnZUAiLGE6ZlJ9LHtwYXRoOiJpbnB1dF9waXBlbGluZV9hbmFseXplciIsYTpuS30se3BhdGg6ImlucHV0X3BpcGVsaW5lX2FuYWx5emVyQCIsYTpuS30se3BhdGg6Imtlcm5lbF9zdGF0cyIsYTpXS30se3BhdGg6Im1lbW9yeV9wcm9maWxlIixhOmpMfSx7cGF0aDoibWVtb3J5X3ZpZXdlciIsYTpMTH0se3BhdGg6Im9wX3Byb2ZpbGUiLGE6V1F9LHtwYXRoOiJwb2Rfdmlld2VyIixhOkNSfSx7cGF0aDoidGVuc29yZmxvd19zdGF0cyIsYTpXUn0se3BhdGg6InRyYWNlX3ZpZXdlciIsYTpoU30se3BhdGg6InRyYWNlX3ZpZXdlciMiLAphOmhTfSx7cGF0aDoidHJhY2Vfdmlld2VyQCIsYTpoU30se3BhdGg6IioqIixhOmVLfV1dfSxbXSksQSgxMDI0LEl5LGt6LFtadix4eSxjcCxwZSxrbSx5aCx1eSxleixbMix6eV0sWzIsc3ldXSksQSgxMDczNzQyMzM2LGd6LGd6LFtbMixmel0sWzIsSXldXSksQSgxMDczNzQyMzM2LGxTLGxTLFtdKSxBKDEwNzM3NDIzMzYsbXYsbXYsW10pLEEoMTAyNCx4SCxmdW5jdGlvbigpe3JldHVyblt7fV19LFtdKSxBKDEwMjQsdUgsZnVuY3Rpb24oKXtyZXR1cm5be2tleToicm9vdCIsbG06SEgsU3M6W119XX0sW10pLEEoMTAyNCx5SCxySSxbcGUseEgsdUhdKSxBKDEwMjQsd0gsZnVuY3Rpb24oKXtyZXR1cm5bY1VdfSxbXSksQSgxMDI0LHpILGZ1bmN0aW9uKGEpe3JldHVyblthXX0sW3dIXSksQSgxMDI0LEFILGZ1bmN0aW9uKGEsYil7cmV0dXJuW3NJKGEsYildfSxbcGUsd0gsekhdKSxBKDEzMTU4NCxsSCxsSCxbXSksQSgyMDQ4LE5ILG51bGwsW2xIXSksQSgyNTYsb0gsdm9pZCAwLFtdKSwKQSgxMDI0LHBILG9JLFtvSF0pLEEoMjU2LHRILHt9LFtdKSxBKDIwNDgsdkgsbnVsbCxbdEhdKSxBKDEwMjQsc0gscUksW3BlLHRILHZIXSksQSgyNTYsckgsSEgsW10pLEEoMjU2LEZILHZvaWQgMCxbXSksQSgxMDI0LEVILG1JLFtGSF0pLEEoMTAyNCxHSCxqSSxbRUhdKSxBKDEwMjQsQ0gsZnVuY3Rpb24oYSxiKXtyZXR1cm5bbEkoYSksa0koYildfSxbR0gsR0hdKSxBKDI1NixCSCxbXSxbXSksQSgxMDI0LERILHRJLFtDSCxCSF0pLEEoMTAyNCxxSCxLSCxbckgsREhdKSxBKDEzMTU4NCxPSCxPSCxbTkgscEgsc0gscUhdKSxBKDIwNDgsTUgsbnVsbCxbT0hdKSxBKDEzMTU4NCxVSCxVSCxbXSksQSgxMzE1ODQsYkksYkksW2xILE1ILFVILHBIXSksQSgyMDQ4LCRILG51bGwsW2JJXSksQSg1MTIsY0ksY0ksWyRILGxILE9IXSksQSgxMDI0LG5ILHVJLFtbMyxjSV1dKSxBKDEwNzM3NDIzMzYsbkksbkksW2xILE1ILFVILGNJLFsyLG5IXV0pLEEoMTA3Mzg3MzQwOCxwSSxwSSxbeUgsCkFILE9ILG5JXSksQSgxMDczNzQyMzM2LGRVLGRVLFtdKSxBKDEwNzM3NDIzMzYsZVUsZVUsW10pLEEoMjU2LFJlLCJVU0QiLFtdKSxBKDI1NixvZSwicm9vdCIsW10pLEEoMjU2LEh0LCJYU1JGLVRPS0VOIixbXSksQSgyNTYsSXQsIlgtWFNSRi1UT0tFTiIsW10pLEEoMjU2LGt2LCJCcm93c2VyQW5pbWF0aW9ucyIsW10pXSl9KTtpZihGZCl0aHJvdyBFcnJvcigiQ2Fubm90IGVuYWJsZSBwcm9kIG1vZGUgYWZ0ZXIgcGxhdGZvcm0gc2V0dXAuIik7RWQ9ITE7CihmdW5jdGlvbigpe3ZhciBhPWRxKCksYj1uZXcgVCh7dUY6R2QoKSx0cDohMX0pLGM9W3tZYTpULGtkOmJ9XTtiLmdhKGZ1bmN0aW9uKCl7dmFyIGQ9cmUoe3JjOmMscGFyZW50OmEuWixuYW1lOmZVLkJHLm5hbWV9KSxlPWZVLmNyZWF0ZShkKSxmPWUuWi5nZXQodWQsbnVsbCk7aWYoIWYpdGhyb3cgRXJyb3IoIk5vIEVycm9ySGFuZGxlci4gSXMgcGxhdGZvcm0gbW9kdWxlIChCcm93c2VyTW9kdWxlKSBpbmNsdWRlZD8iKTtlLlZhKGZ1bmN0aW9uKCl7cmV0dXJuIFpnKGEuTHYsZSl9KTtiLm9hKGZ1bmN0aW9uKCl7cmV0dXJuIGIuTEcuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKGcpe2YuaGFuZGxlRXJyb3IoZyl9fSl9KTtyZXR1cm4gaG0oZixiLGZ1bmN0aW9uKCl7dmFyIGc9ZS5aLmdldChIZSk7SWUoZyk7cmV0dXJuIGcudVAudGhlbihmdW5jdGlvbigpe2EuWEwoZSk7cmV0dXJuIGV9KX0pfSl9KSgpOwo=",
"headers": [
[
"content-type",
"application/javascript"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/data?run=20201119-035554/2020_11_19_03_58_10&tag=memory_profile&host=c2ccf5deef0a": {
"data": "eyJtZW1vcnlQcm9maWxlUGVyQWxsb2NhdG9yIjp7fSwibnVtSG9zdHMiOjEsIm1lbW9yeUlkcyI6W119",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/data?run=20201119-035554/2020_11_19_03_58_10&tag=overview_page@&host=c2ccf5deef0a": {
"data": "W3siY29scyI6W3siaWQiOiJzZWxmVGltZVBlcmNlbnQiLCJsYWJlbCI6IlRpbWUgKCUpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJjdW11bGF0aXZlVGltZVBlcmNlbnQiLCJsYWJlbCI6IkN1bXVsYXRpdmUgdGltZSAoJSkiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6ImNhdGVnb3J5IiwibGFiZWwiOiJDYXRlZ29yeSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoib3BlcmF0aW9uIiwibGFiZWwiOiJPcGVyYXRpb24iLCJ0eXBlIjoic3RyaW5nIn0seyJpZCI6ImZsb3BSYXRlIiwibGFiZWwiOiJHRkxPUHMvU2VjIiwidHlwZSI6Im51bWJlciJ9XSwicm93cyI6W10sInAiOnsiaG9zdF90Zl9vcF9wZXJjZW50IjoiMTAwLjAlIiwiZGV2aWNlX3RmX29wX3BlcmNlbnQiOiIwLjAlIiwiaG9zdF9vcF90aW1lX2VhZ2VyX3BlcmNlbnQiOiI3LjMlIiwiZGV2aWNlX29wX3RpbWVfZWFnZXJfcGVyY2VudCI6IjAuMCUiLCJkZXZpY2VfY29tcHV0ZV8xNmJpdF9wZXJjZW50IjoiMC4wJSIsImRldmljZV9jb21wdXRlXzMyYml0X3BlcmNlbnQiOiIwLjAlIiwicmVtYXJrX3RleHQiOiIiLCJyZW1hcmtfY29sb3IiOiIifX0seyJjb2xzIjpbeyJpZCI6InN0ZXBudW0iLCJsYWJlbCI6IlN0ZXAgbnVtYmVyIiwidHlwZSI6InN0cmluZyJ9LHsiaWQiOiJkZXZpY2VDb21wdXRlVGltZU1zIiwibGFiZWwiOiJEZXZpY2UgY29tcHV0ZSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiZGV2aWNlVG9EZXZpY2VUaW1lTXMiLCJsYWJlbCI6IkRldmljZSB0byBkZXZpY2UiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6Imhvc3RDb21wdXRlVGltZU1zIiwibGFiZWwiOiJIb3N0IGNvbXB1dGUiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6Imtlcm5lbExhdW5jaFRpbWVNcyIsImxhYmVsIjoiS2VybmVsIGxhdW5jaCIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiaW5mZWVkVGltZU1zIiwibGFiZWwiOiJJbnB1dCIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoib3V0ZmVlZFRpbWVNcyIsImxhYmVsIjoiT3V0cHV0IiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJjb21waWxlVGltZU1zIiwibGFiZWwiOiJDb21waWxhdGlvbiIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoib3RoZXJUaW1lTXMiLCJsYWJlbCI6IkFsbCBvdGhlcnMiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6InRvb2x0aXAiLCJsYWJlbCI6InRvb2x0aXAiLCJ0eXBlIjoic3RyaW5nIiwicCI6eyJyb2xlIjoidG9vbHRpcCJ9fV0sInJvd3MiOlt7ImMiOlt7InYiOiIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMTQ0MTI2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MDU4MX0seyJ2IjoiU3RlcCAwLCBkdXJhdGlvbjogNC4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogNC4xNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy45MjEyMDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE0OTgzfSx7InYiOiJTdGVwIDEsIGR1cmF0aW9uOiAxNC4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuOTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuNTQ1Nzc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMDQ1M30seyJ2IjoiU3RlcCAyLCBkdXJhdGlvbjogMTQuNjYgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjU1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjMzNzg4OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zODE3Mjh9LHsidiI6IlN0ZXAgMywgZHVyYXRpb246IDE4LjcyIG1zXG4tQWxsIG90aGVyczogMC4zOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4zNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4yMjkzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDUwMDF9LHsidiI6IlN0ZXAgNCwgZHVyYXRpb246IDE2LjMzIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4yMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS43OTAyMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA5ODA4fSx7InYiOiJTdGVwIDUsIGR1cmF0aW9uOiAxOS45MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODA1NDY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODc3N30seyJ2IjoiU3RlcCA2LCBkdXJhdGlvbjogMTguODkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjgxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA1ODU0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU4N30seyJ2IjoiU3RlcCA3LCBkdXJhdGlvbjogMTcuMTUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI5LjYzOTU3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC41NzkyODh9LHsidiI6IlN0ZXAgOCwgZHVyYXRpb246IDMwLjIyIG1zXG4tQWxsIG90aGVyczogMC41OCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyOS42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyNC4yOTI1NTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3MTI5fSx7InYiOiJTdGVwIDksIGR1cmF0aW9uOiAyNC4zOCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjQuMjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY5OTQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTc1fSx7InYiOiJTdGVwIDEwLCBkdXJhdGlvbjogMTcuODAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjcwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4xOTEzMTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4MDM2fSx7InYiOiJTdGVwIDExLCBkdXJhdGlvbjogMjIuMjkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4wMDcwNTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3MjM5fSx7InYiOiJTdGVwIDEyLCBkdXJhdGlvbjogMjEuMTAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjAxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41MjIzOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc3NTI4fSx7InYiOiJTdGVwIDEzLCBkdXJhdGlvbjogMTkuNjAgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjUyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS45Njk5MDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxNTMzfSx7InYiOiJTdGVwIDE0LCBkdXJhdGlvbjogMjAuMDcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC44NTM4MzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzMTg2fSx7InYiOiJTdGVwIDE1LCBkdXJhdGlvbjogMTguOTYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljg1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NjQ3MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5OTI1fSx7InYiOiJTdGVwIDE2LCBkdXJhdGlvbjogMTcuNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS43NzU0ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5MzE0fSx7InYiOiJTdGVwIDE3LCBkdXJhdGlvbjogMjEuODYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjc4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS45MjQ1Nzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4MzQ1fSx7InYiOiJTdGVwIDE4LCBkdXJhdGlvbjogMjIuMDIgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41MzIzNDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyNjQ5fSx7InYiOiJTdGVwIDE5LCBkdXJhdGlvbjogMTkuNjIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC43OTI2ODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxODM0fSx7InYiOiJTdGVwIDIwLCBkdXJhdGlvbjogMjAuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjc5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4yMzgwOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5ODI4fSx7InYiOiJTdGVwIDIxLCBkdXJhdGlvbjogMjAuMzMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjI0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4xMTYwODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0NDQ2fSx7InYiOiJTdGVwIDIyLCBkdXJhdGlvbjogMjEuMjEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjEyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNTQ5NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAwOTA0fSx7InYiOiJTdGVwIDIzLCBkdXJhdGlvbjogMTguMzYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xNDU1NDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxMTY3fSx7InYiOiJTdGVwIDI0LCBkdXJhdGlvbjogMTkuMjQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS42OTY2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDAxNzJ9LHsidiI6IlN0ZXAgMjUsIGR1cmF0aW9uOiAxOS44MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjQ3MTIzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc1MjF9LHsidiI6IlN0ZXAgMjYsIGR1cmF0aW9uOiAyMS41NiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjY1ODkwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTk3MzZ9LHsidiI6IlN0ZXAgMjcsIGR1cmF0aW9uOiAyMS43NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY0OTMzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc2MDZ9LHsidiI6IlN0ZXAgMjgsIGR1cmF0aW9uOiAxOC43NCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjA3Nzk0OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzcwNzR9LHsidiI6IlN0ZXAgMjksIGR1cmF0aW9uOiAyMC4xNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjQ2MzIzNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY4NTN9LHsidiI6IlN0ZXAgMzAsIGR1cmF0aW9uOiAxOC41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjkxMDQ1MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUyNjJ9LHsidiI6IlN0ZXAgMzEsIGR1cmF0aW9uOiAxNi4wMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM1MzUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NzQwNH0seyJ2IjoiU3RlcCAzMiwgZHVyYXRpb246IDE4LjQ1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4zNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzY3ODExfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTM4OH0seyJ2IjoiU3RlcCAzMywgZHVyYXRpb246IDE3Ljg3IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMzk1NTc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjkxNH0seyJ2IjoiU3RlcCAzNCwgZHVyYXRpb246IDIwLjQ5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMTAyNTI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjM4NH0seyJ2IjoiU3RlcCAzNSwgZHVyYXRpb246IDIwLjE5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuODg4MTIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjE5OX0seyJ2IjoiU3RlcCAzNiwgZHVyYXRpb246IDE0Ljk4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC44OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMzEzMjE1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTI3Nn0seyJ2IjoiU3RlcCAzNywgZHVyYXRpb246IDE1LjQxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDU0MjY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MDIyOX0seyJ2IjoiU3RlcCAzOCwgZHVyYXRpb246IDE3LjEzIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDA5NTE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDc3fSx7InYiOiJTdGVwIDM5LCBkdXJhdGlvbjogMTguMTAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjAxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4wNzgyMjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEwMDIzfSx7InYiOiJTdGVwIDQwLCBkdXJhdGlvbjogMjIuMTkgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xMDMxNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIzODUxfSx7InYiOiJTdGVwIDQxLCBkdXJhdGlvbjogMjAuMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjEwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44MjMwMTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzODI1fSx7InYiOiJTdGVwIDQyLCBkdXJhdGlvbjogMTkuOTMgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC43MjUxOTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3MjY2fSx7InYiOiJTdGVwIDQzLCBkdXJhdGlvbjogMjAuODIgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjczIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xNzgwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMzNTV9LHsidiI6IlN0ZXAgNDQsIGR1cmF0aW9uOiAyMC4yOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjY3MjgwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDIwODZ9LHsidiI6IlN0ZXAgNDUsIGR1cmF0aW9uOiAxMy43NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuNjcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjQwMTExNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzc0MDN9LHsidiI6IlN0ZXAgNDYsIGR1cmF0aW9uOiAxNy40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjUyMjc1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDEyOTZ9LHsidiI6IlN0ZXAgNDcsIGR1cmF0aW9uOiAxNy42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljg1OTczNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkzODd9LHsidiI6IlN0ZXAgNDgsIGR1cmF0aW9uOiAxNi45NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjAxMDI1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODg1MjF9LHsidiI6IlN0ZXAgNDksIGR1cmF0aW9uOiAxOS4xMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjMyMjg1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDM2Mjd9LHsidiI6IlN0ZXAgNTAsIGR1cmF0aW9uOiAxNy40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjA2MjYwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMyMzF9LHsidiI6IlN0ZXAgNTEsIGR1cmF0aW9uOiAxNi4xNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE4NTA4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDQ0OTF9LHsidiI6IlN0ZXAgNTIsIGR1cmF0aW9uOiAxNy4yOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI3LjEwODQxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQwNH0seyJ2IjoiU3RlcCA1MywgZHVyYXRpb246IDI3LjIwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNy4xMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNzQ5MjUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzgxfSx7InYiOiJTdGVwIDU0LCBkdXJhdGlvbjogMjAuODQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjc1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4yODY0MzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNjIxfSx7InYiOiJTdGVwIDU1LCBkdXJhdGlvbjogMTkuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozNS43Mjg2NDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5NTQyfSx7InYiOiJTdGVwIDU2LCBkdXJhdGlvbjogMzUuODIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDM1LjczIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4wNjc2MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1OTM3fSx7InYiOiJTdGVwIDU3LCBkdXJhdGlvbjogMjIuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40Mjk2OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA1NjI0fSx7InYiOiJTdGVwIDU4LCBkdXJhdGlvbjogMTguNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjQzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45MjgwMjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEwMjl9LHsidiI6IlN0ZXAgNTksIGR1cmF0aW9uOiAxOC4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE0MjE1Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM2NTl9LHsidiI6IlN0ZXAgNjAsIGR1cmF0aW9uOiAxOS4yNCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjIyOTg2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU5NTl9LHsidiI6IlN0ZXAgNjEsIGR1cmF0aW9uOiAxOS4zMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjc2MDUzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM1ODR9LHsidiI6IlN0ZXAgNjIsIGR1cmF0aW9uOiAyMS44NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjkyMzY1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTc1Nzh9LHsidiI6IlN0ZXAgNjMsIGR1cmF0aW9uOiAyMC4wMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuOTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljc1ODMyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDU3MDV9LHsidiI6IlN0ZXAgNjQsIGR1cmF0aW9uOiAxNi44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg4ODQ0M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTEzNjV9LHsidiI6IlN0ZXAgNjUsIGR1cmF0aW9uOiAxNy45OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjQ3NDM5M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA3OTh9LHsidiI6IlN0ZXAgNjYsIGR1cmF0aW9uOiAxOC41NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjM0MDUxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM4MzR9LHsidiI6IlN0ZXAgNjcsIGR1cmF0aW9uOiAxOS40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjA1MDgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1Mzk2MX0seyJ2IjoiU3RlcCA2OCwgZHVyYXRpb246IDIxLjIwIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuOTEyMzQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjU4fSx7InYiOiJTdGVwIDY5LCBkdXJhdGlvbjogMjEuMDAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4xMjYzMDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0MTN9LHsidiI6IlN0ZXAgNzAsIGR1cmF0aW9uOiAyMS4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjk3ODkwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDkxODR9LHsidiI6IlN0ZXAgNzEsIGR1cmF0aW9uOiAyMS4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuOTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljc2MjgxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDIxN30seyJ2IjoiU3RlcCA3MiwgZHVyYXRpb246IDE5Ljg2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuODYxOTYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDIxOH0seyJ2IjoiU3RlcCA3MywgZHVyYXRpb246IDE5Ljk3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS44NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuOTcyOTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMTE0OX0seyJ2IjoiU3RlcCA3NCwgZHVyYXRpb246IDE3LjA4IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuODA2NTIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTA5N30seyJ2IjoiU3RlcCA3NSwgZHVyYXRpb246IDE1LjkxIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNjE4ODA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDk0NX0seyJ2IjoiU3RlcCA3NiwgZHVyYXRpb246IDE2LjcyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjYyMTM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODYxMn0seyJ2IjoiU3RlcCA3NywgZHVyYXRpb246IDE3LjM2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjUyNDQxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyMTc1N30seyJ2IjoiU3RlcCA3OCwgZHVyYXRpb246IDE5LjM3IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4yNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjQ4MTU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNDQ3Nn0seyJ2IjoiU3RlcCA3OSwgZHVyYXRpb246IDE4Ljc2IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjQzNzI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwODAxOH0seyJ2IjoiU3RlcCA4MCwgZHVyYXRpb246IDE3Ljc1IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODI5Nzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUxNDE4fSx7InYiOiJTdGVwIDgxLCBkdXJhdGlvbjogMTguOTggbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjgzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44NDI5NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI0NzUzfSx7InYiOiJTdGVwIDgyLCBkdXJhdGlvbjogMTkuOTcgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljg0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC45MzUwNDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxMjM0fSx7InYiOiJTdGVwIDgzLCBkdXJhdGlvbjogMjEuMDQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjk0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi40OTg3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDU4NDd9LHsidiI6IlN0ZXAgODQsIGR1cmF0aW9uOiAyMi42MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuNTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkzMjI4NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDc3ODR9LHsidiI6IlN0ZXAgODUsIGR1cmF0aW9uOiAxNy4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjUzNjE2Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDE5OTN9LHsidiI6IlN0ZXAgODYsIGR1cmF0aW9uOiAxMi42NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuNTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjcxMzQ3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMzNDF9LHsidiI6IlN0ZXAgODcsIGR1cmF0aW9uOiAyMC44MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjMzODk1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTAxNjZ9LHsidiI6IlN0ZXAgODgsIGR1cmF0aW9uOiAxNi40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjA5MDcyNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTkwMzd9LHsidiI6IlN0ZXAgODksIGR1cmF0aW9uOiAxNi4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjgyMTMzOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjA1MzZ9LHsidiI6IlN0ZXAgOTAsIGR1cmF0aW9uOiAxNi45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY5MTkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1Njg3NX0seyJ2IjoiU3RlcCA5MSwgZHVyYXRpb246IDE3Ljg1IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjY3MzA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDIwMn0seyJ2IjoiU3RlcCA5MiwgZHVyYXRpb246IDE4Ljc3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTcyODE3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMjExNX0seyJ2IjoiU3RlcCA5MywgZHVyYXRpb246IDE5LjA4IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNjQ2NTM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNzAzM30seyJ2IjoiU3RlcCA5NCwgZHVyYXRpb246IDIwLjc2IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC42NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNDgwOTg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNzA1Mn0seyJ2IjoiU3RlcCA5NSwgZHVyYXRpb246IDIwLjYwIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNzM0NDI3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDg2OX0seyJ2IjoiU3RlcCA5NiwgZHVyYXRpb246IDE1LjgzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS43MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuOTAzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI3MX0seyJ2IjoiU3RlcCA5NywgZHVyYXRpb246IDE3LjAwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjYuMDY0NjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDkyOX0seyJ2IjoiU3RlcCA5OCwgZHVyYXRpb246IDI2LjE3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNi4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNDA5NzU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDk3Nn0seyJ2IjoiU3RlcCA5OSwgZHVyYXRpb246IDE4LjUwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjY3ODIwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTIyODV9LHsidiI6IlN0ZXAgMTAwLCBkdXJhdGlvbjogMjEuNzcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNjA5MjQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDU5OH0seyJ2IjoiU3RlcCAxMDEsIGR1cmF0aW9uOiAyMC43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4wNTUxNTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA2ODQ2fSx7InYiOiJTdGVwIDEwMiwgZHVyYXRpb246IDIxLjE2IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjU5NjcwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI1NTh9LHsidiI6IlN0ZXAgMTAzLCBkdXJhdGlvbjogMjIuNzAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjYwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjg2NjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDU0OH0seyJ2IjoiU3RlcCAxMDQsIGR1cmF0aW9uOiAxOC43OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wNzk0NzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0NTR9LHsidiI6IlN0ZXAgMTA1LCBkdXJhdGlvbjogMTkuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzIxMTk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjM4N30seyJ2IjoiU3RlcCAxMDYsIGR1cmF0aW9uOiAxNy44MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS40MDkzMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4NDd9LHsidiI6IlN0ZXAgMTA3LCBkdXJhdGlvbjogMjEuNTAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjQxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNDczNzExfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODM1NH0seyJ2IjoiU3RlcCAxMDgsIGR1cmF0aW9uOiAxOS41NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4yNzgxMjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIyMTc4fSx7InYiOiJTdGVwIDEwOSwgZHVyYXRpb246IDE5LjQwIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjgxNTg3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU2Nzl9LHsidiI6IlN0ZXAgMTEwLCBkdXJhdGlvbjogMTcuOTEgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTYzNjUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzQ1Mn0seyJ2IjoiU3RlcCAxMTEsIGR1cmF0aW9uOiAxOS4yNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xNTI4Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI0OTc2fSx7InYiOiJTdGVwIDExMiwgZHVyYXRpb246IDE3LjI4IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY4NjI5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjc1MTJ9LHsidiI6IlN0ZXAgMTEzLCBkdXJhdGlvbjogMTYuODEgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNDE4NjkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTY0OH0seyJ2IjoiU3RlcCAxMTQsIGR1cmF0aW9uOiAxNy41MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yNjA4OTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxMjEzfSx7InYiOiJTdGVwIDExNSwgZHVyYXRpb246IDE3LjM1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc3MTQwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU5Mn0seyJ2IjoiU3RlcCAxMTYsIGR1cmF0aW9uOiAxNy44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45ODc1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAyMDk0fSx7InYiOiJTdGVwIDExNywgZHVyYXRpb246IDE5LjA5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguMDQ3OTM4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDkzMn0seyJ2IjoiU3RlcCAxMTgsIGR1cmF0aW9uOiA4LjE0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA4LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC43MTQ5M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODgxNn0seyJ2IjoiU3RlcCAxMTksIGR1cmF0aW9uOiA0LjkwIG1zXG4tQWxsIG90aGVyczogMC4xOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA0LjcxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My42MjAzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDc0MTl9LHsidiI6IlN0ZXAgMTIwLCBkdXJhdGlvbjogMy44MyBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy42MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjI5MzIwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMTE1NDJ9LHsidiI6IlN0ZXAgMTIxLCBkdXJhdGlvbjogMTEuNTAgbXNcbi1BbGwgb3RoZXJzOiAwLjIxIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC4xNjQ5Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkyNzQ3fSx7InYiOiJTdGVwIDEyMiwgZHVyYXRpb246IDQuMzYgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDQuMTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4yODA1Njh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU5MzU1fSx7InYiOiJTdGVwIDEyMywgZHVyYXRpb246IDE5LjQ0IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTI0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjgxMTE0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDg0Njl9LHsidiI6IlN0ZXAgMTI0LCBkdXJhdGlvbjogMTguOTIgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjgxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuNzQ3NzU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMzk4N30seyJ2IjoiU3RlcCAxMjUsIGR1cmF0aW9uOiAyMS44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xNDU4MzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyMDAxfSx7InYiOiJTdGVwIDEyNiwgZHVyYXRpb246IDE5LjI0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjI1Njc3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTMzMDF9LHsidiI6IlN0ZXAgMTI3LCBkdXJhdGlvbjogMjIuMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjI2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjMuMjUxNDAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDk1NX0seyJ2IjoiU3RlcCAxMjgsIGR1cmF0aW9uOiAyMy4zNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuMjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozMS40NTk5MTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjY4NzM5fSx7InYiOiJTdGVwIDEyOSwgZHVyYXRpb246IDMxLjczIG1zXG4tQWxsIG90aGVyczogMC4yNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzMS40NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTMwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjE2OTgzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTM1Njh9LHsidiI6IlN0ZXAgMTMwLCBkdXJhdGlvbjogMjIuMjggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjE3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjIwNjczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwODgwOX0seyJ2IjoiU3RlcCAxMzEsIGR1cmF0aW9uOiAxNy43MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45NjI4Mzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwMDc1fSx7InYiOiJTdGVwIDEzMiwgZHVyYXRpb246IDE5LjA1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY2OTY5OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODE2NDV9LHsidiI6IlN0ZXAgMTMzLCBkdXJhdGlvbjogMTguNzUgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNzY0NTAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDUzNH0seyJ2IjoiU3RlcCAxMzQsIGR1cmF0aW9uOiAxOC44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEzNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS43OTAwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDA2MjZ9LHsidiI6IlN0ZXAgMTM1LCBkdXJhdGlvbjogMTkuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljc5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDc4ODY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDg1Nn0seyJ2IjoiU3RlcCAxMzYsIGR1cmF0aW9uOiAxOC4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEzNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44MDEzNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNzAxfSx7InYiOiJTdGVwIDEzNywgZHVyYXRpb246IDE2Ljg5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTM4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljc3NDUwOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTgzNDR9LHsidiI6IlN0ZXAgMTM4LCBkdXJhdGlvbjogMTkuODcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljc3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTIwNjk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDgxOH0seyJ2IjoiU3RlcCAxMzksIGR1cmF0aW9uOiAyMS4yMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zMTMyMjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgxMzY4fSx7InYiOiJTdGVwIDE0MCwgZHVyYXRpb246IDE3LjM5IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTQxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljk1Njg0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUwNjV9LHsidiI6IlN0ZXAgMTQxLCBkdXJhdGlvbjogMjAuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTg0NDY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMzk3OX0seyJ2IjoiU3RlcCAxNDIsIGR1cmF0aW9uOiAyMS4yOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC42NzM0M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNjk0ODN9LHsidiI6IlN0ZXAgMTQzLCBkdXJhdGlvbjogMjAuNzQgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNDU2MzMzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDE2OX0seyJ2IjoiU3RlcCAxNDQsIGR1cmF0aW9uOiAxNi41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zOTE3MDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4NjZ9LHsidiI6IlN0ZXAgMTQ1LCBkdXJhdGlvbjogMTcuNDkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDM0MzY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDIwMX0seyJ2IjoiU3RlcCAxNDYsIGR1cmF0aW9uOiAxNy4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE0NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi40MTUxMjl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDYxNDA4fSx7InYiOiJTdGVwIDE0NywgZHVyYXRpb246IDE2LjQ4IG1zXG4tQWxsIG90aGVyczogMC4wNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjEzODgxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ4NDh9LHsidiI6IlN0ZXAgMTQ4LCBkdXJhdGlvbjogMTcuMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjA4ODEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4Nzg1M30seyJ2IjoiU3RlcCAxNDksIGR1cmF0aW9uOiAxOC4zMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zMzE4NTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5MzI2fSx7InYiOiJTdGVwIDE1MCwgZHVyYXRpb246IDE3LjQzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk1NTk1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUzNDd9LHsidiI6IlN0ZXAgMTUxLCBkdXJhdGlvbjogMTYuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDY1NTk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTg2NH0seyJ2IjoiU3RlcCAxNTIsIGR1cmF0aW9uOiAxOC4xNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xMjUzNTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAyMzM3fSx7InYiOiJTdGVwIDE1MywgZHVyYXRpb246IDE4LjIzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4xMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTU0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjYyNjA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTg2NX0seyJ2IjoiU3RlcCAxNTQsIGR1cmF0aW9uOiAxNi43MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE1NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi41NDA3MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1OTM0fSx7InYiOiJTdGVwIDE1NSwgZHVyYXRpb246IDE2LjY0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTU2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE0ODcyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDQ0MDN9LHsidiI6IlN0ZXAgMTU2LCBkdXJhdGlvbjogMTcuMjUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNDc4MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMjh9LHsidiI6IlN0ZXAgMTU3LCBkdXJhdGlvbjogMTYuNTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjQ4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjA3NDE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMzg2NH0seyJ2IjoiU3RlcCAxNTgsIGR1cmF0aW9uOiAxNy4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NjI4NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxMzY5fSx7InYiOiJTdGVwIDE1OSwgZHVyYXRpb246IDE3Ljc2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjI5ODA2Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTAxNDF9LHsidiI6IlN0ZXAgMTYwLCBkdXJhdGlvbjogMTcuMzkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjMwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTM1ODY5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTc3NH0seyJ2IjoiU3RlcCAxNjEsIGR1cmF0aW9uOiAxOS4wMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguOTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4zMjgxNjh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE2MDgyfSx7InYiOiJTdGVwIDE2MiwgZHVyYXRpb246IDE5LjQ0IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4zMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTYzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjE4MTgzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDAyODd9LHsidiI6IlN0ZXAgMTYzLCBkdXJhdGlvbjogMTYuMjggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNDMwOTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc1MzY3fSx7InYiOiJTdGVwIDE2NCwgZHVyYXRpb246IDE4LjUxIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTY1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjQyOTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDY1NTZ9LHsidiI6IlN0ZXAgMTY1LCBkdXJhdGlvbjogMTcuNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjQzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDQ2NjM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDUxNX0seyJ2IjoiU3RlcCAxNjYsIGR1cmF0aW9uOiAxNy4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE2NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xMTk2MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA5MzQ5fSx7InYiOiJTdGVwIDE2NywgZHVyYXRpb246IDE3LjIzIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTY4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjIwMDU2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjY3Mn0seyJ2IjoiU3RlcCAxNjgsIGR1cmF0aW9uOiAxNy4zMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE2OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42ODIyMjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5NDk4fSx7InYiOiJTdGVwIDE2OSwgZHVyYXRpb246IDE4Ljc4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTcwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjIzODQxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ2MTl9LHsidiI6IlN0ZXAgMTcwLCBkdXJhdGlvbjogMTguMzMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTc4NzU0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjJ9LHsidiI6IlN0ZXAgMTcxLCBkdXJhdGlvbjogMTkuNjcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjU4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNzIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzExMzUyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODg4Nn0seyJ2IjoiU3RlcCAxNzIsIGR1cmF0aW9uOiAxNy44MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE3MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi41MDc3MDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA0NzM5fSx7InYiOiJTdGVwIDE3MywgZHVyYXRpb246IDE2LjYxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi41MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTc0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjgxOTEzMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTkzMzl9LHsidiI6IlN0ZXAgMTc0LCBkdXJhdGlvbjogMTYuOTIgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuODUzNTM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTA1fSx7InYiOiJTdGVwIDE3NSwgZHVyYXRpb246IDE1Ljk1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI0LjEwNzg2Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4wMjY1NjF9LHsidiI6IlN0ZXAgMTc2LCBkdXJhdGlvbjogMjYuMTMgbXNcbi1BbGwgb3RoZXJzOiAyLjAzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDI0LjExIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxNzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTc2NzgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMjkyNX0seyJ2IjoiU3RlcCAxNzcsIGR1cmF0aW9uOiAxOS42OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS41NDAxMTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5MDA1fSx7InYiOiJTdGVwIDE3OCwgZHVyYXRpb246IDE1LjYzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljg1MDA5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkwMzl9LHsidiI6IlN0ZXAgMTc5LCBkdXJhdGlvbjogMTYuOTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljg1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxODAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuOTY2MTQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDg1Mn0seyJ2IjoiU3RlcCAxODAsIGR1cmF0aW9uOiAxNC4wNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuOTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE4MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zMDg5NjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwMDM4fSx7InYiOiJTdGVwIDE4MSwgZHVyYXRpb246IDE2LjQwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjQxMjczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMTQ2N30seyJ2IjoiU3RlcCAxODIsIGR1cmF0aW9uOiAxNi41MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE4MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xMTA1NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAwMzQxfSx7InYiOiJTdGVwIDE4MywgZHVyYXRpb246IDE3LjIxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTg0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc1NjY3Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM2MTd9LHsidiI6IlN0ZXAgMTg0LCBkdXJhdGlvbjogMTcuODUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxODUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNDcyNjg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODQwNH0seyJ2IjoiU3RlcCAxODUsIGR1cmF0aW9uOiAxNy41NiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE4NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wOTgxMzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4NjMyfSx7InYiOiJTdGVwIDE4NiwgZHVyYXRpb246IDE5LjE5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTg3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjU3MzU5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkxNTd9LHsidiI6IlN0ZXAgMTg3LCBkdXJhdGlvbjogMTQuNjYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjU3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxODgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTAzNDI2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTEyfSx7InYiOiJTdGVwIDE4OCwgZHVyYXRpb246IDE1LjYwIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTg5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg3MDI0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDYzNTd9LHsidiI6IlN0ZXAgMTg5LCBkdXJhdGlvbjogMTcuOTggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MzAuMzA2MjYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTMwMn0seyJ2IjoiU3RlcCAxOTAsIGR1cmF0aW9uOiAzMC40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMzAuMzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE5MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNzQzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI4MDV9LHsidiI6IlN0ZXAgMTkxLCBkdXJhdGlvbjogMTguMzggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMzIxNDM4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTU1M30seyJ2IjoiU3RlcCAxOTIsIGR1cmF0aW9uOiAxNi40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE5MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4yMDk4NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxMTIyfSx7InYiOiJTdGVwIDE5MywgZHVyYXRpb246IDE2LjMxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4yMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTk0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY1Mjc2OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzk5NjV9LHsidiI6IlN0ZXAgMTk0LCBkdXJhdGlvbjogMTYuNzMgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDgzNDA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDc2N30seyJ2IjoiU3RlcCAxOTUsIGR1cmF0aW9uOiAxNy4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE5NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40MjIxMTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNjEyfSx7InYiOiJTdGVwIDE5NiwgZHVyYXRpb246IDE4LjUxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTk3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY4ODk1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU4Mjl9LHsidiI6IlN0ZXAgMTk3LCBkdXJhdGlvbjogMTYuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxOTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzg2MDk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDIxNn0seyJ2IjoiU3RlcCAxOTgsIGR1cmF0aW9uOiAxNy44OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjE5OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45NDk5NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MzZ9LHsidiI6IlN0ZXAgMTk5LCBkdXJhdGlvbjogMTguMDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljk1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMjUzODE3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTI1Nn0seyJ2IjoiU3RlcCAyMDAsIGR1cmF0aW9uOiAyMC4zNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIwMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xOTA1MjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2NDY2fSx7InYiOiJTdGVwIDIwMSwgZHVyYXRpb246IDE4LjI5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4xOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjAyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjkzMDg2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTc4ODd9LHsidiI6IlN0ZXAgMjAyLCBkdXJhdGlvbjogMTkuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjkzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjcxMzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE1NTYzfSx7InYiOiJTdGVwIDIwMywgZHVyYXRpb246IDE4LjM5IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjA0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjI0OTU2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUwNDZ9LHsidiI6IlN0ZXAgMjA0LCBkdXJhdGlvbjogMTguMzQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNTUyNDAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjE4fSx7InYiOiJTdGVwIDIwNSwgZHVyYXRpb246IDE2LjY0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi41NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjA2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA3MjgxN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMwNzR9LHsidiI6IlN0ZXAgMjA2LCBkdXJhdGlvbjogMTguMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMDcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNTI2NjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDI0NH0seyJ2IjoiU3RlcCAyMDcsIGR1cmF0aW9uOiAxNy42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIwOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41NTAwOTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2MjUyfSx7InYiOiJTdGVwIDIwOCwgZHVyYXRpb246IDE5LjY1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjA5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjYzOTE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMTIyNX0seyJ2IjoiU3RlcCAyMDksIGR1cmF0aW9uOiAxNS43NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNjQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIxMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zMDMxOTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA4MTQ3fSx7InYiOiJTdGVwIDIxMCwgZHVyYXRpb246IDE2LjQxIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjExIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjEyNTA4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDY5Nzd9LHsidiI6IlN0ZXAgMjExLCBkdXJhdGlvbjogMTYuMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjEzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMzQ2NjgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NzAxMn0seyJ2IjoiU3RlcCAyMTIsIGR1cmF0aW9uOiAxNy40NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy40NjkzNzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0MDY4fSx7InYiOiJTdGVwIDIxMywgZHVyYXRpb246IDE3LjU2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy40NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjE0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjQ0MzY2N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcyOX0seyJ2IjoiU3RlcCAyMTQsIGR1cmF0aW9uOiAxNS41MyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wNDkyMTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3ODl9LHsidiI6IlN0ZXAgMjE1LCBkdXJhdGlvbjogMTcuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjE0MDE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDE2M30seyJ2IjoiU3RlcCAyMTYsIGR1cmF0aW9uOiAxNy43MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4zMDc5MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA5NTk4fSx7InYiOiJTdGVwIDIxNywgZHVyYXRpb246IDE4LjQyIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjE4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljk1NjA0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTg4Nzd9LHsidiI6IlN0ZXAgMjE4LCBkdXJhdGlvbjogMjAuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNzk2OTExfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDQwMn0seyJ2IjoiU3RlcCAyMTksIGR1cmF0aW9uOiAxOS45MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIyMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xNDA2NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA5MTJ9LHsidiI6IlN0ZXAgMjIwLCBkdXJhdGlvbjogMTguMjUgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuODQ3NDgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExODk0MX0seyJ2IjoiU3RlcCAyMjEsIGR1cmF0aW9uOiAxNS45NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIyMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42NDA1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEyODA2fSx7InYiOiJTdGVwIDIyMiwgZHVyYXRpb246IDE2Ljc1IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjIzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljg3MDk3N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI2OTd9LHsidiI6IlN0ZXAgMjIzLCBkdXJhdGlvbjogMTkuOTYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNTYzODYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwMzM1Mn0seyJ2IjoiU3RlcCAyMjQsIGR1cmF0aW9uOiAyMC43NyBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIyNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMy4wMDY2Mzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgzNH0seyJ2IjoiU3RlcCAyMjUsIGR1cmF0aW9uOiAyMy4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuMDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xMTU0NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA1MDQ1fSx7InYiOiJTdGVwIDIyNiwgZHVyYXRpb246IDIwLjIyIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjgwMTY5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTIxMjh9LHsidiI6IlN0ZXAgMjI3LCBkdXJhdGlvbjogMjAuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzA5NTY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDIxOX0seyJ2IjoiU3RlcCAyMjgsIGR1cmF0aW9uOiAxNy44MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIyOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wMjAxMjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAwNzI2fSx7InYiOiJTdGVwIDIyOSwgZHVyYXRpb246IDE3LjEyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjMwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjUwNTgxM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkxMDN9LHsidiI6IlN0ZXAgMjMwLCBkdXJhdGlvbjogMTguNTkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuODE2ODg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDY1Nn0seyJ2IjoiU3RlcCAyMzEsIGR1cmF0aW9uOiAxOS45MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40MDIyMTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwNTA4fSx7InYiOiJTdGVwIDIzMiwgZHVyYXRpb246IDE5LjQ5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS40MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk1Nzc1Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc1OTV9LHsidiI6IlN0ZXAgMjMzLCBkdXJhdGlvbjogMTYuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuNjQwMzk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MTgyOH0seyJ2IjoiU3RlcCAyMzQsIGR1cmF0aW9uOiAxNC43MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuNjQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIzNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zMjM4NTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3NzI3fSx7InYiOiJTdGVwIDIzNSwgZHVyYXRpb246IDE2LjQzIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkxMTQ5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU0Njl9LHsidiI6IlN0ZXAgMjM2LCBkdXJhdGlvbjogMTcuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyMzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjg2MjIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNjk1Nn0seyJ2IjoiU3RlcCAyMzcsIGR1cmF0aW9uOiAxOC43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjIzOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi40MTEwNzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyODY1fSx7InYiOiJTdGVwIDIzOCwgZHVyYXRpb246IDE2LjUwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi40MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjM5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjM2NzkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDM3MX0seyJ2IjoiU3RlcCAyMzksIGR1cmF0aW9uOiAxNy40NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjgzMTczOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI1NjF9LHsidiI6IlN0ZXAgMjQwLCBkdXJhdGlvbjogNy45MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogNy44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjQxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuOTA5MDU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDUyNn0seyJ2IjoiU3RlcCAyNDEsIGR1cmF0aW9uOiA0LjAxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4yOTIwODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTg0NDU5fSx7InYiOiJTdGVwIDI0MiwgZHVyYXRpb246IDMuNDggbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuMjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjY2ODQ1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjg4OX0seyJ2IjoiU3RlcCAyNDMsIGR1cmF0aW9uOiA5Ljg0IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC4wMjY2NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTc2MDk2fSx7InYiOiJTdGVwIDI0NCwgZHVyYXRpb246IDQuMjAgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDQuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42NTkyNDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM2NTM2fSx7InYiOiJTdGVwIDI0NSwgZHVyYXRpb246IDE2LjgwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjQ2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjE2MTU1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDA2NzJ9LHsidiI6IlN0ZXAgMjQ2LCBkdXJhdGlvbjogMjAuMjYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNDcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODIyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDg2MTZ9LHsidiI6IlN0ZXAgMjQ3LCBkdXJhdGlvbjogMTcuOTMgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTY2MTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1MTM1fSx7InYiOiJTdGVwIDI0OCwgZHVyYXRpb246IDE5LjY2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjQ5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjIxNTUzMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODgyNzR9LHsidiI6IlN0ZXAgMjQ5LCBkdXJhdGlvbjogMTkuMzAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjIyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjE4MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyMzM2fSx7InYiOiJTdGVwIDI1MCwgZHVyYXRpb246IDE4LjcxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjU0MTE5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTI4OTl9LHsidiI6IlN0ZXAgMjUxLCBkdXJhdGlvbjogMTYuNjUgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjU0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjAzMDE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA2MTI1NH0seyJ2IjoiU3RlcCAyNTIsIGR1cmF0aW9uOiAxOC4yNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45OTE3MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzNDIyfSx7InYiOiJTdGVwIDI1MywgZHVyYXRpb246IDE5LjEwIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjU0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljk0MjM3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDE4NjF9LHsidiI6IlN0ZXAgMjU0LCBkdXJhdGlvbjogMTkuMDQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljk0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTk4NDM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5Mjc0NH0seyJ2IjoiU3RlcCAyNTUsIGR1cmF0aW9uOiAxOC4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4xNTg4Njd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3MDA1fSx7InYiOiJTdGVwIDI1NiwgZHVyYXRpb246IDE1LjI2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4xNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjU3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjg5MzU4OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDAxNTV9LHsidiI6IlN0ZXAgMjU3LCBkdXJhdGlvbjogMTMuOTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjYuOTQ1NDMxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDEyNX0seyJ2IjoiU3RlcCAyNTgsIGR1cmF0aW9uOiAyNy4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjYuOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyNC4zNTYyODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgwNzYyfSx7InYiOiJTdGVwIDI1OSwgZHVyYXRpb246IDI0LjQ0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNC4zNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjQ5OTU2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTY2MzV9LHsidiI6IlN0ZXAgMjYwLCBkdXJhdGlvbjogMjIuNjAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjUwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNjk3NDA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjUxN30seyJ2IjoiU3RlcCAyNjEsIGR1cmF0aW9uOiAxNi43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xOTQ3OTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4ODMzfSx7InYiOiJTdGVwIDI2MiwgZHVyYXRpb246IDE3LjI5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjYzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljg4MDkwM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODgwMDR9LHsidiI6IlN0ZXAgMjYzLCBkdXJhdGlvbjogMTYuOTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljg4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNzgxMTY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTIwNH0seyJ2IjoiU3RlcCAyNjQsIGR1cmF0aW9uOiAxNS44OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS42MTc2MzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MDg4fSx7InYiOiJTdGVwIDI2NSwgZHVyYXRpb246IDE1LjcwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS42MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjY2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjM5Mzk5OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA2MzR9LHsidiI6IlN0ZXAgMjY2LCBkdXJhdGlvbjogMTYuNDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjk4MjkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDMwNH0seyJ2IjoiU3RlcCAyNjcsIGR1cmF0aW9uOiAxOC4zOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy40NzM2OTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3NTgyfSx7InYiOiJTdGVwIDI2OCwgZHVyYXRpb246IDE3LjU2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy40NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjkxMTQyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDE3MzV9LHsidiI6IlN0ZXAgMjY5LCBkdXJhdGlvbjogMTguMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODExNzc1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTIxfSx7InYiOiJTdGVwIDI3MCwgZHVyYXRpb246IDE3LjkxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjcxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljg5MDY2NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI0MjN9LHsidiI6IlN0ZXAgMjcxLCBkdXJhdGlvbjogMTYuOTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNzIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMDcyMzQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMDUxNn0seyJ2IjoiU3RlcCAyNzIsIGR1cmF0aW9uOiAxOS4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI3MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNzYwOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzNDgzfSx7InYiOiJTdGVwIDI3MywgZHVyYXRpb246IDE4LjM4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjc0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjI4NDk3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA4NzJ9LHsidiI6IlN0ZXAgMjc0LCBkdXJhdGlvbjogMTkuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMzMzNTE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTYzOH0seyJ2IjoiU3RlcCAyNzUsIGR1cmF0aW9uOiAxNi40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI3NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS42MzczMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDIwMzV9LHsidiI6IlN0ZXAgMjc2LCBkdXJhdGlvbjogMTUuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjY0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyNzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuOTQ0Mjk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NzA4Mn0seyJ2IjoiU3RlcCAyNzcsIGR1cmF0aW9uOiAxNS4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuOTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42OTM5MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDU5NTA0fSx7InYiOiJTdGVwIDI3OCwgZHVyYXRpb246IDE4Ljc1IG1zXG4tQWxsIG90aGVyczogMC4wNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjE4OTU5N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzI1OTR9LHsidiI6IlN0ZXAgMjc5LCBkdXJhdGlvbjogMTYuMzIgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyODAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNDU2NTIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODY5M30seyJ2IjoiU3RlcCAyODAsIGR1cmF0aW9uOiAxNy41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI4MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS45MDE1MjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNzI0fSx7InYiOiJTdGVwIDI4MSwgZHVyYXRpb246IDE5Ljk5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjA1NzMwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE3ODF9LHsidiI6IlN0ZXAgMjgyLCBkdXJhdGlvbjogMTkuMTUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjA2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyODMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMzQxMzU2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMTU5NH0seyJ2IjoiU3RlcCAyODMsIGR1cmF0aW9uOiAxNy40NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI4NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43MzMyNTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2NDE4fSx7InYiOiJTdGVwIDI4NCwgZHVyYXRpb246IDE3LjgzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk5OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTkyOH0seyJ2IjoiU3RlcCAyODUsIGR1cmF0aW9uOiAxNi4xMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI4NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45ODUxNDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA2Nzl9LHsidiI6IlN0ZXAgMjg2LCBkdXJhdGlvbjogMTguMDkgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyODcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjc5MDY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODAyM30seyJ2IjoiU3RlcCAyODcsIGR1cmF0aW9uOiAxOS4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI4OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4xMzg0OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEwMzQ4fSx7InYiOiJTdGVwIDI4OCwgZHVyYXRpb246IDIxLjI1IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4xNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjg5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjUyMTYyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDUxNX0seyJ2IjoiU3RlcCAyODksIGR1cmF0aW9uOiAyMC42MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI5MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yMDI5NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2NTN9LHsidiI6IlN0ZXAgMjkwLCBkdXJhdGlvbjogMTcuMjkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjIwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyOTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjIzMTAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDkyNX0seyJ2IjoiU3RlcCAyOTEsIGR1cmF0aW9uOiAxOS4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi43Njg5MTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzODU4fSx7InYiOiJTdGVwIDI5MiwgZHVyYXRpb246IDE2Ljg2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi43NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjQ2NjQzNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTEyNzF9LHsidiI6IlN0ZXAgMjkzLCBkdXJhdGlvbjogMTUuNTggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjQ3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyOTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMTE3NzkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDgxNX0seyJ2IjoiU3RlcCAyOTQsIGR1cmF0aW9uOiAxNC4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42ODUzOTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2ODgyfSx7InYiOiJTdGVwIDI5NSwgZHVyYXRpb246IDE2Ljc4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjQ1MzMxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTIzODl9LHsidiI6IlN0ZXAgMjk2LCBkdXJhdGlvbjogMTUuNTcgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjQ1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIyOTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTI0MjA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4Njg3M30seyJ2IjoiU3RlcCAyOTcsIGR1cmF0aW9uOiAxNi4wMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjI5OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42MjQxNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1NTg4fSx7InYiOiJTdGVwIDI5OCwgZHVyYXRpb246IDE3LjcyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMjk5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY0MTI4NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTAyMTJ9LHsidiI6IlN0ZXAgMjk5LCBkdXJhdGlvbjogMTYuNzMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODAxNDgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExODA0fSx7InYiOiJTdGVwIDMwMCwgZHVyYXRpb246IDE4LjkyIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzAxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjExOTQyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDA4N30seyJ2IjoiU3RlcCAzMDEsIGR1cmF0aW9uOiAxNy4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4wOTc1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODQ5Nzd9LHsidiI6IlN0ZXAgMzAyLCBkdXJhdGlvbjogMTYuMTggbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjEwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMjU0NTk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTAxOX0seyJ2IjoiU3RlcCAzMDMsIGR1cmF0aW9uOiAxNi4zNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4zNjkyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTYwMjF9LHsidiI6IlN0ZXAgMzA0LCBkdXJhdGlvbjogMTkuNDcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjM3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODM0MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3NTM4fSx7InYiOiJTdGVwIDMwNSwgZHVyYXRpb246IDE3LjkyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzA2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI2LjA5OTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDU4OX0seyJ2IjoiU3RlcCAzMDYsIGR1cmF0aW9uOiAyNi4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjYuMTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMwNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS42ODc5NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMwMTY5fSx7InYiOiJTdGVwIDMwNywgZHVyYXRpb246IDE5LjgyIG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzA4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI0LjEyNjc4NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY2OTJ9LHsidiI6IlN0ZXAgMzA4LCBkdXJhdGlvbjogMjQuMjEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDI0LjEzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjQuNDMxMDMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzMwNX0seyJ2IjoiU3RlcCAzMDksIGR1cmF0aW9uOiAyNC41MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjQuNDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMxMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45OTIwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE4MDN9LHsidiI6IlN0ZXAgMzEwLCBkdXJhdGlvbjogMTguMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjg2NjE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTc5Mn0seyJ2IjoiU3RlcCAzMTEsIGR1cmF0aW9uOiAxOC4zOCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMxMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45MzcxNTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2NTA2fSx7InYiOiJTdGVwIDMxMiwgZHVyYXRpb246IDE4LjAyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy45NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzEzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljk3ODExNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzgxNTl9LHsidiI6IlN0ZXAgMzEzLCBkdXJhdGlvbjogMTguMDYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDI0Mjg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTA5MX0seyJ2IjoiU3RlcCAzMTQsIGR1cmF0aW9uOiAxNy4xMiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xNDkyMTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1NDUxfSx7InYiOiJTdGVwIDMxNSwgZHVyYXRpb246IDE3LjI0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjAxNjE2NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzgzNTd9LHsidiI6IlN0ZXAgMzE2LCBkdXJhdGlvbjogMTYuMDkgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjAyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODcxNTg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODY5OX0seyJ2IjoiU3RlcCAzMTcsIGR1cmF0aW9uOiAxNy45NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMxOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi43MzcyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI1NDR9LHsidiI6IlN0ZXAgMzE4LCBkdXJhdGlvbjogMTYuODQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljc0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODQwMTA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODg3OH0seyJ2IjoiU3RlcCAzMTksIGR1cmF0aW9uOiAxOC45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguODQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMyMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wMDkyNjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4MDYxfSx7InYiOiJTdGVwIDMyMCwgZHVyYXRpb246IDE3LjEwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzIxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjI5OTUyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDkzNjN9LHsidiI6IlN0ZXAgMzIxLCBkdXJhdGlvbjogMTcuNDEgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjMwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjI1NzQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4Nzc0M30seyJ2IjoiU3RlcCAzMjIsIGR1cmF0aW9uOiAxNy4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40NDA2MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNDQ0fSx7InYiOiJTdGVwIDMyMywgZHVyYXRpb246IDE4LjUzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzI0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljk0NjAzNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODQ5NDR9LHsidiI6IlN0ZXAgMzI0LCBkdXJhdGlvbjogMTcuMDMgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljk1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNjg1NzQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDkxOH0seyJ2IjoiU3RlcCAzMjUsIGR1cmF0aW9uOiAxNi43OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC43MTA2ODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgwMDEzfSx7InYiOiJTdGVwIDMyNiwgZHVyYXRpb246IDE4Ljc5IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC43MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjU0NjAzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU3NzN9LHsidiI6IlN0ZXAgMzI3LCBkdXJhdGlvbjogMTcuNjMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjU1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTk2NzgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzN9LHsidiI6IlN0ZXAgMzI4LCBkdXJhdGlvbjogMTkuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjAwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuODU4MzMzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMjI5Mn0seyJ2IjoiU3RlcCAzMjksIGR1cmF0aW9uOiAxNS45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuODYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMzMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wNDkwMjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjE0NTQ5fSx7InYiOiJTdGVwIDMzMCwgZHVyYXRpb246IDE3LjI2IG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzMxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc5NTA2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTcwNzF9LHsidiI6IlN0ZXAgMzMxLCBkdXJhdGlvbjogMTcuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMzIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNDA2NjYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjEyMX0seyJ2IjoiU3RlcCAzMzIsIGR1cmF0aW9uOiAxOS41MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMzMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40MTQ5MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1OTQxfSx7InYiOiJTdGVwIDMzMywgZHVyYXRpb246IDE4LjUwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzM0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljk4NzM4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3NDQzOX0seyJ2IjoiU3RlcCAzMzQsIGR1cmF0aW9uOiAxOC4wNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMzNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy41MDI0NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0NzM2fSx7InYiOiJTdGVwIDMzNSwgZHVyYXRpb246IDE3LjU5IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY3NTYzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODM1MzN9LHsidiI6IlN0ZXAgMzM2LCBkdXJhdGlvbjogMTcuNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzMzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTU0NzA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjAyNn0seyJ2IjoiU3RlcCAzMzcsIGR1cmF0aW9uOiAxNi4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjMzOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wODgxNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4MTg3fSx7InYiOiJTdGVwIDMzOCwgZHVyYXRpb246IDE3LjE4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzM5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjQ4ODA4NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI2MzJ9LHsidiI6IlN0ZXAgMzM5LCBkdXJhdGlvbjogMTYuNTggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjQ5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTczOTU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjUzMn0seyJ2IjoiU3RlcCAzNDAsIGR1cmF0aW9uOiAxNi4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM0MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44Njg2MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1OTY2fSx7InYiOiJTdGVwIDM0MSwgZHVyYXRpb246IDE2Ljk1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzQyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA1NzY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTAzNX0seyJ2IjoiU3RlcCAzNDIsIGR1cmF0aW9uOiAxNy4xNCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wNDY5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMzNDV9LHsidiI6IlN0ZXAgMzQzLCBkdXJhdGlvbjogMTcuMTUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjU0ODQxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4Nzk0N30seyJ2IjoiU3RlcCAzNDQsIGR1cmF0aW9uOiAxNy4zNCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yNzU0NTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgzODN9LHsidiI6IlN0ZXAgMzQ1LCBkdXJhdGlvbjogMTUuMzYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjI4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMTI2MDU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzIyNH0seyJ2IjoiU3RlcCAzNDYsIGR1cmF0aW9uOiAxNC4yMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM0NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4xNzM0OTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3MDg2fSx7InYiOiJTdGVwIDM0NywgZHVyYXRpb246IDE1LjI2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4xNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljk3NzEzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU4NjR9LHsidiI6IlN0ZXAgMzQ4LCBkdXJhdGlvbjogMTcuMDYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMzgxNTA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzE1fSx7InYiOiJTdGVwIDM0OSwgZHVyYXRpb246IDE1LjQ3IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4zOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzUwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljc5NjUxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY5MTd9LHsidiI6IlN0ZXAgMzUwLCBkdXJhdGlvbjogMTUuODggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTc4NTI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzEzOH0seyJ2IjoiU3RlcCAzNTEsIGR1cmF0aW9uOiAxOC42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM1MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40MDkwNzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgyODQxfSx7InYiOiJTdGVwIDM1MiwgZHVyYXRpb246IDE4LjQ5IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzUzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM0MjQzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTY5MjN9LHsidiI6IlN0ZXAgMzUzLCBkdXJhdGlvbjogMTguNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMzU2OTMxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3MTg4NH0seyJ2IjoiU3RlcCAzNTQsIGR1cmF0aW9uOiAxNS40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMDcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM1NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43MjgwNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0NDA5fSx7InYiOiJTdGVwIDM1NSwgZHVyYXRpb246IDE3LjgxIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzU2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjA3NTk3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODA4MTZ9LHsidiI6IlN0ZXAgMzU2LCBkdXJhdGlvbjogMTMuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuNjU1Njh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgxNDU3fSx7InYiOiJTdGVwIDM1NywgZHVyYXRpb246IDE0Ljc0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC42NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzU4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0Ljk4NTM0N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA3MTN9LHsidiI6IlN0ZXAgMzU4LCBkdXJhdGlvbjogMTUuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNDc2MDQ5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTAzMX0seyJ2IjoiU3RlcCAzNTksIGR1cmF0aW9uOiAxNS41NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM2MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC4xMjQ5MTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgwNTI1fSx7InYiOiJTdGVwIDM2MCwgZHVyYXRpb246IDE0LjIxIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzYxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljg4NDc2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODQ4MTF9LHsidiI6IlN0ZXAgMzYxLCBkdXJhdGlvbjogMTUuOTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljg4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny41MzM5NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE3NTM0fSx7InYiOiJTdGVwIDM2MiwgZHVyYXRpb246IDcuNjUgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDcuNTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM2MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjMwNTk1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTYyNTR9LHsidiI6IlN0ZXAgMzYzLCBkdXJhdGlvbjogNC40MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogNC4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuNTI2Njc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MjM5NH0seyJ2IjoiU3RlcCAzNjQsIGR1cmF0aW9uOiAzLjY3IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OC45NDgyMDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI4Mjk2fSx7InYiOiJTdGVwIDM2NSwgZHVyYXRpb246IDkuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDguOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM2NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjg0MzEyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTU2MTd9LHsidiI6IlN0ZXAgMzY2LCBkdXJhdGlvbjogMy45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy44NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzY3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjIzOTc4NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzIzNDd9LHsidiI6IlN0ZXAgMzY3LCBkdXJhdGlvbjogMjAuMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjI0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMzc4MjQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODkwNn0seyJ2IjoiU3RlcCAzNjgsIGR1cmF0aW9uOiAxOS40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM2OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45MDMzOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNzA1fSx7InYiOiJTdGVwIDM2OSwgZHVyYXRpb246IDE5LjAwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzcwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA3MDIyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQwNDh9LHsidiI6IlN0ZXAgMzcwLCBkdXJhdGlvbjogMTcuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTY3MzQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDc1N30seyJ2IjoiU3RlcCAzNzEsIGR1cmF0aW9uOiAxOC4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM3MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44MDIzNDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwOTc5fSx7InYiOiJTdGVwIDM3MiwgZHVyYXRpb246IDE5Ljg5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzczIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljg5MDI3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcxMTN9LHsidiI6IlN0ZXAgMzczLCBkdXJhdGlvbjogMTguOTggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNDIwODgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjUxOH0seyJ2IjoiU3RlcCAzNzQsIGR1cmF0aW9uOiAxNy41MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM3NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43MTYwNzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1OTQzfSx7InYiOiJTdGVwIDM3NSwgZHVyYXRpb246IDE3LjgwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjU1NjQyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzg0NTZ9LHsidiI6IlN0ZXAgMzc2LCBkdXJhdGlvbjogMTYuNjMgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjU2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuOTYyNTAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTM1fSx7InYiOiJTdGVwIDM3NywgZHVyYXRpb246IDE1LjA1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC45NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzc4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjA0Nzc1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTQwOTJ9LHsidiI6IlN0ZXAgMzc4LCBkdXJhdGlvbjogMTUuMTYgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzNzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTIzNTk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTY4MX0seyJ2IjoiU3RlcCAzNzksIGR1cmF0aW9uOiAxNS42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM4MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi41NDMyMjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3NDAxfSx7InYiOiJTdGVwIDM4MCwgZHVyYXRpb246IDE2LjYzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzgxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjUxMDkyOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODQ4NjR9LHsidiI6IlN0ZXAgMzgxLCBkdXJhdGlvbjogMTYuNjAgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzODIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuOTc3Nzg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MzV9LHsidiI6IlN0ZXAgMzgyLCBkdXJhdGlvbjogMTcuMDYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzODMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTYyNTQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTg0N30seyJ2IjoiU3RlcCAzODMsIGR1cmF0aW9uOiAxOC4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM4NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC43OTcwMDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2NTQzfSx7InYiOiJTdGVwIDM4NCwgZHVyYXRpb246IDE4Ljg4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY1ODQzNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDA3NDF9LHsidiI6IlN0ZXAgMzg1LCBkdXJhdGlvbjogMTguNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNTkwODAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTk5NX0seyJ2IjoiU3RlcCAzODYsIGR1cmF0aW9uOiAxNi42OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM4NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS43NTgyMTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgxNDg5fSx7InYiOiJTdGVwIDM4NywgZHVyYXRpb246IDE1Ljg0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjAxNDU0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODI3NTd9LHsidiI6IlN0ZXAgMzg4LCBkdXJhdGlvbjogMTguMTAgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjAxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzODkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNjAxNTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4MzEwMn0seyJ2IjoiU3RlcCAzODksIGR1cmF0aW9uOiAxOS43OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM5MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyNy40NzgwOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc5ODA1fSx7InYiOiJTdGVwIDM5MCwgZHVyYXRpb246IDI3LjU2IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNy40OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzkxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljk0NTExMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM4ODV9LHsidiI6IlN0ZXAgMzkxLCBkdXJhdGlvbjogMTkuMDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljk1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzOTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMjk4MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzODM2fSx7InYiOiJTdGVwIDM5MiwgZHVyYXRpb246IDE0LjM5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4zMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0Ljg4ODExOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ1ODl9LHsidiI6IlN0ZXAgMzkzLCBkdXJhdGlvbjogMTQuOTggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzOTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMTQ2OTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTgyfSx7InYiOiJTdGVwIDM5NCwgZHVyYXRpb246IDE0LjIzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzk1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjM4NjE3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTY4MTF9LHsidiI6IlN0ZXAgMzk1LCBkdXJhdGlvbjogMTUuNTAgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzOTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDMyODAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODkxMX0seyJ2IjoiU3RlcCAzOTYsIGR1cmF0aW9uOiAxNy4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjM5NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS40OTAyNjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgyNjQyfSx7InYiOiJTdGVwIDM5NywgZHVyYXRpb246IDE1LjU3IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS40OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMzk4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc4Mzk5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTc5MDZ9LHsidiI6IlN0ZXAgMzk4LCBkdXJhdGlvbjogMTcuODggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljc4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIzOTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMDI3ODY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTM2NX0seyJ2IjoiU3RlcCAzOTksIGR1cmF0aW9uOiAxOS4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQwMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45MjY2Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwODA5fSx7InYiOiJTdGVwIDQwMCwgZHVyYXRpb246IDE4LjAyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy45MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDAxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkyNzY1MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODMyMzl9LHsidiI6IlN0ZXAgNDAxLCBkdXJhdGlvbjogMTcuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjkzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODQwNzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3ODc3fSx7InYiOiJTdGVwIDQwMiwgZHVyYXRpb246IDE3Ljk1IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjU0MDM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExODExOX0seyJ2IjoiU3RlcCA0MDMsIGR1cmF0aW9uOiAxOC42NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40NDQwMjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3OTM0fSx7InYiOiJTdGVwIDQwNCwgZHVyYXRpb246IDE5LjU0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS40NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDA1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjI1MTkzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkwNzF9LHsidiI6IlN0ZXAgNDA1LCBkdXJhdGlvbjogMTguMzQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzc4MDIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzIzN30seyJ2IjoiU3RlcCA0MDYsIGR1cmF0aW9uOiAxOC40NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQwNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42NzMwNjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA1MTZ9LHsidiI6IlN0ZXAgNDA3LCBkdXJhdGlvbjogMTguNzggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDU5MDE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTU1MX0seyJ2IjoiU3RlcCA0MDgsIGR1cmF0aW9uOiAxOC4xNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQwOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45OTkxMDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA5MzUxfSx7InYiOiJTdGVwIDQwOSwgZHVyYXRpb246IDE5LjExIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE3MzUzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTgwMDR9LHsidiI6IlN0ZXAgNDEwLCBkdXJhdGlvbjogMTcuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTI0NzgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTgzOX0seyJ2IjoiU3RlcCA0MTEsIGR1cmF0aW9uOiAxOC4wMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQxMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNDU4MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3MDMxfSx7InYiOiJTdGVwIDQxMiwgZHVyYXRpb246IDE4LjM0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDEzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg4NTQ4Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU3NDN9LHsidiI6IlN0ZXAgNDEzLCBkdXJhdGlvbjogMTcuOTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDM1MTU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTEyOX0seyJ2IjoiU3RlcCA0MTQsIGR1cmF0aW9uOiAxOC4xMiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42OTQ0MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4MjA0fSx7InYiOiJTdGVwIDQxNSwgZHVyYXRpb246IDE4Ljc4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM3NDg4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDYxMDF9LHsidiI6IlN0ZXAgNDE2LCBkdXJhdGlvbjogMTguNDggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTU1MDk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzU4fSx7InYiOiJTdGVwIDQxNywgZHVyYXRpb246IDE4LjY1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDE4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE0NzU0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTE1NX0seyJ2IjoiU3RlcCA0MTgsIGR1cmF0aW9uOiAxOS4yNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQxOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45MzY1NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3MjY4fSx7InYiOiJTdGVwIDQxOSwgZHVyYXRpb246IDE4LjAzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy45NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjQ0Njk2OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDAyODh9LHsidiI6IlN0ZXAgNDIwLCBkdXJhdGlvbjogMTkuNTUgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjQ1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTk2NDcxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTQ2OH0seyJ2IjoiU3RlcCA0MjEsIGR1cmF0aW9uOiAxOC43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQyMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4wOTc1MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY0Nzc3fSx7InYiOiJTdGVwIDQyMiwgZHVyYXRpb246IDIwLjI2IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDIzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjUzMzk1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY3ODJ9LHsidiI6IlN0ZXAgNDIzLCBkdXJhdGlvbjogMTkuNjIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMDEyMzk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDExM30seyJ2IjoiU3RlcCA0MjQsIGR1cmF0aW9uOiAxOS4xMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQyNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44NzgzODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2MTI3fSx7InYiOiJTdGVwIDQyNSwgZHVyYXRpb246IDE5Ljk2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS44OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDI2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA0NDM3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUwNjJ9LHsidiI6IlN0ZXAgNDI2LCBkdXJhdGlvbjogMTguMTQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjU4OTY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMzM3N30seyJ2IjoiU3RlcCA0MjcsIGR1cmF0aW9uOiAxNy43NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQyOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zNzQ1MzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA4Njl9LHsidiI6IlN0ZXAgNDI4LCBkdXJhdGlvbjogMTYuNDggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjM3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNzI2MjgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMTU3MX0seyJ2IjoiU3RlcCA0MjksIGR1cmF0aW9uOiAxOC44MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQzMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44NDY2Nzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1NTMyfSx7InYiOiJTdGVwIDQzMCwgZHVyYXRpb246IDE5Ljk0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS44NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDMxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjIyNDk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTUzNH0seyJ2IjoiU3RlcCA0MzEsIGR1cmF0aW9uOiAxNy4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43OTg1MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MDIxfSx7InYiOiJTdGVwIDQzMiwgZHVyYXRpb246IDE3Ljg4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjU2MzQ2Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODYxNzJ9LHsidiI6IlN0ZXAgNDMzLCBkdXJhdGlvbjogMTcuNjUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjU2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0MzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMzUxMDI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4ODQ3M30seyJ2IjoiU3RlcCA0MzQsIGR1cmF0aW9uOiAxNy40NCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQzNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wMDQ2MTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMjc5fSx7InYiOiJTdGVwIDQzNSwgZHVyYXRpb246IDE5LjEwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjUwNzE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODczOX0seyJ2IjoiU3RlcCA0MzYsIGR1cmF0aW9uOiAxOS42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQzNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC41MDQ3Njd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMzg5MjU1fSx7InYiOiJTdGVwIDQzNywgZHVyYXRpb246IDE4Ljg5IG1zXG4tQWxsIG90aGVyczogMC4zOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDM4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI2LjYxMzk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNzI5Mn0seyJ2IjoiU3RlcCA0MzgsIGR1cmF0aW9uOiAyNi43MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjYuNjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQzOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xOTg3NzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MzM5fSx7InYiOiJTdGVwIDQzOSwgZHVyYXRpb246IDE4LjI4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDQwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjgzNTY2Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkzMjN9LHsidiI6IlN0ZXAgNDQwLCBkdXJhdGlvbjogMTcuOTIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTM0NTAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTk4NX0seyJ2IjoiU3RlcCA0NDEsIGR1cmF0aW9uOiAxNi4wMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ0MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42MDE5MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEyMjkzfSx7InYiOiJTdGVwIDQ0MiwgZHVyYXRpb246IDE4LjcxIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDQzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjU5NDI4OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcxMTF9LHsidiI6IlN0ZXAgNDQzLCBkdXJhdGlvbjogMTguNjggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjU5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNTgyNzkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDAwMn0seyJ2IjoiU3RlcCA0NDQsIGR1cmF0aW9uOiAxNi42OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4xNDY2MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEyODR9LHsidiI6IlN0ZXAgNDQ1LCBkdXJhdGlvbjogMTYuMjYgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjE1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMTI4OTc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODA3fSx7InYiOiJTdGVwIDQ0NiwgZHVyYXRpb246IDE3LjIzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDQ3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjIxNDUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5Nzg1NX0seyJ2IjoiU3RlcCA0NDcsIGR1cmF0aW9uOiAxOC4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ0OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNTg5MTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDY5NzE5fSx7InYiOiJTdGVwIDQ0OCwgZHVyYXRpb246IDE4LjMzIG1zXG4tQWxsIG90aGVyczogMC4wNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDQ5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjUyNzU0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcwOTZ9LHsidiI6IlN0ZXAgNDQ5LCBkdXJhdGlvbjogMTcuNjEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMjE0ODM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjYxN30seyJ2IjoiU3RlcCA0NTAsIGR1cmF0aW9uOiAxNS4zMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ1MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC43Nzg4ODh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMDg4fSx7InYiOiJTdGVwIDQ1MSwgZHVyYXRpb246IDE0Ljg3IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC43OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDUyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE2NDczMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMzMTR9LHsidiI6IlN0ZXAgNDUyLCBkdXJhdGlvbjogMTcuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NTMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODIxMTkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MzM5OX0seyJ2IjoiU3RlcCA0NTMsIGR1cmF0aW9uOiAxNy45MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ1NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zMTg2MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwNDk2fSx7InYiOiJTdGVwIDQ1NCwgZHVyYXRpb246IDE3LjQxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDU1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY2MTk5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDg3MTJ9LHsidiI6IlN0ZXAgNDU1LCBkdXJhdGlvbjogMTYuNzcgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMzEzMTkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDMxNn0seyJ2IjoiU3RlcCA0NTYsIGR1cmF0aW9uOiAxNy40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ1NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40NDQxNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2NDAzfSx7InYiOiJTdGVwIDQ1NywgZHVyYXRpb246IDE4LjUzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDU4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjEyODQ4Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMyOTR9LHsidiI6IlN0ZXAgNDU4LCBkdXJhdGlvbjogMTUuMjIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjEzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuODkyMjI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMjI2MX0seyJ2IjoiU3RlcCA0NTksIGR1cmF0aW9uOiAxNi4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuODkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ2MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi45NTg4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTEyMzV9LHsidiI6IlN0ZXAgNDYwLCBkdXJhdGlvbjogMTcuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjgyMDY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzQ4NH0seyJ2IjoiU3RlcCA0NjEsIGR1cmF0aW9uOiAxOC43OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy44MTMzNzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE3MDM2fSx7InYiOiJTdGVwIDQ2MiwgZHVyYXRpb246IDE3LjkzIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDYzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkwMTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc3MTU4fSx7InYiOiJTdGVwIDQ2MywgZHVyYXRpb246IDE2Ljk4IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjIxNzg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDc1NH0seyJ2IjoiU3RlcCA0NjQsIGR1cmF0aW9uOiAxNC4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC4wMzkzNTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxODg2fSx7InYiOiJTdGVwIDQ2NSwgZHVyYXRpb246IDE0LjEzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4wNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDY2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjU4NTc4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTgzMzR9LHsidiI6IlN0ZXAgNDY2LCBkdXJhdGlvbjogMTUuNjggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjU5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuODM1MTEyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMzE5M30seyJ2IjoiU3RlcCA0NjcsIGR1cmF0aW9uOiAxNC45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuODQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43NDQ3Nzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAwNDY2fSx7InYiOiJTdGVwIDQ2OCwgZHVyYXRpb246IDE3Ljg1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjUyODgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTQ1N30seyJ2IjoiU3RlcCA0NjksIGR1cmF0aW9uOiAxNi42MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ3MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC43ODQ4MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1NTl9LHsidiI6IlN0ZXAgNDcwLCBkdXJhdGlvbjogMTQuODcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljc4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuOTA1MTcxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTYzOX0seyJ2IjoiU3RlcCA0NzEsIGR1cmF0aW9uOiAxNi45OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ3MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40ODU4MDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3Nzg2fSx7InYiOiJTdGVwIDQ3MiwgZHVyYXRpb246IDE4LjU4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDczIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjgwNzA3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMzNTF9LHsidiI6IlN0ZXAgNDczLCBkdXJhdGlvbjogMTQuOTAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjgxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDk0MjQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDE1OX0seyJ2IjoiU3RlcCA0NzQsIGR1cmF0aW9uOiAxNi4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ3NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42Nzk0ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0Njc3fSx7InYiOiJTdGVwIDQ3NSwgZHVyYXRpb246IDE2Ljc2IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjQ1NzEwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA2ODR9LHsidiI6IlN0ZXAgNDc2LCBkdXJhdGlvbjogMTUuNTUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjQ2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0NzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuOTEwMDY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5Mjg1NX0seyJ2IjoiU3RlcCA0NzcsIGR1cmF0aW9uOiAxNy4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS40MTExMjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc5Njg2fSx7InYiOiJTdGVwIDQ3OCwgZHVyYXRpb246IDE1LjQ5IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS40MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg1NTQ4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc5Njh9LHsidiI6IlN0ZXAgNDc5LCBkdXJhdGlvbjogMTcuOTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0ODAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTcxODUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTc2M30seyJ2IjoiU3RlcCA0ODAsIGR1cmF0aW9uOiAxNi4wNiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ4MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yMDU0NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1Mzc3fSx7InYiOiJTdGVwIDQ4MSwgZHVyYXRpb246IDE4LjMwIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk3MzU0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU5MTF9LHsidiI6IlN0ZXAgNDgyLCBkdXJhdGlvbjogMTYuMDYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0ODMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDQ2MTI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDE4OX0seyJ2IjoiU3RlcCA0ODMsIGR1cmF0aW9uOiAxNi4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ4NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjU1ODcxM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODk3MDh9LHsidiI6IlN0ZXAgNDg0LCBkdXJhdGlvbjogNy42NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogNy41NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuODQxMzIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NzYyN30seyJ2IjoiU3RlcCA0ODUsIGR1cmF0aW9uOiA0LjAyIG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjg0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0ODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My40MzYzNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjIwOTl9LHsidiI6IlN0ZXAgNDg2LCBkdXJhdGlvbjogMy41NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy40NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDg3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguOTQ0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDI2Nzl9LHsidiI6IlN0ZXAgNDg3LCBkdXJhdGlvbjogOS4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC45NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuODU0NDU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyMzUzMn0seyJ2IjoiU3RlcCA0ODgsIGR1cmF0aW9uOiAzLjk4IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjg1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0ODkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjc1NTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcxODg4fSx7InYiOiJTdGVwIDQ4OSwgZHVyYXRpb246IDE4Ljg1IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDkwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjUzODQ2Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDU4NjV9LHsidiI6IlN0ZXAgNDkwLCBkdXJhdGlvbjogMTkuNjQgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjU0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0OTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODA4NDcyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDAwOH0seyJ2IjoiU3RlcCA0OTEsIGR1cmF0aW9uOiAxNy45MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC44OTE0Mzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4NjExfSx7InYiOiJTdGVwIDQ5MiwgZHVyYXRpb246IDIwLjk4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC44OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljk3MjMzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU2Mjl9LHsidiI6IlN0ZXAgNDkzLCBkdXJhdGlvbjogMTkuMDYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0OTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjk5ODYyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTY0OH0seyJ2IjoiU3RlcCA0OTQsIGR1cmF0aW9uOiAxNy43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjQ5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44NjUzMzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3MjIyfSx7InYiOiJTdGVwIDQ5NSwgZHVyYXRpb246IDE2Ljk1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjIyNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2MzcxfSx7InYiOiJTdGVwIDQ5NiwgZHVyYXRpb246IDE5LjMyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4yMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDk3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjI4OTgyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzY3MTZ9LHsidiI6IlN0ZXAgNDk3LCBkdXJhdGlvbjogMTguMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI0OTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNzQxNTczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MzEzfSx7InYiOiJTdGVwIDQ5OCwgZHVyYXRpb246IDE5LjgyIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS43NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNDk5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjQ2OTQ3Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODQ5MTd9LHsidiI6IlN0ZXAgNDk5LCBkdXJhdGlvbjogMTQuNTUgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjQ3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNzEzNzM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODUyMn0seyJ2IjoiU3RlcCA1MDAsIGR1cmF0aW9uOiAxNi44MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUwMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yNjk2NzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3Nzg0fSx7InYiOiJTdGVwIDUwMSwgZHVyYXRpb246IDE3LjM3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTAyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjM5NDI2Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDExNDh9LHsidiI6IlN0ZXAgNTAyLCBkdXJhdGlvbjogMTUuNTAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDk0Nzc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjY5OH0seyJ2IjoiU3RlcCA1MDMsIGR1cmF0aW9uOiAxNy4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS45NzQ3MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyOTg4fSx7InYiOiJTdGVwIDUwNCwgZHVyYXRpb246IDE2LjA3IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTA1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY4MDM4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE3MDZ9LHsidiI6IlN0ZXAgNTA1LCBkdXJhdGlvbjogMTcuNzcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMDM4NDUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTg1OX0seyJ2IjoiU3RlcCA1MDYsIGR1cmF0aW9uOiAxOS4xNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUwNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44MjkyNTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5Njh9LHsidiI6IlN0ZXAgNTA3LCBkdXJhdGlvbjogMTYuOTMgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjgzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTQxNzg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjY1fSx7InYiOiJTdGVwIDUwOCwgZHVyYXRpb246IDE5LjAzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTA5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjM1OTYyOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDEyNDd9LHsidiI6IlN0ZXAgNTA5LCBkdXJhdGlvbjogMTYuNDYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjM2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjMzNzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE5Mzc3fSx7InYiOiJTdGVwIDUxMCwgZHVyYXRpb246IDE3LjM1IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTExIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjMxMTYxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDk1Mjl9LHsidiI6IlN0ZXAgNTExLCBkdXJhdGlvbjogMTkuNDIgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjMxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjIxMzk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjQ4M30seyJ2IjoiU3RlcCA1MTIsIGR1cmF0aW9uOiAxOC4zMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yODQ3OTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgzNjEyfSx7InYiOiJTdGVwIDUxMywgZHVyYXRpb246IDE3LjM3IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTE0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjEzNzY2OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc0NjF9LHsidiI6IlN0ZXAgNTE0LCBkdXJhdGlvbjogMTcuMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMTA4MzY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTU1NX0seyJ2IjoiU3RlcCA1MTUsIGR1cmF0aW9uOiAxOC4yMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUxNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNjI4NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3Mjc2fSx7InYiOiJTdGVwIDUxNiwgZHVyYXRpb246IDE4LjM1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTE3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjgwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA3MDJ9LHsidiI6IlN0ZXAgNTE3LCBkdXJhdGlvbjogMTUuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNDU1MjQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzgyOX0seyJ2IjoiU3RlcCA1MTgsIGR1cmF0aW9uOiAyMC41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUxOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy45MTQwMzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1Mzl9LHsidiI6IlN0ZXAgNTE5LCBkdXJhdGlvbjogMTguMDAgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzIwOTc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MjUxOH0seyJ2IjoiU3RlcCA1MjAsIGR1cmF0aW9uOiAxNy44MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUyMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4wODQwNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1ODI4fSx7InYiOiJTdGVwIDUyMSwgZHVyYXRpb246IDIwLjE4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4wOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTIyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE3ODI4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODczNDR9LHsidiI6IlN0ZXAgNTIyLCBkdXJhdGlvbjogMTcuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuNjgzNDcxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTEyNH0seyJ2IjoiU3RlcCA1MjMsIGR1cmF0aW9uOiAxMi43NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuNjggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUyNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi42NjU0Nzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgzNzI1fSx7InYiOiJTdGVwIDUyNCwgZHVyYXRpb246IDEyLjc1IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTI1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjAzNDY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMjQwMX0seyJ2IjoiU3RlcCA1MjUsIGR1cmF0aW9uOiAxMy4xNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi42NzE4NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg4Mzk5fSx7InYiOiJTdGVwIDUyNiwgZHVyYXRpb246IDEyLjc2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjA4NTMxNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODE5Njd9LHsidiI6IlN0ZXAgNTI3LCBkdXJhdGlvbjogMTMuMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuMzE1NTQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5Mjk3MX0seyJ2IjoiU3RlcCA1MjgsIGR1cmF0aW9uOiAxMi40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUyOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi42MTI4OTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkyNTE2fSx7InYiOiJTdGVwIDUyOSwgZHVyYXRpb246IDEyLjgxIG1zXG4tQWxsIG90aGVyczogMC4xOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi42MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTMwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjQzOTA2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTc4ODF9LHsidiI6IlN0ZXAgNTMwLCBkdXJhdGlvbjogMTMuNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjQ0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuOTA3NTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzcxMX0seyJ2IjoiU3RlcCA1MzEsIGR1cmF0aW9uOiAxMi4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi44MDQyMzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyNTU0fSx7InYiOiJTdGVwIDUzMiwgZHVyYXRpb246IDEyLjkwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjM0NzA0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTIyMjh9LHsidiI6IlN0ZXAgNTMzLCBkdXJhdGlvbjogMTIuNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNTQzMTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNzA2NH0seyJ2IjoiU3RlcCA1MzQsIGR1cmF0aW9uOiAxMy42NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuNTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUzNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy4yNDYzMjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAxNDI0fSx7InYiOiJTdGVwIDUzNSwgZHVyYXRpb246IDEzLjM1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy4yNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjk3NDgzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMwMzV9LHsidiI6IlN0ZXAgNTM2LCBkdXJhdGlvbjogMTMuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuMTQ4NjY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTMzN30seyJ2IjoiU3RlcCA1MzcsIGR1cmF0aW9uOiAxMi4yNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjUzOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy4wMjkwMzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDY2NDR9LHsidiI6IlN0ZXAgNTM4LCBkdXJhdGlvbjogMTMuMTAgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjAzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1MzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuMjgxMjc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyNTExNn0seyJ2IjoiU3RlcCA1MzksIGR1cmF0aW9uOiAxMi40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMjggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMS41NDcyMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwMTQzfSx7InYiOiJTdGVwIDU0MCwgZHVyYXRpb246IDExLjY0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS41NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTQxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjczMDEwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODc2NTd9LHsidiI6IlN0ZXAgNTQxLCBkdXJhdGlvbjogMTIuODIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjczIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuODc0MDg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA2Mzk0N30seyJ2IjoiU3RlcCA1NDIsIGR1cmF0aW9uOiAxMy45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMDYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuODcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy41MTg0ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3Mzg1fSx7InYiOiJTdGVwIDU0MywgZHVyYXRpb246IDEzLjYyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy41MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTQ0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjY3NTYzMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzI5NTR9LHsidiI6IlN0ZXAgNTQ0LCBkdXJhdGlvbjogMTMuNzUgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuOTM3NjQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDQxOH0seyJ2IjoiU3RlcCA1NDUsIGR1cmF0aW9uOiAxMy4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuOTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU0NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4xNzA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3ODM2N30seyJ2IjoiU3RlcCA1NDYsIGR1cmF0aW9uOiAxNS4yNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU0NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi45NzY2MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTExMDg1fSx7InYiOiJTdGVwIDU0NywgZHVyYXRpb246IDEzLjA5IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi45OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjk4ODM5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ4MDd9LHsidiI6IlN0ZXAgNTQ4LCBkdXJhdGlvbjogMTMuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuOTMwMjcyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDgzM30seyJ2IjoiU3RlcCA1NDksIGR1cmF0aW9uOiAxMy4wMiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4xMDYxMzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MjE0fSx7InYiOiJTdGVwIDU1MCwgZHVyYXRpb246IDE1LjE5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4xMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjAyMzk4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY1Nn0seyJ2IjoiU3RlcCA1NTEsIGR1cmF0aW9uOiAxNC4xMSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU1MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS45MjczOTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzODE0fSx7InYiOiJTdGVwIDU1MiwgZHVyYXRpb246IDE2LjAyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTUzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk0NDU4NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMzNzF9LHsidiI6IlN0ZXAgNTUzLCBkdXJhdGlvbjogMTYuMDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzI0NjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjQ4OH0seyJ2IjoiU3RlcCA1NTQsIGR1cmF0aW9uOiAxOC40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU1NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4wODA4MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDEwNDZ9LHsidiI6IlN0ZXAgNTU1LCBkdXJhdGlvbjogMTguMTggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjE2Nzk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDQ5N30seyJ2IjoiU3RlcCA1NTYsIGR1cmF0aW9uOiAxNy43MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU1NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NjU5MTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgzNDM4fSx7InYiOiJTdGVwIDU1NywgZHVyYXRpb246IDE3Ljc1IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTU4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA3NTMzNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDM5NTN9LHsidiI6IlN0ZXAgNTU4LCBkdXJhdGlvbjogMTcuMTggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNzQzNDE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjkzM30seyJ2IjoiU3RlcCA1NTksIGR1cmF0aW9uOiAxMy44NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuNzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU2MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC41MjgxNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgwMTY5fSx7InYiOiJTdGVwIDU2MCwgZHVyYXRpb246IDE0LjYxIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC41MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTYxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjY4OTczMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI3MTl9LHsidiI6IlN0ZXAgNTYxLCBkdXJhdGlvbjogMTQuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuNzc2MzU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MTkwMX0seyJ2IjoiU3RlcCA1NjIsIGR1cmF0aW9uOiAxMi44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuNzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU2MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC4yMTI3MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwNzI1fSx7InYiOiJTdGVwIDU2MywgZHVyYXRpb246IDE0LjMwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4yMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjIwMjUxOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODA4OTJ9LHsidiI6IlN0ZXAgNTY0LCBkdXJhdGlvbjogMTQuMjggbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjIwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNzUyOTY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDU2OX0seyJ2IjoiU3RlcCA1NjUsIGR1cmF0aW9uOiAxNS44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU2NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yNTIyMzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyMDIxfSx7InYiOiJTdGVwIDU2NiwgZHVyYXRpb246IDE3LjM0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTY3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg2MzMzOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTEzMX0seyJ2IjoiU3RlcCA1NjcsIGR1cmF0aW9uOiAxNy45NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyNC4wNTgyNDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgxMTE0fSx7InYiOiJTdGVwIDU2OCwgZHVyYXRpb246IDI0LjE0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNC4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjYwMjA0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDcyODV9LHsidiI6IlN0ZXAgNTY5LCBkdXJhdGlvbjogMTkuNzEgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjYwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzI4MzE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzI3MX0seyJ2IjoiU3RlcCA1NzAsIGR1cmF0aW9uOiAxOC40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU3MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC41OTA1NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNjQxfSx7InYiOiJTdGVwIDU3MSwgZHVyYXRpb246IDE4LjY4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTcyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjkxODY2NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODk3NDJ9LHsidiI6IlN0ZXAgNTcyLCBkdXJhdGlvbjogMjAuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjI3MDA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTkyM30seyJ2IjoiU3RlcCA1NzMsIGR1cmF0aW9uOiAxOC43MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU3NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy40ODM2NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5MDY0fSx7InYiOiJTdGVwIDU3NCwgZHVyYXRpb246IDEzLjU3IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy40OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTc1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0Ljg4NjI5OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTA3Mjd9LHsidiI6IlN0ZXAgNTc1LCBkdXJhdGlvbjogMTQuOTggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1NzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNTc3MDg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTY2MX0seyJ2IjoiU3RlcCA1NzYsIGR1cmF0aW9uOiAxMy42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU3NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4wNTEwNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTExNTE2fSx7InYiOiJTdGVwIDU3NywgZHVyYXRpb246IDE1LjE2IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTc4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjU0OTA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDY5OX0seyJ2IjoiU3RlcCA1NzgsIGR1cmF0aW9uOiAyMS42NCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU3OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi43NTI3MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0ODk3fSx7InYiOiJTdGVwIDU3OSwgZHVyYXRpb246IDE2Ljg0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTgwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjkyNzA1MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODIwMTF9LHsidiI6IlN0ZXAgNTgwLCBkdXJhdGlvbjogMTYuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjkzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1ODEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTc3MjQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTY1Mn0seyJ2IjoiU3RlcCA1ODEsIGR1cmF0aW9uOiAxNi4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU4MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wNjcyMTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1NTYzfSx7InYiOiJTdGVwIDU4MiwgZHVyYXRpb246IDE3LjE2IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTgzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjUyMDU0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU1NzF9LHsidiI6IlN0ZXAgNTgzLCBkdXJhdGlvbjogMTcuNjIgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjUyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1ODQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzQ4Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5MzQ3fSx7InYiOiJTdGVwIDU4NCwgZHVyYXRpb246IDE3Ljg0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE0MzMxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU1Mjl9LHsidiI6IlN0ZXAgNTg1LCBkdXJhdGlvbjogMTkuMjQgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1ODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNjkyNjIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDg1Nn0seyJ2IjoiU3RlcCA1ODYsIGR1cmF0aW9uOiAxNS43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU4NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC45OTA4ODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5NDE1fSx7InYiOiJTdGVwIDU4NywgZHVyYXRpb246IDE1LjA5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC45OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjY4NTE1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkzOTZ9LHsidiI6IlN0ZXAgNTg4LCBkdXJhdGlvbjogMTYuNzcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1ODkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDgyMDk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMjJ9LHsidiI6IlN0ZXAgNTg5LCBkdXJhdGlvbjogMTYuMTkgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNTUxNjYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNzg4NH0seyJ2IjoiU3RlcCA1OTAsIGR1cmF0aW9uOiAxNy42NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU5MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xMjIwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTEwMzR9LHsidiI6IlN0ZXAgNTkxLCBkdXJhdGlvbjogMTguMjEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjEyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjk5MzUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTg4M30seyJ2IjoiU3RlcCA1OTIsIGR1cmF0aW9uOiAxOC40MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU5MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44OTI4NTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2Nzd9LHsidiI6IlN0ZXAgNTkzLCBkdXJhdGlvbjogMTYuOTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODEwMzQ5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzgzN30seyJ2IjoiU3RlcCA1OTQsIGR1cmF0aW9uOiAxOC45MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguODEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS45NjY2ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTgxMzcxfSx7InYiOiJTdGVwIDU5NSwgZHVyYXRpb246IDE2LjE1IG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjA0ODEyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkxMzR9LHsidiI6IlN0ZXAgNTk2LCBkdXJhdGlvbjogMTQuMTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI1OTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNDI3NTk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzY0N30seyJ2IjoiU3RlcCA1OTcsIGR1cmF0aW9uOiAxNS41MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjU5OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4wOTgxNzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3NDA2fSx7InYiOiJTdGVwIDU5OCwgZHVyYXRpb246IDE2LjE5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNTk5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjkwOTczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODIzM30seyJ2IjoiU3RlcCA1OTksIGR1cmF0aW9uOiAxNC4wMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yMTEzODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0ODgyfSx7InYiOiJTdGVwIDYwMCwgZHVyYXRpb246IDE1LjMxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4yMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjAxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc5NDE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzYyMn0seyJ2IjoiU3RlcCA2MDEsIGR1cmF0aW9uOiAxNy44OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43OTg4OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNjY2MzZ9LHsidiI6IlN0ZXAgNjAyLCBkdXJhdGlvbjogMTcuODcgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuODAyNjM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTEzNn0seyJ2IjoiU3RlcCA2MDMsIGR1cmF0aW9uOiAxNi44OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4wODM3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDAwNjV9LHsidiI6IlN0ZXAgNjA0LCBkdXJhdGlvbjogMTguMTggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuNzA0NjY5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODUyNn0seyJ2IjoiU3RlcCA2MDUsIGR1cmF0aW9uOiAxNC44MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjA2MjkwM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcwNzR9LHsidiI6IlN0ZXAgNjA2LCBkdXJhdGlvbjogOC4xNSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjA3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuODM1NTEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NDUxMX0seyJ2IjoiU3RlcCA2MDcsIGR1cmF0aW9uOiAzLjk5IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjg0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4yMzI0NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIzMjIyfSx7InYiOiJTdGVwIDYwOCwgZHVyYXRpb246IDMuMzYgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYwOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjcxMTUxN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzU4OTN9LHsidiI6IlN0ZXAgNjA5LCBkdXJhdGlvbjogOC44NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC43MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuOTA5NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIxOH0seyJ2IjoiU3RlcCA2MTAsIGR1cmF0aW9uOiA0LjAzIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuOTA2MTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwOTYyN30seyJ2IjoiU3RlcCA2MTEsIGR1cmF0aW9uOiAxNS4wMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYxMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4yMjY1NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA0NTEzfSx7InYiOiJTdGVwIDYxMiwgZHVyYXRpb246IDE2LjMzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4yMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjEzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjQ3NDQyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzI4fSx7InYiOiJTdGVwIDYxMywgZHVyYXRpb246IDE3LjY1IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy40NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjE0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjkwNDg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMzM1OH0seyJ2IjoiU3RlcCA2MTQsIGR1cmF0aW9uOiAyMC4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuOTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xOTE3OTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxMTAzfSx7InYiOiJTdGVwIDYxNSwgZHVyYXRpb246IDE5LjI4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4xOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA3NzQwOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTU5NX0seyJ2IjoiU3RlcCA2MTYsIGR1cmF0aW9uOiAxOC4xNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy44MTI4NDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2NzYxfSx7InYiOiJTdGVwIDYxNywgZHVyYXRpb246IDE3LjkxIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjE4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY2NjEwNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTUwODh9LHsidiI6IlN0ZXAgNjE4LCBkdXJhdGlvbjogMTguNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNDU3Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgyMTYxfSx7InYiOiJTdGVwIDYxOSwgZHVyYXRpb246IDIwLjU0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjkxNjQwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTYxNTJ9LHsidiI6IlN0ZXAgNjIwLCBkdXJhdGlvbjogMTguMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTE1ODQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDM2MX0seyJ2IjoiU3RlcCA2MjEsIGR1cmF0aW9uOiAxOS42MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYyMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy40Nzk2NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE5Njh9LHsidiI6IlN0ZXAgNjIyLCBkdXJhdGlvbjogMTcuNTcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjQ4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzgzOTU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTA2NX0seyJ2IjoiU3RlcCA2MjMsIGR1cmF0aW9uOiAxOC40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYyNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xMTU5NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA2MDQxfSx7InYiOiJTdGVwIDYyNCwgZHVyYXRpb246IDIwLjIyIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjI1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjExMjMwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzA3MjF9LHsidiI6IlN0ZXAgNjI1LCBkdXJhdGlvbjogMTUuMjQgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjExIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNjEyNTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEwODU5fSx7InYiOiJTdGVwIDYyNiwgZHVyYXRpb246IDEzLjcyIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy42MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0Ljc2OTcwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTk1N30seyJ2IjoiU3RlcCA2MjcsIGR1cmF0aW9uOiAxNC44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYyOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44Mzg3ODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1MDIzfSx7InYiOiJTdGVwIDYyOCwgZHVyYXRpb246IDE1LjkzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjI5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjE5MjEzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODk5MzJ9LHsidiI6IlN0ZXAgNjI5LCBkdXJhdGlvbjogMTUuMjggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTg0Mzc3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMTEzNX0seyJ2IjoiU3RlcCA2MzAsIGR1cmF0aW9uOiAxNS42OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYzMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zNDMxNjl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2Njc1fSx7InYiOiJTdGVwIDYzMSwgZHVyYXRpb246IDE2LjQ0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjMyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjU1MDg2NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY2MTJ9LHsidiI6IlN0ZXAgNjMyLCBkdXJhdGlvbjogMTcuNjQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjU1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTk5NTMxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MzY4OX0seyJ2IjoiU3RlcCA2MzMsIGR1cmF0aW9uOiAxOS4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYzNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC44MDg0MjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgxODh9LHsidiI6IlN0ZXAgNjM0LCBkdXJhdGlvbjogMTguODkgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjgxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTEyOTQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDg0NX0seyJ2IjoiU3RlcCA2MzUsIGR1cmF0aW9uOiAxOS4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYzNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi45ODkzNjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1ODMyfSx7InYiOiJTdGVwIDYzNiwgZHVyYXRpb246IDE3LjA4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjM3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljg0ODcyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI0MzJ9LHsidiI6IlN0ZXAgNjM3LCBkdXJhdGlvbjogMTguOTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljg1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2MzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjU5Nzg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjY1N30seyJ2IjoiU3RlcCA2MzgsIGR1cmF0aW9uOiAxOC43NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjYzOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45NjE0NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM1MTg0fSx7InYiOiJTdGVwIDYzOSwgZHVyYXRpb246IDE5LjEwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjQwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjQzMzAxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI5MTl9LHsidiI6IlN0ZXAgNjQwLCBkdXJhdGlvbjogMTguNTMgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjQzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuNTMzMDk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3OTcyOH0seyJ2IjoiU3RlcCA2NDEsIGR1cmF0aW9uOiAxNC42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuNTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY0MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yMDIzMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk1MzQzfSx7InYiOiJTdGVwIDY0MiwgZHVyYXRpb246IDE1LjMwIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4yMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjQzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjI4NTQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMDc3M30seyJ2IjoiU3RlcCA2NDMsIGR1cmF0aW9uOiAxNC4zOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY0NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4zODc4MDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyODc4fSx7InYiOiJTdGVwIDY0NCwgZHVyYXRpb246IDE2LjQ4IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjQ1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjI5ODMyOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTk4Njd9LHsidiI6IlN0ZXAgNjQ1LCBkdXJhdGlvbjogMTYuNDAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjMwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMTk1MTEyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTUwM30seyJ2IjoiU3RlcCA2NDYsIGR1cmF0aW9uOiAxNy4yOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY0NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NzYxNDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEwNjU0fSx7InYiOiJTdGVwIDY0NywgZHVyYXRpb246IDE3Ljc5IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjMyNTA1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODkzMDl9LHsidiI6IlN0ZXAgNjQ4LCBkdXJhdGlvbjogMTkuNDEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjMzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTUyMjY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMzA0Nn0seyJ2IjoiU3RlcCA2NDksIGR1cmF0aW9uOiAxOS4yNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43Njc0NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAyMjI1fSx7InYiOiJTdGVwIDY1MCwgZHVyYXRpb246IDE3Ljg3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjQyNDIzNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ4Mjh9LHsidiI6IlN0ZXAgNjUxLCBkdXJhdGlvbjogMTguNTIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjQyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuNDQ3NTA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNzUxOX0seyJ2IjoiU3RlcCA2NTIsIGR1cmF0aW9uOiAyMS41NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4wNjkyMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNDU0fSx7InYiOiJTdGVwIDY1MywgZHVyYXRpb246IDIwLjE2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4wNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjU0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjQ2MjU1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODg4Mjh9LHsidiI6IlN0ZXAgNjU0LCBkdXJhdGlvbjogMjAuNTUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjQ2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuODkxNDAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTY0NX0seyJ2IjoiU3RlcCA2NTUsIGR1cmF0aW9uOiAxOS45OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuODkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4yNzk0ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAyNzYzfSx7InYiOiJTdGVwIDY1NiwgZHVyYXRpb246IDIwLjM4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjU3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjI2ODI3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODU0NTV9LHsidiI6IlN0ZXAgNjU3LCBkdXJhdGlvbjogMTkuMzUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTc5NDY5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2NzgwMn0seyJ2IjoiU3RlcCA2NTgsIGR1cmF0aW9uOiAxOS4zNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS43MTQ0Mzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMTc4fSx7InYiOiJTdGVwIDY1OSwgZHVyYXRpb246IDE5LjgxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS43MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjgwNDA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MjMzMX0seyJ2IjoiU3RlcCA2NjAsIGR1cmF0aW9uOiAxNi44OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY2MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS43NjA0N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODY5NTN9LHsidiI6IlN0ZXAgNjYxLCBkdXJhdGlvbjogMTkuODUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NjIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMTI3NzI3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5ODM3Mn0seyJ2IjoiU3RlcCA2NjIsIGR1cmF0aW9uOiAyMi4yMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY2MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS43MzQ1Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4NTN9LHsidiI6IlN0ZXAgNjYzLCBkdXJhdGlvbjogMjEuODMgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjczIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTU0OTQxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTM0M30seyJ2IjoiU3RlcCA2NjQsIGR1cmF0aW9uOiAxOC42NCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40NTA5M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDc5ODF9LHsidiI6IlN0ZXAgNjY1LCBkdXJhdGlvbjogMTkuNjYgbXNcbi1BbGwgb3RoZXJzOiAwLjIxIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjQ1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjY3MTgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNTQwM30seyJ2IjoiU3RlcCA2NjYsIGR1cmF0aW9uOiAxOS4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY2NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NjgzOTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0ODc2fSx7InYiOiJTdGVwIDY2NywgZHVyYXRpb246IDE3Ljc1IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjY4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg0MTgwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTI0NjJ9LHsidiI6IlN0ZXAgNjY4LCBkdXJhdGlvbjogMTcuOTUgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTQ4Mzc0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMTY0OX0seyJ2IjoiU3RlcCA2NjksIGR1cmF0aW9uOiAxOC42NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY3MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC41NDEyNjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzNjg1fSx7InYiOiJTdGVwIDY3MCwgZHVyYXRpb246IDE4LjYzIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjcxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjcxMDYyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTY0MDN9LHsidiI6IlN0ZXAgNjcxLCBkdXJhdGlvbjogMTkuODMgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjcxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NzIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDg0NjM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMjAzN30seyJ2IjoiU3RlcCA2NzIsIGR1cmF0aW9uOiAxOC4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY3MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNjk0NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk3ODI5fSx7InYiOiJTdGVwIDY3MywgZHVyYXRpb246IDE4LjM3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjc0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjM1NDE4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODg4ODR9LHsidiI6IlN0ZXAgNjc0LCBkdXJhdGlvbjogMTcuNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNjQ0MzYyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTI3fSx7InYiOiJTdGVwIDY3NSwgZHVyYXRpb246IDE1Ljc0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljc2OTE5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODk2NjR9LHsidiI6IlN0ZXAgNjc2LCBkdXJhdGlvbjogMTguODYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljc3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2NzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODMzNjA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjkxOX0seyJ2IjoiU3RlcCA2NzcsIGR1cmF0aW9uOiAxNy45MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy4xNTQ5NDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0NTMyfSx7InYiOiJTdGVwIDY3OCwgZHVyYXRpb246IDEzLjI0IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjk5NTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDk1NH0seyJ2IjoiU3RlcCA2NzksIGR1cmF0aW9uOiAxMi4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY4MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi43MTg3Nzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2ODE2fSx7InYiOiJTdGVwIDY4MCwgZHVyYXRpb246IDEyLjgxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi43MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjgxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjg4ODIzOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDE2MDd9LHsidiI6IlN0ZXAgNjgxLCBkdXJhdGlvbjogMTEuOTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2ODIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuOTMxNzU0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MTIyMX0seyJ2IjoiU3RlcCA2ODIsIGR1cmF0aW9uOiAxMi4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY4MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMS44NDU0ODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyNDk0fSx7InYiOiJTdGVwIDY4MywgZHVyYXRpb246IDExLjk0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS44NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjg0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjUwMjMyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODE4NTd9LHsidiI6IlN0ZXAgNjg0LCBkdXJhdGlvbjogMTIuNTggbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjUwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2ODUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuMzM4NjM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzQyNn0seyJ2IjoiU3RlcCA2ODUsIGR1cmF0aW9uOiAxMy40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY4NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy4wMDc3NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0MDcyfSx7InYiOiJTdGVwIDY4NiwgZHVyYXRpb246IDEzLjEwIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy4wMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjg3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjY5NDUxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTAyNjd9LHsidiI6IlN0ZXAgNjg3LCBkdXJhdGlvbjogMTIuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2ODgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuMDQyMjQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjM4OX0seyJ2IjoiU3RlcCA2ODgsIGR1cmF0aW9uOiAxMy4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuMDQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY4OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC40Nzk1MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3NzIxfSx7InYiOiJTdGVwIDY4OSwgZHVyYXRpb246IDE0LjU5IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC40OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjkwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk4NzA4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQ0Njh9LHsidiI6IlN0ZXAgNjkwLCBkdXJhdGlvbjogMTYuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2OTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuOTUwNjE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMjE5N30seyJ2IjoiU3RlcCA2OTEsIGR1cmF0aW9uOiAxNi4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44MjcxNzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwNjg2fSx7InYiOiJTdGVwIDY5MiwgZHVyYXRpb246IDE1LjkyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjI2ODQwNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODk0ODl9LHsidiI6IlN0ZXAgNjkzLCBkdXJhdGlvbjogMTUuMzYgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2OTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDA2NjIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjQ4MX0seyJ2IjoiU3RlcCA2OTQsIGR1cmF0aW9uOiAxNi4xMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC43MTU2MDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg0MjU1fSx7InYiOiJTdGVwIDY5NSwgZHVyYXRpb246IDE4LjgwIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC43MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjUyOTYyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODcwMzJ9LHsidiI6IlN0ZXAgNjk2LCBkdXJhdGlvbjogMTguNjIgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI2OTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjk5OTg0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NTU1MX0seyJ2IjoiU3RlcCA2OTcsIGR1cmF0aW9uOiAxOC4zOSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjY5OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40MzE4NzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyMDI4fSx7InYiOiJTdGVwIDY5OCwgZHVyYXRpb246IDE5LjUyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS40MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNjk5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljk4ODE2Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTQxMDN9LHsidiI6IlN0ZXAgNjk5LCBkdXJhdGlvbjogMjAuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljk5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNzI0OTI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzIyMn0seyJ2IjoiU3RlcCA3MDAsIGR1cmF0aW9uOiAxNi44MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcwMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy41OTQzMDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4MDc0fSx7InYiOiJTdGVwIDcwMSwgZHVyYXRpb246IDE3LjY5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy41OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzAyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjE5OTUwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTc5MTV9LHsidiI6IlN0ZXAgNzAyLCBkdXJhdGlvbjogMTcuMzAgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjIwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTg2NjExfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MTc0OX0seyJ2IjoiU3RlcCA3MDMsIGR1cmF0aW9uOiAxOS42OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xMTgzNzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg5MzQ1fSx7InYiOiJTdGVwIDcwNCwgZHVyYXRpb246IDE4LjIxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzA1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljc3NDA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDM4OX0seyJ2IjoiU3RlcCA3MDUsIGR1cmF0aW9uOiAxOC44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcwNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy44NzE0MTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2MDc4fSx7InYiOiJTdGVwIDcwNiwgZHVyYXRpb246IDE3Ljk2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzA3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA0NDAxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTEzMjF9LHsidiI6IlN0ZXAgNzA3LCBkdXJhdGlvbjogMTguMTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMzI4MDk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjQ0NH0seyJ2IjoiU3RlcCA3MDgsIGR1cmF0aW9uOiAxOS40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcwOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy42NzIwMTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAyNDE2fSx7InYiOiJTdGVwIDcwOSwgZHVyYXRpb246IDE3Ljc3IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI2LjIyOTIxM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDM0NTV9LHsidiI6IlN0ZXAgNzEwLCBkdXJhdGlvbjogMjYuMzMgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDI2LjIzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MzEuOTQzNDA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzE0OX0seyJ2IjoiU3RlcCA3MTEsIGR1cmF0aW9uOiAzMi4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMzEuOTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcxMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC41OTQ5MjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk2Mzc5fSx7InYiOiJTdGVwIDcxMiwgZHVyYXRpb246IDE4LjY5IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzEzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA5MDMzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDMzMzJ9LHsidiI6IlN0ZXAgNzEzLCBkdXJhdGlvbjogMTguMTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMTMwMDk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NjM3Nn0seyJ2IjoiU3RlcCA3MTQsIGR1cmF0aW9uOiAxOC4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcxNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zNTQ1Mzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk0NzU2fSx7InYiOiJTdGVwIDcxNSwgZHVyYXRpb246IDE3LjQ1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjI2MDkyNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDUyN30seyJ2IjoiU3RlcCA3MTYsIGR1cmF0aW9uOiAxOC4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4wOTc1MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMTI4fSx7InYiOiJTdGVwIDcxNywgZHVyYXRpb246IDE4LjE5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzE4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjU3Mzc4Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTMyMDZ9LHsidiI6IlN0ZXAgNzE4LCBkdXJhdGlvbjogMTguNjcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjU3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjQ1ODE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzQzfSx7InYiOiJTdGVwIDcxOSwgZHVyYXRpb246IDE3Ljc0IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljg5MDAzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDM2NDl9LHsidiI6IlN0ZXAgNzIwLCBkdXJhdGlvbjogMTcuOTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljg5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMzg5NTU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMTA2NX0seyJ2IjoiU3RlcCA3MjEsIGR1cmF0aW9uOiAxNS40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcyMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi41NDE3NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTEyNDk2fSx7InYiOiJTdGVwIDcyMiwgZHVyYXRpb246IDE2LjY1IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzIzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjI4MDI0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI3MDJ9LHsidiI6IlN0ZXAgNzIzLCBkdXJhdGlvbjogMTYuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjI4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNjk3MTc1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MjY2MX0seyJ2IjoiU3RlcCA3MjQsIGR1cmF0aW9uOiAxNi43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjcyNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42MzM4MTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA1MzI3fSx7InYiOiJTdGVwIDcyNSwgZHVyYXRpb246IDE2Ljc0IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzI2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjQyNTMyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNjc2NDR9LHsidiI6IlN0ZXAgNzI2LCBkdXJhdGlvbjogMTcuNDkgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjQzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMzc0MzE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDI4fSx7InYiOiJTdGVwIDcyNywgZHVyYXRpb246IDE5LjQ2IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4zNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzI4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguNzU1NjA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MDgzNH0seyJ2IjoiU3RlcCA3MjgsIGR1cmF0aW9uOiA4Ljg1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA4Ljc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My42OTIyMTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIzMjA5fSx7InYiOiJTdGVwIDcyOSwgZHVyYXRpb246IDMuODIgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjczMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjgyNjA1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzg4Mzd9LHsidiI6IlN0ZXAgNzMwLCBkdXJhdGlvbjogMy4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMi44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzMxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguMDc4OTIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNzcyMn0seyJ2IjoiU3RlcCA3MzEsIGR1cmF0aW9uOiA4LjIyIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA4LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MzIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4xNzI4NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk4MDc4fSx7InYiOiJTdGVwIDczMiwgZHVyYXRpb246IDMuMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuMTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjczMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC40OTI2MzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI3N30seyJ2IjoiU3RlcCA3MzMsIGR1cmF0aW9uOiAxMC42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjczNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC4zMzExNjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4NjU5fSx7InYiOiJTdGVwIDczNCwgZHVyYXRpb246IDEwLjQzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC4zMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzM1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuOTU1OTkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwMjY5NH0seyJ2IjoiU3RlcCA3MzUsIGR1cmF0aW9uOiAxMC4wNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS45NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNzk5NDUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NTgyMX0seyJ2IjoiU3RlcCA3MzYsIGR1cmF0aW9uOiA5Ljk4IG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjgwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3MzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuODQ5NDYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyNTc3MX0seyJ2IjoiU3RlcCA3MzcsIGR1cmF0aW9uOiAxMC45OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjczOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi40MzExODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2OTI2fSx7InYiOiJTdGVwIDczOCwgZHVyYXRpb246IDEyLjUyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi40MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzM5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjc5MDMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3NzcyOH0seyJ2IjoiU3RlcCA3MzksIGR1cmF0aW9uOiAxMy44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC44NjU2NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDgyMDQzfSx7InYiOiJTdGVwIDc0MCwgZHVyYXRpb246IDE0Ljk1IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzQxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjI4NjUzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE4NTV9LHsidiI6IlN0ZXAgNzQxLCBkdXJhdGlvbjogMTMuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzIyMDEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNDMwN30seyJ2IjoiU3RlcCA3NDIsIGR1cmF0aW9uOiAxNy44NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC41NDYzNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4MjU3fSx7InYiOiJTdGVwIDc0MywgZHVyYXRpb246IDE0LjY0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC41NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzQ0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljc1MDg3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDgxOX0seyJ2IjoiU3RlcCA3NDQsIGR1cmF0aW9uOiAxNS44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yNTczMzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzMDE4fSx7InYiOiJTdGVwIDc0NSwgZHVyYXRpb246IDE1LjM1IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzQ2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjkxNzYwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTE1MDd9LHsidiI6IlN0ZXAgNzQ2LCBkdXJhdGlvbjogMTguMDMgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NDcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDAxODE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3NzU4fSx7InYiOiJTdGVwIDc0NywgZHVyYXRpb246IDE2LjA4IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjEwMTE3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDkxODF9LHsidiI6IlN0ZXAgNzQ4LCBkdXJhdGlvbjogMjIuMjEgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjEwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuNDI5OTMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNzk2OH0seyJ2IjoiU3RlcCA3NDksIGR1cmF0aW9uOiAyMS41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuNDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozMS43OTA3MjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNDE1NzE2fSx7InYiOiJTdGVwIDc1MCwgZHVyYXRpb246IDMzLjIxIG1zXG4tQWxsIG90aGVyczogMS40MiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzMS43OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjgyMTcwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODUzNjJ9LHsidiI6IlN0ZXAgNzUxLCBkdXJhdGlvbjogMTkuOTEgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNzA0Mzc3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNDY3MX0seyJ2IjoiU3RlcCA3NTIsIGR1cmF0aW9uOiAyMC44MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC40MjI2Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkxNzczfSx7InYiOiJTdGVwIDc1MywgZHVyYXRpb246IDIwLjUxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzU0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjM1MTQ3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTIwMjd9LHsidiI6IlN0ZXAgNzU0LCBkdXJhdGlvbjogMTYuNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNDAzNTU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3NzY1OX0seyJ2IjoiU3RlcCA3NTUsIGR1cmF0aW9uOiAxNS40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4yODk4NTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3MjM3fSx7InYiOiJTdGVwIDc1NiwgZHVyYXRpb246IDIwLjQwIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4yOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzU3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjEyNTQ1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODI3MjF9LHsidiI6IlN0ZXAgNzU3LCBkdXJhdGlvbjogMTkuMjEgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjEzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMzM0MjA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NzY0Mn0seyJ2IjoiU3RlcCA3NTgsIGR1cmF0aW9uOiAyMS40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS45NDc2MzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4OTQ0fSx7InYiOiJTdGVwIDc1OSwgZHVyYXRpb246IDIwLjA1IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS45NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjE2MjUyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE0MzV9LHsidiI6IlN0ZXAgNzYwLCBkdXJhdGlvbjogMjAuMjUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuODU0MDQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NTEyOH0seyJ2IjoiU3RlcCA3NjEsIGR1cmF0aW9uOiAyMC45NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC43NTk2ODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzOTJ9LHsidiI6IlN0ZXAgNzYyLCBkdXJhdGlvbjogMjAuODUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNzY4MzQ5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjA5NX0seyJ2IjoiU3RlcCA3NjMsIGR1cmF0aW9uOiAxNi44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc2NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4wNDQyNDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk4MzQ5fSx7InYiOiJTdGVwIDc2NCwgZHVyYXRpb246IDE3LjE0IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzY1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjA3MTQ2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTc3NTR9LHsidiI6IlN0ZXAgNzY1LCBkdXJhdGlvbjogMTYuMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTAwNTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5OTUxNX0seyJ2IjoiU3RlcCA3NjYsIGR1cmF0aW9uOiAxOS4yMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc2NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43MjAxODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzODAzfSx7InYiOiJTdGVwIDc2NywgZHVyYXRpb246IDE3LjgxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzY4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjM0NDQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NjA4OH0seyJ2IjoiU3RlcCA3NjgsIGR1cmF0aW9uOiAxOS40NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc2OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4yNjM3MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkyNDk5fSx7InYiOiJTdGVwIDc2OSwgZHVyYXRpb246IDIwLjM2IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4yNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzcwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM1MzY2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTI1Mzh9LHsidiI6IlN0ZXAgNzcwLCBkdXJhdGlvbjogMTguNDcgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjA3MDcxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5NDM5M30seyJ2IjoiU3RlcCA3NzEsIGR1cmF0aW9uOiAxOS4zMCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc3MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44MjQ1MTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2OTcxfSx7InYiOiJTdGVwIDc3MiwgZHVyYXRpb246IDE1LjkxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzczIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljg3MTQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDAzN30seyJ2IjoiU3RlcCA3NzMsIGR1cmF0aW9uOiAxNi45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc3NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4wOTcwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTYxMTV9LHsidiI6IlN0ZXAgNzc0LCBkdXJhdGlvbjogMTYuMTkgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjEwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMTM4NDU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3NzE3fSx7InYiOiJTdGVwIDc3NSwgZHVyYXRpb246IDE2LjIyIG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4xNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjI3MzA1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI0MjV9LHsidiI6IlN0ZXAgNzc2LCBkdXJhdGlvbjogMTcuMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3NzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTg2MzkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA5MzMwMn0seyJ2IjoiU3RlcCA3NzcsIGR1cmF0aW9uOiAxOS4yOCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4xOTQ1MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIyMzA2fSx7InYiOiJTdGVwIDc3OCwgZHVyYXRpb246IDE4LjMyIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4xOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjA3ODA1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTAwMX0seyJ2IjoiU3RlcCA3NzksIGR1cmF0aW9uOiAxOS4xNyBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc4MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4wMDQ0ODV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg1MzkzfSx7InYiOiJTdGVwIDc4MCwgZHVyYXRpb246IDIxLjA5IG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzgxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI0Ljc2MTM1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDEyNTN9LHsidiI6IlN0ZXAgNzgxLCBkdXJhdGlvbjogMjQuODYgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDI0Ljc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3ODIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNTg4NDg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNDYzMn0seyJ2IjoiU3RlcCA3ODIsIGR1cmF0aW9uOiAyMC43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc4MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC42OTUwODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg3MTN9LHsidiI6IlN0ZXAgNzgzLCBkdXJhdGlvbjogMjAuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjcwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3ODQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTEwOTkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4OTEyMX0seyJ2IjoiU3RlcCA3ODQsIGR1cmF0aW9uOiAxOC42MCBtc1xuLUFsbCBvdGhlcnM6IDAuMDkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc4NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wNDY0MzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkwNDF9LHsidiI6IlN0ZXAgNzg1LCBkdXJhdGlvbjogMTkuMTQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3ODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTM5NzQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNjAxNX0seyJ2IjoiU3RlcCA3ODYsIGR1cmF0aW9uOiAxOS4yNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc4NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4zNjgwMjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA3NzgyfSx7InYiOiJTdGVwIDc4NywgZHVyYXRpb246IDIyLjQ4IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi4zNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjc2NTMwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDM1MDl9LHsidiI6IlN0ZXAgNzg4LCBkdXJhdGlvbjogMjAuODcgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjc3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3ODkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTAzMzg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNjc3NH0seyJ2IjoiU3RlcCA3ODksIGR1cmF0aW9uOiAyMS4yMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc5MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi40NTk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDU0Nn0seyJ2IjoiU3RlcCA3OTAsIGR1cmF0aW9uOiAxNi41NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc5MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44NDQ1MjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE0MzY0fSx7InYiOiJTdGVwIDc5MSwgZHVyYXRpb246IDE1Ljk2IG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzkyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljk0NTM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzODU0OX0seyJ2IjoiU3RlcCA3OTIsIGR1cmF0aW9uOiAyMC4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc5MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4xODY0MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIwNDg4fSx7InYiOiJTdGVwIDc5MywgZHVyYXRpb246IDE2LjMxIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4xOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzk0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjU2NjAxMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTE0MjJ9LHsidiI6IlN0ZXAgNzk0LCBkdXJhdGlvbjogMTUuNjggbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjU3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3OTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMDAwODI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNDUxNX0seyJ2IjoiU3RlcCA3OTUsIGR1cmF0aW9uOiAxNy4xMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc5NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zNjE2NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE5NzIzfSx7InYiOiJTdGVwIDc5NiwgZHVyYXRpb246IDE3LjQ4IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiNzk3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk1OTA0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzMwNTd9LHsidiI6IlN0ZXAgNzk3LCBkdXJhdGlvbjogMTYuMDkgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljk2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI3OTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNjY0OTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MTIyMX0seyJ2IjoiU3RlcCA3OTgsIGR1cmF0aW9uOiAyMC44MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijc5OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45NDc5NjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ0NDQ0fSx7InYiOiJTdGVwIDc5OSwgZHVyYXRpb246IDE5LjA5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODAwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjMxOTYxMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDc4MzN9LHsidiI6IlN0ZXAgODAwLCBkdXJhdGlvbjogMTkuNDMgbXNcbi1BbGwgb3RoZXJzOiAwLjExIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjMyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNTEyNzkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNzU2OX0seyJ2IjoiU3RlcCA4MDEsIGR1cmF0aW9uOiAyMC42MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41MjQ4Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTIyNzI2fSx7InYiOiJTdGVwIDgwMiwgZHVyYXRpb246IDE5LjY1IG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljg4MzgxM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTQ1Mn0seyJ2IjoiU3RlcCA4MDMsIGR1cmF0aW9uOiAyMC4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuODggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4zMjkyNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjQ4MDd9LHsidiI6IlN0ZXAgODA0LCBkdXJhdGlvbjogMTcuNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjMzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODA3NTM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExMjc1M30seyJ2IjoiU3RlcCA4MDUsIGR1cmF0aW9uOiAxNy45MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgwNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC40OTE4OTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI1MTgyfSx7InYiOiJTdGVwIDgwNiwgZHVyYXRpb246IDE0LjYyIG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC40OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODA3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjcxMjIyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzA4NX0seyJ2IjoiU3RlcCA4MDcsIGR1cmF0aW9uOiAyMC44NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgwOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS40NzMzNDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjQ4OTYyfSx7InYiOiJTdGVwIDgwOCwgZHVyYXRpb246IDIxLjcyIG1zXG4tQWxsIG90aGVyczogMC4yNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS40NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODA5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjA2NDkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNjE1M30seyJ2IjoiU3RlcCA4MDksIGR1cmF0aW9uOiAyMS4yMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgxMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4xMjQyNzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA0Mjc4fSx7InYiOiJTdGVwIDgxMCwgZHVyYXRpb246IDIyLjIzIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODExIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIzLjA4ODk4OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODE3NjN9LHsidiI6IlN0ZXAgODExLCBkdXJhdGlvbjogMjMuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIzLjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNzc5MTk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2NDc4OX0seyJ2IjoiU3RlcCA4MTIsIGR1cmF0aW9uOiAyMC45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNzggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi40NTk0NDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjkyOTQzfSx7InYiOiJTdGVwIDgxMywgZHVyYXRpb246IDIyLjc1IG1zXG4tQWxsIG90aGVyczogMC4yOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi40NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODE0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjU0MjY3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xOTcxNjV9LHsidiI6IlN0ZXAgODE0LCBkdXJhdGlvbjogMjAuNzQgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjU0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMDE5NDUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwMDQyNH0seyJ2IjoiU3RlcCA4MTUsIGR1cmF0aW9uOiAyMi4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgxNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wNjU1NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTczMjkxfSx7InYiOiJTdGVwIDgxNiwgZHVyYXRpb246IDE5LjI0IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4wNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODE3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjQ4MzQ3Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTYyNjF9LHsidiI6IlN0ZXAgODE3LCBkdXJhdGlvbjogMTYuNjQgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjQ4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMjcxODU2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI0NjQ2Nn0seyJ2IjoiU3RlcCA4MTgsIGR1cmF0aW9uOiAyMi41MiBtc1xuLUFsbCBvdGhlcnM6IDAuMjUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMjcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgxOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xOTkyNDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTYwMjg1fSx7InYiOiJTdGVwIDgxOSwgZHVyYXRpb246IDIwLjM2IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4yMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljk0ODYyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDI3M30seyJ2IjoiU3RlcCA4MjAsIGR1cmF0aW9uOiAxOS4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgyMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40NjAyMjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMzMTc5fSx7InYiOiJTdGVwIDgyMSwgZHVyYXRpb246IDE5LjU5IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS40NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODIyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjMxMjc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0Nzc4OX0seyJ2IjoiU3RlcCA4MjIsIGR1cmF0aW9uOiAyMC40NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44NzA3OTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUwMTcxfSx7InYiOiJTdGVwIDgyMywgZHVyYXRpb246IDIwLjAyIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODI0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjUzODQ3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjAwMDZ9LHsidiI6IlN0ZXAgODI0LCBkdXJhdGlvbjogMTguNzAgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjU0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyMTAzMn0seyJ2IjoiU3RlcCA4MjUsIGR1cmF0aW9uOiAxOS43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi42OTI1NDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTYxNzM5fSx7InYiOiJTdGVwIDgyNiwgZHVyYXRpb246IDIyLjg1IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODI3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjU1OTE3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjExMTN9LHsidiI6IlN0ZXAgODI3LCBkdXJhdGlvbjogMjAuNzIgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjU2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMzAxMTQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5NjQ1OH0seyJ2IjoiU3RlcCA4MjgsIGR1cmF0aW9uOiAyMS41MCBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgyOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4zMDk5MDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk0NzQzfSx7InYiOiJTdGVwIDgyOSwgZHVyYXRpb246IDIxLjUwIG1zXG4tQWxsIG90aGVyczogMC4xOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODMwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjYxNTgzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzg0Mjh9LHsidiI6IlN0ZXAgODMwLCBkdXJhdGlvbjogMjAuNzUgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjYyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTk3NTU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NTY5Mn0seyJ2IjoiU3RlcCA4MzEsIGR1cmF0aW9uOiAyMS4zNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4wODc1MDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQzODN9LHsidiI6IlN0ZXAgODMyLCBkdXJhdGlvbjogMjIuMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNTYyMzYyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MTQ0NH0seyJ2IjoiU3RlcCA4MzMsIGR1cmF0aW9uOiAxOC43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgzNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45NTQ1MjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM5MTY4fSx7InYiOiJTdGVwIDgzNCwgZHVyYXRpb246IDE5LjA5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODM1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjA0MjA3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjc3NDR9LHsidiI6IlN0ZXAgODM1LCBkdXJhdGlvbjogMjAuMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjA0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjguNzM3MzMxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjQ3NDU2N30seyJ2IjoiU3RlcCA4MzYsIGR1cmF0aW9uOiAyOS4yMSBtc1xuLUFsbCBvdGhlcnM6IDAuNDcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjguNzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgzNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS45NTAyMzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMzMzV9LHsidiI6IlN0ZXAgODM3LCBkdXJhdGlvbjogMjIuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjk1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4MzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMDQ3NzIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIxMjgxN30seyJ2IjoiU3RlcCA4MzgsIGR1cmF0aW9uOiAxOC4yNiBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjgzOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS41MTU0NTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI4ODM1fSx7InYiOiJTdGVwIDgzOSwgZHVyYXRpb246IDE1LjY0IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS41MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODQwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjYzNzY3NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjg5NTF9LHsidiI6IlN0ZXAgODQwLCBkdXJhdGlvbjogMTcuNzcgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjY0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNjU0NzEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMjQ0OH0seyJ2IjoiU3RlcCA4NDEsIGR1cmF0aW9uOiAxOS43OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg0MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xNTQzNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUzMjI3fSx7InYiOiJTdGVwIDg0MiwgZHVyYXRpb246IDIwLjMxIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODQzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM1NjQ2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTY0NDh9LHsidiI6IlN0ZXAgODQzLCBkdXJhdGlvbjogMTguNTEgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMzg3NDE1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2MTI1NX0seyJ2IjoiU3RlcCA4NDQsIGR1cmF0aW9uOiAxOS41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS42MTU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMDMwMn0seyJ2IjoiU3RlcCA4NDUsIGR1cmF0aW9uOiAxOS43NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg0NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4yMDY2NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQxOTk2fSx7InYiOiJTdGVwIDg0NiwgZHVyYXRpb246IDIyLjM1IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi4yMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODQ3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjAxMzA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2OTkyfSx7InYiOiJTdGVwIDg0NywgZHVyYXRpb246IDIxLjE4IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4wMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODQ4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjMxNTk5MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzU3Njd9LHsidiI6IlN0ZXAgODQ4LCBkdXJhdGlvbjogMjIuNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjMyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNDY2MjQ5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NTExNX0seyJ2IjoiU3RlcCA4NDksIGR1cmF0aW9uOiAxOC42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4Ljc4MDk3Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDM3NDJ9LHsidiI6IlN0ZXAgODUwLCBkdXJhdGlvbjogOC45MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC43OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuNTI2MjE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIzNzA4NH0seyJ2IjoiU3RlcCA4NTEsIGR1cmF0aW9uOiAzLjc2IG1zXG4tQWxsIG90aGVyczogMC4yNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi43MDM3NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk1NjIxfSx7InYiOiJTdGVwIDg1MiwgZHVyYXRpb246IDIuOTAgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIuNzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4Ljc2ODE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI5MzQzMn0seyJ2IjoiU3RlcCA4NTMsIGR1cmF0aW9uOiA5LjA2IG1zXG4tQWxsIG90aGVyczogMC4yOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA4Ljc3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My40OTEyNzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjYyMDY5fSx7InYiOiJTdGVwIDg1NCwgZHVyYXRpb246IDMuNzUgbXNcbi1BbGwgb3RoZXJzOiAwLjI2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuNDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg1NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC4zNzMzMDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ0MTA5fSx7InYiOiJTdGVwIDg1NSwgZHVyYXRpb246IDEwLjUyIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC4zNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODU2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjI3NzM0OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTE0Mzl9LHsidiI6IlN0ZXAgODU2LCBkdXJhdGlvbjogMTEuNDMgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjI4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuMTk0NjQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMjQxNX0seyJ2IjoiU3RlcCA4NTcsIGR1cmF0aW9uOiAxMS4zMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuMTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg1OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC4yMjI2NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ4MDAxfSx7InYiOiJTdGVwIDg1OCwgZHVyYXRpb246IDEwLjM3IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC4yMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODU5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjUzMjk3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTM2MjR9LHsidiI6IlN0ZXAgODU5LCBkdXJhdGlvbjogMTEuNjkgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMDI3ODQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NzUxNX0seyJ2IjoiU3RlcCA4NjAsIGR1cmF0aW9uOiAxMC4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg2MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC42ODM1Mjh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU5MzQ4fSx7InYiOiJTdGVwIDg2MSwgZHVyYXRpb246IDEwLjg0IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODYyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjk3MDIyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xOTc3ODR9LHsidiI6IlN0ZXAgODYyLCBkdXJhdGlvbjogMTIuMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMDE5NTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQzNzk0fSx7InYiOiJTdGVwIDg2MywgZHVyYXRpb246IDEwLjE2IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC4wMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjAxOTgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5NzY1OX0seyJ2IjoiU3RlcCA4NjQsIGR1cmF0aW9uOiAxMi4yMiBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC45OTgxMTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjEzMDIyfSx7InYiOiJTdGVwIDg2NSwgZHVyYXRpb246IDExLjIxIG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODY2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEwLjYxNTg5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zMTE4Njl9LHsidiI6IlN0ZXAgODY2LCBkdXJhdGlvbjogMTAuOTMgbXNcbi1BbGwgb3RoZXJzOiAwLjMxIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEwLjYyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuNjU1ODA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI2ODQ4MX0seyJ2IjoiU3RlcCA4NjcsIGR1cmF0aW9uOiAxMC45MiBtc1xuLUFsbCBvdGhlcnM6IDAuMjcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMS4wNTcyMTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM4OTEzfSx7InYiOiJTdGVwIDg2OCwgZHVyYXRpb246IDExLjIwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjE4NTY3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wNzUxOTl9LHsidiI6IlN0ZXAgODY5LCBkdXJhdGlvbjogMTEuMjYgbXNcbi1BbGwgb3RoZXJzOiAwLjA4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuNDk3OTk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyMTkyNn0seyJ2IjoiU3RlcCA4NzAsIGR1cmF0aW9uOiAxMC42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg3MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5Ljk3NzYwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDM5Nn0seyJ2IjoiU3RlcCA4NzEsIGR1cmF0aW9uOiAxMC4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS45OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODcyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjU1OTM1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjkxNDd9LHsidiI6IlN0ZXAgODcyLCBkdXJhdGlvbjogMTEuNzMgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjU2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuMzYxMjA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMzc0OX0seyJ2IjoiU3RlcCA4NzMsIGR1cmF0aW9uOiAxMi40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuMzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg3NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC41Mjc0Njd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNjYwMzA4fSx7InYiOiJTdGVwIDg3NCwgZHVyYXRpb246IDE3LjE5IG1zXG4tQWxsIG90aGVyczogMi42NiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC41MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODc1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjk1MjI4OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjk0NDJ9LHsidiI6IlN0ZXAgODc1LCBkdXJhdGlvbjogMTIuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjk1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuODk3OTQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NTM2fSx7InYiOiJTdGVwIDg3NiwgZHVyYXRpb246IDEyLjA0IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODc3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjA3MzA1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODI3OTJ9LHsidiI6IlN0ZXAgODc3LCBkdXJhdGlvbjogMTQuMjYgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4NzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMzM3ODg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MzUzNX0seyJ2IjoiU3RlcCA4NzgsIGR1cmF0aW9uOiAxNi41MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg3OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41MTg0NzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcyMjk0fSx7InYiOiJTdGVwIDg3OSwgZHVyYXRpb246IDE5LjY5IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODgwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjUxODYzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzgwMTR9LHsidiI6IlN0ZXAgODgwLCBkdXJhdGlvbjogMTkuNzAgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjUyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4ODEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuNTI1NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTYxfSx7InYiOiJTdGVwIDg4MSwgZHVyYXRpb246IDIxLjY5IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS41MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjk0MDIwNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzAwMDJ9LHsidiI6IlN0ZXAgODgyLCBkdXJhdGlvbjogMjIuMTEgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjk0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4ODMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODkwMjM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3OTI0OX0seyJ2IjoiU3RlcCA4ODMsIGR1cmF0aW9uOiAxOS4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguODkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg4NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi43NzA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MTc3Nn0seyJ2IjoiU3RlcCA4ODQsIGR1cmF0aW9uOiAxNi45MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg4NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4yMzA1NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQzNjA2fSx7InYiOiJTdGVwIDg4NSwgZHVyYXRpb246IDE3LjM3IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4yMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODg2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjA3Nzg0MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTU2MTZ9LHsidiI6IlN0ZXAgODg2LCBkdXJhdGlvbjogMTguMjMgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4ODcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNTU5OTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5Mzc5OX0seyJ2IjoiU3RlcCA4ODcsIGR1cmF0aW9uOiAyMC43NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg4OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4yOTM1ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcxNjZ9LHsidiI6IlN0ZXAgODg4LCBkdXJhdGlvbjogMTkuNDcgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4ODkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMTYwMDE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIxMDUwM30seyJ2IjoiU3RlcCA4ODksIGR1cmF0aW9uOiAyMi4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg5MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS45MTI2NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE4MDA3fSx7InYiOiJTdGVwIDg5MCwgZHVyYXRpb246IDIyLjAzIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS45MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODkxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjM2Mzg3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDc3Mn0seyJ2IjoiU3RlcCA4OTEsIGR1cmF0aW9uOiAyMS41MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS43NTg4MjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI5NzQxfSx7InYiOiJTdGVwIDg5MiwgZHVyYXRpb246IDE1Ljg5IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjg1MzM1Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTc0NjR9LHsidiI6IlN0ZXAgODkzLCBkdXJhdGlvbjogMTEuOTcgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjg1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4OTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNzYzMTc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEwNzA0OX0seyJ2IjoiU3RlcCA4OTQsIGR1cmF0aW9uOiAxNS44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xODIxOTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU4Nzk0fSx7InYiOiJTdGVwIDg5NSwgZHVyYXRpb246IDE3LjM0IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiODk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0Ljc5MTA5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjg1NDV9LHsidiI6IlN0ZXAgODk2LCBkdXJhdGlvbjogMTQuOTIgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljc5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4OTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTA1MzY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2NDYzMX0seyJ2IjoiU3RlcCA4OTcsIGR1cmF0aW9uOiAxNS42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijg5OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44NTYyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODkwNDV9LHsidiI6IlN0ZXAgODk4LCBkdXJhdGlvbjogMTYuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljg2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI4OTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNzAyMDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQxMDc3fSx7InYiOiJTdGVwIDg5OSwgZHVyYXRpb246IDE4Ljg0IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC43MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTAwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjY1NTAwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjEzMjl9LHsidiI6IlN0ZXAgOTAwLCBkdXJhdGlvbjogMTkuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuODk3NDM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4NDAxNn0seyJ2IjoiU3RlcCA5MDEsIGR1cmF0aW9uOiAxNy45OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS41NDM0NTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ0Nzk0fSx7InYiOiJTdGVwIDkwMiwgZHVyYXRpb246IDIxLjY5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjE3NTgyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTA3NTd9LHsidiI6IlN0ZXAgOTAzLCBkdXJhdGlvbjogMjEuMzMgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MDQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjU4ODYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NzE2NH0seyJ2IjoiU3RlcCA5MDQsIGR1cmF0aW9uOiAxOS40MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkwNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS44OTY4MjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU3NDg3fSx7InYiOiJTdGVwIDkwNSwgZHVyYXRpb246IDE2LjA1IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTA2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjcyNjM1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzM4OTR9LHsidiI6IlN0ZXAgOTA2LCBkdXJhdGlvbjogMTcuODYgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjczIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MDcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuODQyMjY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NTM4NX0seyJ2IjoiU3RlcCA5MDcsIGR1cmF0aW9uOiAxNi45OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuODQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkwOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC40MjIyMTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI3NjM1fSx7InYiOiJTdGVwIDkwOCwgZHVyYXRpb246IDIwLjU1IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTA5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA4MDk0MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDEzMTl9LHsidiI6IlN0ZXAgOTA5LCBkdXJhdGlvbjogMTcuMjIgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjA4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuODIyMzg5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNTI4Nn0seyJ2IjoiU3RlcCA5MTAsIGR1cmF0aW9uOiAxMy45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkxMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy44MzE3NjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ3MTg2fSx7InYiOiJTdGVwIDkxMSwgZHVyYXRpb246IDEzLjk4IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTEyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjM2MDU5OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTE4ODZ9LHsidiI6IlN0ZXAgOTEyLCBkdXJhdGlvbjogMTUuNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjM2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MTMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMjI2NDE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MjAxOH0seyJ2IjoiU3RlcCA5MTMsIGR1cmF0aW9uOiAxNS4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkxNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi4yNTMyODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQxNzgyfSx7InYiOiJTdGVwIDkxNCwgZHVyYXRpb246IDE2LjQwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4yNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTE1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjEyMzMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTIyMjJ9LHsidiI6IlN0ZXAgOTE1LCBkdXJhdGlvbjogMTYuMjggbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjEyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNzU5OTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI0MTN9LHsidiI6IlN0ZXAgOTE2LCBkdXJhdGlvbjogMTMuODggbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjc2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMDA0NzAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1ODYxNX0seyJ2IjoiU3RlcCA5MTcsIGR1cmF0aW9uOiAxNC4xNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkxOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC4xMjMxMTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTgxNzIyfSx7InYiOiJTdGVwIDkxOCwgZHVyYXRpb246IDE0LjMwIG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTE5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjA0MjQyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzc4Mjh9LHsidiI6IlN0ZXAgOTE5LCBkdXJhdGlvbjogMTQuMTggbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjA0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNDg2OTYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4NjI5N30seyJ2IjoiU3RlcCA5MjAsIGR1cmF0aW9uOiAxNy42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkyMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xMzU1MTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDg2MjQ5fSx7InYiOiJTdGVwIDkyMSwgZHVyYXRpb246IDE3LjIyIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTIyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljk3NTY1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTM1MzN9LHsidiI6IlN0ZXAgOTIyLCBkdXJhdGlvbjogMTguMDcgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMDU5Njk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyODE5NH0seyJ2IjoiU3RlcCA5MjMsIGR1cmF0aW9uOiAxOS4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkyNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy41MDM4MjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcxOTczfSx7InYiOiJTdGVwIDkyNCwgZHVyYXRpb246IDEzLjY4IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTI1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjY3NTAyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjQwNjV9LHsidiI6IlN0ZXAgOTI1LCBkdXJhdGlvbjogMTUuODQgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuMTc0ODEyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NDI0N30seyJ2IjoiU3RlcCA5MjYsIGR1cmF0aW9uOiAxNC4zMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuMTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkyNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC4zOTIxNDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTYzNTY2fSx7InYiOiJTdGVwIDkyNywgZHVyYXRpb246IDE0LjU2IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4zOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTI4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjM0NDE1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzEwMTR9LHsidiI6IlN0ZXAgOTI4LCBkdXJhdGlvbjogMTQuNDggbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0LjM0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuODAzNzE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzODI1OH0seyJ2IjoiU3RlcCA5MjksIGR1cmF0aW9uOiAxNC45NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTQuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkzMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi41MjkzMzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTA0Mzl9LHsidiI6IlN0ZXAgOTMwLCBkdXJhdGlvbjogMTYuNjMgbXNcbi1BbGwgb3RoZXJzOiAwLjEwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMTQ5NTg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExOTMwMn0seyJ2IjoiU3RlcCA5MzEsIGR1cmF0aW9uOiAxNS4yNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4wNjA1OTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU4Mjg2fSx7InYiOiJTdGVwIDkzMiwgZHVyYXRpb246IDE1LjIyIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4wNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk1NDkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MTAzMn0seyJ2IjoiU3RlcCA5MzMsIGR1cmF0aW9uOiAxNi4xMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuOTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkzNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43ODAyMzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTc5OTIzfSx7InYiOiJTdGVwIDkzNCwgZHVyYXRpb246IDE3Ljk2IG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTM1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjcwMzkyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDM0Nzd9LHsidiI6IlN0ZXAgOTM1LCBkdXJhdGlvbjogMTYuOTEgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjcwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNzU2Mzc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1ODUwM30seyJ2IjoiU3RlcCA5MzYsIGR1cmF0aW9uOiAxOC45MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNzYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjkzNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC44NDU1MzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk2NTUyfSx7InYiOiJTdGVwIDkzNywgZHVyYXRpb246IDE5LjA0IG1zXG4tQWxsIG90aGVyczogMC4yMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC44NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTM4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE4ODEyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjE2MzN9LHsidiI6IlN0ZXAgOTM4LCBkdXJhdGlvbjogMTkuMzUgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5MzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNzAxOTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMwNDh9LHsidiI6IlN0ZXAgOTM5LCBkdXJhdGlvbjogMjAuODMgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjcwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuNzY5NzAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4MTc2OH0seyJ2IjoiU3RlcCA5NDAsIGR1cmF0aW9uOiAyMi45NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk0MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4wMDAwNTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY3NzM5fSx7InYiOiJTdGVwIDk0MSwgZHVyYXRpb246IDIxLjE3IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4wMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTQyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjE4MTY0OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzI3NTl9LHsidiI6IlN0ZXAgOTQyLCBkdXJhdGlvbjogMTguMzUgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTI3ODkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0Nzk5fSx7InYiOiJTdGVwIDk0MywgZHVyYXRpb246IDIxLjI4IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4xMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTQ0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjEwODQ2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yODk2NjN9LHsidiI6IlN0ZXAgOTQ0LCBkdXJhdGlvbjogMjIuNDAgbXNcbi1BbGwgb3RoZXJzOiAwLjI5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjExIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuNDcxNzM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2ODk1Mn0seyJ2IjoiU3RlcCA5NDUsIGR1cmF0aW9uOiAyMi42NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk0NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41NDI0Mzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjUxNjI4fSx7InYiOiJTdGVwIDk0NiwgZHVyYXRpb246IDE5Ljc5IG1zXG4tQWxsIG90aGVyczogMC4yNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTQ3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjIzMDY3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yNzkzOTZ9LHsidiI6IlN0ZXAgOTQ3LCBkdXJhdGlvbjogMTkuNTEgbXNcbi1BbGwgb3RoZXJzOiAwLjI4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjIzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzE3MDgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5MzExM30seyJ2IjoiU3RlcCA5NDgsIGR1cmF0aW9uOiAxOC41MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk0OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC42NTU1Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTA2ODJ9LHsidiI6IlN0ZXAgOTQ5LCBkdXJhdGlvbjogMjAuODEgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMzE4Mjk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MzIxOH0seyJ2IjoiU3RlcCA5NTAsIGR1cmF0aW9uOiAyMi40NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk1MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xMjg1NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcxMjQ4fSx7InYiOiJTdGVwIDk1MSwgZHVyYXRpb246IDE3LjMwIG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4xMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTUyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjgxNzE5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDY3ODZ9LHsidiI6IlN0ZXAgOTUyLCBkdXJhdGlvbjogMTcuOTYgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NTMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuOTE0NDM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzODg0OX0seyJ2IjoiU3RlcCA5NTMsIGR1cmF0aW9uOiAyMS4wNSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk1NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS41MzQ0NTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjIwNzd9LHsidiI6IlN0ZXAgOTU0LCBkdXJhdGlvbjogMjEuNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjIyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjUzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMzk2Nzk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIxNDI3Mn0seyJ2IjoiU3RlcCA5NTUsIGR1cmF0aW9uOiAyMi42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuNDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS45NTg0MDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjYzMjc0fSx7InYiOiJTdGVwIDk1NiwgZHVyYXRpb246IDIyLjIyIG1zXG4tQWxsIG90aGVyczogMC4yNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS45NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTU3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjY4MTc4N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xOTM0Nzl9LHsidiI6IlN0ZXAgOTU3LCBkdXJhdGlvbjogMjAuODggbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjY4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuMjgxNTA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMDE5N30seyJ2IjoiU3RlcCA5NTgsIGR1cmF0aW9uOiAyMi40MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMjggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4wNTMyMTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMzMzMDYxfSx7InYiOiJTdGVwIDk1OSwgZHVyYXRpb246IDIyLjM5IG1zXG4tQWxsIG90aGVyczogMC4zMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTYwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjkxNzQ1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODY5ODR9LHsidiI6IlN0ZXAgOTYwLCBkdXJhdGlvbjogMjIuMTAgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjMuMzE5ODc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MDExMX0seyJ2IjoiU3RlcCA5NjEsIGR1cmF0aW9uOiAyMy40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xMzk1NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQzNzU1fSx7InYiOiJTdGVwIDk2MiwgZHVyYXRpb246IDE5LjI4IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4xNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTYzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjQ1MjA0Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDc2OTN9LHsidiI6IlN0ZXAgOTYzLCBkdXJhdGlvbjogMTYuNjAgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjQ1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjIuNjE4NTY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNzk1Mn0seyJ2IjoiU3RlcCA5NjQsIGR1cmF0aW9uOiAyMi43NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuNjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC43NjY0MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTcyNTU3fSx7InYiOiJTdGVwIDk2NSwgZHVyYXRpb246IDE4Ljk0IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC43NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTY2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljk3MTczNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDc4MDF9LHsidiI6IlN0ZXAgOTY2LCBkdXJhdGlvbjogMjAuMTIgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuODExNjAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NTM1M30seyJ2IjoiU3RlcCA5NjcsIGR1cmF0aW9uOiAyMC45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuODEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyNC42MDA1Mzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI3NDY3fSx7InYiOiJTdGVwIDk2OCwgZHVyYXRpb246IDI0LjczIG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNC42MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjIwODAxM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDA3MDR9LHsidiI6IlN0ZXAgOTY5LCBkdXJhdGlvbjogMjAuMzUgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjIxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODcxNjQxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwMjk2M30seyJ2IjoiU3RlcCA5NzAsIGR1cmF0aW9uOiAxOS4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguODcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk3MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42NTMzMzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQwNDUzfSx7InYiOiJTdGVwIDk3MSwgZHVyYXRpb246IDE4Ljc5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTcyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuMjY4OTQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NjIyfSx7InYiOiJTdGVwIDk3MiwgZHVyYXRpb246IDkuNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDkuMjcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk3MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjkzODI2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjAxOX0seyJ2IjoiU3RlcCA5NzMsIGR1cmF0aW9uOiA0LjEwIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjk0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi43OTg4Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjMzNjk5fSx7InYiOiJTdGVwIDk3NCwgZHVyYXRpb246IDMuMDMgbXNcbi1BbGwgb3RoZXJzOiAwLjIzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk3NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjgyNzM3N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDg5MzN9LHsidiI6IlN0ZXAgOTc1LCBkdXJhdGlvbjogOS4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC44MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTc2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMjM0MDM1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIzODE0Nn0seyJ2IjoiU3RlcCA5NzYsIGR1cmF0aW9uOiAzLjQ3IG1zXG4tQWxsIG90aGVyczogMC4yNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAzLjIzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuNzE3NDExfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2NDA5fSx7InYiOiJTdGVwIDk3NywgZHVyYXRpb246IDExLjg4IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS43MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTc4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjM0MTEyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjY1OTJ9LHsidiI6IlN0ZXAgOTc4LCBkdXJhdGlvbjogMTIuNTEgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjM0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5NzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuNjM4NTI0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1Njg2fSx7InYiOiJTdGVwIDk3OSwgZHVyYXRpb246IDExLjgwIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTgwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjY1MjI2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yNzE1MzZ9LHsidiI6IlN0ZXAgOTgwLCBkdXJhdGlvbjogMTEuOTIgbXNcbi1BbGwgb3RoZXJzOiAwLjI3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjY1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5ODEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuNjM5MzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTc0MDc2fSx7InYiOiJTdGVwIDk4MSwgZHVyYXRpb246IDEyLjgxIG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMi42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjA1MDczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjMyMTE1fSx7InYiOiJTdGVwIDk4MiwgZHVyYXRpb246IDExLjM3IG1zXG4tQWxsIG90aGVyczogMC4zMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTgzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjkxNTA5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zNTIwMjV9LHsidiI6IlN0ZXAgOTgzLCBkdXJhdGlvbjogMTIuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjM1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjkyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5ODQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMzM3MDU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NDc4fSx7InYiOiJTdGVwIDk4NCwgZHVyYXRpb246IDEwLjQ5IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC4zNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTg1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjg2NzcxOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzg1NzR9LHsidiI6IlN0ZXAgOTg1LCBkdXJhdGlvbjogMTIuMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5ODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuNzQ5NzM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwNzI4M30seyJ2IjoiU3RlcCA5ODYsIGR1cmF0aW9uOiAxMS45NiBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk4NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yNjg4ODh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ5Mzl9LHsidiI6IlN0ZXAgOTg3LCBkdXJhdGlvbjogMTUuNDIgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5ODgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNDAyMjkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA4MjEyMX0seyJ2IjoiU3RlcCA5ODgsIGR1cmF0aW9uOiAxNS40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk4OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40MTczODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM1MTQ3fSx7InYiOiJTdGVwIDk4OSwgZHVyYXRpb246IDE4LjU1IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTkwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE0NzczM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMjIzNDZ9LHsidiI6IlN0ZXAgOTkwLCBkdXJhdGlvbjogMTkuMzcgbXNcbi1BbGwgb3RoZXJzOiAwLjIyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5OTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMTI3Mjg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5NjMyNn0seyJ2IjoiU3RlcCA5OTEsIGR1cmF0aW9uOiAxOC4zMiBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC43MDU2MTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjExNTgzfSx7InYiOiJTdGVwIDk5MiwgZHVyYXRpb246IDIwLjkyIG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC43MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTkzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjM1MjAzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjU1ODJ9LHsidiI6IlN0ZXAgOTkzLCBkdXJhdGlvbjogMTcuNTIgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5OTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjMuMzk2NDAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2ODYxNn0seyJ2IjoiU3RlcCA5OTQsIGR1cmF0aW9uOiAyMy41NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuNDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk5NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4xMDE3NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY5OTk0fSx7InYiOiJTdGVwIDk5NSwgZHVyYXRpb246IDIxLjI3IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTk2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjMzNDY0Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDMxNH0seyJ2IjoiU3RlcCA5OTYsIGR1cmF0aW9uOiAyMC40OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6Ijk5NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS42OTMyMjl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU2NDA1fSx7InYiOiJTdGVwIDk5NywgZHVyYXRpb246IDE5Ljg1IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiOTk4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjU1MzAwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzM1NTN9LHsidiI6IlN0ZXAgOTk4LCBkdXJhdGlvbjogMjAuNjkgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjU1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiI5OTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMDIyNjk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI4Mzg5MX0seyJ2IjoiU3RlcCA5OTksIGR1cmF0aW9uOiAyMS4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMjggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjMuMTU5ODgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4NDF9LHsidiI6IlN0ZXAgMTAwMCwgZHVyYXRpb246IDIzLjM0IG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMy4xNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAwMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4zMzk0MzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTc5Nzc2fSx7InYiOiJTdGVwIDEwMDEsIGR1cmF0aW9uOiAyMS41MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjkuMDY4MTQyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjEzNzAwN30seyJ2IjoiU3RlcCAxMDAyLCBkdXJhdGlvbjogMzAuMjEgbXNcbi1BbGwgb3RoZXJzOiAxLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDI5LjA3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjg3MjY2OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yNDcyNn0seyJ2IjoiU3RlcCAxMDAzLCBkdXJhdGlvbjogMjIuMTIgbXNcbi1BbGwgb3RoZXJzOiAwLjI1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDA0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIyLjYxNDk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3Mjc0N30seyJ2IjoiU3RlcCAxMDA0LCBkdXJhdGlvbjogMjIuNzkgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIyLjYxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDA1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjg1MDM5MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzM2NjJ9LHsidiI6IlN0ZXAgMTAwNSwgZHVyYXRpb246IDIxLjAyIG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC44NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAwNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMy44MDA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIyOTA2fSx7InYiOiJTdGVwIDEwMDYsIGR1cmF0aW9uOiAyNC4wMyBtc1xuLUFsbCBvdGhlcnM6IDAuMjMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuODAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMDcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuOTc0NzU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0OTQzN30seyJ2IjoiU3RlcCAxMDA3LCBkdXJhdGlvbjogMjIuMTIgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjk3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDA4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI0Ljc1MDcwM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDgyMDN9LHsidiI6IlN0ZXAgMTAwOCwgZHVyYXRpb246IDI0LjkwIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNC43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAwOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS44MTY1NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUwMDk2fSx7InYiOiJTdGVwIDEwMDksIGR1cmF0aW9uOiAyMS45NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTQuODY4NDU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NDY1OH0seyJ2IjoiU3RlcCAxMDEwLCBkdXJhdGlvbjogMTUuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE0Ljg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDExIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjYxODk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4NjA1N30seyJ2IjoiU3RlcCAxMDExLCBkdXJhdGlvbjogMTcuODEgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjYyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDEyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjgwNzgzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTAyNTV9LHsidiI6IlN0ZXAgMTAxMiwgZHVyYXRpb246IDE1Ljk2IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS44MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS44NTI4NjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjEwOTc1fSx7InYiOiJTdGVwIDEwMTMsIGR1cmF0aW9uOiAyMC4wNiBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTEwNzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTczMTYzfSx7InYiOiJTdGVwIDEwMTQsIGR1cmF0aW9uOiAxOC4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuOTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguODk5OTgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4NTQzOX0seyJ2IjoiU3RlcCAxMDE1LCBkdXJhdGlvbjogMTkuMDkgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjkwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDE2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3Ljc0NTI0N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDEzNDZ9LHsidiI6IlN0ZXAgMTAxNiwgZHVyYXRpb246IDE3Ljg5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4yMjY1Mzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMxMjkyfSx7InYiOiJTdGVwIDEwMTcsIGR1cmF0aW9uOiAyMS4zNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuODc0Nzk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NDQwNH0seyJ2IjoiU3RlcCAxMDE4LCBkdXJhdGlvbjogMjAuMDIgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5Ljg3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDE5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjI4NDU4OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zNTA3MjR9LHsidiI6IlN0ZXAgMTAxOSwgZHVyYXRpb246IDIxLjY0IG1zXG4tQWxsIG90aGVyczogMC4zNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4yOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAyMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC40Njk5NDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQyMDI3fSx7InYiOiJTdGVwIDEwMjAsIGR1cmF0aW9uOiAyMC42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuNTEyODEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MDQ2M30seyJ2IjoiU3RlcCAxMDIxLCBkdXJhdGlvbjogMTEuNjggbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDIyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjM5NDU5M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjYzMTJ9LHsidiI6IlN0ZXAgMTAyMiwgZHVyYXRpb246IDEzLjUyIG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy4zOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNC40ODc1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTcxNDN9LHsidiI6IlN0ZXAgMTAyMywgZHVyYXRpb246IDE0LjY0IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC40OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAyNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4zMjQxMzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY4MzE0fSx7InYiOiJTdGVwIDEwMjQsIGR1cmF0aW9uOiAxNS40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMzIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMjUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuNjQ0NjgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MjE2M30seyJ2IjoiU3RlcCAxMDI1LCBkdXJhdGlvbjogMTMuNzkgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjY0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDI2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk2NzYwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDc1MDF9LHsidiI6IlN0ZXAgMTAyNiwgZHVyYXRpb246IDE2LjEyIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAyNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS40NjEwODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTczMTY3fSx7InYiOiJTdGVwIDEwMjcsIGR1cmF0aW9uOiAxNS42MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNDYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMjgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMDkxMzkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MzUyMn0seyJ2IjoiU3RlcCAxMDI4LCBkdXJhdGlvbjogMTYuMjYgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDI5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjI4NzEwNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjQ5NTN9LHsidiI6IlN0ZXAgMTAyOSwgZHVyYXRpb246IDE4LjQxIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAzMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4zMDYwNzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTgzNzY3fSx7InYiOiJTdGVwIDEwMzAsIGR1cmF0aW9uOiAyMS40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTAwNTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQ1NjF9LHsidiI6IlN0ZXAgMTAzMSwgZHVyYXRpb246IDE5LjY1IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAzMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy44NjQ5NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQyOTUxfSx7InYiOiJTdGVwIDEwMzIsIGR1cmF0aW9uOiAxOC4wMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuODYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzM4MTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0Mzg2N30seyJ2IjoiU3RlcCAxMDMzLCBkdXJhdGlvbjogMTcuODggbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljc0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDM0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjQ1MjkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NjAyNX0seyJ2IjoiU3RlcCAxMDM0LCBkdXJhdGlvbjogMTYuNjAgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjQ1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDM1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkxNTYwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDAzNTV9LHsidiI6IlN0ZXAgMTAzNSwgZHVyYXRpb246IDE3LjA2IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTAzNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40MTIxOTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjU3MzM3fSx7InYiOiJTdGVwIDEwMzYsIGR1cmF0aW9uOiAxOC42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMjYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjU1NzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTczMDM4fSx7InYiOiJTdGVwIDEwMzcsIGR1cmF0aW9uOiAxOS40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwMzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTU2MTU0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NjQ0OX0seyJ2IjoiU3RlcCAxMDM4LCBkdXJhdGlvbjogMTkuMzAgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDM5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjkyMDEwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDk0NTJ9LHsidiI6IlN0ZXAgMTAzOSwgZHVyYXRpb246IDE2LjEzIG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA0MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS41OTE3MTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQyNDQ5fSx7InYiOiJTdGVwIDEwNDAsIGR1cmF0aW9uOiAxNS43MyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNTkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNDEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNTY5ODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM4NjE0fSx7InYiOiJTdGVwIDEwNDEsIGR1cmF0aW9uOiAxNy43MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMjA2ODE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4MzM0Nn0seyJ2IjoiU3RlcCAxMDQyLCBkdXJhdGlvbjogMTYuMzkgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjIxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDQzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjQ1MDYzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDE4NzJ9LHsidiI6IlN0ZXAgMTA0MywgZHVyYXRpb246IDE5LjU5IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS40NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA0NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yNDA5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzAwNDZ9LHsidiI6IlN0ZXAgMTA0NCwgZHVyYXRpb246IDE4LjQxIG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4yNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA0NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS45MjYwNDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQxMDUzfSx7InYiOiJTdGVwIDEwNDUsIGR1cmF0aW9uOiAyMC4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuOTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTY0Mjk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNzI5N30seyJ2IjoiU3RlcCAxMDQ2LCBkdXJhdGlvbjogMTUuNzAgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjU2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDQ3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjM0MTQ0Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC45NTEwODV9LHsidiI6IlN0ZXAgMTA0NywgZHVyYXRpb246IDE3LjI5IG1zXG4tQWxsIG90aGVyczogMC45NSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zNCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA0OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC44MTUwMDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMzY4MjEzfSx7InYiOiJTdGVwIDEwNDgsIGR1cmF0aW9uOiAyMS4xOCBtc1xuLUFsbCBvdGhlcnM6IDAuMzcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuODIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguNjg3NTI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNTY0M30seyJ2IjoiU3RlcCAxMDQ5LCBkdXJhdGlvbjogMTguODIgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjY5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDUwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjE5MjU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MjE0M30seyJ2IjoiU3RlcCAxMDUwLCBkdXJhdGlvbjogMTkuMzMgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDUxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjMxMDM5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTgwNjJ9LHsidiI6IlN0ZXAgMTA1MSwgZHVyYXRpb246IDE3LjQ3IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA1MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS43NDcxN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzM2ODF9LHsidiI6IlN0ZXAgMTA1MiwgZHVyYXRpb246IDE5Ljg4IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4wMDM5NzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU2OTk3fSx7InYiOiJTdGVwIDEwNTMsIGR1cmF0aW9uOiAyMi4xNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTA4MTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM2NjIxfSx7InYiOiJTdGVwIDEwNTQsIGR1cmF0aW9uOiAxOS42NCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNTUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNTM4NjI3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NjQ2fSx7InYiOiJTdGVwIDEwNTUsIGR1cmF0aW9uOiAxNS42OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuNTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNTYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuOTc4NTA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2OTA4Mn0seyJ2IjoiU3RlcCAxMDU2LCBkdXJhdGlvbjogMTQuMTUgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDU3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjgxODc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4OTY5OH0seyJ2IjoiU3RlcCAxMDU3LCBkdXJhdGlvbjogMTcuMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjgyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDU4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjA1MTI4OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzYyMTR9LHsidiI6IlN0ZXAgMTA1OCwgZHVyYXRpb246IDE3LjIzIG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMy4zOTA5MzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTg2MTYyfSx7InYiOiJTdGVwIDEwNTksIGR1cmF0aW9uOiAyMy41OCBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuMzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuODg5MTg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1ODh9LHsidiI6IlN0ZXAgMTA2MCwgZHVyYXRpb246IDE3LjA1IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi44OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA2MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43MDIyOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzgzNX0seyJ2IjoiU3RlcCAxMDYxLCBkdXJhdGlvbjogMTcuODggbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjcwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDYyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjU0MjQ4NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zMTMzOTR9LHsidiI6IlN0ZXAgMTA2MiwgZHVyYXRpb246IDIxLjg2IG1zXG4tQWxsIG90aGVyczogMC4zMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS41NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA2MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS45MDIxMDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY4NDQ4fSx7InYiOiJTdGVwIDEwNjMsIGR1cmF0aW9uOiAyMi4wNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuOTAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNDIyMjIzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI1OTUzM30seyJ2IjoiU3RlcCAxMDY0LCBkdXJhdGlvbjogMTkuNjggbXNcbi1BbGwgb3RoZXJzOiAwLjI2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjQyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDY1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5Ljc1NTczOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDk3MjJ9LHsidiI6IlN0ZXAgMTA2NSwgZHVyYXRpb246IDE5LjkxIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA2NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy41Njg5Njl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM1Mjc5fSx7InYiOiJTdGVwIDEwNjYsIGR1cmF0aW9uOiAxNy43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMTU2MzUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIxOTU3OH0seyJ2IjoiU3RlcCAxMDY3LCBkdXJhdGlvbjogMTYuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjIyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDY4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY2NDc4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zNDkzN30seyJ2IjoiU3RlcCAxMDY4LCBkdXJhdGlvbjogMTguMDEgbXNcbi1BbGwgb3RoZXJzOiAwLjM1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDY5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjY4NzgzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjgxNDd9LHsidiI6IlN0ZXAgMTA2OSwgZHVyYXRpb246IDE3Ljg2IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy42OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA3MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xNTM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMzg0N30seyJ2IjoiU3RlcCAxMDcwLCBkdXJhdGlvbjogMTkuMjkgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDcxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjU4MjY0N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wODI2MTR9LHsidiI6IlN0ZXAgMTA3MSwgZHVyYXRpb246IDE4LjY3IG1zXG4tQWxsIG90aGVyczogMC4wOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA3MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4wNDc3Njl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkwMjcyfSx7InYiOiJTdGVwIDEwNzIsIGR1cmF0aW9uOiAyMS4yNCBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNzMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMjYzNzMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MDI2MX0seyJ2IjoiU3RlcCAxMDczLCBkdXJhdGlvbjogMTcuNDAgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjI2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDc0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY2MjUzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTY5OTh9LHsidiI6IlN0ZXAgMTA3NCwgZHVyYXRpb246IDE4LjgyIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA3NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xNDM4MTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY2MDM3fSx7InYiOiJTdGVwIDEwNzUsIGR1cmF0aW9uOiAyMC4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNzYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMjIzNTc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4MjkxMn0seyJ2IjoiU3RlcCAxMDc2LCBkdXJhdGlvbjogMTguNDEgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjIyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDc3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjMyMTE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MzJ9LHsidiI6IlN0ZXAgMTA3NywgZHVyYXRpb246IDE5LjQ5IG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4zMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA3OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4yNDQwMTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTMyMDU4fSx7InYiOiJTdGVwIDEwNzgsIGR1cmF0aW9uOiAyMS4zOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMjQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwNzkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjEuMTYwMzM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMTUxNH0seyJ2IjoiU3RlcCAxMDc5LCBkdXJhdGlvbjogMjEuMjkgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIxLjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDgwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjQxNTIxN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDgyMTF9LHsidiI6IlN0ZXAgMTA4MCwgZHVyYXRpb246IDE3LjU2IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy40MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA4MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4xMjE4NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkyODg2fSx7InYiOiJTdGVwIDEwODEsIGR1cmF0aW9uOiAyMC4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMTIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwODIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNTA4MzQxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyMzgxNH0seyJ2IjoiU3RlcCAxMDgyLCBkdXJhdGlvbjogMTkuNjMgbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDgzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIzLjA0MjIzM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMjkzM30seyJ2IjoiU3RlcCAxMDgzLCBkdXJhdGlvbjogMjMuMTcgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIzLjA0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDg0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjkyNzg2NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDI3ODd9LHsidiI6IlN0ZXAgMTA4NCwgZHVyYXRpb246IDE5LjA3IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA4NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4xMjgxOTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM1OTF9LHsidiI6IlN0ZXAgMTA4NSwgZHVyYXRpb246IDE5LjI2IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4xMyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA4NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yMjY4OTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUwMjQxfSx7InYiOiJTdGVwIDEwODYsIGR1cmF0aW9uOiAxOC4zOCBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwODcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTYxNzU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyODk4fSx7InYiOiJTdGVwIDEwODcsIGR1cmF0aW9uOiAxOS4wOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguOTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwODgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuNjYyMDczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExODM2M30seyJ2IjoiU3RlcCAxMDg4LCBkdXJhdGlvbjogMTkuNzggbXNcbi1BbGwgb3RoZXJzOiAwLjEyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjY2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDg5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjM2MTEzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzU4MTd9LHsidiI6IlN0ZXAgMTA4OSwgZHVyYXRpb246IDE2LjUwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi4zNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA5MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi44MDMwNjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk5ODh9LHsidiI6IlN0ZXAgMTA5MCwgZHVyYXRpb246IDE3LjAwIG1zXG4tQWxsIG90aGVyczogMC4yMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA5MSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4zNTE5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wOTI1Nn0seyJ2IjoiU3RlcCAxMDkxLCBkdXJhdGlvbjogMTUuNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjA5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjM1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDkyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1LjMwNzk1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzA2OTJ9LHsidiI6IlN0ZXAgMTA5MiwgZHVyYXRpb246IDE1LjQ0IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS4zMSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA5MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC43Njk3NzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDc5Nzk2fSx7InYiOiJTdGVwIDEwOTMsIGR1cmF0aW9uOiAxOC44NSBtc1xuLUFsbCBvdGhlcnM6IDAuMDggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNzcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwOTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS42MTc4MDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDkzNjI4fSx7InYiOiJTdGVwIDEwOTQsIGR1cmF0aW9uOiA5LjcxIG1zXG4tQWxsIG90aGVyczogMC4wOSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjYyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDk1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMzQ1MTQyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwMzk5Mn0seyJ2IjoiU3RlcCAxMDk1LCBkdXJhdGlvbjogMy41NSBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy4zNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA5NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjYyOTQyNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xOTE1Mjh9LHsidiI6IlN0ZXAgMTA5NiwgZHVyYXRpb246IDIuODIgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIuNjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEwOTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OC4yMzE2OTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjIwMTE0fSx7InYiOiJTdGVwIDEwOTcsIGR1cmF0aW9uOiA4LjQ1IG1zXG4tQWxsIG90aGVyczogMC4yMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA4LjIzIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMDk4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMTUwNDU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwNjY1MX0seyJ2IjoiU3RlcCAxMDk4LCBkdXJhdGlvbjogMy4zNiBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy4xNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTA5OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC41Njg4NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjcxMTM5fSx7InYiOiJTdGVwIDEwOTksIGR1cmF0aW9uOiAxMC44NCBtc1xuLUFsbCBvdGhlcnM6IDAuMjcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNTcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS40NjYyMjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjQ5Mjg4fSx7InYiOiJTdGVwIDExMDAsIGR1cmF0aW9uOiA5LjcyIG1zXG4tQWxsIG90aGVyczogMC4yNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjQ3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTAxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNjI4NjQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3ODgwM30seyJ2IjoiU3RlcCAxMTAxLCBkdXJhdGlvbjogOS44MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS42MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEwMiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMS44NDA4MTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk5MDU0fSx7InYiOiJTdGVwIDExMDIsIGR1cmF0aW9uOiAxMi4wNCBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuODQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMDMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuMTg2Mjc1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5OTM1MX0seyJ2IjoiU3RlcCAxMTAzLCBkdXJhdGlvbjogMTEuMzkgbXNcbi1BbGwgb3RoZXJzOiAwLjIwIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjE5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTA0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEwLjYzNDM0Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4zNDU5MzR9LHsidiI6IlN0ZXAgMTEwNCwgZHVyYXRpb246IDEwLjk4IG1zXG4tQWxsIG90aGVyczogMC4zNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMC42MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEwNSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjY5Mjg2N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzE5MDR9LHsidiI6IlN0ZXAgMTEwNSwgZHVyYXRpb246IDkuODYgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDkuNjkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMDYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuNzg5OTgyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjMzNTgwN30seyJ2IjoiU3RlcCAxMTA2LCBkdXJhdGlvbjogMTEuMTMgbXNcbi1BbGwgb3RoZXJzOiAwLjM0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEwLjc5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTA3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNDgyNzg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIyNTQyNH0seyJ2IjoiU3RlcCAxMTA3LCBkdXJhdGlvbjogOS43MSBtc1xuLUFsbCBvdGhlcnM6IDAuMjMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS40OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEwOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC43NTQwODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU4ODEzfSx7InYiOiJTdGVwIDExMDgsIGR1cmF0aW9uOiAxMC45MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMDkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS42MDc4MzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjI3MDg1fSx7InYiOiJTdGVwIDExMDksIGR1cmF0aW9uOiA5LjgzIG1zXG4tQWxsIG90aGVyczogMC4yMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjYxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTEwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNjg0NTQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NjM0Mn0seyJ2IjoiU3RlcCAxMTEwLCBkdXJhdGlvbjogOS44NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS42OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTExMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5Ljc5NDcwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTQwMTN9LHsidiI6IlN0ZXAgMTExMSwgZHVyYXRpb246IDkuOTUgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDkuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMTIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS44NDMyOTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjQwMTc5fSx7InYiOiJTdGVwIDExMTIsIGR1cmF0aW9uOiAxMC4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMjQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS44NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTExMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC45NTg4MDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjEwNzQ0fSx7InYiOiJTdGVwIDExMTMsIGR1cmF0aW9uOiAxMS4xNyBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuOTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuNDY5MzY4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4NDYxNX0seyJ2IjoiU3RlcCAxMTE0LCBkdXJhdGlvbjogMTAuNjUgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEwLjQ3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTE1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjcyNzA4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTcyNTJ9LHsidiI6IlN0ZXAgMTExNSwgZHVyYXRpb246IDExLjg4IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS43MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTExNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy44ODAyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTY1MTd9LHsidiI6IlN0ZXAgMTExNiwgZHVyYXRpb246IDE0LjAwIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy44OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTExNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi44NDg1NjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUzMTg2fSx7InYiOiJTdGVwIDExMTcsIGR1cmF0aW9uOiAxMy4wMCBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMTgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTIuMDA1Mjc5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MTA1N30seyJ2IjoiU3RlcCAxMTE4LCBkdXJhdGlvbjogMTIuMTggbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjAxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTE5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuMzc4MjU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjExNzM1M30seyJ2IjoiU3RlcCAxMTE5LCBkdXJhdGlvbjogOS41MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS4zOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEyMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMS4wOTQwNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDk5MzEyfSx7InYiOiJTdGVwIDExMjAsIGR1cmF0aW9uOiAxMS4xOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTEuMDkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMjEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMTA3MDY4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIxMzg0NX0seyJ2IjoiU3RlcCAxMTIxLCBkdXJhdGlvbjogMTAuMzIgbXNcbi1BbGwgb3RoZXJzOiAwLjIxIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEwLjExIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTIyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjkxNDU0MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMDY4NjR9LHsidiI6IlN0ZXAgMTEyMiwgZHVyYXRpb246IDEyLjEyIG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS45MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEyMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC4yMzA4OTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTQwMDUzfSx7InYiOiJTdGVwIDExMjMsIGR1cmF0aW9uOiAxMC4zNyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuMjMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMjQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS42NjgwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC40MTE5NDF9LHsidiI6IlN0ZXAgMTEyNCwgZHVyYXRpb246IDEwLjA4IG1zXG4tQWxsIG90aGVyczogMC40MSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjY3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTI1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjExLjEwMjQ0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4yMTI0MDR9LHsidiI6IlN0ZXAgMTEyNSwgZHVyYXRpb246IDExLjMxIG1zXG4tQWxsIG90aGVyczogMC4yMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMS4xMCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEyNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC43Mjg4ODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU2MzQ2fSx7InYiOiJTdGVwIDExMjYsIGR1cmF0aW9uOiAxMC44OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMjcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMDQ1NDU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIyMzI5N30seyJ2IjoiU3RlcCAxMTI3LCBkdXJhdGlvbjogMTAuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjIyIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEwLjA1IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTI4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNjQzOTY1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MTc4MX0seyJ2IjoiU3RlcCAxMTI4LCBkdXJhdGlvbjogOS44MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOS42NCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEyOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMC43ODk3NDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY0ODg2fSx7InYiOiJTdGVwIDExMjksIGR1cmF0aW9uOiAxMC45NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuNzkgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMzAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTAuMjA0MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjI1NDExfSx7InYiOiJTdGVwIDExMzAsIGR1cmF0aW9uOiAxMC40MyBtc1xuLUFsbCBvdGhlcnM6IDAuMjMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTAuMjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTEuOTAwODA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NjA1OX0seyJ2IjoiU3RlcCAxMTMxLCBkdXJhdGlvbjogMTIuMDggbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDExLjkwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTMyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEyLjUwNTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MzY4MX0seyJ2IjoiU3RlcCAxMTMyLCBkdXJhdGlvbjogMTIuNjUgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEyLjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTMzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE0LjAxNTQwOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMDI5ODR9LHsidiI6IlN0ZXAgMTEzMywgZHVyYXRpb246IDE0LjEyIG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNC4wMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEzNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMi41OTg4MDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU3MDc0fSx7InYiOiJTdGVwIDExMzQsIGR1cmF0aW9uOiAxMi43NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTIuNjAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMzUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMTgzMzUyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyOX0seyJ2IjoiU3RlcCAxMTM1LCBkdXJhdGlvbjogMjAuMzEgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTM2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjE0NDMyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTE4fSx7InYiOiJTdGVwIDExMzYsIGR1cmF0aW9uOiAyMC4yNiBtc1xuLUFsbCBvdGhlcnM6IDAuMTEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExMzcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuMTM3NjQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMjU1N30seyJ2IjoiU3RlcCAxMTM3LCBkdXJhdGlvbjogMTcuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTM4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjkxNDQ1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDU2OTJ9LHsidiI6IlN0ZXAgMTEzOCwgZHVyYXRpb246IDE0LjA2IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy45MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTEzOSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMy40Njk2MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUzODUyfSx7InYiOiJTdGVwIDExMzksIGR1cmF0aW9uOiAyMy42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjMuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNDAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuNTcwMjU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA3MTEyOX0seyJ2IjoiU3RlcCAxMTQwLCBkdXJhdGlvbjogMTYuNjQgbXNcbi1BbGwgb3RoZXJzOiAwLjA3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjU3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTQxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjUwNjA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEyNjAxNX0seyJ2IjoiU3RlcCAxMTQxLCBkdXJhdGlvbjogMTcuNjMgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjUxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTQyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljc0OTUzNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTczOTd9LHsidiI6IlN0ZXAgMTE0MiwgZHVyYXRpb246IDE4LjkxIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC43NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE0MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC42Mjc1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjA5Nzl9LHsidiI6IlN0ZXAgMTE0MywgZHVyYXRpb246IDE4Ljc5IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE0NCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi45NTkyOTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUyNTQ1fSx7InYiOiJTdGVwIDExNDQsIGR1cmF0aW9uOiAxNy4xMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuOTYgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMzM4MDE3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NTYwOX0seyJ2IjoiU3RlcCAxMTQ1LCBkdXJhdGlvbjogMjAuNTEgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjM0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTQ2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjQ2MTc0M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzA3MTJ9LHsidiI6IlN0ZXAgMTE0NiwgZHVyYXRpb246IDIwLjU5IG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC40NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE0NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy43NTA2MDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU1Mzk5fSx7InYiOiJTdGVwIDExNDcsIGR1cmF0aW9uOiAxNy45MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNzUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzc1NTIxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2NjAzMn0seyJ2IjoiU3RlcCAxMTQ4LCBkdXJhdGlvbjogMTguNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTQ5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4Ljk0OTQwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTE4NDV9LHsidiI6IlN0ZXAgMTE0OSwgZHVyYXRpb246IDE5LjEwIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC45NSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE1MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC4yMTc0MDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTc1NjE5fSx7InYiOiJTdGVwIDExNTAsIGR1cmF0aW9uOiAxOC4zOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguMjIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjk4OTYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NDAzMX0seyJ2IjoiU3RlcCAxMTUxLCBkdXJhdGlvbjogMTkuNDQgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjMwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTUyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjc5MDc5N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDc0OTV9LHsidiI6IlN0ZXAgMTE1MiwgZHVyYXRpb246IDIwLjk0IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC43OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE1MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC40NzU0MTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI4NTA1fSx7InYiOiJTdGVwIDExNTMsIGR1cmF0aW9uOiAxOC42MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTguNDggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMTg0NDIzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzMzQ3NH0seyJ2IjoiU3RlcCAxMTU0LCBkdXJhdGlvbjogMTkuMzIgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjE4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTU1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjM3NTE4OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTkyOTd9LHsidiI6IlN0ZXAgMTE1NSwgZHVyYXRpb246IDE5LjUzIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOS4zOCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE1NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNS4yOTc5MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkzMDMzfSx7InYiOiJTdGVwIDExNTYsIGR1cmF0aW9uOiAxNS40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTUuMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzg3NTI2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MTU0OX0seyJ2IjoiU3RlcCAxMTU3LCBkdXJhdGlvbjogMTguNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTU4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM4OTU0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDE1MTd9LHsidiI6IlN0ZXAgMTE1OCwgZHVyYXRpb246IDE4LjUzIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4zOSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE1OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4wMDY5MjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE1ODYxfSx7InYiOiJTdGVwIDExNTksIGR1cmF0aW9uOiAyMC4xMiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMDEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNjAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNjIxOTc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MTQ4OH0seyJ2IjoiU3RlcCAxMTYwLCBkdXJhdGlvbjogMTcuNzYgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjYyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTYxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2LjkwMTQ2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzg4MTN9LHsidiI6IlN0ZXAgMTE2MSwgZHVyYXRpb246IDE3LjA0IG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi45MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE2MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC41MzI5NTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTYzMzUzfSx7InYiOiJTdGVwIDExNjIsIGR1cmF0aW9uOiAyMC43MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuNTMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNjMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMTM4MjU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE4MDA0MX0seyJ2IjoiU3RlcCAxMTYzLCBkdXJhdGlvbjogMjAuMzIgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjE0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTY0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjUwNjkyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xOTYzOTV9LHsidiI6IlN0ZXAgMTE2NCwgZHVyYXRpb246IDE4LjcwIG1zXG4tQWxsIG90aGVyczogMC4yMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41MSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE2NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi4yMzUxODl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU2ODgxfSx7InYiOiJTdGVwIDExNjUsIGR1cmF0aW9uOiAyMi4zOSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjIuMjQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNjYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTk1OTYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNDI2NX0seyJ2IjoiU3RlcCAxMTY2LCBkdXJhdGlvbjogMTkuMTMgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjAwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTY3In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE2Ljc5NDkyMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzY1Njd9LHsidiI6IlN0ZXAgMTE2NywgZHVyYXRpb246IDE2LjkzIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi43OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE2OCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi40NzA1MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM0MDMzfSx7InYiOiJTdGVwIDExNjgsIGR1cmF0aW9uOiAxNi42MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTYuNDcgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNjkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuNzM1MjIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1Nzk3NH0seyJ2IjoiU3RlcCAxMTY5LCBkdXJhdGlvbjogMTcuODkgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3Ljc0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTcwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjcyNjEyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MzA5fSx7InYiOiJTdGVwIDExNzAsIGR1cmF0aW9uOiAxOS44NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNzMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNzEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTMuODYxNTQyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE2OTUyNn0seyJ2IjoiU3RlcCAxMTcxLCBkdXJhdGlvbjogMTQuMDMgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDEzLjg2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTcyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEzLjkxODQ5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTY1NzZ9LHsidiI6IlN0ZXAgMTE3MiwgZHVyYXRpb246IDE0LjA4IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxMy45MiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE3MyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxMy44NDgzMDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM3OTY4fSx7InYiOiJTdGVwIDExNzMsIGR1cmF0aW9uOiAxMy45OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTMuODUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNzQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuMTcwMjE3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjEzNDk2NX0seyJ2IjoiU3RlcCAxMTc0LCBkdXJhdGlvbjogMTUuMzEgbXNcbi1BbGwgb3RoZXJzOiAwLjEzIG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1LjE3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTc1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE1Ljk4MjU4NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzUxMDh9LHsidiI6IlN0ZXAgMTE3NSwgZHVyYXRpb246IDE2LjEyIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNS45OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE3NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNi42NzQwMTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzMTZ9LHsidiI6IlN0ZXAgMTE3NiwgZHVyYXRpb246IDE2Ljc4IG1zXG4tQWxsIG90aGVyczogMC4xMCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNi42NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE3NyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOC45OTUxNjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTM4ODkxfSx7InYiOiJTdGVwIDExNzcsIGR1cmF0aW9uOiAxOS4xMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExNzgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzk0NTUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE5MDczM30seyJ2IjoiU3RlcCAxMTc4LCBkdXJhdGlvbjogMTguNTkgbXNcbi1BbGwgb3RoZXJzOiAwLjE5IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTc5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjgwMTIwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDg1ODR9LHsidiI6IlN0ZXAgMTE3OSwgZHVyYXRpb246IDE4Ljk1IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC44MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE4MCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4zMzk1MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTUxNDQyfSx7InYiOiJTdGVwIDExODAsIGR1cmF0aW9uOiAxOS40OSBtc1xuLUFsbCBvdGhlcnM6IDAuMTUgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMzQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExODEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguOTgwMjk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1OTg2OX0seyJ2IjoiU3RlcCAxMTgxLCBkdXJhdGlvbjogMTkuMTQgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4Ljk4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTgyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjU0Mzg0MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMzA3fSx7InYiOiJTdGVwIDExODIsIGR1cmF0aW9uOiAxNy42NyBtc1xuLUFsbCBvdGhlcnM6IDAuMTMgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNTQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExODMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTUuNzg2NTkzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MTAxMn0seyJ2IjoiU3RlcCAxMTgzLCBkdXJhdGlvbjogMTUuOTMgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE1Ljc5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTg0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjU3NTE1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDA0MzJ9LHsidiI6IlN0ZXAgMTE4NCwgZHVyYXRpb246IDE3LjcyIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy41OCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE4NSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC4wNDM5MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTY2Njg1fSx7InYiOiJTdGVwIDExODUsIGR1cmF0aW9uOiAyMC4yMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTcgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjAuMDQgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExODYifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjUuMzEyOTY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjc4NDI2fSx7InYiOiJTdGVwIDExODYsIGR1cmF0aW9uOiAyNi4xMCBtc1xuLUFsbCBvdGhlcnM6IDAuNzggbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjUuMzEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExODcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTcuOTExODkyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MDkxNn0seyJ2IjoiU3RlcCAxMTg3LCBkdXJhdGlvbjogMTguMDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE3LjkxIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTg4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjI0Ljc4Nzc0Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTM5NDd9LHsidiI6IlN0ZXAgMTE4OCwgZHVyYXRpb246IDI0LjkwIG1zXG4tQWxsIG90aGVyczogMC4xMSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyNC43OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE4OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozMi42NDcwMjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTAzMzE5fSx7InYiOiJTdGVwIDExODksIGR1cmF0aW9uOiAzMi43NSBtc1xuLUFsbCBvdGhlcnM6IDAuMTAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMzIuNjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExOTAifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMTYxNzE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjI0NDU3N30seyJ2IjoiU3RlcCAxMTkwLCBkdXJhdGlvbjogMjAuNDEgbXNcbi1BbGwgb3RoZXJzOiAwLjI0IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjE2IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTkxIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjA0NTA5Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzYwOTR9LHsidiI6IlN0ZXAgMTE5MSwgZHVyYXRpb246IDIwLjIyIG1zXG4tQWxsIG90aGVyczogMC4xOCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC4wNSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE5MiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy4xNzc1NDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU2Njc5fSx7InYiOiJTdGVwIDExOTIsIGR1cmF0aW9uOiAxNy4zMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuMTggbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExOTMifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMjIzNDk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1ODYzNH0seyJ2IjoiU3RlcCAxMTkzLCBkdXJhdGlvbjogMTYuMzggbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjIyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTk0In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE5LjI4ODE5N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNzY4MX0seyJ2IjoiU3RlcCAxMTk0LCBkdXJhdGlvbjogMTkuNDcgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTk1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE3LjUzMzI2NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTM2Mzl9LHsidiI6IlN0ZXAgMTE5NSwgZHVyYXRpb246IDE3LjY5IG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxNy41MyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE5NiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxNy40NDg5MTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTU4NDE5fSx7InYiOiJTdGVwIDExOTYsIGR1cmF0aW9uOiAxNy42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMTYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTcuNDUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjExOTcifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTkuMjM2MzUyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1OTkyM30seyJ2IjoiU3RlcCAxMTk3LCBkdXJhdGlvbjogMTkuNDAgbXNcbi1BbGwgb3RoZXJzOiAwLjE2IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE5LjI0IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMTk4In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjEyMjk1OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTUyMjV9LHsidiI6IlN0ZXAgMTE5OCwgZHVyYXRpb246IDIxLjI4IG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4xMiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTE5OSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMi41OTQ1Mjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTI4MzJ9LHsidiI6IlN0ZXAgMTE5OSwgZHVyYXRpb246IDIyLjcyIG1zXG4tQWxsIG90aGVyczogMC4xMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMi41OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIwMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMC45NzAxMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTA1MjR9LHsidiI6IlN0ZXAgMTIwMCwgZHVyYXRpb246IDIxLjEyIG1zXG4tQWxsIG90aGVyczogMC4xNSBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC45NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIwMSJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4yNDg5NTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMzYxNjgzfSx7InYiOiJTdGVwIDEyMDEsIGR1cmF0aW9uOiAxOS42MSBtc1xuLUFsbCBvdGhlcnM6IDAuMzYgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMjUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMDIifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuMDg4NjM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3NjkzOX0seyJ2IjoiU3RlcCAxMjAyLCBkdXJhdGlvbjogMjAuMjcgbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjA5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjAzIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjM1NjM5MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNjUzOTh9LHsidiI6IlN0ZXAgMTIwMywgZHVyYXRpb246IDE4LjUyIG1zXG4tQWxsIG90aGVyczogMC4xNyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC4zNiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIwNCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS41NDU3MDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTE1OTEzfSx7InYiOiJTdGVwIDEyMDQsIGR1cmF0aW9uOiAxOS42NiBtc1xuLUFsbCBvdGhlcnM6IDAuMTIgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNTUgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMDUifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzAzMjU2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0NTc1Mn0seyJ2IjoiU3RlcCAxMjA1LCBkdXJhdGlvbjogMTguNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjMwIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjA2In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjY1OTgzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNDMyNTV9LHsidiI6IlN0ZXAgMTIwNiwgZHVyYXRpb246IDE4LjgwIG1zXG4tQWxsIG90aGVyczogMC4xNCBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC42NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIwNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS4wMjgwODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjA5NTg3fSx7InYiOiJTdGVwIDEyMDcsIGR1cmF0aW9uOiAxOS4yNCBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuMDMgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMDgifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MjAuNTk0MzEzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1MDI5OH0seyJ2IjoiU3RlcCAxMjA4LCBkdXJhdGlvbjogMjAuNzQgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDIwLjU5IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjA5In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIwLjc1NjM1NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTYwNDF9LHsidiI6IlN0ZXAgMTIwOSwgZHVyYXRpb246IDIwLjkxIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMC43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxMCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyMS4xMTQ0MTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTkzNTYxfSx7InYiOiJTdGVwIDEyMTAsIGR1cmF0aW9uOiAyMS4zMSBtc1xuLUFsbCBvdGhlcnM6IDAuMTkgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMjEuMTEgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMTEifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTguMzg0Mzg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE1NDA1NH0seyJ2IjoiU3RlcCAxMjExLCBkdXJhdGlvbjogMTguNTQgbXNcbi1BbGwgb3RoZXJzOiAwLjE1IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE4LjM4IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjEyIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIxLjI2OTE4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xNTcxNDN9LHsidiI6IlN0ZXAgMTIxMiwgZHVyYXRpb246IDIxLjQzIG1zXG4tQWxsIG90aGVyczogMC4xNiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAyMS4yNyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxMyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxOS40MjI5MzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMTk1MzUxfSx7InYiOiJTdGVwIDEyMTMsIGR1cmF0aW9uOiAxOS42MiBtc1xuLUFsbCBvdGhlcnM6IDAuMjAgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMTkuNDIgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMTQifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MTYuMjczNDg3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE3MTU0MX0seyJ2IjoiU3RlcCAxMjE0LCBkdXJhdGlvbjogMTYuNDUgbXNcbi1BbGwgb3RoZXJzOiAwLjE3IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDE2LjI3IG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjE1In0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjE4LjUwNDUzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xMTgzOTF9LHsidiI6IlN0ZXAgMTIxNSwgZHVyYXRpb246IDE4LjYyIG1zXG4tQWxsIG90aGVyczogMC4xMiBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiAxOC41MCBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxNiJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4Ljc2MjQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0MDY0MX0seyJ2IjoiU3RlcCAxMjE2LCBkdXJhdGlvbjogOC45MCBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogOC43NiBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxNyJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjg4ODU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjE0Mjg2NX0seyJ2IjoiU3RlcCAxMjE3LCBkdXJhdGlvbjogNC4wMyBtc1xuLUFsbCBvdGhlcnM6IDAuMTQgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy44OSBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX0seyJjIjpbeyJ2IjoiMTIxOCJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjI5OTM2M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4xODI5MjV9LHsidiI6IlN0ZXAgMTIxOCwgZHVyYXRpb246IDMuNDggbXNcbi1BbGwgb3RoZXJzOiAwLjE4IG1zXG4tQ29tcGlsYXRpb246IDAuMDAgbXNcbi1PdXRwdXQ6IDAuMDAgbXNcbi1JbnB1dDogMC4wMCBtc1xuLUtlcm5lbCBsYXVuY2g6IDAuMDAgbXNcbi1Ib3N0IGNvbXB1dGU6IDMuMzAgbXNcbi1EZXZpY2UgdG8gZGV2aWNlOiAwLjAwIG1zXG4tRGV2aWNlIGNvbXB1dGU6IDAuMDAgbXMifV19LHsiYyI6W3sidiI6IjEyMTkifSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS4zMjE5NDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMjI4MjMzfSx7InYiOiJTdGVwIDEyMTksIGR1cmF0aW9uOiA5LjU1IG1zXG4tQWxsIG90aGVyczogMC4yMyBtc1xuLUNvbXBpbGF0aW9uOiAwLjAwIG1zXG4tT3V0cHV0OiAwLjAwIG1zXG4tSW5wdXQ6IDAuMDAgbXNcbi1LZXJuZWwgbGF1bmNoOiAwLjAwIG1zXG4tSG9zdCBjb21wdXRlOiA5LjMyIG1zXG4tRGV2aWNlIHRvIGRldmljZTogMC4wMCBtc1xuLURldmljZSBjb21wdXRlOiAwLjAwIG1zIn1dfSx7ImMiOlt7InYiOiIxMjIwIn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuODc0MTU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjIwNTM0OH0seyJ2IjoiU3RlcCAxMjIwLCBkdXJhdGlvbjogNC4wOCBtc1xuLUFsbCBvdGhlcnM6IDAuMjEgbXNcbi1Db21waWxhdGlvbjogMC4wMCBtc1xuLU91dHB1dDogMC4wMCBtc1xuLUlucHV0OiAwLjAwIG1zXG4tS2VybmVsIGxhdW5jaDogMC4wMCBtc1xuLUhvc3QgY29tcHV0ZTogMy44NyBtc1xuLURldmljZSB0byBkZXZpY2U6IDAuMDAgbXNcbi1EZXZpY2UgY29tcHV0ZTogMC4wMCBtcyJ9XX1dLCJwIjp7ImhhcmR3YXJlX3R5cGUiOiJDUFVfT05MWSIsInN0ZXB0aW1lX21zX2F2ZXJhZ2UiOiIxNy4zIiwic3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9uIjoiNC4wIiwic3RlcHRpbWVfbXNfbWluaW11bSI6IjIuOCIsInN0ZXB0aW1lX21zX21heGltdW0iOiIzNS44IiwiZGV2aWNlX2NvbXB1dGVfdGltZV9tc19hdmciOiIwLjAiLCJkZXZpY2VfY29tcHV0ZV90aW1lX21zX3NkdiI6IjAuMCIsImRldmljZV90b19kZXZpY2VfdGltZV9tc19hdmciOiIwLjAiLCJkZXZpY2VfdG9fZGV2aWNlX3RpbWVfbXNfc2R2IjoiMC4wIiwiaW5mZWVkX3RpbWVfbXNfYXZnIjoiMC4wIiwiaW5mZWVkX3RpbWVfbXNfc2R2IjoiMC4wIiwib3V0ZmVlZF90aW1lX21zX2F2ZyI6IjAuMCIsIm91dGZlZWRfdGltZV9tc19zZHYiOiIwLjAiLCJob3N0X2NvbXB1dGVfdGltZV9tc19hdmciOiIxNy4yIiwiaG9zdF9jb21wdXRlX3RpbWVfbXNfc2R2IjoiNC4wIiwia2VybmVsX2xhdW5jaF90aW1lX21zX2F2ZyI6IjAuMCIsImtlcm5lbF9sYXVuY2hfdGltZV9tc19zZHYiOiIwLjAiLCJjb21waWxlX3RpbWVfbXNfYXZnIjoiMC4wIiwiY29tcGlsZV90aW1lX21zX3NkdiI6IjAuMCIsIm90aGVyX3RpbWVfbXNfYXZnIjoiMC4xIiwib3RoZXJfdGltZV9tc19zZHYiOiIwLjEiLCJzdW1tYXJ5X2NvbmNsdXNpb24iOiJZb3VyIHByb2dyYW0gaXMgTk9UIGlucHV0LWJvdW5kIGJlY2F1c2Ugb25seSAwLjAlIG9mIHRoZSB0b3RhbCBzdGVwIHRpbWUgc2FtcGxlZCBpcyB3YWl0aW5nIGZvciBpbnB1dC4gVGhlcmVmb3JlLCB5b3Ugc2hvdWxkIGZvY3VzIG9uIHJlZHVjaW5nIG90aGVyIHRpbWUuIiwic3VtbWFyeV9uZXh0c3RlcCI6IllvdSBtYXkgc2tpcCB0aGUgcmVzdCBvZiB0aGlzIHBhZ2UuIiwia2VybmVsX2xhdW5jaF9ib3R0bGVuZWNrIjoibm8iLCJrZXJuZWxfbGF1bmNoX3N0YXRlbWVudCI6IiIsImFsbF9vdGhlcl9ib3R0bGVuZWNrIjoibm8iLCJhbGxfb3RoZXJfc3RhdGVtZW50IjoiIn19LHsiY29scyI6W3siaWQiOiJob3N0X2lkIiwibGFiZWwiOiJob3N0X2lkIiwidHlwZSI6InN0cmluZyJ9LHsiaWQiOiJjb21tYW5kX2xpbmUiLCJsYWJlbCI6ImNvbW1hbmRfbGluZSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoic3RhcnRfdGltZSIsImxhYmVsIjoic3RhcnRfdGltZSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoiYm5zX2FkZHJlc3MiLCJsYWJlbCI6ImJuc19hZGRyZXNzIiwidHlwZSI6InN0cmluZyJ9XSwicm93cyI6W10sInAiOnsiaG9zdF9jb3VudCI6IjEiLCJ0YXNrX2NvdW50IjoiMSAobnVtIHRhc2tzIHBlciBob3N0ID0gMS4wKSIsImRldmljZV90eXBlIjoiQ1BVIiwiZGV2aWNlX2NvcmVfY291bnQiOiIwIn19LHsiY29scyI6W3siaWQiOiJ0aXBfdHlwZSIsImxhYmVsIjoidGlwX3R5cGUiLCJ0eXBlIjoic3RyaW5nIn0seyJpZCI6ImxpbmsiLCJsYWJlbCI6ImxpbmsiLCJ0eXBlIjoic3RyaW5nIn1dLCJyb3dzIjpbeyJjIjpbeyJ2IjoiZmFxIn0seyJ2IjoiUmVmZXIgdG8gdGhlIFRGMiBQcm9maWxlciBGQVEifV19LHsiYyI6W3sidiI6Imhvc3QifSx7InYiOiJpbnB1dF9waXBlbGluZV9hbmFseXplciAoZXNwZWNpYWxseSBTZWN0aW9uIDMgZm9yIHRoZSBicmVha2Rvd24gb2YgaW5wdXQgb3BlcmF0aW9ucyBvbiB0aGUgSG9zdCkifV19LHsiYyI6W3sidiI6Imhvc3QifSx7InYiOiJ0cmFjZV92aWV3ZXIgKGxvb2sgYXQgdGhlIGFjdGl2aXRpZXMgb24gdGhlIHRpbWVsaW5lIG9mIGVhY2ggSG9zdCBUaHJlYWQgbmVhciB0aGUgYm90dG9tIG9mIHRoZSB0cmFjZSB2aWV3KSJ9XX0seyJjIjpbeyJ2IjoiZGV2aWNlIn0seyJ2IjoidGVuc29yZmxvd19zdGF0cyAoaWRlbnRpZnkgdGhlIHRpbWUtY29uc3VtaW5nIG9wZXJhdGlvbnMgZXhlY3V0ZWQgb24gdGhlIENQVV9PTkxZKSJ9XX0seyJjIjpbeyJ2IjoiZGV2aWNlIn0seyJ2IjoidHJhY2Vfdmlld2VyIChsb29rIGF0IHRoZSBhY3Rpdml0aWVzIG9uIHRoZSB0aW1lbGluZSBvZiBlYWNoIENQVV9PTkxZIGluIHRoZSB0cmFjZSB2aWV3KSJ9XX0seyJjIjpbeyJ2IjoiZG9jIn0seyJ2IjoiPGEgaHJlZj1cImh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2d1aWRlL2RhdGFfcGVyZm9ybWFuY2VfYW5hbHlzaXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5BbmFseXplIHRmLmRhdGEgcGVyZm9ybWFuY2Ugd2l0aCB0aGUgVEYgUHJvZmlsZXI8L2E+In1dfSx7ImMiOlt7InYiOiJkb2MifSx7InYiOiI8YSBocmVmPVwiaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ3VpZGUvZGF0YV9wZXJmb3JtYW5jZVwiIHRhcmdldD1cIl9ibGFua1wiPkJldHRlciBwZXJmb3JtYW5jZSB3aXRoIHRoZSB0Zi5kYXRhIEFQSTwvYT4ifV19XSwicCI6eyJib3R0bGVuZWNrIjoiZGV2aWNlIiwic3RhdGVtZW50IjoiWW91ciBwcm9ncmFtIGlzIE5PVCBpbnB1dC1ib3VuZCBiZWNhdXNlIG9ubHkgMC4wJSBvZiB0aGUgdG90YWwgc3RlcCB0aW1lIHNhbXBsZWQgaXMgd2FpdGluZyBmb3IgaW5wdXQuIFRoZXJlZm9yZSwgeW91IHNob3VsZCBmb2N1cyBvbiByZWR1Y2luZyBvdGhlciB0aW1lLiIsImtlcm5lbF9sYXVuY2hfYm90dGxlbmVjayI6Im5vIiwia2VybmVsX2xhdW5jaF9zdGF0ZW1lbnQiOiIiLCJhbGxfb3RoZXJfYm90dGxlbmVjayI6Im5vIiwiYWxsX290aGVyX3N0YXRlbWVudCI6IiIsInByZWNpc2lvbl9zdGF0ZW1lbnQiOiIifX0se30se30seyJjb2xzIjpbeyJpZCI6InNldmVyaXR5IiwibGFiZWwiOiJzZXZlcml0eSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoibWVzc2FnZSIsImxhYmVsIjoibWVzc2FnZSIsInR5cGUiOiJzdHJpbmcifV0sInJvd3MiOltdfV0=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/data?run=20201119-035554/2020_11_19_03_58_10&tag=tensorflow_stats&host=c2ccf5deef0a": {
"data": "W3siY29scyI6W3siaWQiOiJyYW5rIiwibGFiZWwiOiJSYW5rIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJob3N0X29yX2RldmljZSIsImxhYmVsIjoiSG9zdC9kZXZpY2UiLCJ0eXBlIjoic3RyaW5nIn0seyJpZCI6InR5cGUiLCJsYWJlbCI6IlR5cGUiLCJ0eXBlIjoic3RyaW5nIn0seyJpZCI6Im9wZXJhdGlvbiIsImxhYmVsIjoiT3BlcmF0aW9uIiwidHlwZSI6InN0cmluZyJ9LHsiaWQiOiJvY2N1cnJlbmNlcyIsImxhYmVsIjoiI09jY3VycmVuY2VzIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJ0b3RhbF90aW1lIiwibGFiZWwiOiJUb3RhbCB0aW1lICh1cykiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6ImF2Z190aW1lIiwibGFiZWwiOiJBdmcuIHRpbWUgKHVzKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoidG90YWxfc2VsZl90aW1lIiwibGFiZWwiOiJUb3RhbCBzZWxmLXRpbWUgKHVzKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiYXZnX3NlbGZfdGltZSIsImxhYmVsIjoiQXZnLiBzZWxmLXRpbWUgKHVzKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiZGV2aWNlX3RvdGFsX3NlbGZfdGltZV9wZXJjZW50IiwibGFiZWwiOiJUb3RhbCBzZWxmLXRpbWUgb24gRGV2aWNlICglKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiZGV2aWNlX2N1bXVsYXRpdmVfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLCJsYWJlbCI6IkN1bXVsYXRpdmUgdG90YWwtc2VsZiB0aW1lIG9uIERldmljZSAoJSkiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6Imhvc3RfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLCJsYWJlbCI6IlRvdGFsIHNlbGYtdGltZSBvbiBIb3N0ICglKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiSG9zdF9jdW11bGF0aXZlX3RvdGFsX3NlbGZfdGltZV9wZXJjZW50IiwibGFiZWwiOiJDdW11bGF0aXZlIHRvdGFsLXNlbGYgdGltZSBvbiBIb3N0ICglKSIsInR5cGUiOiJudW1iZXIifV0sInJvd3MiOlt7ImMiOlt7InYiOjF9LHsidiI6Ikhvc3QifSx7InYiOiJJRExFIn0seyJ2IjoiSURMRSJ9LHsidiI6MH0seyJ2Ijo0MzczNTg1MS4zMDV9LHsidiI6MC4wfSx7InYiOjQzNzM1ODUxLjMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjUwODQzODg1NTcyOTI4ODl9LHsidiI6MC41MDg0Mzg4NTU3MjkyODg5fV19LHsiYyI6W3sidiI6Mn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL01hdE11bF8zIn0seyJ2IjoxMTgwfSx7InYiOjI4MTExNjYuNTMxfSx7InYiOjIzODIuMzQ0NTE3Nzk2NjF9LHsidiI6MjgxMTE2Ni41MzF9LHsidiI6MjM4Mi4zNDQ1MTc3OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDMyNjgwNDI2OTY0MTA3NDJ9LHsidiI6MC41NDExMTkyODI2OTMzOTY0fV19LHsiYyI6W3sidiI6M30seyJ2IjoiSG9zdCJ9LHsidiI6Il9GdXNlZE1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMS9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjIyOTc3NDEuMjI4fSx7InYiOjE5NDcuMjM4MzI4ODEzNTU5NX0seyJ2IjoyMjk3NzQxLjIyOH0seyJ2IjoxOTQ3LjIzODMyODgxMzU1OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAyNjcxMTc0NTMwNDMwOTkzM30seyJ2IjowLjU2NzgzMTAyNzk5NzcwNjR9XX0seyJjIjpbeyJ2Ijo0fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzEvTWF0TXVsXzIifSx7InYiOjExODB9LHsidiI6MjIwNzQxMS41NX0seyJ2IjoxODcwLjY4Nzc1NDIzNzI4OH0seyJ2IjoyMjA3NDExLjU1fSx7InYiOjE4NzAuNjg3NzU0MjM3Mjg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMjU2NjE2NDMwMDI2NDM2NH0seyJ2IjowLjU5MzQ5MjY3MTAwMDM1fV19LHsiYyI6W3sidiI6NX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL01hdE11bF81In0seyJ2IjoxMTgwfSx7InYiOjIwOTg2ODMuOTczfSx7InYiOjE3NzguNTQ1NzM5ODMwNTA4Nn0seyJ2IjoyMDk4NjgzLjk3M30seyJ2IjoxNzc4LjU0NTczOTgzMDUwODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAyNDM5NzY2MTA5MzM3MjM3N30seyJ2IjowLjYxNzg5MDMzMjA5MzcyMjN9XX0seyJjIjpbeyJ2Ijo2fSx7InYiOiJIb3N0In0seyJ2IjoiX0Z1c2VkTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8xL1JlbHVfMSJ9LHsidiI6MTE4MH0seyJ2IjoxOTQ3NTIwLjA5fSx7InYiOjE2NTAuNDQwNzU0MjM3Mjg4M30seyJ2IjoxOTQ3NTIwLjA5fSx7InYiOjE2NTAuNDQwNzU0MjM3Mjg4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDIyNjQwMzQ3ODI3MzI1ODE3fSx7InYiOjAuNjQwNTMwNjc5OTIxMDQ4Mn1dfSx7ImMiOlt7InYiOjd9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNS9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjE2MTc1MDMuNzY2fSx7InYiOjEzNzAuNzY1OTAzMzg5ODMwNn0seyJ2IjoxNjE3NTAzLjc2Nn0seyJ2IjoxMzcwLjc2NTkwMzM4OTgzMDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxODgwMzgzNTc0MDc5MDQ0OH0seyJ2IjowLjY1OTMzNDUxNTY2MTgzODZ9XX0seyJjIjpbeyJ2Ijo4fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNS9NYXRNdWxfMSJ9LHsidiI6MTE4MH0seyJ2IjoxNTg4MDc4LjIzN30seyJ2IjoxMzQ1LjgyOTAxNDQwNjc3OTZ9LHsidiI6MTU4ODA3OC4yMzd9LHsidiI6MTM0NS44MjkwMTQ0MDY3Nzk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMTg0NjE3NTc1MTc4MzIwMDV9LHsidiI6MC42Nzc3OTYyNzMxNzk2NzA2fV19LHsiYyI6W3sidiI6OX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL01hdE11bF80In0seyJ2IjoxMTgwfSx7InYiOjE1NzQwNjguOTExfSx7InYiOjEzMzMuOTU2NzA0MjM3Mjg4Mn0seyJ2IjoxNTc0MDY4LjkxMX0seyJ2IjoxMzMzLjk1NjcwNDIzNzI4ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxODI5ODg5NjAzMzA2NzM1fSx7InYiOjAuNjk2MDk1MTY5MjEyNzM4fV19LHsiYyI6W3sidiI6MTB9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTQ0ODUxNS45ODR9LHsidiI6MTIyNy41NTU5MTg2NDQwNjc4fSx7InYiOjE0NDg1MTUuOTg0fSx7InYiOjEyMjcuNTU1OTE4NjQ0MDY3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDE2ODM5MzE1NzQyOTI1NzJ9LHsidiI6MC43MTI5MzQ0ODQ5NTU2NjM3fV19LHsiYyI6W3sidiI6MTF9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV81L01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxMzM5MjU1Ljc5Mn0seyJ2IjoxMTM0Ljk2MjUzNTU5MzIyMDN9LHsidiI6MTMzOTI1NS43OTJ9LHsidiI6MTEzNC45NjI1MzU1OTMyMjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMTU1NjkxNDIwNjc1NjE3ODV9LHsidiI6MC43Mjg1MDM2MjcwMjMyMjU1fV19LHsiYyI6W3sidiI6MTJ9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2UvTWF0TXVsXzIifSx7InYiOjExODB9LHsidiI6MTMyNTE2Ni45MX0seyJ2IjoxMTIzLjAyMjgwNTA4NDc0NTZ9LHsidiI6MTMyNTE2Ni45MX0seyJ2IjoxMTIzLjAyMjgwNTA4NDc0NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNTQwNTM1NTcyNjg2MzE2NH0seyJ2IjowLjc0MzkwODk4Mjc1MDA4ODd9XX0seyJjIjpbeyJ2IjoxM30seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV80L01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxMzIzNjM4LjA2OH0seyJ2IjoxMTIxLjcyNzE3NjI3MTE4NjR9LHsidiI6MTMyMzYzOC4wNjh9LHsidiI6MTEyMS43MjcxNzYyNzExODY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMTUzODc1ODI2MDM1ODE1MzJ9LHsidiI6MC43NTkyOTY1NjUzNTM2NzAyfV19LHsiYyI6W3sidiI6MTR9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJNYXRNdWwifSx7InYiOjQwfSx7InYiOjEyOTQzMzEuNjUzfSx7InYiOjMyMzU4LjI5MTMyNX0seyJ2IjoxMjk0MzMxLjY1M30seyJ2IjozMjM1OC4yOTEzMjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNTA0Njg4OTEwNjk3NTgyN30seyJ2IjowLjc3NDM0MzQ1NDQ2MDY0Nn1dfSx7ImMiOlt7InYiOjE1fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNC9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTI1MDc4MC45NTF9LHsidiI6MTA1OS45ODM4NTY3Nzk2NjF9LHsidiI6MTI1MDc4MC45NTF9LHsidiI6MTA1OS45ODM4NTY3Nzk2NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNDU0MDYwMjY1MjQ5MDkyNn0seyJ2IjowLjc4ODg4NDA1NzExMzEzNjl9XX0seyJjIjpbeyJ2IjoxNn0seyJ2IjoiSG9zdCJ9LHsidiI6Il9GdXNlZE1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMi9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjEyNDE2NTIuMDgzfSx7InYiOjEwNTIuMjQ3NTI3OTY2MTAxOX0seyJ2IjoxMjQxNjUyLjA4M30seyJ2IjoxMDUyLjI0NzUyNzk2NjEwMTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNDQzNDQ3NzU2MTQ4MzY1NH0seyJ2IjowLjgwMzMxODUzNDY3NDYyMDZ9XX0seyJjIjpbeyJ2IjoxN30seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmRvbVN0YW5kYXJkTm9ybWFsIn0seyJ2IjoicmFuZG9tX25vcm1hbC9SYW5kb21TdGFuZGFyZE5vcm1hbCJ9LHsidiI6MTE4MH0seyJ2IjoxMDAwNTc5LjU0Nn0seyJ2Ijo4NDcuOTQ4NzY3Nzk2NjEwMX0seyJ2IjoxMDAwNTc5LjU0Nn0seyJ2Ijo4NDcuOTQ4NzY3Nzk2NjEwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDExNjMxOTU2NDkwMDM0MzM1fSx7InYiOjAuODE0OTUwNDkxMTY0NjU0OX1dfSx7ImMiOlt7InYiOjE4fSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZG9tU3RhbmRhcmROb3JtYWwifSx7InYiOiJSYW5kb21TdGFuZGFyZE5vcm1hbCJ9LHsidiI6MTB9LHsidiI6OTY5Njg3LjA0OH0seyJ2Ijo5Njk2OC43MDQ3OTk5OTk5OX0seyJ2Ijo5Njk2ODcuMDQ4fSx7InYiOjk2OTY4LjcwNDc5OTk5OTk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMTEyNzI4MjQ0MzA5NzgxNn0seyJ2IjowLjgyNjIyMzMxNTU5NTYzMzF9XX0seyJjIjpbeyJ2IjoxOX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2UvTWF0TXVsIn0seyJ2IjoxMTgwfSx7InYiOjgxNjg1NC40NzN9LHsidiI6NjkyLjI0OTU1MzM4OTgzMDV9LHsidiI6ODE2ODU0LjQ3M30seyJ2Ijo2OTIuMjQ5NTUzMzg5ODMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA5NDk2MTEyMjU0NzUzMTMzfSx7InYiOjAuODM1NzE5NDI3ODUwMzg2Mn1dfSx7ImMiOlt7InYiOjIwfSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZG9tVW5pZm9ybSJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0L3JhbmRvbV91bmlmb3JtL1JhbmRvbVVuaWZvcm0ifSx7InYiOjExODB9LHsidiI6NzU2MjQ3Ljk2Mn0seyJ2Ijo2NDAuODg4MTAzMzg5ODMwNn0seyJ2Ijo3NTYyNDcuOTYyfSx7InYiOjY0MC44ODgxMDMzODk4MzA2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDg3OTE1NDgyODMwMTk5MX0seyJ2IjowLjg0NDUxMDk3NjEzMzQwNjF9XX0seyJjIjpbeyJ2IjoyMX0seyJ2IjoiSG9zdCJ9LHsidiI6IkRhdGFzZXQifSx7InYiOiJJdGVyYXRvcjo6TW9kZWw6OkJhdGNoVjI6OlNodWZmbGUifSx7InYiOjYwMDAxMH0seyJ2Ijo5ODI3MDUuOTQ4fSx7InYiOjEuNjM3ODE1OTQ5NzM0MTcxfSx7InYiOjY5MjgxOS4zMTR9LHsidiI6MS4xNTQ2Nzk2MTIwMDY0NjY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDgwNTQxNzYzNTAyMTYzNzN9LHsidiI6MC44NTI1NjUxNTI0ODM2MjI0fV19LHsiYyI6W3sidiI6MjJ9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2UvTWF0TXVsXzQifSx7InYiOjExODB9LHsidiI6NjYzMTM4LjY5OH0seyJ2Ijo1NjEuOTgxOTQ3NDU3NjI3MX0seyJ2Ijo2NjMxMzguNjk4fSx7InYiOjU2MS45ODE5NDc0NTc2MjcxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDc3MDkxMzI2ODQ5ODI5Njc1fSx7InYiOjAuODYwMjc0Mjg1MTY4NjA1NH1dfSx7ImMiOlt7InYiOjIzfSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbDo6QmF0Y2hWMiJ9LHsidiI6MTE5MH0seyJ2IjoxNjQ1NTM1LjAyNn0seyJ2IjoxMzgyLjgwMjU0Mjg1NzE0M30seyJ2Ijo2NjI4MjkuMDc4fSx7InYiOjU1Ni45OTkyMjUyMTAwODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNzcwNTUzMzI4NDYzMjU5OH0seyJ2IjowLjg2Nzk3OTgxODQ1MzIzOH1dfSx7ImMiOlt7InYiOjI0fSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZG9tVW5pZm9ybSJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvcmFuZG9tX3VuaWZvcm0vUmFuZG9tVW5pZm9ybSJ9LHsidiI6MTE4MH0seyJ2Ijo2NTUyODguMTgxfSx7InYiOjU1NS4zMjg5NjY5NDkxNTI2fSx7InYiOjY1NTI4OC4xODF9LHsidiI6NTU1LjMyODk2Njk0OTE1MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNzYxNzg2ODcwNDQ4OTUzMn0seyJ2IjowLjg3NTU5NzY4NzE1NzcyNzZ9XX0seyJjIjpbeyJ2IjoyNX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmRvbVVuaWZvcm0ifSx7InYiOiJzZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvcmFuZG9tX3VuaWZvcm0vUmFuZG9tVW5pZm9ybSJ9LHsidiI6MTE4MH0seyJ2Ijo2NDIwMjIuMjcyfSx7InYiOjU0NC4wODY2NzExODY0NDA2fSx7InYiOjY0MjAyMi4yNzJ9LHsidiI6NTQ0LjA4NjY3MTE4NjQ0MDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNzQ2MzY0OTYwNTI2Mjg1N30seyJ2IjowLjg4MzA2MTMzNjc2Mjk5MDV9XX0seyJjIjpbeyJ2IjoyNn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL01hdE11bF8zIn0seyJ2IjoxMTgwfSx7InYiOjYyNzIwMS41fSx7InYiOjUzMS41MjY2OTQ5MTUyNTQyfSx7InYiOjYyNzIwMS41fSx7InYiOjUzMS41MjY2OTQ5MTUyNTQyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDcyOTEzNTQ4ODI5MjcyODl9LHsidiI6MC44OTAzNTI2OTE2NDU5MTc4fV19LHsiYyI6W3sidiI6Mjd9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNi9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjU1NDUwMi44Njd9LHsidiI6NDY5LjkxNzY4Mzg5ODMwNTF9LHsidiI6NTU0NTAyLjg2N30seyJ2Ijo0NjkuOTE3NjgzODk4MzA1MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA2NDQ2MjE3MzQzMDY2OTl9LHsidiI6MC44OTY3OTg5MDg5ODg5ODQ3fV19LHsiYyI6W3sidiI6Mjh9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfMiJ9LHsidiI6MTE4MH0seyJ2Ijo0NjExMjEuMzkyfSx7InYiOjM5MC43ODA4NDA2Nzc5NjYwN30seyJ2Ijo0NjExMjEuMzkyfSx7InYiOjM5MC43ODA4NDA2Nzc5NjYwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA1MzYwNjM3MjMyNTAyNTE5fSx7InYiOjAuOTAyMTU5NTQ2MjIxNDg3M31dfSx7ImMiOlt7InYiOjI5fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfMS9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2Ijo0NDY5MjEuODk3fSx7InYiOjM3OC43NDczNzAzMzg5ODMwNX0seyJ2Ijo0NDY5MjEuODk3fSx7InYiOjM3OC43NDczNzAzMzg5ODMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA1MTk1NTY0OTkxNDM5MDc4fSx7InYiOjAuOTA3MzU1MTExMjEyOTI2M31dfSx7ImMiOlt7InYiOjMwfSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfMy9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2Ijo0MzY5MDMuMTh9LHsidiI6MzcwLjI1NjkzMjIwMzM4OTg1fSx7InYiOjQzNjkwMy4xOH0seyJ2IjozNzAuMjU2OTMyMjAzMzg5ODV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNTA3OTA5NTIxMDgwNDU5OH0seyJ2IjowLjkxMjQzNDIwNjQyMzczMX1dfSx7ImMiOlt7InYiOjMxfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNi9NYXRNdWxfMSJ9LHsidiI6MTE4MH0seyJ2Ijo0MzIxNjAuNTI1fSx7InYiOjM2Ni4yMzc3MzMwNTA4NDc0NX0seyJ2Ijo0MzIxNjAuNTI1fSx7InYiOjM2Ni4yMzc3MzMwNTA4NDc0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA1MDIzOTYwODA3MTIwNDcyfSx7InYiOjAuOTE3NDU4MTY3MjMwODUxNH1dfSx7ImMiOlt7InYiOjMyfSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtL0FkYW0vdXBkYXRlXzEvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MzcyMTI2LjQyNH0seyJ2IjozMTUuMzYxMzc2MjcxMTg2NDN9LHsidiI6MzcyMTI2LjQyNH0seyJ2IjozMTUuMzYxMzc2MjcxMTg2NDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNDMyNjA1MTIyNzA3NTYyMn0seyJ2IjowLjkyMTc4NDIxODQ1NzkyN31dfSx7ImMiOlt7InYiOjMzfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNi9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MzI1NTU2LjUxNH0seyJ2IjoyNzUuODk1MzUwODQ3NDU3Nn0seyJ2IjozMjU1NTYuNTE0fSx7InYiOjI3NS44OTUzNTA4NDc0NTc2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDM3ODQ2NjU4MTc5NTkxMTkzfSx7InYiOjAuOTI1NTY4ODg0Mjc1ODg2MX1dfSx7ImMiOlt7InYiOjM0fSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbDo6QmF0Y2hWMjo6U2h1ZmZsZTo6VGVuc29yU2xpY2UifSx7InYiOjYwMDAxMH0seyJ2IjoyODk4ODYuNjM0fSx7InYiOjAuNDgzMTM2MzM3NzI3NzA0Nn0seyJ2IjoyODk4ODYuNjM0fSx7InYiOjAuNDgzMTM2MzM3NzI3NzA0Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzMzY5OTk1NjQ2MjMzNzE2fSx7InYiOjAuOTI4OTM4ODc5OTIyMTE5OX1dfSx7ImMiOlt7InYiOjM1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtL0FkYW0vdXBkYXRlXzUvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6Mjc4NjU4Ljg3OX0seyJ2IjoyMzYuMTUxNTkyMzcyODgxMzd9LHsidiI6Mjc4NjU4Ljg3OX0seyJ2IjoyMzYuMTUxNTkyMzcyODgxMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMzIzOTQ3MDUzMzg5OTcwM30seyJ2IjowLjkzMjE3ODM1MDQ1NjAxOTZ9XX0seyJjIjpbeyJ2IjozNn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzEvUmVsdUdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoyNjU2OTcuMTU0fSx7InYiOjIyNS4xNjcwNzk2NjEwMTY5NH0seyJ2IjoyNjU2OTcuMTU0fSx7InYiOjIyNS4xNjcwNzk2NjEwMTY5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzMDg4Nzg3NjQwMzMyMTQ4fSx7InYiOjAuOTM1MjY3MTM4MDk2MzUxOH1dfSx7ImMiOlt7InYiOjM3fSx7InYiOiJIb3N0In0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjI1NjA5MC42MjN9LHsidiI6MjE3LjAyNTk1MTY5NDkxNTI1fSx7InYiOjI1NjA5MC42MjN9LHsidiI6MjE3LjAyNTk1MTY5NDkxNTI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDI5NzcxMDk2MTIyNzQ0MzA3fSx7InYiOjAuOTM4MjQ0MjQ3NzA4NjI2MX1dfSx7ImMiOlt7InYiOjM4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGUvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MjM2OTY5LjYyNn0seyJ2IjoyMDAuODIxNzE2OTQ5MTUyNTV9LHsidiI6MjM2OTY5LjYyNn0seyJ2IjoyMDAuODIxNzE2OTQ5MTUyNTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMjc1NDgyMzgzMTk1OTE5MjV9LHsidiI6MC45NDA5OTkwNzE1NDA1ODU0fV19LHsiYyI6W3sidiI6Mzl9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGUvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MjM1NDQ0LjkyOH0seyJ2IjoxOTkuNTI5NjAwMDAwMDAwMDJ9LHsidiI6MjM1NDQ0LjkyOH0seyJ2IjoxOTkuNTI5NjAwMDAwMDAwMDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMjczNzA5ODg4MzU4NTY4fSx7InYiOjAuOTQzNzM2MTcwNDI0MTcxfV19LHsiYyI6W3sidiI6NDB9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGVfMy9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoyMjA5NTYuNTA3fSx7InYiOjE4Ny4yNTEyNzcxMTg2NDQwOH0seyJ2IjoyMjA5NTYuNTA3fSx7InYiOjE4Ny4yNTEyNzcxMTg2NDQwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAyNTY4NjY3ODE0NDU2Nzd9LHsidiI6MC45NDYzMDQ4MzgyMzg2Mjc4fV19LHsiYyI6W3sidiI6NDF9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfNSJ9LHsidiI6MTE4MH0seyJ2IjoxOTcyNjguMTE5fSx7InYiOjE2Ny4xNzYzNzIwMzM4OTgzfSx7InYiOjE5NzI2OC4xMTl9LHsidiI6MTY3LjE3NjM3MjAzMzg5ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMjI5MzI4NTExMjg2NDg5NTN9LHsidiI6MC45NDg1OTgxMjMzNTE0OTI2fV19LHsiYyI6W3sidiI6NDJ9LHsidiI6Ikhvc3QifSx7InYiOiJCaWFzQWRkIn0seyJ2IjoiQmlhc0FkZCJ9LHsidiI6MzB9LHsidiI6MTY3OTU5LjkzN30seyJ2Ijo1NTk4LjY2NDU2NjY2NjY2N30seyJ2IjoxNjc5NTkuOTM3fSx7InYiOjU1OTguNjY0NTY2NjY2NjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDE5NTI1NzEwNzQ0OTY5Njc2fSx7InYiOjAuOTUwNTUwNjk0NDI1OTg5Nn1dfSx7ImMiOlt7InYiOjQzfSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0L0Nhc3QifSx7InYiOjExODB9LHsidiI6MTYxNjQ0LjA3NX0seyJ2IjoxMzYuOTg2NTA0MjM3Mjg4MTZ9LHsidiI6MTYxNjQ0LjA3NX0seyJ2IjoxMzYuOTg2NTA0MjM3Mjg4MTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTg3OTE0Nzc5NDY4NDAyOX0seyJ2IjowLjk1MjQyOTg0MjIyMDY3MzZ9XX0seyJjIjpbeyJ2Ijo0NH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZS9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTYwNDk1LjA4NH0seyJ2IjoxMzYuMDEyNzgzMDUwODQ3NDV9LHsidiI6MTYwNDk1LjA4NH0seyJ2IjoxMzYuMDEyNzgzMDUwODQ3NDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTg2NTc5MDUyMjUxODI0MjR9LHsidiI6MC45NTQyOTU2MzI3NDMxOTE4fV19LHsiYyI6W3sidiI6NDV9LHsidiI6Ikhvc3QifSx7InYiOiJHcmVhdGVyRXF1YWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjE1Mjc2MC43NTN9LHsidiI6MTI5LjQ1ODI2NTI1NDIzNzN9LHsidiI6MTUyNzYwLjc1M30seyJ2IjoxMjkuNDU4MjY1MjU0MjM3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxNzc1ODc3MjI5NzM1ODk3NX0seyJ2IjowLjk1NjA3MTUwOTk3MjkyNzh9XX0seyJjIjpbeyJ2Ijo0Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IkdyZWF0ZXJFcXVhbCJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjE0NTg2Ny40MzN9LHsidiI6MTIzLjYxNjQ2ODY0NDA2Nzh9LHsidiI6MTQ1ODY3LjQzM30seyJ2IjoxMjMuNjE2NDY4NjQ0MDY3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxNjk1NzQwODc0MTI4MzYxfSx7InYiOjAuOTU3NzY3MjUwODQ3MDU2Mn1dfSx7ImMiOlt7InYiOjQ3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9SZWx1R3JhZF8yIn0seyJ2IjoxMTgwfSx7InYiOjEzOTEzNi4wMzZ9LHsidiI6MTE3LjkxMTg5NDkxNTI1NDI0fSx7InYiOjEzOTEzNi4wMzZ9LHsidiI6MTE3LjkxMTg5NDkxNTI1NDI0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDE2MTc0ODY5MDg4Nzk3NTd9LHsidiI6MC45NTkzODQ3Mzc3NTU5MzU5fV19LHsiYyI6W3sidiI6NDh9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL1JlbHVHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjEzMzAzMS4xMTR9LHsidiI6MTEyLjczODIzMjIwMzM4OTgzfSx7InYiOjEzMzAzMS4xMTR9LHsidiI6MTEyLjczODIzMjIwMzM4OTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDE1NDY1MTU4NTI3OTIzNzUyfSx7InYiOjAuOTYwOTMxMjUzNjA4NzI4M31dfSx7ImMiOlt7InYiOjQ5fSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV81L1JlbHVHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjEyNTgyMy4yNzF9LHsidiI6MTA2LjYyOTg5MDY3Nzk2NjF9LHsidiI6MTI1ODIzLjI3MX0seyJ2IjoxMDYuNjI5ODkwNjc3OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxNDYyNzIzMDk4Mzg1MDIyMX0seyJ2IjowLjk2MjM5Mzk3NjcwNzExMzR9XX0seyJjIjpbeyJ2Ijo1MH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL01hdE11bF80In0seyJ2IjoxMTgwfSx7InYiOjExNzA5OS42OTh9LHsidiI6OTkuMjM3MDMyMjAzMzg5ODN9LHsidiI6MTE3MDk5LjY5OH0seyJ2Ijo5OS4yMzcwMzIyMDMzODk4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMzYxMzA5NjUwNTY5NDExN30seyJ2IjowLjk2Mzc1NTI4NjM1NzY4Mjh9XX0seyJjIjpbeyJ2Ijo1MX0seyJ2IjoiSG9zdCJ9LHsidiI6Il9GdXNlZE1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMi9SZWx1XzEifSx7InYiOjExODB9LHsidiI6MTE0MTM0LjU5M30seyJ2Ijo5Ni43MjQyMzEzNTU5MzIyfSx7InYiOjExNDEzNC41OTN9LHsidiI6OTYuNzI0MjMxMzU1OTMyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMzI2ODM5NjU1MTY4OTgyN30seyJ2IjowLjk2NTA4MjEyNjAxMjg1MTh9XX0seyJjIjpbeyJ2Ijo1Mn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxMTA0MDkuODI5fSx7InYiOjkzLjU2NzY1MTY5NDkxNTI2fSx7InYiOjExMDQwOS44Mjl9LHsidiI6OTMuNTY3NjUxNjk0OTE1MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTI4MzUzODQ1NzQyMTI4NjV9LHsidiI6MC45NjYzNjU2NjQ0NzAyNzMxfV19LHsiYyI6W3sidiI6NTN9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1In0seyJ2IjoiUmVsdSJ9LHsidiI6MzB9LHsidiI6MTA4Njc2LjIxNX0seyJ2IjozNjIyLjU0MDV9LHsidiI6MTA4Njc2LjIxNX0seyJ2IjozNjIyLjU0MDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTI2MzM4NDgxNDc2NTc1ODV9LHsidiI6MC45Njc2MjkwNDkyODUwMzg4fV19LHsiYyI6W3sidiI6NTR9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlL01hdE11bF8xIn0seyJ2IjoxMTgwfSx7InYiOjk4MjA0LjE5Mn0seyJ2Ijo4My4yMjM4OTE1MjU0MjM3Mn0seyJ2Ijo5ODIwNC4xOTJ9LHsidiI6ODMuMjIzODkxNTI1NDIzNzJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTE0MTY0NTI1MjU0MzQ0NzN9LHsidiI6MC45Njg3NzA2OTQ1Mzc1ODIyfV19LHsiYyI6W3sidiI6NTV9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZCJ9LHsidiI6MTE4MH0seyJ2Ijo5NDUwMi4yODJ9LHsidiI6ODAuMDg2Njc5NjYxMDE2OTZ9LHsidiI6OTQ1MDIuMjgyfSx7InYiOjgwLjA4NjY3OTY2MTAxNjk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDEwOTg2MDk3Mzc1NTM5OTQ2fSx7InYiOjAuOTY5ODY5MzA0Mjc1MTM2M31dfSx7ImMiOlt7InYiOjU2fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNy9NYXRNdWxfMSJ9LHsidiI6MTE4MH0seyJ2Ijo5MjI0NS4yNjl9LHsidiI6NzguMTczOTU2Nzc5NjYxMDF9LHsidiI6OTIyNDUuMjY5fSx7InYiOjc4LjE3Mzk1Njc3OTY2MTAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDEwNzIzNzE0NjY4MjU0MDAzfSx7InYiOjAuOTcwOTQxNjc1NzQxOTYxN31dfSx7ImMiOlt7InYiOjU3fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvTXVsXzEifSx7InYiOjExODB9LHsidiI6ODU0NTMuODQxfSx7InYiOjcyLjQxODUwOTMyMjAzMzl9LHsidiI6ODU0NTMuODQxfSx7InYiOjcyLjQxODUwOTMyMjAzMzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDk5MzQxOTYyODA0NjU1NjN9LHsidiI6MC45NzE5MzUwOTUzNzAwMDgyfV19LHsiYyI6W3sidiI6NTh9LHsidiI6Ikhvc3QifSx7InYiOiJUZnFTaW11bGF0ZVNhbXBsZXMifSx7InYiOiJUZnFTaW11bGF0ZVNhbXBsZXMifSx7InYiOjEwfSx7InYiOjg1MTEwLjI0N30seyJ2Ijo4NTExLjAyNDd9LHsidiI6ODUxMTAuMjQ3fSx7InYiOjg1MTEuMDI0N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwOTg5NDI1MjcyNTAxMDk4NH0seyJ2IjowLjk3MjkyNDUyMDY0MjUwOTN9XX0seyJjIjpbeyJ2Ijo1OX0seyJ2IjoiSG9zdCJ9LHsidiI6IkNhc3QifSx7InYiOiJzZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvQ2FzdCJ9LHsidiI6MTE4MH0seyJ2Ijo3ODgyOC40MzJ9LHsidiI6NjYuODAzNzU1OTMyMjAzMzl9LHsidiI6Nzg4MjguNDMyfSx7InYiOjY2LjgwMzc1NTkzMjIwMzM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA5MTYzOTc3OTY1MjQyNDU5fSx7InYiOjAuOTczODQwOTE4NDM5MDMzNX1dfSx7ImMiOlt7InYiOjYwfSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvQ2FzdCJ9LHsidiI6MTE4MH0seyJ2Ijo3NjY2NS42NDV9LHsidiI6NjQuOTcwODg1NTkzMjIwMzR9LHsidiI6NzY2NjUuNjQ1fSx7InYiOjY0Ljk3MDg4NTU5MzIyMDM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA4OTEyNTQ5MjM2OTQ0MTF9LHsidiI6MC45NzQ3MzIxNzMzNjI3Mjh9XX0seyJjIjpbeyJ2Ijo2MX0seyJ2IjoiSG9zdCJ9LHsidiI6IldyaXRlU3VtbWFyeSJ9LHsidiI6IldyaXRlU3VtbWFyeSJ9LHsidiI6MjM5MX0seyJ2Ijo3MzcyNy45MDd9LHsidiI6MzAuODM1NTk0NzMwMjM4Mzk4fSx7InYiOjczNzI3LjkwN30seyJ2IjozMC44MzU1OTQ3MzAyMzgzOTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDg1NzEwMzA3NTY2NjIwNzl9LHsidiI6MC45NzU1ODkyNzY0MzgzOTQyfV19LHsiYyI6W3sidiI6NjJ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL1JlbHVHcmFkXzEifSx7InYiOjExODB9LHsidiI6NzMzMTQuNzY1fSx7InYiOjYyLjEzMTE1Njc3OTY2MTAyfSx7InYiOjczMzE0Ljc2NX0seyJ2Ijo2Mi4xMzExNTY3Nzk2NjEwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwODUyMzAwMjA5Mzc5OTQ2OH0seyJ2IjowLjk3NjQ0MTU3NjY0Nzc3NDJ9XX0seyJjIjpbeyJ2Ijo2M30seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNi9SZWx1R3JhZCJ9LHsidiI6MTE4MH0seyJ2Ijo2Nzg3MC4yODN9LHsidiI6NTcuNTE3MTg4OTgzMDUwODR9LHsidiI6Njc4NzAuMjgzfSx7InYiOjU3LjUxNzE4ODk4MzA1MDg0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA3ODkwMDY5MTMwMjE5MDI3fSx7InYiOjAuOTc3MjMwNTgzNTYwNzk2MX1dfSx7ImMiOlt7InYiOjY0fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvTXVsIn0seyJ2IjoxMTgwfSx7InYiOjU1NjI3LjQyNH0seyJ2Ijo0Ny4xNDE4ODQ3NDU3NjI3MX0seyJ2Ijo1NTYyNy40MjR9LHsidiI6NDcuMTQxODg0NzQ1NzYyNzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDY0NjY4MDk5NDIzNzIwNTV9LHsidiI6MC45Nzc4NzcyNjQ1NTUwMzMzfV19LHsiYyI6W3sidiI6NjV9LHsidiI6Ikhvc3QifSx7InYiOiJBZGROIn0seyJ2IjoiQWRkTl80In0seyJ2IjoxMTgwfSx7InYiOjUxMjQwLjUxNX0seyJ2Ijo0My40MjQxNjUyNTQyMzcyOX0seyJ2Ijo1MTI0MC41MTV9LHsidiI6NDMuNDI0MTY1MjU0MjM3Mjl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDU5NTY4MjIxNTc2MTUzNn0seyJ2IjowLjk3ODQ3Mjk0Njc3MDc5NDl9XX0seyJjIjpbeyJ2Ijo2Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzIvUmVsdUdyYWQifSx7InYiOjExODB9LHsidiI6NTA5NTMuMzY3fSx7InYiOjQzLjE4MDgxOTQ5MTUyNTQyfSx7InYiOjUwOTUzLjM2N30seyJ2Ijo0My4xODA4MTk0OTE1MjU0Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNTkyMzQ0MDU3MzM1Njk4N30seyJ2IjowLjk3OTA2NTI5MDgyODEzMDV9XX0seyJjIjpbeyJ2Ijo2N30seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6Ik11bCJ9LHsidiI6MzF9LHsidiI6NTAxNjAuOTc3fSx7InYiOjE2MTguMDk2MDMyMjU4MDY0NX0seyJ2Ijo1MDE2MC45Nzd9LHsidiI6MTYxOC4wOTYwMzIyNTgwNjQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1ODMxMzIzNDk5NDA3MzQzfSx7InYiOjAuOTc5NjQ4NDIzMTc4MDcxM31dfSx7ImMiOlt7InYiOjY4fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkIn0seyJ2IjoiQWRkIn0seyJ2IjoxMH0seyJ2Ijo0OTE5Mi42Nn0seyJ2Ijo0OTE5LjI2NjAwMDAwMDAwMDV9LHsidiI6NDkxOTIuNjZ9LHsidiI6NDkxOS4yNjYwMDAwMDAwMDA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1NzE4NzU0NTI2MTc5ODk1fSx7InYiOjAuOTgwMjIwMjk4NjMwNjg5M31dfSx7ImMiOlt7InYiOjY5fSx7InYiOiJIb3N0In0seyJ2IjoiU3VtIn0seyJ2IjoiU3VtIn0seyJ2IjoyMX0seyJ2Ijo0OTA5OC41NH0seyJ2IjoyMzM4LjAyNTcxNDI4NTcxNDV9LHsidiI6NDkwOTguNTR9LHsidiI6MjMzOC4wMjU3MTQyODU3MTQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1NzA3ODEyODY5OTI0NTkxfSx7InYiOjAuOTgwNzkxMDc5OTE3NjgxOH1dfSx7ImMiOlt7InYiOjcwfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkL0JpYXNBZGRHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjQ5MDQ5LjkyNn0seyJ2Ijo0MS41Njc3MzM4OTgzMDUwODZ9LHsidiI6NDkwNDkuOTI2fSx7InYiOjQxLjU2NzczMzg5ODMwNTA4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNTcwMjE2MTM4NTg5MTQ5MX0seyJ2IjowLjk4MTM2MTI5NjA1NjI3MDl9XX0seyJjIjpbeyJ2Ijo3MX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvTXVsXzIifSx7InYiOjExODB9LHsidiI6NDkwMjcuODAyfSx7InYiOjQxLjU0ODk4NDc0NTc2MjcxNn0seyJ2Ijo0OTAyNy44MDJ9LHsidiI6NDEuNTQ4OTg0NzQ1NzYyNzE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1Njk5NTg5NDIyNDA4Nzg1fSx7InYiOjAuOTgxOTMxMjU0OTk4NTExN31dfSx7ImMiOlt7InYiOjcyfSx7InYiOiJIb3N0In0seyJ2IjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IifSx7InYiOiJSYWdnZWRUZW5zb3JUb1RlbnNvciJ9LHsidiI6MTB9LHsidiI6NDg1MjMuMDMyfSx7InYiOjQ4NTIuMzAzMn0seyJ2Ijo0ODUyMy4wMzJ9LHsidiI6NDg1Mi4zMDMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1NjQwOTA4ODAzNzUxODU4fSx7InYiOjAuOTgyNDk1MzQ1ODc4ODg3fV19LHsiYyI6W3sidiI6NzN9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dF8xL011bF8xIn0seyJ2IjoxMTgwfSx7InYiOjQ4MjY4Ljk1N30seyJ2Ijo0MC45MDU4OTU3NjI3MTE4NjR9LHsidiI6NDgyNjguOTU3fSx7InYiOjQwLjkwNTg5NTc2MjcxMTg2NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNTYxMTM3MjAyODIxOTkxNn0seyJ2IjowLjk4MzA1NjQ4MzA4MTcwOX1dfSx7ImMiOlt7InYiOjc0fSx7InYiOiJIb3N0In0seyJ2IjoiX0Z1c2VkTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzcvUmVsdSJ9LHsidiI6MTE4MH0seyJ2Ijo0NzI5OS42MzR9LHsidiI6NDAuMDg0NDM1NTkzMjIwMzM0fSx7InYiOjQ3Mjk5LjYzNH0seyJ2Ijo0MC4wODQ0MzU1OTMyMjAzMzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDU0OTg2ODYxMDUyODc5MTJ9LHsidiI6MC45ODM2MDYzNTE2OTIyMzc4fV19LHsiYyI6W3sidiI6NzV9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW1fMS9BZGFtL3VwZGF0ZV82L1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjQ0NTMyLjkzM30seyJ2IjozNy43Mzk3NzM3Mjg4MTM1Nn0seyJ2Ijo0NDUzMi45MzN9LHsidiI6MzcuNzM5NzczNzI4ODEzNTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDUxNzcwNTEwNTEwNjc3fSx7InYiOjAuOTg0MTI0MDU2Nzk3MzQ0NX1dfSx7ImMiOlt7InYiOjc2fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbF8xL2Ryb3BvdXRfMS9kcm9wb3V0L011bF8xIn0seyJ2IjoxMTgwfSx7InYiOjQ0MTAxLjA0OH0seyJ2IjozNy4zNzM3Njk0OTE1MjU0Mn0seyJ2Ijo0NDEwMS4wNDh9LHsidiI6MzcuMzczNzY5NDkxNTI1NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDUxMjY4NDM0NzMzODE1MzR9LHsidiI6MC45ODQ2MzY3NDExNDQ2ODI3fV19LHsiYyI6W3sidiI6Nzd9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWxfMiJ9LHsidiI6MTE4MH0seyJ2Ijo0MzMxOC4yNjh9LHsidiI6MzYuNzEwMzk2NjEwMTY5NDl9LHsidiI6NDMzMTguMjY4fSx7InYiOjM2LjcxMDM5NjYxMDE2OTQ5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1MDM1ODQzNTgyOTkxMzE3fSx7InYiOjAuOTg1MTQwMzI1NTAyOTgxOH1dfSx7ImMiOlt7InYiOjc4fSx7InYiOiJIb3N0In0seyJ2IjoiR2F0aGVyVjIifSx7InYiOiJSYWdnZWRNYXNrL2Jvb2xlYW5fbWFzay9HYXRoZXJWMiJ9LHsidiI6MTB9LHsidiI6Mzk2ODcuMDR9LHsidiI6Mzk2OC43MDR9LHsidiI6Mzk2ODcuMDR9LHsidiI6Mzk2OC43MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDQ2MTM3MDUzNzA0ODk4NzY1fSx7InYiOjAuOTg1NjAxNjk2MDQwMDMwOH1dfSx7ImMiOlt7InYiOjc5fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6IkNhc3QifSx7InYiOjIyMH0seyJ2IjozNTA5NC44NTN9LHsidiI6MTU5LjUyMjA1OTA5MDkwOTF9LHsidiI6MzUwOTQuODUzfSx7InYiOjE1OS41MjIwNTkwOTA5MDkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0MDc5ODUzNTY4Mzg1MzY2fSx7InYiOjAuOTg2MDA5NjgxMzk2ODY5M31dfSx7ImMiOlt7InYiOjgwfSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9SZWx1R3JhZF8yIn0seyJ2IjoxMTgwfSx7InYiOjM0NjAwLjAxNn0seyJ2IjoyOS4zMjIwNDc0NTc2MjcxMn0seyJ2IjozNDYwMC4wMTZ9LHsidiI6MjkuMzIyMDQ3NDU3NjI3MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDQwMjIzMjc2ODI3NDU2OTQzfSx7InYiOjAuOTg2NDExOTE0MTY1MTQzOH1dfSx7ImMiOlt7InYiOjgxfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNy9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MzQwNzMuODExfSx7InYiOjI4Ljg3NjExMTAxNjk0OTE1M30seyJ2IjozNDA3My44MTF9LHsidiI6MjguODc2MTExMDE2OTQ5MTUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzOTYxMTU1MTk4MzY1OTQxfSx7InYiOjAuOTg2ODA4MDI5Njg0OTgwNX1dfSx7ImMiOlt7InYiOjgyfSx7InYiOiJIb3N0In0seyJ2IjoiT25lSG90In0seyJ2IjoiT25lSG90In0seyJ2IjoyMX0seyJ2IjozMjg3NS44NzV9LHsidiI6MTU2NS41MTc4NTcxNDI4NTd9LHsidiI6MzI4NzUuODc1fSx7InYiOjE1NjUuNTE3ODU3MTQyODU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzODIxODkyNTEzMTk5NjIxfSx7InYiOjAuOTg3MTkwMjE4OTM2MzAwNH1dfSx7ImMiOlt7InYiOjgzfSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dC9NdWwifSx7InYiOjExODB9LHsidiI6MzIwNTMuMzYzfSx7InYiOjI3LjE2Mzg2Njk0OTE1MjU0Mn0seyJ2IjozMjA1My4zNjN9LHsidiI6MjcuMTYzODY2OTQ5MTUyNTQyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzNzI2MjczNjkwNzQwMzkwN30seyJ2IjowLjk4NzU2Mjg0NjMwNTM3NDV9XX0seyJjIjpbeyJ2Ijo4NH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9NdWxfMiJ9LHsidiI6MTE4MH0seyJ2IjozMTQxNy4wODR9LHsidiI6MjYuNjI0NjQ3NDU3NjI3MTE2fSx7InYiOjMxNDE3LjA4NH0seyJ2IjoyNi42MjQ2NDc0NTc2MjcxMTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDM2NTIzMDQ4NjI2NDM2MTI3fSx7InYiOjAuOTg3OTI4MDc2NzkxNjM4OX1dfSx7ImMiOlt7InYiOjg1fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dF8xL011bF81In0seyJ2IjoxMTgwfSx7InYiOjI4NTg2LjI5MX0seyJ2IjoyNC4yMjU2NzAzMzg5ODMwNX0seyJ2IjoyODU4Ni4yOTF9LHsidiI6MjQuMjI1NjcwMzM4OTgzMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDMzMjMyMTg5NzI5NzE2OTE0fSx7InYiOjAuOTg4MjYwMzk4Njg4OTM2fV19LHsiYyI6W3sidiI6ODZ9LHsidiI6Ikhvc3QifSx7InYiOiJJdGVyYXRvckdldE5leHQifSx7InYiOiJJdGVyYXRvckdldE5leHQifSx7InYiOjExOTB9LHsidiI6MTY4MTczMC4xNDl9LHsidiI6MTQxMy4yMTg2MTI2MDUwNDJ9LHsidiI6MjgzMTEuMzQ4fSx7InYiOjIzLjc5MTA0ODczOTQ5NTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDMyOTEyNTYyNDY3MDk0NTA2fSx7InYiOjAuOTg4NTg5NTI0MzEzNjA2OX1dfSx7ImMiOlt7InYiOjg3fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbF8xL2Ryb3BvdXRfMS9kcm9wb3V0L011bCJ9LHsidiI6MTE4MH0seyJ2IjoyNzU5OS4zNzN9LHsidiI6MjMuMzg5Mjk5MTUyNTQyMzd9LHsidiI6Mjc1OTkuMzczfSx7InYiOjIzLjM4OTI5OTE1MjU0MjM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzMjA4NDg3NTkyNzMxODY2M30seyJ2IjowLjk4ODkxMDM3MzA3Mjg4MDF9XX0seyJjIjpbeyJ2Ijo4OH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8zL01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoyNjQ5NS4zMjZ9LHsidiI6MjIuNDUzNjY2MTAxNjk0OTE4fSx7InYiOjI2NDk1LjMyNn0seyJ2IjoyMi40NTM2NjYxMDE2OTQ5MTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDMwODAxMzk3MDk1NjQ2MzU1fSx7InYiOjAuOTg5MjE4Mzg3MDQzODM2Nn1dfSx7ImMiOlt7InYiOjg5fSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkXzEvQmlhc0FkZEdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoyNjQ3MC4wMzZ9LHsidiI6MjIuNDMyMjMzODk4MzA1MDg2fSx7InYiOjI2NDcwLjAzNn0seyJ2IjoyMi40MzIyMzM4OTgzMDUwODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDMwNzcxOTk2OTE2NDM5MzEzfSx7InYiOjAuOTg5NTI2MTA3MDEzMDAwOX1dfSx7ImMiOlt7InYiOjkwfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV81L0JpYXNBZGQvQmlhc0FkZEdyYWQifSx7InYiOjExODB9LHsidiI6MjYwMzAuMTM2fSx7InYiOjIyLjA1OTQzNzI4ODEzNTU5fSx7InYiOjI2MDMwLjEzNn0seyJ2IjoyMi4wNTk0MzcyODgxMzU1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMzAyNjA2MDM1MjY0MzYzMDd9LHsidiI6MC45ODk4Mjg3MTMwNDgyNjUzfV19LHsiYyI6W3sidiI6OTF9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kcm9wb3V0XzEvZHJvcG91dC9NdWxfMiJ9LHsidiI6MTE4MH0seyJ2IjoyNTY4MS4yMzV9LHsidiI6MjEuNzYzNzU4NDc0NTc2Mjd9LHsidiI6MjU2ODEuMjM1fSx7InYiOjIxLjc2Mzc1ODQ3NDU3NjI3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyOTg1NDk5ODQ2ODA5MjV9LHsidiI6MC45OTAxMjcyNjMwMzI5NDYyfV19LHsiYyI6W3sidiI6OTJ9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZF8xIn0seyJ2IjoxMTgwfSx7InYiOjI1NTA0LjkxNX0seyJ2IjoyMS42MTQzMzQ3NDU3NjI3MX0seyJ2IjoyNTUwNC45MTV9LHsidiI6MjEuNjE0MzM0NzQ1NzYyNzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI5NjUwMDIyNjA0MjAyMjM0fSx7InYiOjAuOTkwNDIzNzYzMjU4OTg4Mn1dfSx7ImMiOlt7InYiOjkzfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weS9sb2dpc3RpY19sb3NzL1NlbGVjdCJ9LHsidiI6MTE4MH0seyJ2IjoyNTMyMS43Mzh9LHsidiI6MjEuNDU5MX0seyJ2IjoyNTMyMS43Mzh9LHsidiI6MjEuNDU5MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjk0MzcwNzUzMjc1NDcxMjZ9LHsidiI6MC45OTA3MTgxMzQwMTIyNjM2fV19LHsiYyI6W3sidiI6OTR9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGVfNi9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoyMzkwMC45OTJ9LHsidiI6MjAuMjU1MDc3OTY2MTAxNjk1fSx7InYiOjIzOTAwLjk5Mn0seyJ2IjoyMC4yNTUwNzc5NjYxMDE2OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI3Nzg1NDI2OTY4MjA4MTUzfSx7InYiOjAuOTkwOTk1OTg4MjgxOTQ1N31dfSx7ImMiOlt7InYiOjk1fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9NdWwifSx7InYiOjExODB9LHsidiI6MjM3MTIuMjQ3fSx7InYiOjIwLjA5NTEyNDU3NjI3MTE4Nn0seyJ2IjoyMzcxMi4yNDd9LHsidiI6MjAuMDk1MTI0NTc2MjcxMTg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyNzU2NjAwNjc2OTUzNTQ2fSx7InYiOjAuOTkxMjcxNjQ4MzQ5NjQxfV19LHsiYyI6W3sidiI6OTZ9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2Ijoic2VxdWVudGlhbC9DYXN0In0seyJ2IjoxMTgwfSx7InYiOjIzMDgzLjYzMX0seyJ2IjoxOS41NjIzOTkxNTI1NDIzNzN9LHsidiI6MjMwODMuNjMxfSx7InYiOjE5LjU2MjM5OTE1MjU0MjM3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjY4MzUyMjY4OTM5OTUyN30seyJ2IjowLjk5MTU0MDAwMDYxODU4MDl9XX0seyJjIjpbeyJ2Ijo5N30seyJ2IjoiSG9zdCJ9LHsidiI6Ik9wdGltaXplRGF0YXNldCJ9LHsidiI6Ik9wdGltaXplRGF0YXNldCJ9LHsidiI6MTB9LHsidiI6MjI5NDQuODE3fSx7InYiOjIyOTQuNDgxN30seyJ2IjoyMjY1Ni4zMTV9LHsidiI6MjI2NS42MzE1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyNjMzODQ2MjY3OTc1OTAyfSx7InYiOjAuOTkxODAzMzg1MjQ1Mzc4NX1dfSx7ImMiOlt7InYiOjk4fSx7InYiOiJIb3N0In0seyJ2IjoiV2hlcmUifSx7InYiOiJSYWdnZWRNYXNrL2Jvb2xlYW5fbWFzay9XaGVyZSJ9LHsidiI6MTB9LHsidiI6MjI1NDMuNDUyfSx7InYiOjIyNTQuMzQ1Mn0seyJ2IjoyMjU0My40NTJ9LHsidiI6MjI1NC4zNDUyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyNjIwNzI1Njk2ODk3MDQxfSx7InYiOjAuOTkyMDY1NDU3ODE1MDY4Mn1dfSx7ImMiOlt7InYiOjk5fSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9CaWFzQWRkL0JpYXNBZGRHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjIwNDE1LjM3Mn0seyJ2IjoxNy4zMDExNjI3MTE4NjQ0MDd9LHsidiI6MjA0MTUuMzcyfSx7InYiOjE3LjMwMTE2MjcxMTg2NDQwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjM3MzMzMTczMzQwNTg4Mzh9LHsidiI6MC45OTIzMDI3OTA5ODg0MDg4fV19LHsiYyI6W3sidiI6MTAwfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9CaWFzQWRkL0JpYXNBZGRHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjIwMTE1LjEyfSx7InYiOjE3LjA0NjcxMTg2NDQwNjc3N30seyJ2IjoyMDExNS4xMn0seyJ2IjoxNy4wNDY3MTE4NjQ0MDY3Nzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDIzMzg0MjY3ODA0MzEzMDI0fSx7InYiOjAuOTkyNTM2NjMzNjY2NDUyfV19LHsiYyI6W3sidiI6MTAxfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV82L0JpYXNBZGQvQmlhc0FkZEdyYWQifSx7InYiOjExODB9LHsidiI6MTk0NzkuMzJ9LHsidiI6MTYuNTA3ODk4MzA1MDg0NzQ0fSx7InYiOjE5NDc5LjMyfSx7InYiOjE2LjUwNzg5ODMwNTA4NDc0NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjI2NDUxMzYzNzEzNDIwOTd9LHsidiI6MC45OTI3NjMwODUwMzAxNjU0fV19LHsiYyI6W3sidiI6MTAyfSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtL0FkYW0vdXBkYXRlXzIvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MTg3OTguMzA4fSx7InYiOjE1LjkzMDc2OTQ5MTUyNTQyNX0seyJ2IjoxODc5OC4zMDh9LHsidiI6MTUuOTMwNzY5NDkxNTI1NDI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyMTg1MzQ0NDk5NzU5MTg2M30seyJ2IjowLjk5Mjk4MTYxOTQ4MDE0MTN9XX0seyJjIjpbeyJ2IjoxMDN9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW1fMS9BZGFtL3VwZGF0ZV8yL1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjE4NzgzLjEwM30seyJ2IjoxNS45MTc4ODM4OTgzMDUwODN9LHsidiI6MTg3ODMuMTAzfSx7InYiOjE1LjkxNzg4Mzg5ODMwNTA4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjE4MzU3Njg4NTE4ODgzMDJ9LHsidiI6MC45OTMxOTk5NzcxNjg2NjAyfV19LHsiYyI6W3sidiI6MTA0fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzMvTWF0TXVsXzQifSx7InYiOjExODB9LHsidiI6MTg2MzQuMTUzfSx7InYiOjE1Ljc5MTY1NTA4NDc0NTc2MX0seyJ2IjoxODYzNC4xNTN9LHsidiI6MTUuNzkxNjU1MDg0NzQ1NzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyMTY2MjYxMTIxMjc4NjM1fSx7InYiOjAuOTkzNDE2NjAzMjgwNzg4MX1dfSx7ImMiOlt7InYiOjEwNX0seyJ2IjoiSG9zdCJ9LHsidiI6IlNlbGVjdCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvU2VsZWN0XzMifSx7InYiOjExODB9LHsidiI6MTc4NDQuODY1fSx7InYiOjE1LjEyMjc2Njk0OTE1MjU0NH0seyJ2IjoxNzg0NC44NjV9LHsidiI6MTUuMTIyNzY2OTQ5MTUyNTQ0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyMDc0NTA0NjYxNjI2NzM4N30seyJ2IjowLjk5MzYyNDA1Mzc0Njk1MDd9XX0seyJjIjpbeyJ2IjoxMDZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGVfNC9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoxNzQxMy41MDd9LHsidiI6MTQuNzU3MjA5MzIyMDMzOX0seyJ2IjoxNzQxMy41MDd9LHsidiI6MTQuNzU3MjA5MzIyMDMzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjAyNDM1ODM0ODg0NTQ0MzN9LHsidiI6MC45OTM4MjY0ODk1ODE4MzUzfV19LHsiYyI6W3sidiI6MTA3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV83L1JlbHVHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjE3MzMwLjUxOX0seyJ2IjoxNC42ODY4ODA1MDg0NzQ1Nzd9LHsidiI6MTczMzAuNTE5fSx7InYiOjE0LjY4Njg4MDUwODQ3NDU3N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjAxNDcxMDgxMTk4NDg5MX0seyJ2IjowLjk5NDAyNzk2MDY2MzAzMzh9XX0seyJjIjpbeyJ2IjoxMDh9LHsidiI6Ikhvc3QifSx7InYiOiJCaWFzQWRkR3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzcvQmlhc0FkZC9CaWFzQWRkR3JhZCJ9LHsidiI6MTE4MH0seyJ2IjoxNzA2Ny4zfSx7InYiOjE0LjQ2MzgxMzU1OTMyMjAzNH0seyJ2IjoxNzA2Ny4zfSx7InYiOjE0LjQ2MzgxMzU1OTMyMjAzNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTk4NDExMTAyNjQxNDcxNTN9LHsidiI6MC45OTQyMjYzNzE3NjU2NzUzfV19LHsiYyI6W3sidiI6MTA5fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvTXVsIn0seyJ2IjoxMTgwfSx7InYiOjE2NTY3LjE3N30seyJ2IjoxNC4wMzk5ODA1MDg0NzQ1NzZ9LHsidiI6MTY1NjcuMTc3fSx7InYiOjE0LjAzOTk4MDUwODQ3NDU3Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTkyNTk3MDYzMTY5MTI2MTV9LHsidiI6MC45OTQ0MTg5Njg4Mjg4NDQ0fV19LHsiYyI6W3sidiI6MTEwfSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfNS9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoxNjU0OS42NDF9LHsidiI6MTQuMDI1MTE5NDkxNTI1NDIzfSx7InYiOjE2NTQ5LjY0MX0seyJ2IjoxNC4wMjUxMTk0OTE1MjU0MjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE5MjM5MzIwMzMyNjI3MzR9LHsidiI6MC45OTQ2MTEzNjIwMzIxNzA3fV19LHsiYyI6W3sidiI6MTExfSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldENhcmRpbmFsaXR5In0seyJ2IjoiRGF0YXNldENhcmRpbmFsaXR5In0seyJ2IjoyMzYwfSx7InYiOjE2NTE5LjY5MX0seyJ2Ijo2Ljk5OTg2OTA2Nzc5NjYxfSx7InYiOjE2NTE5LjY5MX0seyJ2Ijo2Ljk5OTg2OTA2Nzc5NjYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxOTIwNDUwMjgwMTMwMDY5Nn0seyJ2IjowLjk5NDgwMzQwNzA2MDE4Mzd9XX0seyJjIjpbeyJ2IjoxMTJ9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvTXVsIn0seyJ2IjoxMTgwfSx7InYiOjE2MzE4LjM4NH0seyJ2IjoxMy44MjkxMzg5ODMwNTA4NDh9LHsidiI6MTYzMTguMzg0fSx7InYiOjEzLjgyOTEzODk4MzA1MDg0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTg5NzA0NzkwMDIzNDMzNTR9LHsidiI6MC45OTQ5OTMxMTE4NTAyMDcxfV19LHsiYyI6W3sidiI6MTEzfSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dF8xL011bF8zIn0seyJ2IjoxMTgwfSx7InYiOjE0ODM5LjcwNH0seyJ2IjoxMi41NzYwMjAzMzg5ODMwNTF9LHsidiI6MTQ4MzkuNzA0fSx7InYiOjEyLjU3NjAyMDMzODk4MzA1MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTcyNTE0ODEwOTg0MzQxNzR9LHsidiI6MC45OTUxNjU2MjY2NjExOTE1fV19LHsiYyI6W3sidiI6MTE0fSx7InYiOiJIb3N0In0seyJ2IjoiTG9naWNhbEFuZCJ9LHsidiI6IkxvZ2ljYWxBbmQifSx7InYiOjIzOTF9LHsidiI6MTQ1NzcuNTA2fSx7InYiOjYuMDk2ODIzOTIzMDQ0NzUwNX0seyJ2IjoxNDU3Ny41MDZ9LHsidiI6Ni4wOTY4MjM5MjMwNDQ3NTA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxNjk0NjY3MDE3NzYwNjY5M30seyJ2IjowLjk5NTMzNTA5MzM2Mjk2NzV9XX0seyJjIjpbeyJ2IjoxMTV9LHsidiI6Ikhvc3QifSx7InYiOiJTdW0ifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvd2VpZ2h0ZWRfbG9zcy9TdW0ifSx7InYiOjExODB9LHsidiI6MTM3ODEuODM5fSx7InYiOjExLjY3OTUyNDU3NjI3MTE4Nn0seyJ2IjoxMzc4MS44Mzl9LHsidiI6MTEuNjc5NTI0NTc2MjcxMTg2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxNjAyMTY4OTg1Mzc5NzgyfSx7InYiOjAuOTk1NDk1MzEwMjYxNTA1NX1dfSx7ImMiOlt7InYiOjExNn0seyJ2IjoiSG9zdCJ9LHsidiI6IlNlbGVjdCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL1NlbGVjdF8xIn0seyJ2IjoxMTgwfSx7InYiOjEzNzgwLjgwOH0seyJ2IjoxMS42Nzg2NTA4NDc0NTc2Mjl9LHsidiI6MTM3ODAuODA4fSx7InYiOjExLjY3ODY1MDg0NzQ1NzYyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTYwMjA0OTEyOTM3MDQ0MDh9LHsidiI6MC45OTU2NTU1MTUxNzQ0NDI1fV19LHsiYyI6W3sidiI6MTE3fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6IlJhZ2dlZE1hc2svY291bnRfbm9uemVyby9DYXN0In0seyJ2IjoxMH0seyJ2IjoxMzM2Ni4zOTV9LHsidiI6MTMzNi42Mzk1fSx7InYiOjEzMzY2LjM5NX0seyJ2IjoxMzM2LjYzOTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE1NTM4NzI3MDk5NzI1NTEyfSx7InYiOjAuOTk1ODEwOTAyNDQ1NDM5OH1dfSx7ImMiOlt7InYiOjExOH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbV8xL0FkYW0vdXBkYXRlXzQvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MTI1MDMuMjczfSx7InYiOjEwLjU5NTk5NDA2Nzc5NjYxfSx7InYiOjEyNTAzLjI3M30seyJ2IjoxMC41OTU5OTQwNjc3OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTQ1MzUzMjg4NjAyMDI0OX0seyJ2IjowLjk5NTk1NjI1NTczNDA0MTh9XX0seyJjIjpbeyJ2IjoxMTl9LHsidiI6Ikhvc3QifSx7InYiOiJCaWFzQWRkR3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8zL0JpYXNBZGRfMS9CaWFzQWRkR3JhZF8xIn0seyJ2IjoxMTgwfSx7InYiOjEyMTEzLjg0M30seyJ2IjoxMC4yNjU5Njg2NDQwNjc3OTd9LHsidiI6MTIxMTMuODQzfSx7InYiOjEwLjI2NTk2ODY0NDA2Nzc5N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTQwODI2MDc5NTEyMDMwMTR9LHsidiI6MC45OTYwOTcwODE4MTM1NTM4fV19LHsiYyI6W3sidiI6MTIwfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9CaWFzQWRkXzEvQmlhc0FkZEdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoxMTk5NS4yMzV9LHsidiI6MTAuMTY1NDUzMzg5ODMwNTA5fSx7InYiOjExOTk1LjIzNX0seyJ2IjoxMC4xNjU0NTMzODk4MzA1MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEzOTQ0NzIzNTUyMDE4MDI0fSx7InYiOjAuOTk2MjM2NTI5MDQ5MDc0fV19LHsiYyI6W3sidiI6MTIxfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvU2VsZWN0In0seyJ2IjoxMTgwfSx7InYiOjExNjUxLjk5N30seyJ2Ijo5Ljg3NDU3MzcyODgxMzU1OX0seyJ2IjoxMTY1MS45OTd9LHsidiI6OS44NzQ1NzM3Mjg4MTM1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEzNTQ1NzAxODU1MjczNjQzfSx7InYiOjAuOTk2MzcxOTg2MDY3NjI2OH1dfSx7ImMiOlt7InYiOjEyMn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8zL01hdE11bF8zIn0seyJ2IjoxMTgwfSx7InYiOjExMzc1Ljk4NX0seyJ2Ijo5LjY0MDY2NTI1NDIzNzI5fSx7InYiOjExMzc1Ljk4NX0seyJ2Ijo5LjY0MDY2NTI1NDIzNzI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMzIyNDgzMTg1NjcyNTA4OH0seyJ2IjowLjk5NjUwNDIzNDM4NjE5NDF9XX0seyJjIjpbeyJ2IjoxMjN9LHsidiI6Ikhvc3QifSx7InYiOiJDdW1zdW0ifSx7InYiOiJSYWdnZWRNYXNrL1JhZ2dlZEZyb21Sb3dMZW5ndGhzL1Jvd1BhcnRpdGlvbkZyb21Sb3dMZW5ndGhzL0N1bXN1bSJ9LHsidiI6MTB9LHsidiI6MTExNjUuNzR9LHsidiI6MTExNi41NzR9LHsidiI6MTExNjUuNzR9LHsidiI6MTExNi41NzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEyOTgwNDE3NDM2ODk5NzEzfSx7InYiOjAuOTk2NjM0MDM4NTYwNTYzMX1dfSx7ImMiOlt7InYiOjEyNH0seyJ2IjoiSG9zdCJ9LHsidiI6IkVpbnN1bSJ9LHsidiI6ImVpbnN1bS9FaW5zdW0ifSx7InYiOjIxfSx7InYiOjEwNjE4LjkxM30seyJ2Ijo1MDUuNjYyNTIzODA5NTIzOH0seyJ2IjoxMDYxOC45MTN9LHsidiI6NTA1LjY2MjUyMzgwOTUyMzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEyMzQ0NzE5MDY2MTkwMDYzfSx7InYiOjAuOTk2NzU3NDg1NzUxMjI1fV19LHsiYyI6W3sidiI6MTI1fSx7InYiOiJIb3N0In0seyJ2IjoiTWVhbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMS9NZWFuIn0seyJ2IjoxMTgwfSx7InYiOjEwNjE3LjY3OX0seyJ2Ijo4Ljk5ODAzMzA1MDg0NzQ1N30seyJ2IjoxMDYxNy42Nzl9LHsidiI6OC45OTgwMzMwNTA4NDc0NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEyMzQzMjg0NTE0MTQ4MDl9LHsidiI6MC45OTY4ODA5MTg1OTYzNjY1fV19LHsiYyI6W3sidiI6MTI2fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6IkNhc3RfMSJ9LHsidiI6MTF9LHsidiI6MTAzMjYuMTkxfSx7InYiOjkzOC43NDQ2MzYzNjM2MzY1fSx7InYiOjEwMzI2LjE5MX0seyJ2Ijo5MzguNzQ0NjM2MzYzNjM2NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTIwMDQ0MjMzMjY0NTcyNTl9LHsidiI6MC45OTcwMDA5NjI4Mjk2MzExfV19LHsiYyI6W3sidiI6MTI3fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fMyJ9LHsidiI6MTE4MH0seyJ2IjoxMDE4OS42NTF9LHsidiI6OC42MzUyOTc0NTc2MjcxMTh9LHsidiI6MTAxODkuNjUxfSx7InYiOjguNjM1Mjk3NDU3NjI3MTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMTg0NTY5MjU4NDMwOTAxOX0seyJ2IjowLjk5NzExOTQxOTc1NTQ3NDJ9XX0seyJjIjpbeyJ2IjoxMjh9LHsidiI6Ikhvc3QifSx7InYiOiJTZWxlY3QifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0XzEifSx7InYiOjExODB9LHsidiI6MTAxMjguOTl9LHsidiI6OC41ODM4ODk4MzA1MDg0NzR9LHsidiI6MTAxMjguOTl9LHsidiI6OC41ODM4ODk4MzA1MDg0NzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDExNzc1MTcyODQyNDc5MTIxfSx7InYiOjAuOTk3MjM3MTcxNDgzODk5fV19LHsiYyI6W3sidiI6MTI5fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6IlBhcnRpdGlvbmVkQ2FsbC9DYXN0In0seyJ2IjoxMH0seyJ2Ijo5OTIwLjk5fSx7InYiOjk5Mi4wOTg5OTk5OTk5OTk5fSx7InYiOjk5MjAuOTl9LHsidiI6OTkyLjA5ODk5OTk5OTk5OTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDExNTMzMzY4Mjg0MzUwODV9LHsidiI6MC45OTczNTI1MDUxNjY3NDI2fV19LHsiYyI6W3sidiI6MTMwfSx7InYiOiJIb3N0In0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjkyOTcuMTkxfSx7InYiOjcuODc4OTc1NDIzNzI4ODE0fSx7InYiOjkyOTcuMTkxfSx7InYiOjcuODc4OTc1NDIzNzI4ODE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMDgwODE4ODI3Njg3MDc3NH0seyJ2IjowLjk5NzQ2MDU4NzA0OTUxMTJ9XX0seyJjIjpbeyJ2IjoxMzF9LHsidiI6Ikhvc3QifSx7InYiOiJSb3VuZCJ9LHsidiI6IlJvdW5kIn0seyJ2IjoyMX0seyJ2Ijo4NzgwLjg2Mn0seyJ2Ijo0MTguMTM2Mjg1NzE0Mjg1N30seyJ2Ijo4NzgwLjg2Mn0seyJ2Ijo0MTguMTM2Mjg1NzE0Mjg1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTAyMDc5NDQ0OTk0OTY2OH0seyJ2IjowLjk5NzU2MjY2NjQ5NDUwNjJ9XX0seyJjIjpbeyJ2IjoxMzJ9LHsidiI6Ikhvc3QifSx7InYiOiJTdW0ifSx7InYiOiJSYWdnZWRNYXNrL2NvdW50X25vbnplcm8vU3VtIn0seyJ2IjoxMH0seyJ2Ijo4NjA5LjQyMn0seyJ2Ijo4NjAuOTQyMjAwMDAwMDAwMX0seyJ2Ijo4NjA5LjQyMn0seyJ2Ijo4NjAuOTQyMjAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTAwMDg2NDE3NDI1NDcxMTN9LHsidiI6MC45OTc2NjI3NTI5MTE5MzE2fV19LHsiYyI6W3sidiI6MTMzfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9TZWxlY3QifSx7InYiOjExODB9LHsidiI6ODE0OS4yMjZ9LHsidiI6Ni45MDYxMjM3Mjg4MTM1NTl9LHsidiI6ODE0OS4yMjZ9LHsidiI6Ni45MDYxMjM3Mjg4MTM1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjQ3MzY1MzgwNzc3NTk3M2UtMDV9LHsidiI6MC45OTc3NTc0ODk0NTAwMDk0fV19LHsiYyI6W3sidiI6MTM0fSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbCJ9LHsidiI6MTE5MH0seyJ2IjoxNjUzNDE4LjgwMX0seyJ2IjoxMzg5LjQyNzU2Mzg2NTU0NjN9LHsidiI6Nzg4My43NzV9LHsidiI6Ni42MjUwMjEwMDg0MDMzNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjE2NTA2MTIwMzE2MTk5NmUtMDV9LHsidiI6MC45OTc4NDkxNDAwNjIwNDExfV19LHsiYyI6W3sidiI6MTM1fSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0In0seyJ2IjoxMTgwfSx7InYiOjc4NDYuMTJ9LHsidiI6Ni42NDkyNTQyMzcyODgxMzZ9LHsidiI6Nzg0Ni4xMn0seyJ2Ijo2LjY0OTI1NDIzNzI4ODEzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuMTIxMjg2NDQwNDg3MzhlLTA1fSx7InYiOjAuOTk3OTQwMzUyOTI2NDQ1OX1dfSx7ImMiOlt7InYiOjEzNn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFzc2lnbkFkZFZhcmlhYmxlT3AifSx7InYiOiJBZGFtXzEvQWRhbS9Bc3NpZ25BZGRWYXJpYWJsZU9wIn0seyJ2IjoxMTgwfSx7InYiOjc4NDIuNDA1fSx7InYiOjYuNjQ2MTA1OTMyMjAzMzg5NX0seyJ2Ijo3ODQyLjQwNX0seyJ2Ijo2LjY0NjEwNTkzMjIwMzM4OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjExNjk2NzY3MTU3NjU4ZS0wNX0seyJ2IjowLjk5ODAzMTUyMjYwMzE2MTZ9XX0seyJjIjpbeyJ2IjoxMzd9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV80L01hdE11bC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTE4MH0seyJ2Ijo3NjA3Ljc3Mn0seyJ2Ijo2LjQ0NzI2NDQwNjc3OTY2MX0seyJ2Ijo3NjA3Ljc3Mn0seyJ2Ijo2LjQ0NzI2NDQwNjc3OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguODQ0MjAxNjY3MzEwNjY1ZS0wNX0seyJ2IjowLjk5ODExOTk2NDYxOTgzNDh9XX0seyJjIjpbeyJ2IjoxMzh9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWxfNSJ9LHsidiI6MTE4MH0seyJ2Ijo3NTcyLjkxNn0seyJ2Ijo2LjQxNzcyNTQyMzcyODgxNH0seyJ2Ijo3NTcyLjkxNn0seyJ2Ijo2LjQxNzcyNTQyMzcyODgxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguODAzNjgwODAzNDczNTU1ZS0wNX0seyJ2IjowLjk5ODIwODAwMTQyNzg2OTV9XX0seyJjIjpbeyJ2IjoxMzl9LHsidiI6Ikhvc3QifSx7InYiOiJOb3RFcXVhbCJ9LHsidiI6IlJhZ2dlZE1hc2svY291bnRfbm9uemVyby9Ob3RFcXVhbCJ9LHsidiI6MTB9LHsidiI6NzUxNi40MzF9LHsidiI6NzUxLjY0MzF9LHsidiI6NzUxNi40MzF9LHsidiI6NzUxLjY0MzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjczODAxNTc1MzE1Njg0N2UtMDV9LHsidiI6MC45OTgyOTUzODE1ODU0MDF9XX0seyJjIjpbeyJ2IjoxNDB9LHsidiI6Ikhvc3QifSx7InYiOiJBZGROIn0seyJ2IjoiQWRkTl82In0seyJ2IjoxMTgwfSx7InYiOjc0MDMuMDU5fSx7InYiOjYuMjczNzc4ODEzNTU5MzIyfSx7InYiOjc0MDMuMDU5fSx7InYiOjYuMjczNzc4ODEzNTU5MzIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OC42MDYyMTgzMTg3MTM5NzJlLTA1fSx7InYiOjAuOTk4MzgxNDQzNzY4NTg4Mn1dfSx7ImMiOlt7InYiOjE0MX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFzc2lnbkFkZFZhcmlhYmxlT3AifSx7InYiOiJBZGFtL0FkYW0vQXNzaWduQWRkVmFyaWFibGVPcCJ9LHsidiI6MTE4MH0seyJ2Ijo3NDAwLjYwM30seyJ2Ijo2LjI3MTY5NzQ1NzYyNzExOX0seyJ2Ijo3NDAwLjYwM30seyJ2Ijo2LjI3MTY5NzQ1NzYyNzExOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguNjAzMzYzMTY0ODkyOTk2ZS0wNX0seyJ2IjowLjk5ODQ2NzQ3NzQwMDIzNzF9XX0seyJjIjpbeyJ2IjoxNDJ9LHsidiI6Ikhvc3QifSx7InYiOiJOZWcifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9OZWcifSx7InYiOjExODB9LHsidiI6NzI3OS4zNjd9LHsidiI6Ni4xNjg5NTUwODQ3NDU3NjN9LHsidiI6NzI3OS4zNjd9LHsidiI6Ni4xNjg5NTUwODQ3NDU3NjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjQ2MjQyMzY1ODExNzgwOWUtMDV9LHsidiI6MC45OTg1NTIxMDE2MzY4MTgzfV19LHsiYyI6W3sidiI6MTQzfSx7InYiOiJIb3N0In0seyJ2IjoiQWRkVjIifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9hZGQifSx7InYiOjExODB9LHsidiI6NjY3Ny4yNTd9LHsidiI6NS42NTg2OTIzNzI4ODEzNTV9LHsidiI6NjY3Ny4yNTd9LHsidiI6NS42NTg2OTIzNzI4ODEzNTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3Ljc2MjQ1NzU4ODQzMjE3M2UtMDV9LHsidiI6MC45OTg2Mjk3MjYyMTI3MDI2fV19LHsiYyI6W3sidiI6MTQ0fSx7InYiOiJIb3N0In0seyJ2IjoiUm91bmQifSx7InYiOiJQYXJ0aXRpb25lZENhbGwvUm91bmQifSx7InYiOjEwfSx7InYiOjY1NzguMzM3fSx7InYiOjY1Ny44MzM3fSx7InYiOjY1NzguMzM3fSx7InYiOjY1Ny44MzM3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny42NDc0NjA5MjA2OTE1NTdlLTA1fSx7InYiOjAuOTk4NzA2MjAwODIxOTA5NX1dfSx7ImMiOlt7InYiOjE0NX0seyJ2IjoiSG9zdCJ9LHsidiI6IkdyZWF0ZXJFcXVhbCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9HcmVhdGVyRXF1YWwifSx7InYiOjExODB9LHsidiI6NjM5NS41MTV9LHsidiI6NS40MTk5Mjc5NjYxMDE2OTV9LHsidiI6NjM5NS41MTV9LHsidiI6NS40MTk5Mjc5NjYxMDE2OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjQzNDkyNjMzOTMxNTk0OWUtMDV9LHsidiI6MC45OTg3ODA1NTAwODUzMDI2fV19LHsiYyI6W3sidiI6MTQ2fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkVjIifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL2FkZCJ9LHsidiI6MTE4MH0seyJ2Ijo2MzQ0LjcwNX0seyJ2Ijo1LjM3Njg2ODY0NDA2Nzc5Nn0seyJ2Ijo2MzQ0LjcwNX0seyJ2Ijo1LjM3Njg2ODY0NDA2Nzc5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuMzc1ODU4NjAwODYxNjM0ZS0wNX0seyJ2IjowLjk5ODg1NDMwODY3MTMxMTN9XX0seyJjIjpbeyJ2IjoxNDd9LHsidiI6Ikhvc3QifSx7InYiOiJMb2cxcCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL0xvZzFwIn0seyJ2IjoxMTgwfSx7InYiOjYxMzMuMDg3fSx7InYiOjUuMTk3NTMxMzU1OTMyMjAzfSx7InYiOjYxMzMuMDg3fSx7InYiOjUuMTk3NTMxMzU1OTMyMjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny4xMjk4NDgwMzg0NDgyMzFlLTA1fSx7InYiOjAuOTk4OTI1NjA3MTUxNjk1OH1dfSx7ImMiOlt7InYiOjE0OH0seyJ2IjoiSG9zdCJ9LHsidiI6Ikxlc3MifSx7InYiOiJMZXNzIn0seyJ2IjoxMH0seyJ2Ijo1NjE4LjMyOX0seyJ2Ijo1NjEuODMyOX0seyJ2Ijo1NjE4LjMyOX0seyJ2Ijo1NjEuODMyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuNTMxNDMwNTgzMDAxMTU1ZS0wNX0seyJ2IjowLjk5ODk5MDkyMTQ1NzUyNTh9XX0seyJjIjpbeyJ2IjoxNDl9LHsidiI6Ikhvc3QifSx7InYiOiJFaW5zdW0ifSx7InYiOiJQYXJ0aXRpb25lZENhbGwvZWluc3VtL0VpbnN1bSJ9LHsidiI6MTB9LHsidiI6NTM3MS43NzF9LHsidiI6NTM3LjE3NzF9LHsidiI6NTM3MS43NzF9LHsidiI6NTM3LjE3NzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo2LjI0NDgwMTUwNDkwOTg1OWUtMDV9LHsidiI6MC45OTkwNTMzNjk0NzI1NzQ4fV19LHsiYyI6W3sidiI6MTUwfSx7InYiOiJIb3N0In0seyJ2IjoiTG9nMXAifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvTG9nMXAifSx7InYiOjExODB9LHsidiI6NTA2Mi4zMTN9LHsidiI6NC4yOTAwOTU3NjI3MTE4NjR9LHsidiI6NTA2Mi4zMTN9LHsidiI6NC4yOTAwOTU3NjI3MTE4NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1Ljg4NTA0OTc5ODQyMzA0MmUtMDV9LHsidiI6MC45OTkxMTIyMTk5NzA1NTkxfV19LHsiYyI6W3sidiI6MTUxfSx7InYiOiJIb3N0In0seyJ2IjoiTWluaW11bSJ9LHsidiI6ImNsaXBfYnlfdmFsdWUvTWluaW11bSJ9LHsidiI6MjF9LHsidiI6NTAzNi42NjZ9LHsidiI6MjM5Ljg0MTIzODA5NTIzODF9LHsidiI6NTAzNi42NjZ9LHsidiI6MjM5Ljg0MTIzODA5NTIzODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1Ljg1NTIzNDU5ODg5MjY3NzdlLTA1fSx7InYiOjAuOTk5MTcwNzcyMzE2NTQ4fV19LHsiYyI6W3sidiI6MTUyfSx7InYiOiJIb3N0In0seyJ2IjoiRXhwIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvRXhwIn0seyJ2IjoxMTgwfSx7InYiOjQ5NjEuNzIzfSx7InYiOjQuMjA0ODQ5OTk5OTk5OTk5NX0seyJ2Ijo0OTYxLjcyM30seyJ2Ijo0LjIwNDg0OTk5OTk5OTk5OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1Ljc2ODExMTcxOTA4NTkxMzRlLTA1fSx7InYiOjAuOTk5MjI4NDUzNDMzNzM4OX1dfSx7ImMiOlt7InYiOjE1M30seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzEifSx7InYiOjExODB9LHsidiI6NDYxMS42NDJ9LHsidiI6My45MDgxNzExODY0NDA2Nzh9LHsidiI6NDYxMS42NDJ9LHsidiI6My45MDgxNzExODY0NDA2Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1LjM2MTEzNDg4NDg4MzQ5N2UtMDV9LHsidiI6MC45OTkyODIwNjQ3ODI1ODc3fV19LHsiYyI6W3sidiI6MTU0fSx7InYiOiJIb3N0In0seyJ2IjoiTWF4aW11bSJ9LHsidiI6ImNsaXBfYnlfdmFsdWUifSx7InYiOjIxfSx7InYiOjQ1NDAuMTc1fSx7InYiOjIxNi4xOTg4MDk1MjM4MDk1M30seyJ2Ijo0NTQwLjE3NX0seyJ2IjoyMTYuMTk4ODA5NTIzODA5NTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1LjI3ODA1MjkzMTI1MDA3ZS0wNX0seyJ2IjowLjk5OTMzNDg0NTMxMTkwMDJ9XX0seyJjIjpbeyJ2IjoxNTV9LHsidiI6Ikhvc3QifSx7InYiOiJHYXRoZXJWMiJ9LHsidiI6IkdhdGhlclYyIn0seyJ2IjozMH0seyJ2Ijo0NDY4Ljk1Nn0seyJ2IjoxNDguOTY1Mn0seyJ2Ijo0NDY4Ljk1Nn0seyJ2IjoxNDguOTY1Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjUuMTk1MjU5MjgzMDUxMzMzZS0wNX0seyJ2IjowLjk5OTM4Njc5NzkwNDczMDd9XX0seyJjIjpbeyJ2IjoxNTZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2UvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMTgwfSx7InYiOjQyMjMuOTM5fSx7InYiOjMuNTc5NjA5MzIyMDMzODk4N30seyJ2Ijo0MjIzLjkzOX0seyJ2IjozLjU3OTYwOTMyMjAzMzg5ODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjkxMDQyMTY1MTIyOTYzMWUtMDV9LHsidiI6MC45OTk0MzU5MDIxMjEyNDN9XX0seyJjIjpbeyJ2IjoxNTd9LHsidiI6Ikhvc3QifSx7InYiOiJTdWIifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9zdWIifSx7InYiOjExODB9LHsidiI6Mzg5My43Nn0seyJ2IjozLjI5OTc5NjYxMDE2OTQ5MTZ9LHsidiI6Mzg5My43Nn0seyJ2IjozLjI5OTc5NjYxMDE2OTQ5MTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjUyNjU4MTMyODE2MTE5OWUtMDV9LHsidiI6MC45OTk0ODExNjc5MzQ1MjQ2fV19LHsiYyI6W3sidiI6MTU4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhbERpdiJ9LHsidiI6IlJlYWxEaXYifSx7InYiOjYzfSx7InYiOjM4NTguODYyfSx7InYiOjYxLjI1MTc3Nzc3Nzc3Nzc4fSx7InYiOjM4NTguODYyfSx7InYiOjYxLjI1MTc3Nzc3Nzc3Nzc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC40ODYwMTE2Mzg0MDM2OTdlLTA1fSx7InYiOjAuOTk5NTI2MDI4MDUwOTA4Nn1dfSx7ImMiOlt7InYiOjE1OX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik5lZyJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9OZWcifSx7InYiOjExODB9LHsidiI6MzQzNi40NjJ9LHsidiI6Mi45MTIyNTU5MzIyMDMzODk2fSx7InYiOjM0MzYuNDYyfSx7InYiOjIuOTEyMjU1OTMyMjAzMzg5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuOTk0OTYyMzgxODk3MDU4ZS0wNX0seyJ2IjowLjk5OTU2NTk3NzY3NDcyNzV9XX0seyJjIjpbeyJ2IjoxNjB9LHsidiI6Ikhvc3QifSx7InYiOiJTZWxlY3QifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL1NlbGVjdF8yIn0seyJ2IjoxMTgwfSx7InYiOjMxNjUuMTYxfSx7InYiOjIuNjgyMzM5ODMwNTA4NDc0N30seyJ2IjozMTY1LjE2MX0seyJ2IjoyLjY4MjMzOTgzMDUwODQ3NDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjY3OTU2OTAyNDA4NTcyNGUtMDV9LHsidiI6MC45OTk2MDI3NzMzNjQ5Njg0fV19LHsiYyI6W3sidiI6MTYxfSx7InYiOiJIb3N0In0seyJ2IjoiTWluaW11bSJ9LHsidiI6IlBhcnRpdGlvbmVkQ2FsbC9jbGlwX2J5X3ZhbHVlL01pbmltdW0ifSx7InYiOjEwfSx7InYiOjMwOTEuNjQ4fSx7InYiOjMwOS4xNjQ4fSx7InYiOjMwOTEuNjQ4fSx7InYiOjMwOS4xNjQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My41OTQxMDg1NTA2MTYwOTJlLTA1fSx7InYiOjAuOTk5NjM4NzE0NDUwNDc0Nn1dfSx7ImMiOlt7InYiOjE2Mn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1ha2VJdGVyYXRvciJ9LHsidiI6Ik1ha2VJdGVyYXRvciJ9LHsidiI6MTB9LHsidiI6MzAxNi40MDR9LHsidiI6MzAxLjY0MDR9LHsidiI6MzAxNi40MDR9LHsidiI6MzAxLjY0MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjUwNjYzNTc1MTcxMzE5MDZlLTA1fSx7InYiOjAuOTk5NjczNzgwODA3OTkxN31dfSx7ImMiOlt7InYiOjE2M30seyJ2IjoiSG9zdCJ9LHsidiI6Ik1pbiJ9LHsidiI6Ik1pbiJ9LHsidiI6MjF9LHsidiI6MjUwMi4xfSx7InYiOjExOS4xNDc2MTkwNDc2MTkwNX0seyJ2IjoyNTAyLjF9LHsidiI6MTE5LjE0NzYxOTA0NzYxOTA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi45MDg3NDYwODEyMTUxMDdlLTA1fSx7InYiOjAuOTk5NzAyODY4MjY4ODA0fV19LHsiYyI6W3sidiI6MTY0fSx7InYiOiJIb3N0In0seyJ2IjoiU3ViIn0seyJ2IjoiU3ViIn0seyJ2IjoxMDV9LHsidiI6MjQ1OS42MDZ9LHsidiI6MjMuNDI0ODE5MDQ3NjE5MDV9LHsidiI6MjQ1OS42MDZ9LHsidiI6MjMuNDI0ODE5MDQ3NjE5MDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjg1OTM0NTg3NDk5ODI2NzVlLTA1fSx7InYiOjAuOTk5NzMxNDYxNzI3NTUzOX1dfSx7ImMiOlt7InYiOjE2NX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1heGltdW0ifSx7InYiOiJQYXJ0aXRpb25lZENhbGwvY2xpcF9ieV92YWx1ZSJ9LHsidiI6MTB9LHsidiI6MjMxOC4wNDZ9LHsidiI6MjMxLjgwNDZ9LHsidiI6MjMxOC4wNDZ9LHsidiI6MjMxLjgwNDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjY5NDc3OTI3Mjg0MTM1NDdlLTA1fSx7InYiOjAuOTk5NzU4NDA5NTIwMjgyM31dfSx7ImMiOlt7InYiOjE2Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IkRlbGV0ZUl0ZXJhdG9yIn0seyJ2IjoiRGVsZXRlSXRlcmF0b3IifSx7InYiOjEwfSx7InYiOjIzMDMuMDI4fSx7InYiOjIzMC4zMDI4fSx7InYiOjIzMDMuMDI4fSx7InYiOjIzMC4zMDI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi42NzczMjA1MTg3MzU3MjhlLTA1fSx7InYiOjAuOTk5Nzg1MTgyNzI1NDY5N31dfSx7ImMiOlt7InYiOjE2N30seyJ2IjoiSG9zdCJ9LHsidiI6IkZsb29yIn0seyJ2IjoiRmxvb3IifSx7InYiOjIxfSx7InYiOjIyODcuNjIzfSx7InYiOjEwOC45MzQ0Mjg1NzE0Mjg1N30seyJ2IjoyMjg3LjYyM30seyJ2IjoxMDguOTM0NDI4NTcxNDI4NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjY1OTQxMTg2ODY0OTM1M2UtMDV9LHsidiI6MC45OTk4MTE3NzY4NDQxNTYxfV19LHsiYyI6W3sidiI6MTY4fSx7InYiOiJIb3N0In0seyJ2IjoiTWF4In0seyJ2IjoiTWF4In0seyJ2IjoyMX0seyJ2IjoyMjczLjk5Mn0seyJ2IjoxMDguMjg1MzMzMzMzMzMzMzR9LHsidiI6MjI3My45OTJ9LHsidiI6MTA4LjI4NTMzMzMzMzMzMzM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi42NDM1NjU1MzI0Mzg1NTMzZS0wNX0seyJ2IjowLjk5OTgzODIxMjQ5OTQ4MDV9XX0seyJjIjpbeyJ2IjoxNjl9LHsidiI6Ikhvc3QifSx7InYiOiJJZGVudGl0eSJ9LHsidiI6IklkZW50aXR5In0seyJ2IjoyMzgwfSx7InYiOjIwMTUuNDM0fSx7InYiOjAuODQ2ODIxMDA4NDAzMzYxNH0seyJ2IjoyMDE1LjQzNH0seyJ2IjowLjg0NjgyMTAwODQwMzM2MTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjM0Mjk4NjE5MTM3ODMxNzNlLTA1fSx7InYiOjAuOTk5ODYxNjQyMzYxMzk0M31dfSx7ImMiOlt7InYiOjE3MH0seyJ2IjoiSG9zdCJ9LHsidiI6IkFicyJ9LHsidiI6IkFicyJ9LHsidiI6MTB9LHsidiI6MTg0OC4zMjN9LHsidiI6MTg0LjgzMjN9LHsidiI6MTg0OC4zMjN9LHsidiI6MTg0LjgzMjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjE0ODcxNTk5MTc5NDc5MjZlLTA1fSx7InYiOjAuOTk5ODgzMTI5NTIxMzEyMn1dfSx7ImMiOlt7InYiOjE3MX0seyJ2IjoiSG9zdCJ9LHsidiI6IkNvbmNhdFYyIn0seyJ2IjoiUmFnZ2VkTWFzay9SYWdnZWRGcm9tUm93TGVuZ3Rocy9Sb3dQYXJ0aXRpb25Gcm9tUm93TGVuZ3Rocy9jb25jYXQifSx7InYiOjEwfSx7InYiOjEzMTkuMzA4fSx7InYiOjEzMS45MzA4fSx7InYiOjEzMTkuMzA4fSx7InYiOjEzMS45MzA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS41MzM3MjQ0NjE0MTg3MDQ2ZS0wNX0seyJ2IjowLjk5OTg5ODQ2Njc2NTkyNjR9XX0seyJjIjpbeyJ2IjoxNzJ9LHsidiI6Ikhvc3QifSx7InYiOiJNaW5pbXVtIn0seyJ2IjoiTWluaW11bSJ9LHsidiI6MjF9LHsidiI6MTI3My44NDh9LHsidiI6NjAuNjU5NDI4NTcxNDI4NTd9LHsidiI6MTI3My44NDh9LHsidiI6NjAuNjU5NDI4NTcxNDI4NTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjQ4MDg3NjIxNTIwNDcwODdlLTA1fSx7InYiOjAuOTk5OTEzMjc1NTI4MDc4NX1dfSx7ImMiOlt7InYiOjE3M30seyJ2IjoiSG9zdCJ9LHsidiI6IlNlbGVjdFYyIn0seyJ2IjoiU2VsZWN0VjIifSx7InYiOjg0fSx7InYiOjgxMy40OTN9LHsidiI6OS42ODQ0NDA0NzYxOTA0Nzh9LHsidiI6ODEzLjQ5M30seyJ2Ijo5LjY4NDQ0MDQ3NjE5MDQ3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNDU3MDM0Mzk0NDkyMzExZS0wNn0seyJ2IjowLjk5OTkyMjczMjU2MjQ3M31dfSx7ImMiOlt7InYiOjE3NH0seyJ2IjoiSG9zdCJ9LHsidiI6IlN0cmlkZWRTbGljZSJ9LHsidiI6IlN0cmlkZWRTbGljZSJ9LHsidiI6ODR9LHsidiI6NjA4Ljk5fSx7InYiOjcuMjQ5ODgwOTUyMzgwOTUzfSx7InYiOjYwOC45OX0seyJ2Ijo3LjI0OTg4MDk1MjM4MDk1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuMDc5NjQyMjA0NTQ0OTM0NmUtMDZ9LHsidiI6MC45OTk5Mjk4MTIyMDQ2Nzc2fV19LHsiYyI6W3sidiI6MTc1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6NzB9LHsidiI6NTk2LjE1Nn0seyJ2Ijo4LjUxNjUxNDI4NTcxNDI4NX0seyJ2Ijo1OTYuMTU2fSx7InYiOjguNTE2NTE0Mjg1NzE0Mjg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni45MzA0NDQxNDIwOTIxMzVlLTA2fSx7InYiOjAuOTk5OTM2NzQyNjQ4ODE5N31dfSx7ImMiOlt7InYiOjE3Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzUvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MzQ4LjQzN30seyJ2IjozNC44NDM3fSx7InYiOjM0OC40Mzd9LHsidiI6MzQuODQzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMDUwNjU2NDgxNzU2NzE3ZS0wNn0seyJ2IjowLjk5OTk0MDc5MzMwNTMwMTV9XX0seyJjIjpbeyJ2IjoxNzd9LHsidiI6Ikhvc3QifSx7InYiOiJBbm9ueW1vdXNJdGVyYXRvclYyIn0seyJ2IjoiQW5vbnltb3VzSXRlcmF0b3JWMiJ9LHsidiI6MTB9LHsidiI6MzM5LjY2OX0seyJ2IjozMy45NjY4OTk5OTk5OTk5OTV9LHsidiI6MzM5LjY2OX0seyJ2IjozMy45NjY4OTk5OTk5OTk5OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjk0ODcyNjU2MDMzMDMzOWUtMDZ9LHsidiI6MC45OTk5NDQ3NDIwMzE4NjE4fV19LHsiYyI6W3sidiI6MTc4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzEvTWF0TXVsXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjMyMy4zNjV9LHsidiI6MzIuMzM2NX0seyJ2IjozMjMuMzY1fSx7InYiOjMyLjMzNjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjc1OTE4ODk4NzQ1OTAyN2UtMDZ9LHsidiI6MC45OTk5NDg1MDEyMjA4NDkyfV19LHsiYyI6W3sidiI6MTc5fSx7InYiOiJIb3N0In0seyJ2IjoiQ29uY2F0VjIifSx7InYiOiJDb25jYXRWMiJ9LHsidiI6NDJ9LHsidiI6Mjg0LjgxN30seyJ2Ijo2Ljc4MTM1NzE0Mjg1NzE0M30seyJ2IjoyODQuODE3fSx7InYiOjYuNzgxMzU3MTQyODU3MTQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4zMTEwNjAwNDAwMjAxNTZlLTA2fSx7InYiOjAuOTk5OTUxODEyMjgwODg5M31dfSx7ImMiOlt7InYiOjE4MH0seyJ2IjoiSG9zdCJ9LHsidiI6IlNoYXBlIn0seyJ2IjoiU2hhcGUifSx7InYiOjEwNH0seyJ2IjoyNzguMTM0fSx7InYiOjIuNjc0MzY1Mzg0NjE1Mzg0OH0seyJ2IjoyNzguMTM0fSx7InYiOjIuNjc0MzY1Mzg0NjE1Mzg0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMjMzMzY4NzAwNTAyMzA4NWUtMDZ9LHsidiI6MC45OTk5NTUwNDU2NDk1ODk3fV19LHsiYyI6W3sidiI6MTgxfSx7InYiOiJIb3N0In0seyJ2IjoiRXF1YWwifSx7InYiOiJFcXVhbCJ9LHsidiI6NjN9LHsidiI6MjYwLjUwMn0seyJ2Ijo0LjEzNDk1MjM4MDk1MjM4MX0seyJ2IjoyNjAuNTAyfSx7InYiOjQuMTM0OTUyMzgwOTUyMzgxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4wMjgzOTI4MzY2MTIwMzdlLTA2fSx7InYiOjAuOTk5OTU4MDc0MDQyNDI2M31dfSx7ImMiOlt7InYiOjE4Mn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1lYW4ifSx7InYiOiJNZWFuIn0seyJ2IjoxMH0seyJ2IjoyNTIuMDU5fSx7InYiOjI1LjIwNTl9LHsidiI6MjUyLjA1OX0seyJ2IjoyNS4yMDU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi45MzAyNDExMTE0MDY0MTMzZS0wNn0seyJ2IjowLjk5OTk2MTAwNDI4MzUzNzd9XX0seyJjIjpbeyJ2IjoxODN9LHsidiI6Ikhvc3QifSx7InYiOiJQYWNrIn0seyJ2IjoiUGFjayJ9LHsidiI6NjJ9LHsidiI6MjM3LjM4M30seyJ2IjozLjgyODc1ODA2NDUxNjEyOX0seyJ2IjoyMzcuMzgzfSx7InYiOjMuODI4NzU4MDY0NTE2MTI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi43NTk2MjkzOTUyOTYyOTRlLTA2fSx7InYiOjAuOTk5OTYzNzYzOTEyOTMzMX1dfSx7ImMiOlt7InYiOjE4NH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzcvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoyMTMuNDYzfSx7InYiOjIxLjM0NjN9LHsidiI6MjEzLjQ2M30seyJ2IjoyMS4zNDYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi40ODE1NTQxNTM0NDg3ODQ0ZS0wNn0seyJ2IjowLjk5OTk2NjI0NTQ2NzA4NjZ9XX0seyJjIjpbeyJ2IjoxODV9LHsidiI6Ikhvc3QifSx7InYiOiJUcmFuc3Bvc2UifSx7InYiOiJUcmFuc3Bvc2UifSx7InYiOjIxfSx7InYiOjE4OC4yNTR9LHsidiI6OC45NjQ0NzYxOTA0NzYxOX0seyJ2IjoxODguMjU0fSx7InYiOjguOTY0NDc2MTkwNDc2MTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjE4ODQ5NDAwNDEyODgwNjhlLTA2fSx7InYiOjAuOTk5OTY4NDMzOTYxMDkwN31dfSx7ImMiOlt7InYiOjE4Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiQWRkVjIifSx7InYiOjQyfSx7InYiOjE4Ny41NzF9LHsidiI6NC40NjU5NzYxOTA0NzYxOTF9LHsidiI6MTg3LjU3MX0seyJ2Ijo0LjQ2NTk3NjE5MDQ3NjE5MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuMTgwNTUzOTc5NDU1NjUyNGUtMDZ9LHsidiI6MC45OTk5NzA2MTQ1MTUwNzAyfV19LHsiYyI6W3sidiI6MTg3fSx7InYiOiJIb3N0In0seyJ2IjoiU2h1ZmZsZURhdGFzZXRWMyJ9LHsidiI6IlNodWZmbGVEYXRhc2V0VjMvXzYifSx7InYiOjEwfSx7InYiOjEwOC44ODZ9LHsidiI6MTAuODg4Nn0seyJ2IjoxMDguODg2fSx7InYiOjEwLjg4ODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjI2NTgyMzYxMTM2MzIwNzVlLTA2fSx7InYiOjAuOTk5OTcxODgwMzM4NjgxNn1dfSx7ImMiOlt7InYiOjE4OH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc2hhcGUifSx7InYiOiJSZXNoYXBlIn0seyJ2Ijo0Mn0seyJ2IjoxMDguMDU0fSx7InYiOjIuNTcyNzE0Mjg1NzE0Mjg2fSx7InYiOjEwOC4wNTR9LHsidiI6Mi41NzI3MTQyODU3MTQyODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjI1NjE1MTQyOTAzODA3NjdlLTA2fSx7InYiOjAuOTk5OTczMTM2NDkwMTEwNX1dfSx7ImMiOlt7InYiOjE4OX0seyJ2IjoiSG9zdCJ9LHsidiI6IlNxdWVlemUifSx7InYiOiJTcXVlZXplIn0seyJ2IjoxMH0seyJ2Ijo5OC44NzN9LHsidiI6OS44ODczfSx7InYiOjk4Ljg3M30seyJ2Ijo5Ljg4NzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjE0OTQyMDI5MjEwNjU1NTZlLTA2fSx7InYiOjAuOTk5OTc0Mjg1OTEwNDAyNn1dfSx7ImMiOlt7InYiOjE5MH0seyJ2IjoiSG9zdCJ9LHsidiI6IkZpbGwifSx7InYiOiJGaWxsIn0seyJ2IjoxMH0seyJ2Ijo5Ni42Nzh9LHsidiI6OS42Njc4fSx7InYiOjk2LjY3OH0seyJ2Ijo5LjY2Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjEyMzkwMjkzNjA5MjUzODhlLTA2fSx7InYiOjAuOTk5OTc1NDA5ODEzMzM4N31dfSx7ImMiOlt7InYiOjE5MX0seyJ2IjoiSG9zdCJ9LHsidiI6IkJyb2FkY2FzdFRvIn0seyJ2IjoiQnJvYWRjYXN0VG8ifSx7InYiOjQyfSx7InYiOjg5Ljc4OH0seyJ2IjoyLjEzNzgwOTUyMzgwOTUyMzZ9LHsidiI6ODkuNzg4fSx7InYiOjIuMTM3ODA5NTIzODA5NTIzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMDQzODA1MTc2MjEyNTQ5NmUtMDZ9LHsidiI6MC45OTk5NzY0NTM2MTg1MTQ4fV19LHsiYyI6W3sidiI6MTkyfSx7InYiOiJIb3N0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0L18xIn0seyJ2IjoxMH0seyJ2Ijo4MS40MDh9LHsidiI6OC4xNDA4fSx7InYiOjgxLjQwOH0seyJ2Ijo4LjE0MDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjQ2Mzg1ODM5ODEyNzk1ZS0wN30seyJ2IjowLjk5OTk3NzQwMDAwNDM1NDZ9XX0seyJjIjpbeyJ2IjoxOTN9LHsidiI6Ikhvc3QifSx7InYiOiJNYXhpbXVtIn0seyJ2IjoiTWF4aW11bSJ9LHsidiI6NDJ9LHsidiI6NzguNDA3fSx7InYiOjEuODY2ODMzMzMzMzMzMzMzM30seyJ2Ijo3OC40MDd9LHsidiI6MS44NjY4MzMzMzMzMzMzMzMzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS4xMTQ5ODU1NzE3MTMwNzdlLTA3fSx7InYiOjAuOTk5OTc4MzExNTAyOTExOH1dfSx7ImMiOlt7InYiOjE5NH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmdlIn0seyJ2IjoiUmFuZ2UifSx7InYiOjQyfSx7InYiOjc3LjA3MX0seyJ2IjoxLjgzNTAyMzgwOTUyMzgwOTR9LHsidiI6NzcuMDcxfSx7InYiOjEuODM1MDIzODA5NTIzODA5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguOTU5NjcyNjQzOTkyMjI2ZS0wN30seyJ2IjowLjk5OTk3OTIwNzQ3MDE3NjJ9XX0seyJjIjpbeyJ2IjoxOTV9LHsidiI6Ikhvc3QifSx7InYiOiJBZGRWMiJ9LHsidiI6IkFkYW0vYWRkIn0seyJ2IjoxMH0seyJ2Ijo3Mi40MzN9LHsidiI6Ny4yNDMzMDAwMDAwMDAwMDA1fSx7InYiOjcyLjQzM30seyJ2Ijo3LjI0MzMwMDAwMDAwMDAwMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjQyMDQ5NDk4MDI0Mjc1ZS0wN30seyJ2IjowLjk5OTk4MDA0OTUxOTY3NDJ9XX0seyJjIjpbeyJ2IjoxOTZ9LHsidiI6Ikhvc3QifSx7InYiOiJHcmVhdGVyRXF1YWwifSx7InYiOiJHcmVhdGVyRXF1YWwifSx7InYiOjIxfSx7InYiOjcxLjg2NX0seyJ2IjozLjQyMjE0Mjg1NzE0Mjg1Njd9LHsidiI6NzEuODY1fSx7InYiOjMuNDIyMTQyODU3MTQyODU2N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguMzU0NDYzNzM1NTIzMTA2ZS0wN30seyJ2IjowLjk5OTk4MDg4NDk2NjA0Nzh9XX0seyJjIjpbeyJ2IjoxOTd9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9DYXN0XzIvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjY3LjUyOX0seyJ2Ijo2Ljc1Mjg5OTk5OTk5OTk5OTV9LHsidiI6NjcuNTI5fSx7InYiOjYuNzUyODk5OTk5OTk5OTk5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuODUwMzk0MjMzNTc4NzkyZS0wN30seyJ2IjowLjk5OTk4MTY3MDAwNTQ3MTF9XX0seyJjIjpbeyJ2IjoxOTh9LHsidiI6Ikhvc3QifSx7InYiOiJTbGljZSJ9LHsidiI6IlNsaWNlIn0seyJ2IjoyMX0seyJ2Ijo2NS4xMzV9LHsidiI6My4xMDE2NjY2NjY2NjY2Njd9LHsidiI6NjUuMTM1fSx7InYiOjMuMTAxNjY2NjY2NjY2NjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny41NzIwODY0ODczNDg0NjhlLTA3fSx7InYiOjAuOTk5OTgyNDI3MjE0MTE5OX1dfSx7ImMiOlt7InYiOjE5OX0seyJ2IjoiSG9zdCJ9LHsidiI6Ilplcm9zTGlrZSJ9LHsidiI6Ilplcm9zTGlrZSJ9LHsidiI6MjF9LHsidiI6NTguOTkxfSx7InYiOjIuODA5MDk1MjM4MDk1MjM4fSx7InYiOjU4Ljk5MX0seyJ2IjoyLjgwOTA5NTIzODA5NTIzOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuODU3ODMzMDIzMzM4ODExZS0wN30seyJ2IjowLjk5OTk4MzExMjk5NzQyMjN9XX0seyJjIjpbeyJ2IjoyMDB9LHsidiI6Ikhvc3QifSx7InYiOiJCcm9hZGNhc3RBcmdzIn0seyJ2IjoiQnJvYWRjYXN0QXJncyJ9LHsidiI6MjF9LHsidiI6NTcuOTI4fSx7InYiOjIuNzU4NDc2MTkwNDc2MTkwM30seyJ2Ijo1Ny45Mjh9LHsidiI6Mi43NTg0NzYxOTA0NzYxOTAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni43MzQyNTY5NDM4NzIyOTZlLTA3fSx7InYiOjAuOTk5OTgzNzg2NDIzMTE2N31dfSx7ImMiOlt7InYiOjIwMX0seyJ2IjoiSG9zdCJ9LHsidiI6IlBsYWNlaG9sZGVyIn0seyJ2IjoiUGxhY2Vob2xkZXIvXzAifSx7InYiOjIwfSx7InYiOjU2Ljc1NX0seyJ2IjoyLjgzNzc1fSx7InYiOjU2Ljc1NX0seyJ2IjoyLjgzNzc1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni41OTc4OTMxMjMzNTA5MjJlLTA3fSx7InYiOjAuOTk5OTg0NDQ2MjEyNDI5fV19LHsiYyI6W3sidiI6MjAyfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0XzMifSx7InYiOjEwfSx7InYiOjUwLjY2fSx7InYiOjUuMDY2fSx7InYiOjUwLjY2fSx7InYiOjUuMDY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS44ODkzMzYwMTY3MjAyNDdlLTA3fSx7InYiOjAuOTk5OTg1MDM1MTQ2MDMwN31dfSx7ImMiOlt7InYiOjIwM30seyJ2IjoiSG9zdCJ9LHsidiI6IkV4cGFuZERpbXMifSx7InYiOiJFeHBhbmREaW1zIn0seyJ2Ijo0Mn0seyJ2Ijo0NC4wMTV9LHsidiI6MS4wNDc5NzYxOTA0NzYxOTA0fSx7InYiOjQ0LjAxNX0seyJ2IjoxLjA0Nzk3NjE5MDQ3NjE5MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1LjExNjg0MDIwNDgxNTI3M2UtMDd9LHsidiI6MC45OTk5ODU1NDY4MzAwNTExfV19LHsiYyI6W3sidiI6MjA0fSx7InYiOiJIb3N0In0seyJ2IjoiUG93In0seyJ2IjoiQWRhbS9Qb3cifSx7InYiOjEwfSx7InYiOjQzLjA5NX0seyJ2Ijo0LjMwOTV9LHsidiI6NDMuMDk1fSx7InYiOjQuMzA5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjUuMDA5ODg4MTg4NzIwMDc2ZS0wN30seyJ2IjowLjk5OTk4NjA0NzgxODg3fV19LHsiYyI6W3sidiI6MjA1fSx7InYiOiJIb3N0In0seyJ2IjoiTWVhbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvTWVhbiJ9LHsidiI6MTB9LHsidiI6NDIuMDM2fSx7InYiOjQuMjAzNn0seyJ2Ijo0Mi4wMzZ9LHsidiI6NC4yMDM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC44ODY3NzcxMTgwMTkxOTRlLTA3fSx7InYiOjAuOTk5OTg2NTM2NDk2NTgxOX1dfSx7ImMiOlt7InYiOjIwNn0seyJ2IjoiSG9zdCJ9LHsidiI6IlN1bSJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvd2VpZ2h0ZWRfbG9zcy9TdW0ifSx7InYiOjEwfSx7InYiOjQxLjg4NX0seyJ2Ijo0LjE4ODQ5OTk5OTk5OTk5OTR9LHsidiI6NDEuODg1fSx7InYiOjQuMTg4NDk5OTk5OTk5OTk5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuODY5MjIzMDM3MTE2NjEzZS0wN30seyJ2IjowLjk5OTk4NzAyMzQxODg4NTZ9XX0seyJjIjpbeyJ2IjoyMDd9LHsidiI6Ikhvc3QifSx7InYiOiJCYXRjaERhdGFzZXRWMiJ9LHsidiI6IkJhdGNoRGF0YXNldFYyL185In0seyJ2IjoxMH0seyJ2Ijo0MS40NTN9LHsidiI6NC4xNDUzMDAwMDAwMDAwMDF9LHsidiI6NDEuNDUzfSx7InYiOjQuMTQ1MzAwMDAwMDAwMDAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC44MTkwMDIwOTA0Mjg0MzRlLTA3fSx7InYiOjAuOTk5OTg3NTA1MzE5MDk0Nn1dfSx7ImMiOlt7InYiOjIwOH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1vZGVsRGF0YXNldCJ9LHsidiI6Ik1vZGVsRGF0YXNldCJ9LHsidiI6MTB9LHsidiI6NDAuODA3fSx7InYiOjQuMDgwN30seyJ2Ijo0MC44MDd9LHsidiI6NC4wODA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC43NDM5MDMxNzQ3Nzg5ODFlLTA3fSx7InYiOjAuOTk5OTg3OTc5NzA5NDEyMX1dfSx7ImMiOlt7InYiOjIwOX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzUvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo0MC4zNzh9LHsidiI6NC4wMzc4fSx7InYiOjQwLjM3OH0seyJ2Ijo0LjAzNzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjY5NDAzMDk4NDY2NTAyNWUtMDd9LHsidiI6MC45OTk5ODg0NDkxMTI1MTA2fV19LHsiYyI6W3sidiI6MjEwfSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoibXVsIn0seyJ2IjoxMH0seyJ2Ijo0MC4yNTN9LHsidiI6NC4wMjUzfSx7InYiOjQwLjI1M30seyJ2Ijo0LjAyNTN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjY3OTQ5OTQ2MDczOTA0NzZlLTA3fSx7InYiOjAuOTk5OTg4OTE3MDYyNDU2N31dfSx7ImMiOlt7InYiOjIxMX0seyJ2IjoiSG9zdCJ9LHsidiI6IlBvdyJ9LHsidiI6IkFkYW0vUG93XzEifSx7InYiOjEwfSx7InYiOjM4LjcwNn0seyJ2IjozLjg3MDYwMDAwMDAwMDAwMDV9LHsidiI6MzguNzA2fSx7InYiOjMuODcwNjAwMDAwMDAwMDAwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuNDk5NjU3MzIwNjMxMTQ3M2UtMDd9LHsidiI6MC45OTk5ODkzNjcwMjgxODg3fV19LHsiYyI6W3sidiI6MjEyfSx7InYiOiJIb3N0In0seyJ2IjoiVGlsZSJ9LHsidiI6IlRpbGUifSx7InYiOjIwfSx7InYiOjM2LjUxNX0seyJ2IjoxLjgyNTc1fSx7InYiOjM2LjUxNX0seyJ2IjoxLjgyNTc1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC4yNDQ5NDg3NjkyNTY2MDk3ZS0wN30seyJ2IjowLjk5OTk4OTc5MTUyMzA2NTd9XX0seyJjIjpbeyJ2IjoyMTN9LHsidiI6Ikhvc3QifSx7InYiOiJTdW0ifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzIvd2VpZ2h0ZWRfbG9zcy9TdW0ifSx7InYiOjEwfSx7InYiOjM0Ljg2NX0seyJ2IjozLjQ4NjUwMDAwMDAwMDAwMDR9LHsidiI6MzQuODY1fSx7InYiOjMuNDg2NTAwMDAwMDAwMDAwNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMDUzMTMyNjUzNDMzNzA0M2UtMDd9LHsidiI6MC45OTk5OTAxOTY4MzYzMzExfV19LHsiYyI6W3sidiI6MjE0fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fMiJ9LHsidiI6MTB9LHsidiI6MzMuMjMyfSx7InYiOjMuMzIzMn0seyJ2IjozMy4yMzJ9LHsidiI6My4zMjMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My44NjMyOTI4MjQ4NjQ3MzFlLTA3fSx7InYiOjAuOTk5OTkwNTgzMTY1NjEzNX1dfSx7ImMiOlt7InYiOjIxNX0seyJ2IjoiSG9zdCJ9LHsidiI6IkNhc3QifSx7InYiOiJBZGFtL0Nhc3RfMSJ9LHsidiI6MTB9LHsidiI6MjcuODc4fSx7InYiOjIuNzg3OH0seyJ2IjoyNy44Nzh9LHsidiI6Mi43ODc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4yNDA4Nzg1OTIwNjcyNTRlLTA3fSx7InYiOjAuOTk5OTkwOTA3MjUzNDcyN31dfSx7ImMiOlt7InYiOjIxNn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2IjoiQWRhbS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MjcuNzA0fSx7InYiOjIuNzcwNH0seyJ2IjoyNy43MDR9LHsidiI6Mi43NzA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4yMjA2NTA3MTA3NjIyOTNlLTA3fSx7InYiOjAuOTk5OTkxMjI5MzE4NTQzOH1dfSx7ImMiOlt7InYiOjIxN30seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmdlIn0seyJ2IjoicmFuZ2UifSx7InYiOjEwfSx7InYiOjI3LjAxNH0seyJ2IjoyLjcwMTR9LHsidiI6MjcuMDE0fSx7InYiOjIuNzAxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMTQwNDM2Njk4NjkwODk1N2UtMDd9LHsidiI6MC45OTk5OTE1NDMzNjIyMTM2fV19LHsiYyI6W3sidiI6MjE4fSx7InYiOiJIb3N0In0seyJ2IjoiU2h1ZmZsZURhdGFzZXRWMyJ9LHsidiI6IlNodWZmbGVEYXRhc2V0VjMifSx7InYiOjF9LHsidiI6MjYuNTg4fSx7InYiOjI2LjU4OH0seyJ2IjoyNi41ODh9LHsidiI6MjYuNTg4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4wOTA5MTMyNjUxNTExNjRlLTA3fSx7InYiOjAuOTk5OTkxODUyNDUzNTQwMn1dfSx7ImMiOlt7InYiOjIxOX0seyJ2IjoiSG9zdCJ9LHsidiI6IlN1YiJ9LHsidiI6InN1YiJ9LHsidiI6MTB9LHsidiI6MjUuNzYxfSx7InYiOjIuNTc2MX0seyJ2IjoyNS43NjF9LHsidiI6Mi41NzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi45OTQ3NzI3MDI4NTY4OTVlLTA3fSx7InYiOjAuOTk5OTkyMTUxOTMwODEwNX1dfSx7ImMiOlt7InYiOjIyMH0seyJ2IjoiSG9zdCJ9LHsidiI6IkRpdk5vTmFuIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL3dlaWdodGVkX2xvc3MvdmFsdWUifSx7InYiOjEwfSx7InYiOjI1LjA4fSx7InYiOjIuNTA4fSx7InYiOjI1LjA4fSx7InYiOjIuNTA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi45MTU2MDQ5NjA1MDgxNjg0ZS0wN30seyJ2IjowLjk5OTk5MjQ0MzQ5MTMwNjZ9XX0seyJjIjpbeyJ2IjoyMjF9LHsidiI6Ikhvc3QifSx7InYiOiJTdWIifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3Mvc3ViIn0seyJ2IjoxMH0seyJ2IjoyMi41OH0seyJ2IjoyLjI1OH0seyJ2IjoyMi41OH0seyJ2IjoyLjI1OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNjI0OTc0NDgxOTg4NjE0ZS0wN30seyJ2IjowLjk5OTk5MjcwNTk4ODc1NDh9XX0seyJjIjpbeyJ2IjoyMjJ9LHsidiI6Ikhvc3QifSx7InYiOiJBZGROIn0seyJ2IjoiQWRkTiJ9LHsidiI6MTB9LHsidiI6MjAuOTAyfSx7InYiOjIuMDkwMjAwMDAwMDAwMDAwM30seyJ2IjoyMC45MDJ9LHsidiI6Mi4wOTAyMDAwMDAwMDAwMDAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi40Mjk5MDMzMDQ4MDYyODk1ZS0wN30seyJ2IjowLjk5OTk5Mjk0ODk3OTA4NTN9XX0seyJjIjpbeyJ2IjoyMjN9LHsidiI6Ikhvc3QifSx7InYiOiJEaXZOb05hbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvd2VpZ2h0ZWRfbG9zcy92YWx1ZSJ9LHsidiI6MTB9LHsidiI6MjAuMjk0fSx7InYiOjIuMDI5NH0seyJ2IjoyMC4yOTR9LHsidiI6Mi4wMjk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4zNTkyMjE5NzI0MzAzMzM4ZS0wN30seyJ2IjowLjk5OTk5MzE4NDkwMTI4MjV9XX0seyJjIjpbeyJ2IjoyMjR9LHsidiI6Ikhvc3QifSx7InYiOiJFeHAifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvRXhwIn0seyJ2IjoxMH0seyJ2IjoyMC4yMn0seyJ2IjoyLjAyMn0seyJ2IjoyMC4yMn0seyJ2IjoyLjAyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuMzUwNjE5MzEwMjY2MTU0N2UtMDd9LHsidiI6MC45OTk5OTM0MTk5NjMyMTM2fV19LHsiYyI6W3sidiI6MjI1fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkVjIifSx7InYiOiJBZGFtXzEvYWRkIn0seyJ2IjoxMH0seyJ2IjoyMC4wNzd9LHsidiI6Mi4wMDc3MDAwMDAwMDAwMDAzfSx7InYiOjIwLjA3N30seyJ2IjoyLjAwNzcwMDAwMDAwMDAwMDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjMzMzk5NTI0Njg5NDgzNjZlLTA3fSx7InYiOjAuOTk5OTkzNjUzMzYyNzM4M31dfSx7ImMiOlt7InYiOjIyNn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzUifSx7InYiOjEwfSx7InYiOjE5LjA4Nn0seyJ2IjoxLjkwODU5OTk5OTk5OTk5OTl9LHsidiI6MTkuMDg2fSx7InYiOjEuOTA4NTk5OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuMjE4Nzg5MzI1MjA5Njg1ZS0wN30seyJ2IjowLjk5OTk5Mzg3NTI0MTY3MDh9XX0seyJjIjpbeyJ2IjoyMjd9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWxfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTguODk1fSx7InYiOjEuODg5NX0seyJ2IjoxOC44OTV9LHsidiI6MS44ODk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4xOTY1ODUxNTY2NTA3OTFlLTA3fSx7InYiOjAuOTk5OTk0MDk0OTAwMTg2NX1dfSx7ImMiOlt7InYiOjIyOH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8zL0JpYXNBZGRfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTguMjA5fSx7InYiOjEuODIwOX0seyJ2IjoxOC4yMDl9LHsidiI6MS44MjA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4xMTY4MzYxNTMzNDUwMjU2ZS0wN30seyJ2IjowLjk5OTk5NDMwNjU4MzgwMTh9XX0seyJjIjpbeyJ2IjoyMjl9LHsidiI6Ikhvc3QifSx7InYiOiJQb3cifSx7InYiOiJBZGFtXzEvUG93In0seyJ2IjoxMH0seyJ2IjoxOC4wNzl9LHsidiI6MS44MDc5fSx7InYiOjE4LjA3OX0seyJ2IjoxLjgwNzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjEwMTcyMzM2ODQ2MjAwODhlLTA3fSx7InYiOjAuOTk5OTk0NTE2NzU2MTM4N31dfSx7ImMiOlt7InYiOjIzMH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1lYW4ifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzIvTWVhbiJ9LHsidiI6MTB9LHsidiI6MTguMDU3fSx7InYiOjEuODA1Njk5OTk5OTk5OTk5OX0seyJ2IjoxOC4wNTd9LHsidiI6MS44MDU2OTk5OTk5OTk5OTk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4wOTkxNjU4MjAyNTEwMzY1ZS0wN30seyJ2IjowLjk5OTk5NDcyNjY3MjcyMDd9XX0seyJjIjpbeyJ2IjoyMzF9LHsidiI6Ikhvc3QifSx7InYiOiJTZWxlY3QifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9TZWxlY3RfMiJ9LHsidiI6MTB9LHsidiI6MTcuOTAyfSx7InYiOjEuNzkwMn0seyJ2IjoxNy45MDJ9LHsidiI6MS43OTAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4wODExNDY3MzA1ODI4MjQ0ZS0wN30seyJ2IjowLjk5OTk5NDkzNDc4NzM5Mzh9XX0seyJjIjpbeyJ2IjoyMzJ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWNpcHJvY2FsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvUmVjaXByb2NhbCJ9LHsidiI6MTB9LHsidiI6MTYuODEzfSx7InYiOjEuNjgxMjk5OTk5OTk5OTk5OH0seyJ2IjoxNi44MTN9LHsidiI6MS42ODEyOTk5OTk5OTk5OTk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS45NTQ1NDgwOTQxMzk3MDYyZS0wN30seyJ2IjowLjk5OTk5NTEzMDI0MjIwMzJ9XX0seyJjIjpbeyJ2IjoyMzN9LHsidiI6Ikhvc3QifSx7InYiOiJSZWNpcHJvY2FsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9SZWNpcHJvY2FsIn0seyJ2IjoxMH0seyJ2IjoxNi40Njl9LHsidiI6MS42NDY5fSx7InYiOjE2LjQ2OX0seyJ2IjoxLjY0Njl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjkxNDU1NzM0MDI5NTQxNmUtMDd9LHsidiI6MC45OTk5OTUzMjE2OTc5MzczfV19LHsiYyI6W3sidiI6MjM0fSx7InYiOiJIb3N0In0seyJ2IjoiUG93In0seyJ2IjoiQWRhbV8xL1Bvd18xIn0seyJ2IjoxMH0seyJ2IjoxNi4yOX0seyJ2IjoxLjYyOX0seyJ2IjoxNi4yOX0seyJ2IjoxLjYyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuODkzNzQ4MTk4MDMzNDE1NWUtMDd9LHsidiI6MC45OTk5OTU1MTEwNzI3NTcxfV19LHsiYyI6W3sidiI6MjM1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzIvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxNi4wMDF9LHsidiI6MS42MDAxfSx7InYiOjE2LjAwMX0seyJ2IjoxLjYwMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjg2MDE1MTMxNDcxNjU1NTRlLTA3fSx7InYiOjAuOTk5OTk1Njk3MDg3ODg4Nn1dfSx7ImMiOlt7InYiOjIzNn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzkifSx7InYiOjEwfSx7InYiOjE1Ljg1OX0seyJ2IjoxLjU4NTl9LHsidiI6MTUuODU5fSx7InYiOjEuNTg1OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuODQzNjQzNTAzNTM2NjQ0NGUtMDd9LHsidiI6MC45OTk5OTU4ODE0NTIyMzg5fV19LHsiYyI6W3sidiI6MjM3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzEvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTQuMzc0fSx7InYiOjEuNDM3NH0seyJ2IjoxNC4zNzR9LHsidiI6MS40Mzc0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS42NzEwMDg5OTkyOTYwMjkyZS0wN30seyJ2IjowLjk5OTk5NjA0ODU1MzEzODh9XX0seyJjIjpbeyJ2IjoyMzh9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9tdWwifSx7InYiOjEwfSx7InYiOjEzLjUyOX0seyJ2IjoxLjM1Mjl9LHsidiI6MTMuNTI5fSx7InYiOjEuMzUyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNTcyNzc1ODk3NTU2NDJlLTA3fSx7InYiOjAuOTk5OTk2MjA1ODMwNzI4Nn1dfSx7ImMiOlt7InYiOjIzOX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzIn0seyJ2IjoxMH0seyJ2IjoxMy40OTd9LHsidiI6MS4zNDk3fSx7InYiOjEzLjQ5N30seyJ2IjoxLjM0OTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjU2OTA1NTgyNzQzMTM2OTVlLTA3fSx7InYiOjAuOTk5OTk2MzYyNzM2MzExM31dfSx7ImMiOlt7InYiOjI0MH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2IjoiQWRhbV8xL0Nhc3RfMy9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTIuNTE5fSx7InYiOjEuMjUxOX0seyJ2IjoxMi41MTl9LHsidiI6MS4yNTE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS40NTUzNjExODQyMzQ1MmUtMDd9LHsidiI6MC45OTk5OTY1MDgyNzI0Mjk3fV19LHsiYyI6W3sidiI6MjQxfSx7InYiOiJIb3N0In0seyJ2IjoiTm9PcCJ9LHsidiI6Ik5vT3AifSx7InYiOjIxfSx7InYiOjEyLjQ4fSx7InYiOjAuNTk0Mjg1NzE0Mjg1NzE0M30seyJ2IjoxMi40OH0seyJ2IjowLjU5NDI4NTcxNDI4NTcxNDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjQ1MDgyNzM0ODc2OTYxNWUtMDd9LHsidiI6MC45OTk5OTY2NTMzNTUxNjQ1fV19LHsiYyI6W3sidiI6MjQyfSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlL01hdE11bF8xL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMi4zODF9LHsidiI6MS4yMzgxfSx7InYiOjEyLjM4MX0seyJ2IjoxLjIzODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjQzOTMxODM4MTgyMDI0MDZlLTA3fSx7InYiOjAuOTk5OTk2Nzk3Mjg3MDAyN31dfSx7ImMiOlt7InYiOjI0M30seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcyJ9LHsidiI6MTB9LHsidiI6MTIuMjY3fSx7InYiOjEuMjI2N30seyJ2IjoxMi4yNjd9LHsidiI6MS4yMjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS40MjYwNjU2MzE5OTk3NDg3ZS0wN30seyJ2IjowLjk5OTk5NjkzOTg5MzU2Nn1dfSx7ImMiOlt7InYiOjI0NH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2IjoiQWRhbS9DYXN0XzIvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjEyLjAwOH0seyJ2IjoxLjIwMDc5OTk5OTk5OTk5OTl9LHsidiI6MTIuMDA4fSx7InYiOjEuMjAwNzk5OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzk1OTU2MzE0NDI1MTIzZS0wN30seyJ2IjowLjk5OTk5NzA3OTQ4OTE5NzR9XX0seyJjIjpbeyJ2IjoyNDV9LHsidiI6Ikhvc3QifSx7InYiOiJBZGQifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzIvbG9naXN0aWNfbG9zcyJ9LHsidiI6MTB9LHsidiI6MTEuOTV9LHsidiI6MS4xOTQ5OTk5OTk5OTk5OTk4fSx7InYiOjExLjk1fSx7InYiOjEuMTk0OTk5OTk5OTk5OTk5OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzg5MjEzNjg3MzIzNDY5MmUtMDd9LHsidiI6MC45OTk5OTcyMTg0MTA1NjYxfV19LHsiYyI6W3sidiI6MjQ2fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNi9CaWFzQWRkL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMS41ODN9LHsidiI6MS4xNTgzfSx7InYiOjExLjU4M30seyJ2IjoxLjE1ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjM0NjU0OTEzMzA3Njc5ODllLTA3fSx7InYiOjAuOTk5OTk3MzUzMDY1NDc5NH1dfSx7ImMiOlt7InYiOjI0N30seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzgifSx7InYiOjEwfSx7InYiOjExLjU3NX0seyJ2IjoxLjE1NzV9LHsidiI6MTEuNTc1fSx7InYiOjEuMTU3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzQ1NjE5MTE1NTQ1NTM2MWUtMDd9LHsidiI6MC45OTk5OTc0ODc2MjczOTA5fV19LHsiYyI6W3sidiI6MjQ4fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9tdWwifSx7InYiOjEwfSx7InYiOjExLjUzNn0seyJ2IjoxLjE1MzZ9LHsidiI6MTEuNTM2fSx7InYiOjEuMTUzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzQxMDg1MjgwMDgwNjMxM2UtMDd9LHsidiI6MC45OTk5OTc2MjE3MzU5MTl9XX0seyJjIjpbeyJ2IjoyNDl9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV82L01hdE11bC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTEuNDI1fSx7InYiOjEuMTQyNX0seyJ2IjoxMS40MjV9LHsidiI6MS4xNDI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4zMjgxODEyODY4MzQzNjMyZS0wN30seyJ2IjowLjk5OTk5Nzc1NDU1NDA0Nzd9XX0seyJjIjpbeyJ2IjoyNTB9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW0vQ2FzdC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTEuMzYxfSx7InYiOjEuMTM2MX0seyJ2IjoxMS4zNjF9LHsidiI6MS4xMzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4zMjA3NDExNDY1ODQyNjI1ZS0wN30seyJ2IjowLjk5OTk5Nzg4NjYyODE2MjR9XX0seyJjIjpbeyJ2IjoyNTF9LHsidiI6Ikhvc3QifSx7InYiOiJEaXZOb05hbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMi93ZWlnaHRlZF9sb3NzL3ZhbHVlIn0seyJ2IjoxMH0seyJ2IjoxMS4xNTl9LHsidiI6MS4xMTU5MDAwMDAwMDAwMDAxfSx7InYiOjExLjE1OX0seyJ2IjoxLjExNTkwMDAwMDAwMDAwMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjI5NzI1ODIwMzkxOTg4MjVlLTA3fSx7InYiOjAuOTk5OTk4MDE2MzUzOTgyOH1dfSx7ImMiOlt7InYiOjI1Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8yL0JpYXNBZGQvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjEwLjg2Mn0seyJ2IjoxLjA4NjJ9LHsidiI6MTAuODYyfSx7InYiOjEuMDg2Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMjYyNzMxMzAzMDcxNzU5NWUtMDd9LHsidiI6MC45OTk5OTgxNDI2MjcxMTMxfV19LHsiYyI6W3sidiI6MjUzfSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNy9CaWFzQWRkL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMC42ODd9LHsidiI6MS4wNjg3fSx7InYiOjEwLjY4N30seyJ2IjoxLjA2ODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjI0MjM4NzE2OTU3NTM5MDRlLTA3fSx7InYiOjAuOTk5OTk4MjY2ODY1ODN9XX0seyJjIjpbeyJ2IjoyNTR9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2IjoiQWRhbV8xL0Nhc3RfMSJ9LHsidiI6MTB9LHsidiI6MTAuMDI1fSx7InYiOjEuMDAyNX0seyJ2IjoxMC4wMjV9LHsidiI6MS4wMDI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4xNjU0MjgyMTg4NjM0MTI3ZS0wN30seyJ2IjowLjk5OTk5ODM4MzQwODY1MTl9XX0seyJjIjpbeyJ2IjoyNTV9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjEwLjAyfSx7InYiOjEuMDAyfSx7InYiOjEwLjAyfSx7InYiOjEuMDAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4xNjQ4NDY5NTc5MDYzNzM1ZS0wN30seyJ2IjowLjk5OTk5ODQ5OTg5MzM0Nzd9XX0seyJjIjpbeyJ2IjoyNTZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW0vQ2FzdF8zL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo5LjkzOX0seyJ2IjowLjk5Mzl9LHsidiI6OS45Mzl9LHsidiI6MC45OTM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4xNTU0MzA1MzA0MDIzNGUtMDd9LHsidiI6MC45OTk5OTg2MTU0MzY0MDA3fV19LHsiYyI6W3sidiI6MjU3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJBZGFtXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjkuNzgyfSx7InYiOjAuOTc4Mn0seyJ2Ijo5Ljc4Mn0seyJ2IjowLjk3ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjEzNzE3ODkzNjM1MTMxMmUtMDd9LHsidiI6MC45OTk5OTg3MjkxNTQyOTQzfV19LHsiYyI6W3sidiI6MjU4fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fNyJ9LHsidiI6MTB9LHsidiI6OC45ODZ9LHsidiI6MC44OTg2MDAwMDAwMDAwMDAxfSx7InYiOjguOTg2fSx7InYiOjAuODk4NjAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMDQ0NjQyMTkxOTkwNjg2ZS0wN30seyJ2IjowLjk5OTk5ODgzMzYxODUxMzV9XX0seyJjIjpbeyJ2IjoyNTl9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9DYXN0L1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo4Ljg3Mn0seyJ2IjowLjg4NzJ9LHsidiI6OC44NzJ9LHsidiI6MC44ODcyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4wMzEzODk0NDIxNzAxOTQzZS0wN30seyJ2IjowLjk5OTk5ODkzNjc1NzQ1Nzd9XX0seyJjIjpbeyJ2IjoyNjB9LHsidiI6Ikhvc3QifSx7InYiOiJCYXRjaERhdGFzZXRWMiJ9LHsidiI6IkJhdGNoRGF0YXNldFYyIn0seyJ2IjoxfSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS42NzEwMTk4MDMyMTY2OWUtMDh9LHsidiI6MC45OTk5OTkwMzM0Njc2NTU3fV19LHsiYyI6W3sidiI6MjYxfSx7InYiOiJIb3N0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0In0seyJ2IjoxfSx7InYiOjguMTYxfSx7InYiOjguMTYxfSx7InYiOjguMTYxfSx7InYiOjguMTYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS40ODczNDEzNDA3OTIzMjllLTA4fSx7InYiOjAuOTk5OTk5MTI4MzQxMDY5Mn1dfSx7ImMiOlt7InYiOjI2Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiYWRkIn0seyJ2IjoxMH0seyJ2Ijo4LjE1fSx7InYiOjAuODE1MDAwMDAwMDAwMDAwMX0seyJ2Ijo4LjE1fSx7InYiOjAuODE1MDAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNDc0NTUzNTk5NzM3NDdlLTA4fSx7InYiOjAuOTk5OTk5MjIzMDg2NjA1Mn1dfSx7ImMiOlt7InYiOjI2M30seyJ2IjoiSG9zdCJ9LHsidiI6Ik5lZyJ9LHsidiI6ImdyYWRpZW50X3RhcGUvYmluYXJ5X2Nyb3NzZW50cm9weS9sb2dpc3RpY19sb3NzL05lZyJ9LHsidiI6MTB9LHsidiI6Ny45NTR9LHsidiI6MC43OTU0fSx7InYiOjcuOTU0fSx7InYiOjAuNzk1NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuMjQ2Njk5MzA0NTc4MTM4ZS0wOH0seyJ2IjowLjk5OTk5OTMxNTU1MzU5ODJ9XX0seyJjIjpbeyJ2IjoyNjR9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9tdWxfMSJ9LHsidiI6MTB9LHsidiI6Ny42MX0seyJ2IjowLjc2MX0seyJ2Ijo3LjYxfSx7InYiOjAuNzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OC44NDY3OTE3NjYxMzUyMzNlLTA4fSx7InYiOjAuOTk5OTk5NDA0MDIxNTE1OX1dfSx7ImMiOlt7InYiOjI2NX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvbXVsXzEifSx7InYiOjEwfSx7InYiOjcuMzZ9LHsidiI6MC43MzZ9LHsidiI6Ny4zNn0seyJ2IjowLjczNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguNTU2MTYxMjg3NjE1Njc5ZS0wOH0seyJ2IjowLjk5OTk5OTQ4OTU4MzEyODh9XX0seyJjIjpbeyJ2IjoyNjZ9LHsidiI6Ikhvc3QifSx7InYiOiJOZWcifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL05lZyJ9LHsidiI6MTB9LHsidiI6Ni44MzF9LHsidiI6MC42ODMxfSx7InYiOjYuODMxfSx7InYiOjAuNjgzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuOTQxMTg3MTk1MDY4MzAxZS0wOH0seyJ2IjowLjk5OTk5OTU2ODk5NTAwMDh9XX0seyJjIjpbeyJ2IjoyNjd9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMS9NYXRNdWwvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjYuNjh9LHsidiI6MC42Njc5OTk5OTk5OTk5OTk5fSx7InYiOjYuNjh9LHsidiI6MC42Njc5OTk5OTk5OTk5OTk5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny43NjU2NDYzODYwNDI0OWUtMDh9LHsidiI6MC45OTk5OTk2NDY2NTE0NjQ2fV19LHsiYyI6W3sidiI6MjY4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6Ni42MDd9LHsidiI6MC42NjA3MDAwMDAwMDAwMDAxfSx7InYiOjYuNjA3fSx7InYiOjAuNjYwNzAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuNjgwNzgyMjg2MzE0NzgxZS0wOH0seyJ2IjowLjk5OTk5OTcyMzQ1OTI4NzR9XX0seyJjIjpbeyJ2IjoyNjl9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWwvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjYuMjI3fSx7InYiOjAuNjIyN30seyJ2Ijo2LjIyN30seyJ2IjowLjYyMjd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjIzOTAyMzk1ODk2NTA1OWUtMDh9LHsidiI6MC45OTk5OTk3OTU4NDk1Mjd9XX0seyJjIjpbeyJ2IjoyNzB9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6Ni4xMjV9LHsidiI6MC42MTI1fSx7InYiOjYuMTI1fSx7InYiOjAuNjEyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjcuMTIwNDQ2NzIzNzI5MDhlLTA4fSx7InYiOjAuOTk5OTk5ODY3MDUzOTk0Mn1dfSx7ImMiOlt7InYiOjI3MX0seyJ2IjoiSG9zdCJ9LHsidiI6IkR1bW15U2VlZEdlbmVyYXRvciJ9LHsidiI6IkR1bW15U2VlZEdlbmVyYXRvciJ9LHsidiI6MX0seyJ2Ijo1LjczOX0seyJ2Ijo1LjczOX0seyJ2Ijo1LjczOX0seyJ2Ijo1LjczOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuNjcxNzEzMjY0ODk0ODg4ZS0wOH0seyJ2IjowLjk5OTk5OTkzMzc3MTEyNjh9XX0seyJjIjpbeyJ2IjoyNzJ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMi9CaWFzQWRkXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjUuNjk3fSx7InYiOjAuNTY5N30seyJ2Ijo1LjY5N30seyJ2IjowLjU2OTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo2LjYyMjg4NzM0NDUwMzYwM2UtMDh9LHsidiI6MS4wMDAwMDAwMDAwMDAwMDAyfV19XX0seyJjb2xzIjpbeyJpZCI6InJhbmsiLCJsYWJlbCI6IlJhbmsiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6Imhvc3Rfb3JfZGV2aWNlIiwibGFiZWwiOiJIb3N0L2RldmljZSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoidHlwZSIsImxhYmVsIjoiVHlwZSIsInR5cGUiOiJzdHJpbmcifSx7ImlkIjoib3BlcmF0aW9uIiwibGFiZWwiOiJPcGVyYXRpb24iLCJ0eXBlIjoic3RyaW5nIn0seyJpZCI6Im9jY3VycmVuY2VzIiwibGFiZWwiOiIjT2NjdXJyZW5jZXMiLCJ0eXBlIjoibnVtYmVyIn0seyJpZCI6InRvdGFsX3RpbWUiLCJsYWJlbCI6IlRvdGFsIHRpbWUgKHVzKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiYXZnX3RpbWUiLCJsYWJlbCI6IkF2Zy4gdGltZSAodXMpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJ0b3RhbF9zZWxmX3RpbWUiLCJsYWJlbCI6IlRvdGFsIHNlbGYtdGltZSAodXMpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJhdmdfc2VsZl90aW1lIiwibGFiZWwiOiJBdmcuIHNlbGYtdGltZSAodXMpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJkZXZpY2VfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLCJsYWJlbCI6IlRvdGFsIHNlbGYtdGltZSBvbiBEZXZpY2UgKCUpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJkZXZpY2VfY3VtdWxhdGl2ZV90b3RhbF9zZWxmX3RpbWVfcGVyY2VudCIsImxhYmVsIjoiQ3VtdWxhdGl2ZSB0b3RhbC1zZWxmIHRpbWUgb24gRGV2aWNlICglKSIsInR5cGUiOiJudW1iZXIifSx7ImlkIjoiaG9zdF90b3RhbF9zZWxmX3RpbWVfcGVyY2VudCIsImxhYmVsIjoiVG90YWwgc2VsZi10aW1lIG9uIEhvc3QgKCUpIiwidHlwZSI6Im51bWJlciJ9LHsiaWQiOiJIb3N0X2N1bXVsYXRpdmVfdG90YWxfc2VsZl90aW1lX3BlcmNlbnQiLCJsYWJlbCI6IkN1bXVsYXRpdmUgdG90YWwtc2VsZiB0aW1lIG9uIEhvc3QgKCUpIiwidHlwZSI6Im51bWJlciJ9XSwicm93cyI6W3siYyI6W3sidiI6MX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL01hdE11bF8zIn0seyJ2IjoxMTgwfSx7InYiOjI4MTExNjYuNTMxfSx7InYiOjIzODIuMzQ0NTE3Nzk2NjF9LHsidiI6MjgxMTE2Ni41MzF9LHsidiI6MjM4Mi4zNDQ1MTc3OTY2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDY2NDgyOTMzNzAwMTI1M30seyJ2IjowLjA2NjQ4MjkzMzcwMDEyNTN9XX0seyJjIjpbeyJ2IjoyfSx7InYiOiJIb3N0In0seyJ2IjoiX0Z1c2VkTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8xL1JlbHUifSx7InYiOjExODB9LHsidiI6MjI5Nzc0MS4yMjh9LHsidiI6MTk0Ny4yMzgzMjg4MTM1NTk1fSx7InYiOjIyOTc3NDEuMjI4fSx7InYiOjE5NDcuMjM4MzI4ODEzNTU5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDU0MzQwNjM2MTg2NjUzNzZ9LHsidiI6MC4xMjA4MjM1Njk4ODY3NzkwNn1dfSx7ImMiOlt7InYiOjN9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9NYXRNdWxfMiJ9LHsidiI6MTE4MH0seyJ2IjoyMjA3NDExLjU1fSx7InYiOjE4NzAuNjg3NzU0MjM3Mjg4fSx7InYiOjIyMDc0MTEuNTV9LHsidiI6MTg3MC42ODc3NTQyMzcyODh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjA1MjIwNDM3NjQwNzE2MjM1fSx7InYiOjAuMTczMDI3OTQ2MjkzOTQxNDF9XX0seyJjIjpbeyJ2Ijo0fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzEvTWF0TXVsXzUifSx7InYiOjExODB9LHsidiI6MjA5ODY4My45NzN9LHsidiI6MTc3OC41NDU3Mzk4MzA1MDg2fSx7InYiOjIwOTg2ODMuOTczfSx7InYiOjE3NzguNTQ1NzM5ODMwNTA4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDQ5NjMzMDEzODczNzI1MDc1fSx7InYiOjAuMjIyNjYwOTYwMTY3NjY2NDh9XX0seyJjIjpbeyJ2Ijo1fSx7InYiOiJIb3N0In0seyJ2IjoiX0Z1c2VkTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8xL1JlbHVfMSJ9LHsidiI6MTE4MH0seyJ2IjoxOTQ3NTIwLjA5fSx7InYiOjE2NTAuNDQwNzU0MjM3Mjg4M30seyJ2IjoxOTQ3NTIwLjA5fSx7InYiOjE2NTAuNDQwNzU0MjM3Mjg4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDQ2MDU4MDUwMTM1MTc3ODh9LHsidiI6MC4yNjg3MTkwMTAzMDI4NDQzNH1dfSx7ImMiOlt7InYiOjZ9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNS9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjE2MTc1MDMuNzY2fSx7InYiOjEzNzAuNzY1OTAzMzg5ODMwNn0seyJ2IjoxNjE3NTAzLjc2Nn0seyJ2IjoxMzcwLjc2NTkwMzM4OTgzMDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAzODI1MzI5OTYzNTE2MTY3fSx7InYiOjAuMzA2OTcyMzA5OTM4MDA2fV19LHsiYyI6W3sidiI6N30seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzUvTWF0TXVsXzEifSx7InYiOjExODB9LHsidiI6MTU4ODA3OC4yMzd9LHsidiI6MTM0NS44MjkwMTQ0MDY3Nzk2fSx7InYiOjE1ODgwNzguMjM3fSx7InYiOjEzNDUuODI5MDE0NDA2Nzc5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDM3NTU3Mzk3OTYxNTk0Nzh9LHsidiI6MC4zNDQ1Mjk3MDc4OTk2MDA4fV19LHsiYyI6W3sidiI6OH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL01hdE11bF80In0seyJ2IjoxMTgwfSx7InYiOjE1NzQwNjguOTExfSx7InYiOjEzMzMuOTU2NzA0MjM3Mjg4Mn0seyJ2IjoxNTc0MDY4LjkxMX0seyJ2IjoxMzMzLjk1NjcwNDIzNzI4ODJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAzNzIyNjA4MzE1NjM4MTEyfSx7InYiOjAuMzgxNzU1NzkxMDU1OTgxOX1dfSx7ImMiOlt7InYiOjl9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTQ0ODUxNS45ODR9LHsidiI6MTIyNy41NTU5MTg2NDQwNjc4fSx7InYiOjE0NDg1MTUuOTg0fSx7InYiOjEyMjcuNTU1OTE4NjQ0MDY3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDM0MjU2ODA4MDA2ODgzNTJ9LHsidiI6MC40MTYwMTI1OTkwNjI4NjU0fV19LHsiYyI6W3sidiI6MTB9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV81L01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxMzM5MjU1Ljc5Mn0seyJ2IjoxMTM0Ljk2MjUzNTU5MzIyMDN9LHsidiI6MTMzOTI1NS43OTJ9LHsidiI6MTEzNC45NjI1MzU1OTMyMjAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMzE2NzI4NDkzNDc0ODEzNjZ9LHsidiI6MC40NDc2ODU0NDg0MTAzNDY4fV19LHsiYyI6W3sidiI6MTF9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2UvTWF0TXVsXzIifSx7InYiOjExODB9LHsidiI6MTMyNTE2Ni45MX0seyJ2IjoxMTIzLjAyMjgwNTA4NDc0NTZ9LHsidiI6MTMyNTE2Ni45MX0seyJ2IjoxMTIzLjAyMjgwNTA4NDc0NTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAzMTMzOTY1MzA3NTU0NzM1fSx7InYiOjAuNDc5MDI1MTAxNDg1ODk0MTd9XX0seyJjIjpbeyJ2IjoxMn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV80L01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxMzIzNjM4LjA2OH0seyJ2IjoxMTIxLjcyNzE3NjI3MTE4NjR9LHsidiI6MTMyMzYzOC4wNjh9LHsidiI6MTEyMS43MjcxNzYyNzExODY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMzEzMDM0OTY1OTAyNTgwMTZ9LHsidiI6MC41MTAzMjg1OTgwNzYxNTIyfV19LHsiYyI6W3sidiI6MTN9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJNYXRNdWwifSx7InYiOjQwfSx7InYiOjEyOTQzMzEuNjUzfSx7InYiOjMyMzU4LjI5MTMyNX0seyJ2IjoxMjk0MzMxLjY1M30seyJ2IjozMjM1OC4yOTEzMjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAzMDYxMDQxMTkxMzg2MjAzfSx7InYiOjAuNTQwOTM5MDA5OTkwMDE0Mn1dfSx7ImMiOlt7InYiOjE0fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNC9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTI1MDc4MC45NTF9LHsidiI6MTA1OS45ODM4NTY3Nzk2NjF9LHsidiI6MTI1MDc4MC45NTF9LHsidiI6MTA1OS45ODM4NTY3Nzk2NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAyOTU4MDQ1NTcwMTExODU3fSx7InYiOjAuNTcwNTE5NDY1NjkxMTMyOH1dfSx7ImMiOlt7InYiOjE1fSx7InYiOiJIb3N0In0seyJ2IjoiX0Z1c2VkTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8yL1JlbHUifSx7InYiOjExODB9LHsidiI6MTI0MTY1Mi4wODN9LHsidiI6MTA1Mi4yNDc1Mjc5NjYxMDE5fSx7InYiOjEyNDE2NTIuMDgzfSx7InYiOjEwNTIuMjQ3NTI3OTY2MTAxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDI5MzY0NTYxNzIyODMyODh9LHsidiI6MC41OTk4ODQwMjc0MTM5NjU2fV19LHsiYyI6W3sidiI6MTZ9LHsidiI6Ikhvc3QifSx7InYiOiJSYW5kb21TdGFuZGFyZE5vcm1hbCJ9LHsidiI6InJhbmRvbV9ub3JtYWwvUmFuZG9tU3RhbmRhcmROb3JtYWwifSx7InYiOjExODB9LHsidiI6MTAwMDU3OS41NDZ9LHsidiI6ODQ3Ljk0ODc2Nzc5NjYxMDF9LHsidiI6MTAwMDU3OS41NDZ9LHsidiI6ODQ3Ljk0ODc2Nzc5NjYxMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAyMzY2MzI5NTI0OTQ0Nzk4N30seyJ2IjowLjYyMzU0NzMyMjY2MzQxMzZ9XX0seyJjIjpbeyJ2IjoxN30seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmRvbVN0YW5kYXJkTm9ybWFsIn0seyJ2IjoiUmFuZG9tU3RhbmRhcmROb3JtYWwifSx7InYiOjEwfSx7InYiOjk2OTY4Ny4wNDh9LHsidiI6OTY5NjguNzA0Nzk5OTk5OTl9LHsidiI6OTY5Njg3LjA0OH0seyJ2Ijo5Njk2OC43MDQ3OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDIyOTMyNzAwMzYxNjI1ODZ9LHsidiI6MC42NDY0ODAwMjMwMjUwMzk1fV19LHsiYyI6W3sidiI6MTh9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlL01hdE11bCJ9LHsidiI6MTE4MH0seyJ2Ijo4MTY4NTQuNDczfSx7InYiOjY5Mi4yNDk1NTMzODk4MzA1fSx7InYiOjgxNjg1NC40NzN9LHsidiI6NjkyLjI0OTU1MzM4OTgzMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxOTMxODI3Mjc0MjczNjI3Nn0seyJ2IjowLjY2NTc5ODI5NTc2Nzc3NTd9XX0seyJjIjpbeyJ2IjoxOX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJhbmRvbVVuaWZvcm0ifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dC9yYW5kb21fdW5pZm9ybS9SYW5kb21Vbmlmb3JtIn0seyJ2IjoxMTgwfSx7InYiOjc1NjI0Ny45NjJ9LHsidiI6NjQwLjg4ODEwMzM4OTgzMDZ9LHsidiI6NzU2MjQ3Ljk2Mn0seyJ2Ijo2NDAuODg4MTAzMzg5ODMwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDE3ODg0OTUzNjUzMjQ5Mzk4fSx7InYiOjAuNjgzNjgzMjQ5NDIxMDI1MX1dfSx7ImMiOlt7InYiOjIwfSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbDo6QmF0Y2hWMjo6U2h1ZmZsZSJ9LHsidiI6NjAwMDEwfSx7InYiOjk4MjcwNS45NDh9LHsidiI6MS42Mzc4MTU5NDk3MzQxNzF9LHsidiI6NjkyODE5LjMxNH0seyJ2IjoxLjE1NDY3OTYxMjAwNjQ2NjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNjM4NDg5MjE4Mjk3NjkzN30seyJ2IjowLjcwMDA2ODE0MTYwNDAwMn1dfSx7ImMiOlt7InYiOjIxfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlL01hdE11bF80In0seyJ2IjoxMTgwfSx7InYiOjY2MzEzOC42OTh9LHsidiI6NTYxLjk4MTk0NzQ1NzYyNzF9LHsidiI6NjYzMTM4LjY5OH0seyJ2Ijo1NjEuOTgxOTQ3NDU3NjI3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDE1NjgyOTU3ODA2NjQzNTEzfSx7InYiOjAuNzE1NzUxMDk5NDEwNjQ1NX1dfSx7ImMiOlt7InYiOjIyfSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbDo6QmF0Y2hWMiJ9LHsidiI6MTE5MH0seyJ2IjoxNjQ1NTM1LjAyNn0seyJ2IjoxMzgyLjgwMjU0Mjg1NzE0M30seyJ2Ijo2NjI4MjkuMDc4fSx7InYiOjU1Ni45OTkyMjUyMTAwODR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNTY3NTYzNTQyMDgyNzc5fSx7InYiOjAuNzMxNDI2NzM0ODMxNDczNH1dfSx7ImMiOlt7InYiOjIzfSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZG9tVW5pZm9ybSJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvcmFuZG9tX3VuaWZvcm0vUmFuZG9tVW5pZm9ybSJ9LHsidiI6MTE4MH0seyJ2Ijo2NTUyODguMTgxfSx7InYiOjU1NS4zMjg5NjY5NDkxNTI2fSx7InYiOjY1NTI4OC4xODF9LHsidiI6NTU1LjMyODk2Njk0OTE1MjZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNTQ5NzI5NjMwNDM5MjY4N30seyJ2IjowLjc0NjkyNDAzMTEzNTg2Nn1dfSx7ImMiOlt7InYiOjI0fSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZG9tVW5pZm9ybSJ9LHsidiI6InNlcXVlbnRpYWxfMS9kcm9wb3V0XzEvZHJvcG91dC9yYW5kb21fdW5pZm9ybS9SYW5kb21Vbmlmb3JtIn0seyJ2IjoxMTgwfSx7InYiOjY0MjAyMi4yNzJ9LHsidiI6NTQ0LjA4NjY3MTE4NjQ0MDZ9LHsidiI6NjQyMDIyLjI3Mn0seyJ2Ijo1NDQuMDg2NjcxMTg2NDQwNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDE1MTgzNTYzMDA1ODUxNjE1fSx7InYiOjAuNzYyMTA3NTk0MTQxNzE3N31dfSx7ImMiOlt7InYiOjI1fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzIvTWF0TXVsXzMifSx7InYiOjExODB9LHsidiI6NjI3MjAxLjV9LHsidiI6NTMxLjUyNjY5NDkxNTI1NDJ9LHsidiI6NjI3MjAxLjV9LHsidiI6NTMxLjUyNjY5NDkxNTI1NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxNDgzMzA1NzgzNjA1OTk5NH0seyJ2IjowLjc3Njk0MDY1MTk3Nzc3Nzd9XX0seyJjIjpbeyJ2IjoyNn0seyJ2IjoiSG9zdCJ9LHsidiI6Il9GdXNlZE1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV82L1JlbHUifSx7InYiOjExODB9LHsidiI6NTU0NTAyLjg2N30seyJ2Ijo0NjkuOTE3NjgzODk4MzA1MX0seyJ2Ijo1NTQ1MDIuODY3fSx7InYiOjQ2OS45MTc2ODM4OTgzMDUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMTMxMTM3NjUwMjg0MTkyMjh9LHsidiI6MC43OTAwNTQ0MTcwMDYxOTY5fV19LHsiYyI6W3sidiI6Mjd9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfMiJ9LHsidiI6MTE4MH0seyJ2Ijo0NjExMjEuMzkyfSx7InYiOjM5MC43ODA4NDA2Nzc5NjYwN30seyJ2Ijo0NjExMjEuMzkyfSx7InYiOjM5MC43ODA4NDA2Nzc5NjYwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDEwOTA1MzMxNTAzNDgwOTI2fSx7InYiOjAuODAwOTU5NzQ4NTA5Njc3OX1dfSx7ImMiOlt7InYiOjI4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfMS9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2Ijo0NDY5MjEuODk3fSx7InYiOjM3OC43NDczNzAzMzg5ODMwNX0seyJ2Ijo0NDY5MjEuODk3fSx7InYiOjM3OC43NDczNzAzMzg5ODMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDEwNTY5NTE5Mjc5NTM0MDA2fSx7InYiOjAuODExNTI5MjY3Nzg5MjExOX1dfSx7ImMiOlt7InYiOjI5fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfMy9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2Ijo0MzY5MDMuMTh9LHsidiI6MzcwLjI1NjkzMjIwMzM4OTg1fSx7InYiOjQzNjkwMy4xOH0seyJ2IjozNzAuMjU2OTMyMjAzMzg5ODV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxMDMzMjU4MDczNzkyNjM3N30seyJ2IjowLjgyMTg2MTg0ODUyNzEzODN9XX0seyJjIjpbeyJ2IjozMH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzYvTWF0TXVsXzEifSx7InYiOjExODB9LHsidiI6NDMyMTYwLjUyNX0seyJ2IjozNjYuMjM3NzMzMDUwODQ3NDV9LHsidiI6NDMyMTYwLjUyNX0seyJ2IjozNjYuMjM3NzMzMDUwODQ3NDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAxMDIyMDQxODg5NTM0MjMyOH0seyJ2IjowLjgzMjA4MjI2NzQyMjQ4MDZ9XX0seyJjIjpbeyJ2IjozMX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbS9BZGFtL3VwZGF0ZV8xL1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjM3MjEyNi40MjR9LHsidiI6MzE1LjM2MTM3NjI3MTE4NjQzfSx7InYiOjM3MjEyNi40MjR9LHsidiI6MzE1LjM2MTM3NjI3MTE4NjQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDg4MDA2MzcwNjcyMjM1MDZ9LHsidiI6MC44NDA4ODI5MDQ0ODk3MDQyfV19LHsiYyI6W3sidiI6MzJ9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV82L01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjozMjU1NTYuNTE0fSx7InYiOjI3NS44OTUzNTA4NDc0NTc2fSx7InYiOjMyNTU1Ni41MTR9LHsidiI6Mjc1Ljg5NTM1MDg0NzQ1NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNzY5OTI3NzgyNTQ5NjM5M30seyJ2IjowLjg0ODU4MjE4MjMxNTIwMDZ9XX0seyJjIjpbeyJ2IjozM30seyJ2IjoiSG9zdCJ9LHsidiI6IkRhdGFzZXQifSx7InYiOiJJdGVyYXRvcjo6TW9kZWw6OkJhdGNoVjI6OlNodWZmbGU6OlRlbnNvclNsaWNlIn0seyJ2Ijo2MDAwMTB9LHsidiI6Mjg5ODg2LjYzNH0seyJ2IjowLjQ4MzEzNjMzNzcyNzcwNDZ9LHsidiI6Mjg5ODg2LjYzNH0seyJ2IjowLjQ4MzEzNjMzNzcyNzcwNDZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNjg1NTY5OTgxNTgwNTIxNzV9LHsidiI6MC44NTU0Mzc4ODIxMzEwMDU4fV19LHsiYyI6W3sidiI6MzR9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGVfNS9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoyNzg2NTguODc5fSx7InYiOjIzNi4xNTE1OTIzNzI4ODEzN30seyJ2IjoyNzg2NTguODc5fSx7InYiOjIzNi4xNTE1OTIzNzI4ODEzN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDA2NTkwMTY4MDIyMTQwNjQyfSx7InYiOjAuODYyMDI4MDUwMTUzMTQ2NH1dfSx7ImMiOlt7InYiOjM1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9SZWx1R3JhZF8xIn0seyJ2IjoxMTgwfSx7InYiOjI2NTY5Ny4xNTR9LHsidiI6MjI1LjE2NzA3OTY2MTAxNjk0fSx7InYiOjI2NTY5Ny4xNTR9LHsidiI6MjI1LjE2NzA3OTY2MTAxNjk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDYyODM2Mjg1NTAyNDgyNjd9LHsidiI6MC44NjgzMTE2Nzg3MDMzOTQ3fV19LHsiYyI6W3sidiI6MzZ9LHsidiI6Ikhvc3QifSx7InYiOiJHcmVhdGVyRXF1YWwifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dC9HcmVhdGVyRXF1YWwifSx7InYiOjExODB9LHsidiI6MjU2MDkwLjYyM30seyJ2IjoyMTcuMDI1OTUxNjk0OTE1MjV9LHsidiI6MjU2MDkwLjYyM30seyJ2IjoyMTcuMDI1OTUxNjk0OTE1MjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNjA1NjQzODAzODIyNDc3NH0seyJ2IjowLjg3NDM2ODExNjc0MTYxOTR9XX0seyJjIjpbeyJ2IjozN30seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbV8xL0FkYW0vdXBkYXRlL1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjIzNjk2OS42MjZ9LHsidiI6MjAwLjgyMTcxNjk0OTE1MjU1fSx7InYiOjIzNjk2OS42MjZ9LHsidiI6MjAwLjgyMTcxNjk0OTE1MjU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDU2MDQyMzQzMTM2MDk3NTF9LHsidiI6MC44Nzk5NzIzNTEwNTUyMjkyfV19LHsiYyI6W3sidiI6Mzh9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGUvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MjM1NDQ0LjkyOH0seyJ2IjoxOTkuNTI5NjAwMDAwMDAwMDJ9LHsidiI6MjM1NDQ0LjkyOH0seyJ2IjoxOTkuNTI5NjAwMDAwMDAwMDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNTU2ODE3NTgzMjIxODE2NX0seyJ2IjowLjg4NTU0MDUyNjg4NzQ0NzN9XX0seyJjIjpbeyJ2IjozOX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbS9BZGFtL3VwZGF0ZV8zL1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjIyMDk1Ni41MDd9LHsidiI6MTg3LjI1MTI3NzExODY0NDA4fSx7InYiOjIyMDk1Ni41MDd9LHsidiI6MTg3LjI1MTI3NzExODY0NDA4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDUyMjU1MzA2MjcwNTQ5MzR9LHsidiI6MC44OTA3NjYwNTc1MTQ1MDIyfV19LHsiYyI6W3sidiI6NDB9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfNSJ9LHsidiI6MTE4MH0seyJ2IjoxOTcyNjguMTE5fSx7InYiOjE2Ny4xNzYzNzIwMzM4OTgzfSx7InYiOjE5NzI2OC4xMTl9LHsidiI6MTY3LjE3NjM3MjAzMzg5ODN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwNDY2NTMwOTk4MTQ2MTcyNH0seyJ2IjowLjg5NTQzMTM2NzQ5NTk2NH1dfSx7ImMiOlt7InYiOjQxfSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZCJ9LHsidiI6IkJpYXNBZGQifSx7InYiOjMwfSx7InYiOjE2Nzk1OS45Mzd9LHsidiI6NTU5OC42NjQ1NjY2NjY2Njd9LHsidiI6MTY3OTU5LjkzN30seyJ2Ijo1NTk4LjY2NDU2NjY2NjY2N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzOTcyMTgzNTE2MjQxNTh9LHsidiI6MC44OTk0MDM1NTEwMTIyMDU2fV19LHsiYyI6W3sidiI6NDJ9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvQ2FzdCJ9LHsidiI6MTE4MH0seyJ2IjoxNjE2NDQuMDc1fSx7InYiOjEzNi45ODY1MDQyMzcyODgxNn0seyJ2IjoxNjE2NDQuMDc1fSx7InYiOjEzNi45ODY1MDQyMzcyODgxNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzODIyODE1OTc0MzQyMjQ4fSx7InYiOjAuOTAzMjI2MzY2OTg2NTQ3OH1dfSx7ImMiOlt7InYiOjQzfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlL01hdE11bCJ9LHsidiI6MTE4MH0seyJ2IjoxNjA0OTUuMDg0fSx7InYiOjEzNi4wMTI3ODMwNTA4NDc0NX0seyJ2IjoxNjA0OTUuMDg0fSx7InYiOjEzNi4wMTI3ODMwNTA4NDc0NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzNzk1NjQyODA5MTY5NDczfSx7InYiOjAuOTA3MDIyMDA5Nzk1NzE3Mn1dfSx7ImMiOlt7InYiOjQ0fSx7InYiOiJIb3N0In0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2Ijoic2VxdWVudGlhbF8xL2Ryb3BvdXRfMS9kcm9wb3V0L0dyZWF0ZXJFcXVhbCJ9LHsidiI6MTE4MH0seyJ2IjoxNTI3NjAuNzUzfSx7InYiOjEyOS40NTgyNjUyNTQyMzczfSx7InYiOjE1Mjc2MC43NTN9LHsidiI6MTI5LjQ1ODI2NTI1NDIzNzN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMzYxMjcyOTA1ODA5MjI5Nn0seyJ2IjowLjkxMDYzNDczODg1MzgwOTV9XX0seyJjIjpbeyJ2Ijo0NX0seyJ2IjoiSG9zdCJ9LHsidiI6IkdyZWF0ZXJFcXVhbCJ9LHsidiI6InNlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjE0NTg2Ny40MzN9LHsidiI6MTIzLjYxNjQ2ODY0NDA2Nzh9LHsidiI6MTQ1ODY3LjQzM30seyJ2IjoxMjMuNjE2NDY4NjQ0MDY3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAzNDQ5NzA0ODcxNjk4NDk5fSx7InYiOjAuOTE0MDg0NDQzNzI1NTA4fV19LHsiYyI6W3sidiI6NDZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL1JlbHVHcmFkXzIifSx7InYiOjExODB9LHsidiI6MTM5MTM2LjAzNn0seyJ2IjoxMTcuOTExODk0OTE1MjU0MjR9LHsidiI6MTM5MTM2LjAzNn0seyJ2IjoxMTcuOTExODk0OTE1MjU0MjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMzI5MDUxMDA5Nzc0MDcxODd9LHsidiI6MC45MTczNzQ5NTM4MjMyNDg3fV19LHsiYyI6W3sidiI6NDd9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8xL1JlbHVHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjEzMzAzMS4xMTR9LHsidiI6MTEyLjczODIzMjIwMzM4OTgzfSx7InYiOjEzMzAzMS4xMTR9LHsidiI6MTEyLjczODIzMjIwMzM4OTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDMxNDYxMzEyMDAxOTI0Mjd9LHsidiI6MC45MjA1MjEwODUwMjM0NDEyfV19LHsiYyI6W3sidiI6NDh9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzUvUmVsdUdyYWQifSx7InYiOjExODB9LHsidiI6MTI1ODIzLjI3MX0seyJ2IjoxMDYuNjI5ODkwNjc3OTY2MX0seyJ2IjoxMjU4MjMuMjcxfSx7InYiOjEwNi42Mjk4OTA2Nzc5NjYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDI5NzU2Njg2NzQwNDY5Mzc1fSx7InYiOjAuOTIzNDk2NzUzNjk3NDg4Mn1dfSx7ImMiOlt7InYiOjQ5fSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzIvTWF0TXVsXzQifSx7InYiOjExODB9LHsidiI6MTE3MDk5LjY5OH0seyJ2Ijo5OS4yMzcwMzIyMDMzODk4M30seyJ2IjoxMTcwOTkuNjk4fSx7InYiOjk5LjIzNzAzMjIwMzM4OTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDI3NjkzNTk3NTYwMjYwMjh9LHsidiI6MC45MjYyNjYxMTM0NTM1MTQyfV19LHsiYyI6W3sidiI6NTB9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzIvUmVsdV8xIn0seyJ2IjoxMTgwfSx7InYiOjExNDEzNC41OTN9LHsidiI6OTYuNzI0MjMxMzU1OTMyMn0seyJ2IjoxMTQxMzQuNTkzfSx7InYiOjk2LjcyNDIzMTM1NTkzMjJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMjY5OTIzNjI0MDc2ODE4NzN9LHsidiI6MC45Mjg5NjUzNDk2OTQyODIzfV19LHsiYyI6W3sidiI6NTF9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MTEwNDA5LjgyOX0seyJ2Ijo5My41Njc2NTE2OTQ5MTUyNn0seyJ2IjoxMTA0MDkuODI5fSx7InYiOjkzLjU2NzY1MTY5NDkxNTI2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDI2MTExNDcxMDIyMDk1Njc1fSx7InYiOjAuOTMxNTc2NDk2Nzk2NDkxOX1dfSx7ImMiOlt7InYiOjUyfSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdSJ9LHsidiI6IlJlbHUifSx7InYiOjMwfSx7InYiOjEwODY3Ni4yMTV9LHsidiI6MzYyMi41NDA1fSx7InYiOjEwODY3Ni4yMTV9LHsidiI6MzYyMi41NDA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDI1NzAxNDc4NDMyMzU1MzIyfSx7InYiOjAuOTM0MTQ2NjQ0NjM5NzI3NH1dfSx7ImMiOlt7InYiOjUzfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZS9NYXRNdWxfMSJ9LHsidiI6MTE4MH0seyJ2Ijo5ODIwNC4xOTJ9LHsidiI6ODMuMjIzODkxNTI1NDIzNzJ9LHsidiI6OTgyMDQuMTkyfSx7InYiOjgzLjIyMzg5MTUyNTQyMzcyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDIzMjI0ODg4MDA5MzQ4NTF9LHsidiI6MC45MzY0NjkxMzM0NDA2NjIzfV19LHsiYyI6W3sidiI6NTR9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZCJ9LHsidiI6MTE4MH0seyJ2Ijo5NDUwMi4yODJ9LHsidiI6ODAuMDg2Njc5NjYxMDE2OTZ9LHsidiI6OTQ1MDIuMjgyfSx7InYiOjgwLjA4NjY3OTY2MTAxNjk2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDIyMzQ5NDAxNTAwODgzNzF9LHsidiI6MC45Mzg3MDQwNzM1OTA3NTA3fV19LHsiYyI6W3sidiI6NTV9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWxfMS9kZW5zZV83L01hdE11bF8xIn0seyJ2IjoxMTgwfSx7InYiOjkyMjQ1LjI2OX0seyJ2Ijo3OC4xNzM5NTY3Nzk2NjEwMX0seyJ2Ijo5MjI0NS4yNjl9LHsidiI6NzguMTczOTU2Nzc5NjYxMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMjE4MTU2MjcxOTc2Mzc2MzV9LHsidiI6MC45NDA4ODU2MzYzMTA1MTQ1fV19LHsiYyI6W3sidiI6NTZ9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dC9NdWxfMSJ9LHsidiI6MTE4MH0seyJ2Ijo4NTQ1My44NDF9LHsidiI6NzIuNDE4NTA5MzIyMDMzOX0seyJ2Ijo4NTQ1My44NDF9LHsidiI6NzIuNDE4NTA5MzIyMDMzOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAyMDIwOTQ4MjM3MzE1MjQwN30seyJ2IjowLjk0MjkwNjU4NDU0NzgyOTd9XX0seyJjIjpbeyJ2Ijo1N30seyJ2IjoiSG9zdCJ9LHsidiI6IlRmcVNpbXVsYXRlU2FtcGxlcyJ9LHsidiI6IlRmcVNpbXVsYXRlU2FtcGxlcyJ9LHsidiI6MTB9LHsidiI6ODUxMTAuMjQ3fSx7InYiOjg1MTEuMDI0N30seyJ2Ijo4NTExMC4yNDd9LHsidiI6ODUxMS4wMjQ3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDIwMTI4MjIzODAzNTUxOTk2fSx7InYiOjAuOTQ0OTE5NDA2OTI4MTg0OX1dfSx7ImMiOlt7InYiOjU4fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kcm9wb3V0XzEvZHJvcG91dC9DYXN0In0seyJ2IjoxMTgwfSx7InYiOjc4ODI4LjQzMn0seyJ2Ijo2Ni44MDM3NTU5MzIyMDMzOX0seyJ2Ijo3ODgyOC40MzJ9LHsidiI6NjYuODAzNzU1OTMyMjAzMzl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTg2NDI2MDAzNjAyMDE5ODN9LHsidiI6MC45NDY3ODM2NjY5NjQyMDUxfV19LHsiYyI6W3sidiI6NTl9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9DYXN0In0seyJ2IjoxMTgwfSx7InYiOjc2NjY1LjY0NX0seyJ2Ijo2NC45NzA4ODU1OTMyMjAzNH0seyJ2Ijo3NjY2NS42NDV9LHsidiI6NjQuOTcwODg1NTkzMjIwMzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTgxMzExMTAxMTg4OTg2OTF9LHsidiI6MC45NDg1OTY3Nzc5NzYwOTV9XX0seyJjIjpbeyJ2Ijo2MH0seyJ2IjoiSG9zdCJ9LHsidiI6IldyaXRlU3VtbWFyeSJ9LHsidiI6IldyaXRlU3VtbWFyeSJ9LHsidiI6MjM5MX0seyJ2Ijo3MzcyNy45MDd9LHsidiI6MzAuODM1NTk0NzMwMjM4Mzk4fSx7InYiOjczNzI3LjkwN30seyJ2IjozMC44MzU1OTQ3MzAyMzgzOTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTc0MzYzNDcxNDk0MDMzODV9LHsidiI6MC45NTAzNDA0MTI2OTEwMzUzfV19LHsiYyI6W3sidiI6NjF9LHsidiI6Ikhvc3QifSx7InYiOiJSZWx1R3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL1JlbHVHcmFkXzEifSx7InYiOjExODB9LHsidiI6NzMzMTQuNzY1fSx7InYiOjYyLjEzMTE1Njc3OTY2MTAyfSx7InYiOjczMzE0Ljc2NX0seyJ2Ijo2Mi4xMzExNTY3Nzk2NjEwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxNzMzODY0MDc2MzQ4OTAzOX0seyJ2IjowLjk1MjA3NDI3Njc2NzM4NDJ9XX0seyJjIjpbeyJ2Ijo2Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNi9SZWx1R3JhZCJ9LHsidiI6MTE4MH0seyJ2Ijo2Nzg3MC4yODN9LHsidiI6NTcuNTE3MTg4OTgzMDUwODR9LHsidiI6Njc4NzAuMjgzfSx7InYiOjU3LjUxNzE4ODk4MzA1MDg0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDE2MDUxMDQzMTM1MDgxMTR9LHsidiI6MC45NTM2NzkzODEwODA4OTIzfV19LHsiYyI6W3sidiI6NjN9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dC9NdWwifSx7InYiOjExODB9LHsidiI6NTU2MjcuNDI0fSx7InYiOjQ3LjE0MTg4NDc0NTc2MjcxfSx7InYiOjU1NjI3LjQyNH0seyJ2Ijo0Ny4xNDE4ODQ3NDU3NjI3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMzE1NTY1NzI3MjIzMjc5NX0seyJ2IjowLjk1NDk5NDk0NjgwODExNTZ9XX0seyJjIjpbeyJ2Ijo2NH0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzQifSx7InYiOjExODB9LHsidiI6NTEyNDAuNTE1fSx7InYiOjQzLjQyNDE2NTI1NDIzNzI5fSx7InYiOjUxMjQwLjUxNX0seyJ2Ijo0My40MjQxNjUyNTQyMzcyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMjExODE3MTMxNDA3NTI5Nn0seyJ2IjowLjk1NjIwNjc2MzkzOTUyMzF9XX0seyJjIjpbeyJ2Ijo2NX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzIvUmVsdUdyYWQifSx7InYiOjExODB9LHsidiI6NTA5NTMuMzY3fSx7InYiOjQzLjE4MDgxOTQ5MTUyNTQyfSx7InYiOjUwOTUzLjM2N30seyJ2Ijo0My4xODA4MTk0OTE1MjU0Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMjA1MDI2MTk5MTYwODYwOX0seyJ2IjowLjk1NzQxMTc5MDEzODY4Mzl9XX0seyJjIjpbeyJ2Ijo2Nn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6Ik11bCJ9LHsidiI6MzF9LHsidiI6NTAxNjAuOTc3fSx7InYiOjE2MTguMDk2MDMyMjU4MDY0NX0seyJ2Ijo1MDE2MC45Nzd9LHsidiI6MTYxOC4wOTYwMzIyNTgwNjQ1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDExODYyODY1MDExNTUxNzEzfSx7InYiOjAuOTU4NTk4MDc2NjM5ODM5MX1dfSx7ImMiOlt7InYiOjY3fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkIn0seyJ2IjoiQWRkIn0seyJ2IjoxMH0seyJ2Ijo0OTE5Mi42Nn0seyJ2Ijo0OTE5LjI2NjAwMDAwMDAwMDV9LHsidiI6NDkxOTIuNjZ9LHsidiI6NDkxOS4yNjYwMDAwMDAwMDA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDExNjMzODYyMDE4NjU5NjM2fSx7InYiOjAuOTU5NzYxNDYyODQxNzA1fV19LHsiYyI6W3sidiI6Njh9LHsidiI6Ikhvc3QifSx7InYiOiJTdW0ifSx7InYiOiJTdW0ifSx7InYiOjIxfSx7InYiOjQ5MDk4LjU0fSx7InYiOjIzMzguMDI1NzE0Mjg1NzE0NX0seyJ2Ijo0OTA5OC41NH0seyJ2IjoyMzM4LjAyNTcxNDI4NTcxNDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTE2MTE2MDMwMjUyODE0M30seyJ2IjowLjk2MDkyMjYyMzE0NDIzMzJ9XX0seyJjIjpbeyJ2Ijo2OX0seyJ2IjoiSG9zdCJ9LHsidiI6IkJpYXNBZGRHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzEvQmlhc0FkZC9CaWFzQWRkR3JhZCJ9LHsidiI6MTE4MH0seyJ2Ijo0OTA0OS45MjZ9LHsidiI6NDEuNTY3NzMzODk4MzA1MDg2fSx7InYiOjQ5MDQ5LjkyNn0seyJ2Ijo0MS41Njc3MzM4OTgzMDUwODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTE2MDAxMDYwMTM5NzU3Nzd9LHsidiI6MC45NjIwODI2MzM3NDU2MzA3fV19LHsiYyI6W3sidiI6NzB9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0L011bF8yIn0seyJ2IjoxMTgwfSx7InYiOjQ5MDI3LjgwMn0seyJ2Ijo0MS41NDg5ODQ3NDU3NjI3MTZ9LHsidiI6NDkwMjcuODAyfSx7InYiOjQxLjU0ODk4NDc0NTc2MjcxNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMTU5NDg3Mzc3ODg1NTcyNX0seyJ2IjowLjk2MzI0MjEyMTEyMzUxNjR9XX0seyJjIjpbeyJ2Ijo3MX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJhZ2dlZFRlbnNvclRvVGVuc29yIn0seyJ2IjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IifSx7InYiOjEwfSx7InYiOjQ4NTIzLjAzMn0seyJ2Ijo0ODUyLjMwMzJ9LHsidiI6NDg1MjMuMDMyfSx7InYiOjQ4NTIuMzAzMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMTQ3NTQ5Nzc0NzMyNjY1NX0seyJ2IjowLjk2NDM4OTY3MDg5ODI0OX1dfSx7ImMiOlt7InYiOjcyfSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9NdWxfMSJ9LHsidiI6MTE4MH0seyJ2Ijo0ODI2OC45NTd9LHsidiI6NDAuOTA1ODk1NzYyNzExODY0fSx7InYiOjQ4MjY4Ljk1N30seyJ2Ijo0MC45MDU4OTU3NjI3MTE4NjR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTE0MTU0MTAwNTM1MDQyMjR9LHsidiI6MC45NjU1MzEyMTE5MDM1OTk1fV19LHsiYyI6W3sidiI6NzN9LHsidiI6Ikhvc3QifSx7InYiOiJfRnVzZWRNYXRNdWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNy9SZWx1In0seyJ2IjoxMTgwfSx7InYiOjQ3Mjk5LjYzNH0seyJ2Ijo0MC4wODQ0MzU1OTMyMjAzMzR9LHsidiI6NDcyOTkuNjM0fSx7InYiOjQwLjA4NDQzNTU5MzIyMDMzNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAxMTE4NjE2OTE0NTc0NDU0Nn0seyJ2IjowLjk2NjY0OTgyODgxODE3NH1dfSx7ImMiOlt7InYiOjc0fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtXzEvQWRhbS91cGRhdGVfNi9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2Ijo0NDUzMi45MzN9LHsidiI6MzcuNzM5NzczNzI4ODEzNTZ9LHsidiI6NDQ1MzIuOTMzfSx7InYiOjM3LjczOTc3MzcyODgxMzU2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDEwNTMxODU1NzI0MTcxMzMzfSx7InYiOjAuOTY3NzAzMDE0MzkwNTkxMX1dfSx7ImMiOlt7InYiOjc1fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2Ijoic2VxdWVudGlhbF8xL2Ryb3BvdXRfMS9kcm9wb3V0L011bF8xIn0seyJ2IjoxMTgwfSx7InYiOjQ0MTAxLjA0OH0seyJ2IjozNy4zNzM3Njk0OTE1MjU0Mn0seyJ2Ijo0NDEwMS4wNDh9LHsidiI6MzcuMzczNzY5NDkxNTI1NDJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTA0Mjk3MTY2OTU3NDg2MjN9LHsidiI6MC45Njg3NDU5ODYwNjAxNjZ9XX0seyJjIjpbeyJ2Ijo3Nn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8zL01hdE11bF8yIn0seyJ2IjoxMTgwfSx7InYiOjQzMzE4LjI2OH0seyJ2IjozNi43MTAzOTY2MTAxNjk0OX0seyJ2Ijo0MzMxOC4yNjh9LHsidiI6MzYuNzEwMzk2NjEwMTY5NDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMTAyNDQ1OTI0NDEyMTYyMX0seyJ2IjowLjk2OTc3MDQ0NTMwNDI4Nzd9XX0seyJjIjpbeyJ2Ijo3N30seyJ2IjoiSG9zdCJ9LHsidiI6IkdhdGhlclYyIn0seyJ2IjoiUmFnZ2VkTWFzay9ib29sZWFuX21hc2svR2F0aGVyVjIifSx7InYiOjEwfSx7InYiOjM5Njg3LjA0fSx7InYiOjM5NjguNzA0fSx7InYiOjM5Njg3LjA0fSx7InYiOjM5NjguNzA0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA5Mzg1ODIxOTM1NDA3MTQ2fSx7InYiOjAuOTcwNzA5MDI3NDk3ODI4NH1dfSx7ImMiOlt7InYiOjc4fSx7InYiOiJIb3N0In0seyJ2IjoiQ2FzdCJ9LHsidiI6IkNhc3QifSx7InYiOjIyMH0seyJ2IjozNTA5NC44NTN9LHsidiI6MTU5LjUyMjA1OTA5MDkwOTF9LHsidiI6MzUwOTQuODUzfSx7InYiOjE1OS41MjIwNTkwOTA5MDkxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA4Mjk5Nzg4NTczNDgxMTQ4fSx7InYiOjAuOTcxNTM5MDA2MzU1MTc2NX1dfSx7ImMiOlt7InYiOjc5fSx7InYiOiJIb3N0In0seyJ2IjoiUmVsdUdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9SZWx1R3JhZF8yIn0seyJ2IjoxMTgwfSx7InYiOjM0NjAwLjAxNn0seyJ2IjoyOS4zMjIwNDc0NTc2MjcxMn0seyJ2IjozNDYwMC4wMTZ9LHsidiI6MjkuMzIyMDQ3NDU3NjI3MTJ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDgxODI3NjE2NTU2NDk3Nn0seyJ2IjowLjk3MjM1NzI4MjUyMDc0MTV9XX0seyJjIjpbeyJ2Ijo4MH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzcvTWF0TXVsIn0seyJ2IjoxMTgwfSx7InYiOjM0MDczLjgxMX0seyJ2IjoyOC44NzYxMTEwMTY5NDkxNTN9LHsidiI6MzQwNzMuODExfSx7InYiOjI4Ljg3NjExMTAxNjk0OTE1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwODA1ODMxNjMzNDY3MDM5NH0seyJ2IjowLjk3MzE2MzExNDE1NDIwODV9XX0seyJjIjpbeyJ2Ijo4MX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik9uZUhvdCJ9LHsidiI6Ik9uZUhvdCJ9LHsidiI6MjF9LHsidiI6MzI4NzUuODc1fSx7InYiOjE1NjUuNTE3ODU3MTQyODU3fSx7InYiOjMyODc1Ljg3NX0seyJ2IjoxNTY1LjUxNzg1NzE0Mjg1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNzc3NTAwOTM5MTQ5NjY1NX0seyJ2IjowLjk3Mzk0MDYxNTA5MzM1ODJ9XX0seyJjIjpbeyJ2Ijo4Mn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXQvTXVsIn0seyJ2IjoxMTgwfSx7InYiOjMyMDUzLjM2M30seyJ2IjoyNy4xNjM4NjY5NDkxNTI1NDJ9LHsidiI6MzIwNTMuMzYzfSx7InYiOjI3LjE2Mzg2Njk0OTE1MjU0Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNzU4MDQ4ODY4MjE3MzUyMX0seyJ2IjowLjk3NDY5ODY2Mzk2MTU3NTZ9XX0seyJjIjpbeyJ2Ijo4M30seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9NdWxfMiJ9LHsidiI6MTE4MH0seyJ2IjozMTQxNy4wODR9LHsidiI6MjYuNjI0NjQ3NDU3NjI3MTE2fSx7InYiOjMxNDE3LjA4NH0seyJ2IjoyNi42MjQ2NDc0NTc2MjcxMTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDc0MzAwMTEzMTIzNTEwNTV9LHsidiI6MC45NzU0NDE2NjUwOTI4MTA3fV19LHsiYyI6W3sidiI6ODR9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvTXVsXzUifSx7InYiOjExODB9LHsidiI6Mjg1ODYuMjkxfSx7InYiOjI0LjIyNTY3MDMzODk4MzA1fSx7InYiOjI4NTg2LjI5MX0seyJ2IjoyNC4yMjU2NzAzMzg5ODMwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNjc2MDU0MDM5NjA1MjAwOH0seyJ2IjowLjk3NjExNzcxOTEzMjQxNn1dfSx7ImMiOlt7InYiOjg1fSx7InYiOiJIb3N0In0seyJ2IjoiSXRlcmF0b3JHZXROZXh0In0seyJ2IjoiSXRlcmF0b3JHZXROZXh0In0seyJ2IjoxMTkwfSx7InYiOjE2ODE3MzAuMTQ5fSx7InYiOjE0MTMuMjE4NjEyNjA1MDQyfSx7InYiOjI4MzExLjM0OH0seyJ2IjoyMy43OTEwNDg3Mzk0OTU4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA2Njk1NTE3NTA1OTUwMTg0fSx7InYiOjAuOTc2Nzg3MjcwODgzMDExfV19LHsiYyI6W3sidiI6ODZ9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJzZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvTXVsIn0seyJ2IjoxMTgwfSx7InYiOjI3NTk5LjM3M30seyJ2IjoyMy4zODkyOTkxNTI1NDIzN30seyJ2IjoyNzU5OS4zNzN9LHsidiI6MjMuMzg5Mjk5MTUyNTQyMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDY1MjcxMzgzNDMwNjgyNTl9LHsidiI6MC45Nzc0Mzk5ODQ3MTczMTc5fV19LHsiYyI6W3sidiI6ODd9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWwifSx7InYiOjExODB9LHsidiI6MjY0OTUuMzI2fSx7InYiOjIyLjQ1MzY2NjEwMTY5NDkxOH0seyJ2IjoyNjQ5NS4zMjZ9LHsidiI6MjIuNDUzNjY2MTAxNjk0OTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA2MjY2MDM1NzYyNzIxNjE1fSx7InYiOjAuOTc4MDY2NTg4MjkzNTkwMX1dfSx7ImMiOlt7InYiOjg4fSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkXzEvQmlhc0FkZEdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoyNjQ3MC4wMzZ9LHsidiI6MjIuNDMyMjMzODk4MzA1MDg2fSx7InYiOjI2NDcwLjAzNn0seyJ2IjoyMi40MzIyMzM4OTgzMDUwODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDYyNjAwNTQ3ODE2MDY3MTF9LHsidiI6MC45Nzg2OTI1OTM3NzE3NTA4fV19LHsiYyI6W3sidiI6ODl9LHsidiI6Ikhvc3QifSx7InYiOiJCaWFzQWRkR3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2RlbnNlXzUvQmlhc0FkZC9CaWFzQWRkR3JhZCJ9LHsidiI6MTE4MH0seyJ2IjoyNjAzMC4xMzZ9LHsidiI6MjIuMDU5NDM3Mjg4MTM1NTl9LHsidiI6MjYwMzAuMTM2fSx7InYiOjIyLjA1OTQzNzI4ODEzNTU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA2MTU2MDIwMjM4NjA3NjQ2fSx7InYiOjAuOTc5MzA4MTk1Nzk1NjExNn1dfSx7ImMiOlt7InYiOjkwfSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZHJvcG91dF8xL2Ryb3BvdXQvTXVsXzIifSx7InYiOjExODB9LHsidiI6MjU2ODEuMjM1fSx7InYiOjIxLjc2Mzc1ODQ3NDU3NjI3fSx7InYiOjI1NjgxLjIzNX0seyJ2IjoyMS43NjM3NTg0NzQ1NzYyN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNjA3MzUwNjU4NTMwNzA4Nn0seyJ2IjowLjk3OTkxNTU0NjQ1NDE0MjJ9XX0seyJjIjpbeyJ2Ijo5MX0seyJ2IjoiSG9zdCJ9LHsidiI6Il9GdXNlZE1hdE11bCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMy9CaWFzQWRkXzEifSx7InYiOjExODB9LHsidiI6MjU1MDQuOTE1fSx7InYiOjIxLjYxNDMzNDc0NTc2MjcxfSx7InYiOjI1NTA0LjkxNX0seyJ2IjoyMS42MTQzMzQ3NDU3NjI3MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNjAzMTgwNzYyOTU4NjI1MX0seyJ2IjowLjk4MDUxODcyNzIxNzEwMDl9XX0seyJjIjpbeyJ2Ijo5Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IlNlbGVjdCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9TZWxlY3QifSx7InYiOjExODB9LHsidiI6MjUzMjEuNzM4fSx7InYiOjIxLjQ1OTF9LHsidiI6MjUzMjEuNzM4fSx7InYiOjIxLjQ1OTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDU5ODg0ODcwMjE1MzIyODV9LHsidiI6MC45ODExMTc1NzU5MTkyNTQxfV19LHsiYyI6W3sidiI6OTN9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW0vQWRhbS91cGRhdGVfNi9SZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6MTE4MH0seyJ2IjoyMzkwMC45OTJ9LHsidiI6MjAuMjU1MDc3OTY2MTAxNjk1fSx7InYiOjIzOTAwLjk5Mn0seyJ2IjoyMC4yNTUwNzc5NjYxMDE2OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDU2NTI0ODY0Mjg2MDcxODl9LHsidiI6MC45ODE2ODI4MjQ1NjIxMTQ4fV19LHsiYyI6W3sidiI6OTR9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJzZXF1ZW50aWFsL2Ryb3BvdXQvZHJvcG91dF8xL011bCJ9LHsidiI6MTE4MH0seyJ2IjoyMzcxMi4yNDd9LHsidiI6MjAuMDk1MTI0NTc2MjcxMTg2fSx7InYiOjIzNzEyLjI0N30seyJ2IjoyMC4wOTUxMjQ1NzYyNzExODZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDU2MDc4NDkwMTE0MjUxOTd9LHsidiI6MC45ODIyNDM2MDk0NjMyNTczfV19LHsiYyI6W3sidiI6OTV9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2Ijoic2VxdWVudGlhbC9DYXN0In0seyJ2IjoxMTgwfSx7InYiOjIzMDgzLjYzMX0seyJ2IjoxOS41NjIzOTkxNTI1NDIzNzN9LHsidiI6MjMwODMuNjMxfSx7InYiOjE5LjU2MjM5OTE1MjU0MjM3M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNTQ1OTE4MzkwOTYyNTAxNn0seyJ2IjowLjk4Mjc4OTUyNzg1NDIxOTh9XX0seyJjIjpbeyJ2Ijo5Nn0seyJ2IjoiSG9zdCJ9LHsidiI6Ik9wdGltaXplRGF0YXNldCJ9LHsidiI6Ik9wdGltaXplRGF0YXNldCJ9LHsidiI6MTB9LHsidiI6MjI5NDQuODE3fSx7InYiOjIyOTQuNDgxN30seyJ2IjoyMjY1Ni4zMTV9LHsidiI6MjI2NS42MzE1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1MzU4MTI1NDMwOTMzOTc1fSx7InYiOjAuOTgzMzI1MzQwMzk3MzEzMn1dfSx7ImMiOlt7InYiOjk3fSx7InYiOiJIb3N0In0seyJ2IjoiV2hlcmUifSx7InYiOiJSYWdnZWRNYXNrL2Jvb2xlYW5fbWFzay9XaGVyZSJ9LHsidiI6MTB9LHsidiI6MjI1NDMuNDUyfSx7InYiOjIyNTQuMzQ1Mn0seyJ2IjoyMjU0My40NTJ9LHsidiI6MjI1NC4zNDUyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA1MzMxNDMzNzk1MDQ3NDAzfSx7InYiOjAuOTgzODU4NDgzNzc2ODE4fV19LHsiYyI6W3sidiI6OTh9LHsidiI6Ikhvc3QifSx7InYiOiJCaWFzQWRkR3JhZCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8yL0JpYXNBZGQvQmlhc0FkZEdyYWQifSx7InYiOjExODB9LHsidiI6MjA0MTUuMzcyfSx7InYiOjE3LjMwMTE2MjcxMTg2NDQwN30seyJ2IjoyMDQxNS4zNzJ9LHsidiI6MTcuMzAxMTYyNzExODY0NDA3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0ODI4MTUxNjE2Njc2Mjk2M30seyJ2IjowLjk4NDM0MTI5ODkzODQ4NTV9XX0seyJjIjpbeyJ2Ijo5OX0seyJ2IjoiSG9zdCJ9LHsidiI6IkJpYXNBZGRHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZC9CaWFzQWRkR3JhZCJ9LHsidiI6MTE4MH0seyJ2IjoyMDExNS4xMn0seyJ2IjoxNy4wNDY3MTE4NjQ0MDY3Nzd9LHsidiI6MjAxMTUuMTJ9LHsidiI6MTcuMDQ2NzExODY0NDA2Nzc3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0NzU3MTQzMjUyMDM3NjE2fSx7InYiOjAuOTg0ODE3MDEzMjYzNjg5M31dfSx7ImMiOlt7InYiOjEwMH0seyJ2IjoiSG9zdCJ9LHsidiI6IkJpYXNBZGRHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNi9CaWFzQWRkL0JpYXNBZGRHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjE5NDc5LjMyfSx7InYiOjE2LjUwNzg5ODMwNTA4NDc0NH0seyJ2IjoxOTQ3OS4zMn0seyJ2IjoxNi41MDc4OTgzMDUwODQ3NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDQ2MDY3NzkxNjM3NDc1Mzg1fSx7InYiOjAuOTg1Mjc3NjkxMTgwMDY0fV19LHsiYyI6W3sidiI6MTAxfSx7InYiOiJIb3N0In0seyJ2IjoiUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOiJBZGFtL0FkYW0vdXBkYXRlXzIvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MTg3OTguMzA4fSx7InYiOjE1LjkzMDc2OTQ5MTUyNTQyNX0seyJ2IjoxODc5OC4zMDh9LHsidiI6MTUuOTMwNzY5NDkxNTI1NDI1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0NDQ1NzIyNjIzMTc3MjI5NX0seyJ2IjowLjk4NTcyMjI2MzQ0MjM4MTh9XX0seyJjIjpbeyJ2IjoxMDJ9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW1fMS9BZGFtL3VwZGF0ZV8yL1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjE4NzgzLjEwM30seyJ2IjoxNS45MTc4ODM4OTgzMDUwODN9LHsidiI6MTg3ODMuMTAzfSx7InYiOjE1LjkxNzg4Mzg5ODMwNTA4M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwNDQ0MjEyNjcwMzEzNTYyNjd9LHsidiI6MC45ODYxNjY0NzYxMTI2OTU0fV19LHsiYyI6W3sidiI6MTAzfSx7InYiOiJIb3N0In0seyJ2IjoiTWF0TXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsL2RlbnNlXzMvTWF0TXVsXzQifSx7InYiOjExODB9LHsidiI6MTg2MzQuMTUzfSx7InYiOjE1Ljc5MTY1NTA4NDc0NTc2MX0seyJ2IjoxODYzNC4xNTN9LHsidiI6MTUuNzkxNjU1MDg0NzQ1NzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0NDA2OTAwNjM5OTg1NTY4fSx7InYiOjAuOTg2NjA3MTY2MTc2Njk0fV19LHsiYyI6W3sidiI6MTA0fSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9TZWxlY3RfMyJ9LHsidiI6MTE4MH0seyJ2IjoxNzg0NC44NjV9LHsidiI6MTUuMTIyNzY2OTQ5MTUyNTQ0fSx7InYiOjE3ODQ0Ljg2NX0seyJ2IjoxNS4xMjI3NjY5NDkxNTI1NDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDQyMjAyMzcyNzAxODY0MTk1fSx7InYiOjAuOTg3MDI5MTg5OTAzNzEyNn1dfSx7ImMiOlt7InYiOjEwNX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbS9BZGFtL3VwZGF0ZV80L1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjE3NDEzLjUwN30seyJ2IjoxNC43NTcyMDkzMjIwMzM5fSx7InYiOjE3NDEzLjUwN30seyJ2IjoxNC43NTcyMDkzMjIwMzM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0MTE4MjIyODc1MDk4OTIxfSx7InYiOjAuOTg3NDQxMDEyMTkxMjIyNX1dfSx7ImMiOlt7InYiOjEwNn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlbHVHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNy9SZWx1R3JhZCJ9LHsidiI6MTE4MH0seyJ2IjoxNzMzMC41MTl9LHsidiI6MTQuNjg2ODgwNTA4NDc0NTc3fSx7InYiOjE3MzMwLjUxOX0seyJ2IjoxNC42ODY4ODA1MDg0NzQ1Nzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDQwOTg1OTY1NTM5OTMyMDA0fSx7InYiOjAuOTg3ODUwODcxODQ2NjIxOH1dfSx7ImMiOlt7InYiOjEwN30seyJ2IjoiSG9zdCJ9LHsidiI6IkJpYXNBZGRHcmFkIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9zZXF1ZW50aWFsXzEvZGVuc2VfNy9CaWFzQWRkL0JpYXNBZGRHcmFkIn0seyJ2IjoxMTgwfSx7InYiOjE3MDY3LjN9LHsidiI6MTQuNDYzODEzNTU5MzIyMDM0fSx7InYiOjE3MDY3LjN9LHsidiI6MTQuNDYzODEzNTU5MzIyMDM0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDA0MDM2MzQ2MzQxNzMyMDcwNX0seyJ2IjowLjk4ODI1NDUwNjQ4MDc5NX1dfSx7ImMiOlt7InYiOjEwOH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbF8xL2Ryb3BvdXRfMS9kcm9wb3V0L011bCJ9LHsidiI6MTE4MH0seyJ2IjoxNjU2Ny4xNzd9LHsidiI6MTQuMDM5OTgwNTA4NDc0NTc2fSx7InYiOjE2NTY3LjE3N30seyJ2IjoxNC4wMzk5ODA1MDg0NzQ1NzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDM5MTgwNjkzMDY2MTQyNjg1fSx7InYiOjAuOTg4NjQ2MzEzNDExNDU2NX1dfSx7ImMiOlt7InYiOjEwOX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoiQWRhbV8xL0FkYW0vdXBkYXRlXzUvUmVzb3VyY2VBcHBseUFkYW0ifSx7InYiOjExODB9LHsidiI6MTY1NDkuNjQxfSx7InYiOjE0LjAyNTExOTQ5MTUyNTQyM30seyJ2IjoxNjU0OS42NDF9LHsidiI6MTQuMDI1MTE5NDkxNTI1NDIzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzOTEzOTIyMTE0NjQ3ODQwNn0seyJ2IjowLjk4OTAzNzcwNTYyMjkyMTN9XX0seyJjIjpbeyJ2IjoxMTB9LHsidiI6Ikhvc3QifSx7InYiOiJEYXRhc2V0Q2FyZGluYWxpdHkifSx7InYiOiJEYXRhc2V0Q2FyZGluYWxpdHkifSx7InYiOjIzNjB9LHsidiI6MTY1MTkuNjkxfSx7InYiOjYuOTk5ODY5MDY3Nzk2NjF9LHsidiI6MTY1MTkuNjkxfSx7InYiOjYuOTk5ODY5MDY3Nzk2NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDM5MDY4MzkwNjI2NzUwNjk2fSx7InYiOjAuOTg5NDI4Mzg5NTI5MTg4OH1dfSx7ImMiOlt7InYiOjExMX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kcm9wb3V0L2Ryb3BvdXRfMS9NdWwifSx7InYiOjExODB9LHsidiI6MTYzMTguMzg0fSx7InYiOjEzLjgyOTEzODk4MzA1MDg0OH0seyJ2IjoxNjMxOC4zODR9LHsidiI6MTMuODI5MTM4OTgzMDUwODQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzODU5MjMwNzg0MDk0NjgxNH0seyJ2IjowLjk4OTgxNDMxMjYwNzU5ODJ9XX0seyJjIjpbeyJ2IjoxMTJ9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZHJvcG91dC9kcm9wb3V0XzEvTXVsXzMifSx7InYiOjExODB9LHsidiI6MTQ4MzkuNzA0fSx7InYiOjEyLjU3NjAyMDMzODk4MzA1MX0seyJ2IjoxNDgzOS43MDR9LHsidiI6MTIuNTc2MDIwMzM4OTgzMDUxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzNTA5NTI5MDM4MTQ4MjAwNX0seyJ2IjowLjk5MDE2NTI2NTUxMTQxM31dfSx7ImMiOlt7InYiOjExM30seyJ2IjoiSG9zdCJ9LHsidiI6IkxvZ2ljYWxBbmQifSx7InYiOiJMb2dpY2FsQW5kIn0seyJ2IjoyMzkxfSx7InYiOjE0NTc3LjUwNn0seyJ2Ijo2LjA5NjgyMzkyMzA0NDc1MDV9LHsidiI6MTQ1NzcuNTA2fSx7InYiOjYuMDk2ODIzOTIzMDQ0NzUwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMzQ0NzUyMDI4ODE5MzA1NDN9LHsidiI6MC45OTA1MTAwMTc1NDAyMzI0fV19LHsiYyI6W3sidiI6MTE0fSx7InYiOiJIb3N0In0seyJ2IjoiU3VtIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL3dlaWdodGVkX2xvc3MvU3VtIn0seyJ2IjoxMTgwfSx7InYiOjEzNzgxLjgzOX0seyJ2IjoxMS42Nzk1MjQ1NzYyNzExODZ9LHsidiI6MTM3ODEuODM5fSx7InYiOjExLjY3OTUyNDU3NjI3MTE4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMzI1OTM0ODMxMTA5NzI2Njd9LHsidiI6MC45OTA4MzU5NTIzNzEzNDIxfV19LHsiYyI6W3sidiI6MTE1fSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvU2VsZWN0XzEifSx7InYiOjExODB9LHsidiI6MTM3ODAuODA4fSx7InYiOjExLjY3ODY1MDg0NzQ1NzYyOX0seyJ2IjoxMzc4MC44MDh9LHsidiI6MTEuNjc4NjUwODQ3NDU3NjI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAzMjU5MTA0NDgzODMyMzYxNH0seyJ2IjowLjk5MTE2MTg2MjgxOTcyNTR9XX0seyJjIjpbeyJ2IjoxMTZ9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2IjoiUmFnZ2VkTWFzay9jb3VudF9ub256ZXJvL0Nhc3QifSx7InYiOjEwfSx7InYiOjEzMzY2LjM5NX0seyJ2IjoxMzM2LjYzOTV9LHsidiI6MTMzNjYuMzk1fSx7InYiOjEzMzYuNjM5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMzE2MTA5NzUxMTYzODk3M30seyJ2IjowLjk5MTQ3Nzk3MjU3MDg4OTN9XX0seyJjIjpbeyJ2IjoxMTd9LHsidiI6Ikhvc3QifSx7InYiOiJSZXNvdXJjZUFwcGx5QWRhbSJ9LHsidiI6IkFkYW1fMS9BZGFtL3VwZGF0ZV80L1Jlc291cmNlQXBwbHlBZGFtIn0seyJ2IjoxMTgwfSx7InYiOjEyNTAzLjI3M30seyJ2IjoxMC41OTU5OTQwNjc3OTY2MX0seyJ2IjoxMjUwMy4yNzN9LHsidiI6MTAuNTk1OTk0MDY3Nzk2NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI5NTY5NzI3MDQxMzE3MjR9LHsidiI6MC45OTE3NzM2Njk4NDEzMDI0fV19LHsiYyI6W3sidiI6MTE4fSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9CaWFzQWRkXzEvQmlhc0FkZEdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoxMjExMy44NDN9LHsidiI6MTAuMjY1OTY4NjQ0MDY3Nzk3fSx7InYiOjEyMTEzLjg0M30seyJ2IjoxMC4yNjU5Njg2NDQwNjc3OTd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI4NjQ4NzQxMDg4MTQzMjF9LHsidiI6MC45OTIwNjAxNTcyNTIxODM5fV19LHsiYyI6W3sidiI6MTE5fSx7InYiOiJIb3N0In0seyJ2IjoiQmlhc0FkZEdyYWQifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMi9CaWFzQWRkXzEvQmlhc0FkZEdyYWRfMSJ9LHsidiI6MTE4MH0seyJ2IjoxMTk5NS4yMzV9LHsidiI6MTAuMTY1NDUzMzg5ODMwNTA5fSx7InYiOjExOTk1LjIzNX0seyJ2IjoxMC4xNjU0NTMzODk4MzA1MDl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI4MzY4MjM4MDQwMjY3OTR9LHsidiI6MC45OTIzNDM4Mzk2MzI1ODY1fV19LHsiYyI6W3sidiI6MTIwfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvU2VsZWN0In0seyJ2IjoxMTgwfSx7InYiOjExNjUxLjk5N30seyJ2Ijo5Ljg3NDU3MzcyODgxMzU1OX0seyJ2IjoxMTY1MS45OTd9LHsidiI6OS44NzQ1NzM3Mjg4MTM1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI3NTU2NDk0MjY5NjQwMjN9LHsidiI6MC45OTI2MTk0MDQ1NzUyODN9XX0seyJjIjpbeyJ2IjoxMjF9LHsidiI6Ikhvc3QifSx7InYiOiJNYXRNdWwifSx7InYiOiJncmFkaWVudF90YXBlL3NlcXVlbnRpYWwvZGVuc2VfMy9NYXRNdWxfMyJ9LHsidiI6MTE4MH0seyJ2IjoxMTM3NS45ODV9LHsidiI6OS42NDA2NjUyNTQyMzcyOX0seyJ2IjoxMTM3NS45ODV9LHsidiI6OS42NDA2NjUyNTQyMzcyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjY5MDM3MzcyMjc1MzM4OX0seyJ2IjowLjk5Mjg4ODQ0MTk0NzU1ODN9XX0seyJjIjpbeyJ2IjoxMjJ9LHsidiI6Ikhvc3QifSx7InYiOiJDdW1zdW0ifSx7InYiOiJSYWdnZWRNYXNrL1JhZ2dlZEZyb21Sb3dMZW5ndGhzL1Jvd1BhcnRpdGlvbkZyb21Sb3dMZW5ndGhzL0N1bXN1bSJ9LHsidiI6MTB9LHsidiI6MTExNjUuNzR9LHsidiI6MTExNi41NzR9LHsidiI6MTExNjUuNzR9LHsidiI6MTExNi41NzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI2NDA2NTE2NDM4ODgxMDQ3fSx7InYiOjAuOTkzMTUyNTA3MTExOTQ3MX1dfSx7ImMiOlt7InYiOjEyM30seyJ2IjoiSG9zdCJ9LHsidiI6IkVpbnN1bSJ9LHsidiI6ImVpbnN1bS9FaW5zdW0ifSx7InYiOjIxfSx7InYiOjEwNjE4LjkxM30seyJ2Ijo1MDUuNjYyNTIzODA5NTIzOH0seyJ2IjoxMDYxOC45MTN9LHsidiI6NTA1LjY2MjUyMzgwOTUyMzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI1MTEzMjkzMDQ2MTg4NH0seyJ2IjowLjk5MzQwMzY0MDA0MjQwOX1dfSx7ImMiOlt7InYiOjEyNH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1lYW4ifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvTWVhbiJ9LHsidiI6MTE4MH0seyJ2IjoxMDYxNy42Nzl9LHsidiI6OC45OTgwMzMwNTA4NDc0NTd9LHsidiI6MTA2MTcuNjc5fSx7InYiOjguOTk4MDMzMDUwODQ3NDU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyNTExMDM3NDY4Njg3ODA4fSx7InYiOjAuOTkzNjU0NzQzNzg5Mjc3OH1dfSx7ImMiOlt7InYiOjEyNX0seyJ2IjoiSG9zdCJ9LHsidiI6IkNhc3QifSx7InYiOiJDYXN0XzEifSx7InYiOjExfSx7InYiOjEwMzI2LjE5MX0seyJ2Ijo5MzguNzQ0NjM2MzYzNjM2NX0seyJ2IjoxMDMyNi4xOTF9LHsidiI6OTM4Ljc0NDYzNjM2MzYzNjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDI0NDIxMDE3NTQwNDg3NzR9LHsidiI6MC45OTM4OTg5NTM5NjQ2ODI2fV19LHsiYyI6W3sidiI6MTI2fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fMyJ9LHsidiI6MTE4MH0seyJ2IjoxMDE4OS42NTF9LHsidiI6OC42MzUyOTc0NTc2MjcxMTh9LHsidiI6MTAxODkuNjUxfSx7InYiOjguNjM1Mjk3NDU3NjI3MTE4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyNDA5ODEwNjA0OTIxNDg5NH0seyJ2IjowLjk5NDEzOTkzNTAyNTE3NDh9XX0seyJjIjpbeyJ2IjoxMjd9LHsidiI6Ikhvc3QifSx7InYiOiJTZWxlY3QifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0XzEifSx7InYiOjExODB9LHsidiI6MTAxMjguOTl9LHsidiI6OC41ODM4ODk4MzA1MDg0NzR9LHsidiI6MTAxMjguOTl9LHsidiI6OC41ODM4ODk4MzA1MDg0NzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDIzOTU0NjQ1Mjc2MDE5NDh9LHsidiI6MC45OTQzNzk0ODE0Nzc5MzV9XX0seyJjIjpbeyJ2IjoxMjh9LHsidiI6Ikhvc3QifSx7InYiOiJDYXN0In0seyJ2IjoiUGFydGl0aW9uZWRDYWxsL0Nhc3QifSx7InYiOjEwfSx7InYiOjk5MjAuOTl9LHsidiI6OTkyLjA5ODk5OTk5OTk5OTl9LHsidiI6OTkyMC45OX0seyJ2Ijo5OTIuMDk4OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjM0NjI3MzM4MjAxNDc1Njd9LHsidiI6MC45OTQ2MTQxMDg4MTYxMzY0fV19LHsiYyI6W3sidiI6MTI5fSx7InYiOiJIb3N0In0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvR3JlYXRlckVxdWFsIn0seyJ2IjoxMTgwfSx7InYiOjkyOTcuMTkxfSx7InYiOjcuODc4OTc1NDIzNzI4ODE0fSx7InYiOjkyOTcuMTkxfSx7InYiOjcuODc4OTc1NDIzNzI4ODE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAyMTk4NzQ3NDgwOTI3NTI0M30seyJ2IjowLjk5NDgzMzk4MzU2NDIyOTF9XX0seyJjIjpbeyJ2IjoxMzB9LHsidiI6Ikhvc3QifSx7InYiOiJSb3VuZCJ9LHsidiI6IlJvdW5kIn0seyJ2IjoyMX0seyJ2Ijo4NzgwLjg2Mn0seyJ2Ijo0MTguMTM2Mjg1NzE0Mjg1N30seyJ2Ijo4NzgwLjg2Mn0seyJ2Ijo0MTguMTM2Mjg1NzE0Mjg1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMjA3NjYzNzc5MzM3OTk4MTN9LHsidiI6MC45OTUwNDE2NDczNDM1NjcxfV19LHsiYyI6W3sidiI6MTMxfSx7InYiOiJIb3N0In0seyJ2IjoiU3VtIn0seyJ2IjoiUmFnZ2VkTWFzay9jb3VudF9ub256ZXJvL1N1bSJ9LHsidiI6MTB9LHsidiI6ODYwOS40MjJ9LHsidiI6ODYwLjk0MjIwMDAwMDAwMDF9LHsidiI6ODYwOS40MjJ9LHsidiI6ODYwLjk0MjIwMDAwMDAwMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDIwMzYwOTI5Mzc2MTMzMDh9LHsidiI6MC45OTUyNDUyNTY2MzczMjg0fV19LHsiYyI6W3sidiI6MTMyfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9TZWxlY3QifSx7InYiOjExODB9LHsidiI6ODE0OS4yMjZ9LHsidiI6Ni45MDYxMjM3Mjg4MTM1NTl9LHsidiI6ODE0OS4yMjZ9LHsidiI6Ni45MDYxMjM3Mjg4MTM1NTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE5MjcyNTg0NzM5ODUyMTZ9LHsidiI6MC45OTU0Mzc5ODI0ODQ3MjY5fV19LHsiYyI6W3sidiI6MTMzfSx7InYiOiJIb3N0In0seyJ2IjoiRGF0YXNldCJ9LHsidiI6Ikl0ZXJhdG9yOjpNb2RlbCJ9LHsidiI6MTE5MH0seyJ2IjoxNjUzNDE4LjgwMX0seyJ2IjoxMzg5LjQyNzU2Mzg2NTU0NjN9LHsidiI6Nzg4My43NzV9LHsidiI6Ni42MjUwMjEwMDg0MDMzNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE4NjQ0ODA0MDI4OTI1OTMyfSx7InYiOjAuOTk1NjI0NDMwNTI1MDE2MX1dfSx7ImMiOlt7InYiOjEzNH0seyJ2IjoiSG9zdCJ9LHsidiI6IlNlbGVjdCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvYmluYXJ5X2Nyb3NzZW50cm9weS9sb2dpc3RpY19sb3NzL1NlbGVjdCJ9LHsidiI6MTE4MH0seyJ2Ijo3ODQ2LjEyfSx7InYiOjYuNjQ5MjU0MjM3Mjg4MTM2fSx7InYiOjc4NDYuMTJ9LHsidiI6Ni42NDkyNTQyMzcyODgxMzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE4NTU1NzUxNTAwNzAwNjZ9LHsidiI6MC45OTU4MDk5ODgwNDAwMjMyfV19LHsiYyI6W3sidiI6MTM1fSx7InYiOiJIb3N0In0seyJ2IjoiQXNzaWduQWRkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9BZGFtL0Fzc2lnbkFkZFZhcmlhYmxlT3AifSx7InYiOjExODB9LHsidiI6Nzg0Mi40MDV9LHsidiI6Ni42NDYxMDU5MzIyMDMzODk1fSx7InYiOjc4NDIuNDA1fSx7InYiOjYuNjQ2MTA1OTMyMjAzMzg5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTg1NDY5NjU2NzgzMDM3MTV9LHsidiI6MC45OTU5OTU0NTc2OTY4MDYyfV19LHsiYyI6W3sidiI6MTM2fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNC9NYXRNdWwvUmVhZFZhcmlhYmxlT3AifSx7InYiOjExODB9LHsidiI6NzYwNy43NzJ9LHsidiI6Ni40NDcyNjQ0MDY3Nzk2NjF9LHsidiI6NzYwNy43NzJ9LHsidiI6Ni40NDcyNjQ0MDY3Nzk2NjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE3OTkyMDY4MjcxNDQ5ODk1fSx7InYiOjAuOTk2MTc1Mzc4Mzc5NTIwN31dfSx7ImMiOlt7InYiOjEzN30seyJ2IjoiSG9zdCJ9LHsidiI6Ik1hdE11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvc2VxdWVudGlhbC9kZW5zZV8zL01hdE11bF81In0seyJ2IjoxMTgwfSx7InYiOjc1NzIuOTE2fSx7InYiOjYuNDE3NzI1NDIzNzI4ODE0fSx7InYiOjc1NzIuOTE2fSx7InYiOjYuNDE3NzI1NDIzNzI4ODE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxNzkwOTYzNTI2MzI0ODU5fSx7InYiOjAuOTk2MzU0NDc0NzMyMTUzMn1dfSx7ImMiOlt7InYiOjEzOH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik5vdEVxdWFsIn0seyJ2IjoiUmFnZ2VkTWFzay9jb3VudF9ub256ZXJvL05vdEVxdWFsIn0seyJ2IjoxMH0seyJ2Ijo3NTE2LjQzMX0seyJ2Ijo3NTEuNjQzMX0seyJ2Ijo3NTE2LjQzMX0seyJ2Ijo3NTEuNjQzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTc3NzYwNTA1NTg1MTMzNzR9LHsidiI6MC45OTY1MzIyMzUyMzc3Mzg0fV19LHsiYyI6W3sidiI6MTM5fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fNiJ9LHsidiI6MTE4MH0seyJ2Ijo3NDAzLjA1OX0seyJ2Ijo2LjI3Mzc3ODgxMzU1OTMyMn0seyJ2Ijo3NDAzLjA1OX0seyJ2Ijo2LjI3Mzc3ODgxMzU1OTMyMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTc1MDc5MzA0MzU1NTYxMTJ9LHsidiI6MC45OTY3MDczMTQ1NDIwOTM5fV19LHsiYyI6W3sidiI6MTQwfSx7InYiOiJIb3N0In0seyJ2IjoiQXNzaWduQWRkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW0vQWRhbS9Bc3NpZ25BZGRWYXJpYWJsZU9wIn0seyJ2IjoxMTgwfSx7InYiOjc0MDAuNjAzfSx7InYiOjYuMjcxNjk3NDU3NjI3MTE5fSx7InYiOjc0MDAuNjAzfSx7InYiOjYuMjcxNjk3NDU3NjI3MTE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxNzUwMjEyMjA5NjQ0MjU0N30seyJ2IjowLjk5Njg4MjMzNTc2MzA1ODR9XX0seyJjIjpbeyJ2IjoxNDF9LHsidiI6Ikhvc3QifSx7InYiOiJOZWcifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9OZWcifSx7InYiOjExODB9LHsidiI6NzI3OS4zNjd9LHsidiI6Ni4xNjg5NTUwODQ3NDU3NjN9LHsidiI6NzI3OS4zNjd9LHsidiI6Ni4xNjg5NTUwODQ3NDU3NjN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE3MjE1NDAzOTM2NTE5MDUyfSx7InYiOjAuOTk3MDU0NDg5ODAyNDIzNn1dfSx7ImMiOlt7InYiOjE0Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvYWRkIn0seyJ2IjoxMTgwfSx7InYiOjY2NzcuMjU3fSx7InYiOjUuNjU4NjkyMzcyODgxMzU1fSx7InYiOjY2NzcuMjU3fSx7InYiOjUuNjU4NjkyMzcyODgxMzU1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxNTc5MTQzODUxOTcxNTk4M30seyJ2IjowLjk5NzIxMjQwNDE4NzYyMDh9XX0seyJjIjpbeyJ2IjoxNDN9LHsidiI6Ikhvc3QifSx7InYiOiJSb3VuZCJ9LHsidiI6IlBhcnRpdGlvbmVkQ2FsbC9Sb3VuZCJ9LHsidiI6MTB9LHsidiI6NjU3OC4zMzd9LHsidiI6NjU3LjgzMzd9LHsidiI6NjU3OC4zMzd9LHsidiI6NjU3LjgzMzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE1NTU3NDk2NzgzMTA2MTMyfSx7InYiOjAuOTk3MzY3OTc5MTU1NDUxOH1dfSx7ImMiOlt7InYiOjE0NH0seyJ2IjoiSG9zdCJ9LHsidiI6IkdyZWF0ZXJFcXVhbCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9HcmVhdGVyRXF1YWwifSx7InYiOjExODB9LHsidiI6NjM5NS41MTV9LHsidiI6NS40MTk5Mjc5NjYxMDE2OTV9LHsidiI6NjM5NS41MTV9LHsidiI6NS40MTk5Mjc5NjYxMDE2OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE1MTI1MTMwMjYyOTgzOTQzfSx7InYiOjAuOTk3NTE5MjMwNDU4MDgxN31dfSx7ImMiOlt7InYiOjE0NX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9hZGQifSx7InYiOjExODB9LHsidiI6NjM0NC43MDV9LHsidiI6NS4zNzY4Njg2NDQwNjc3OTZ9LHsidiI6NjM0NC43MDV9LHsidiI6NS4zNzY4Njg2NDQwNjc3OTZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDE1MDA0OTY2NzAwMTMzNjk1fSx7InYiOjAuOTk3NjY5MjgwMTI1MDgzfV19LHsiYyI6W3sidiI6MTQ2fSx7InYiOiJIb3N0In0seyJ2IjoiTG9nMXAifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9Mb2cxcCJ9LHsidiI6MTE4MH0seyJ2Ijo2MTMzLjA4N30seyJ2Ijo1LjE5NzUzMTM1NTkzMjIwM30seyJ2Ijo2MTMzLjA4N30seyJ2Ijo1LjE5NzUzMTM1NTkzMjIwM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTQ1MDQ0OTg4MjI4ODAzMTd9LHsidiI6MC45OTc4MTQzMjUxMTMzMTE4fV19LHsiYyI6W3sidiI6MTQ3fSx7InYiOiJIb3N0In0seyJ2IjoiTGVzcyJ9LHsidiI6Ikxlc3MifSx7InYiOjEwfSx7InYiOjU2MTguMzI5fSx7InYiOjU2MS44MzI5fSx7InYiOjU2MTguMzI5fSx7InYiOjU2MS44MzI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMzI4NzExNzI5Nzg3MjA3NH0seyJ2IjowLjk5Nzk0NzE5NjI4NjI5MDV9XX0seyJjIjpbeyJ2IjoxNDh9LHsidiI6Ikhvc3QifSx7InYiOiJFaW5zdW0ifSx7InYiOiJQYXJ0aXRpb25lZENhbGwvZWluc3VtL0VpbnN1bSJ9LHsidiI6MTB9LHsidiI6NTM3MS43NzF9LHsidiI6NTM3LjE3NzF9LHsidiI6NTM3MS43NzF9LHsidiI6NTM3LjE3NzF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEyNzA0MDE3NzU1ODY3OTAzfSx7InYiOjAuOTk4MDc0MjM2NDYzODQ5Mn1dfSx7ImMiOlt7InYiOjE0OX0seyJ2IjoiSG9zdCJ9LHsidiI6IkxvZzFwIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weS9sb2dpc3RpY19sb3NzL0xvZzFwIn0seyJ2IjoxMTgwfSx7InYiOjUwNjIuMzEzfSx7InYiOjQuMjkwMDk1NzYyNzExODY0fSx7InYiOjUwNjIuMzEzfSx7InYiOjQuMjkwMDk1NzYyNzExODY0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMTk3MjE2MjI5NzY0MDkzMX0seyJ2IjowLjk5ODE5Mzk1ODA4NjgyNTV9XX0seyJjIjpbeyJ2IjoxNTB9LHsidiI6Ikhvc3QifSx7InYiOiJNaW5pbXVtIn0seyJ2IjoiY2xpcF9ieV92YWx1ZS9NaW5pbXVtIn0seyJ2IjoyMX0seyJ2Ijo1MDM2LjY2Nn0seyJ2IjoyMzkuODQxMjM4MDk1MjM4MX0seyJ2Ijo1MDM2LjY2Nn0seyJ2IjoyMzkuODQxMjM4MDk1MjM4MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTE5MTE1MDgxOTYxNTY1NzF9LHsidiI6MC45OTgzMTMwNzMxNjg3ODcxfV19LHsiYyI6W3sidiI6MTUxfSx7InYiOiJIb3N0In0seyJ2IjoiRXhwIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvRXhwIn0seyJ2IjoxMTgwfSx7InYiOjQ5NjEuNzIzfSx7InYiOjQuMjA0ODQ5OTk5OTk5OTk5NX0seyJ2Ijo0OTYxLjcyM30seyJ2Ijo0LjIwNDg0OTk5OTk5OTk5OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDExNzM0MjcxMDc5NjMwNTY2fSx7InYiOjAuOTk4NDMwNDE1ODc5NTgzNX1dfSx7ImMiOlt7InYiOjE1Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzEifSx7InYiOjExODB9LHsidiI6NDYxMS42NDJ9LHsidiI6My45MDgxNzExODY0NDA2Nzh9LHsidiI6NDYxMS42NDJ9LHsidiI6My45MDgxNzExODY0NDA2Nzh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjowLjAwMDEwOTA2MzQzODk1MDk2NDUzfSx7InYiOjAuOTk4NTM5NDc5MzE4NTM0NX1dfSx7ImMiOlt7InYiOjE1M30seyJ2IjoiSG9zdCJ9LHsidiI6Ik1heGltdW0ifSx7InYiOiJjbGlwX2J5X3ZhbHVlIn0seyJ2IjoyMX0seyJ2Ijo0NTQwLjE3NX0seyJ2IjoyMTYuMTk4ODA5NTIzODA5NTN9LHsidiI6NDU0MC4xNzV9LHsidiI6MjE2LjE5ODgwOTUyMzgwOTUzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MC4wMDAxMDczNzMyNzM3NTc4NDkyNX0seyJ2IjowLjk5ODY0Njg1MjU5MjI5MjR9XX0seyJjIjpbeyJ2IjoxNTR9LHsidiI6Ikhvc3QifSx7InYiOiJHYXRoZXJWMiJ9LHsidiI6IkdhdGhlclYyIn0seyJ2IjozMH0seyJ2Ijo0NDY4Ljk1Nn0seyJ2IjoxNDguOTY1Mn0seyJ2Ijo0NDY4Ljk1Nn0seyJ2IjoxNDguOTY1Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjAuMDAwMTA1Njg4OTczNjYyODYxNjZ9LHsidiI6MC45OTg3NTI1NDE1NjU5NTUyfV19LHsiYyI6W3sidiI6MTU1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlL01hdE11bC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTE4MH0seyJ2Ijo0MjIzLjkzOX0seyJ2IjozLjU3OTYwOTMyMjAzMzg5ODd9LHsidiI6NDIyMy45Mzl9LHsidiI6My41Nzk2MDkzMjIwMzM4OTg3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS45ODk0NDIyMjU5ODE1MWUtMDV9LHsidiI6MC45OTg4NTI0MzU5ODgyMTQ5fV19LHsiYyI6W3sidiI6MTU2fSx7InYiOiJIb3N0In0seyJ2IjoiU3ViIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3Mvc3ViIn0seyJ2IjoxMTgwfSx7InYiOjM4OTMuNzZ9LHsidiI6My4yOTk3OTY2MTAxNjk0OTE2fSx7InYiOjM4OTMuNzZ9LHsidiI6My4yOTk3OTY2MTAxNjk0OTE2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS4yMDg1ODI0NTM5MjIyMTllLTA1fSx7InYiOjAuOTk4OTQ0NTIxODEyNzU0Mn1dfSx7ImMiOlt7InYiOjE1N30seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWxEaXYifSx7InYiOiJSZWFsRGl2In0seyJ2Ijo2M30seyJ2IjozODU4Ljg2Mn0seyJ2Ijo2MS4yNTE3Nzc3Nzc3Nzc3OH0seyJ2IjozODU4Ljg2Mn0seyJ2Ijo2MS4yNTE3Nzc3Nzc3Nzc3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuMTI2MDUwMTE3NDQ2MTdlLTA1fSx7InYiOjAuOTk5MDM1NzgyMzEzOTI4Nn1dfSx7ImMiOlt7InYiOjE1OH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik5lZyJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9OZWcifSx7InYiOjExODB9LHsidiI6MzQzNi40NjJ9LHsidiI6Mi45MTIyNTU5MzIyMDMzODk2fSx7InYiOjM0MzYuNDYyfSx7InYiOjIuOTEyMjU1OTMyMjAzMzg5Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjguMTI3MDkxNDY4NTk4NTkzZS0wNX0seyJ2IjowLjk5OTExNzA1MzIyODYxNDd9XX0seyJjIjpbeyJ2IjoxNTl9LHsidiI6Ikhvc3QifSx7InYiOiJTZWxlY3QifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL1NlbGVjdF8yIn0seyJ2IjoxMTgwfSx7InYiOjMxNjUuMTYxfSx7InYiOjIuNjgyMzM5ODMwNTA4NDc0N30seyJ2IjozMTY1LjE2MX0seyJ2IjoyLjY4MjMzOTgzMDUwODQ3NDd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjQ4NTQ3NTc0Nzk3NTk2N2UtMDV9LHsidiI6MC45OTkxOTE5MDc5ODYwOTQ1fV19LHsiYyI6W3sidiI6MTYwfSx7InYiOiJIb3N0In0seyJ2IjoiTWluaW11bSJ9LHsidiI6IlBhcnRpdGlvbmVkQ2FsbC9jbGlwX2J5X3ZhbHVlL01pbmltdW0ifSx7InYiOjEwfSx7InYiOjMwOTEuNjQ4fSx7InYiOjMwOS4xNjQ4fSx7InYiOjMwOTEuNjQ4fSx7InYiOjMwOS4xNjQ4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny4zMTE2MjA1MjI3MDkwODRlLTA1fSx7InYiOjAuOTk5MjY1MDI0MTkxMzIxNn1dfSx7ImMiOlt7InYiOjE2MX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1ha2VJdGVyYXRvciJ9LHsidiI6Ik1ha2VJdGVyYXRvciJ9LHsidiI6MTB9LHsidiI6MzAxNi40MDR9LHsidiI6MzAxLjY0MDR9LHsidiI6MzAxNi40MDR9LHsidiI6MzAxLjY0MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjEzMzY3MTU1MzU0NzQxOGUtMDV9LHsidiI6MC45OTkzMzYzNjA5MDY4NTcxfV19LHsiYyI6W3sidiI6MTYyfSx7InYiOiJIb3N0In0seyJ2IjoiTWluIn0seyJ2IjoiTWluIn0seyJ2IjoyMX0seyJ2IjoyNTAyLjF9LHsidiI6MTE5LjE0NzYxOTA0NzYxOTA1fSx7InYiOjI1MDIuMX0seyJ2IjoxMTkuMTQ3NjE5MDQ3NjE5MDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1LjkxNzM2MzcxOTg4OTk3MzVlLTA1fSx7InYiOjAuOTk5Mzk1NTM0NTQ0MDU1OX1dfSx7ImMiOlt7InYiOjE2M30seyJ2IjoiSG9zdCJ9LHsidiI6IlN1YiJ9LHsidiI6IlN1YiJ9LHsidiI6MTA1fSx7InYiOjI0NTkuNjA2fSx7InYiOjIzLjQyNDgxOTA0NzYxOTA1fSx7InYiOjI0NTkuNjA2fSx7InYiOjIzLjQyNDgxOTA0NzYxOTA1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS44MTY4NjcxNTU0Mzg5MTEzZS0wNX0seyJ2IjowLjk5OTQ1MzcwMzIxNTYxMDN9XX0seyJjIjpbeyJ2IjoxNjR9LHsidiI6Ikhvc3QifSx7InYiOiJNYXhpbXVtIn0seyJ2IjoiUGFydGl0aW9uZWRDYWxsL2NsaXBfYnlfdmFsdWUifSx7InYiOjEwfSx7InYiOjIzMTguMDQ2fSx7InYiOjIzMS44MDQ2fSx7InYiOjIzMTguMDQ2fSx7InYiOjIzMS44MDQ2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS40ODIwODM1NzAzNzUzMTRlLTA1fSx7InYiOjAuOTk5NTA4NTI0MDUxMzE0MX1dfSx7ImMiOlt7InYiOjE2NX0seyJ2IjoiSG9zdCJ9LHsidiI6IkRlbGV0ZUl0ZXJhdG9yIn0seyJ2IjoiRGVsZXRlSXRlcmF0b3IifSx7InYiOjEwfSx7InYiOjIzMDMuMDI4fSx7InYiOjIzMC4zMDI4fSx7InYiOjIzMDMuMDI4fSx7InYiOjIzMC4zMDI4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS40NDY1NjY2MTcyNzc3OTI2ZS0wNX0seyJ2IjowLjk5OTU2Mjk4OTcxNzQ4Njh9XX0seyJjIjpbeyJ2IjoxNjZ9LHsidiI6Ikhvc3QifSx7InYiOiJGbG9vciJ9LHsidiI6IkZsb29yIn0seyJ2IjoyMX0seyJ2IjoyMjg3LjYyM30seyJ2IjoxMDguOTM0NDI4NTcxNDI4NTd9LHsidiI6MjI4Ny42MjN9LHsidiI6MTA4LjkzNDQyODU3MTQyODU3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS40MTAxMzQ0MjUwNzcyNzk1ZS0wNX0seyJ2IjowLjk5OTYxNzA5MTA2MTczNzZ9XX0seyJjIjpbeyJ2IjoxNjd9LHsidiI6Ikhvc3QifSx7InYiOiJNYXgifSx7InYiOiJNYXgifSx7InYiOjIxfSx7InYiOjIyNzMuOTkyfSx7InYiOjEwOC4yODUzMzMzMzMzMzMzNH0seyJ2IjoyMjczLjk5Mn0seyJ2IjoxMDguMjg1MzMzMzMzMzMzMzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1LjM3Nzg5NzY3MDAwNTIxMjdlLTA1fSx7InYiOjAuOTk5NjcwODcwMDM4NDM3Nn1dfSx7ImMiOlt7InYiOjE2OH0seyJ2IjoiSG9zdCJ9LHsidiI6IklkZW50aXR5In0seyJ2IjoiSWRlbnRpdHkifSx7InYiOjIzODB9LHsidiI6MjAxNS40MzR9LHsidiI6MC44NDY4MjEwMDg0MDMzNjE0fSx7InYiOjIwMTUuNDM0fSx7InYiOjAuODQ2ODIxMDA4NDAzMzYxNH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuNzY2NDE4NjIwOTMxNTA5NGUtMDV9LHsidiI6MC45OTk3MTg1MzQyMjQ2NDY4fV19LHsiYyI6W3sidiI6MTY5fSx7InYiOiJIb3N0In0seyJ2IjoiQWJzIn0seyJ2IjoiQWJzIn0seyJ2IjoxMH0seyJ2IjoxODQ4LjMyM30seyJ2IjoxODQuODMyM30seyJ2IjoxODQ4LjMyM30seyJ2IjoxODQuODMyM30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMzcxMjA3OTcwNDQwMTA5ZS0wNX0seyJ2IjowLjk5OTc2MjI0NjMwNDM1MTN9XX0seyJjIjpbeyJ2IjoxNzB9LHsidiI6Ikhvc3QifSx7InYiOiJDb25jYXRWMiJ9LHsidiI6IlJhZ2dlZE1hc2svUmFnZ2VkRnJvbVJvd0xlbmd0aHMvUm93UGFydGl0aW9uRnJvbVJvd0xlbmd0aHMvY29uY2F0In0seyJ2IjoxMH0seyJ2IjoxMzE5LjMwOH0seyJ2IjoxMzEuOTMwOH0seyJ2IjoxMzE5LjMwOH0seyJ2IjoxMzEuOTMwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMTIwMTA5MjI2MDc0MzM4ZS0wNX0seyJ2IjowLjk5OTc5MzQ0NzM5NjYxMn1dfSx7ImMiOlt7InYiOjE3MX0seyJ2IjoiSG9zdCJ9LHsidiI6Ik1pbmltdW0ifSx7InYiOiJNaW5pbXVtIn0seyJ2IjoyMX0seyJ2IjoxMjczLjg0OH0seyJ2Ijo2MC42NTk0Mjg1NzE0Mjg1N30seyJ2IjoxMjczLjg0OH0seyJ2Ijo2MC42NTk0Mjg1NzE0Mjg1N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMDEyNTk4MTkzNDU5MjU1M2UtMDV9LHsidiI6MC45OTk4MjM1NzMzNzg1NDY3fV19LHsiYyI6W3sidiI6MTcyfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0VjIifSx7InYiOiJTZWxlY3RWMiJ9LHsidiI6ODR9LHsidiI6ODEzLjQ5M30seyJ2Ijo5LjY4NDQ0MDQ3NjE5MDQ3OH0seyJ2Ijo4MTMuNDkzfSx7InYiOjkuNjg0NDQwNDc2MTkwNDc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS45MjM4Nzc1Mjg3MDk2NjZlLTA1fSx7InYiOjAuOTk5ODQyODEyMTUzODMzN31dfSx7ImMiOlt7InYiOjE3M30seyJ2IjoiSG9zdCJ9LHsidiI6IlN0cmlkZWRTbGljZSJ9LHsidiI6IlN0cmlkZWRTbGljZSJ9LHsidiI6ODR9LHsidiI6NjA4Ljk5fSx7InYiOjcuMjQ5ODgwOTUyMzgwOTUzfSx7InYiOjYwOC45OX0seyJ2Ijo3LjI0OTg4MDk1MjM4MDk1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNDQwMjM2MzM0MTg5NTk4N2UtMDV9LHsidiI6MC45OTk4NTcyMTQ1MTcxNzU3fV19LHsiYyI6W3sidiI6MTc0fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6NzB9LHsidiI6NTk2LjE1Nn0seyJ2Ijo4LjUxNjUxNDI4NTcxNDI4NX0seyJ2Ijo1OTYuMTU2fSx7InYiOjguNTE2NTE0Mjg1NzE0Mjg1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS40MDk4ODQ0NTEzNzg3MzI2ZS0wNX0seyJ2IjowLjk5OTg3MTMxMzM2MTY4OTR9XX0seyJjIjpbeyJ2IjoxNzV9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWxfMS9kZW5zZV81L0JpYXNBZGQvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjM0OC40Mzd9LHsidiI6MzQuODQzN30seyJ2IjozNDguNDM3fSx7InYiOjM0Ljg0Mzd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjI0MDM5MTkyMDY1NTg2ZS0wNn0seyJ2IjowLjk5OTg3OTU1Mzc1MzYxMDJ9XX0seyJjIjpbeyJ2IjoxNzZ9LHsidiI6Ikhvc3QifSx7InYiOiJBbm9ueW1vdXNJdGVyYXRvclYyIn0seyJ2IjoiQW5vbnltb3VzSXRlcmF0b3JWMiJ9LHsidiI6MTB9LHsidiI6MzM5LjY2OX0seyJ2IjozMy45NjY4OTk5OTk5OTk5OTV9LHsidiI6MzM5LjY2OX0seyJ2IjozMy45NjY4OTk5OTk5OTk5OTV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjAzMzAzMjMyMjMzNDQ2OGUtMDZ9LHsidiI6MC45OTk4ODc1ODY3ODU5MzI1fV19LHsiYyI6W3sidiI6MTc3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzEvTWF0TXVsXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjMyMy4zNjV9LHsidiI6MzIuMzM2NX0seyJ2IjozMjMuMzY1fSx7InYiOjMyLjMzNjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo3LjY0NzQ0OTQxOTYxNjQwOGUtMDZ9LHsidiI6MC45OTk4OTUyMzQyMzUzNTIxfV19LHsiYyI6W3sidiI6MTc4fSx7InYiOiJIb3N0In0seyJ2IjoiQ29uY2F0VjIifSx7InYiOiJDb25jYXRWMiJ9LHsidiI6NDJ9LHsidiI6Mjg0LjgxN30seyJ2Ijo2Ljc4MTM1NzE0Mjg1NzE0M30seyJ2IjoyODQuODE3fSx7InYiOjYuNzgxMzU3MTQyODU3MTQzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni43MzU4MDUwNTQxODYwOTVlLTA2fSx7InYiOjAuOTk5OTAxOTcwMDQwNDA2M31dfSx7ImMiOlt7InYiOjE3OX0seyJ2IjoiSG9zdCJ9LHsidiI6IlNoYXBlIn0seyJ2IjoiU2hhcGUifSx7InYiOjEwNH0seyJ2IjoyNzguMTM0fSx7InYiOjIuNjc0MzY1Mzg0NjE1Mzg0OH0seyJ2IjoyNzguMTM0fSx7InYiOjIuNjc0MzY1Mzg0NjE1Mzg0OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuNTc3NzU0ODQ5Mzk4MDE3ZS0wNn0seyJ2IjowLjk5OTkwODU0Nzc5NTI1NTZ9XX0seyJjIjpbeyJ2IjoxODB9LHsidiI6Ikhvc3QifSx7InYiOiJFcXVhbCJ9LHsidiI6IkVxdWFsIn0seyJ2Ijo2M30seyJ2IjoyNjAuNTAyfSx7InYiOjQuMTM0OTUyMzgwOTUyMzgxfSx7InYiOjI2MC41MDJ9LHsidiI6NC4xMzQ5NTIzODA5NTIzODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo2LjE2MDc2NTI5MjE4OTY3MmUtMDZ9LHsidiI6MC45OTk5MTQ3MDg1NjA1NDc4fV19LHsiYyI6W3sidiI6MTgxfSx7InYiOiJIb3N0In0seyJ2IjoiTWVhbiJ9LHsidiI6Ik1lYW4ifSx7InYiOjEwfSx7InYiOjI1Mi4wNTl9LHsidiI6MjUuMjA1OX0seyJ2IjoyNTIuMDU5fSx7InYiOjI1LjIwNTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo1Ljk2MTA5MTgxMDM2NjI4ZS0wNn0seyJ2IjowLjk5OTkyMDY2OTY1MjM1ODJ9XX0seyJjIjpbeyJ2IjoxODJ9LHsidiI6Ikhvc3QifSx7InYiOiJQYWNrIn0seyJ2IjoiUGFjayJ9LHsidiI6NjJ9LHsidiI6MjM3LjM4M30seyJ2IjozLjgyODc1ODA2NDUxNjEyOX0seyJ2IjoyMzcuMzgzfSx7InYiOjMuODI4NzU4MDY0NTE2MTI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS42MTQwMTA0Mzg5MDU4ODU2ZS0wNn0seyJ2IjowLjk5OTkyNjI4MzY2Mjc5N31dfSx7ImMiOlt7InYiOjE4M30seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzcvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoyMTMuNDYzfSx7InYiOjIxLjM0NjN9LHsidiI6MjEzLjQ2M30seyJ2IjoyMS4zNDYzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NS4wNDgzMTIyNjQ2NTMxODVlLTA2fSx7InYiOjAuOTk5OTMxMzMxOTc1MDYxN31dfSx7ImMiOlt7InYiOjE4NH0seyJ2IjoiSG9zdCJ9LHsidiI6IlRyYW5zcG9zZSJ9LHsidiI6IlRyYW5zcG9zZSJ9LHsidiI6MjF9LHsidiI6MTg4LjI1NH0seyJ2Ijo4Ljk2NDQ3NjE5MDQ3NjE5fSx7InYiOjE4OC4yNTR9LHsidiI6OC45NjQ0NzYxOTA0NzYxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuNDUyMTI5NzY5ODg5OTYxZS0wNn0seyJ2IjowLjk5OTkzNTc4NDEwNDgzMTV9XX0seyJjIjpbeyJ2IjoxODV9LHsidiI6Ikhvc3QifSx7InYiOiJBZGRWMiJ9LHsidiI6IkFkZFYyIn0seyJ2Ijo0Mn0seyJ2IjoxODcuNTcxfSx7InYiOjQuNDY1OTc2MTkwNDc2MTkxfSx7InYiOjE4Ny41NzF9LHsidiI6NC40NjU5NzYxOTA0NzYxOTF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0LjQzNTk3NzEwMDQ0OTU1MmUtMDZ9LHsidiI6MC45OTk5NDAyMjAwODE5MzJ9XX0seyJjIjpbeyJ2IjoxODZ9LHsidiI6Ikhvc3QifSx7InYiOiJTaHVmZmxlRGF0YXNldFYzIn0seyJ2IjoiU2h1ZmZsZURhdGFzZXRWMy9fNiJ9LHsidiI6MTB9LHsidiI6MTA4Ljg4Nn0seyJ2IjoxMC44ODg2fSx7InYiOjEwOC44ODZ9LHsidiI6MTAuODg4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNTc1MTA5MTcyMzExMDE3M2UtMDZ9LHsidiI6MC45OTk5NDI3OTUxOTExMDQzfV19LHsiYyI6W3sidiI6MTg3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVzaGFwZSJ9LHsidiI6IlJlc2hhcGUifSx7InYiOjQyfSx7InYiOjEwOC4wNTR9LHsidiI6Mi41NzI3MTQyODU3MTQyODZ9LHsidiI6MTA4LjA1NH0seyJ2IjoyLjU3MjcxNDI4NTcxNDI4Nn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNTU1NDMyNzE0MDc2MTQxZS0wNn0seyJ2IjowLjk5OTk0NTM1MDYyMzgxODR9XX0seyJjIjpbeyJ2IjoxODh9LHsidiI6Ikhvc3QifSx7InYiOiJTcXVlZXplIn0seyJ2IjoiU3F1ZWV6ZSJ9LHsidiI6MTB9LHsidiI6OTguODczfSx7InYiOjkuODg3M30seyJ2Ijo5OC44NzN9LHsidiI6OS44ODczfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4zMzgzMDU4MzU0MDQ5ODUzZS0wNn0seyJ2IjowLjk5OTk0NzY4ODkyOTY1Mzh9XX0seyJjIjpbeyJ2IjoxODl9LHsidiI6Ikhvc3QifSx7InYiOiJGaWxsIn0seyJ2IjoiRmlsbCJ9LHsidiI6MTB9LHsidiI6OTYuNjc4fSx7InYiOjkuNjY3OH0seyJ2Ijo5Ni42Nzh9LHsidiI6OS42Njc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4yODYzOTQ5ODcwNTY5NjMzZS0wNn0seyJ2IjowLjk5OTk0OTk3NTMyNDY0MDh9XX0seyJjIjpbeyJ2IjoxOTB9LHsidiI6Ikhvc3QifSx7InYiOiJCcm9hZGNhc3RUbyJ9LHsidiI6IkJyb2FkY2FzdFRvIn0seyJ2Ijo0Mn0seyJ2Ijo4OS43ODh9LHsidiI6Mi4xMzc4MDk1MjM4MDk1MjM2fSx7InYiOjg5Ljc4OH0seyJ2IjoyLjEzNzgwOTUyMzgwOTUyMzZ9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjEyMzQ0OTMxNzI5OTM5MmUtMDZ9LHsidiI6MC45OTk5NTIwOTg3NzM5NTgxfV19LHsiYyI6W3sidiI6MTkxfSx7InYiOiJIb3N0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0In0seyJ2IjoiVGVuc29yU2xpY2VEYXRhc2V0L18xIn0seyJ2IjoxMH0seyJ2Ijo4MS40MDh9LHsidiI6OC4xNDA4fSx7InYiOjgxLjQwOH0seyJ2Ijo4LjE0MDh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjkyNTI2NTc1OTU5NzE1ZS0wNn0seyJ2IjowLjk5OTk1NDAyNDAzOTcxNzd9XX0seyJjIjpbeyJ2IjoxOTJ9LHsidiI6Ikhvc3QifSx7InYiOiJNYXhpbXVtIn0seyJ2IjoiTWF4aW11bSJ9LHsidiI6NDJ9LHsidiI6NzguNDA3fSx7InYiOjEuODY2ODMzMzMzMzMzMzMzM30seyJ2Ijo3OC40MDd9LHsidiI6MS44NjY4MzMzMzMzMzMzMzMzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS44NTQyOTMzNDIzMzQwOTJlLTA2fSx7InYiOjAuOTk5OTU1ODc4MzMzMDZ9XX0seyJjIjpbeyJ2IjoxOTN9LHsidiI6Ikhvc3QifSx7InYiOiJSYW5nZSJ9LHsidiI6IlJhbmdlIn0seyJ2Ijo0Mn0seyJ2Ijo3Ny4wNzF9LHsidiI6MS44MzUwMjM4MDk1MjM4MDk0fSx7InYiOjc3LjA3MX0seyJ2IjoxLjgzNTAyMzgwOTUyMzgwOTR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjgyMjY5NzQ5MTEzMDAxMTNlLTA2fSx7InYiOjAuOTk5OTU3NzAxMDMwNTUxMX1dfSx7ImMiOlt7InYiOjE5NH0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiQWRhbS9hZGQifSx7InYiOjEwfSx7InYiOjcyLjQzM30seyJ2Ijo3LjI0MzMwMDAwMDAwMDAwMDV9LHsidiI6NzIuNDMzfSx7InYiOjcuMjQzMzAwMDAwMDAwMDAwNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNzEzMDEwNjk2MzA2MjY0N2UtMDZ9LHsidiI6MC45OTk5NTk0MTQwNDEyNDc0fV19LHsiYyI6W3sidiI6MTk1fSx7InYiOiJIb3N0In0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2IjoiR3JlYXRlckVxdWFsIn0seyJ2IjoyMX0seyJ2Ijo3MS44NjV9LHsidiI6My40MjIxNDI4NTcxNDI4NTY3fSx7InYiOjcxLjg2NX0seyJ2IjozLjQyMjE0Mjg1NzE0Mjg1Njd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjY5OTU3NzcyOTYyNjY4NTRlLTA2fSx7InYiOjAuOTk5OTYxMTEzNjE4OTc3MX1dfSx7ImMiOlt7InYiOjE5Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2IjoiQWRhbV8xL0Nhc3RfMi9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6NjcuNTI5fSx7InYiOjYuNzUyODk5OTk5OTk5OTk5NX0seyJ2Ijo2Ny41Mjl9LHsidiI6Ni43NTI4OTk5OTk5OTk5OTk1fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS41OTcwMzMxMTA3NDg3NzExZS0wNn0seyJ2IjowLjk5OTk2MjcxMDY1MjA4Nzl9XX0seyJjIjpbeyJ2IjoxOTd9LHsidiI6Ikhvc3QifSx7InYiOiJTbGljZSJ9LHsidiI6IlNsaWNlIn0seyJ2IjoyMX0seyJ2Ijo2NS4xMzV9LHsidiI6My4xMDE2NjY2NjY2NjY2Njd9LHsidiI6NjUuMTM1fSx7InYiOjMuMTAxNjY2NjY2NjY2NjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS41NDA0MTU5OTQxNDUwNTJlLTA2fSx7InYiOjAuOTk5OTY0MjUxMDY4MDgyfV19LHsiYyI6W3sidiI6MTk4fSx7InYiOiJIb3N0In0seyJ2IjoiWmVyb3NMaWtlIn0seyJ2IjoiWmVyb3NMaWtlIn0seyJ2IjoyMX0seyJ2Ijo1OC45OTF9LHsidiI6Mi44MDkwOTUyMzgwOTUyMzh9LHsidiI6NTguOTkxfSx7InYiOjIuODA5MDk1MjM4MDk1MjM4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4zOTUxMTI5MTc5NDkwNDA0ZS0wNn0seyJ2IjowLjk5OTk2NTY0NjE4MDk5OTl9XX0seyJjIjpbeyJ2IjoxOTl9LHsidiI6Ikhvc3QifSx7InYiOiJCcm9hZGNhc3RBcmdzIn0seyJ2IjoiQnJvYWRjYXN0QXJncyJ9LHsidiI6MjF9LHsidiI6NTcuOTI4fSx7InYiOjIuNzU4NDc2MTkwNDc2MTkwM30seyJ2Ijo1Ny45Mjh9LHsidiI6Mi43NTg0NzYxOTA0NzYxOTAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4zNjk5NzM0MDQ2MDMyNzg4ZS0wNn0seyJ2IjowLjk5OTk2NzAxNjE1NDQwNDV9XX0seyJjIjpbeyJ2IjoyMDB9LHsidiI6Ikhvc3QifSx7InYiOiJQbGFjZWhvbGRlciJ9LHsidiI6IlBsYWNlaG9sZGVyL18wIn0seyJ2IjoyMH0seyJ2Ijo1Ni43NTV9LHsidiI6Mi44Mzc3NX0seyJ2Ijo1Ni43NTV9LHsidiI6Mi44Mzc3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzQyMjMyNDM2NDQyODFlLTA2fSx7InYiOjAuOTk5OTY4MzU4Mzg2ODQxfV19LHsiYyI6W3sidiI6MjAxfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0XzMifSx7InYiOjEwfSx7InYiOjUwLjY2fSx7InYiOjUuMDY2fSx7InYiOjUwLjY2fSx7InYiOjUuMDY2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4xOTgwODgxOTAxMTg4MDQ0ZS0wNn0seyJ2IjowLjk5OTk2OTU1NjQ3NTAzMX1dfSx7ImMiOlt7InYiOjIwMn0seyJ2IjoiSG9zdCJ9LHsidiI6IkV4cGFuZERpbXMifSx7InYiOiJFeHBhbmREaW1zIn0seyJ2Ijo0Mn0seyJ2Ijo0NC4wMTV9LHsidiI6MS4wNDc5NzYxOTA0NzYxOTA0fSx7InYiOjQ0LjAxNX0seyJ2IjoxLjA0Nzk3NjE5MDQ3NjE5MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjA0MDkzNjY2OTcyMTI2M2UtMDZ9LHsidiI6MC45OTk5NzA1OTc0MTE3MDA4fV19LHsiYyI6W3sidiI6MjAzfSx7InYiOiJIb3N0In0seyJ2IjoiUG93In0seyJ2IjoiQWRhbS9Qb3cifSx7InYiOjEwfSx7InYiOjQzLjA5NX0seyJ2Ijo0LjMwOTV9LHsidiI6NDMuMDk1fSx7InYiOjQuMzA5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMDE5MTc5MDQ3NjM0NjIwNmUtMDZ9LHsidiI6MC45OTk5NzE2MTY1OTA3NDg0fV19LHsiYyI6W3sidiI6MjA0fSx7InYiOiJIb3N0In0seyJ2IjoiTWVhbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvTWVhbiJ9LHsidiI6MTB9LHsidiI6NDIuMDM2fSx7InYiOjQuMjAzNn0seyJ2Ijo0Mi4wMzZ9LHsidiI6NC4yMDM2fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6OS45NDEzNDEzMjY0NTc1NzJlLTA3fSx7InYiOjAuOTk5OTcyNjEwNzI0ODgxMX1dfSx7ImMiOlt7InYiOjIwNX0seyJ2IjoiSG9zdCJ9LHsidiI6IlN1bSJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvd2VpZ2h0ZWRfbG9zcy9TdW0ifSx7InYiOjEwfSx7InYiOjQxLjg4NX0seyJ2Ijo0LjE4ODQ5OTk5OTk5OTk5OTR9LHsidiI6NDEuODg1fSx7InYiOjQuMTg4NDk5OTk5OTk5OTk5NH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuOTA1NjMwNDQ2NzI4NDFlLTA3fSx7InYiOjAuOTk5OTczNjAxMjg3OTI1OH1dfSx7ImMiOlt7InYiOjIwNn0seyJ2IjoiSG9zdCJ9LHsidiI6IkJhdGNoRGF0YXNldFYyIn0seyJ2IjoiQmF0Y2hEYXRhc2V0VjIvXzkifSx7InYiOjEwfSx7InYiOjQxLjQ1M30seyJ2Ijo0LjE0NTMwMDAwMDAwMDAwMX0seyJ2Ijo0MS40NTN9LHsidiI6NC4xNDUzMDAwMDAwMDAwMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjgwMzQ2NDIyMTI3ODA5ZS0wN30seyJ2IjowLjk5OTk3NDU4MTYzNDM0Nzl9XX0seyJjIjpbeyJ2IjoyMDd9LHsidiI6Ikhvc3QifSx7InYiOiJNb2RlbERhdGFzZXQifSx7InYiOiJNb2RlbERhdGFzZXQifSx7InYiOjEwfSx7InYiOjQwLjgwN30seyJ2Ijo0LjA4MDd9LHsidiI6NDAuODA3fSx7InYiOjQuMDgwN30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNjUwNjg3ODc0ODg3MWUtMDd9LHsidiI6MC45OTk5NzU1NDY3MDMxMzU0fV19LHsiYyI6W3sidiI6MjA4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNS9NYXRNdWwvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjQwLjM3OH0seyJ2Ijo0LjAzNzh9LHsidiI6NDAuMzc4fSx7InYiOjQuMDM3OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNTQ5MjMxMTM3MTEzNTE5ZS0wN30seyJ2IjowLjk5OTk3NjUwMTYyNjI0OTF9XX0seyJjIjpbeyJ2IjoyMDl9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJtdWwifSx7InYiOjEwfSx7InYiOjQwLjI1M30seyJ2Ijo0LjAyNTN9LHsidiI6NDAuMjUzfSx7InYiOjQuMDI1M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjkuNTE5NjY5MTUwNTgyNzU0ZS0wN30seyJ2IjowLjk5OTk3NzQ1MzU5MzE2NDF9XX0seyJjIjpbeyJ2IjoyMTB9LHsidiI6Ikhvc3QifSx7InYiOiJQb3cifSx7InYiOiJBZGFtL1Bvd18xIn0seyJ2IjoxMH0seyJ2IjozOC43MDZ9LHsidiI6My44NzA2MDAwMDAwMDAwMDA1fSx7InYiOjM4LjcwNn0seyJ2IjozLjg3MDYwMDAwMDAwMDAwMDV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo5LjE1MzgxMDAwNTI3ODAyZS0wN30seyJ2IjowLjk5OTk3ODM2ODk3NDE2NDd9XX0seyJjIjpbeyJ2IjoyMTF9LHsidiI6Ikhvc3QifSx7InYiOiJUaWxlIn0seyJ2IjoiVGlsZSJ9LHsidiI6MjB9LHsidiI6MzYuNTE1fSx7InYiOjEuODI1NzV9LHsidiI6MzYuNTE1fSx7InYiOjEuODI1NzV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjYzNTY0NzUwNTM2Njc4N2UtMDd9LHsidiI6MC45OTk5NzkyMzI1Mzg5MTUyfV19LHsiYyI6W3sidiI6MjEyfSx7InYiOiJIb3N0In0seyJ2IjoiU3VtIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8yL3dlaWdodGVkX2xvc3MvU3VtIn0seyJ2IjoxMH0seyJ2IjozNC44NjV9LHsidiI6My40ODY1MDAwMDAwMDAwMDA0fSx7InYiOjM0Ljg2NX0seyJ2IjozLjQ4NjUwMDAwMDAwMDAwMDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo4LjI0NTQyOTI4MzE2MDcwMmUtMDd9LHsidiI6MC45OTk5ODAwNTcwODE4NDM1fV19LHsiYyI6W3sidiI6MjEzfSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fMiJ9LHsidiI6MTB9LHsidiI6MzMuMjMyfSx7InYiOjMuMzIzMn0seyJ2IjozMy4yMzJ9LHsidiI6My4zMjMyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ny44NTkyMzE0OTExMjI4MDFlLTA3fSx7InYiOjAuOTk5OTgwODQzMDA0OTkyNn1dfSx7ImMiOlt7InYiOjIxNH0seyJ2IjoiSG9zdCJ9LHsidiI6IkNhc3QifSx7InYiOiJBZGFtL0Nhc3RfMSJ9LHsidiI6MTB9LHsidiI6MjcuODc4fSx7InYiOjIuNzg3OH0seyJ2IjoyNy44Nzh9LHsidiI6Mi43ODc4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni41OTMwMzI0ODQwMzcxMTZlLTA3fSx7InYiOjAuOTk5OTgxNTAyMzA4MjQxfV19LHsiYyI6W3sidiI6MjE1fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJBZGFtL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoyNy43MDR9LHsidiI6Mi43NzA0fSx7InYiOjI3LjcwNH0seyJ2IjoyLjc3MDR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo2LjU1MTg4MjE5ODc4NjI5M2UtMDd9LHsidiI6MC45OTk5ODIxNTc0OTY0NjA5fV19LHsiYyI6W3sidiI6MjE2fSx7InYiOiJIb3N0In0seyJ2IjoiUmFuZ2UifSx7InYiOiJyYW5nZSJ9LHsidiI6MTB9LHsidiI6MjcuMDE0fSx7InYiOjIuNzAxNH0seyJ2IjoyNy4wMTR9LHsidiI6Mi43MDE0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Ni4zODg3MDAwMzMxMzY0NzVlLTA3fSx7InYiOjAuOTk5OTgyNzk2MzY2NDY0M31dfSx7ImMiOlt7InYiOjIxN30seyJ2IjoiSG9zdCJ9LHsidiI6IlNodWZmbGVEYXRhc2V0VjMifSx7InYiOiJTaHVmZmxlRGF0YXNldFYzIn0seyJ2IjoxfSx7InYiOjI2LjU4OH0seyJ2IjoyNi41ODh9LHsidiI6MjYuNTg4fSx7InYiOjI2LjU4OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuMjg3OTUyNzgzMDM5NjMyZS0wN30seyJ2IjowLjk5OTk4MzQyNTE2MTc0MjV9XX0seyJjIjpbeyJ2IjoyMTh9LHsidiI6Ikhvc3QifSx7InYiOiJTdWIifSx7InYiOiJzdWIifSx7InYiOjEwfSx7InYiOjI1Ljc2MX0seyJ2IjoyLjU3NjF9LHsidiI6MjUuNzYxfSx7InYiOjIuNTc2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjYuMDkyMzcwNjgwMTUyMDk3ZS0wN30seyJ2IjowLjk5OTk4NDAzNDM5ODgxMDZ9XX0seyJjIjpbeyJ2IjoyMTl9LHsidiI6Ikhvc3QifSx7InYiOiJEaXZOb05hbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMS93ZWlnaHRlZF9sb3NzL3ZhbHVlIn0seyJ2IjoxMH0seyJ2IjoyNS4wOH0seyJ2IjoyLjUwOH0seyJ2IjoyNS4wOH0seyJ2IjoyLjUwOH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjUuOTMxMzE2OTc3NTMyNDkzZS0wN30seyJ2IjowLjk5OTk4NDYyNzUzMDUwODN9XX0seyJjIjpbeyJ2IjoyMjB9LHsidiI6Ikhvc3QifSx7InYiOiJTdWIifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3Mvc3ViIn0seyJ2IjoxMH0seyJ2IjoyMi41OH0seyJ2IjoyLjI1OH0seyJ2IjoyMi41OH0seyJ2IjoyLjI1OH0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjUuMzQwMDc3MjQ2OTE3MjE0ZS0wN30seyJ2IjowLjk5OTk4NTE2MTUzODIzM31dfSx7ImMiOlt7InYiOjIyMX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROIn0seyJ2IjoxMH0seyJ2IjoyMC45MDJ9LHsidiI6Mi4wOTAyMDAwMDAwMDAwMDAzfSx7InYiOjIwLjkwMn0seyJ2IjoyLjA5MDIwMDAwMDAwMDAwMDN9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2Ijo0Ljk0MzIzNzEzOTcyODIzOGUtMDd9LHsidiI6MC45OTk5ODU2NTU4NjE5NDd9XX0seyJjIjpbeyJ2IjoyMjJ9LHsidiI6Ikhvc3QifSx7InYiOiJEaXZOb05hbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvd2VpZ2h0ZWRfbG9zcy92YWx1ZSJ9LHsidiI6MTB9LHsidiI6MjAuMjk0fSx7InYiOjIuMDI5NH0seyJ2IjoyMC4yOTR9LHsidiI6Mi4wMjk0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC43OTk0NDc2MzcyNDI2MDFlLTA3fSx7InYiOjAuOTk5OTg2MTM1ODA2NzEwN31dfSx7ImMiOlt7InYiOjIyM30seyJ2IjoiSG9zdCJ9LHsidiI6IkV4cCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9FeHAifSx7InYiOjEwfSx7InYiOjIwLjIyfSx7InYiOjIuMDIyfSx7InYiOjIwLjIyfSx7InYiOjIuMDIyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC43ODE5NDY5NDEyMTYzODllLTA3fSx7InYiOjAuOTk5OTg2NjE0MDAxNDA0OX1dfSx7ImMiOlt7InYiOjIyNH0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiQWRhbV8xL2FkZCJ9LHsidiI6MTB9LHsidiI6MjAuMDc3fSx7InYiOjIuMDA3NzAwMDAwMDAwMDAwM30seyJ2IjoyMC4wNzd9LHsidiI6Mi4wMDc3MDAwMDAwMDAwMDAzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC43NDgxMjgwMjg2MjUxOTVlLTA3fSx7InYiOjAuOTk5OTg3MDg4ODE0MjA3N31dfSx7ImMiOlt7InYiOjIyNX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzUifSx7InYiOjEwfSx7InYiOjE5LjA4Nn0seyJ2IjoxLjkwODU5OTk5OTk5OTk5OTl9LHsidiI6MTkuMDg2fSx7InYiOjEuOTA4NTk5OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuNTEzNzYwNTk5NDA5Mjk3M2UtMDd9LHsidiI6MC45OTk5ODc1NDAxOTAyNjc3fV19LHsiYyI6W3sidiI6MjI2fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvTWF0TXVsXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjE4Ljg5NX0seyJ2IjoxLjg4OTV9LHsidiI6MTguODk1fSx7InYiOjEuODg5NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuNDY4NTg5ODgzOTkwMjllLTA3fSx7InYiOjAuOTk5OTg3OTg3MDQ5MjU2MX1dfSx7ImMiOlt7InYiOjIyN30seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8zL0JpYXNBZGRfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTguMjA5fSx7InYiOjEuODIwOX0seyJ2IjoxOC4yMDl9LHsidiI6MS44MjA5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6NC4zMDYzNTM3MDE5MDk0NTdlLTA3fSx7InYiOjAuOTk5OTg4NDE3Njg0NjI2Mn1dfSx7ImMiOlt7InYiOjIyOH0seyJ2IjoiSG9zdCJ9LHsidiI6IlBvdyJ9LHsidiI6IkFkYW1fMS9Qb3cifSx7InYiOjEwfSx7InYiOjE4LjA3OX0seyJ2IjoxLjgwNzl9LHsidiI6MTguMDc5fSx7InYiOjEuODA3OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMjc1NjA5MjM1OTE3NDYzZS0wN30seyJ2IjowLjk5OTk4ODg0NTI0NTU0OTh9XX0seyJjIjpbeyJ2IjoyMjl9LHsidiI6Ikhvc3QifSx7InYiOiJNZWFuIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8yL01lYW4ifSx7InYiOjEwfSx7InYiOjE4LjA1N30seyJ2IjoxLjgwNTY5OTk5OTk5OTk5OTl9LHsidiI6MTguMDU3fSx7InYiOjEuODA1Njk5OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMjcwNDA2MzI2Mjg4MDQ3NmUtMDd9LHsidiI6MC45OTk5ODkyNzIyODYxODI0fV19LHsiYyI6W3sidiI6MjMwfSx7InYiOiJIb3N0In0seyJ2IjoiU2VsZWN0In0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvU2VsZWN0XzIifSx7InYiOjEwfSx7InYiOjE3LjkwMn0seyJ2IjoxLjc5MDJ9LHsidiI6MTcuOTAyfSx7InYiOjEuNzkwMn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjQuMjMzNzQ5NDYyOTg5OTAxZS0wN30seyJ2IjowLjk5OTk4OTY5NTY2MTEyODd9XX0seyJjIjpbeyJ2IjoyMzF9LHsidiI6Ikhvc3QifSx7InYiOiJSZWNpcHJvY2FsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvUmVjaXByb2NhbCJ9LHsidiI6MTB9LHsidiI6MTYuODEzfSx7InYiOjEuNjgxMjk5OTk5OTk5OTk5OH0seyJ2IjoxNi44MTN9LHsidiI6MS42ODEyOTk5OTk5OTk5OTk4fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My45NzYyMDU0MzYzMzM4ODRlLTA3fSx7InYiOjAuOTk5OTkwMDkzMjgxNjcyM31dfSx7ImMiOlt7InYiOjIzMn0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlY2lwcm9jYWwifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL1JlY2lwcm9jYWwifSx7InYiOjEwfSx7InYiOjE2LjQ2OX0seyJ2IjoxLjY0Njl9LHsidiI6MTYuNDY5fSx7InYiOjEuNjQ2OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuODk0ODUwODQ5NDAxMjIyZS0wN30seyJ2IjowLjk5OTk5MDQ4Mjc2Njc1NzN9XX0seyJjIjpbeyJ2IjoyMzN9LHsidiI6Ikhvc3QifSx7InYiOiJQb3cifSx7InYiOiJBZGFtXzEvUG93XzEifSx7InYiOjEwfSx7InYiOjE2LjI5fSx7InYiOjEuNjI5fSx7InYiOjE2LjI5fSx7InYiOjEuNjI5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My44NTI1MTgwODQ2ODkxNjhlLTA3fSx7InYiOjAuOTk5OTkwODY4MDE4NTY1N31dfSx7ImMiOlt7InYiOjIzNH0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8yL01hdE11bC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTYuMDAxfSx7InYiOjEuNjAwMX0seyJ2IjoxNi4wMDF9LHsidiI6MS42MDAxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My43ODQxNzA3NzE4MzAwNDJlLTA3fSx7InYiOjAuOTk5OTkxMjQ2NDM1NjQzfV19LHsiYyI6W3sidiI6MjM1fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fOSJ9LHsidiI6MTB9LHsidiI6MTUuODU5fSx7InYiOjEuNTg1OX0seyJ2IjoxNS44NTl9LHsidiI6MS41ODU5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My43NTA1ODgzNTUxMzEwOTM1ZS0wN30seyJ2IjowLjk5OTk5MTYyMTQ5NDQ3ODV9XX0seyJjIjpbeyJ2IjoyMzZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxNC4zNzR9LHsidiI6MS40Mzc0fSx7InYiOjE0LjM3NH0seyJ2IjoxLjQzNzR9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjozLjM5OTM5MTk1NTE0NTYxN2UtMDd9LHsidiI6MC45OTk5OTE5NjE0MzM2NzR9XX0seyJjIjpbeyJ2IjoyMzd9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9tdWwifSx7InYiOjEwfSx7InYiOjEzLjUyOX0seyJ2IjoxLjM1Mjl9LHsidiI6MTMuNTI5fSx7InYiOjEuMzUyOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjMuMTk5NTUyOTI2MTk3NjUyZS0wN30seyJ2IjowLjk5OTk5MjI4MTM4ODk2NjZ9XX0seyJjIjpbeyJ2IjoyMzh9LHsidiI6Ikhvc3QifSx7InYiOiJBZGQifSx7InYiOiJiaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcyJ9LHsidiI6MTB9LHsidiI6MTMuNDk3fSx7InYiOjEuMzQ5N30seyJ2IjoxMy40OTd9LHsidiI6MS4zNDk3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6My4xOTE5ODUwNTc2NDU3NzY1ZS0wN30seyJ2IjowLjk5OTk5MjYwMDU4NzQ3MjN9XX0seyJjIjpbeyJ2IjoyMzl9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9DYXN0XzMvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjEyLjUxOX0seyJ2IjoxLjI1MTl9LHsidiI6MTIuNTE5fSx7InYiOjEuMjUxOX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuOTYwNjkyMDc1MDI5MDc5ZS0wN30seyJ2IjowLjk5OTk5Mjg5NjY1NjY3OTh9XX0seyJjIjpbeyJ2IjoyNDB9LHsidiI6Ikhvc3QifSx7InYiOiJOb09wIn0seyJ2IjoiTm9PcCJ9LHsidiI6MjF9LHsidiI6MTIuNDh9LHsidiI6MC41OTQyODU3MTQyODU3MTQzfSx7InYiOjEyLjQ4fSx7InYiOjAuNTk0Mjg1NzE0Mjg1NzE0M30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuOTUxNDY4NzM1MjMxNDgwN2UtMDd9LHsidiI6MC45OTk5OTMxOTE4MDM1NTMzfV19LHsiYyI6W3sidiI6MjQxfSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlL01hdE11bF8xL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMi4zODF9LHsidiI6MS4yMzgxfSx7InYiOjEyLjM4MX0seyJ2IjoxLjIzODF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjkyODA1NTY0MTg5OTExNTVlLTA3fSx7InYiOjAuOTk5OTkzNDg0NjA5MTE3NX1dfSx7ImMiOlt7InYiOjI0Mn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZCJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcyJ9LHsidiI6MTB9LHsidiI6MTIuMjY3fSx7InYiOjEuMjI2N30seyJ2IjoxMi4yNjd9LHsidiI6MS4yMjY3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi45MDEwOTUxMTAxODMwNTgzZS0wN30seyJ2IjowLjk5OTk5Mzc3NDcxODYyODV9XX0seyJjIjpbeyJ2IjoyNDN9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW0vQ2FzdF8yL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMi4wMDh9LHsidiI6MS4yMDA3OTk5OTk5OTk5OTk5fSx7InYiOjEyLjAwOH0seyJ2IjoxLjIwMDc5OTk5OTk5OTk5OTl9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjgzOTg0MjY3NDA5MTMxNWUtMDd9LHsidiI6MC45OTk5OTQwNTg3MDI4OTU5fV19LHsiYyI6W3sidiI6MjQ0fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkIn0seyJ2IjoiYmluYXJ5X2Nyb3NzZW50cm9weV8yL2xvZ2lzdGljX2xvc3MifSx7InYiOjEwfSx7InYiOjExLjk1fSx7InYiOjEuMTk0OTk5OTk5OTk5OTk5OH0seyJ2IjoxMS45NX0seyJ2IjoxLjE5NDk5OTk5OTk5OTk5OTh9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjgyNjEyNTkxMjM0MTA0MDdlLTA3fSx7InYiOjAuOTk5OTk0MzQxMzE1NDg3MX1dfSx7ImMiOlt7InYiOjI0NX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbF8xL2RlbnNlXzYvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTEuNTgzfSx7InYiOjEuMTU4M30seyJ2IjoxMS41ODN9LHsidiI6MS4xNTgzfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi43MzkzMzE5MTk4ODY3MThlLTA3fSx7InYiOjAuOTk5OTk0NjE1MjQ4Njc5Mn1dfSx7ImMiOlt7InYiOjI0Nn0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZE4ifSx7InYiOiJBZGROXzgifSx7InYiOjEwfSx7InYiOjExLjU3NX0seyJ2IjoxLjE1NzV9LHsidiI6MTEuNTc1fSx7InYiOjEuMTU3NX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNzM3NDM5OTUyNzQ4NzQ4NGUtMDd9LHsidiI6MC45OTk5OTQ4ODg5OTI2NzQ0fV19LHsiYyI6W3sidiI6MjQ3fSx7InYiOiJIb3N0In0seyJ2IjoiTXVsIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5XzEvbG9naXN0aWNfbG9zcy9tdWwifSx7InYiOjEwfSx7InYiOjExLjUzNn0seyJ2IjoxLjE1MzZ9LHsidiI6MTEuNTM2fSx7InYiOjEuMTUzNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNzI4MjE2NjEyOTUxMTUwM2UtMDd9LHsidiI6MC45OTk5OTUxNjE4MTQzMzU3fV19LHsiYyI6W3sidiI6MjQ4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNi9NYXRNdWwvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjExLjQyNX0seyJ2IjoxLjE0MjV9LHsidiI6MTEuNDI1fSx7InYiOjEuMTQyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNzAxOTY1NTY4OTExODMyNGUtMDd9LHsidiI6MC45OTk5OTU0MzIwMTA4OTI2fV19LHsiYyI6W3sidiI6MjQ5fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJBZGFtL0Nhc3QvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjExLjM2MX0seyJ2IjoxLjEzNjF9LHsidiI6MTEuMzYxfSx7InYiOjEuMTM2MX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuNjg2ODI5ODMxODA4MDgxZS0wN30seyJ2IjowLjk5OTk5NTcwMDY5Mzg3NTh9XX0seyJjIjpbeyJ2IjoyNTB9LHsidiI6Ikhvc3QifSx7InYiOiJEaXZOb05hbiJ9LHsidiI6ImJpbmFyeV9jcm9zc2VudHJvcHlfMi93ZWlnaHRlZF9sb3NzL3ZhbHVlIn0seyJ2IjoxMH0seyJ2IjoxMS4xNTl9LHsidiI6MS4xMTU5MDAwMDAwMDAwMDAxfSx7InYiOjExLjE1OX0seyJ2IjoxLjExNTkwMDAwMDAwMDAwMDF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjYzOTA1NzY2MTU3NDM2NmUtMDd9LHsidiI6MC45OTk5OTU5NjQ1OTk2NDE5fV19LHsiYyI6W3sidiI6MjUxfSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzIvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6MTAuODYyfSx7InYiOjEuMDg2Mn0seyJ2IjoxMC44NjJ9LHsidiI6MS4wODYyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi41Njg4MTgzODE1NzcyNzA3ZS0wN30seyJ2IjowLjk5OTk5NjIyMTQ4MTQ4fV19LHsiYyI6W3sidiI6MjUyfSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsXzEvZGVuc2VfNy9CaWFzQWRkL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2IjoxMC42ODd9LHsidiI6MS4wNjg3fSx7InYiOjEwLjY4N30seyJ2IjoxLjA2ODd9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjUyNzQzMTYwMDQzNDIwMTNlLTA3fSx7InYiOjAuOTk5OTk2NDc0MjI0NjQwMX1dfSx7ImMiOlt7InYiOjI1M30seyJ2IjoiSG9zdCJ9LHsidiI6IkNhc3QifSx7InYiOiJBZGFtXzEvQ2FzdF8xIn0seyJ2IjoxMH0seyJ2IjoxMC4wMjV9LHsidiI6MS4wMDI1fSx7InYiOjEwLjAyNX0seyJ2IjoxLjAwMjV9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoyLjM3MDg3MTMxOTc2NzI3NWUtMDd9LHsidiI6MC45OTk5OTY3MTEzMTE3NzJ9XX0seyJjIjpbeyJ2IjoyNTR9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMS9CaWFzQWRkXzEvUmVhZFZhcmlhYmxlT3AifSx7InYiOjEwfSx7InYiOjEwLjAyfSx7InYiOjEuMDAyfSx7InYiOjEwLjAyfSx7InYiOjEuMDAyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4zNjk2ODg4NDAzMDYwNDQyZS0wN30seyJ2IjowLjk5OTk5Njk0ODI4MDY1NjF9XX0seyJjIjpbeyJ2IjoyNTV9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW0vQ2FzdF8zL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo5LjkzOX0seyJ2IjowLjk5Mzl9LHsidiI6OS45Mzl9LHsidiI6MC45OTM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4zNTA1MzI2NzMwMzQxMDkzZS0wN30seyJ2IjowLjk5OTk5NzE4MzMzMzkyMzR9XX0seyJjIjpbeyJ2IjoyNTZ9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6OS43ODJ9LHsidiI6MC45NzgyfSx7InYiOjkuNzgyfSx7InYiOjAuOTc4Mn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuMzEzNDAyODE3OTUxNDY5NmUtMDd9LHsidiI6MC45OTk5OTc0MTQ2NzQyMDUyfV19LHsiYyI6W3sidiI6MjU3fSx7InYiOiJIb3N0In0seyJ2IjoiQWRkTiJ9LHsidiI6IkFkZE5fNyJ9LHsidiI6MTB9LHsidiI6OC45ODZ9LHsidiI6MC44OTg2MDAwMDAwMDAwMDAxfSx7InYiOjguOTg2fSx7InYiOjAuODk4NjAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjIuMTI1MTUyMDg3NzIzNTY0NGUtMDd9LHsidiI6MC45OTk5OTc2MjcxODk0MTR9XX0seyJjIjpbeyJ2IjoyNTh9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6IkFkYW1fMS9DYXN0L1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo4Ljg3Mn0seyJ2IjowLjg4NzJ9LHsidiI6OC44NzJ9LHsidiI6MC44ODcyfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6Mi4wOTgxOTE1NTYwMDc1MDc1ZS0wN30seyJ2IjowLjk5OTk5NzgzNzAwODU2OTZ9XX0seyJjIjpbeyJ2IjoyNTl9LHsidiI6Ikhvc3QifSx7InYiOiJCYXRjaERhdGFzZXRWMiJ9LHsidiI6IkJhdGNoRGF0YXNldFYyIn0seyJ2IjoxfSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjguMzE5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS45Njc0MDkzMjc1OTU0MDc2ZS0wN30seyJ2IjowLjk5OTk5ODAzMzc0OTUwMjR9XX0seyJjIjpbeyJ2IjoyNjB9LHsidiI6Ikhvc3QifSx7InYiOiJUZW5zb3JTbGljZURhdGFzZXQifSx7InYiOiJUZW5zb3JTbGljZURhdGFzZXQifSx7InYiOjF9LHsidiI6OC4xNjF9LHsidiI6OC4xNjF9LHsidiI6OC4xNjF9LHsidiI6OC4xNjF9LHsidiI6MC4wfSx7InYiOjAuMH0seyJ2IjoxLjkzMDA0Mjk3NjYyMDUyMTdlLTA3fSx7InYiOjAuOTk5OTk4MjI2NzUzOH1dfSx7ImMiOlt7InYiOjI2MX0seyJ2IjoiSG9zdCJ9LHsidiI6IkFkZFYyIn0seyJ2IjoiYWRkIn0seyJ2IjoxMH0seyJ2Ijo4LjE1fSx7InYiOjAuODE1MDAwMDAwMDAwMDAwMX0seyJ2Ijo4LjE1fSx7InYiOjAuODE1MDAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuOTI3NDQxNTIxODA1ODE0NmUtMDd9LHsidiI6MC45OTk5OTg0MTk0OTc5NTIyfV19LHsiYyI6W3sidiI6MjYyfSx7InYiOiJIb3N0In0seyJ2IjoiTmVnIn0seyJ2IjoiZ3JhZGllbnRfdGFwZS9iaW5hcnlfY3Jvc3NlbnRyb3B5L2xvZ2lzdGljX2xvc3MvTmVnIn0seyJ2IjoxMH0seyJ2Ijo3Ljk1NH0seyJ2IjowLjc5NTR9LHsidiI6Ny45NTR9LHsidiI6MC43OTU0fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS44ODEwODgzMjY5MjU1NzY1ZS0wN30seyJ2IjowLjk5OTk5ODYwNzYwNjc4NDl9XX0seyJjIjpbeyJ2IjoyNjN9LHsidiI6Ikhvc3QifSx7InYiOiJNdWwifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHkvbG9naXN0aWNfbG9zcy9tdWxfMSJ9LHsidiI6MTB9LHsidiI6Ny42MX0seyJ2IjowLjc2MX0seyJ2Ijo3LjYxfSx7InYiOjAuNzYxfSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS43OTk3MzM3Mzk5OTI5MTRlLTA3fSx7InYiOjAuOTk5OTk4Nzg3NTgwMTU4OX1dfSx7ImMiOlt7InYiOjI2NH0seyJ2IjoiSG9zdCJ9LHsidiI6Ik11bCJ9LHsidiI6ImdyYWRpZW50X3RhcGUvYmluYXJ5X2Nyb3NzZW50cm9weV8xL2xvZ2lzdGljX2xvc3MvbXVsXzEifSx7InYiOjEwfSx7InYiOjcuMzZ9LHsidiI6MC43MzZ9LHsidiI6Ny4zNn0seyJ2IjowLjczNn0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNzQwNjA5NzY2OTMxMzg2ZS0wN30seyJ2IjowLjk5OTk5ODk2MTY0MTEzNTd9XX0seyJjIjpbeyJ2IjoyNjV9LHsidiI6Ikhvc3QifSx7InYiOiJOZWcifSx7InYiOiJncmFkaWVudF90YXBlL2JpbmFyeV9jcm9zc2VudHJvcHlfMS9sb2dpc3RpY19sb3NzL05lZyJ9LHsidiI6MTB9LHsidiI6Ni44MzF9LHsidiI6MC42ODMxfSx7InYiOjYuODMxfSx7InYiOjAuNjgzMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNjE1NTAzNDM5OTMzMTkyNmUtMDd9LHsidiI6MC45OTk5OTkxMjMxOTE0Nzk3fV19LHsiYyI6W3sidiI6MjY2fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzEvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo2LjY4fSx7InYiOjAuNjY3OTk5OTk5OTk5OTk5OX0seyJ2Ijo2LjY4fSx7InYiOjAuNjY3OTk5OTk5OTk5OTk5OX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNTc5NzkyNTYwMjA0MDI5NWUtMDd9LHsidiI6MC45OTk5OTkyODExNzA3MzU3fV19LHsiYyI6W3sidiI6MjY3fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvQmlhc0FkZC9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6Ni42MDd9LHsidiI6MC42NjA3MDAwMDAwMDAwMDAxfSx7InYiOjYuNjA3fSx7InYiOjAuNjYwNzAwMDAwMDAwMDAwMX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNTYyNTI4MzYwMDcwMDYzNGUtMDd9LHsidiI6MC45OTk5OTk0Mzc0MjM1NzE3fV19LHsiYyI6W3sidiI6MjY4fSx7InYiOiJIb3N0In0seyJ2IjoiUmVhZFZhcmlhYmxlT3AifSx7InYiOiJzZXF1ZW50aWFsL2RlbnNlXzMvTWF0TXVsL1JlYWRWYXJpYWJsZU9wIn0seyJ2IjoxMH0seyJ2Ijo2LjIyN30seyJ2IjowLjYyMjd9LHsidiI6Ni4yMjd9LHsidiI6MC42MjI3fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS40NzI2NTk5MjEwMTY1NDA4ZS0wN30seyJ2IjowLjk5OTk5OTU4NDY4OTU2Mzd9XX0seyJjIjpbeyJ2IjoyNjl9LHsidiI6Ikhvc3QifSx7InYiOiJSZWFkVmFyaWFibGVPcCJ9LHsidiI6InNlcXVlbnRpYWwvZGVuc2VfMi9NYXRNdWxfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6Ni4xMjV9LHsidiI6MC42MTI1fSx7InYiOjYuMTI1fSx7InYiOjAuNjEyNX0seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuNDQ4NTM3MzQwMDA3NDM3MmUtMDd9LHsidiI6MC45OTk5OTk3Mjk1NDMyOTc3fV19LHsiYyI6W3sidiI6MjcwfSx7InYiOiJIb3N0In0seyJ2IjoiRHVtbXlTZWVkR2VuZXJhdG9yIn0seyJ2IjoiRHVtbXlTZWVkR2VuZXJhdG9yIn0seyJ2IjoxfSx7InYiOjUuNzM5fSx7InYiOjUuNzM5fSx7InYiOjUuNzM5fSx7InYiOjUuNzM5fSx7InYiOjAuMH0seyJ2IjowLjB9LHsidiI6MS4zNTcyNDk5MjU2MDA0MzhlLTA3fSx7InYiOjAuOTk5OTk5ODY1MjY4MjkwM31dfSx7ImMiOlt7InYiOjI3MX0seyJ2IjoiSG9zdCJ9LHsidiI6IlJlYWRWYXJpYWJsZU9wIn0seyJ2Ijoic2VxdWVudGlhbC9kZW5zZV8yL0JpYXNBZGRfMS9SZWFkVmFyaWFibGVPcCJ9LHsidiI6MTB9LHsidiI6NS42OTd9LHsidiI6MC41Njk3fSx7InYiOjUuNjk3fSx7InYiOjAuNTY5N30seyJ2IjowLjB9LHsidiI6MC4wfSx7InYiOjEuMzQ3MzE3MDk4MTI2MTAxM2UtMDd9LHsidiI6MS4wMDAwMDAwMDAwMDAwMDAyfV19XX1d",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/hosts?run=20201119-035554/2020_11_19_03_58_10&tag=memory_profile": {
"data": "WyJjMmNjZjVkZWVmMGEiXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/hosts?run=20201119-035554/2020_11_19_03_58_10&tag=overview_page@": {
"data": "WyJjMmNjZjVkZWVmMGEiXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/hosts?run=20201119-035554/2020_11_19_03_58_10&tag=tensorflow_stats": {
"data": "WyJjMmNjZjVkZWVmMGEiXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/index.html": {
"data": "PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5Qcm9maWxlUGx1Z2luPC90aXRsZT4KICA8c2NyaXB0PgogICAgY29uc3QgYmFzZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJhc2UiKTsKICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gJy9kYXRhL3BsdWdpbi9wcm9maWxlJzsKICAgIGxldCBuZXdQYXRoID0gZGVmYXVsdFBhdGggKyAnLyc7CiAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuaW5jbHVkZXMoZGVmYXVsdFBhdGgpKSB7CiAgICAgIG5ld1BhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdChkZWZhdWx0UGF0aClbMF0gKyBkZWZhdWx0UGF0aCArICcvJzsKICAgIH0KICAgIGJhc2Uuc2V0QXR0cmlidXRlKCJocmVmIiwgbmV3UGF0aCk7CiAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwogICAgaGVhZGVyLmluc2VydEJlZm9yZShiYXNlLCBoZWFkZXIuZmlyc3RDaGlsZCk7CiAgPC9zY3JpcHQ+CgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzLmNzcyI+CiAgPCEtLSB6b25lLmpzIC0tPgo8L2hlYWQ+Cjxib2R5PgogIDxhcHA+PC9hcHA+CiAgPHNjcmlwdD4KICAgIGZ1bmN0aW9uIGxvYWRCdW5kbGUoKSB7CiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICBzY3JpcHQuc3JjID0gJ2J1bmRsZS5qcyc7CiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgICAgcmV0dXJuIHNjcmlwdDsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2FkQ2hhcnQoZG9tYWluKSB7CiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vJHtkb21haW59L2NoYXJ0cy9sb2FkZXIuanNgOwogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgbG9hZEJ1bmRsZSgpOwogICAgICB9CiAgICAgIHJldHVybiBzY3JpcHQ7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UmVsb2FkT2ZJRnJhbWUoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgdGZUZW5zb3Jib2FyZCA9CiAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0Zi10ZW5zb3Jib2FyZCcpOwogICAgICAgIGNvbnN0IGlGcmFtZSA9IHRmVGVuc29yYm9hcmQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKAogICAgICAgICAgJ2RpdltkYXRhLWRhc2hib2FyZD0icHJvZmlsZSJdID4gaWZyYW1lJyk7CiAgICAgICAgaUZyYW1lLnJlbG9hZCA9ICgpID0+IHsKICAgICAgICAgIGlmICh0ZlRlbnNvcmJvYXJkLmF1dG9SZWxvYWRFbmFibGVkKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd0ZW5zb3Jib2FyZC1yZWxvYWQnKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBkZWZhdWx0UGF0aCA9ICcvZGF0YS9wbHVnaW4vcHJvZmlsZSc7CiAgICAgICAgICAgIGxldCBuZXdQYXRoID0gZGVmYXVsdFBhdGggKyAnLyc7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5pbmNsdWRlcyhkZWZhdWx0UGF0aCkpIHsKICAgICAgICAgICAgICBuZXdQYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoZGVmYXVsdFBhdGgpWzBdICsgZGVmYXVsdFBhdGggKyAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbiArIG5ld1BhdGggKyAnaW5kZXguaHRtbCc7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIH0KICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGx1Z2luLXJlbG9hZCcsICgpID0+IHsKICAgICAgICAgIGNvbnN0IGRlZmF1bHRQYXRoID0gJy9kYXRhL3BsdWdpbi9wcm9maWxlJzsKICAgICAgICAgIGxldCBuZXdQYXRoID0gZGVmYXVsdFBhdGggKyAnLyc7CiAgICAgICAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUuaW5jbHVkZXMoZGVmYXVsdFBhdGgpKSB7CiAgICAgICAgICAgIG5ld1BhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdChkZWZhdWx0UGF0aClbMF0gKyBkZWZhdWx0UGF0aCArICcvJzsKICAgICAgICAgIH0KICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4gKyBuZXdQYXRoICsgJ2luZGV4Lmh0bWwnOwogICAgICB9KTsKICAgIH0KCiAgICBjb25zdCBzY3JpcHQgPSBsb2FkQ2hhcnQoJ3d3dy5nc3RhdGljLmNvbScpOwogICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgIHNjcmlwdC5vbmVycm9yID0gbnVsbDsKICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JpcHQpOwoKICAgICAgbG9hZENoYXJ0KCd3d3cuZ3N0YXRpYy5jbicpOwogICAgfQogICAgc2V0UmVsb2FkT2ZJRnJhbWUoKTsKICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==",
"headers": [
[
"content-type",
"text/html"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/index.js": {
"data": "ZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpIHsKICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gJ2luZGV4Lmh0bWwnOwp9Cg==",
"headers": [
[
"content-type",
"application/javascript"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/materialicons.woff2": {
"data": "d09GMgABAAAAAO2gAA8AAAACtwAAAO1EAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbEByCkCoGYACRNAgEEQgKiIkYhowaC6dkAAE2AiQDk3YEIAWCegcgW5kjcsLidnuiyG0DAC7tJvv5YkYGAudBIjjzP7dEvH26cDuw562rZZn9//+ZSUOOvKSTtFcYPMy2UBhrbZF9HKd5XGCqbi2/e/TIzJ5Yw+FVUUOxYY+JTLHTY/8cx9GgD1eZmQ22zMyGJ5WoRKXS7dq8blE/DW+o4DA4LjA4Rnggs8faGhWbcCzq9NHY2QWdiFQQceE9h4t+6BpnfUkbiuk1L6CQqs1sM9vMNkq2QQoLFfJv7Ox8WCe16C/EaoF4vYrfErP3Hso/vqh4tKAtCcXPrz8OQXWsM9VwFr4OiMfmSCWijRVPnPiuV57//3Hw7XPu+yBXhwbJWJ0NCgVMYEgTwT51QoJK/MdwRnWraZsMMAE2WBlINueq7+r3pvf3InKiW2vVQlOSTsPAEfgno1+feiR1dfKZSAGiIvT7pUa9GT7FpyihEkIydstud4izIYTL9bZvh2hu97/89W/8UwPGqLHBqFIYlY4YrUSUNmCBSZs9rAYsoq1GaBszGGdLEdlEh6Vdu3UTf71+yIVceCPUCG+8cxJyIVRE16kdZ0uzSX3uMHZYu+6v2vLOG7kSQnhx3gghhLrsNPOrvvS0KeOQbevLmnmr3d90TRzGCCOEOEyQntf0qbD8i06lgDrAJgOZLKsN/I+D7W3/CqKI04Ath47nc7PBA+ROQn6AcCSEM+8F7qACkg+EAAnc/30uFeTS/OjN4dn/a62A9rA2oUJbtd1e/HRrD61dsQ21tbtVWtsuSY9ttL0XXOMePdbu1vzEL2cTqC5iE6o+2/pSsdmKhVpgflDNS/EEsbcHHlp/iKYeeFBfJFSmolsLx8DVlxMkczScpKIPFs3IFlg9f/oUGcypydtP2n6BIdhyYAS2cwhdKrhejlpvl883+bZfyXKSwkEcwAGXxhA4BNg2IPX7w4PD6YLbjhd+r+pRPWrUiFYvbwsiAiLabz9c3Ef02t1KHUKHRhVtDb4p5HJOKfkthUuCEYMe3E/LIEydqdASCPKST1cc6C005sul/sw/zlxHowVDYVmGgmOglp0Cz2gS6xJHv9XlKl2l19tCHJe/3Swk3PKC7ZRDu/bAB/YHnWGz9AHmzS/RymWp+WMzK/jBiUaAzEzIauUtOa1VVyLUTbu5QwLkGQ0JOR+8U+tn5Icz0sM2u3uEstR2iWy5cMcFxx5Iop862qx+fuVf+5cCuxwoHFCBj7pHFMcH3AP73sxKFz96Vd8dSTSVBqlNGp72T2iP51gzr9//ya7fr34AtQXEbG11MQaiY4HFglL0/9WDqS6sALDDYHejyWiBiQBmhsowtfDoSfNsWspk+HQMuqRjnetfnMng31eq1RVJiirRK1XjitHscq9yr3ZF9L2sWddTX+c0Mcc18+XPTOT/+QHmTyQEZBIiCIgSCIoSFlICQVFGJhI0CNIeEqJU9FIdsmxX27KrWyWXu5YNBM0qEpLcImW5bblcI0u9bItlq7dtOc6xjz23uV7mtB3PfTjO6TyX8xC1H+zrThC9LNKNhyEUtR08wxMsyVCq8cfcPvxvGt77glmSIRxFjiJiS5a5dC/8/t+0Vwt7uHt/VatqjBgRMSIiYozR973z4/tP92Hmp+/Xe7u71xgtWkRERImIEiVKKaW0H/tl399ClphrpykOiohERIiz/M3XvG2ZZM4O2z5vx3IEKsgKq+J6HCgJJJvU/uTPfR2Ir23DttiREkiQQEolCerc3+7d/Zi+L+kctvUvvzGKbiKORCIcHAc9RLd+OH5s9KvyPDLKUJDdNm3SrLvkLoVvJwa2K5367zayCWs2vR9K+c7W0QBx/YtXbMnaS89Wj1XG2IDo+DZvvFQ5ShneEuNlPYrPAh/+AZo51Juc5TT1fLcHiysv2/G3v0c1lp66pXzlyd3K97jrwr5Xze857nzdcrSrqjt75Pm7/8F74cFD0av7Vh8HzLMlO7Ovzlr0MEib4SaabXGcmWmoBAwZOrGxkiWcsbHlqUSNhTJqzJVho1AGjZnSb0yVXmOihI2x0m2MWgKj/3hzEkMNBSRzm9YtFvk4C/QXzV80e1H6oqlYH2LEMv3aNFHq2JE9ObDPWxJUIp4ESGg87mzpNLtq3S0xODdaNijRkWLeG509cJ3DbB4F2JrTull//zluzbnD5fazt+ba4XZ72dY8Ojxv77417w6fdq//H9x5zqe1dlsK85vfntSnrO+9rfHf63h09xuNWKLzpcQrAnIafyaL9bXU1k3luzyUKF271+L53S8/ePwuj5w6vATJAMgxyaIpwfkiKPlQNhdIlaZlSv8MQUf3sECJ8vklIw16aRfvx9K2Hcxdvp0Zg+u1/qtHEzFoHEiFQECionEINC0aQQYYKkRGk0An1NWp5iHSNrbHGohgPebHm8dxtVWqw4pY4rk6VcPFIM+6JHUsJoRqS2SDRNQ7mSt/OSv+1UZUxWrMqcKyJUYIsm8DcrVzIs72ADfVQXgRc6ieyDdyuJ1xOISpAmiEU5HuCriDiTvlOw3FKGKJCVDbmwEn3bYFTy6DNmoobIGkHKlfkf7fyQH04yUOC+5HiUwkEIE9011Sap/2Q82R5gItsn5tGnRiBXIWUKFkPYoyFmkjOFdmr2ZHSD5D+9nfNULehErYOOm3PUOApiJSsbpGHI+wkyOxzDlIKgzH1iZU3U+MCK+ISgfzd7PSvyZyWLTPY2VHNNdMwpwt8c0CAU1Jy+melPonMraaspXolXu2jjsFBe956j31/bz8CRUkAqz9m+CrI0+o2ZC8tN/E42KC2NhQT5F0XbVzvDWg/+psMSHEWGF2I8wxs97FN/fMzr28P5dnA6gRn30vcpWAwwyjbQXLPBE3NlhMDFj7Jr2WB7CRkptsXQyDLu9f7LXV7set/PhMuABsGNN+FAUk3J2dzqvkOXCLsspQJhr97yqV7BTNb5DnWB5MbtjvzkRpDmpeFBfl7vVZthtEANnwJpgmL2HZHa7I4M8dq7PKVHmUdSywrltItoJWb9n5ssJL8rr8JxtuZnnGljb7rT0bk1g2ktVo2+f+iFOu4a68032ZWRbhOMtHBjBs3DX/PqTvMgqqTPwPsSQw4bx8WwdW8iEru4Uur7QVLX1bYI57ZqfWFZ+B4bmiSRiDP2PnoYxgC+43mhVCSUyDK9wDHbEiawuPpVllmMiknqm5HiQHMfxxOZrLjXYx2JbvLIiV/AoQUeDYPz/QZFcFZ8oWd9beYvqu/1fQsndNAlxza14gvMn2OJeUr4nVxcwU93uOrb3Sqni3Lf7F2JqQjpoLYqKexLMtC/lgGea63xB9oNeNn0sH4FHP52g1uyowdjM3Gwe/KOI7n85KaHNv3jiW+zdynv9ddoYiWCeLem8rJnOdyQeZmLSz626C5SHxKWWsxKtHi7WRpPpcsp/xdruX1trFBOQg56nmNdqm9o1sttet97k8ABm+R4PjuxyZGi4xkGEQFS5hGEo78VCVtcyrLdj2VlQzuSeXFCpRNq9IMFI72VuuIvySA1J/q/YGcLKfZjVZSvtgh7a5C1tvc1EObjmc5QhXiAGI6fOQnFDl5vgl2fnGAx7zsBb4tIaHNCQrLC0wiNwUIwLRW8X5Jap2gpEyySz6k8TY51GH4HYT9lEyTno3h55D0FB3PgxrXcdvN2ecg2teoZFq/17y/WhgVbzrmlo9GDCeXXVfnD3GUVr3dbW5H2VQbRf8v8prvFgO4mnyfl5vNnXe4Dr+VGesOY/N6hEAUEemNrnRYOVuU6Nkm5tUhaERicOGx+4CMa7GuJXspGl3Y7aIpOQGL9JkA1RXX2NZ3p7HXMlC8cjcLp9ZtmtM+yi7ijRLkSvLhzNL24czTeuHM0lLa9w/RYaN3wjrZDdW0sviXGW1bs8iwV1fW4s15bBnV6CrXTbb9skBtqebvJdVAcFw2WzgWC/MOgunkInqLBdSzLr0AVaW6MmT9yFq5nUidhEZhz3Iek2aWmBwd7Au3VrkTKEH98SAjI1oGBAvm101GfVJ4YKBP55IPAA8d3/5oOTplFxIpx6lzqo+z8NxRoTzGHeJaUf3yyaP9UOF9ZcMZmBvUycBNlvBCl+v2wjSLRMZlsslmEMuJ1NaLsf+Qk3ZPp+3dlKkG1T3jBw1VGmQgyIMLqpMJA98u0WzjImNqzthcvrfl8vdCUC2iY8My3eHsHkjW2mpt5XxkMNZ84amRgzxTgKkQpI276i7qp1YTyj3T633LA/Gu4ykwprrd7/kYkfPP3jte7z6e6A8kMkBUCRpqmg2RJkPwcSI2JLarEzhl2RT1XsQthUIl88rUjZcM9FLrjLu/5MyGTm5rbJnwBdnwEJBPd+DjGBCyuc0W8e6PkEepTU3ugbkakv0lHa7uTDZ3N5y+FxT42E47vdfhjr8tL+pq4l/QBkcr5mLb5fiqmyCFPMYIOqhy5m5nbq2fS+IR63coodVJ2hFCnIseYl00CAqRFj4SWKsV9op9ewn3C1dkpqwmr6kk59hqlYOEqqTi2XV6kNeGzY4XggfFYk7sXJLmHjNMGl1rwVkM49VKOJDCY8KHA2IjOQUROKFYJw41Bs372+ZWKuSeZTgdsX02tn6RCm63ZiyfxQggsS6k0cG0Uh0+zX0vhSksjeqa0GEP2WQhXU49uvnn3OobSOupbHlJDTFideK4MD8v057jGlczMgnJMkJroIbtcLj5O694fCtoZV6oqPqI0O/0rZbnoxHiPZNwbTHcC4lOp4u7sHcfmNPVTFqrNK7hTM2HuQGXDPjNoC++7lxKEryaGfm0Sf2RwagFuVZp/6eYpm08G1uHR0Tr8AKYSIm38x0CwdS4hH6HGnd4z1GyZN3Zx6AFap2XOwJD/FwWgjqvrJ+MeK0gidYHzaKlaGlEj9/qGKo5cXV5roELVhnjT7tSyyN5Yye0HuYbQqjgrwSDpnMs12a+xIOzAtbwIusb0y09MJZU7YVe2q7fhSqizeMqMWMXle+GMXg4npQ492IePm6czzaFPMRT+9BKPdGenl/zzWOe5aLCMou3bwnWGTmx9xyvozkppi+8kko8PsNIL3ZrFGLaePCcxitsMD7l0ARj2DFUyCyUA89Sfca+t9Ur+PdphNjHCk7Ee9Wxkx253kiJstIw3FvAA7+KZUbb9A6odh4iO89DcwC+r5u9ghydusntPO7s3zHsblKmTLdJh5AXn0B7Dvowy97AhDbVTofrc9jtxsAlqZtPkz0d5+htMX0Ub17U9P1SSo5oM0IvnP8ReJIqZq4H3VlVG3vIYaZr87vwc0uqAhVs+ZISza4ODNl30aewbjhFu0m3THSQ69iubmnJ1Zx7KtUv5xbB6XRXA9SfT65Vxf2dlPlzOd6aAqT5snTUKNW+aP8l+CKNjLCQxrczQtFgIkrvkhuhHk5gXb544jdIvci+OVXn0rMeOL/h40G3D2GrHPA+sXHfcppPILl/X+togb0oKdlfa5gbZ++ZWyXq+55kQbQgJGUEKAtp25nSmHSqsbc1N69qEgkUSwr3lt5cpL22598eBsXOXj46HH2ahvVRKwHe4u5YWCDDMfV0SrjrWXlSmJVFMHWbbanwLZZwuYsXqw0N6hQCI8lkqOxavg17jA1YlaBR26pURLJbQdCKPpZ049iZAR9UXO2I1HrnyWGjqNulqZiNteP7I0IyD/WqKG8RUuckrY4gpAiaWyujhArsrQ0+PpIvogd51GYyLA4JzQFz6iMFACiLj6K4Y9RXTGhxGpD+ZMCa827Gn1B3M2arSSU0lJnFVREZ5dtBT9E0gn6bYr5aIaXth5IuznVcNZRjvJyv/dGxIxdmFFK+ERc10JRxkNOJwOoHTvBdQzjKnuWDFn1oGLL2T5cf7uLWxgHUuHguLzVOSmMWJjvszMPLKyH5/ZCf08MDrd3ZVRRr1nO8zuOS1Io9uN94e7wPQGAd6+PrUCxwBYx+Tu2kg2iA/NwgJqVIE9nWys9jrEUZev4lri71F+wfGAOi0QEpahdheiZWu6PXnsMct5rmiR5axK7CMQvtsNV1bvByKuTpo+pSJNnWp2mmTdKWGEIBLjfS7g3xnHPSEcKKPjGDAHqqNf9SAE73w6AsREmbPZ6tbpacHtL8wEYe3ARoBz1hcqkBa52h9QoG6JzMnreplHAbBjyZ9Gt0jzeEM6Q2ZrLl+p0sue/MgXQCPs1EtAC9et0N4g1vV8AsQvZVX/pnvkrU7oONTZa4s3t5P5/uq0403QHPQlAovglFRkUlbIA61fWWLM9L6kqNo0e6XgNGDZq4DTndvKxBUTBslweK7DgIiu/nBVYYBXmVuUmGdJ2YOkYKf/OcSLDiIl19BNvf75WrdgrjeJZFC9W6Ynkfi86LS0ugpTRGH6nfnOjxW6UcISG1s6AZEb6rYw8fupxxvhewHw12+naHSIH7TBo1Oy7ld8NBGTgXMMI4Oy08dw3J+sIB4fFH0zJ8o1wiTSgVtb9ZkcfPvUkE1g2GXe3md6gPnJt+RrcDIR5dO/9D+CM6JmUdY+5eM3hju9kfebv6P33s7RYrAdgEk8ZFISZ4r/rvp4DVt7B7UEHFDgdObN5qFkxKG92lewHSqrx9aYejRWgFg07BW0Omd13qzkHgwJO5WcGghuhNq/PyvW6YSNYfJNoV4Dltom+hwfURfm2zDddMTvIVoy/l42tVmhEsu0ovpi1XdPphm/o+/7pKDpqAJmQ00DNn7Zpw71NmQxHvyCysuLZJBPRu0X2d28viNx7t50AevdalJmO/2dc5FJ60Kzk5j4qsav69Ki3HRSCdjB7vzmzdj/lALHwsDAEXbDzQKWlsgzktShQvstoJjpIz+fecgcnD173Xg+cMb7iMoERABgaxHSPug4mLHlqwabGnZLqLSgqECqbDITjvYTJWC67zhwtMHN4bJXtULmgZOQR0FrDMM2l6cKI/GqZBaS8aL5/XLYqMcTJZ4o1PhLStszcEW0IlaeAglBMW+Obdoukv/4xi5esEsW0ypGOy+YfJYSKtnkUtXRJNBbvqAdr7rI5HjwTkYQLqgZiGG7385RGQaaASMVESRxiSrL5wvfutUmDNnz57IqnwEj3aZ9sJyC9hP+2V8YI+6LCLUcGi8nC3fU2C9YG3qV/cZIt1ueQfW5q/CpJOSHBpC5d350M8rKOsdQ7eysFBRpTCahU0L3rzImoHDznZQt6ljx6A2rLXMzlLK2HoZ7NzPXEnC3uu9gZSb+kkgG4lu9DSArrvrTMUNnWse3xSfD0qKxKpuiVd4UfJGgMp4Xx2X0dw/xpYS0AarOZp/eWbx9CxTH5g0tUrXJt2pXeOwGEywUVJdMfxvWcUqmmW94eju2AIjDS506Pey8K/SiroJxU97Eix+bquNIV1aALqAh2/VpbiAd/2ZIwAnWVaHP3cb8UAEpS1BdUwoV0j1o0jwBaSmrqBt9S3DxKMXLVfchXKUng4nzZI1uRr2k4n6CE7f12KpKFA6q8xX1mi4io/BgmgkV3wzpbEz+OhQeZHZCwfdU5F4euJL3GEvUoTebbUw5LiLFZ3GzLTF12Xja/UJfIznyP0MBAflvcEgQy8xW33b6htsXtU7IoVIMs3FbDBzZBaoAnobcDy+rpD5iaK7+O5i710pZL0YBtlccgCkw7H+rMf+upUb7CrJHq2cF+QY5rQCl1Oeclr43fuzbVJR28bd+J/U7PcylYA5HYK79ic8CI29IP9hsUhpbD/jVNGchYy7gA1DJZuCk/K91HL7uz3nPyNdPytFle3j7YNFMfbJLJ1ng9F1z/tkUbUWhMnJiKyT9MK9PcpnNMK/P+9sGWeddaTKiPzltuP6iw2Wkv29uEafO8+dwu3EZPBvH+eNzcYjDe88ZQU5A9h0wifaD7qd5s4f4yIthv/N0AshDu+X9PzdYcro+hZtvoqCte+JophMcwtvFKKDAk+TgJBGQJVALE26nabrBP8n72pB4A1h89FfuJGILdscDingcUj3WErIr9Q4nMhlIzx80QMC+JUv0gMI/S6uHkEu5OLyA6ixk8eanYf5cC0VrmcTDY9Jy7onkevctt8c0D/OQxbjWN/O1zd3Qwq01n/5piyDewEVI67LMjk4Uh/583NC6g29i7HwS7u99TZan5f8cHGmCyzS564W90pPEKCIufbKpR+YtPKsDalda5QY01VdZaPY01W6vVtYlrRH1Jcr95whhhnBjljAyyXwLf01jKTZqdUOEpfYncE1i3qfNwbqBHvjPlvVrttpRP7jCk9UFhxKPmujXXbVdjckmhqpVymMvOTyF1C5NVMwj11SHmVcf/BnMzCEdSAlgsTl+/s3TJoK39qwE1YIT3JYIi0ahdOveKAiVYMlTTPFescVNVXm2y029eSbmUdDxvFET5zRhOxtFqjWgH7wjLQAGDaeRrriRyRmmMoxMG2zzoLmjsj03y96tziW7s9YCI3CueaHP/EgnK9uk+W4nAsjMXm+uwJ+lAhvELiQ7JbXzHsGFlNUqrWmizul/Fht47t6sk2EZBXdWmpXouFWd5clxhBaKn/w8OzBvikiWKUl/JDYVCG1cdJYLZ33Iry8LCxJKUnzDHY3ySxgEA72mopccbX7aQHGcJOdI+77nR+rvMIObMniacW26CFor43KLl3/k7+UqR7Avck8Hc5RtfFnkuvnrIxq9rlYbrWlw4mxHc8jUmZ7s65xy2O14Xk1Lip9d4Pd6kAmXi0HHDv0Fdzs3IzSEGZzresHyLtIEcSAaTwlulhliDsFcyUfZHSQUjhOK/24pDtVrspBfM/O/uE5RaQHB4bmsf7QXfM8Hcc+2tk0Zhd37zay9sNcu3UXLUM+XuzBvETLSsLl3NM/RjMSlrV3hSOD1917LV8ZdvlVy+Bu4ivLe6xg9ei7tqB12+ejZMw3zCVidj17BsQUxZw8Ql9wE7JSHO527HafZ7laPIkogKzXOsq7oV1Suqrp85VvjFeKl5K2y03RIXdAYIkgIDHGrzLmma91ys0ClVec9vieQEoslc8TTdTj4648jVLnLound/+akBlAdPfBoAhBIKAKKO4I0NNeqP2fLuChM0RSVnLwZyM+hW/0fxAZPZIZ6qdWi0yrRWY1eY2yiy5bl5G4vyN3TtdGqkmzNDGsfGbgrpE+Wj9dKXGUqNN4umi5mmAuLc0zGecSsRug8aFadM8zT1THgtUkUFLVWqCae3jO6vSRx6yKkVrq81yuSLltbLfDyoiAbo/csEbKADRuGLzn+USE0j+OYOpS7+oOWgcvOiCelngGlxpWV8Debr2kcFbEjmzeRSrWozDuzIRQsfJOC6tcWP+23mYCzVRowmp9H/VJRO/TGa8AAjOxPKcy48wfPBer1gDh5kv9/T9qbqv1gbw1TOXmFo0Z9MwaDqg/BKRuNKjYAN+6JpYamXZbt//TIw7MFpHC1IYYWINK0pH1550PpCddbLY1OggLJ6rOzvg3E3ANhyN3rnsdLrpwe5oAvOz+Rbz0yJ+mY90+KG6UWzFhZEQfWg3Iy1zQtKBFXpC2ah0TMEdiV7spzjVPomUNPsPefMz2HytiniaFEI6uW0twwSE39Q7VW8EFU5zVmc455mkz0JTQ2JmL2bjYvgYZPke0tvE5wWnqLzlsSBke/3BlYHU9QFcz9G93HRpIDinVrT4gFyFFaemYi1Vq91eC9TAxxYWm5apWHplvJJgL8Xys3FsCYih6+57/N8QJa7ajc5uBQwGxiF6oJ6eZVMool3tgXcsRrDn1v4J4IdRDvPZDQjkpm9nAaKwTGjNI6a1T45L+f3BxZlr8/6Ci3cTrQyn7Lp5J/S1/NKf/e5IWaG79B0LqZwq6xfZlo21wjGIrk0Fqkr5+5AFpgUSFXZ+dbCS6UDvPzbROuyizGqFWRYVO+4HHVKnk2A9rvtzNUWOu5ZenqUvz6OCo6J7xQW16dWS70urb7+Os3giNjN37TUKguttPb458cphhtARAALSg0fSRBVBtzxwQaC+Z8JNwQfkOIlkJDzh8e571cgQUKVjeEFanptZ5JHk4NakjMGzNmpmIg26he877mwxUsSOAf45OA+WuwFF8jKF0c6loGULtjdfSOs2zt9mMWULt0QYzFD/SboQ1ZanR9VebZMK/oA2qBxpcme4eKYgQIHa0SqruDTvwzOnsvkzetL9KvqMA8j3o7fXyTrA+LvoXP6scV8ATZ/F9vnILnLvrPDEqeNAL5DvasRiL649ZSlSK+JST3JxY+gOftgEVCrn1DhrQpK1eSFJqQ5Y0CNdXPFd+Hg2ngqTehoBBQ/wssEMFQyvp673XdQ0Z4clAYjVkQBSLXVIfHUXUUYuZMlHMrFfVqTF4fGPY1o5TQb5uviIFAsLKNrTg9GV9xeYjcAwgXkRSysVgIusDuzmveuleKr2iawsXTKASDZFtZLrAmgupXbUrtMA709mIzMvn1Es/F3OK3UE3i3niNwO1/hEuV7wd74eguxK1W0e1lKG/A/zv5aLXXepxzENpHJ5jrVPCa0hEX1qFneS2Xefx272vDRH/vxG2MSw6Y2Lu3QlslSun2dqEBG1pCr06OHROUBgDETbkJWT4lxNjq1ELhDZUMHrxUFiAgs1tmpgF+Zu2/DS/hWPq+LamDeWIIbvtb87trPpWhmFo0wJc735Zp1Wq0RY9OJH8sPoUDkSa12Tl8SCMpWVO4NlMPeGNnJYK1dp1K4ViRQAWElXhDffSVdk30EWSSLN238WBxHWQXMOJePHbQ87cSMZ9mUaPs0qfKKLkTaBnbvp/Qug+5ke/wGNKRp8U2kuYe0z5oaXscKGRzEAnFreW/ueP5SSr+3pudUM4VgZwV89TrxcP75JxhqpIazoNmZE7WabrOzHvicKaGIx0jI3TGzfLY7J68pp6A6J0AKpvwB88wDOsT0usOvCPzBrAcLE8llx8R1ikdUFo4AyjCk8VbquX/x7rpQMarfCKr9SkDIdhQiU72XrGLYQj9rc7ErAcg+6bmOjLZvSHk/a8pXdhuN7HzN/QL4GQOMW7r8C/Fblqil3su15LpIfihZfr30fHjg+N1e/R4PI2D8JMGEcw3DUNrJh7qdKWteShT+yVFvyVFGuFK6bCzRV2U6lrHz9CXb0eH97bIT8w2sNLbu5F4m0DpX26HYKx1CtIx+BOdFkTY89nVTFQHNQeAyGMoy1ePqoTLa0S4lA5fpZqnHjA3ftlmc+SKVEogvGujuQq0G4vHW3WuBTn+3MRUn8ANqj0DAwtC5BbaekDRAv0NG4OIA2QIZ3tDfvNxT6NQs+0vz+WLfEnXVFzBrBB0e08s3/FhqQ+NMCT+YcvAkv5Xem6Bep2S5Q8+387cEPbxU9RLXckEs3TLO8TErl3QvqRKjXKdDKpC0Mh1Z9t1BxYYFts+HJR0Y0olgbJ0Iq8GnQM5lCgiowk5B6RU5nWpRFB3xYJOXq/28B73OQCjGF4pTRFctgPBuatdia9iV+vZID3LQ8PA8RouEeX2MFggzlKj9v/Iq9FfvLTyKQMiKqoy84uebz+cHx2cE7m0HU0ucMJvg2W/PLSTJnAR/ch9sxUZC2rliifqsxLfnTAAkpXSCOm/A0FBOf+eabghwienqLUEdJy2YtcnbStqRyErKso+zvGPVGZWrSx+qoWki/FdK3poVhHLyHdyEwC7QHhX58GBlo/xHdcqOuSvIWgZisRhX5LRSm5nZKV8xVzvoz1VswxlDquVUgzDX52/0F72ZojTP44ah6QlPhRklaB8uXmGKQtTf5PIAxoGn3NnODyAFm1fcYcOBfaV6+/Kt/ee9dfiE/+K2HxXd3y31D0DhzVHnEJWj83n9433+YW1VQuFYS8fz6llGx+DHN3eH4ZxgCV/FBoulVRwIwYdMe8HFcSCKQucSaCRg7ExbEle1vnMn0G+gXsMRqB2hriz1F1hpaagD1ACDSwfFwt10iUYKf5DkDn08MKdoKdAwne83qahTZio9ROIt0d6sjIZC80J7i6btmIyjifwnMQvgEKugs+joLF7OJxbufunt1OB9ew2njwVQ52KAaZf68UyLvMFbTmLhgW9JIA8UmnS8bwWpyOztR45yPxqYKFbkZbFEmfKPRMuW+3fNvHSPmCHaa5rYz9rOj3/6nlxovPVOu2eZnFx9bbN6jIkdxs2ZXymNA29qrxtUi/9gcgc3WFn5VCHugrUkDMH9VuAPuE/txdW+FYehvJ7gVhxKhv517sr1VrvkZ3ICwnIfHizAovo0Uaewg7ryte2Tx0Or7HJ0arsZzhGXDossPmkYgi8IU+PFq6ZkQOiBJX1jQrH1lf2YVhGKr5aGh5syMpVDPmHsh3I56UEIpBgPg2EB8tKIRIjktIU8e7PuFo3EWwyEbaFfsuLD+k7Ppks25TeUHFIJRHvo8J3VfFKB4nqxaOAZXi9JHw/FQ9oOsL/PEBPgNYH/I1EcRUpdkle4nJfKKUqzerPqYvlvOUXgi7X8hhamfdJA5g4R4masq91WpUEfxQ6wegG2LD8YZjiSWxiWwJprDNX/s0d8qtySKrwXN+lKsOeD7zm5pN9s36BSH5MoR883FrnHvkZ1zuje+EQdDSo+xsWWmaBUmrcSZQdab/MqBb4egFcMudjClSFoYGMa+xMEFCz0FUdBsFa5AXZ+8iIwP0+aGrnwrsYv/BggZuZKD0962BLqyaSlLF3vSLj0FoBa9m8xQwf563bLxUzBk8L7GCWtxRnOV9G9btvwk+7+hhkoqfpATxNPH1H9057E9/s+NbddlJdl0uowXfQ4fiRVb3T0B3XJTw5W99nPGaTrWfEjEqLicHKWDr9HwDNtzdI6shevPF3/139VO09DdFK3bWLPK8pY9r5lYnS/zPE3/lwjYG+WMl81as9xrOdk4cbhJU4du/dL8vIMkUJBeca8GYn0RGp9c/1FTSQVzuQ3Ld/LhyaWHZ9bc8ZRT3fw8Q48/Pwdvf3C5Zu44qZv+75e/qy+f/gZH/3UV/i63/NXv8483vMlz3gHz3ng0Sefe/GX8C/oQgk44riEDbzJ6cQ/8SnireaDlb7pZLf+syzrK+5x98oSZUhWKCvHeuzAAdyOe/EQPoQn8Gl8Ec/ixbU9W9joFICvhfNsmRcds/E+uy1uBOOZCN5Pg9sl4Jsf8hNhKcamv1mNJtHT1TXcQk707LnZvV3vGniVrSkapBjSHmulrKZob0tjtKk/SfMYspFwC00vTGaYJVd8ZLlK83E9rzIa+Le8jSobqDAfU8rr4/PUj6msv7RqqBbkdVor1+t2xAqzZe6F53lNpOXYKDF/2dmsYWjwBYZKuS1IzzCePjODURvYxR5nfHqYK4753zziy3YVlTNtoTW6QQOarNcTJH7JK8uPbKYaAnvIof8kbZDDQlJvRKxZXisHOuyWeO1pUFD4AM7yenm/wzmbbR66fxXiXOanQmkq0KfSsZh3pYxSOOunFp6JfkpZ3zzWL9yzaK2Xlg6/g/VIw6LCkH4kWqQ4+8qvWF09ddeetjobmEi76RoSdKtsA1fo6mJKndN/CROXhBU4PrOwsbvFnigOhJZXIykYlimWdEgyRcz3hF5Fyd8jKtKGVOVM2yKWAuF/jl+Tmw6BHslVlIlhNzEh37m6cwE0CXopRvfNbNxEs7iqqEHmiwfZl6vUiGGgXkgermnmjpah3EJLy5xn1bdNv2O1kO+a+jMoCA3oRAYE8wiOXMxqGXSN8XjT9Op3hIYw//PekZixWWia6OnSlMK0hvBySp3QjLnA6M0Uy/s/0Eisun4eshjhuniXnuBsZY5mu/3NNgD75lSFISx7Sa/uRG6px90canuoOehF11K0qLIxxY46eZzLPYKTl3gPmSrWYdTf2aZv48pSGnMoZ259AFtUd6wku3l1OSCX3eWHTqOYMV+btwLXWSGCEy4nbVPcQx6qmH7erR0VYbvvG4hfnIJTgN50ZtqDOYr0vgx5faPXukWaqSr1GVt7XFuifYn13slqoEj+epjRX7iLGBoQm9saunNhblu4wGOvyXEGc0/bhXxU6ioHFxztqw9MvN/FulOnUnw9U99ejBSX70DYSRttcQ7eoGO237Iu347Bxu8e1kt04WGc1RfvLFtjFCecMi9qruwOEOoHalR5FnhREfdggAowJ513q3ytJMsJRvAHACpznG4za82tEeaSxTuJKu5Ka3M/fcuqPAeOsV7kQzyAFf3tg74q6FtUoBtgG9T/5KYWK4P+NNSxux4INkOq2KG4ZXBaWAGCl9DsvwBfWHVz/AzK/vCzu6lmQRhu2NtBUpNHoidR/7ZAIgefjWV3GpII+lBbejFADnwKdRiS88QHwDC2UsMs20sNBEw+NCO0f5/hnFfQofil9NALqwod1xwLJhvM88FigKUNdCA7EUwkDbP2tF7aEbDWNjWpYsayS9AmrtCWNxKda2nJ9jKIvX+7mEE1dGHKWmZKOn1nbDN6+WWtZ6ZM/uwuANqRbM9zwckmDGKAKqLs4vbTMz5xDD0su9tNx2nfyuQ0GCInX+iSgxKJ8fOaEJoNydydpzq/eZUpTpv8prXA03WX4ynssd6/Y3wdNWOdpSlTaAgPRSqmAZYz+ldOLoDeAXL4kvb/KGhRWEO18Jbbruf3cLl0eexLSvHyS3YCkeM4JDT+yn9OtJDfTrB3+UOia6/+lIB9v52E6emVr8qD9HLv6z2jezHXipew/vjD3uUozkmODMljxP/+bBvWo+ri6sLSIDzP33dsemiD/YxRPGPT8S+Bo4HU0WyIMh4+RXe0ZDpGLFhV+OZOryXS2nQMsotaaaeW7rlqpwVWtUDtpcW2WrDH7R0TrE9ICQXydDLGOPr4xwIqlhjPqxhAxp2FCo/OqizK3wsmVUOVsLkozpBlxa3FN8uOQN4Ft4muyeeoPJGMM1PaxXWC173C5H5stVAztRuu9+WnwFKAd5q0rHrSd4pLjekbb1cqfhgQZFX0cmDbsBdjnKNSbX4BrL9DHMmoTeJ/2rEHFrE83RihszzTHUORTw96QqZewGChkTMuhvFm6pQW/EItunnH1LkB00OVv0eRkU/XtwvVDxicpmgpu2Ig+7qlobhGnh8HuQNRM/+NiOVdQjUTuEdrkK5123WXAXp6XCZSKI3eURKqvRWdgB1OrkrVPyGRBoDmDqNncO2dehkA9xVNAJtLawZq2VWDfJnTYo2JXMCWA1o4mM+FrnJfO/OOg8HY0eouxvA9hp1Pwxuv+RfmMCSusFcoe3h5OevnbpRaFuc4MzVPoE4y/byvpRmcUAK5N/62tAPYVYeLzt/jNmYFjqZdTYe19fYn+Z3SAv1+B6kDbU3Szlvn36LOmDdPehkkldjurCCf7MjfjR6y3sYF2XI0JqyyK+0DLdnpDQ/v6AZgUdp2yf/nNmd/XbSZaL6V4USOVYMeEfIRfwNvzzhi0LMhdp/3fE1Hz5w4fpBfA0KcwPhXigWwv/A5+EaBn97fjtmME4223Q0/YzMrscmbHKr3Th8bR5XN/nb3pekQ1EY6HvxdDsYZMHTE/IxfHSK+RMtxBSwQcHgLYkhHxkff3Dj/lb69eyGRFDmRvgMmYRqb6y9Oko35rMmTBWtY+P2UPZ1w+grUr6l1ip39aUC6yB1VVV2SBZN6Ryz0bi94BKUelsnxoNTQQND1Z5uTFWMlKq9mV1Ez3Y1dZh7TjTBPpxN+iNKqRmO2I8Cr905lS/E2DhSZNksJUDd0Y65rKAgpuOV4pFe3Aqqr2hGrrCHZ1bZQAaRKuXc6ykgHXuyoOS2EBVbtylEhwjvHGfAA9L11MBLk6ymRR0BD4XZX4iAU0Qqj7S/c+XmHYMeFv88x3clizMb7OgOyUtWcpNrBYZRrnTMn6tcLs/cmUAROv647DRaOps+Dr4xNuc6837WEU5ju7+vJzJNC8k5TL0YDa3/3R4RvzG60PbE+/UPMtNcNn4MxT0ASEUmnmfvksQIsrG19ahS3VN10SXmf+tey3PtnTGwSzOF3QkdYl35lgxjhq2rG+8V3/ctfFevfen6FSR3p+dl0XFbM/HhhM4kJ3xbq4/OH36IqDAC/WE3cMSsz7Eb0U1Vt51S10ADO6r14lOqVYnUWv5o+/8Sa/KALV0tFWfaubJQfowO+JzZwpIsnDNXgzzqVa26g+gpuBCMMG3d1Nr85/jLRcT99cygwQD/pNjAYL7Qm7ocrfuBocZyOp6jaoFL+g8libk522bw7H/bONjvhx/jqb+mJ0C8ITfDMDFP32ZxZz0DEi2YSEPcPx7hj8j2hPM4HiZpeOUu5+T+w75Rw1oznppGbln7QD+k8+FaKHb29Obaj65U6lAQS+YTQfSbY7x59o0qpY4fGxkqDYQOehXTzeH6bEBkXrH1KGuThIAX3SQJy67ZV+xRqMuC9K3v9vcvHfUunv4g2uTQhdpotoLnRzi/0+dKQNfsvjCw2ijkK5P+f+mOQ84AWB9PCtQxDEinoyGU1LQxy0fTMyHxpwXEIaKi+5jrJ2sS98r5rB3bsctVUUX3l3l7zZT26C/tAfx20pmYuB5fgFigkigu0riI1aZdejwyxJrKZD3ClD5j3Qew48RIgRIQYVyTIkacE4hoKo0aHIR1mrDlwQXgEwIsPv3znF3/5f4fTZXVq0h5rBrd2G34BmJsSFuxRJ45kMsgin2IIZ0zXDE1X7XNMQDlJTbSX0b81vBetsGOXrUXZetL9u28Pezmd2av7naAy7by7VasO31FRQgWqU4uG9EZ0S8KFxY/2qtvbALk8ZpBzlea1z4LtwXhefvj2r5KAiKQPncZ0Z/sWL9pFZKdgf1stIkk1ITFyxGSJ4nW3DRowX4+1WM3qVamQESerg53rTAva3UjUSq5wJVY8dCH7O3ZqJ2bjVz5475QTrnAKOX80Wsnjo9Hwwf27P/90+2B/8MbrrzVs27L5lZdefOG59fXPPP3U4+vWrF65fBk99shDDz6wcEFuOj0T5ZrD1UMM3osBH5Laks2cA8IrboIpwcKwagSEuIEoLHWrAVNGNKPbgJQRvehvYEPPNGOS2JGyMIsVBzJOQnlTKBbvhFblrrhqg3YdanT5mLo26vmB0QXa1Gj02Xbb/bRPu1+rZ7IhJRl0W5zHnlEZMSY5/2sMnrTwnEy2gLXqsFOXXvvWgNUgHhinDJUIaNQcpMHRI3YY8aox037Jp9MEr8FLARMYqTTmZA+qSdOxJU0cLNGp3WhO74va157mVOJyhjt84l3vueNb3/qfoqL/r79bN61+B2p/053cTXMdKIm/DrRJ+2odpZNjRMu4WqK7lEvV0yRIjS0stvnMg2msJpVnqqmVI7gdpYMvdHKTb9Yt1j6MIreZRQGhOnPMUW+RxRossUSThzykWZHq1GnRoAGjSRNis81YW23Taocd2u2xT4cDDljnsMPWU1Lqcswx3U46bYOzzupz3gX9LmuzUbt2Np06bdbjli3uuG/IQ0/sMWTIASNG3WPCBMGUKfd67bWD3nnvPh98cL/Pvjjsm+/G/PLLEX/9dXT9txrxAbwBA5MHIfQdY8jBi2R8zZKLckW8DPPyFed6e+v01vF4y26N9vtK+bN+I36qJAFAvyA0b+J++At54Kxnf6NL8z6G3X3Js7X4zIA+Nkjo9GzLooG4NkR3gjRs+VKqVoX1Iqg8MjDU4ipYG6LDbDklZ7CYXkVMTMmcuR3OUr85EZG7IAx3IuaiqBWwYSAablDw4SzzysbCgWzEQL1DgVdBhqHRb2M45FM2SNIZUSvKbTn1JqjiTECfKBfgMShKHm9oAqznUy1tFVpf9ef/3dzpW80df94ENXpRtejwFBIIDIa6BIDO2BEZcOLDCoEJ9AZAq8OWAJhg0UlYq3clL47S2hxxY3AGDEgP7O0le3nNaDXgA2LCsf74X3hzQoVfgDqaVCIwfNS0sjwO12V+ExAN2DRPVYaZR+W5hAVDmauN7+kAM2YgkscOgRxNJFzoIc1WrXN9dRuX4MHC8MjznGwMG3HGKA2pwA21UHQMhMkwOAchQrQATbYNjgreADeIvPfxW32RVREjEP1V5Ec4jnfcBKcYYIpO9exqe8g71w2rIUnDTLWC89vTPYbYiHMniEtID0jxfOk67KDiyNSbgoMF5Y5NNIkIdEKUy0t65SqAPXNqZWBVhC9+27AWB1SrtNNdZHlE+2ClvI1neDTgud6LkDhqA7Wm+heHO5IwIF6Uo/TqyZdWkWe+qtREJJX1ILw52NEVQGb6B4mBN33sSFFRbrCdGp/IU5K+mViBTeDrEQcvmlVj+Nu6IP4gIaOy93FHl4gnC82/mAZycPPEGz1iMGJUirUGd+LgInPcF1iZ3u5QooPrXWy80baPWGxjCwY73BoRyMAFF8zHRtzW5FIHvsvRESCH1w/WJQGdWzxwDMdG88BF/nird3TzefaMyS6Uc1DzZZ/nXLvsnjOCbIJECNIKsLYs14I+NrIjknMyXT2lvhCgBqVxp5H8wTTvThEJbslEbq4Naq6BIYzQn1Lv/f6fHfTBv8s1ym7d0GtSB5qpBwDR75RlrPBgoP0CYiegW5KUpV1hjhJtm4VqHV6ql96pUDUNaaZcH3NGgZp2Ws2TOoD9niAGphnidUqp5/WWHWtfuBTUWC1dX5wAWMCtJQJ3uBK9ac+wVuxsw7gPeOLgP1J9xWuIzh7rjEIq39u77GrQ20LZQBUGPZUJR+c4M6E2NZuEYZQhdZtzXhf1HEFeyV0j2AKa8t/VHS6szZyP5izBBIdI4hYtOckNxEwPRB6duuDSdqrG6w9dH84NVQ4DQRcINQvzgn6zCVnMgfjeDRRxmxDS+n1qLxvQpfe+oYdQsbFLDo0jHkiL08VXqyIVPvUq3jnoNuq680G8toKexa8oM+YK7mQt5s5dz4rWrXCvaw0xbikElx8P7kXw1urn3G3szGN2GSUg/7T6/EL0L9GIf9KGf1oCizQhzQuLMTCmYcdZWKHcOSp2T4nFEaSZGbyM82QNVWQJD8otEz2jakzg/Yw0CGpwBbYqAgAP9wQfvw58IZMmWEUM7busuJJmvq8rZU0+aqMbgJXd0MhmQo0Vf5p3o2MHHxMHHGZm3uWGtNPlARkS8umC7IaFiHHRjl8BkXEoeXT4tHJyE7oqXVkkisE4Uj2TWfcJIQ+hs55tULRWmlx0+D5bPd4cc1VnagtBLfGoi3jfG/zgJbVSTlAuIBf+akGgwR4U16pTjolR/TdzEBktOo/sY1smsdstNrQaqs/YZPxhS96JMi9EGu0JGNQtNVqApwXvyex173DJWxM5A6v5y9LcTmo3aoIF3N7hXPUToUxCt+mxIq2l8SSJTpBD/CMA4drNJDkZB19FdgnkQqaNFWLsyQyc2ZWxZcxQo9VKgo3xGXsN74Y5JXi8cBF5FJ7dTL15d4hvTrOjn2vjTYQcQJWMoXl0i2oc4505ioEMVZNQnqcHMEt6mhkeuguHaNcu6IaIHcpZ7bfpd+8WexQn4BQjXEKYT9iV0bPtp7A6AqkiEj07PaYVztB3KdHSeYDakF6yWeZ1XLnakDiTq6t65sIkMXJBXIw1dnGZzcmdROoNA5d479jhtoYsceE2TztFERv8rlfC41ZrjaUUNUNRfosQ3zxoPo92nCeqyQ4rqrasdb2SUa/iIGoT9s7w/rmickLjoEAnLsgXq46MjopEs1880BaNiyiXZFPswu+eHjuZncnkGXy80HQ11NYMHYuQkR9XsYykTLFCTMFymp9DYMimP0GJfGgnudgAvZRRMP6QwDkgR0G0GrwP4bs5hmAYMKAtCtrAzH16+WIvyVrdcn+5F7wA1zX67Z8ndhZM8hJ8Y0SB+rV21vLG3Zk6c+Fm3Ww/LJ+s702uAaeAjr7pdUQjJzxUJTHvNY2fTROfVvCpYYoNKV9jFAa5fNTgMSzQMIqOMGi51yKLuMWdurzxV3SlpKCbsVp7/QSVUyvMcyIGPXcUJvkw8ZA0jVgtBVr3UN4h7mjLRNNh9qrGKNV9F9I7yc3eMEFTKIqucBJlxza7WFPJRzMAUVX3irUnrn3SeJ7TGr3EAvzqtEuGIKxHYgtE20ENQHXzKo6bBkZm/JXyWtt5u80uW8gIWiSuJB8D9iSNpXPHrUzOJUZVOvzP0Wkkm+NM+dMENknmFSmUc7fCwYVtBKtdLK8CzKr7JMxeTTH7bx0A6tzYcnwCJIPVE1pwk/E6XSB8UzGfgSBnLhQdWPmnv/mHEMRIBMESYkH2CFus2Bpcn8gvgtBax5PAO79tpVvRaEB3IwvDmQenriEJVBoetdwkKQVxq+XWBsWfouN0whhQx88r+mPgpaRSYhGdpJWj28LnIBsxX3ygqc2AC+svYW/0LgcgGeqqQUAsU1in7AZLumMAxsDo8sn7n/vDmf5sbpTN1Qf41buFCGH4MPzgGjjlc3pI/jNqMKSlVWt9YPy93IU//xrxoVPTdq4t4P4G3TnbKmJYBxNPTvTZmpSlsLFe4BpT4Pc5Jcz1Ym2AZ1TlhR2yAF3dlNJJ07mgOM15r1sz7UK2pL1V15PWa7RnGZynUYLuRdzQg81RtG/irr1xle/gNm6DE9egDNveV+tYvaGXLmEbhfWnXnLZl9uyzynCM9RZSU3cL9m+kre1vdjq6qlhYhGWOvyiyM+i3uWhEM6FZpEXo8NWMxqizSfF+qfwBxGn1MHc5EIX75FSIbUJdGd75uKlu0qaklzDKjwt15ZSgkUm4MZ0nAgo0pyzJxSvfMOzuqbghN7lJJ6IJLvYHrI949BhDjNJ/4xZqsWUHlhAS7TgdTdpuVSZE1YyWPZMAKxYuS5Zsw6dLIbnL+UtJSu58pUdePaUvvnYqWV8YoCxzxjOGVsVDTi8UfGegUdKgi14JkM2BOzotGtiwkX3nHLTyBIwpu5RYsQW2Xgrp4bHAzebWuM893eHpq7Sfs1S0m2GzMClPpRS+I7tQwsXkYX8688nzXmq6FxA7ryD/LQPOfOnVkw+9+vpr6VCSy+a6jQFcsFclPtFLr5aa8iqIVPx8JlQ/AzjjfZfjN8SjSLpcr876QPjATTn7EEGCqqLxm9+5Qgn96A27PjB/8MP2fOM6k2Oc1zjwLhGLyoGCiRQnPm3iQplrCOTmEjHMvzL5YBgICAZJCr58mYgFTxvRm1CiC3MmwUt30lagPsK1Lhqxm0xaMOJijY1uZbvytO/J7WwGtcjmRxHR/EwNPc3okYhMRV8Crl887wgBGpst4EqMRD6RaCqnj/43qKOfFAFOTUcwwbEzofToaKVfdgCqWqiadCGu34Hj0ENCeiGy77yaEN3kGYqVFP3gMzBW3ekuwi0stgmLNod5N8NjO+98Nj9efhWfBCJ5WEHRjVEpFefKFauznQgTKJAjPV7CywXlq6Mz+SljwwfxTIfGHnYYJjeFwFjm66ogvSIzhr+Y5Q3VMApXPpmKOHVpJLPA+E7GgalXlEZ96H1B0kPUBWr7u8GZDlh7dfjqqq1n7cW2/bcMger6AhU1WNq1aTe3azBveoPZdtUl1LiintyDiI40VI6YOGtRiDfv/I9JJggNsNW0oEQAx1Nqq0ixrcy73TNXRMqxT265POX3NjwTlGAZHkvCjggqnHQkiO5CFhSa18XVH582+Qq7nagLZs5qqOoNIREKIsNQlRMAC2gUZOqG/ejAZb1FRzhCzYDBYYQ5Vf+52QQ9eNuuFm8VxgG87EfPYA5cfyR5Gpclas3aeB9jYOcAxpVkxDMAYEwkiJc9PPeX2R6UxQqU8ZygiRrDYW2gFrmDNnJpJTYUvIhpVAtpnNkEMULOOk6zKL+EUtFEs+jIGSURO6pkBrkVov8bbHkr6D1dUVfBK4OzET3Q0vvm57Cz8C9qnJWK+boRth+BwNicJbIwxoQ8ZJcVnR6YFx6anL2wKioTuPOjdPac8jYWpxdntOqDgMjZOv19bzW17usROnliqT7RgczFUqG10yZ0Jbt52GsnHHqii8wgxlooM+mjXSedJqC/Xr682zHmNITtIcot3PqQhQqI2phwED1V7+6FhWWHVXQJlEdkYQEYLySCzqiS1CvTkcuXOpYotuSmseioEb4ETzMpG+woSHS5uJg4pQiXwH68gmLYd2DkI9iAPVvFwFGQERS+UCJqPZxZMA4xDFtdGr0ESjAzQzo4SFEAwZc5Uv5kPHasLAw1dLzO404U3H1UFDx8r8ZSIqyeHgmj7f3qQxKVWnO0qC1MBA2riYWyM4xif02Etslj3JijzmJkdqNext2fFHmCi1CC0obNE1Xu1OwKgnbZ01tm+4qxnYqCiEg2082EotDlXPO/NFsc2RbNkwJeR6ZIT24P2vPKyj9I0+MtaWa7ZUH57yTYQC5Y/JlsOtL9UKMyrpYqqumuk1PKEm3k5oLAD0W0gPDIAJyCTSdHinxfzPCfe/CX8TZmfTGKbCr3Ven9RuP8C+MwZLJ8m8s4qcbeubHzDG446rQDGgqc0BFs3WBvtfKi8oipM2Aba2YquYHBnAKecfbWblwf+UscfkhpE+eogYuQ01rSvHd3ewnEzEGKosWP3ssGWE3dpsN3sS01dxEPGttotbIGC/MqgCisCFSrLUSuV7mOgdhjYvJglUoFNNxpCLHJbH6vKW7my54g7mVSbkkYpqeRPbwfT4OyUjW3VimFe0dj4FQEqfclWBN47KlKkvIf+U3Qzjp87yt8lTWRmbotJNuiSGo43yDiAh7uiMQmzECQwSANrEiMDqB3Lr6Cq6kVA9u7vhXCHFkpLokjSVa9rTV0hK4To4JOevAUsQZAxnlCZyqrJa5DOgiAeA3B/65cMs6/nTSAYqBTogjqipyqbEY1wMe3UinLcKCpcFmU4m5TPnpxPWOmmKA9gXgDWuRH47TtxF1X0PcyqbTvweXYWBOMlz6iF4D20yH6MVOb3dIDS7vjMe23iUhr621hsiyVH2QYpfvYCkgsz2I9l+STtSOm6E2p/1yP7UG0MkVJ+8mj4vj9FoYtK53t7U4EwZuoFOAdQ32ZI3XtTGjIOnO1JujRodk8+PMBy7FGocQDvaB+bThgR72XKaDRdznrsdwd1HNsynEESJxqgWfvb8ZZVEyK+9/EH54kE8liOTc3A17yaCM4bkrUL3YdvosnjmXH1CTKl2vJK4YXKHWVbWxsBRM6uOjrti8eGaqrL+I30zm7F6ypjfiUjaEaFXCA8Ba7+o1CvgnfUwMSLESVMP4CBobDYBEDesfJyPAPGQGlc7LjZH0d6hOZYZPHA1D02MDH28BLKEGRPIhzxmir0h0BWOtDrAQH05hAdY6VzQ2SVzaDsix/3m8C+C7uttHLtKEx+P5PvkWNFuXHWOj7WJYws0KvxOuLnOKKh0Hrvp66epjEhN0lyBrcsgH8O6E7hA04TVsM1+PGvDpxE4qa6ey19vEH++gKq3dyorLKtFztbAqyJWAnGwrvIp4Gn6EtTlcWpGrPjzz4E7jxbAnVYe7W7j4rs97HvZQDJou7gb77Du4MPwXsqNW+LuE+PJGdsFdizthYXPbOVXl2IsGo5iwGmBrd+Sp+ssDQ/KH9ZhGlmlpht+P2Dbc9OkrAFRdxEotPpIIcebzEQoHkDVYHc7Zp1KaO/2q8tqrWaqdDurtxdjw32snXdQkvCdigoEM93LFRu6WcxLRgu2ilxC4NoWQ+cRY1I+86Z3kV0uDmhhNrLLFfpW8pVmv7FpYPojvT6B2MoumZ8VUGW85AyGmuKnWk8t89FXCWxhEzhk5Uyte4Y9Vy3qjyYIOAwcdwsrwdyoTfFX5/T81sbPI51U+DefIxaO2s9jTPH6GAM8tL4+ScMzBZxZjJMxOTjiW5ZrfcYJYpe5K9pwM8y1cn1R94JsZcsetbqT5XUT5IFwdqG9ZRRyqEAb0bGqkZPtJFEudoybL52tA1h6bpfHRMZY12hkh8TP0NfVdp+B3cTWsJQ3DG4mtzuFHJp1tWGuaWCfG4TlXIXeTXnj71a7IdUdgBKsRhIoMJQO9jwDVOEcVJCyG1ybLl4E1N5vaTaxvgVOtMX8bK9ucvYl1MI4A7Q8R+xBmY5KuGZFdqDbJ+fsQH1/b2bGb1PMxBHYOZV62FQ1H4RA5spoJISXI8NcuUCdYiJkHj8BLge1ADCh+6K25wfJD9EfnBPMXOaBGPTPFH33kfVREZ2hjzZKO2S0IPQUhwzrkkUUQyBkwG8A9Vw3cEvWTT8yquU/DChCWqPCB6AH0hMF4qdZtZv0OTqewWMUeTzjj4NfIXFiOEGelYxJBWA4V/8TXNOIqJdRf+bxCS/wkG4RkcS19o7mBEh+E3qDyMnIqj7K5W7zYrtVUnMKwC5XnXhQDmQy2m4AwY+1CrsbPOhD7o6AG1QSnbIweqYBsQTiw55Hh9JUMwxEOXGwjDQzM6xVIxwjwUe2YdOI03NHxZG1ntt0FAlMMcbtIgTLXj8HTyd41KFR0zsW/xGNrpFqWKiDCFPLNWHTrsncRWRljiyHqemfMGmXBtbAa0Y+6j66sYEhllXp4t7TJ6wfamg7ZIqG7Z1Y2oAYviCMfhE0im5uoLt73PLvcJCtyKPXPZCnAabBcQcxd/j2AbFicP+Of0+PFEE1ftpt+vwJmWfeaxUNvtto3lq4KSrYoPMDDEZjs5XkLcSEI5j7JrsTUunxmmC1AHzY082C9I5ZWdMS+mJRgtX6tw9UBVt6eSIKsnBaeByb4IhJ0VzCTzEnTInQdRp9eIo2CgIt8HonP7J6QEwp74d1R5q1iCi1IySOIkpSt+VQZ1KCFiArhZPLEkMtmwyFFfpGJlNvKgh/pK6KQiS6VpFzdC9GvAp9OvhzNkO4GMOWykfD7mavAa50+NMddPovr75KRC6KKtjX8coWjk7cKLFB/PwQqke18uO8BpY2A70qqd3C0zdo+wi+ipSVKab7H5nXR/tJV3RhZWspCBesdsJQR9R8THPDTXuwFhVEGDkgVfcN54n/Eb+K3zUY/3Ff6witiSfu2fh0QKSe68166FmcLudbWrayeE3ol5cL5TGEOVxeKVzQA2MMTUuPAWqVqUA0tirAsD4v1bTZPeGnTIGB/s2AHmN0JiKKGJJfT1JMVGGaB9mYkhLngI4SzvagNDmN6SsOVaRkMKFW+xgzoXgj3RnA+UTY/0hUmzZpsHCsywgt0mX5pwB7A0M1Dzgd7m+qhgXb5TeVLXRUqUIzuEGdEPUv5+RHcTXyNZd3XV4TFY3toqDi9pQ1Bx256X9UL0eFVMxo7KKIuVi+NgEXkeRm4fqCA9/xyYJ+/TITlS9HJs1nFrQjMV+YJL0BWHpo2Llnf1xuSL317B9es8CsTxCEHrsqt4BCB1R3/VxVdZOXWijMudg1LWwG9L4EEJ3U/KQnrBibBsSgI3LhRLYPmACOsg33Pe3epxmAIkIPz97lMNPpBefrYLQOZFFQivlXtlwrIIoOsFmAyU2kNIsJuBqPjBaYGG4KMeVWE+A0TPoQV9yVr+n19OkXJnEGdLRxn0pmwmfilhRa2HGTt5oBKxsnpzuzTmnWAxi1ZCy4wVaPkGLadvVYL2J0DhFf7E2gGqwPx4sHEb9IQXInCWdRZzwAKJVaiINyYMEyFKNEYQ8v4/GYla4XSYlMV5Z+3Oo2l1DEpkhWCkp6F085iHP3oLM6fw/+G/wIQh0wIvW9C52Lv5z5GIElZ6Y9yoSheruvu0AlCXPRxcNemfBJ5FXgVVpcFqysyPCoV65qaM4db52scuB5exq/kwyNkgsZeFULDreZs4tVpDZi0FyutUvOKZHl4ZFBtB3SRIjnCcbUYvGjlzsvddb3Ga6QjdDAiAjTZd6XAQUgAdavVY2Y3QqDb/gsZiGaQdDdKCyRNREcVqFXj7vZwi9WkPLkqLoArQQ5f8RGuR9wl36PDUdh7KpLs/TD9qcNrsQm5LS16Z5PZfc2eYFOKA0g2Rzpp3mZ0rmsJp3yS9SrCfHygBNsTPEaM7iT/Df8l+MDq8AI+nsoprPGgCmC0vtDdKebkg1ZX6oQwP5Brjkunf92GXHFuKvJgvjjBjcaOaj2hwXnGGIEslbdFeO3uDiHOrNE/6K+4BkdGQAHVyDCH15j6v6kQDE00pVu6tgyPKP0pPMOex1pOgdkH8eYASGVviG5IyJUjhdwt10HL3MNmrEdfExGjetMaHXJFj8D8P1bOwB9FFGeDQsUowAghkYlWlI0wF0rFSX64Wz5EFwE241lUDxlEhHYGRL0wWZcLO0ZAVc0qANm2XuvFwlVY+4gpAbSkBfN1+AHCsZixOhCr5sC6Kn/SlhrncqwHhacYdLrXQnzCAkCD/b66tk80ybIDuOiAYPWhbQdmHuNEAblB3gP+edwRaRkJMg3hW2oj+GoMey8kmUlRzowvW3VrIm3q/PrG7R4h66aVgX6E0WylsdKodKCCapXtldQWYW4xh3DfgUy54+i7F5EAcFv8Pmhknwn4LQcOqgl661bUGUVsgISKJdIdQUI5PWWcE0Y9Ry+tyUFPtxR94Oqjf4475ME+igm4mlbAUxecgydwgk+eouPoUzkUVS3uUIlAvbZXOOixbCdTIYhYhTixSHTApxHi+RUOtLtq+4IrI1Ank4ljLHTJDXQE2sXqpiJMyqghk3sql10cqUOoZ1IPLRFhA4En2UaviL2I51EPCTSQ+U6Dg1To7lipsi39W7EJA8OCX1e0OVIBzbxpE3K6lGsV6e5omgf0f4t/oSLdcx0Lwj1HttK3J/Uo+HrOgBik0ZV7Tedy76QDfU2/jFL5sXKIMHAiIA6kevacAMJTEMSh35sOq1HKlnVG6vsL0aWkUM1ucmsWTMh3OGwM5X0PJQoCukJON+ElBvM5MsvkgKrJnaBPxJxSe4abQj0J+njsGHPOWFPtmRTgG/tbfr5N4hpbCSGcAFUAy+dPLzf2TsKD68NRqBm0wxLHbr16OnqeN+iWRNnpWjRPGoaBEW6yohZd2UuaqYHvxKCJYDF3yn4JDMpoS7sYROKcciLqkflAfXMGI+Mh7d1XIEAtwpS4Htfl+myAs+jM6u+6GiqzcQTKM0aH9wX0I/ny7L9rTjD4+IDxMIt2e1ewLd7Qzyq+hFjCTawX7iKu4mWsNZf17x9vt86r788VKskONDSFHxk8DMNXV6KHo3C5vOy7nXVZYC9TU1R5AGJvixBlaS3BFGiBb3QWiksvFF9vlLduNytXq5rSzjl4zbT1UEFBULiUSNuSRPESez+dKaJk34bqQy6vZImQSXebdebhZ5gonz24217I/C0jB7w2pQg0lLJTLtND31MBF4ElQHgJwtGYN2Asw4N8ma36ZZnqOuWwSeGDriNDEHvrUgcyC1tZF6aEUMxDu7CxsFkWVND2NIqxrNwHVvun/2vtREN8Ym4mouqJUUpLidptzytDRIiZ+b+DzNnjUx46dSFqpFtZlMeqCxUn2qxCX0/WZCzSgaoDNbF6ArWRaunjPnwQYYUNg5JAe2+ozJUUZCWGTUGqqOR3SNXcCcew27fOhyFipNPkJNFxhjexbWMMvoJzwUqPdsdtF3bsdIZ2WEfNv7TnxkW+iiES0OCF4L9DbFKnmlOcXjLU+j8YkntBTRJ1I48Y4qXjooaKFQaqq8nNkyc6rj7DOampyXKQ9K8ikbnTuWxW9gzE3t8+xOWHP82XbyU6C8OQu2epfn9j7sJBuD8XCPt2ZdbyqpLsyVl0deiEs1M0WgAA6x3/Jn/cln2I61Py81NMzSy9IBFdlptaKG1CmK0NoCyxBSe/odghu2yw8kMJWp+bcIvOtGTDg43LzOFZ1f+Hm0OPkWGc+jui+TYyl5YoqK4vBdNyi8FyUrqFBCPEDO4D7nhyQGzIAcGc6VyIMiUuJ+8qr2bmLG/KAkdFSnboWjIWvW2NIULs8HY3sO03E55JMSakGWNbmJWk9iSVqJxMa3jVIyRHDu4DngMPaj1wV2WwSp0CPwyPMq/AdUm4TVlYycui9bMjUE8YL3+CUmUrT0iDgSHgwLLIA3ZA3++bgJp5cCU/4QPkvr+gVreWy3CQg5PK1VejJaOeFv4gBEKNDvmSf84l/Aw6n1/HArhec/TLWQVBi4ggQD2v8HTIdL9PaqWikyQ8pPS5Wsv6PEbEh5iyqx98qQxBsv2MVxHkhRAfUOUlVrYETfpYjxcAVJUEEUHih2rAkUazFYbVuyUtFrU0h0gJLSvO4Mwszg58dpQQXkpzU/amw/Nn3JtEjz2l3FvXtjcCQQVdguOGylqBwvJQK+APWcy850Ot1Vaz9E/+UXEbgZLElvmRqldS4qgwiNBXqYw/9jwkrU3pUbDB2SFqVCIm/DsVuWK55wD7xuoFc9cT4IcgyZNu1qAJ8XOVh2upoeuLtjA0D10/g7i2Yjx63r88iXyZGqh4k5hH+ynGX5sxrz/M4pvzWqBYcLu8UxWJW1jl3H7uvxYaSSs4AEfEZQkOuEQJnbt9GbGSNwu7KofwFGvJg7jt1A+AGO9BrbrF06Y+EI3wauqNJMWAUOLM/Jpbsj2q9D4UbXPIwpJbHjdkMUs04FxankELjx0FbwcaFURsRDi611Eg297BUor5F8ForghWVVosAz5TcDpVH4A8K/Zlt/guDH2oFZYcn5PntMieqy28YzVoFq/Qh9C2kfVaIZn3B7zSlyHMVBCy2lkMvHu/TKAAmQFwAslGaADEJknR4gnKnElJxfNWc3GYILcc9Z5GnkvtBY2n0ICocq3r6UndWOskmpTqSUO+m8yRcFRq+7SdqcvnHbMq7l5Q0DeKIzhEHZnjB6q8slD29K8ufjnOoS5CdZAJbKJ1/SCXJmhFilD05AAn+seSoKNTJofHMLLNBnrV1cufnfct0mzviTfhGjlwTtfiTjstcSuLr81oOOm8zMEwnn0dXqUcBWUNOWiHQs8aduCPMmEiQrMBwnZUFYGswiybAKZiN4HL8srF1GKUnh4iVQtPFh0b5ZetrLa4ALExcayyu2yFTis3+QoEqWipJRZ2SZJQJCYI3V/sIUWL7YhX1PI0q+ENdQ0w+B0hKnq36V/KJ/YtVjAmSIruNoKpRFyo5bl+nnj1s/xp6apeFgRDkCpEeoQTXWgpxLL6iZg+1su6XJhHuPOztaAZcGsMRNMAwh5G5SAH5yGQLCbCP/rIGGEPf2SMuh97V2fk3R/vT+/+G+HD/US8HT2yDmrzePyTBp//7AGuvE3iXVmft0RuHpGDj1IJC7Zj0DzHQZVXXTQw4sg6uVzDBpWQiSq+r36VuPP/91QoS88Ql80A687gVnSzsoSSOfCQqRuqWOSZcHrpltKLeXDV3UjrnQl+IQXnZt3LWTQ9RfYc4/Icp82K2XYFvyEVfu6dqTekwd6iYrrzasJjFdHfsrET9im5IObY5/Q92QGxpPask5OL0YbCG8YHU2Q//ksnbPMg0qpjNwEev7RwEC+KCX+ZZdWE+SSLnfTJ3cxp2vKkdSO8ThbidY5DH/sZhZqVgdctfzux1Y7b/yQaY1gfyNLMkj0IckzPCcSZ4Eay58jjdeor6tFK1BdUf1EAol/wzrselv5MOdgF89Xeu1rXgpsahfej2BVgqRb3GwYtiRX5J0Hq53Vbyr+ie9UL0Vj4YgUgBXbsLJsyDTSwfLgSj4QV5F39/iTeiKeuUNms9fg6MK6nwnIoCtMZVXanNgS65ReAvSLUgCeUeS7ziN0zte/KAHfi1ZawlBMScLvDlukR3UUKolIzUvU9tMriEPoc0JUagZbAgSrqKdCOaoI5dJDs+MdhHgkzaLks6mN44QvBLdlvsTrr6rOck0lySdp28WB3gSxnaUg2QP4uAPryWwSNTZUbgYxUB1vVijOzUEzv84ZGqIpqd0IZd7NJZhMDTR0D86f67qrWwJ0XPkC7hTOwXmN7zwHJP0uvLs4iDFxOl3A42jJASFQYaXNYnJu6lKCcLK4rVZS0jE/Tpn5KYh1HyHm9gZnj1l2nX6/aCijtqV6Obdg4k+qgilBsIED2yfp9lH4tX9dhKON+cBlysZanfxS+Ypis3gORfjAHdl/IWV0LNshN6/dN+eILidiRo3Hy+c898dg7n308bzhjJ/hk7/um/OxnHnvivc8/qcdeOJ6MHz0SX5MkUBDtFVdag5udA1opLsVuYXFjg/im667ST0S4xV2vIwrynR6T3X6mXw5h94vNktsWmAf8+ZCSMPwz8mKXxrYdavHWGfkJ9+Y8bD1VrBhkOi8AixWZwNaYB4ugw7orR2w3ZgkIQBDSXkYgoisphEyRdLHrbhQVUjwqjb5Ldh2nwTr+IQc9EbmgfdSaqQzavDzSS1XyHQTp8biXvMgo9zZfJwXDD9jhcXkeuOJLqyJCRBUn16iPBilCg/UFx9D2QV++TKJ41FeuUG+AtFLVbl/2Vg49gRBTD2VVmEtebWXsBC2jtbfE3gTG7MPXsQ2eSBRD6ffMwPhs26k81Nsuh6PIbbHg24z7OmvLXigmepnrdfkQf17sRSIJYUmoJ41Rr7L1Lrxq55aT1FicNytJAB05ssFKgU72QGHej73i87B1gjIb+mSCyCE5cuBxK1wtkqdlGLninSYKpCy++Y6g+SHWtLdgQ7Q9tXoqaQMQu0cR/GLDKvplijEqPdRZMgiIGr6uB9yMlgCVJv3f559k/WIFQ0KtrWRMMaSUBGotpdhKddRu8YEWSiNWBr+X/1dmCHNDUpADXk+25MCdBMgkI69H/4Jj/q0VW+/xUYmluYSsIz9yKIcDwvFD9n5Gv7n2HEvm5cRQfkpa5XR+jsOyVr9YMdD/z4KZjqezg4dqDHY5UxDEhALU5EqYWPV40stpvtWhR2vGBzkYObglXCTDkmllYXnE/R0wvXNze0AUFPbQI/+sxBrLWrmtw9bjZ8BhwpdWjltPoVxHQ4h/2b/YffsatZ12DPCIw+h+UG/ecpqmJ0u1H5hdihzalpDbVo8QBPzno1/e4XCP1uxug+oQVX5+w+Ocoo5lqv6X8GdNQ5xZu4NrTvtokOtfaUJMDn16s9hcPcwgx1s+ZLJQqkkeagrrMpxXcirmHbYgvUWdX7mP1CDkU+p4hFx724miekTM0OAbUogSc+d+UHSOceiRGoRow5BXQ+d7wShAH7yjn1Wrbg6wV3Zf124fKu/lIwtNznN7v/pTEvPTNrDS8TM4DZ79QBMQZuLb4WEuE3VvTylmZDl5g3giMJ80donM0Id3smik9bcyW5EBReE2EcLFbr1tyJG51KkZjL4peMKJDdU+ho8cqkNKbJDcArt73qiqRmSqG2UykSxsFR2fBLvZz7DytjKR/gmj63TVw48hku5ZspYMB5tXFEhhrW8W5hPGQG/yq6FMOf0B2VotDedrvCHKyKLG8+hrP//sT7FHVJdRfNrY2r1qm41U9j3Gw/cVaGrZb5nryeQ9ORvKxyFgIEWYilJhwRdYG9odgYZk/CpMT+fbIL6pVGylEVODwOZuE1ZU+7d7twvOPCyzzgXVhm+/C/0TCfJP53nFiMAovZ49fBmysOl5vPa9+p1KfwO8dyouFl5ipPAFyQ65CECQ+0hvMdlNYZjc+LBvjFLnMGo5529h/+1LL39IbECDKAuBgPRKJwa/lJhJJiZ35QY/cRHVwixaAQOZah4mHiepYN0V+H8tgvcr2K39cxZ3OtDVTc0xV5Ms4FlufaFYCoflyhHhTPInxJNDSg0T6YvYbi0A6IujruGldjAQ7h1w647f1TQUIm6ZUhHQbsQvRFAdZSbRN9QKWNaJLfk1Wm/NcWowlAqoJrnB7KMV9mpxKtaglqXFLICdh6YVAd9K8GjPogRz1Fy0YZ63VDJXS6jMDPETsOsSb2Tpib0kP1p/CftVafBd1dDgp4UbQLfa5GKQOV6/mrx25ZH1bgLl+3K0PAqejYlEsXqeSJboCkiXuoAU2rvXJYF5nNk5SeE+zsg5kKfYDNVwgg0vdtEafiB+paFIwkUkLOHMA+PNTOBt1IXU/SAmC93OQ4vIi43mCOEsyDuMC+Ny/3AEMl6Ju1iba/rBqt/FNPNd8ZlV6Hm2BjiVIatwaRDH4zXSTZZBnSM88qQoTJDKh0qJLsPti4M9N6nl8cjdzmnKZuv0PukUoO6l+fL4iOBqkZixp/0LYHxF05NPgur3mA34hvxCfwlhLk/UIQ++w9dm0EqC3QJ6GMGFKX6byMJV7nXoWj1z5znrLtBw5Lp1QHIYayOgEjwGlYJYO9FTep6vSgFM8/jTyxDiFNqveQGx0ohiMGUGJauAMHjb7/Vu4nfUw9eY6/C3FtKcy+z9vfdYiR3znlXXnR5QF5oVoh6U548vEGKAQMZgX95LPz7dOx+Sz5OvECUYZfw9WoBP1d5na+Nc1X7dvMbDPV9jo8F3GUa5F+rY5HlFRxc34Buvq87VeoKxbnyLb9ofdb625IdNP2+g3/Z5mfH6rzgNXgeWVwndakPaHNrV/fRBU3u5z66K0/8qCntI/bCUgrx5ngCiMCyKw2qDEAf+aUyX1SdQhMhUbtzPonQeCcDwo0fgv0realz6Lf6lZDeT8ojN3+eNg5jpdbYBK021uKdAZjha1n/FH9v+hSCPbg/KqaWX55aqvOql4Y+9I1fdIWjBiAxHdI9u9iCbO6Yj5VWzhfa/Gyfi046iY2aBYbAbleYwwO0tmMJkDIdhLcANA5Hq2o+P6MFsukcGJX2UMsWYuUOEkElw32He7K3YDm2xfWyWqh6KaxMGdFgI8WqjfZJeiowsPELaV8zmO0mES36OB7+UHG15I/v+qrO8Mh7bfdE4YJ254mSb9nkt+MN2eV+y2kxxsuBAR8b/nnkUDkL1Qu27AvgtLVXRv6hyVK470eZVIBQaE8i3OL01QwD0eX6A+GbilVN9D8oKLrVgoTtJHUvciVuYDI6SvXoRqxhMlr2D5ZhGfSDsMEVfPzH+6E6jvLPUPSCN28sqfvKF5gNT1IPK/EHUs7Z/5dd8VH/JX5ukzaii3mC1S300neLlJttLc/BpgN1FB9OTY5J743DO5JjK56fWahTW/24+9g/jfYCT+/hX0Ldpw0bRYQOPzNu8qN6Ks1mSTjp9MHwIAQtZfG1WV8w+X70gx+CwfrRYAP/jcZUQ1m6Dy3r7+8QzTMmHx8mmUEZ+sDsigNq2kHdqTHnXoVf54ZStdFQObk0Trmyac3JvJyWgOAHE5mj7Sz8y/0ikJ/Rk0EGUSWejq8wKyFBZWBaOlok+njDwgPATIDzvMYuiIjzFcp2osfpz0rpsjNV302WqPWKFrwP3BQl/D1EzszLfiqiE5lfIOCR0b1svNdFi3wX2vF8oQFouZBibO4s/o3yQ8+AHWq8eUzRJ5QiUoxUCJqtkEmF8WlaxbjXXb5qyg2VBMXhSOvEUnFO5niTBr9yN7+cIeR4cD1ZTILQN2RynFvZBnVD7f0xFw/w5+FNDhOQNn8PKUnGDeI+5A5ow1x3hOigfH5YQ5/zWVUYwOPqU2P/SoE+2STEczN1ihvaPhsSkggtEE3y6EGWKd3hy4ROUOMW9KzwErdmG6SCjhTADMnP7SNZJsWczpb0IeGquQrm9Ahp37SNBXzIYRqvHeVKaqG89pO5YebuUsS4q7XSnAXsx5C9OS5VGQ/uoeduVfXOGQHhsBdw7lfPoJD+S7B7TMy2szQAj6jTccQfrGLCIPBnkjs1jOb7tGNK8a85eVn5BuW2xqp+AfP9WEXsNy6hi5U1VI33tQzy9qv/d17hNhfqgkhmDuqHEvY3hCbX1sBgUqhSHYlgB2ZrCuCrvK+856c+KkWLL97I8EYMx/fliNE5dV9EUDyORTnw1mP0iUMJZwNrAMoyoY0da70BObY+RodQD+5Qp4tR2/dEUeD4oN/Q7gMYgsk4l84EX7sb3K1DjyXu9b1PzLccxbZVYKcOqp1sZax4ZUfYNXWnoWdq1W6pcV2Ocxbj2WWpJryBKX6mSEJ0DDfR8OcwlqobkIw9Wpiw0U/Hvl30zpAdAamYPejAMoWfkoIOMggs5U1jPbqpFQW/Atr8dcfSK40ayMSgsAdO5HiUZtPypRiY3KEyVhdmXPiscA1GE7NJrl5A7qUrhIuJWiaBB8eLM4Q4ZYJESIsXqy0xwilWbzI+cO5YR9UyPjYD4pv9aFtVZnkh+2tc3lYbQ2rLMnzdkxb3BMWnbKflNCha/Q+wCr4x6a2G7wPjrsvtqnAyO9BweLAoyFXQ/t8sQ87xLDh3tZBbalnxB15EPfqtYGmpfxDqeRNPuYDgGvzdYv5bNCrIhtQQA72DzE5U06lhVPWQV8SMyCDTgvgBpzRy05XTl5cDB7DT76oiuVmq4Wg88bVQOytvTC5+x1y5fqrcoRlnOVT89sDXuqJiLeMpckMmCcV+gUKdWFlO9bDAJr0R+wmD+SMsTQnEZeGlnygdKkcG8dMGBGqu5qB+pVq1J0xMSv1jld/giesdLlXVW+JPy3QiK4Ra8FWVgIWR7D7Jw2v1n9X6Ypl+ehDPu67PluymwcS/fmWC8GWVPP6D4whia5Zv3C+3xwZaWubzrLyNuRbZfk9VeCd3KhGwXKLTuo9F8WkyUTQFi8a5En1fyWdOo7QgzIh589H5a9LfO4XLVhUXAoPnqZUuCS3WltROjykPufVgSiup5a2kF24pRyGE2BBociVJgV5F2tgptzWIVLKs2XqpfxQoMxUVZK7AGEueGwo6znEQ6UQU01orduuoBLfJ9gQK4vf9apH8dB2Og2SCBWKs+pgWzMrEKytVHha2jR4nI2nbMtNWqZsc6bxEDtZXgPekxUl0Ebvwp52oSt0HnSFG3Jb2HRfOy9bPHOEZNJm3CFSthJb788gyOXjnejzpXq6e//+IKHE9ySWqaIZ147oAK9sIpOiEUOY2azL2YGBPYykuGo+oS2q2adIJVSaXozfPu4Y3JMAVAlO3EhduIG3z7dRLmmG4mmmNCRvS9bbLFXrtmuq1SeGdE2cROeZHteDafWu/u2dv3XcraGuTf36v0e0UZnkTUVHSfRw54dJN3K0U2CHJINNkjgJYhQkt/GLVX2oeltVHeTNmblX1QPKT9iuIyFfzLW36DK4KUyf7KurFkbi6OPRm6KfVYDm/4+5dhkmoorSNQ1wHFCY0KYyqBGxJKFrK3YqLPmQcpWBy0Lgs6P91kHbUAIgfnnPN0k6kDXOJV/ImB2Xh1TsZ22yIn9B1f/xQsAcQ15Z55gi2+Abbj1vr3bbpr+vIktEXFOajcG+WBZlfj8ZMGZ4szp+0E+XpKbzgXbnDEDVZasOmjq2sOC4Hg8M0cckr+vd538TekcZOwmx1eY/B3mPDF7NVzIg8Yho6d9gJjk2/lLQPPt2MHeI1tH0E0HJz7+Znpm0tuZcr3DJLJ2xUDeyYMEOYKuqInei4+LaR2w+sBGxkvqpZxUIrXvDx0RlYWVEyisM8Z5u8BSNDfQyXKmKrYNANBTYn5Vqp5iTahlDmCNIvBUuQVeT0dEFuIT64yDvUyQaAK+lsisA68x4InwcC1FbA5XZJd0bDwkaLwTBheTfSsSzYmnDjLZHNSbAuPvYP+gyYXY14Cgr+qMnfk4x9s1VHf+pJcf0JQ+VXo8YKhiobI4Dw7q4O/i8qoC9+wXoSDX+CLq4MsE3ix8MhOuL1iLhaheQvareZxh8v2ZMdeFpcjZpf97z6B2uWbT1po8tdlKeR2TZ8La5fzrb9k6HgJvGrVSMMPOjNLrbLFWGsbpDVpnBoGuZvEtqPSsMqAk9R1HqCucGA2qlcHa5r66yWCAO12g+E1+KDMW6sUHrVicGvuMVwHe406xuwbHCU4ZLA9QdbkiJIKLuhu3Xa8Ph/knEv4hvGVV6XOO1uScEimHLscTAJ9HaYm2pPl3RenePhEZ4G3CaSQKNKjXxArtg5x4ymwhUgSRiKj4Xv4ugB5/1Aff/cz+6hJ+3fJiArm7+lfm0ppZ+77vTQxwzT3ZR042NOcjYON7DhFvbGXFkphUIkXDRYuUDFSQ7K+woRLVhy4z+DOxyk+rTreJmKXfhVB+M/tC6TH5KmJ+/HnuT2rPh1hOJdTlOKO8C7rKQleKcwUtTeJveg0kmltzRF7Gwg4JaYJ7bLr1F8MwxghSFTtuX7L4wNAhROK4pIDIggd9Cz6lvdhPl1db+imEuR+BARkU34DnrdLZyGyRjjJiQF7rci1+ilJhHvc9zWSmpUSiJUnjDRDbEAbmc5Ke4zhbXS6UK7jzRjA3O7Kw+SlH0xrKa1pZ/mqXrw8JfwBfYB4ehQD0P0Q14S+AU/b5khLd629armQeXxjN/I7cZneEnkAL5qbURyUoSvI+fTjZ08/eZafTKfmRrI21R74lt13ADLazSOUpXKXariYo3osdlMnDrm4XYwpswcJheQC2L7svXmq793+93kExpaxCBJALy16vSVniOFbRCmV1BiVIJwo9RLFNTPpJDb8ta4kGbe4LfYCOIuTotjLPm9sFq4+avtyeCWPgqs4VqpMZy/o/TLlUEF7Dn0K+TXEiaUJ7RFSBMaevXKXU1PNPm2pfRH115ncFr8AvnlBGlNA6ovxYvxr7dVtMj0nNPKBpBcnitc6jhrYzaLC0hRvdgZl2fMX1dJZh6R+ERaP3fDuyrgzB7Pwzew70brVDktOKcr0PIUy5nNnAISJBUC5ptzjVmoRr63MFQlUeQfaCNnOHSepqke1kkMXcpR/K9XlnVkkSf4pRccoGdfavXZ6NCBGJ4T45Han5MT0A9LtvoCUunf1au16eKP3a3LHWYZRvfnz+O1fRu9cNokqjxapIYH8RQJ4qF1hl7eWckyWz4r94VP2M0T9hAVctH2Tr0cvYQvyl51CgEahNSc2lF/rUJiqspD7xiqNTY8nVkw/Xu9OEtkjnYGA16sRVC8ZZoPxUaE0DD5h/gg8rm+EhanDFuPsdnAr7qwjhcbEUDG2LHXRPR7xMQw4m36PYjhGBRbumYWkcoFzmGM1wRCYcpb4J2IkCnGwfnYpk2bDSNmmk8KWQyzkMgCmn7/3u8zjdtyDF98/S0Qm8WVvZTnzgHH+zEBfMlev+mKRpVUAgmYrTjSUgFJ30DHwuaYe8Mt97tUsp/c8s9kH2n8lRSS+S0s2ogA84su2veST1EFdk+NuPEwbJCUnSsBWMgA9BIM+NLMNgHd67PZXKoe7f2Z06mdLD1VZ0AWHGsEi02quoDzj8FwMEvOOsgbhjV+Q71c6RjHiBaWWamqL/qIkj7LnEl5CQhJPpGvHNH6BHI3nsMCfDmJqwuvHkBZtouGBZdQ+QLk+5THe93GKnt5avMi5f/qY0h6IGJJnEOZtC9AWqkLb1hF+O3gZ+508qrYAvjgbZxLO1Z20VHkYMaWiWQgegIJrNDkGLBeeoPwZzm6kGh71tFdsEGY4DgQiJSieCKu0Pa6hHTp71lphgj8CIptWA0YZmlild/+fdW4O8f7LLoP6FsMDSMfkGUgiHE8YoosNITt45yAgqVbWCXCUt9YaxstO5ZaJkRZISxvdaoYSpSv2SAydtdZ5zsi96rFiAmO6MROhT8aHQtNud+qtVXcImjJ8/LIQQnL+wRsM6pRj/8+UPiQE3Au0eThIKtY8ZWTaQ2PYa+bTi4jeEUlIZ+xjVQ9ZilS3nwQwfzY/CLy1AllHjTtNSHT4iOB/bpa5N/TfjtsRBpTTSdlISyW0XtXt9LnAGJRCP21hK4VxJt14+Ir1sKGG9ezhQvR5X47oNESh9nONqAcPIBkPv79hGg/9821pN8LPMMCD/Xzwjn0GlnZaha8Au98+IU3Ynj5wVN7orCIKAjw8JsIwlOMJC+DjOnzT76kI0rV0mnjr3BR5NtO4htMgLEDL6WlKHqI+DJKilIS1QMZTbkpREOyUXauCofAeRilrS3S6TRH5YKePuy11kiNSGxzf0oeawre/niEcRPtWhPRulLrCfdCQJkwZsW0nIvZssmxHqZaRRnk+0HcHQYtssujosoM2Iw6kUJ/1thqnpEiE9c96jj/olLIJIaPQomObbQb0E3GX7Iv7QyaH/dlS0zvb1yLqJX3ETKVBpoLI07/t+/NOjefVChb7ZQvCFttQMhInbjnhCm7S2/uAGGbSC71a0dmE5kt5J0+nNmqqJjC3JPUCN+L6vpanVHqOuFFaS5zqILFVw60kTcIsU8tesSVpXXGNfXlDGa8Ms5AbPWnVD51pYomx7gyrngiwJvcRzm0DEZ6PIwOEjfxaocpxWAUCquK9IsDBeTzAxTNwRPxgMRf8v2/KgB+/qThTo8ZQOAYpoc65tQmFNv8kZ4E1CYkYfkSan9aq7boV7BY+MfKNvzyp8JmfdmstetMI3fce2qxY76eIhJyW+AO0nTMk1mZxZ0lZLRnEXqxir8g535o9IjXv4RJPLWM589B4/9r01JLSU0LYuCodqrBCbBN0IkoGugxQzsyEqF3bPXlsKet8XoCqJAhCOUm1tEpKJne1pTBAuBCX7SQT6JRYGwfdwncOsGjRoE84GjFFSMmtDNdVK49BEB9eVQ7YBlPDDTxzulw5PHYrLiJyp6XU+gmvcH1pqvY5k6jHpTtgc35wZmicnjvz8YDBsIbPsTa+Jy6qEcQbO20+/x6PE+2UBc0S2Y7vP9giu6/Ak92z178uy2S+FpRlV4u59k8uZx3PngtCmhwMTJbTs6FvRxATEF1jrkEeXJth5ZMNjF+BvguIyZB5dt8i61EHI7pMg5kDTRZrRTK2UJij12waRfOTuVAIjMiv/X3gQV5KYYe/BN0l45Wcg54HOs0h1hkUkOAQjnTs0wgZsUP2ZvnUZApezkTi9dU3TNrWKwjSZmaCX4jk567N/Cx9rtSai49mER7EJ+IGIXChlLxlzwGDTmX/jvRk2P0IKDYpqfLrBQi6YHZRENzCot9cqDnlMvd2cNhhtHt5Ury2LYpYG6w1Vpov1csmClN3bxMKyUvISGzg7EWgg9GBPj87f+Rq05gzvboLMVPVtgPKOlbkM9o51dn4kqZmmFyQBDeNDSo+uXiBpYfRj8b8jpMWQQuodUnHsmRDrWnynnTW9eK4OSy6A65ToGqiS012vcllA3rXMgSKJmoyRKNU21Eqft//JeQC4VTGPTQJI1Oc0AC/DH8Jh2Mgi8Jy0DnQ38NvKErSF2k9P1uREyGUrHdRP7Gzc8kGr1vPO//NOPp5oKNTG2jlV2okEXPhNJbDN0mBkrupDOQOqJgBQbTTjnLMkSU5aD4GADjhSiKvhUPc4ZyALVPEHksokX1x0ZQsTwcG7ro0vW4SxbU3LxMFdOEjX0B4c/kIPQDaA2t/7xDAS9BwgqAb9uD5NR+hEEymrchQsMge4hrS3BXzjHLTByhG+uesQ7IArpB919i50mwF4ssssCWqoZCdZVSaR94Xtf48uDUJdZ2psFORwghciJQIx9sLeIX37JMvoP2PoyOPOy5si0d4MQhKL+E2svjdN3PSajt3BxqJw1N2hzJ/SseV/W1FD8+UQvWdtXBpMqCXy1Ct0tVko0En7y6HGQ/OYxQXUXtyK8n2GBcrMRXLePgBARXrjM2utr+Lv2leDq+0vgXGo6rUdndPhQQ3WboY5sEu4qI2vz6P+yof0c3dwC/iwT11e2kiWY+8ZWmG5wQomYsMofXpMc2dXmTatw5OWb/WDmQvw76SLrg7r9huyhdXxhGgV0uhteHqOOfkhl7zpUnvarb0PZa1M9r0BweNlCcuNnI7GoFwDO/6fuu2vX5XJVvCEUnSa00s0BgMl65d1TBSrAWG4o+Jal/mmBFdiAGysiAcVdTj9ZgxJlsQpGp6yGeTUNgVoZx5TK2wKsVMyCJog6LAUcyoKHbg3YHSdNdnvhfpytF1voMHeYoAhF2CMB4rBrQL8RFVie1kKSTE7wPRgv9nOtj5YBLOlCmlrk4jwTW2BkjSzhnO+d0ceA8MT2bmYrEGZ8odWwuWE7IBPx70xBRIYULE/oekhOhUz6YvxOtmQb0uZFdXmkbwG1OVw3NfegT5++JVVa7JnMZeG5lTBEy4M7Q0o7dngwO+dbvYfvj/o32IpRobMQawLbaPot1Hb2bVr7ati3obXUTqwEhrcJUn6tYAd9z8jLN27cfap8wTcd2XzOaG6Td+qn+W5hDJ2rE2uqVcoq2sQ1smHqJMQpGsQnJCXxlsZfw3MY51umNzVg6kMY/qkRGa8TO1nEFlBHywVmsBlFFxgG3rn2m9xYKZFBEkG4uat8x+JuaqZXaJ5k/RHX8u9iWbu/tsyzgvxb64qOTqgkSsNLR5atlghc7m1+HDj5D62TMS+Hx497vgmkeCxE3tYx/JVYGqnNm+m1q7kyODfvzdxfuFwy47QYMXzpgDKm7StHXmW4XU9HBuUgcSFBWdTX5etKzlwHCmfu+6j+jpKyl25IxcqvDTuLdAQL4EIdxVqLqJUCA8UxEdjIwddSSlUXK1doun7t0qb0lI4tPGjh5FrYPOcjCBL+An5za/owIQMyrkBX/hMVyuu3r2aEstzXW+bn3Y/KLt3cEPBuuRkSYQJiCJP9Gv1+EXGyiaLRe8drZU3Jg9JTj8ao8QQZ4YCbYPZ4vwmVeVGoesAYSXnW21XKVydzbZPEVLdq53z2x8el3u4pbL35uVHrt0M7rlIx0/Sfhf7ZSaQ8LG1nB1dtF93tY8LDMLGURWw/GrgPRRSO0Mv5tAkuXCxTQXhAyLEVFlPtHotLkaeYHfSx1u2CHHiqScqI0rVmryrkeI3Zv39mLzvfdN56oRLD/ilQQMVJC5g7Li0pJ5CQMeGEnvzn3MZtIDP17zsD8Nk9luyo+k8GeLqdQvHSNfykTy0U5jZ6fT+b4oLtwoXwGWELCLd7KlPhWWrNWIaLbZjJwp8oKLkuNOV+TIUqSi972HNoUQG/yAsZWjyDYU850e599SC+zFeD59pl5YegDZyPe/EevXVbBFG5PIT9e3U/BJ0ZbSg3YGxppCsVOBZjc1zJWcW1tOJeAlNm91ABO2gIiXQ9yZ4mrdjrjwAdYRsrgXj7MYHzbtHsmEYxC+/7ZTVGrpWfz2LRPp5ZfJW9el+Fb49FUdmfNXVCjnbkTe5OLOJUvdKapO0rJurymstLxACmFKbl/YpYLshYkREc24Tb16ncbg/gkVn1/csYvRgg9MB+lCSlp8E38WKdHp6fLXiiWITCVTzHbm/Thzfqru96fuxBoNNgLWJH2ySbu0ISFKtlk8rvb4VOKjtLFYxvdFPNtsHoiPvzDNBsOQl1CFJB8AaymqEsC3AjheVjmTGmmfHf9bxka1oz60tCDhCmXCU+ZQrluOx6Tndr4BDTOLIjS2ppiw7Ye15chLRTFpUs8at9I43USTQmAACuVLrCU3V0F++oY6bUzDKQI+vOoRnGIpaoTuEIIyGQHrwd7uDtAlJbPHYrh7NVvqFKs9EC+Ha9V+0C10oNzjzrRiSmRanF2Z/2MfiG+BzfFTCS1QWti83QraVXVr4mqjICvNcm9bRIFDuQNSRja0I6/rSJwld4JBgZO9Gr23/PCtZAbOS1obyR6luEWyaFoEh+0m11JAMEWVPA2EP9QT6PndIgqT1vgRKKcRdUy7DiyRRLGPlq07LxW1MCu/NmKGfSGW+C0L6wmW7vVkrgxstsvQqRvRqoNjgRztg3eJtI8mXkaGa5dK75j97+Jv0tSWx+SCbhQ6K3GeTY7UId/tQ1wrtqbOYjy4AuzmiKlP6rQWV4QFlSivZsi6sycHn3n4YOYyTjhvv7u61D9EaIkw1uKvQzyx40z42KF2e86ONrB0rISRHfxwMqxUepNyuhufC6f+ftArH4TVFE6PEDtHOBFEShpI8wDm7MTC5CbcdDYVOkziCCuCKg6MRytt1UfCTtqkkYQlEO+SCj9RJJ+ORLchZEuV8TbI4HUBfkDJRjTN1fvEk2VJV8n/xgcIp5LYNOqyw2CpVxq5DagH9qmkcQQ3LAYNnaEzWv5Sn76m3pJlw+TpgvYvo3f6+JKPoNw5ANJi1a/sKzCWzxPGzwFWYuW1rKUzxUrvzhmvrXNmqJN/JwCTVfRM/dCxHBsljGVuA3/317u5xuMnnrcvTVT6GS+yS4Ni13mavHZxPOilZfhvck6FQcx3ESwJZgYaFNgK+5GIctc3TfAFRb1h6NjC2JKbJClOdRkp4yES9XpbaqgUuPJrJMLODeCaTef0wY2xEIxuVZYmoyi0XqZ3/qWR61pjnU1Q34GO5l1pE0nE+XI0nqsCQv/nwSzp2YE8uYRs+GuZXqDaY1XinNiqXKZEwkjJXL+WndpxddC4r3g4NxugTtH4YXfYhFZPGjTtj7SnxNt15+DRPkIGyQZdDHe1dGSr3cZlrkk+s3MWmKBaT8mMcHBaiV+f6izPGad/bqie+Q699Xi2nasUBjqwMyHCohyi0gbli+Rp0oVWJlxLgp0MfI7FdYGOHhYxXbeLaEV2Y+8SEIGV3trHr23crTfJgTWqcecWfs5lKnqacjymmCo8opiIvjf02bZY3OnPHwIlJWNkWDKQP5AF72fSUUCClmCEyw0v799vfyJocA/09c1oVoZmuWRIQJhHgQ4sYrVMirsNi3bKBNeEaRopcfyV4kDjXLQQPbc/p6xlMTLCip8fwaa5yPMvzjPScc04iJGNyljpiaXzCkS0DELIIVIsJXJ5eTVXIsO5fFk4u2/Ly4MftWzm7q/INjWOzAz6W0UdfyyrV4X5nwQnf0ykGrdtO/35vBq7a1cF1NR4d+1cYePMsvtZtnRVTUurFt2QXRQrzMgAtSK4BaGRfoSFSqfxCkGoRIZDS3A/ZZOkqKzeRumkFHAzko3J4ALBWfYmCxsrnIhlWbAWCx4BE0wQwdM8VKnVBxrP6e5ZoCi0iMJvehvBIDskDPm7uvz+wFTyP9fIVdnQcp7urs7HhTsujpwe8RqNl9Sv/O+PScelOFmaHPXLIUX/5QcLNiEDS+4hxIAzP+jwZqojnjoeeOqybRdkijSmf2M3LiURqNWS/PuyIVQQ6LFeLagxxu8vbs2PkiDNMAyhTX19prwXfItJerO5AD0TfWxDGK9TCs2NVSZkqloyClOyy0vWujGspIAoBSUZe4j/3h15+VCIjx7yng5z29xVuZs/l/od9/V9fWJb27pl9qmzYvdqdgRqKJQSnvcf5+9ZBrkiw6eqp+6LBmSCpeNSFhzEFVpCy00IEdqHPykNpDEhSc4lHYMhsMmjVkgJgzHChZ9AMRAgN+JFLOB5BrvxIvLqhR0eixk5IkNfyBR+Nh1LMcxZG5RqVyM/VxQYFCBJr6hO5Hh6ea002+VYHBiY66qolaTBgmUlJYQeiJnP2pTrjdu3L2dKeZlf0RBBxIkIAssiFhFmRmursC6Yw/1Ef3X7i5U+YFrgzRDq+K7D1Q3qfWT6/GyXBYbjfC1BhMXsLodhMKQlmSAyZwFymJ79I4T3O664J05FTsTwKBZnISyBdBovU1qT1YqREDPn3hnTb7LdMug8RcaiAZysUnaOoiy2ROYpJDsvp83FuEHaCWzar0YNxsg202KEAYhFAkjuPIb2HK8G0F5N1IpnKCJWNRCq6u01VfX1PuA+XhXWm81cVM9yuhCu+Xt5+czw8MysK35Qi4aGDtFDl7p5t271wniyd0EeoSDTWYtgSCuvsZBW216HhfTaNrNrP9uq29gtjL+f3rb9JHw2sltOb2g+c0W1oekMrQIQQSnFAXuwm8EsRqsqBNMvSjxlo0FoNprJlf8Pu1NVBWjxTRU+UlBoPLDcC42w6YJ6b9dNTm7KpCALcxVr2JZ/CsMsMoyFsttnEA+VD74l7NkjVlS0BBaMkmyxG7/z+Q5V1mwBYAnHsRxHVIbijhc7/g1kWSu3Xg0Id8yNlPX1iTOhV0wOb+joONbSLfS/XQDzTH5R3S0dHR6absxu/6dYG0ywMuv4Gsz2d//YEKfDTd5fqgNjquChkpoXy6Yq7Q5NgXGWnZVz5CZZ3NYjaJDIMlrmLuEdNrP4ZQaR83egNvT5c0/9Qc3rcQdeP6B5Ja733hbt1nC9uP+k52/JT39D0yvNs/VLwXtCDSACOTULSYVj1GDn7cWC414NCiGh1lFLJLxlK+ClQqvkJRK9neG82P5lcAUcbMFpkRyKjcyvzybn0ptbTIVGWstNlZExhHoNU29vlbCl2AKLmXO+TSE9lsf7Cy5W1HsvulM4BI5HxUE/OMXLmLGCTTc4DxZ8jSrY1UtEF5GOy0fENx/fNFmQnnNvstt5JRJhj/dkK5cjqJ3Y4QlXdAF1XR7istpS9FIw2eCe/xOhoR1BlyMN9i6BIUGIRKrQCSYfi6hd3iNs/In4vDwEK1uZRPSuegmTd/d2Sw5vH2J58v1tHe+Inj32sQbDF0DXMvFg/W+2TEQ7PLzAxW2h0Z/tnf/M2fLXPuE/BPxb2fWYn/JBfL1P+wK8mS1nkJb3dgcYbZR8P9VDNSZsW4hb2HA0CPg8+8zY2Inu9H9LjWOVal3Gqzul8kRVy2pK4fc7hYbpHf5vWZjTfXEBAJVbCkKF7KKpTmEayw2YwpAPNmV3jCXOEtMdZwvuRwjS0tAWRwQSp4/WY3SMvk9QWvRmpUkWmiPeWHZuKspSYILVwM/BzTuR0w1pZVRaqaL3N5xpOMsL0kkpOsZvOYlmsIg972CaF5EIrmECywR4+kBV57Db4oBOl2syz9eRtyrOk58pIMqgeytsmJ5QMgU+ORIQzyg/FbKFwTFvPOqfckrHpCw0px35L2LeQWAMz2IWCim/3dHd5acNiEIiIvOOjAmGdbyZd8RME/3KREY2JhOxKEDWYILrzmTTlXNk2VD+zJY9jUGSl6RbIN0/4u3Svs/3Fv+Mny6P05+qf+f6wfW1B86uxyiu/D8PJ/1c7M34Hj3j89E5QOhGbi1EZ6g3ir0QZykwx80H6c2HBbWAzCw/Ho7gvnmRIUx1hKkn6UGYFVwUEkqfOi3Q/CsugGaRi+BZzIvFJymOWQfvitK2dnjoZ0qHCZjrvcpERJNvDnyBCzpZz4vCIi9HtQb0fn9qV45aUOd0dajUFK1e+bsVr+tO3wjRf+AEz3HQp29ZeWH0+vXRhX8P64buDUyi246S4WazZWycHMNiHh+7zAX0GGP0HCBBpt1ONwqLTQj5kRgWGlpmyxDKC0VCQOUGqxX9biwKbuCtwTOIWZ1yuN0OKta8e37pZ0rG7svs6ssJViAkjhOILbheHnn2/yiRESMim3o1UjotyySdjSjXAU9uN3rw11+9NPAg1Lku3dgyxvPeXTtH+CAfby+tBp4Ar8tlt/dgpxP3DA8D39+noSZnAYFh/Piz6Om+PsjtFgT4dmCAQr4U89iJbRjSxu47JDDDCMcIAR66GBF3+QlCdcNi2KadW2CY8F0DzSoAIHVMdYLR5cWo7/kiYyapt5edvtNOzGLY6Jz/yVn6J+7PTxyfU4DxqZIxn765ucU3sIJg4ZR+Q6FQmGkaY8o/+xQ+zGO8giCbwgbNMVwyY/v3dSdjc+v7r595J1Ac/QNjJwOTLTKAHRY5Pi4WraLL/7gtSPBVxB1GsEptOuOi++gw5qYehrFZcOR7JieQ3R59sU7QII9GeoPqd+8mUm791ORfN/b3P4IVLX7yD+VGcfL7kgRT/GR8ZUJs179FESHInpkfnywzyZKRFJPCuakjSaFi4ZGY/rUgPM1IT0ixdFJK/H4iG5Nh27LqX1LZWRUVYpXp1zVTU2xhvjGNVjWpQm2OL+yVV4IGVP9lrJD9pixl2dKcZGNtXYQa7oOmlG56xVYo59d3UCU24MoXv/5ny5qlrK5n/KJRl8PVyTFUpEWkvTX6rk2Du2Z2n1vheRTeHtmw5Nenf0kn0qsC9x+XvXZttm/ybHGGFHRnnJFffeCWQmVfn3jqdEAOOildilbIc08YZ1FyWun18EJpZv2AMdQ+scj8xsX5Zdjdl7imbf/+tpJv7nppTX19OV9oliJ6aHKwubBNOfN90UqYGQZ1g8l3phKS/qT7U1LC1J1BhkpoTWlsTUmgJv32wFzotyRB0aK8pZITBQHobO3cnTuK336DRRfW1EiuWyxbRjnEfdrx5fcmk/m/Jnf+6YN6LzZp+oqPlDxSBNY5Bef++RAv7RrI3qzZdVrJ1Yyu9DnvyMmXCMUhFS33zNzydfgeeBf0oHvc0jGpID0h9YATGMCta933cONokp1IwKbIDKEdyVKTNNkhfSGpQ5qxQyCV6x4AbQrFXT3KxfHGVb7UWSqWXihdwKUzi7Clsh7tqahwcWOuItdAvKixIhef6T6Dc2Fu0LnTjmueLvaymBCy7pIpN1U/V/OnihhQdAicezSNsZt1Y0wnxkw+0VCN6GSMnYxxlQwUtDrMTCM7TBATMhNqobHpJbSP4Sr5TxPgDVkGxUvnEKXAONazow4qyNRYE5opKMirjIkuKxuyDZIPG64CNtFPaf2RlBu5qb7USEEy/wph1CPLE6xkTFTZ9OAzxctJJmSS0/7B6bIoIxwGQ0rIRBKcIFxa9ilJJH+Lzy7kRjFpMghiCP4KIcIu0jpBxxNf7azBV/8SLHY1/GwoS09T1Z5auSyVSOCsXHNInDEX/uJv/jhJITqcsJjPnAHRIscSv1u0ilb341RcF0gDn0fWpgg8Z5o49hAM6US2W+YOHPzu6y8tIP/nUOn/Ld8+84w4eR8mshGZJ+pv8FppbOfQkIrUZ0qCOHlbpbIRWeRMMZaCvdP71FPDw5PQ543dDu7ctn372taUtrWVnhu/dGm8ZMfJkzu+jhIzJjPEKLkIe70+tYr2vbx/f5tK7VSl8/423+pgnSpcTyM5XMfL70ubbMjW9rLj+7vj3oqsqPamEH13Q0VpOxHjPR4xTa/ngK7YmKfzZXWuy/GNvVMMlzvvwEBUz/VUILIwz+oEHWiHRcxM+0P75aWZcordjOw1nETn3K+LB6pYefIlpc6nW0KuhxQKRajC2Sl+wzFTCrVl/sNZh/0zc40XRTjuWFi0zOF91XtB84imv4gwDJxZa35hNnm8Zzx59tn1r3eSE+VKTWQelO0ZkN+yQcCqELoIL9wsCEgQWr/NB12mdlBaKB3UZkoHL6rs1/4gQCaxGMhMnvZimq3a6npzxk/IWPML00/r6Sjvo8Qtn3rLGeWNQvBWmDyyLXdzg1sQAQfm/qkvZdZQAvV4bgOK3aL1JwGIiGXr8vMP686yw9288HRrxoKs9vmxcB+l6SF3yuCgGbPYjB5+PDIEfjyEva0988OcAvSypZb9XuWvNe21wt5ch0BStPyTnS/y4CdyEPcyb3jdN7dvv7NVzODX39v8EKPJaQ3vdl8gixfxgpsGw6XihKf1yjDYGq/sacruEFVmhUJx/znNiZQTMGN/2C+0WxJIwWR2u3Sr/M9geN8r/0Eq/eFsSSDHItpDI/ZJ/jl7Fh+KbpayoChbvr3nV/RrDzRUDjQ0DBAZkdIW/I2bNxsaChpB4pktZwZ07NBStxlIuWOLZ7fTS1AMGBEYaxewYJ/HLIZLcbd7Ys9uB7LNgjhWlF9LWacI50yKOGvz6c9Myuar/614fERURWWqEs+//ofGqhXIqOIP/1uNDifp9QXLPYaS4ofjkoqrrEGkgJT5kHjH6mU3i55GqpTIfehv34M2f0gE8m7sZp8NY78UAK36ZLtlCMsCgO5623Udq2XjBgoH4kK+lUciCjA7Bdliz+Ga9+hCFp1kqZ2drav9tTR/fcU/VVTFIKkhQBEhJIlvsgfJJHA11nIP8kCwGyPyy6UdtZtPttptPdBXBm9wonBEz5ezgjtx6NqBjSzVv3yg9TiwlrjJ3nmT+Cgxi2FAQyLeCrZLFD1h5NdSpmUOnAj5IumkREQYzaszY/gQnkOYEJVpmZ3Oo9M2sVPrxzwgQ9NRCl5YakCcdrhcYOWgTSw3FubDDdK5xrWppbq+RbVL6ErfbyfQ50WK8d1FFBWqpZGyVaW/1tXOzlpqf4Ce1ZmbqYzNVCa/e6tq7i1v4vf8hIf0ZnCGISdENEtbOeYjHVQiSZ07aobojx6XhNBhRwhn26WIxeqJP4fx+0NQ+MtOJkO8pTfvhW/yGqNlSyTpCWlWGk/p4PxSPi3rYsiqmZTa/CFi82yWpxEtBUMITLaSEFHutuhZBfMfM6IX6EAOgWACZsfOxsbVFmTJGGkcyQgVz/hxqMPxZ/rk9ObzEImAQbCZbYLQ4RTcEzU2B7KJYJ4W+/pEwqSm/rMIRbZUymPjxHghXWL7hR/r0LIt7mSXV/akz/hadHEMWh4UkZzv28TaOk3SRFNXK17YJm9qGrgoHnj0uAH0f4e9r4nGeYc/RLwLO6jod8QUAgq03WC0dcl5Gld+YUNJ6eYWx7ps2MY1ACNDg4MNPO8mIJyr4Xop7yirqfHObN7ifS/DlGTSmGQm/gn/LE4bzCqMlIMOHyqC6TYZViIjo4d9p3VTy28iLP6brGbzPQEzrGxUhrly9n7ZFO5AZu0U3NWjSLIvCiVInpDKnpAULRtk0oEEFLVPcrYpY9+B9bW0JYZWelJT5rmvfrPlgyfXFuaWbcwtzL1q4Ltw9AHvlq0XvbqzD0HzSOjXP/WilVZnW14Z75hWzvDfEDDQLL3owAJe9Hc8IS2LsfxL+kYkYl9E/2WJKZOekMBbDgzXwWJXlNuZ3Dt9xUJ5zydW1eRKcC2qbBKNr8TuYPKCk2YLZRt6Gqm7scr/QOhpcUGKy+9a9du2CiGH2qjmg7bcHHbGIo3xq8o+JDY0iHv3NJxRm+U1cvWpoekCdE8DpxQ5VCF/7rn6cKGGJhx4FguGztvT3FDm2BIlBzrYkA0vadCDwkDbKgabsR1CWBi0TRazCKJjTuFhOmTPjXNH6C7OSF78Hx8mS7Cakv7+VI7l50drJNKIeOMM7QZt4dHXPrW7aUXw/DWddtie3dTTGzbcy/lwFT5NARlRnMrszO3i5qeWBj1jZPdT3pUrvdCv7/uCBx5wrajcaqOah9G0VwadO/iblpz11d6v15Qsq/JtqyEEVhwbewIuZq3RhVyRdsE4tqPSVKmKCAsvS5/j77wRU8cx+MaRREz1NMGFfs8F7SsxHwrIMFmaqzzHQND4mpP43rEYEirUadsN7Gaze7mWrbsbg2QRNS2rSlm2edPA5zktOYrtjyupewCaJiJ6eTZByNDo3WAT3vKK1//wRtiHKPv5hBs6LXq3Cgg0QSY4V/AM4kYuIgIyFwquIpT4pofGDFJpj4CBRGU1tIzGNYgWkdyFwgpfJQeJ0rHgLVjl6PfolmYd0m3t7f1h8f0weWvC/ALEOUHFi6Dv4o8+mpVTOEuCKgs2kvLzZt7tLzagmPq6uTekTf/3cyLDZ3ai6L9tLDlRw7PIYOqXQRrqFmGWnxaRyL9sqIIRp6fhla6QL3ImqJt67mbuKkRhxpM0EqckndMZuz/mxnbmSMeljtCJeoTf27PBxYkJNBFjE7zjrY0c/HuhGCb7ocrBvKH+BQMDxhSIw9Cvd9uukXXOvvqRkfoluk7UyNPAXqMoUIRM4z7JePBMuMcI7mjKqEyROLEV8yAP40c2qjzoRi3elD+MRldNS8KIQmgNne2hzUgmnYwsFPcSoKGJ3wkhX1saGz/qOz4a1CMwmq3cQyfiJkcPjysn/f7J8LAtq0bH4sfyvVd3j/zrXyO7fV6o63aVtaDGejVydLXfj4wnT4JacfwtbnRLUIvaRVStPioifIM6Y7qzogtwhigVmSKv22M45MlsHnwlNuBqhq5ZriTKmGUFRD9pvL0oAJ/W+RTAG6bFP0mBIHyr3D8ncmJzH2oIosiXx8TEwoi6rdvEqX0XLx4eHezf9vrrIN1+LVgWl6GssMq87hc90/KXdUfvFlnfzXrXWnT36Lq/tDDnmySZc+O1asm/gCB8xSCVUAeoNqgkvcRqVW+WTwG37JlRxlbViCZT88CvBSHtzXMdu459+bf3dTw4jTBiDKzIMg694ZQY1rpe54AFwlL638J02ZPxUc4MZ1T8k2V0vqzuyTj5hbQL8vgHdLSIDYQPwiKNKAg8CBbc6szSERtUkr4U1LhPd1eht+q8ujXmHj+zjVFvY1ZZGqHev7x/X3vRqp7QsNSs+ixTb+9Dvb2m7Mw6zHFsO9OWjGaNJ3KtZAiVRLJyx7EQzWYMOSP4uuERr3ub1CKHg9faizIhkoAwNUF0yuBW7kXm1ZdW6m613dKtfEncv64uWLrnwAFx8kRjo6j/q93qlkDvTj6e6GkZO+Ue+Ojah+3HJidFo2pIkl5zqtkM0dI3aZ6nBdpPaJaGQaj+2Q63iNGYG6InNMmSvxqHgqvqq8FXuTPB2Y7bOr8i86LDb13J1Z/YuM5hKovOCjzCyS4pVj0XmTLTqyhLOPFLFp0dJGGY8QuU38sSgLRgu/hpIaydfuxEjAGASAiaMfOzqKKMIPjBaRnj/oLJSW5eMJJBgskjGDaD8yJCCN74eFT6LyGw1I+mEc7EDCOHzGnG9oHMI1QPNMCR6nl0w0naEOFOgjqTK3DTOiQ8rGHDZEPDJJDOMBrd7sZGWEC2jNJuQOQoyUwjAXyheuBtSaOoV8AgtKEU5+GwAXQxIvtO3ulEvwkjJI4PkCrUXYsoxIDngRNKx4TTSlxw8wS6Uky+vX4BC9oLpIhjkAsKtRXwP3aB1wTxSKZtRJiZVZjGACbDeiHaKpOnUSSm5ecci6U5sm1ehKqYpDkReCkZRkAAtEi4Fs8L3klVzBzKcxt0X24g8krm1wbxV4ZqPmQIzPpAawi1Lk/8epHwQ+ZEImQpNXLIAbE5PiAek24BCcJchxQRirkli1LOssD6vhyg9WAPwyDBc01H/B5lqoQI/xn1QFcQpaM2URS44kRkCdcawPv8HbDoKfkImYYswl82S9PN3lcLu+j5As2Hmsfw4ZQAH4CE6f1JDVe/zZ95lMkvEHfvVtfR+XsffRQSlShKvcSXTmrGpWGe25S6Dwb6jzZMKk8MDl7bVlMyOBYRXpWzRXMLxj20cqU42pA9XU695pzJhE5G6s6fX22+8axpL3wiI/MOV6NBlLPtMJ8zaIBEqRiRGwnphXl+a7JcDCMS6t01ISn6sfvBYhjb3YGBnXRJlZhNzw0IpAnMPzfUglHJbn1NjblGL3jiLZxCBsJ1qPKDOVKAcGTJZMqk+CSYsi1ODCimQMJm2VaioOW2dH8hnZEyTIFYrUtBs7QChWA4FQKQaadzltMnwLr5gDTYIxA4eg4hXOYcMKQldNNnk5vISSMCVurA7+CmBpGiOciqKmXD2WC5Ed1XjHJW/7wZPDLMoFFZJm1K3InwTfYjWMAUtjdhCKMNhz88AYaTwOh9Bk33O3lAdaH0gipg/VpGHFZObOGgIV3Li2J0fkybPciDJ+r5Efe8PLuvlMH7AUHb4aFBu8rJ84B9+JMzRJ4+5hezT3aToOfy8iedzysgWESLCzzGFPE3JR2XUdhuEimXbWKIfpn5Yk0X6uJ9vfmCbfHCI68TmGnthT4ah2B38LdDIggC40YYAVossAImoD7YX1iamyL5ICjA1WLJoETALQH6YHDnNeWyyljJN4Wlm/P+OJKZn/Js6gr271/ziQGW0GLV1Ds/Wuu/uKkFByxm/SJDGEK7kRucZhHrn2YYhqFZxFq1bhSc77qR8AboOs/D2O/HOQh4XhwiPGKbqmKYsL5wpXhbHdg2c5eWL0n9q7mmOaa4uvo1dZTb55EXWfavV+hBcB6zMojPBv55aFVcU8pmy0JytSuxyqXpWmjYdk4h5PkMTrVtILtYQ5i+IKicNOf9oCTTO3d9J49oxLlsUCWcwEFdBuEcSLlWeq0ak1N8+eCiB3sE8Rtiz4l8mnZzCtpm/+o5aVZ5mO3sdsWBuMh9apnRKOYltBpdLo9b1UY9kBSezNevRBnlEWKHIdHaWwMjegiyqmYFmLXdpKWTXL90XEo7Ylzq528WoFt5xwXbog1AY1YOtp7LcShEjEb2OhZhpiG4oTPtJsyizTgExxXmaWPps+YT8c71+w7lAEU9z9ck1k/H8HcaWXWhpPAhu0FQ02dSzrh7pwfREUu9S2mQa2B1tC5EMtAwsLg+JMaNJzD0icVC8Yi2BJUMf0R/TIONSEA8ndYHzLzDZr2kXyXLTNLkc4q7Or/iNH46mEIuoCc0k9KvVDOlF1RX8dVcWHPewSeQzqejLt+nyC43f2eyZGcWrrXAIK6tMaF63OS4nzk1Fjppiazy1RLogQe8W7fMeKU12a8WiDRhCc1xT0wn2k+b1OpZH0VGdnXZ9G93WQVVNUlJqHstK6/5AtI0iFIdauFekRv/xN1N2WODsCIoIplx45nI7NOKLz9lIs1Z+XHRLLvDXkmMWIO+aLcbiID8OxgiEDsNgUXnkeNkKJwUulk38YetQhCBSBH1XMFzUYp+UTOpOcGHMrSnqA6yfDOJyG1VAUL1Z1KbDePjG3Dj9m0NuLSVLcU6nw4riZIWeaJuSKBR/0N4H7IN2XNfKc95dpeu7/o2mTjKYeC2gADDt3T9wBrpg0fw8H6SyUjHKUqkTjkEZTeC5zCeFwP4TS9C+KVANBEI77bZ0/McoQlvsLE2vxZhxM/jQ2ALjXDKqQgYr2kRAufdonu6RBWDEyEUZAM9qlrkvhBPb9veMLEhMSfB2iI86U76YE40xHGexxSwgyLxmM5x9RRoFxipJVjElMNX605ClsMgHZN6QFlgw9rbyViirLBx+9qR35vPgy1rw25cu2WY1yjLUvvIBx8AtkbnoBb2gmiGiIYFjPAp0C7AtEx1qN1X67cEQTjrTZTbignG2hXwwYoFRpHCr3y9dFLZKBvGi4qHb83kNVogXo8Mnf1pnttAsRT0J4ZoEX4EPuRIR8Iiu0gRuRjI1bHILXY6IlR5NakqMyB+lsYLlAgPmFe4wGJHpI15aogHpifK2C5WTVgiLhBxbf0xLy6bgHGIv8JTlc3iRSVRspABCPv3z+JmBmPJGnpRcVvBgTrBBNAgzeiSipbNZE2QbWL7eGH977+XVDU2IiwVpXvbmkQ+nvpeWaxoBNvCRtUYIYGxnNtHAlEE1u4mmOTcDzefpjbCt+dqw5Zb5NwHn1xXOofREveGn7Do8NM/hA+lXy5Mkv0jSHQRoX3L8aYo5ufl2wWX3fV006Ygt8aL9rK9ABUDk55dFk8QQUyWdDMI93R2yg2QIHQRRKfxJBoU2Cv9lIw61Ob7yOUUsrGUMRk6Em7XnhQS+CIAJOLGbtmYjJw6p/Prbut8umsmqUlm0pgGbmlOpIzKpKMpWRWSAUm+pF/ymoSE8awECMEoR72FlSJdp1xYBaSQXP4XdorznBAAgOkyYx4no6xznyp8iglQDJqBSI7R2F1pzLkJ/n5jJUTdT/BEM56BGXp54Q0+ObXuGfke0XXRuS8gt0E+ABObrYxpZ39ZGEYIY0zjWRAJik8zIl22DcNk9YCtvAM7wKOTOK3zK76kuqleqkD9IPTPUYd71//8ajaktcTFt6SRtPKE+PI0nockTXZDvoDhEYmXfphlTf2Y6v/K2Zpy+9lHBRCHg/k0++M1bFQmqmJ3yNOosFgCg63QJpGGOue+IJKeFi76ShRF78FgWvHOuxFp4ubyp0yOVTMm06JcV3VrqUG+bXvDo5s2laJStlWJyLTHHT5z6VrsHMTPOdiazoLSWsFMu0HmURKlcBFLGOsdNLkZkC9P5cTmR2DgtCi7qFvYty6ETnP3g57i902GQRMnNNCwVEnrZaH0r/Fm3BnZRdmc7H+h6/1MX5fnpE1DaMhIl/n2qFd79dCERZ37JAYn0cr1MB+h2FDYeAMbitNpOKLIOdK6WMAC+qlA1kzLJJjw2jUdVVm8J9ccJCnHv/iLEAwLjYcBm9qSLMgUC43RXF0iDeualXQ1Lih0nP5CpRo1ATC+V+TqGi92JFCM7rjQ0BhARPQxVwhexmlRqsKYQibj056ZE1HxMh3cuP8/IR+FwtJVH2ik9OJewsd8/eRAjRssfONbNTDx70M+60iNP3g5E89YODWu4xicVNZ3ZYxmaW1xOOi6SSb/QGFCvrDXnQrPvooF9emcC3XBy3xasTAzxiKyDk2IlkEXzd5LMnwRBneQA0G/PjQjpG8h3/RU7nEPMPWxPdzYCO1uZnvR/0LtEwddXugf4ENbsKBN81lZVPP2h4hfqj7jsv05WOmMeCjgoQhnx3tcuwnlFfZjm5kN15kDHvAzhBC7F/AwDXRkITSsITLy1luiE8IXQdJ3BUSZLE0uCGEf5Clhx0WFdaPldYd3NcSpYl6zX6s//FG5SXXXduH0yiiNuuWQOS9GDrP2n+mYksfE/lMvhe1nYCe1MsdDkKs0Su8MGjXvrRr56AcKX0mfB77CKsdP+P2YQxym/X37RM34EJ3UKE/iIChNkTHNiWku+3lo5hChGNsrruaabkRYq3hzMCZykcZUQesB8mAFOYgjwylMOgkEDXaSYIaZ7yUEz6OgOU++zCfs9RGD5iCFbgalLB+BhfP5+8EgamKvxCUaGEgqS+vfUmq1CqcxGCVNynqdycocU7cx/JnY/9iwvbdKd0uXGsFl0r8wWChLP/vDh8fA6RxzOuv/45suLx/zet96s7//zbe83rHyciIjQL2QBtyslac4TAxCMKwG4jTlwidCko+W8DNdhR4aMQ3puQ3ZWbuqeve6/F1ZGzKrtRlXPGRZQKzpGpwXzEYA4RPt50lh7aDRqgBdIZ4v4qa2C3vVWdnpQR4tU3E9YuR1g+UrK0XABgKyuWtvniNUXzcwzA3zTMAd4+mbXuXzfjH3La62HH+2vGSEo1HmWKUegDi2RBIdk49nakUs0plIhIU4Mq8fz0okuAgJbCDDSI1cF1bjV6NLjrRauV9tU09vYDGib3/W700OdNH6YmDkYC4TZeJT3lC3dUsv2yThKlvis3KzUkbG8BInJ7M8wjFRH5IKGHGWewQ9MP63z2Cgzmxn3e8VscD+SM7xJ+SUV4wxKe93lCLAPMe1spg7rxlvjIE5J+O03tGr6HXoT2esXvVQbyi2+5X1XO8LHIwsC8/g6wKclt6Y/1n08/zwXgN45oiMR4g4icjMVp2FGW75yZSAiAVZaIwNA4DYEmhc3CcSSc6ZDMki9GwimCD5rU8dLmS6sLga4pCivwBlrTyV+x4p3W7pvVlkfgRqg4h0AY0Pgt1ofl1yiCAgFm/B4SC+EobW3BIgRYDmtpxFwOHwaNNT2iNG1A9LQIw7VVDz3oAAIu0gW8Ad0WtRvJWujtjLs8rcCAj7HersLZCNyER/NhCmRHw/gupKRS83yAgRKcsMDLe5D9MUFeRJeNFQBJz6n5pDsIvj7KJ92gF7Lb57JOZfasadJK7sotIjBUYdHsvbfzm5OS+jEB3sUpzurjlLmDdg0u+GtafsFugsY7/zgUGX38OLXXxMceORFoOpfXUUFx4N/d7pVsb3O7h36rH2h9l3emvqXGKUFwfqdnS95s13POy1fJ9JVGaMwTfckl3w8YdwluYjVddJSW+z+r5DJ7tUH2mycEKgnnh2FiUHaiUMpGablDGnf+Nf6sySQhC1gIQnBK/Vn8304fv+LB6rLjvrjL9HZ3piZ9qxLzqYaAQEI/vnxdTVGF3aReOi1ujCbsZF7P5ZGsCsOHs2y0OmP7TXN4itbbUHZ+kGKwcUjox1xG8jK0Ub5qfZpXnzvAd5+GNDI3Un/eW1zPpjQFWUjyOYcg5pcW/Ybzg4qJaVaGHMpJepY4Q3fCDEGLzDujGJrcWaMcwFHERWlFGZKY4pt/EDd0JJ12JMA86pfCfNM2ZWy88ihGetT9Xd3Y0VPot8v1cUzdIxqVlkEs9sOGWDT59SrTNYFtjATuBHns5N6/eWFwx6eZnChh593vBTT1XX+K2a+6teUVz8i32FPyNcyDSe6VqBSSjUtaI0w5KvhKmm6dQoBnSRRrS2y6gy7PUr/w2rVf91Q3C3ZZFroYQSZLFBn7BjFBTqqCSTei2mux1u44g3eNp8WnUfhaF32aHa2rqEPX2BQHXngvqWWGltUqzugiZqlX35DDMgGehcS4JpilCGYYiMrF3rhS3eQkIQ0955TQvjixFaPLOujs8IFUpZxxT5o2jbPOG4ZwLZ1DZtTWZpg7+20dJn3Z+6Xp2nPTNWgCyA6MDaTUrxnm3bGhEfGhSCWIhfM9x2VIULznaUlUnFRBRWpWKI8bVnu5R0+1+xc0iDKPnsrWeMOEXdxhnLVrI4wRTT5HsoD2mebm1NFKUoDNSH3pFlT1HTuw3MbowQoPHfNwJlsVDFH6nC8lpb6/BSNUiDYGpRA97wx4K9ra3r528zuagULHlw63RsgbA8NwUG9+kUiKwu+WAIT/MQQaJc5e1FlDp5d8CQh8XYaV9JSON2h+CBkjTBCTMXk73hvqQN1azd9nZqBtjYNfPLDm9mWvxI0XD8+IykBcKUqGdJWdbVw6vsEDqG1ekSL1ie5CQKXFEy1Qm6vkXgH66SWVlN9KWtrfvZ1tKVtQTG6HiZUga9LWo/bqCFRoSjWPm4o1mMdkKr8O+/lQczoCWYO7GbYeZbTow2PydQAN56D43hQw6LcGQxYIs4zXtudu4S30Kv10Wva2uO/ntTdPuSCUvc36ObXxb86G/KY8syeZBxnrDrvcHhawQv89TaSGGItOwwdTdrNseo4LbyARL+On/BI+D5fH5aBCi/z9DkMdxyNnQ57VpJPnk0Id3cyvt4I01KhtGLg1C/hmC7WUEpblBqWlAjtVqtaKDDuSybcn0EN7NQES5k2pSrERUuPPci1c5Tl6b/J6Vk1ohPlsWQcTHtIhCK46QMZ8ZdPcm3xlWxybc6zwnmL/Kq68vVDQMbm3Kfv/ulTuzn+SfznpTOlFa224/fURmg+/LNus6S8cIj46DX/8h2HTRb/Ig/LTGt/8L4tKV7fXf3gR2+7nn886oHa3/1nl1Hr48twmsvw6jNgXWSdWd3UPPdvuKfH30T1wW+b2+tbKYt+SguZzrl2xS3chzDIMaOruuls3sV+Xl6asbMvqM1r6iimfQbAWjF8mdTQxgv9z1BN4cwcv2s/mx1k/ufpA+uCJ3np6/75UZe/v5ZsHmz7SkUCud1OVct77EKVtAQr60x14ysYYiCIRaxEwpgokUvMt6zd+6suWjFrQUNU8ELSf/DmtJ7rOvCYXb9uoGBk+sbb6LU36Kr8FdypL1dUEDnvYUpx7ZGhxTmFOhjYpbN6PjO3L2mLS3a9M7V2q3NLVvjChKjIwyCL92buvOzQXNNqMGV12SrA/1pxqw4TlJ0YGSIO6Np53lddNqTr0mTcwxKREW9+vrqvpRAkP70Z1BzargmHWLYJrZQn17b19EZteomETP+k/eU/edcSVzMr2J5yqunE57Upe7oNX+vwfLn35ei5ixlUqz6sDzU0FD5aGqw2PTfyziGj1YrVeShs8tjPOKvLaD90KQxzhTbeP3/t3ucWByhVJ/W4NILrl7N1ZayrfeSvXtFolpF+l4oJuuSeLktEdWg6x3N3BbvdXt5gJrpJV+qz222NCPqbvbK+MqYRng6UCq7Ypvh5RReUfqfG86zCruKetig4FNe3rZGXnqjpq75qJy1tISCyBw+zkDCi80TuQ+G8DHXIxLsywejrBXwoXkAw7iRGyH8xPh5ps6AEznntaWER0ACIyZKiBsbZwnbTrIXrSxhXS6lclmWnGNZdlbCBDOBHLDkEBz9F33p0rUIvuaMCheuUEkoCGo0wq5U1b3cIC3G3JSfW9Xb94C6dVVztiT2sOqw5m2gDVcLjK4TMDifotZqGDfzS+KVv09jmrtvVptMslxtsnZ2o7DowjR233VBhr80s14Wuk+adaEgn1ljpVeqqnuZRSNfEm+CGYQk6Y6/3voBune3l3iBxWlzNujPGsUidJHO7grp44gSBNjTAJqDBXdFR4FxS1c/dmcKE0ZgFS672yViEdvMIFo5TaHfwMgVPHNrvVRE90EXl0Oykh0W8wb7xCuRRKLYQeVQkniE+ZK46Wt4po0JIunFTNiGD/WaOQfjutxPQ6assjK5TrwVyV7iLQscCvfu3oMMSFi/1w91RMYvHAY2M1SLiMZs4I5Nu3WDhX2vcA+SPB9TfbWxcWn+vPfnQUJYFBw2jY1PmEyIF+Rttxr57e4JTtuOg7iRE+hrixqIr+/l4rXi23D1lFUjRcOroHFr5D/zjfAZ+f4pdb0N3Uvb7Q7OWDcCsEeCQf7MhtHqlVeKi1HQFzstilPiNNVAKE7BKfoUOkOfwbglHH/81NT0dA+nLc4y34ZmEUlrFs+KqY4nd0W7vmLd2RlzcxQuqNAiENLx+sPZCSNX9+ZYinFIyKPizesSgiDM8sqTlVx/wgoV3fpLJZt0zSsk7NVHdiFL24u7OWRuOzpUxF1OWJG1KXnZAJBUGphT0wwtHpZHiTT9MxlzrQgyVufT3db5dYfjy8q85WUPKTM2NrK3LKX5CwrQCVebbYHKrG7753DYvtwmwWDAOL1NIClMX5+4Z08qqpcRePUqBPa53qeesli8WsJjSk5lvriL7UxK3j3oLtRYy6y3ka8LxDT7hwjCJa3O6eWGmrLSC6Uzpc7S+PEOb8eXHXMdxnVfHUKcsfi8QjYzs08RdXPMr8OGOfj0yFKlkrs/oUv9QPNfyc6/aE50ZMcBahtU7eAxTPOPMifjaXd+a9JzbijfHd+SZmAlqlAqZpWaPkBaKIBGqq7FLxmkpkfmDGS8jXlnHSsmJujqNnZKeCZ2MRYQCa+dmhEsT38wYDlr8nCveNVfogWa7ut9wdRbiuf61nQ7lkv63rfMPLSrY9ehzJysfdxabl9VeRsosXRmc7ZeynS6l9FXVRdU/lBo4w9LXM0HNBzAWEdfPINfPmLVqmn5ZzT5X01wgS+68YZiXWaaeEHAp69cm69Cpe80fUct3UPYKu3D1eu7qjv8FWjhFREka5JnMX167YNnnRPFvMBaa+HDx7avddld9rUPbzv5xF70tRCCW+JDD4sNjdYmwxcS5iLv2zA/4I369nb7w8/88fnnbzwn9x289Y1yV9bNKNVBDkqBEVHQWjj1cORvBN1XKtjK1e3LBKG8aMcyLwcFa8kRKzXjUiUcC6TZaql3MSmsg0vtEd5KF8dr93NrCAtCl4zIB4FQuWZMUxcXpZNlyUKyJtkNEI8neqU7YnqkTnfGJdElBl8UEKNAqesXRaQ/ZpGfTqvUhCN/F+z5iQqP5MbLFjMiuFEZwImNwoIpaNLOAE0rEDUL+aWfN9AKkWVZUUHTCBa4FQrBCkX2QgFRRt35978NVVjJVwjokGpQ4pEMqqC0Vm5CMI3frEzy+ZIUfkXka6LifeC2YtkvVia+DN5VSP+yTGQvsuwxR7Cxb5ETmPgauMYYTDb8ykW40MxyLrXIF30VdsimPu0h1w/dQSm9O7jjdMFTy8MU04qUhLl+6IMaNtkq0VbT6pLgViRA5D9+LvaUZgmJ9EMC8qAQ347ap/BWRGnag4El5LOedRHD9nr8zSi4tt1MCOGfUx1g9sJOtQAKoyUrikd2j6UkS01wnMtdaNjeYN6+uK3RwotsW9wOO2PbLR0mpCax7tCEWJPJxF5qKZLtQFSEewJafZDZ06JX81/BMY5Q3BiMgsYne9fgTMqMw+GTLteMTJ0tLZuB4/TQyUPSStYg4jZvhRaIAE74j4ku4XNQj4D5k4sitRWy6PLhkcLNXrxQfWoFe0D1Qy3j4ok+ZbybSBiJnkDS5qpcg45O97CFBakblZyRRPYm49qjp+uOe51gfqpz7dr5yLFpy4ohau30mP95ZXv7mGnMYe/amhOqL38jDS/q9V2tR3y7zXMGxlaLmlCX6s3XEcfs9eB89VjA+lj4ZpqpJh2HRhjUt6aESVatOHzYww0kpszyxv6PQDXOZ1HeABZ+53W//5QeSnejFpRlpH92B1ZPuE5ppoRT9/uOGdjyAcivGVatDiIIUS0lSrBh8Kefru8z7Ru2tuLhuhoHPCR2648fHxkmwwNLHXTlqeLaCQHiwt+3NapStrUU667rbGVKVrmgPXd/LggSgRgYSsACETwCheUcK+fkImYxiTHre5syljLKY9B9sOj0MSiRFOuHSrXQs/KozOlKLDkfQycWn48N7kdEjIq9UJxIx5wvUeBSRRhWJH+BxMBfh9rj926SJ724tQb1bc1auodATZRdMuCq+Wvvn8bC+9VXyN1VBo+6P3Tz9E5b9rqBDMmXLiWi076GBpPJ5+6PKuB+uhfg/WmeWvnIIyspkKBQXop6oeCFKG+1O2XsY26byvOMEgT4pvmDD+vDcT5t/rL+Q//awWEiXYhEvVho5RzIoflIOquflX6kkeYVsCQwMnZsY07hq+YG/G56qeke04Ixu6Gxca7e+qd+V9Wdg7lVpkI6aZHPc7GGIgFuejStLLa02Bib9mg0HDNlhf5MiV+9okwVWmeeyKzIjBFjMpfFzpx++oLdbXMfl800BfpYGAH5OwbldJJmooM2YtMyiBGpY7mX17VgMrvx1qapHGxmybjXGioBgs1jW9uV6uvC2Yj4TuWSmRC8pWkyJwRN/k/0WW1F4lORAwKP2uT/mk5AMP2GIl1miviFgJ+aufZeFUoIe2nxh9jgxLzMPlTV1V2NXjYQq1ONlWlD6oJ2qEMbA2+obyGboJuyqC1Ut9qW5S26qJG6IUxYxeUz2srVOd3q7hywRafTOZ9pwH6x2ulB1yJ0PijfEaNgQ9IE564WBiGWjsWmpqWilFpfYhB3vnMnINOmcPV0zLQ3t3Kca/MfrxgE6YK3hXxzaWtr6aqa5tbyuJY0bAPkR4hyJmRfQ9JC49z5rZqWZRyiiQzq4eX9pbokU8FRndUXHrY4WNHTpNgfxj79sohhGFJZFhJim6KDlR+3t3st5o2+qE1pW9u2pv3TAqnes3fT/faHxUfsG6GUaEQbmLLcsrJ1kfPYlKAvU2Uot4AfxazQZpdc38tNXCtqtSWvj08Klz+ayWjoFOci5yoXpFZrW9v+fe2tVm7m0ddNvMrzMIFDFipWiaxo4FkFi3gzUZQGUzMR+xGxiMBxmtrdHGnjA54XjKI5/2hgjZaVlnlF6/eG7wWQ8XAcSGCIuGRa88gfSmBThsLLcsQAXh4IyjGd+Ywhz1Xkn/36a69fhoe9pG4vQ0GZ4pJ2eWHI7ULgCxniOETTBjeNVsPl8F3D0jY4F3KtVmtML1jXiIiB1YvDnKYH5vqQdZvN0JeB7517hWYe4PKG4op3NHWqdGLCaCQFJvZGXNJ92llVrOWcl2iKhyH3r7FaYbc9u/IrAjLDa15v4B3XALcvo7eGh+UWZaUQrXfwXQ+GQyLoNpAfD9yG9O53D7OBYZEI/LajtHYMdv4bv/2aGahHFmjGft703kk+uRlm1n85P+LLF56Hyy0PztwV6qz5RXbOokAKy9ycBORmPyyPSyGIlLLciok0wxF4Z3hCUztD4EK7KB1nQDbEhJOGCstf3eDz/VQgzms5PFd+g4AjDaYTgpTpDqll/gr4TpLovOeeioqBuY0boQbeQAP5+a6NfQ+DCWgC+a3Qy8nt2INhNklM26qW892Yn/156T6+4y4ru4QgIBX1fj6FkJgLi5sXYLezp00a/2EWfLDKcKnCIJvheTiXWLhAoW6pcoAFUbeCP5AKujJGMgLdtGiFw/H2ku4hZo+OWkpLtjOWnBTlR23DDyXtu31Opw/KUwND3rmQppw0TsUpG6woiRIbjMi+Is/0sOXm7K8UrOSQSIV2ZSQt2jQBCVHBv+tQwOH9snqI0Vblly1qQVBburp43mh3ECUftgNTQ0Wz6BAMpBJDFIM6cohjSNezG6IrMRYKtx0jJFcdlz98gn7YZHlmTUWCKSF76u4tLUWL3ycsS4r1DaL0wJBu5yGnM4QKEMX9iU2O2w8xEI2wjRBdMqmpeKjxolRFhf+uwFA64jW4ECbITJuICpmPzSGO8PoROjQdVBsWyETBrphHOLLkydJi1sUNY2M9qGH79gZOemACu74zTnjsrgdZZ5kIlCUDvQZyvoo92CPXJ++0I51DsgAwOJkKo9PeWyV/YcdGQxYtKysG+g2KMtL9++s4kBW1eH8bOtvbLFWwbfcqBwW3Ilis9tKUxlRPvGWMkJ4KifQ8WGtFnYNg+W5f7uV/LOFrStUJSmlUfKwmN07JF4tIwCIWpq2IEmaTZbD6LIdMKt/aLpOW/eBuWBdxvkeyf7Q/8ml3kkbszl76krLeZPe5so2JsbSCRwkeD56gE7yQfQ/ZJs/VJ1fbHUqidAqCJXSub5V979nRo336XmcUdNd1swjyGK7LTwqPb4TBNjk/U8vH+3wWBjhvbYKJ72WUtmelRcbL5IyQ9k90rT0xTAr6+L1d/kbDcUWdPv5AAAlCF/07AJJBaC/6aXXWrx9jbA+DJ9L+SrQfIe37haUxpbLXmovTPv+ipxi4p89s3qwkyn1Rc1EBvJmPloxqZJfe02B+S14J+t112gJdxpkMdE0fbOGUdLznvkE2Jmx3BG/sxM740fDzsoFfIQ08XVnpY6zfF96j4LSdcfrdtw6YJkU3SkAyJRkym2mO9upQwgGimUMEwQTs35mfxTjLnN1CC7T+qeId4TCzwGkdQYcs260e0mh9rkPq0wDxyzNzU9KFggWpKJpF/+Lihu6o7m6xof4rNx8c99nS7Dw+hDXAw29XysNKwKAwyeaLGQNEf78lrW4xPo+48KZ/ZHpgaXNfJTZ6xKms+vCq7uGMORkfSrPiBpgWRXKrZKG+ub+mw+uoHKh6Viv8MoaSnpC++uXfBr8jLyBry8iOwL+NYm0XJgGCX7CTR8rdNKGreSrUbnceQiIFQugaoCdoFj3ITbpW02ieVvVdOHXqgpNUmMV6GfFU5S8XyEnz5KT/vnp6VcYl84JnoWLU7nvKsRRYOeIft5LE9eun9/biy2Evb7HC+MPU1JUr+r2OCZeKefrnNGm3V/jzz9PllSbfhcnvCy28WpXfr0LVzpOnxCnzOkU7pN1thD0dn7eKVvebromJ2M+lkwEDuXeXlioHfsk4XmAxP7Qvc6qF7An0lEtOZsJzLx6+v10hCFTn+P3SZ0lRDUqbXIGWLJslUEn8wm+FV9FbYmNQ7oLnRBR0hf6R7Le7yEHS9Wvzj5uCGhqszc3P5W33Qt8eyzrZGfYCG5Sn1N38JTLfuWokIX64aDg+AUIVXW0O9JY0P0i6GcLz/lOnGFJSWWQkNX/wVhk6Bkz1JRVQVhN11hPT3rNXGQJolUSZJB3TzHi9M8kzH/g+zZg06biUDSNcayeJipIeg07/16LHJDqRDAwYS40D5jelk9LQTOdSLpRbdQuA5VyML4ssUtULet2T3X9alXxJeVgfvWtkdTO2s7LgUOoF7fwOxsZWTQKG9Enh2p73RGMaa45VxRQ9G3JQbEQHQ466mT7KtPF2IF+FqUi1ZpNpb2J+WnDrGx1pv194wPgqpP4nk7Tp0Mi3iQvxC7eTe9XBkaD11Hu0wjz1YG1d0GASLx/w/bf+orZLAkKgYDjO2rKQQgn++Xjf6t1XrrWJYiol2rSRl5uhk0kZkxIZ+ZgrcbmJKNzwrrfZsCzVcuxdXUPWvSxVFkPmwjQurbioejb3+4uqjKT6FxdsFCGUjSCK2AQ/sxps9IpFi69wVDMQ0vl0wZqma4LamXuGWD3wHqrURQJkwg4Zc3w154eFxgy4Lpi6d6oDzW+cVoZ4aaYoO18MVwq+/NVjwxANcRfuSlMVeYpUS2ucvZwEPgqbB7PSMIvTPmjnGgq8DY4OzpQf4suGv+FiVyhG2iJdUNIsrVyo/lioUl5RONdG1GGqRFVG7kjaZNoJXgoys7oUFPqmoytAvB9mFRkmKZ51/7UKfRH5dzDFPg8H9yNIQilIYImjLZTJk6L6+ytkZaITheIXeSe2uzYtcdJmb+Iu1t54asD1yoJYpTHPqAwhNEWoY5vwEbFqBxu7/NZmLzYm19EaG6K+qVUFvwAWse5Pf68Ib7WJHy4//B+znekg/4Kz2di0QrctSf2ARr6rFKROUeQEterlFM0nkpQAcazZUHDN7HNGkbSpEG6ZA10CJYCwoihV83ay+wxxjaEskhHOWnko8SMSy+YAeejPMpdPVp+Mbk99GS/ovOrguzF/pOao52VzY6PjM1vSAnmJw9JxaXTIkZ03UXA/MovMIbDjYJp/sdwr/2eCj+zaHcjlus6upi7pTHmiaBsplnjbOG+701uo+YKMINoY5KH7GjSOXX0nworXMT/zkc9agWxpyJZ3mNasC9JTzJcv8w0O2xnLG17w8UHlHSmvvYyVvuOHg3oEZuPpGFvxu33rb6uz5fuiUh5RSLPa9FkWxQpDD5KcK+Y0X4gP8Y2puBkb82l0XOh7RrytSqKQJOQpY6Pjpb7/4zF/jo6t8vAKQhhDDoUFJGCjvPmRteivClpiH4cdWMvQE7TWSjvoRX/UeYcPw22t75wCk+gWzbZjZddCmVJnV1XEECBR0AmG6dp1Y35un4aiWUbCtyOM5nSdN+V1JqsCZz7Wv/3rrHjXY9gKmVYXVSfX2ifMo1uMTXafoumqcjaaM7GG/Jn855S1E0mgO+F8t824IfFW1sddH38cq9fSmhb8vMdiiYk2ir6tVf7UZglxNakw6budc69kzpG7szVud2S9eGRKlx65mv/6AcDCno82WQd4vqKCROx5tVkbD6xgliUFpWDxK/JISWUZnPB118zI7wP+J1VKr3+ydyN9QqkJb2QlaSRFNDJZ7j9p5robdjm2iP9/pr848+PHENAKwbEEJLja215oI0czPI1sHHYZ/GHRtEA2wKY2HEAe5CCX5i5kd6vDh+aSyehjCIndqLwm8XAK985g/kjASqadi7kT2eemYZgu4TwhXC8Ph6NXzCxRF+wAq83h7JrP9Z0okCh6Hzg64B17l3io7wt5RglMk5Fj+msi8db2imy++qbv+YoZaeaAjA8WkaIRYjcwJl/fOSDlobgsTjLiuRvBLCYMYpF7GmUmrMAkGFNBWqa4JGyv19NhJRLdHuRb8aWFSv6+XeO99U3iN7e8GuEz+Cf0LikFzc1vv13aKPH6O7TarOv0d3Y2tYbPeCWN3wIKzTCEscW89ojvpRly1Q/jLfXPFAjPE3f0stEnEtE9q2TenJ4GapZy7UeOokKWNX9jQj1xBBzlbRvsvnxtz4Ye+zs9ajT29TB2m3zseYEVYCYNQXun4IRdG92CsHaKIgOC5x1oZjjmigGUAvQijjNmuNElncr4OjxDdtYvhbm2OjIM/X6K6EWEhSokMyvM7WQaBoYoO3EQ/DNff+M6SH0AR309tCzrbU+45ZeR4VttbYffOTzqdRVzopU2dFKEWwihoIZ8W1jaTfThRvr3TLiwsfGllxoxI53Z0ckrtHzuWzHkteKu7q5CjdM7sEkdI8mRxKib+jcFmEOMVRtx0GSNbS6/VyaFlYnL6iuwqxvqNcsZXjVnVnAzflfhZ3NbxMPZgFx5s+H3ogo2Ibe8Iq9o7dqivLD63PT8lg+Ma6Bk1++/xdQp1NPqWOdQxpAz1hQp6jr/9hvaVTdNdwL7Ufz3hpuLbf4Pmmn6zJ7tg6ZvrEhy3q1taopTkadCxzF7X1m3/vmIvQasdZ8PQ18b2OjbOLA/J0D9iXRGEIgvM+WVndj44DMpH/fgoZaaVaO2gyVGx91+Lah0J3/arngwWbNDKbgwExIifjT5edrJXtmYlKdyO5ClM+3m3dac97O3qu570ONP5BfBsKTANCWmOylVeakkeX2t7m530wYziw3w317b/fxxZh4qaMlsBys+fZwjqZhPVz32PNxyq3Q0M3RJ1zjLgjh1h1l3p6Nw9fzJ7dtOu8UbkurVA9dn1pS2svtbCZaWpQmRNTfTjRAc56TnXbwc7eQEFiTFhFlEy7RrgdvEPA+5a034cC+AYdC+wWH+vxjOcXmu5iQ+awQimnz0AaKAhG7RESep2bH43fWzeqm1GUSmPchDMwyvXFJsOxvOYlbQCSzlyvOUAfr2dqIvsFhe/K/0wd7eqgRTvFH6oHT3bpgyZy3H3lYsrkzmogIcWTg69qIn7NbzZ9E/VHcmdlan6DKOjK71GB6Ladr0lD6sLveeN642X13lviAZ3fye+N7m0fzHGrQ9akovE98Y/U5HsGftqOTCi2mlC7zDgWs/+sjrIrVW7VbtkN+ETEPd+AWdTKuTGeLVidu1J4fOA7tFxmmXZta0UwTaF4Fyzv06ZLpz/oyMa/C/Fymiff5DvmjFw0Pv6HgxFFoVZuTtk4VBRHASZyKhCq8ONiLWpbQ/m4hhCC0ggV4ogxoEc/a4kbs6xdCrbMsmjKfpCpefOykD+G9jLgM7HGbkYw6EETO83r8rM0agu/f20MF/tvWT45zuLj2S9xrMNpEQP4r3iiU/byLzz2tM2bHBkWScvcX+nDmxTbCRiPEQiJ3XdTDyG1EcemFYSMVymbcGxKNLQYlRP3dK80PJMrKYTJxV5JgqkxsDQGtp/BIKTIEShFHGqLKp883Fk7qcLD7johIlS9CE6x8gQUfK160rX6H1QxThxx2MUmHe3dX6BBkQMshjc1eDM29wghQVT1gqngbpYVR0vxNiED/rEPyiPtWkBdEJWnX+1tUkl4+NdPhX+4uG2hXkUYwgCkDcxX6iHrmy5/lw0h8OMx6pWN3WeD4D41PSyXlvj6oi4cafsD2pG6pr3ciNqKswlUdl6Sjn/8r+X45/DNVPXd2GEJAGN1IchC1XMwzs3r34ABlXtwjEili0iy/I3BX2kEUSZLtli6BsRrKtV9lJxS+9ZPNHxPpBs88zYcLqigphbpXuEPPJANlJ3VhptfrduUpJY0FRY8NgY+NgQ2MRVXCNwJ586czVL/gLwZeSq1FN4UFj/fcjMSvCqWpl6WEelYWoprrvUmA8ecLzB+N+kC/74a7/a0pT/ftnWWr5LDIp4vvh+jL9J9B6OefHsh8PxllOALfH01f8mvqhKSN8n10Mmi/482HIj6tQNHo7ck8caStFGIaR4cXS6U5z7WcjjUHysjWdHZ2de/YAGTpGthn8zOI+NOgYWDF3cISK2Uy7v6s4G8QiK0+41a73+/W9Q96gS0EfTK/dNXWFrM0zth6KmwCLN9yx2EPP4JBxNqyLwbtSceCp0P+Iqbra6xfvbJr+zwzLdr6xYUpALwOOu2rFp3XgjpOEJVgQBExYqJi4ru9DvoFosGjcoWeelP1pvCjPraLdTqaUoK9/huYWlM9MI6RAvUL6DCUYeFqkVUygaNLKGFznDSqBklQXM575lL1maH3RpfHxP+bx07nGiH9VyiJkLO59oHIWL6LntIvyZ59leNZcgMxm/tyzrHx5mFRXFReOPnIaqNllKHi3b36bJXNkKmr6znu5Ggx0x0TDSV2zG7ndx8Ru6S03es9oYukV5S37Z7xzb6e8PVd0Gn+MuZYQB5zAwTAgU2huYpdc3xTLzkGn2cxlb3gmmShZ/Bk8nuJOMXIOs3hKoITLdkrAF47QXPwgM2iwYYJF26KCBpUP4eKtBfQb+JuENGT7TWguQ6uWHxMM67auGwjuRx4zOlb+kFqhfkh/OWBZ/ll9IPZoWxjTB9ie5bATiwbv4zQbJz8903NPk3vWnxzl7bti2+ytq594ow0PMTce3s1nbpZnuOWgD0YPNBg3rRDFZXRvCop8dlS7vjWxCvMOscWOtYg6mZxfrFtEHgQ+Ki7jrByHPrq3LLIJMzeolDmLOUpJV43PhopaB4KJgbepiQ03/7ebYd47fHjBncB4Saj2eoKJ3mw+deVhlq6m9U7zpHxU+ARmR0F+/yGDnGHoWTRLgwe3k7g7Zq8LNiDuX1062S8Ex3th73g/4bh9TK5WzeliTeaOPjAwFh6kkjC6OeNXGMkckwkQzWPt2cmfF+7/gQqliiaCy1zLGsvYBCNTpvsCtyEtSBxB1Xz7ffIG5kvtY19kwnlJJieCGq5sRISMzc7Zz6CuLLBnJsQP6hLkzzhxE5E5Y/WNGnEfWLbM2972ubeNernznmTm+eJEXbA36YgXAkizo6O1MurUL15TQrzJCD2oUrO2rcuP+X4ed/lrbaGurpzVu5nbN4ir3vpk/W08gRCawIZTmY1WUA5h1CiGeZIHdzGGuf9+yKkgjpHAhUpEEOCIGTwkf9nNMF0TYMxS7G91eD+/aQzYm1eozdxicvcfqO3ZhsBIzVJyOU3R2N2SAkRykzS+WUN7aHBko2xQalQKIOv30w4e4U+pLRPu8SVU2Dg2QqZR7CTMGsETJGpXAolYWagAjrCEzN/xe8ayy/ULLChdbjf0Zg9z/0QgkGQ3+Stse2EhoGk5hx+UFJHYQVNPRulRHTc76AkIuz/173aphkK5bKfl+WidTxe9D87PpEWgatOEuGePaKzwPpXXMN0K077GGefHhfJ079ashnveUnuDhwrl7X9q5EPGpnUDYj6HyGUjspufIxyjZczNoN58h1eidIStRv84Oc6ABcyhJWNa3KsCIO4ATNVukwJs43E+GCBYrbc5TkL+X0FlfHPXLqo11tTcyjQx+tVNTauLGlVD34200IPz8ZGgQmwqTk2K4uSUqaHN12ZXOh6CHBipN37iMcI3aJImx/03GkXn3KOPQDdrTkhRcsRPkwP+tAZOWxKQUH0zfhrP28bsEYMx9efw1nJS7JNH1kbZwhV5cgopSkI9Q6cjYLREohYGVeputTS7J7KZTAihzk6A6CE6iBistO2yGugcgyiwAl1ovjjNx02KfarYrT/mWuNePlLk2p7wznu6ks5LG8sn8ATsvL798jv71E3U9oRYW07Lj6esca0njhwf25HwzujXY20MuOqRL8sk+RMasSRrGAQ6haboa5jQ7dIYGeonQ2o1PtI5dseQQFADZ+r6570R3+Ovw0MPebdvH/O6H8ceLGMaqj2ZhRUVG/7cdktwRMT+VrKfHNVqM5Abb8av/3n4WJlRFOgoijRnGqo3lyVmnEKBxrZ705I0xvi0IANf6SRcZ5Y+A6cfT8cpmcI+pXQ07TFpSQehsyxZaW8kZ8xr9Rn/xem3all9Qc1AT6Wyt7BFKT2RNiZdNTIzJcRFlzye2q9dcgc5SFTueSUio05TFEqn2e9dplH+vrEg21TRZ6rIDsFpRk3NE+k5Se+9ODyiGQ8IpcG8f7/G7o4NesdbQvlm+5ndY4O/vX8+GW9bBp67tmxduSMwyG1XVZn/ULUeyruN7J5JSwZ/T9nePpOZOTMWC2mlrj1wY6XcXRz9VGZ8Lpu76b+K+Fzq/9epM5JKZ4lQ8wtgRGgVn+OftqxyTaFpTWVZg4uRjchsyCZAqco56EQYOwwrwxbKXPyEjVWbzla0kJ07PLIpQ76MnU/XZtQyxzKsMDIFCSAf1qRHa0w5urQgP9dZQPJr66ca07JdIuiEup6PU3ReXUpCmi5tO6UkSirI5nbM42sDoETFW4V5aFVMDTHnQUOIs0knpZ/Dq0I2dmw/hBw8oZ/2BXI30U0tIxpGlQo0uxpK6NMrdyCGrs8jBLrql+qqbXTQnLRNDYHLXm+rrvqlrCEoLS1ozut7ouvI5joSXQaA4pflgX77+WsngmrTbfWBRq9d508s/Mbv38Hr9MBa0SOBJ/KIJQzPK5iqAFGNCQr6GeoXLBBkQz8jDkJAU4sXcZF2KAQFX0UOwkDS3bYBF967bFaw5my6wpcPKSTfz/DiLnsJCe6Tb0mazn5jxh8n6/B6QgIABrgiaV/Xvpb8t0pqcgmjKb7IxDlQlRBfaRy/JCa8LZ3L/yDlzeUPG9LJ0xu7m4P5RH5IcHzadPLqAMXWoCksNXepnM6QESwMqCPRS+Qmt9fAvGfQMm2eVD2Y9+ifzwAXWZpjA01oAh924MqGqZTRlJGU3SmwMayhnd6kV+9zpfy7zZ//SeYn56chKGFyNIpulHcc5pREOe/S+XgaYezoaMvF4Em08qGob7xo6/erJya6w6U1u2Uf+bsE8Prl+5T5Fktuztz996sbOR2iUddyhcRc4wcaoRkiARRB1aCWC/dRy7HUppDg+O49fIyfkK4QTJuWUNFqXufDCoFEbTGPvoiQYqJrdAsdhdy87hHnzF7Y3umJvCfyP89bkIprcMPwyOmR4SdHBurV5e6KBh6HPs+EdjlsUwvl2MDMWFuYnJT8+GOx58XpgH4aJSQm/2549WJN2NUIKV8a0Y+9Pmidx4ezb4Ngq/M3kEZzaU/VSgsuW65NcpVYVvZUlSZa4lvIhvzkKnx3Hx5PiNCqxvvuVmEolKHgAeRtzUZVXFzchnjt1ysrK/PKyqgyx5HguVN/C4ge/fMnO7PGswL0k1MNMn9C/Mb4hI3xcbD931rd9TYv68d3xmYbnI9Dji6Yi62mPV8dcrlUrauB99BmMW9M++8X595GX+5QxH95qqX1cy+rZ906EQR1vrZbuqJ/OgmR8hujVBdKZ1TpXakXyy3+OOVSJFacCkRWbDdOY6f2wIEMlwG792n7ll+6JO7ZM8swnAhlbPb4xYWL3jkW1Ak+8H7wQfM575/ZEfXZEeOxYkJdIJqCXx+flrJO/mHd8DIKlw8pRSvntVgWf6Jx3i265+cXG3+msb29Gn3ttXb7VP86969/tbd9OTISye7EqwsQrkypFrfxWvVh6zVz7R09i9ZqX+aVUw+zanQmQFIUbOdns0WfsKex2R8ddU8nbIt5zJ5cF212hVEMbDINv2IrGTCNfpjwMcBSNqDACHuA4oxsJNjuU1AGA3buWVS87cvoARPSd+8krLi4aTGp3OBNvXwgTs+WZH9akEDHyFsb01uThw5FxrnLvnI/1imXIS/6Es2h9UuFZb/NoZOs2KT971kCPu3HIWKaJPOJRi791GKf7lvuW93Cn63r2ziirzGdu9O3oCvlSnV0gXCR7fBevHhr5qJXc2Eka+Mj6//hyzJbvr39j3Ww5cqfnDfjT8kjG7Nj3otuf2uxrPGvu7Wk8q9wXR6v3c6tW+xfhCeYPNx8MjT+cnUJu7oud5kSWocCq8nh5IVkjWZl4Jq45AIyqD65tU4yKVnDcQWuzH+tJEoFxrMOm+304woFs1ed6IFE1zq+gBeTRl2rzq/9MgMFccskrGREpmMlu+UrxZl6OfZtFrFFCYyq7VXpR4vsIo8wi+HCyK+6M8XnSXI94R3SKLgbU7V0zszxrc7VcJwdBhGFQ2+DJmIhwWPWENI9jWKnyJQT14v9QPr6RJ9cu1wS3kX46kL3Tv555rnOztqYZGlyzLsj85va2pZtu8FHBCmMGD9/PZhaVP01rvtJgkXpJYiwWZITjcwYY33BBGe11Kw7XJtCh/pnWCfACYtZW2qtdkeSRrQ12T48joa+C9ggZABBSCwPX/hEm1DFabhQdgK0FbY++kv8Gp6AUWBoijDiiO1ubKThAcsUwVRFGkFy5NDA2Dp/DOouTob1y+VSqr9kLz68gi3FoeUytbpb7mcXKzilptVQFtSWybkAH1oY8OMrZGt2TZ9QDznUawkLsszlWCpSuze/zVC9SwpaTVPdZ83wbjzLGMEPWhtW/vfd2QUFtVeP9vDKbUUsAlqBB6TGNx55s7lfyiBlVHkUpmi15cedFM3WDv1XcN5oR7rw8p/7GLLQPdIRNT69MG5WLXr1pBCK8Asixr4RbHmmvo5Xq3+YClFo96KXQy2CVfFdlTxuOjrlO39S39mCpyDU7oBidbv6a3QtmJmCawlmfT2RynLHnPqYGGPsCHG1XrU3GA3btWir85lQ16JQqykTd5GOgrTjdWnEn3A/letn59CRR6mRAcQs2+x9FTaqvqQR3T2Cxk/RoOp9BTRU7pEekjcr0ZE/ckVCq4+guQkF90/ZPYq7/xT0oFY9b0IU+u9kV8b3ow1DaoW2vtFPyeE6/3tI+v0Fn/nUwi+3gabWtdZduAKOWWCktUDBVBGr/VvDx4GCB3rfVKDyrPjPRnDfvk3OfmCFffSb09yP/CeuYrRjir6GXG85rKegeHxXMSmvHIMaDf9DJ+79cnevpu80W34O+IiicwSjXYabmmXpzYOwhVNxmYZccNmojHt4o5Gf+Uy6kMjBgpdeM8MVy+8Vc6W9xx9EFbnTfL7BoZ+gNLPFO0wtxxDIuDNyjOO7lmOJvdq3Q82CVQldt/1kr7q/ARdZdgoFV3ftbMgbt8OhU0E9mcp8tw12dZI2LJ2D7b/b3hdV0DDPkZzu961xM4K7KB8H2x1YiJKxPPgC7cvjslipYS9OO7ZejSBoB41FTDucoSBcR9x+QZ8QEDjMpYM8IaSVSfwhRgm3AbvBzCdLkGjHDnxZP5UHx+8hZ0CGEIChC4WSNDpFnp9wUohb+yRmGWMzGqVXmNC+6WHMSwQRcnYqHM85KMp2gGjD80VR1rZbOs4hGEEJe78859AtKjCk1dP/9z45Mfn+n2BVrfB+GNpy7N2xsT8WVag/n5LGepZGREFBdxpp+YAfMWJJ6s5HCFhgCYnodyy6gTW2Vk5BpyTUkw3WeBEfng0rGIKZ/0Afsa1r9DWkKl/slQrO3jxbE/DNjNIaqBVDFJralCvB09w0JlyfnKLZTQCmmFXJS6doaIrvXXDIFCHZnqHW6uNl4TKmXUAQoKbPyLKm4AwuTTv2rOvXetPLznSyqEBFK2hw7lzpWqiKmhqLknS3dCrVnEqzlnPkqO77ovBCg60h3k3CF10zDyN9umGK+QfzHznxHYPlv37yye//ojo6Xfiu8fER/+/lFX29Mzoxz6NEGrIbXouJxfi/R25J23BbQM+ebmKfR3QMEdhi9MYbk+ffUCYsHRDO/fsz23rbp4kWcJMO+x7xSttRu/Rry+zNwAu/4QlhAvML6Oavjh383k5m776Wzn18OwRpv5xMUiXwJHA4tCqCMN8AXxRuU2PHGsbHDVu3QrUqkcIQxyKpLLdlCadOveHVpbkFyymEk8S2xfuZT8cNNTUPXw5hlnK1aPr6PTgcXr5kaQGJLGf9XDGcRCGp8pZK8CXGEGQLGfBXG4gHgdvUdvVJw4YNjw0/+eSU1o8wgjciJ3A7SLvQvlnkSEcPYyXtNiRXTKyOiLPTSvMOP344D0lXRsTZAwEhBO30MO9/PAQzPbw4OKYF2vBUIjbaNPa587p7MP9TFCqmu3S9W5x5OSSbJl7OmPE+10G8yEPVUsFhA8VBwBgTjw05BSem3U6CIIhlFhZExdt5ZZxVnAKozpyTXjLmK3hdPPKAd/OWGe8im/BIcISc2Flx8ZFx2k7Xn+b6wOfo841gNUaY0VLKBsWuPjiyHU3PX0ZBBvARKWtMDJ/hQty4WVUBdTaN+j+1ao/hSPUH41M9TwXtk59u/Dv4ly/1pshSm89TmOI6zm/KYQpDmajVar9aISWFVfPMU3y1jDivynR+MBIZNiq2Dg/q5JKN8W43IvbqSvgu73h42eN4gwEsrP4yxTueDd3JONCwsrGhtFPC/JxqfHT1M2HvmfsdHh3dZBTcRR599GoHyS8fTR9P15c3r0tuSOs8kn44vaA8/p7u99f/eX13gAUUaDhU25AAkx/rvCCmz9sC3PIf5gN9iz8Q0ERpdu40lhbjZ13KMI+73pxhmHkcy6o4OX8grytT43+Fm2rfbg/w92UWBMSxn6fT2Unfjaz/3vGuHvXmO29l/MU3VvJaxoSj7gETjxtU6htlph1rs8H4kz5Kkz6QrsnVULcUGr9oE0/YbnLyqzRtQ7bZrBgYXrBaS48tO8eq78FdQoTYgkc2cTwz+7tq95HvKGrsbddsnDFOqOZffKDcgg4UYDmkLhVffzn+JCwted9r30pZepNMLX4O8+cG/p2Z2ff4s9khmpUipTezppWqGS7Zl2JG9VV+a1LLMq3d0s9j17S1AbbiIq1ID92bhCjeb7AeDt/8eocjsu26TVGfesR3ajbU1XnduYYdnj4y7v1zkddq9W7aODY87G1rE/+xhvHqmcFTa994o6trMN9FhDXK58Xq6lXlkTVtkSjmDw09+MBIR79oyzwCcsbN9zE62qqF3ncloL1APaNQkyGUezsWOEYYlf4vzMrtrAcYYzoc87MDshoINO8BNKYFyFU5r9ElZ1Y7aiyslnqCWE2FpKjeQl/zRWnW0y4DVrun5d0B1/zde/6hoZrQcw/tain9i7qV6v5v7q1gwROuUTZ3dmT32ZnTT7qjKpTFb12OyYi5/FYxQcualOVR6/bkZpj6equyBjIGsrRREN30oyh6grY6aLxGWHr+wJEhDw1hheOz5fnlt9Cy8hHvxj0KaXnZyK271I4d69bd0gvtSPT2M6yXDQiNaQI+j+SlSym7n8IlMZ6DBps2jXDczPImrU3u1stbMrmRfWuTti8WqUdk52lGMmoZk3CnJMmHPemPArdto/jsDGBWx7cmNw7b4tVQ9DkaGgjamQn8bhwh6GOZvzFgHyb8QPTWT6HG1YZRyD+BDK1qZV8ICjpmeyB6OOqlCnB2jn/UYCNzul9fgzp0CQrEcx+Ge5+7vcGc35KwyV5cpeLB/nxTJd1/pGgD3WJ+NE7lVIWVXl/zhxy1rP5qVVzZKaRYc+zTzMyz9EGhiyObcIjM9+V1aRtqk7xee9Nmc7Ai7/oiQHKJzYnS4E71y7a5+ceAdkyq14Pk9LiUkclhcqVBHR5ocrvojmxUdmew4k4PPT2PXZJdQIZmaYOLJjThaJpe5OkJ2kCOX9bgA4tZys3z2OP0IL+b9hvEaVE/OATdK7xz3h0CopHLJbJiM///A6aS9aaSUPcB7xwErxAE4jk/p/QXZXHUdesj3d/bnMRp+wrOtW2hIJf6lm6JScbbpa2te9va1uTXl1ybKnO4kAs5Cq5U+n/7jUC0CspukRxIkea1VQv9wohAMMiZCabtJiznZplrUcxKvR7LtHnmIcYO/WM8gVkXxFlg1j09lARnbGiUUx1V+BSBrjXUGDoaoqCtxcpdmU10g0oqnC4tZ1XEICoLM/uDlAzzg9ilmv2B1W/dD45NZoAobEPPJxk1MGpChfgxNKbJvEmhMT/YaFjdIr+xiqJW3ZB/lEZjfC4eABaWJ/Ly4+Na8uMS86MSlqsEZB6xhmP2Yani6p7QUXrYR3qyODTOPvu+0I80Jsynx4VCru0A8oIWtmBN5vjOGmKKXZud1Oyk1mXuiBCxEmYDIb6JmcW7JpSH9oATxyxWUUY5eDnrZEVxw4IKKl3ojMFwk3yTDif0Nd3mf2C43zXHzNfuNJsaKnf0t+SsLT+8z+eF2owyr1Iti598O+WVSV0KnnxVpn6qrLykWtqaGwTDDKPAm4z/4UxQ/anyrLpAU1KQ0th6rLDf3VWHSPKOVdmbJWlIJ15O32yks/oaJMhUnDOOwwG8KbGdjmb86z5rtXX75THbuhXbumM2LLyyA4x+/1Z75jYO+9LxAM4zg0LCqL/W25Q/76XiQoyx7k1a7/Uvro19X4MnpIsfbROF8d5UTy9Pjx5kpx/lawvdPH5lVFjlv2ur9ALkGT8wrJySl28T9W6h3HNmqp+RsrMvZXs/LbbLn2qEe3vk0S2VWZUtMTLo0WN9l7eF8avMS8fdKq7PwzqvbqWyP7NheF4Ag5alEohWKXeJJmbr0hQiSZg2MjKsMaVf99omA74sn/98/8CAH14irJHbL43OfFxCIfuimyC6W/Etg5+5/wCMPZXY/uyzXtfwua9ZGjkRzXIuZ4gBALrPsPovvOQZIYRcjE2w2aC0lLM5hQ2i7KK/9aYwWSu301dlDwdWeVktzeY4z+sOFhvUuFtHAnkndtp6M/2uxLBHb5tCjhrG78jmL4e6cKNmN9PCJ05mR/nf/C78nCLMX3Plw6z3oquakLrenwvX6U0ZX/989cnLnsuqZwdn6Y4zjDZ3CtR80h/RLFZkajcDG1aV0Tl4/zt95Sz2YLa87537BzszFGcqGtYIqbCUDxrN7f5VCr+CVRAtxVKIIRBcMYDPp8v+FpUrHZcGnrU8Gxguam7U336MaFlEl53/Bt6IOtc3tSkDX+VZXtVsLJs5OpxSPpez0Tz8RVN5nuUrtrzr3y6i/VmTzdl9XfnIOzpTBrbqDB1XcJauvuDtaL9lfofIyEXo584qdY5iMCS6velfr/L/pcCIQvj+ooVm2S9Tx/1+we/P8kUHkCB8b+kd9SXVb3Xg79y5Uz09M3lrZmTE655iww9PPx3ZlraxLfJ76MAv49AZSmKsPxMU+Sw71+3rsrl9rm8IXSC9utnFQVtn6GbZti8xnPZ9Qjlhe6Fdh1bZlqE09mJ1zlb5wYCUsGqTP/giQovZmzFJNTEd4Umg4geLR6NwBNbQTvprgyxrVUyGOWE5kutStYRZQl7UfgMFcFjwAyr9kOadHg12dgz0T95m8VQutTSq+CWVV5X/137EVi/1JuZFzlVHWLEOcisfHM6tgj7P0PTSDGEtz9dqNi0p+DaQ/rC6edJ//T0cUIMj+w3HvJM701YZjf2zgNzDpwxLCNCcJ4lrw9bxSa2el4knfRtuv7fFc3ts1aE1YWc/S583BBBgDTV6aRB62Op+4C9MUSJKZIr+8oDbeng8V66l36tndLDCNEh7R+Ytt1p/z7Ihg0ia9cinh5Ycg41dzyGQol6wHP+g8ylkZxv6YOexb22pqwnKSk9MWwvK0gytW3Q0UmeT432xx/jTW5vvrX1s9Kcv3y/hjP9WyUOZHPT3Dd2tpCnJA4H6LXPdUtm8TPLcFxNSJszdPSwMbQlX/wOc3l9jCS2dHqPj45aq0ePvpf420N5+q6N94ExzaSBdjaDBp8d80OGln7IIlMXTeYh7rPB+t2S7WPlZvLr+/h+Nhq3GXwo2v7k0NGFtJaEY8mGC9uODCTEfw6GT4fx06d98sjkBb30hu6PdW1e7NUCFAKPTJtOcNHKVouXf63LSNjUthTkwBMsgWhk0qNgZ4AYLSJCcV4Or1z8Q1Ru9Z0NCjTNKpq9FvfTJQExrs6HUprvSIvlePMj1BDIO+4oVQZLT0GlAxPKKisGuzSuzd0hP5j0JDh3ozBnkQGS4LZm2o1mERBTB83b+hQBcEASEDYytbrA7wsfE01ldnFWfxZZO86MC8gtKORsYlK9Euls65X6fh0qWJiPEbZtv/8pLlsWNRqQ7qZbDj5VIzz3zg4+QPx+dc19PRcUWgx+Vr1t3qLi8pL1+r7MGSCIaALroXunmhb+snlakM3NSiFn+aWI3aUKcmBAPcESRnGAfFiDEzx2BlkTNRcn9s+z54y8FTVGDPJTRS+lZytdDlwcr4dJLYw2GlJGaZswyljCjkrXbO7GKCD8ymdEq3Pi3Fw58tmqWQtTsvD3x6BcHxjkPq5aTqALnwUuF96ebKTnz6j5d8lqMD9I5S8TckZV1uqXOZIq6vrdIFEUIhq2ZbVfAndBzIsShN2FqV9GAhrbRPVC2smzxnys+jyAWb1O9ZNnaIFb9CG3f/QrIXOhsjiy2+25uXf5KTcgTi7jSx8JXqmYEkODwsn1kyZQNDFCXAucfZ6jqr5d0mFs6nt7AbDoWoz0vlbya+rVnrKw6nGq5InyFXpiwI7s6E2XkNRheXfkxTcfTWnpzz6/UywLjxk7IBg6CXehAtoTPqc//tACcAGaVo878dMoFon17935ruwE7TibrYyf7bw90GbJ8/WMDd9nQB3niJtw9jvxitRPutpYBI1nFHcc/e+6zv65s2aS1v7qF91Wyh1lbXgVDocJQ4LcdnheUX/b++v8tPLhdx6gG1YMqzDaHqp89sP79/pL+4tg77um/uNLrLv87pqn60vHcuoxrb/i+X/hf4jdRXZkitm/D8Ud2jT6mqvp3XOJ06XRi7HIdr76ZXYPqEYWM7Dj+2rmPLpzLOzf1z3OvHW+9eC3j2o6fEyrORkrOJlT8DGf52sg65E2qidqGHNAILzPUsceVssHYYyHKX4dkyqcxmzYfXx7EiPG1tCmrY6orI/jZmz9bIyEZfu/NwinAeMIS0Z/8X3vR10nL0ddP5OZheILakmhKeAlL+/ZsXcgk7S+W0fH/n+LIjFNU+D7MZyKcVh+/HLFeaD0eEoLTaIKHatBNr30z6iOVRc5lgkb0hLIqNan/qFQSwkFjPbGj8z8aT9YEWMMgs1S99PzJvQGD1DjFT/Hko/tLNF/Ld7LB1Z2jFJSF2ZqEf45J3JRbcuSfeGJJN8xN/+A3wc2hV7WEAqW5HJminvmx8hUKU2ewAjO9usL8yTKMXJxiYUkIDqa4bjTwqsoCaYgu7lG0/UMTgD9XJAkeISmcNkD33dHS8Ij5K/MuJM+7E/EvfhDMCBXwUZggazRxZWIn9tMCbftx2AukgR2ewHNJE0km6r6oQJwsPY4OKhSK2u73VXP6+QJGzqne138n6RTeb97JmrRfKhPTDO8UnP8Vh4j67WtM48GweDuvTFNXaHdsLPInkRMTveXPYSA+imLWJogtHWWyZrHigOUNtxeAOPpXqi8eXlm/5QvHF5sYzLuI8PTFIQDC8BOEIfZmXvvovH0egvcnaKBUVamrb11/OFVMPbysWEQ7rVqmJIZS1tsoG+L0JZXzqrIEyM4ZUGyUDkiXqOJLAgLY4Ty1IlotI0kjobQydGDn0YGYgasDMwm5rak2W//IiH2mi+zciGLkXtqqdblgSU9xQHNdKEKV0HYtHq3B08U9UcqFj5l8E66XDTOyOQgadjTq3ZuKCY75Y206aMxHARbVRM0Y/BmpUzZkk7skEadEr0RIAnm8u96V/b+CEtsuEW1oGdDzXfe7HdwijTiHeztVP0fX0/BIvLcgNvrb3hJFzf9qlvR+Gx2bcu8Wt/Fr430V98FN6q0b34bOnYBJNiYVDQ7tLJpaFYjSpuklgb0uQ6o1OWEsQfHEifPnTzyhSDiRoMlwsYssXPnAG6uLzn8o9N27zpiVXfXm0lT9iOBLcTEX5u6VUwcl/8NazCW0yeYyn6fMhQsc5tSu0thgjKj0VHeNdJ+LLwzRydJkYrOY166mES0dA2LEou4QOkan4bPWflDVi1z5FeFq7r+nWISI/tz0iQ2xsdLWc2aeVEm8YoHolSwLFERchSFo1G40Xu/pxbi351bE7d6uW709G3t6r3tPGA9W2wih0m/0BEYahlnC1o2z3JhqeKjWQS3Pc4VrToZmDM8abc3oP7G7vGK9WygngDd+6/n/HSIlk3Ifo2lN0lmI/DeojHufDx28tJNukh5Uzf9cmAPTpsHFE7vqVAelc77XfAEBnp4bguSkss3nfWPjt8AAYhHGqtIALVFV+NdRWCxJkEhExLtYykEolEPEAeX2sDGlHzs31tW5hteXZwpjnSrMXsyj89S1A/XFHwbkQO2mEPw3967j5TLN+ujK9etLV1dtX/y6Mn1aNEzVJr1yeXfc8a5/fDXOctRQ+BW3We+IHFU/xWCA27XmizLnAiXGw0kqURVvL8osOhSvuqDS9evWZWNz0cqYWoecQdjICVvevj533Xtr7hY2WSyvv87vXJcq+nGwRn/hy97++LxEao7h3Dhp7P9SseA6uAvOGq6cE7meaiwxG6XrVhjzzcksdBwQkxG36hJp8MWbK6RKsfJz70Hxx98knqAl8qsIUqxgsJe8ukZgQTYEJovm5TaoksW34S3BAUdlqpOQwmC0Kc7lGBPWbXnWaKz06/XavJGx0RZ1k+jPk6+gpCt6y3MR4QdzYkAtHKJYtY5a/hzZHR6xHCoaW2pMaARn9/kH6V4qK19KC/sfK4N/wOiLMHhmTkQiwEafQd+RMFU0maCWMhKpVZKU+Hq8Rh0nPywtbvLWpOjUupQl+gLJgFSdmPa2mlY3YFXj81McJ9odbtoByVmqZxOS1fHNk5LK6F5bcPPjJeeoc1IC+DElUSdMJozr3wUE6ayBTrue9GjexL/+NZGG18+Ul8cMGLeVLYHRwMisv9+iXL7Crcrw8ULBpM6ePUdxoVvP0QZOgTB17dqFsfGumxj/RBhnozCAEeLoPEJmqSDI/6c1utnU/zsZeU4tGXuRF8z7v0+6jY+OZ1TK3df43JgNoxZsEfEPniIsmy3vD1QZSPNF3SkD8QV37w9+7iZM9s/RkqHXipNqFUf3CuD8LJcS29+Lt0zeePSRraj35X5qE9t8X53NgL9fOjWdfb51jqb4Ultvm/CVyBz0N5G1qBeyZiAr+rn/PMPj2NIt6hwGA/z1zR47sPG3f6Wb1XD1bDZMHTJIo8zqxLs6R7on+k/NSP06Yh6g0EgIoEHTxOl9GzY2tOBUGSZYzhlUtFApM0JIqgrRmY3DJh/hHFXyYanSFDELi4HoBiuiUBmh0RlvA4AYiWxVWC05xAYRG7nN3/m77Rx4hMo7aFkQQQsAhCBYqqSYjLZEAlADm2mYxfNrCiypEEERO8C6Sbo9T4Fx6P2iQ2zKSGQiuRQgtZOsIOAm8wAKmkZ+tgJSzAYA4MjBSK2OjLJUMMTbOsQRUswEaoMIEdvaTiUoLLgdNyKMo/W2rXyUhS1mJKWy6C8O9FoHAN5gDIGXEyQ7EjidJxYB4GyVxsD8gaGJAQwm5GTBeBEbtugZxoLo0FjZNDmShWOEEg0WFXqjn1e/gNoU7cABkstPHHWUlURbCqKEefwXJyuwI1mEbqlKfMJwK1ODzmqMY1sA7SrVsI5BciSp1chnoCsVEaw2rQ3KYDsCYwVYfOY0KrB3Rf6gJN1yqyKukFJX0k+DGROfQUkRDmZDJlaODKuRhXQVAeOHE27m5KYXM783YrYZAzgQg77EVRBdwORMI2s8n9Ngs+rf/HJERitIoIjQbu25veBnBiFkHdyZArblelyhMN6KHlhUQCCKJDkbMK6iHfhFImCUqtjZEzWCscGOre/3DmoU9TAMWuFd0YaxBXwLZ0EJ/YJf2x/JBJHOhRTlZBYh6gCgl7gCB1TpnCW/HRA3KIdjPyY/sXEVmjWWQ/WxXjqhstoRyTlAP+NRbITYqT70s5TsCpiFgqrg4o6lWlSdr1TTSEGguKDFE/Yzi36jWZbOqAbSGFqESswC+sG1LLwkVlByK9RiHIwe8AM+wJ/EjvlFUrPilHODINLEwE/hbD1df7SGF/2UvHSSblgADQIMrQjZ1g3WIOQV6aQxWs5vlKqrArnDPvaKXXoo/HHLtpNivlFSEP91tKzRQaItBYVw3ejz0RC+7o+GsSz+aIIQR6qJ5Y8m0fDlNxQysV+422a7PXay2miTQWp5cuRaRa3KNttstFk/HbUaW/XKolZms83UmmvIrovaHwP9dhp2te9osM4GgzfbagM4u0avbbY6bNGNhhp1gxFTIoOHunORfhZq1tioVuQZBRUH9DLl34i7vRoLVHcNAKjqSrKyNVfilG61MhkZS33/1/nnygMAAA==",
"headers": [
[
"content-type",
"application/octet-stream"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/styles.css": {
"data": "Lm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6MjRweH0ubWF0LWgxLC5tYXQtaGVhZGxpbmUsLm1hdC10eXBvZ3JhcGh5IGgxe2ZvbnQ6NDAwIDI0cHgvMzJweCBHb29nbGUgU2FucywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMTZweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMnB4O21hcmdpbjowIDAgMTZweH0ubWF0LWgzLC5tYXQtc3ViaGVhZGluZy0yLC5tYXQtdHlwb2dyYXBoeSBoM3tmb250OjUwMCAxNnB4LzI0cHggR29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjFweDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNCwubWF0LXN1YmhlYWRpbmctMSwubWF0LXR5cG9ncmFwaHkgaDR7Zm9udDo1MDAgMTRweC8yMHB4IEdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4yNXB4O21hcmdpbjowIDAgMTZweH0ubWF0LWg1LC5tYXQtdHlwb2dyYXBoeSBoNXtmb250OjQwMCBjYWxjKDE2cHggKiAwLjgzKS8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNiwubWF0LXR5cG9ncmFwaHkgaDZ7Zm9udDo0MDAgY2FsYygxNnB4ICogMC42NykvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmcsLm1hdC1ib2R5LTJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMnB4fS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTZweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMXB4fS5tYXQtYm9keSBwLC5tYXQtYm9keS0xIHAsLm1hdC10eXBvZ3JhcGh5IHB7bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGwsLm1hdC1jYXB0aW9ue2ZvbnQ6NDAwIDEycHgvMTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjNweH0ubWF0LWRpc3BsYXktNCwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTR7Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA0NHB4LzUycHggR29vZ2xlIFNhbnMgRGlzcGxheSwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktMntmb250OjQwMCA1NnB4LzY0cHggR29vZ2xlIFNhbnMgRGlzcGxheSwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktMXtmb250OjQwMCA2NHB4Lzc2cHggR29vZ2xlIFNhbnMgRGlzcGxheSwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250OjQwMCAxNnB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4xcHh9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6R29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJke2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToxNnB4fS5tYXQtY2FyZC1zdWJ0aXRsZSwubWF0LWNhcmQtY29udGVudHtmb250LXNpemU6MTZweH0ubWF0LWNoZWNrYm94e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVse2xpbmUtaGVpZ2h0OjIwcHh9Lm1hdC1jaGlwe2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb24sLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbHtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDB9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Zm9udC1zaXplOjE2cHh9Lm1hdC1jYWxlbmRhcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5e2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCwubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b257Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHRoe2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZXtmb250OjUwMCAxNnB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4ycHh9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5Okdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e2ZvbnQ6NDAwIDE2cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjFweH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNnB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5Okdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMTZweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMnB4O21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjJweH0ubWF0LXNpbXBsZS1zbmFja2Jhcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVle2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZSwubWF0LW5lc3RlZC10cmVlLW5vZGV7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNnB4fS5tYXQtcmlwcGxle292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZHtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXJpcHBsZS1lbGVtZW50e2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbntib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3twYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94e3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3J7cG9zaXRpb246cmVsYXRpdmV9LmdtYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDY0cHgvNzZweCBHb29nbGUgU2FucyBEaXNwbGF5LCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0uZ21hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNTZweC82NHB4IEdvb2dsZSBTYW5zIERpc3BsYXksICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5nbWF0LWRpc3BsYXktM3tmb250OjQwMCA0NHB4LzUycHggR29vZ2xlIFNhbnMgRGlzcGxheSwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9LmdtYXQtaGVhZGxpbmUtMXtmb250OjQwMCAzNnB4LzQ0cHggR29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5nbWF0LWhlYWRsaW5lLTJ7Zm9udDo0MDAgMzJweC80MHB4IEdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0uZ21hdC1oZWFkbGluZS0ze2ZvbnQ6NDAwIDI4cHgvMzZweCBHb29nbGUgU2FucywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9LmdtYXQtaGVhZGxpbmUtNHtmb250OjQwMCAyNHB4LzMycHggR29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5nbWF0LWhlYWRsaW5lLTV7Zm9udDo0MDAgMjJweC8yOHB4IEdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0uZ21hdC1oZWFkbGluZS02e2ZvbnQ6NDAwIDE4cHgvMjRweCBHb29nbGUgU2FucywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9LmdtYXQtc3ViaGVhZC0xe2ZvbnQ6NTAwIDE2cHgvMjRweCBHb29nbGUgU2FucywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMXB4fS5nbWF0LXN1YmhlYWQtMntmb250OjUwMCAxNHB4LzIwcHggR29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjI1cHh9LmdtYXQtc3VidGl0bGUtMXtmb250OjUwMCAxNnB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4ycHh9LmdtYXQtc3VidGl0bGUtMntmb250OjUwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4yNXB4fS5nbWF0LW92ZXJsaW5le2ZvbnQ6NTAwIDExcHgvMTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjhweH0uZ21hdC1ib2R5LTF7Zm9udDo0MDAgMTZweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzouMXB4fS5nbWF0LWJvZHktMntmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4ycHh9LmdtYXQtY2FwdGlvbntmb250OjQwMCAxMnB4LzE2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4zcHh9LmdtYXQtYnV0dG9uIC5tYXQtZmxhdC1idXR0b24sLmdtYXQtYnV0dG9uIC5tYXQtc3Ryb2tlZC1idXR0b24sLmdtYXQtYnV0dG9uIC5tYXQtcmFpc2VkLWJ1dHRvbiwuZ21hdC1idXR0b24gLm1hdC1idXR0b24sLmdtYXQtYnV0dG9uLm1hdC1mbGF0LWJ1dHRvbiwuZ21hdC1idXR0b24ubWF0LXN0cm9rZWQtYnV0dG9uLC5nbWF0LWJ1dHRvbi5tYXQtcmFpc2VkLWJ1dHRvbiwuZ21hdC1idXR0b24ubWF0LWJ1dHRvbntmb250OjUwMCAxNHB4LzE4cHggR29vZ2xlIFNhbnMsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LjI1cHh9LmdtYXQtYnV0dG9uLXR5cG9ncmFwaHl7Zm9udDo1MDAgMTRweC8xOHB4IEdvb2dsZSBTYW5zLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi4yNXB4fS5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb246aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNlODcxMGF9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2U4NzEwYX0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Q5MzAyNX0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2U4NzEwYX0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2U4NzEwYX0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNkOTMwMjV9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZWxldmF0aW9uLXowe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejd7Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4e2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwe2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExe2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEye2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEze2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0e2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1e2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2e2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN3tib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTh7Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5e2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMHtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxe2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJ7Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM3tib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0e2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2U4NzEwYX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYmFkZ2UtY29udGVudHtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnQgLm1hdC1iYWRnZS1jb250ZW50e2JhY2tncm91bmQ6I2U4NzEwYTtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2FybiAubWF0LWJhZGdlLWNvbnRlbnR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNkOTMwMjV9Lm1hdC1iYWRnZXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbiAubWF0LWJhZGdlLWNvbnRlbnR7ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50e2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1iYWRnZS1jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudCwubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZle3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW0gLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50e3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjJweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTExcHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93IC5tYXQtYmFkZ2UtY29udGVudHtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9ue2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2U4NzEwYX0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2U4NzEwYX0ubWF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Q5MzAyNX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZDkzMDI1fS5tYXQtYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnl7Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1mYWIubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnR7Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwubWF0LWZhYi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJue2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtZmxhdC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LW1pbmktZmFiW2Rpc2FibGVkXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3Vwe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtsaW5lLWhlaWdodDo0OHB4fS5tYXQtY2FyZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2FyZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2hlY2tib3gtZnJhbWV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2U4NzEwYX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2U4NzEwYX0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZDkzMDI1fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgLm1hdC1jaGlwLXJlbW92ZTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWR7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Q5MzAyNTtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2U4NzEwYTtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxle2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCxtYXQtaGVhZGVyLXJvdyxtYXQtcm93LG1hdC1mb290ZXItcm93LFttYXQtaGVhZGVyLXJvd10sW21hdC1yb3ddLFttYXQtZm9vdGVyLXJvd10sLm1hdC10YWJsZS1zdGlja3l7YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3csbWF0LWhlYWRlci1yb3csbWF0LWZvb3Rlci1yb3csdGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1jYWxlbmRhci1hcnJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b24sLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b257Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQsLm1hdC1kYXRlLXJhbmdlLWlucHV0LXNlcGFyYXRvcntjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWRhdGUtcmFuZ2UtaW5wdXQtc2VwYXJhdG9ye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1wcmV2aWV3e2NvbG9yOnJnYmEoMCwwLDAsLjI0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDIzMiwxMTMsMTAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI0OSwxNzEsMCwuMil9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyMzIsIDExMywgMTAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIzMiwgMTEzLCAxMCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YWZ0ZXJ7YmFja2dyb3VuZDojYThkYWI1fS5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2U4NzEwYTtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwxMTMsMTAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjMyLDExMywxMCwuMil9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDIzMiwgMTEzLCAxMCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIzMiwgMTEzLCAxMCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZDojNDZhMzVlfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2U4NzEwYTtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLDExMywxMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjE3LDQ4LDM3LC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjE3LCA0OCwgMzcsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIxNywgNDgsIDM3LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZDkzMDI1O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjE3LDQ4LDM3LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2U4NzEwYX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNlODcxMGF9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Q5MzAyNX0ubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWRpYWxvZy1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1kaXZpZGVye2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbHtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbntjb2xvcjppbmhlcml0fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcntoZWlnaHQ6NDhweH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIubWF0LWV4cGFuZGVke2hlaWdodDo2NHB4fS5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LWhpbnR7Y29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudHtjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm57Y29sb3I6I2Q5MzAyNX0ubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcntjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Q5MzAyNX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2U4NzEwYX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZDkzMDI1fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZDkzMDI1fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50LC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNkOTMwMjV9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZDkzMDI1fS5tYXQtZXJyb3J7Y29sb3I6I2Q5MzAyNX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1oaW50e2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Q5MzAyNX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZDkzMDI1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnl7Y29sb3I6I2U4NzEwYX0ubWF0LWljb24ubWF0LWFjY2VudHtjb2xvcjojZTg3MTBhfS5tYXQtaWNvbi5tYXQtd2Fybntjb2xvcjojZDkzMDI1fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCwubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2U4NzEwYX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlODcxMGF9Lm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Q5MzAyNX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Q5MzAyNX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uOmhvdmVyLC5tYXQtbGlzdC1vcHRpb246Zm9jdXMsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3VzLC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbiwubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbjpob3ZlciwubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbjpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWx7YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcjo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9ye2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wYWdpbmF0b3ItY29udGFpbmVye21pbi1oZWlnaHQ6NTZweH0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZlZGZjOH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmVkZmM4fS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7ZmlsbDojZmVkZmM4fS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZlZGZjOH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZhZDJjZn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFkMmNmfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Q5MzAyNX0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLC5tYXQtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOiNlODcxMGF9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6I2U4NzEwYX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNkOTMwMjV9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2U4NzEwYX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZTg3MTBhfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNkOTMwMjV9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50e2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeSAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZTg3MTBhfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNlODcxMGF9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNkOTMwMjV9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZDkzMDI1fS5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWRyYXdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXI6bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXSAubWF0LWRyYXdlci1zaWRle2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLDExMywxMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzMiwxMTMsMTAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyMTcsNDgsMzcsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Q5MzAyNX0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzIsMTEzLDEwLC4yKX0ubWF0LWFjY2VudCAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2U4NzEwYX0ubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjMyLDExMywxMCwuMil9Lm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjE3LDQ4LDM3LC4yKX0ubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjU0KTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Q5MzAyNX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNkOTMwMjV9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSwubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVye2hlaWdodDo3MnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyLC5tYXQtdmVydGljYWwtc3RlcHBlci1oZWFkZXJ7cGFkZGluZzoyNHB4IDI0cHh9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXt0b3A6LTE2cHg7Ym90dG9tOi0xNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItbGFiZWwtcG9zaXRpb24tYm90dG9tIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3Jle3RvcDozNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZXt0b3A6MzZweH0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItbmF2LWJhciwubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU0LDIyMywyMDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU0LDIyMywyMDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZTg3MTBhfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTAsMjEwLDIwNywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2Q5MzAyNX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTQsMjIzLDIwMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTQsMjIzLDIwMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3MsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlODcxMGF9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTAsMjEwLDIwNywuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNkOTMwMjV9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kOiNlODcxMGE7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudHtiYWNrZ3JvdW5kOiNlODcxMGE7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm57YmFja2dyb3VuZDojZDkzMDI1O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUsLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC10b29sYmFyIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC10b29sYmFyIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LXZhbHVlLC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdywubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo2NHB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjY0cHh9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze21pbi1oZWlnaHQ6NTZweH0ubWF0LXRvb2xiYXItcm93LC5tYXQtdG9vbGJhci1zaW5nbGUtcm93e2hlaWdodDo1NnB4fX0ubWF0LXRvb2x0aXB7YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWV7YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC10cmVlLW5vZGV7bWluLWhlaWdodDo0OHB4fS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZTg3MTBhfWh0bWwsYm9keXtoZWlnaHQ6MTAwJX1ib2R5e21hcmdpbjowO2ZvbnQtZmFtaWx5OiJSb2JvdG8iLHNhbnMtc2VyaWZ9Lmdvb2ctdG9vbHRpcHt6LWluZGV4OjEwfS5tYXQtdG9vbHRpcHtmb250LXNpemU6MTJweH0uZ29vZ2xlLWNoYXJ0LXRhYmxlLW9kZC10YWJsZS1yb3d7YmFja2dyb3VuZDojZmZmfS5nb29nbGUtY2hhcnQtdGFibGUtaGVhZGVyLWNlbGx7d29yZC13cmFwOmJyZWFrLXdvcmQ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci10b3A6bm9uZSAhaW1wb3J0YW50O2JvcmRlci1sZWZ0Om5vbmUgIWltcG9ydGFudDtib3JkZXItcmlnaHQ6bm9uZSAhaW1wb3J0YW50fS5nb29nbGUtY2hhcnQtdGFibGUtdGFibGUtY2VsbHt3b3JkLWJyZWFrOmJyZWFrLWFsbDtjb2xvcjojMDAwO2JvcmRlci10b3A6bm9uZSAhaW1wb3J0YW50O2JvcmRlci1sZWZ0Om5vbmUgIWltcG9ydGFudDtib3JkZXItcmlnaHQ6bm9uZSAhaW1wb3J0YW50fS5nb29nbGUtdmlzdWFsaXphdGlvbi10YWJsZS10eXBlLW51bWJlcnt0ZXh0LWFsaWduOmNlbnRlcn0uaGlkZGVuLWNvbnRlbnQgdHJhY2Utdmlld2Vye2Rpc3BsYXk6bm9uZX1vdmVydmlldyByZWNvbW1lbmRhdGlvbi1yZXN1bHQtdmlldyAuYm90dGxlbmVjay10aXBzIGxpIGEsb3ZlcnZpZXcgcmVjb21tZW5kYXRpb24tcmVzdWx0LXZpZXcgLmRvY3VtZW50YXRpb24tdGlwcyBsaSBhLGlucHV0LXBpcGVsaW5lIGhvc3Qtc2lkZS1hbmFseXNpcy1kZXRhaWwgLnJlY29tbWVuZGF0aW9ucyBhe2NvbG9yOiNlODcxMGE7Y3Vyc29yOnBvaW50ZXI7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1vdmVydmlldyB0b3Atb3BzLXRhYmxlIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWJvZHksaW5wdXQtcGlwZWxpbmUgaG9zdC1zaWRlLWFuYWx5c2lzLWRldGFpbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1ib2R5e3BhZGRpbmc6MH1zaWRlbmF2IG1hdC1mb3JtLWZpZWxkLm1hdC1wcmltYXJ5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXI6MXB4IHNvbGlkICMwMDA7cGFkZGluZzo4cHg7bWFyZ2luLXRvcDo4cHh9c2lkZW5hdiBtYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtaW5maXh7Ym9yZGVyOjJweCBzb2xpZCAjZTg3MTBhO2JvcmRlci1ib3R0b206bm9uZX1zaWRlbmF2IG1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItc3R5bGU6ZG90dGVkfXNpZGVuYXYgbWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QtdmFsdWV7Y29sb3I6Izc3N31AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJNYXRlcmlhbCBJY29ucyI7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3NyYzp1cmwobWF0ZXJpYWxpY29ucy53b2ZmMikgZm9ybWF0KCJ3b2ZmMiIpfS5tYXRlcmlhbC1pY29uc3tmb250LWZhbWlseToiTWF0ZXJpYWwgSWNvbnMiO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDoxO2xldHRlci1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt3b3JkLXdyYXA6bm9ybWFsO2RpcmVjdGlvbjpsdHI7LXdlYmtpdC1mb250LWZlYXR1cmUtc2V0dGluZ3M6ImxpZ2EiOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUm9ib3RvIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDozMDA7c3JjOmxvY2FsKCJSb2JvdG8gTGlnaHQiKSxsb2NhbCgiUm9ib3RvLUxpZ2h0Iil9QGZvbnQtZmFjZXtmb250LWZhbWlseToiUm9ib3RvIjtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7c3JjOmxvY2FsKCJSb2JvdG8iKSxsb2NhbCgiUm9ib3RvLVJlZ3VsYXIiKX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OiJSb2JvdG8iO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjUwMDtzcmM6bG9jYWwoIlJvYm90byBNZWRpdW0iKSxsb2NhbCgiUm9ib3RvLU1lZGl1bSIpfS5wYW5lbC1vdmVycmlkZTo6LXdlYmtpdC1zY3JvbGxiYXJ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7d2lkdGg6N3B4fS5wYW5lbC1vdmVycmlkZTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czo0cHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC41KTtib3gtc2hhZG93OjAgMCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuNSl9Cg==",
"headers": [
[
"content-type",
"text/css"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/profile/tools": {
"data": "eyIyMDIwMTExOS0wMzU1NTQvMjAyMF8xMV8xOV8wM181OF8xMCI6IFsib3ZlcnZpZXdfcGFnZUAiLCAiaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXJAIiwgImtlcm5lbF9zdGF0cyIsICJtZW1vcnlfcHJvZmlsZSIsICJ0ZW5zb3JmbG93X3N0YXRzIiwgInRyYWNlX3ZpZXdlciMiXX0=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/scalars/scalars?tag=Discriminator+loss&run=20201119-035554%2Fmetrics": {
"data": "W1sxNjA1NzU4MTYwLjE4NDU0NiwgMTIzLCAxLjM1NzU5MTYyOTAyODMyMDNdLCBbMTYwNTc1ODE2MC4zNTU4MTMsIDEzNiwgMS4yNTQ4NDU3Mzg0MTA5NDk3XSwgWzE2MDU3NTgxNjAuNDM4MTgyLCAxNDIsIDEuMjIxNzY2NzEwMjgxMzcyXSwgWzE2MDU3NTgxNjAuNjQ2NTkyLCAxNTgsIDEuMjEwMjQ5NjYyMzk5MjkyXSwgWzE2MDU3NTgxNjAuNjc3NDA5LCAxNjAsIDEuMjA3MzA1OTA4MjAzMTI1XSwgWzE2MDU3NTgxNjAuNzE4MDksIDE2MywgMS4yMTQ3OTIwMTMxNjgzMzVdLCBbMTYwNTc1ODE2MC44MTc2OTcsIDE3MSwgMS4yMzgzODQyNDY4MjYxNzE5XSwgWzE2MDU3NTgxNjAuODU0NzQ5LCAxNzQsIDEuMjI4NzA1NTI1Mzk4MjU0NF0sIFsxNjA1NzU4MTYxLjA0OTUwNiwgMTg5LCAxLjIxNzQ3MDY0NTkwNDU0MV0sIFsxNjA1NzU4MTYxLjA4NjU0LCAxOTIsIDEuMjIxNTE2OTY2ODE5NzYzMl0sIFsxNjA1NzU4MTYxLjM0NTUxNywgMjEyLCAxLjMyOTcxMDk2MDM4ODE4MzZdLCBbMTYwNTc1ODE2MS40NDQyNSwgMjIwLCAxLjM0MzAxNTQzMjM1Nzc4OF0sIFsxNjA1NzU4MTYxLjQ5NDAzMywgMjI0LCAxLjM1NjIzODI0NTk2NDA1MDNdLCBbMTYwNTc1ODE2Mi43MTIxNzUsIDI0NCwgMS40MzM1MzAzMzA2NTc5NTldLCBbMTYwNTc1ODE2Mi44ODU1NzgsIDI1NywgMS40NzY4ODg0MTgxOTc2MzE4XSwgWzE2MDU3NTgxNjMuMDIyOTYzLCAyNjgsIDEuMzc3NjQzMTA4MzY3OTJdLCBbMTYwNTc1ODE2My4wODg4MjIsIDI3MywgMS4yOTU4NTc0Mjk1MDQzOTQ1XSwgWzE2MDU3NTgxNjMuMTM0MDMyLCAyNzYsIDEuMjY1MzA1Mzk5ODk0NzE0NF0sIFsxNjA1NzU4MTYzLjI1MTI4MywgMjg1LCAxLjIyNDk1OTg1MDMxMTI3OTNdLCBbMTYwNTc1ODE2My4zODk4NTEsIDI5NiwgMS4yMjk1Nzk4MDYzMjc4MTk4XSwgWzE2MDU3NTgxNjMuNDU0OTEyLCAzMDEsIDEuMjI0MTI4MDA3ODg4Nzk0XSwgWzE2MDU3NTgxNjMuNDc5MzE1LCAzMDMsIDEuMjQ4NzkxOTMzMDU5NjkyNF0sIFsxNjA1NzU4MTYzLjQ5MTU0MiwgMzA0LCAxLjI1NTgwMTQzOTI4NTI3ODNdLCBbMTYwNTc1ODE2My41NDA0OTEsIDMwOCwgMS4yODA1MDI2NzY5NjM4MDYyXSwgWzE2MDU3NTgxNjMuNjQ0ODQzLCAzMTYsIDEuMjYyMzM4MjgwNjc3Nzk1NF0sIFsxNjA1NzU4MTYzLjc5Mjc5OCwgMzI1LCAxLjIyMjg4MDEyNTA0NTc3NjRdLCBbMTYwNTc1ODE2My44NTYyNTUsIDMzMCwgMS4yMTQyNDM2NTA0MzY0MDE0XSwgWzE2MDU3NTgxNjMuOTk0NDg5LCAzNDEsIDEuMjA3ODI0MTEwOTg0ODAyMl0sIFsxNjA1NzU4MTY0LjA3NTY0MywgMzQ3LCAxLjIzNTIyNzEwODAwMTcwOV0sIFsxNjA1NzU4MTY0LjEzODM4MSwgMzUyLCAxLjI4ODcyNTYxNDU0NzcyOTVdLCBbMTYwNTc1ODE2NC42ODYzOSwgMzY3LCAxLjQwODM5MjQyOTM1MTgwNjZdLCBbMTYwNTc1ODE2NC43NzA1OSwgMzczLCAxLjQwNTEwMTE4MDA3NjU5OTFdLCBbMTYwNTc1ODE2NC44MzM0NTMsIDM3OCwgMS40MTY0Nzk1ODc1NTQ5MzE2XSwgWzE2MDU3NTgxNjQuOTIxODUsIDM4NSwgMS4zNTAwMTI0MjE2MDc5NzEyXSwgWzE2MDU3NTgxNjQuOTcxOTY2LCAzODksIDEuMzQ5MDYwMDU4NTkzNzVdLCBbMTYwNTc1ODE2NC45OTc4OTEsIDM5MSwgMS4zMzQxMTQ1NTE1NDQxODk1XSwgWzE2MDU3NTgxNjUuMjQ3OTcsIDQxMCwgMS4yODYzOTkzNjQ0NzE0MzU1XSwgWzE2MDU3NTgxNjUuMzEwMDM5LCA0MTUsIDEuMjYwMjk0MTk4OTg5ODY4Ml0sIFsxNjA1NzU4MTY1LjM4MjQ1NCwgNDIxLCAxLjI3MTI1MDQ4NjM3MzkwMTRdLCBbMTYwNTc1ODE2NS40NDM2ODQsIDQyNiwgMS4yMjY5MzA3Mzc0OTU0MjI0XSwgWzE2MDU3NTgxNjUuNDY4MTI3LCA0MjgsIDEuMjUzNTE2MTk3MjA0NTg5OF0sIFsxNjA1NzU4MTY1LjU2NTc5NCwgNDM2LCAxLjI5MDYxNDM2NjUzMTM3Ml0sIFsxNjA1NzU4MTY1LjcxNDgyNCwgNDQ4LCAxLjIzNDgwODQ0NDk3NjgwNjZdLCBbMTYwNTc1ODE2NS44MzYwNzIsIDQ1NywgMS4xMTM5MDE3MzQzNTIxMTE4XSwgWzE2MDU3NTgxNjUuOTMxMTg3LCA0NjUsIDEuMDY3NjgxNzg5Mzk4MTkzNF0sIFsxNjA1NzU4MTY2LjUwMDk4MSwgNDgxLCAxLjEyNzYwNDI0NjEzOTUyNjRdLCBbMTYwNTc1ODE2Ni41NDg2ODcsIDQ4NSwgMS4xNDE1NjkxMzc1NzMyNDIyXSwgWzE2MDU3NTgxNjYuNjY3OTg3LCA0OTUsIDEuMjUzNjY0MDE2NzIzNjMyOF0sIFsxNjA1NzU4MTY3LjIyOTg1OCwgNTM5LCAxLjE2MTE2MTMwMzUyMDIwMjZdLCBbMTYwNTc1ODE2Ny4yNDIwMjEsIDU0MCwgMS4xOTIzODY4NjU2MTU4NDQ3XSwgWzE2MDU3NTgxNjcuNDU1MzcxLCA1NTcsIDEuMjI2MzY5MjYxNzQxNjM4Ml0sIFsxNjA1NzU4MTY3LjQ4MDUyNywgNTU5LCAxLjE5NzczMzk5ODI5ODY0NV0sIFsxNjA1NzU4MTY3LjQ5MjkyMiwgNTYwLCAxLjIyMTg1MDc1MjgzMDUwNTRdLCBbMTYwNTc1ODE2Ny41MzAwMDIsIDU2MywgMS4xOTQ4MjI0MzA2MTA2NTY3XSwgWzE2MDU3NTgxNjcuNzEyNDg1LCA1NzgsIDEuMjUzMDI3MjAwNjk4ODUyNV0sIFsxNjA1NzU4MTY3Ljc0ODA3MywgNTgxLCAxLjI3MzIyNjk3NjM5NDY1MzNdLCBbMTYwNTc1ODE2Ny43NTk3NDUsIDU4MiwgMS4yODY1OTcyNTE4OTIwODk4XSwgWzE2MDU3NTgxNjguMjgzMjU5LCA1OTIsIDEuNDMyMTIwOTE5MjI3Nl0sIFsxNjA1NzU4MTY4LjUxNzE2MiwgNjA5LCAxLjQ4OTYwMzg3NzA2NzU2Nl0sIFsxNjA1NzU4MTY4LjU0NDU5OCwgNjExLCAxLjQ2ODIxNzEzNDQ3NTcwOF0sIFsxNjA1NzU4MTY4Ljg0MTg3NywgNjMyLCAxLjMxMDgzMzY5MjU1MDY1OTJdLCBbMTYwNTc1ODE2OC44ODM1MDYsIDYzNSwgMS4zMDgwMzE3OTc0MDkwNTc2XSwgWzE2MDU3NTgxNjguOTkxNjc1LCA2NDMsIDEuMzA0MDE1Mjc4ODE2MjIzMV0sIFsxNjA1NzU4MTY5LjA3MzgzNSwgNjQ5LCAxLjMyMjI1MDk2MjI1NzM4NTNdLCBbMTYwNTc1ODE2OS4xMDEwNDUsIDY1MSwgMS4zMzU3MjM4NzY5NTMxMjVdLCBbMTYwNTc1ODE2OS4xNDA1NywgNjU0LCAxLjMyNjAyOTUzOTEwODI3NjRdLCBbMTYwNTc1ODE2OS4yNDA0NTYsIDY2MCwgMS4zMjc4ODM0ODE5NzkzNzAxXSwgWzE2MDU3NTgxNjkuMzA4Nzc3LCA2NjUsIDEuMzIwNzg5MDk4NzM5NjI0XSwgWzE2MDU3NTgxNjkuNDM2MTIyLCA2NzUsIDEuMzE2MDA4MDkwOTcyOTAwNF0sIFsxNjA1NzU4MTY5LjUxMTc5MSwgNjgxLCAxLjMwNjU2OTgxNDY4MjAwNjhdLCBbMTYwNTc1ODE2OS42NDEyNjQsIDY5MSwgMS4yOTA2NDk4OTA4OTk2NTgyXSwgWzE2MDU3NTgxNjkuNzE3NDkzLCA2OTcsIDEuMjQyNDM0MjYzMjI5MzcwMV0sIFsxNjA1NzU4MTY5Ljc0MjkwNywgNjk5LCAxLjI0NzU3OTA5Nzc0NzgwMjddLCBbMTYwNTc1ODE2OS44MTM2NDMsIDcwNCwgMS4yNDM3NzA3MTg1NzQ1MjRdLCBbMTYwNTc1ODE2OS44MjgyODQsIDcwNSwgMS4yMjk3MjE5MDM4MDA5NjQ0XSwgWzE2MDU3NTgxNzAuMzgxMDY2LCA3MjAsIDEuMjU5MDk0NDc2Njk5ODI5XSwgWzE2MDU3NTgxNzAuNjA3MzkxLCA3MzgsIDEuMzI4NDg3MTU3ODIxNjU1M10sIFsxNjA1NzU4MTcwLjYzNTI2NSwgNzQwLCAxLjMwNzY3NjQzNDUxNjkwNjddLCBbMTYwNTc1ODE3MC43OTMzODUsIDc1MiwgMS4yOTgxMjc4ODk2MzMxNzg3XSwgWzE2MDU3NTgxNzAuODg5OTYxLCA3NTksIDEuMjM3NzkwMjI2OTM2MzQwM10sIFsxNjA1NzU4MTcwLjkwMjAzNywgNzYwLCAxLjI2ODc1MDQyOTE1MzQ0MjRdLCBbMTYwNTc1ODE3MC45MjY1MTUsIDc2MiwgMS4yNDE5NjIwNzUyMzM0NTk1XSwgWzE2MDU3NTgxNzAuOTYzOTg4LCA3NjUsIDEuMjgyNjYyODY4NDk5NzU1OV0sIFsxNjA1NzU4MTcwLjk4OTY2MSwgNzY3LCAxLjI3MzU5NDM3OTQyNTA0ODhdLCBbMTYwNTc1ODE3MS4xMzgyODIsIDc3OSwgMS4yOTUxNDE1Nzc3MjA2NDJdLCBbMTYwNTc1ODE3MS4xNzQwNzUsIDc4MiwgMS4yOTI3ODI1NDUwODk3MjE3XSwgWzE2MDU3NTgxNzEuMjIzNjk0LCA3ODYsIDEuMzM0NTkzNzcyODg4MTgzNl0sIFsxNjA1NzU4MTcxLjI2NDk1NCwgNzg5LCAxLjMyNTQxMjYzMTAzNDg1MV0sIFsxNjA1NzU4MTcxLjMwMTMxOSwgNzkyLCAxLjMyODQwODk1NjUyNzcxXSwgWzE2MDU3NTgxNzEuNDEyNjg5LCA4MDEsIDEuNDA0MTUxNTU4ODc2MDM3Nl0sIFsxNjA1NzU4MTcxLjQ3MjYxNSwgODA2LCAxLjM4NDMyNzg4ODQ4ODc2OTVdLCBbMTYwNTc1ODE3Mi4xNTg5OTgsIDgzMiwgMS4zNTY1NTU0NjE4ODM1NDVdLCBbMTYwNTc1ODE3Mi4yMDkyMzYsIDgzNiwgMS4zNzQwMjg1NjM0OTk0NTA3XSwgWzE2MDU3NTgxNzIuMjU5MzEsIDg0MCwgMS4zNDk2ODg4ODc1OTYxMzA0XSwgWzE2MDU3NTgxNzIuMjcxNDMsIDg0MSwgMS4zNjEwMjkzODY1MjAzODU3XSwgWzE2MDU3NTgxNzIuMzU1NjA1LCA4NDgsIDEuMzM5NzMzOTU4MjQ0MzIzN10sIFsxNjA1NzU4MTcyLjQ2NTYzOSwgODU3LCAxLjMxMDY1MTMwMjMzNzY0NjVdLCBbMTYwNTc1ODE3Mi41MTMyODUsIDg2MSwgMS4yNDk2NDIwMTQ1MDM0NzldLCBbMTYwNTc1ODE3Mi41NjMzNTIsIDg2NSwgMS4yNTkzMjMxMjAxMTcxODc1XSwgWzE2MDU3NTgxNzIuNjI0NTkxLCA4NzAsIDEuMjQ1NTE2MzAwMjAxNDE2XSwgWzE2MDU3NTgxNzIuNjczNTU5LCA4NzQsIDEuMjU0NDA3MDQ4MjI1NDAyOF0sIFsxNjA1NzU4MTcyLjc4MjA4NywgODgzLCAxLjIyODg4NzkxNTYxMTI2N10sIFsxNjA1NzU4MTcyLjgzMDg2NSwgODg3LCAxLjIwMDYzOTk2MzE1MDAyNDRdLCBbMTYwNTc1ODE3Mi44NDI5NjcsIDg4OCwgMS4yMjU0Mjg1ODEyMzc3OTNdLCBbMTYwNTc1ODE3Mi44NTUyMDEsIDg4OSwgMS4xOTMyMjUxNDUzMzk5NjU4XSwgWzE2MDU3NTgxNzIuODg2MjI4LCA4OTEsIDEuMjE1MTI1NTYwNzYwNDk4XSwgWzE2MDU3NTgxNzIuOTcxOTc4LCA4OTgsIDEuMjMwMzU1MjYyNzU2MzQ3N10sIFsxNjA1NzU4MTczLjAzMjYyLCA5MDMsIDEuMjExNzkxOTkyMTg3NV0sIFsxNjA1NzU4MTczLjA1NzQyMSwgOTA1LCAxLjIzMDI5NTY1ODExMTU3MjNdLCBbMTYwNTc1ODE3My4xMTkxNTYsIDkxMCwgMS4yNzkxMDIwODcwMjA4NzRdLCBbMTYwNTc1ODE3My4xNDUwNzQsIDkxMiwgMS4yNzA5MzU2NTQ2NDAxOTc4XSwgWzE2MDU3NTgxNzMuMTk0ODk4LCA5MTYsIDEuMzQ1MzM2MDc5NTk3NDczMV0sIFsxNjA1NzU4MTczLjI2NzYyMywgOTIwLCAxLjM4MzAzMTg0NTA5Mjc3MzRdLCBbMTYwNTc1ODE3My4zNDE3MzksIDkyNiwgMS40MDU5NjUyMDkwMDcyNjMyXSwgWzE2MDU3NTgxNzMuMzU0Mjc5LCA5MjcsIDEuNDM1OTE4ODA3OTgzMzk4NF0sIFsxNjA1NzU4MTc0LjAyNTA5OCwgOTUwLCAxLjQ3NDc1ODYyNTAzMDUxNzZdLCBbMTYwNTc1ODE3NC4wODA0OTUsIDk1NCwgMS40MzUzNDIwNzM0NDA1NTE4XSwgWzE2MDU3NTgxNzQuNTAxMzM0LCA5ODcsIDEuMjE5ODQyNjcyMzQ4MDIyNV0sIFsxNjA1NzU4MTc0LjU2NDAxNiwgOTkyLCAxLjIwNjk0MTEyNzc3NzA5OTZdLCBbMTYwNTc1ODE3NC41ODc3MzEsIDk5NCwgMS4yMDY5MTE4MDIyOTE4NzAxXSwgWzE2MDU3NTgxNzQuNjc0MzU4LCAxMDAwLCAxLjIzODE3NjEwNzQwNjYxNjJdLCBbMTYwNTc1ODE3NC43ODIzNjksIDEwMDgsIDEuMjA5NDMyMzYzNTEwMTMxOF0sIFsxNjA1NzU4MTc0Ljg1ODg0OCwgMTAxNCwgMS4yMzc2MTcyNTQyNTcyMDIxXSwgWzE2MDU3NTgxNzQuOTE4MDYsIDEwMTgsIDEuMjU0MzUwNjYyMjMxNDQ1M10sIFsxNjA1NzU4MTc1LjAwNjIwMywgMTAyNSwgMS4yNDkwMzcxNDY1NjgyOTgzXSwgWzE2MDU3NTgxNzUuMDM0MzU0LCAxMDI3LCAxLjI4NzY1NzQ5OTMxMzM1NDVdLCBbMTYwNTc1ODE3NS4xMTIxLCAxMDMzLCAxLjMwNTIwNzcyOTMzOTU5OTZdLCBbMTYwNTc1ODE3NS4xMzk4MDQsIDEwMzUsIDEuMzIwMDU4MzQ1Nzk0Njc3N10sIFsxNjA1NzU4MTc1LjMzNDMzMSwgMTA0OSwgMS4zNzcwOTQwMzAzODAyNDldLCBbMTYwNTc1ODE3NS4zNDcyNjgsIDEwNTAsIDEuMzU5MDgzNjUyNDk2MzM4XSwgWzE2MDU3NTgxNzUuNDg2Mzk1LCAxMDYwLCAxLjQxNjk4OTA4ODA1ODQ3MTddLCBbMTYwNTc1ODE3NS44ODc2MTMsIDEwNjMsIDEuMzk2NzM4NTI5MjA1MzIyM10sIFsxNjA1NzU4MTc2LjAwODQxOCwgMTA3MiwgMS4zNTUyOTY5Njk0MTM3NTczXSwgWzE2MDU3NTgxNzYuMDU2MzU3LCAxMDc2LCAxLjM5MjUwNjgzNzg0NDg0ODZdLCBbMTYwNTc1ODE3Ni4xMDQ1ODcsIDEwODAsIDEuMzc0OTM1MjY5MzU1Nzc0XSwgWzE2MDU3NTgxNzYuMjE0OTc2LCAxMDg5LCAxLjM3MjcwMzA3NTQwODkzNTVdLCBbMTYwNTc1ODE3Ni4yMjcwMjcsIDEwOTAsIDEuMzU3Njg1MDg5MTExMzI4MV0sIFsxNjA1NzU4MTc2LjMwMDgyNSwgMTA5NiwgMS4zMzg2NDgwODA4MjU4MDU3XSwgWzE2MDU3NTgxNzYuMzEyOTMsIDEwOTcsIDEuMzQ4NTI1Mjg1NzIwODI1Ml0sIFsxNjA1NzU4MTc2LjM3MzMyOCwgMTEwMiwgMS4zNDIxMzQyMzcyODk0Mjg3XSwgWzE2MDU3NTgxNzYuNTE2OTgyLCAxMTE0LCAxLjI5NzA0MDIyNDA3NTMxNzRdLCBbMTYwNTc1ODE3Ni41ODk3NiwgMTEyMCwgMS4yNzc5MjQyOTkyNDAxMTIzXSwgWzE2MDU3NTgxNzYuNjI1OTAzLCAxMTIzLCAxLjI1MjcwNTMzNTYxNzA2NTRdLCBbMTYwNTc1ODE3Ni43MzUxOTYsIDExMzIsIDEuMjI1MTMzNDE5MDM2ODY1Ml0sIFsxNjA1NzU4MTc2Ljc3MDc3LCAxMTM1LCAxLjIyMDQ2Mzg3MTk1NTg3MTZdLCBbMTYwNTc1ODE3Ni44NjgwNjgsIDExNDMsIDEuMjA3MzIwNDUxNzM2NDUwMl0sIFsxNjA1NzU4MTc3LjAyMjc2LCAxMTU1LCAxLjMwODcyMTA2NTUyMTI0MDJdLCBbMTYwNTc1ODE3Ny4xMDg5MDUsIDExNjIsIDEuMzQ2NjI0NjEyODA4MjI3NV0sIFsxNjA1NzU4MTc3LjI2ODAwOCwgMTE3NSwgMS4zODExNDczODQ2NDM1NTQ3XSwgWzE2MDU3NTgxNzcuNzEyMTg0LCAxMTgxLCAxLjM4NjI3Mzg2MDkzMTM5NjVdLCBbMTYwNTc1ODE3Ny43NjA2NjksIDExODQsIDEuMzkxOTQ0NDA4NDE2NzQ4XSwgWzE2MDU3NTgxNzcuNzk1NDU5LCAxMTg2LCAxLjM5NDk0ODAwNTY3NjI2OTVdLCBbMTYwNTc1ODE3Ny44NTk3NDksIDExOTAsIDEuMzQ3MzMzOTA4MDgxMDU0N10sIFsxNjA1NzU4MTc3LjkyNzQwNSwgMTE5NCwgMS4zNjE2NDgwODI3MzMxNTQzXSwgWzE2MDU3NTgxNzcuOTY2NzE5LCAxMTk2LCAxLjM3MDI2Nzg2ODA0MTk5MjJdLCBbMTYwNTc1ODE3OC4wNjE1MTQsIDEyMDEsIDEuMzYzNTUzNzYyNDM1OTEzXSwgWzE2MDU3NTgxNzguMDc5MTEsIDEyMDIsIDEuMzQ5NTY1NzQ0NDAwMDI0NF0sIFsxNjA1NzU4MTc4LjIzODE0OCwgMTIxMSwgMS4zNTM5ODk2MDExMzUyNTRdLCBbMTYwNTc1ODE3OC4zNjU3NTUsIDEyMTcsIDEuMzkyNjIwNDQ0Mjk3NzkwNV0sIFsxNjA1NzU4MTc4LjQzNTEwMywgMTIyMSwgMS4zNzcyNTI1Nzg3MzUzNTE2XSwgWzE2MDU3NTgxNzguNDUzMzU0LCAxMjIyLCAxLjM3OTkzMzU5NTY1NzM0ODZdLCBbMTYwNTc1ODE3OC42MjAwODgsIDEyMzIsIDEuMzQ4NDQyMDc3NjM2NzE4OF0sIFsxNjA1NzU4MTc4LjcwODA2NiwgMTIzNywgMS4zMTYzNzQ3Nzg3NDc1NTg2XSwgWzE2MDU3NTgxNzguOTUzMzUsIDEyNTEsIDEuMjUwODIzMjU5MzUzNjM3N10sIFsxNjA1NzU4MTc5LjM2NzY5MiwgMTI3NCwgMS4xOTUwNjE0NDUyMzYyMDZdLCBbMTYwNTc1ODE3OS40Mzk0NDIsIDEyNzgsIDEuMjA3NTk3Mzc0OTE2MDc2N10sIFsxNjA1NzU4MTc5LjQ1Nzg3NSwgMTI3OSwgMS4xNzcxMTU1NTk1Nzc5NDJdLCBbMTYwNTc1ODE3OS40NzQ3NjUsIDEyODAsIDEuMjA1OTEzNzgyMTE5NzUxXSwgWzE2MDU3NTgxODAuMTU0NjczLCAxMjk4LCAxLjIyNjMxMTkyMjA3MzM2NDNdLCBbMTYwNTc1ODE4MC4zNTUwNDEsIDEzMTAsIDEuMzQyMDIwMTUzOTk5MzI4Nl0sIFsxNjA1NzU4MTgwLjM3MDE5NywgMTMxMSwgMS4zMTc3MDk2ODQzNzE5NDgyXSwgWzE2MDU3NTgxODAuNDY4ODgzLCAxMzE3LCAxLjM3MzE0MzkxMTM2MTY5NDNdLCBbMTYwNTc1ODE4MC41ODMxMDcsIDEzMjQsIDEuNDIzMjIzNDk1NDgzMzk4NF0sIFsxNjA1NzU4MTgwLjk5ODY3MSwgMTM1MCwgMS40MjYyMjg4ODA4ODIyNjMyXSwgWzE2MDU3NTgxODEuMDQwNDM2LCAxMzUyLCAxLjQyMzE3NDczODg4Mzk3MjJdLCBbMTYwNTc1ODE4MS4yMDA3MDEsIDEzNjIsIDEuMzc1OTA4ODUxNjIzNTM1Ml0sIFsxNjA1NzU4MTgxLjM4MTI2MywgMTM3MywgMS4zMjY4NTkyMzU3NjM1NDk4XSwgWzE2MDU3NTgxODEuNDI4MDI0LCAxMzc2LCAxLjMxMDYyNzkzNzMxNjg5NDVdLCBbMTYwNTc1ODE4MS40NzQ5MDcsIDEzNzksIDEuMzExMzAxMzUwNTkzNTY3XSwgWzE2MDU3NTgxODEuNzY4NSwgMTM5OSwgMS4yNDc2NzA0MTIwNjM1OTg2XSwgWzE2MDU3NTgxODEuODU1NDE2LCAxNDA1LCAxLjIxMjUzOTkxMTI3MDE0MTZdLCBbMTYwNTc1ODE4MS45NTQ2NTQsIDE0MTIsIDEuMjY1OTg1NDg4ODkxNjAxNl0sIFsxNjA1NzU4MTgyLjQwNTA1OCwgMTQxOCwgMS4yNDExNTg4NDMwNDA0NjYzXSwgWzE2MDU3NTgxODIuNTIzMTM3LCAxNDI4LCAxLjI2MjI0ODI3NzY2NDE4NDZdLCBbMTYwNTc1ODE4Mi41OTQ1ODgsIDE0MzQsIDEuMjcyMjg3MzY4Nzc0NDE0XSwgWzE2MDU3NTgxODIuNjMwNTUsIDE0MzcsIDEuMjYwNzgwOTMwNTE5MTA0XSwgWzE2MDU3NTgxODIuNzYyOTQsIDE0NDgsIDEuMjkyMTczNjI0MDM4Njk2M10sIFsxNjA1NzU4MTgyLjc5ODIzNywgMTQ1MSwgMS4zMTU4MTkwMjUwMzk2NzI5XSwgWzE2MDU3NTgxODIuODM0MzA0LCAxNDU0LCAxLjMwODk2NDAxNDA1MzM0NDddLCBbMTYwNTc1ODE4Mi44NDYxLCAxNDU1LCAxLjMzMjczOTU5MTU5ODUxMDddLCBbMTYwNTc1ODE4My4wNzY0ODksIDE0NzMsIDEuMzI2MTUzOTkzNjA2NTY3NF0sIFsxNjA1NzU4MTgzLjQ2ODE1MiwgMTUwMywgMS4yODgzODU1MTA0NDQ2NDExXSwgWzE2MDU3NTgxODMuNTA0NTMzLCAxNTA2LCAxLjI3NTk5MDQ4NjE0NTAxOTVdLCBbMTYwNTc1ODE4My41NDIwNzQsIDE1MDksIDEuMjg2OTA4NzQ1NzY1Njg2XSwgWzE2MDU3NTgxODMuNTUzOTk0LCAxNTEwLCAxLjMwODczNjkyMDM1Njc1MDVdLCBbMTYwNTc1ODE4My44MjYzMDgsIDE1MzIsIDEuMjcwMDcwMTk1MTk4MDU5XSwgWzE2MDU3NTgxODQuNDAwMjc4LCAxNTQ0LCAxLjIzMzM1NTUyMjE1NTc2MTddLCBbMTYwNTc1ODE4NC40Mjc2MjMsIDE1NDYsIDEuMjQzMjQ5NjU0NzY5ODk3NV0sIFsxNjA1NzU4MTg0LjQ4NDE1MywgMTU1MCwgMS4yMDcyMTE4NTIwNzM2Njk0XSwgWzE2MDU3NTgxODQuNTQxMDQ5LCAxNTU0LCAxLjIwNjMxODAyMDgyMDYxNzddLCBbMTYwNTc1ODE4NC41OTk4NDEsIDE1NTgsIDEuMTkxODE0ODk5NDQ0NThdLCBbMTYwNTc1ODE4NC45NjcxNTcsIDE1ODMsIDEuMjkzMTUxMjU5NDIyMzAyMl0sIFsxNjA1NzU4MTg0Ljk4Mjc3NiwgMTU4NCwgMS4yOTIyNTI2NTk3OTc2Njg1XSwgWzE2MDU3NTgxODUuMTUxNjQ0LCAxNTk1LCAxLjM3OTQyMDM5OTY2NTgzMjVdLCBbMTYwNTc1ODE4NS4yNzUzNDQsIDE2MDMsIDEuMzk4NzIzNDgzMDg1NjMyM10sIFsxNjA1NzU4MTg1LjMzNDM4NCwgMTYwNywgMS40NDc1OTk4ODc4NDc5MDA0XSwgWzE2MDU3NTgxODUuMzYzMTIyLCAxNjA5LCAxLjQzMTMwMTU5Mzc4MDUxNzZdLCBbMTYwNTc1ODE4NS41MTIwMTMsIDE2MTksIDEuNDIzMDE2MzA5NzM4MTU5Ml0sIFsxNjA1NzU4MTg1LjYxMTU2OCwgMTYyNiwgMS4zODA2NDg2MTI5NzYwNzQyXSwgWzE2MDU3NTgxODUuODI5NDAzLCAxNjQxLCAxLjI3Mzk2MjczNjEyOTc2MDddLCBbMTYwNTc1ODE4NS44ODc4MTEsIDE2NDUsIDEuMjEwMDcyMzk4MTg1NzNdLCBbMTYwNTc1ODE4Ni41NjQ1MDIsIDE2NjksIDEuMTUzNzEzOTQxNTc0MDk2N10sIFsxNjA1NzU4MTg2LjU3NjYxNSwgMTY3MCwgMS4xMDc1NTUzODk0MDQyOTY5XSwgWzE2MDU3NTgxODYuNzcyMTcxLCAxNjg2LCAxLjIzMTY4NzA2ODkzOTIwOV0sIFsxNjA1NzU4MTg2Ljc4NDEzMSwgMTY4NywgMS4yNTcyMzk1ODAxNTQ0MTldLCBbMTYwNTc1ODE4Ni44OTQzMDMsIDE2OTYsIDEuMzAyMDczODM2MzI2NTk5MV0sIFsxNjA1NzU4MTg2Ljk2OTYxNCwgMTcwMiwgMS4yOTA2OTY2MjA5NDExNjJdLCBbMTYwNTc1ODE4Ny4wMjE4MDgsIDE3MDYsIDEuMjk2NzI0OTE1NTA0NDU1Nl0sIFsxNjA1NzU4MTg3LjE0MDkxOSwgMTcxNSwgMS4zMDQ3MzMyNzYzNjcxODc1XSwgWzE2MDU3NTgxODcuMjI4NDg2LCAxNzIyLCAxLjI5MDM3MDk0MTE2MjEwOTRdLCBbMTYwNTc1ODE4Ny4yNDA2NDIsIDE3MjMsIDEuMzMyMzE3MzUyMjk0OTIxOV0sIFsxNjA1NzU4MTg3LjQwMzMwMiwgMTczNiwgMS4zODAwODU0NjgyOTIyMzYzXSwgWzE2MDU3NTgxODcuNTEyMzksIDE3NDUsIDEuMzg2MTMwMzMyOTQ2Nzc3M10sIFsxNjA1NzU4MTg3LjU3MjM4MSwgMTc1MCwgMS4zODUyMDA3Mzg5MDY4NjA0XSwgWzE2MDU3NTgxODcuNjMyMjAzLCAxNzU1LCAxLjM3NjQ0NTQxMjYzNTgwMzJdLCBbMTYwNTc1ODE4Ny42NjcxNzIsIDE3NTgsIDEuMzIzMTIwODMyNDQzMjM3M10sIFsxNjA1NzU4MTg3LjcyNTkwOCwgMTc2MywgMS4yNjc1MDM2MTkxOTQwMzA4XSwgWzE2MDU3NTgxODcuNzYyMTM1LCAxNzY2LCAxLjI0NjM5MTUzNDgwNTI5NzldLCBbMTYwNTc1ODE4OC4xNzg5OTEsIDE3NzAsIDEuMTk4OTc5ODU0NTgzNzQwMl0sIFsxNjA1NzU4MTg4LjI4MDk1NywgMTc3OCwgMS4xNjc2MDIzMDA2NDM5MjFdLCBbMTYwNTc1ODE4OC4zNzY2MzQsIDE3ODYsIDEuMTMyNjg5OTUyODUwMzQxOF0sIFsxNjA1NzU4MTg4LjQ4MTc3NCwgMTc5MywgMS4xMzY0MzMyNDM3NTE1MjU5XSwgWzE2MDU3NTgxODguNTY1NzAxLCAxODAwLCAxLjEyOTQxMDUwNTI5NDc5OThdLCBbMTYwNTc1ODE4OC42NzQ4MDcsIDE4MDksIDEuMTc2MDk0NTMyMDEyOTM5NV0sIFsxNjA1NzU4MTg4LjcyMzkzNiwgMTgxMywgMS4yMDk1ODM2NDAwOTg1NzE4XSwgWzE2MDU3NTgxODguNzM2NDIxLCAxODE0LCAxLjIyNjY0MjM3MDIyMzk5OV0sIFsxNjA1NzU4MTg4Ljc0ODIwMiwgMTgxNSwgMS4yMjA4NTQxNjMxNjk4NjA4XSwgWzE2MDU3NTgxODguNzcyNjMxLCAxODE3LCAxLjI0NDM2MDU2NjEzOTIyMTJdLCBbMTYwNTc1ODE4OC44MDk4NDIsIDE4MjAsIDEuMjUzNDM0NjU4MDUwNTM3XSwgWzE2MDU3NTgxODguODk0Njk5LCAxODI3LCAxLjMxMjI5MTg2MDU4MDQ0NDNdLCBbMTYwNTc1ODE4OS4wMDYyNTYsIDE4MzYsIDEuMzc5NDI1NTI1NjY1MjgzMl0sIFsxNjA1NzU4MTg5LjEzMTAyNiwgMTg0NiwgMS4zNjY2NzYzMzA1NjY0MDYyXSwgWzE2MDU3NTgxODkuMTkzNSwgMTg1MCwgMS4zNzc2MzE2NjQyNzYxMjNdLCBbMTYwNTc1ODE4OS4yMTk2NDcsIDE4NTIsIDEuMzMxODIxNzk5Mjc4MjU5M10sIFsxNjA1NzU4MTg5LjI2MDU5NCwgMTg1NSwgMS4zNjY2ODUyNzEyNjMxMjI2XSwgWzE2MDU3NTgxODkuMzI5NzczLCAxODYwLCAxLjMxODI1MzYzNjM2MDE2ODVdLCBbMTYwNTc1ODE4OS4zNjgxNDEsIDE4NjMsIDEuMzI1MjAzMjk5NTIyNF0sIFsxNjA1NzU4MTg5LjM3OTg4LCAxODY0LCAxLjMyMDM0MDM5NDk3Mzc1NDldLCBbMTYwNTc1ODE4OS4zOTE5NSwgMTg2NSwgMS4zMjk5NDQxMzM3NTg1NDVdLCBbMTYwNTc1ODE4OS42MjI0NSwgMTg4NCwgMS4yNTI3NjEwMDYzNTUyODU2XSwgWzE2MDU3NTgxOTAuMDk5NzM3LCAxODkzLCAxLjI0MjM2OTY1MTc5NDQzMzZdLCBbMTYwNTc1ODE5MC4xODQwOTcsIDE4OTksIDEuMjI5NDI0MzU3NDE0MjQ1Nl0sIFsxNjA1NzU4MTkwLjI3ODY1NiwgMTkwNiwgMS4yMDcyMjYwMzc5NzkxMjZdLCBbMTYwNTc1ODE5MC4yOTI0MDQsIDE5MDcsIDEuMjE2NDY3ODU3MzYwODM5OF0sIFsxNjA1NzU4MTkwLjQxMDc2MywgMTkxNiwgMS4yMTk1MDIyMTA2MTcwNjU0XSwgWzE2MDU3NTgxOTAuNDk4Njk1LCAxOTIzLCAxLjI1MjE3NDEzOTAyMjgyNzFdLCBbMTYwNTc1ODE5MC42NDkwMjUsIDE5MzUsIDEuMjI5OTQwODkxMjY1ODY5MV0sIFsxNjA1NzU4MTkwLjc2MTU0MiwgMTk0NCwgMS4yMjczNjIxNTU5MTQzMDY2XSwgWzE2MDU3NTgxOTAuODEyMjY4LCAxOTQ4LCAxLjIwMDYxNzc5MDIyMjE2OF0sIFsxNjA1NzU4MTkwLjkzODUwNCwgMTk1OCwgMS4yNzE3NTUwOTkyOTY1Njk4XSwgWzE2MDU3NTgxOTAuOTg4NjY3LCAxOTYyLCAxLjM1NjQ1ODY2Mzk0MDQyOTddLCBbMTYwNTc1ODE5MS4wNDk2OTcsIDE5NjcsIDEuMzQxNjY4MTI4OTY3Mjg1Ml0sIFsxNjA1NzU4MTkxLjEwMDYzNiwgMTk3MSwgMS4zOTM1OTk1MTAxOTI4NzFdLCBbMTYwNTc1ODE5MS4yNzMxNjIsIDE5ODQsIDEuNDI4Nzc5ODQwNDY5MzYwNF0sIFsxNjA1NzU4MTkxLjMxMDQsIDE5ODcsIDEuNDA0OTg5MDA0MTM1MTMxOF0sIFsxNjA1NzU4MTkxLjM4NDg5LCAxOTkzLCAxLjM2NzMxMzI2NTgwMDQ3Nl0sIFsxNjA1NzU4MTkxLjM5Njc4NSwgMTk5NCwgMS4zNzIzMzIzMzQ1MTg0MzI2XSwgWzE2MDU3NTgxOTEuNDA4OTI1LCAxOTk1LCAxLjM0MDU1NzIxNzU5Nzk2MTRdLCBbMTYwNTc1ODE5Mi4xODg3MzMsIDIwMjksIDEuMTU2MDcyMzc4MTU4NTY5M10sIFsxNjA1NzU4MTkyLjI3MDEwMSwgMjAzNSwgMS4xODY4NjE4NzI2NzMwMzQ3XSwgWzE2MDU3NTgxOTIuNTAwMTM4LCAyMDUyLCAxLjIyODE2NTc0NTczNTE2ODVdLCBbMTYwNTc1ODE5Mi41MjQ0MjcsIDIwNTQsIDEuMjQxNTEyODk0NjMwNDMyMV0sIFsxNjA1NzU4MTkyLjU0ODQ2OCwgMjA1NiwgMS4yNjk4NzY0ODAxMDI1MzldLCBbMTYwNTc1ODE5Mi42MjE2NTYsIDIwNjIsIDEuMjkxNTY5NzA5Nzc3ODMyXSwgWzE2MDU3NTgxOTIuNjU4MzkzLCAyMDY1LCAxLjI2NzA2MDUxODI2NDc3MDVdLCBbMTYwNTc1ODE5Mi42ODIyOTEsIDIwNjcsIDEuMjk4NjY0NTY5ODU0NzM2M10sIFsxNjA1NzU4MTkyLjcxOTI3NCwgMjA3MCwgMS4zMDQzMTIyMjkxNTY0OTQxXSwgWzE2MDU3NTgxOTIuOTE3Nzk1LCAyMDg1LCAxLjM0NTM1MTkzNDQzMjk4MzRdLCBbMTYwNTc1ODE5My4wOTcwODIsIDIwOTksIDEuMjg2MzEwMTk1OTIyODUxNl0sIFsxNjA1NzU4MTkzLjEwOTI3NCwgMjEwMCwgMS4yOTg5MDg0NzIwNjExNTcyXSwgWzE2MDU3NTgxOTMuMTIxNTE1LCAyMTAxLCAxLjMwNzk3Njk2MTEzNTg2NDNdLCBbMTYwNTc1ODE5My4zNTAzODUsIDIxMTksIDEuMjEzMDY0NDMyMTQ0MTY1XSwgWzE2MDU3NTgxOTMuMzk3ODYyLCAyMTIzLCAxLjE0NzgxMTY1MTIyOTg1ODRdLCBbMTYwNTc1ODE5My45MDE0NTgsIDIxMzEsIDEuMTQ2MjU1NzMxNTgyNjQxNl0sIFsxNjA1NzU4MTkzLjk1NDkyOSwgMjEzNSwgMS4xMTEwMjA2ODQyNDIyNDg1XSwgWzE2MDU3NTgxOTQuMDkyMzQxLCAyMTQ1LCAxLjA5NDQ4NjcxMzQwOTQyMzhdLCBbMTYwNTc1ODE5NC4xMzMwNjcsIDIxNDgsIDEuMTEwNTg4Nzg4OTg2MjA2XSwgWzE2MDU3NTgxOTQuMTczNzMzLCAyMTUxLCAxLjA3MzI4NDM4NzU4ODUwMV0sIFsxNjA1NzU4MTk0LjIzMjk4MywgMjE1NCwgMS4wOTExNTk4MjA1NTY2NDA2XSwgWzE2MDU3NTgxOTQuNTU0ODE0LCAyMTc4LCAxLjIwMTE2NTE5OTI3OTc4NTJdLCBbMTYwNTc1ODE5NC43MDEzMTcsIDIxOTAsIDEuMjczMjkxMTEwOTkyNDMxNl0sIFsxNjA1NzU4MTk0LjcxNDEyLCAyMTkxLCAxLjMyMjM1ODYwODI0NTg0OTZdLCBbMTYwNTc1ODE5NC43NTE2NTIsIDIxOTQsIDEuMzE5MDEwOTcyOTc2Njg0Nl0sIFsxNjA1NzU4MTk0Ljc2Mzg0NCwgMjE5NSwgMS4zMjI0NzAxODgxNDA4NjkxXSwgWzE2MDU3NTgxOTQuNzg4MTk3LCAyMTk3LCAxLjMzNjkxODcxMTY2MjI5MjVdLCBbMTYwNTc1ODE5NC44MTMwMjMsIDIxOTksIDEuMzA3NzU1OTQ3MTEzMDM3XSwgWzE2MDU3NTgxOTQuODU5ODc1LCAyMjAzLCAxLjM1MDAwMzI0MjQ5MjY3NThdLCBbMTYwNTc1ODE5NC45MDgwNTIsIDIyMDcsIDEuMzg3ODQwMDMyNTc3NTE0Nl0sIFsxNjA1NzU4MTk0Ljk2NzcxMywgMjIxMiwgMS4zOTQwNTc3NTA3MDE5MDQzXSwgWzE2MDU3NTgxOTQuOTkxOTc3LCAyMjE0LCAxLjM3MzY0NzQ1MTQwMDc1NjhdLCBbMTYwNTc1ODE5NS4yMzIzNjEsIDIyMjksIDEuMjcwNzU4MzkwNDI2NjM1N10sIFsxNjA1NzU4MTk2LjAxNjA1MywgMjI1OSwgMS4xODcyNzEyMzczNzMzNTJdLCBbMTYwNTc1ODE5Ni4wNTUyNDksIDIyNjIsIDEuMTkxMDMzMDA1NzE0NDE2NV0sIFsxNjA1NzU4MTk2LjA2ODkyOSwgMjI2MywgMS4xNjM2OTM0MjgwMzk1NTA4XSwgWzE2MDU3NTgxOTYuMTIyMjgsIDIyNjcsIDEuMTk0OTY2MTk3MDEzODU1XSwgWzE2MDU3NTgxOTYuMTQ3ODg1LCAyMjY5LCAxLjIxNjAwNTgwMjE1NDU0MV0sIFsxNjA1NzU4MTk2LjIxMDE3OCwgMjI3NCwgMS4xNzkwMDM3MTU1MTUxMzY3XSwgWzE2MDU3NTgxOTYuMzMwMTA2LCAyMjgzLCAxLjE5ODk4MTI4NTA5NTIxNDhdLCBbMTYwNTc1ODE5Ni40Mjg1ODIsIDIyOTEsIDEuMjA3Nzc2NjY1Njg3NTYxXSwgWzE2MDU3NTgxOTYuNDc4Nzc2LCAyMjk1LCAxLjE1NTA0NzY1NTEwNTU5MDhdLCBbMTYwNTc1ODE5Ni41OTk4MjksIDIzMDUsIDEuMTg3NjIyOTA0Nzc3NTI2OV0sIFsxNjA1NzU4MTk2LjYyNDYxMywgMjMwNywgMS4xNzc3ODQ2ODEzMjAxOTA0XSwgWzE2MDU3NTgxOTYuNjQ4NDkxLCAyMzA5LCAxLjIwNDExNTUwOTk4Njg3NzRdLCBbMTYwNTc1ODE5Ni42NjA4MTIsIDIzMTAsIDEuMTc5MTM2NTE0NjYzNjk2M10sIFsxNjA1NzU4MTk2LjcwODI0NCwgMjMxNCwgMS4yMzEwOTUwNzU2MDcyOTk4XSwgWzE2MDU3NTgxOTYuNzQ0MDg0LCAyMzE3LCAxLjIxMTIyNjIyNDg5OTI5Ml0sIFsxNjA1NzU4MTk2Ljg0MDgzOSwgMjMyNSwgMS4yMjE5ODA4MTAxNjU0MDUzXSwgWzE2MDU3NTgxOTYuODg4NDc3LCAyMzI5LCAxLjI1MjIwMzcwMjkyNjYzNTddLCBbMTYwNTc1ODE5Ny4wNjE4NzcsIDIzNDMsIDEuMjYyNjUyMzk3MTU1NzYxN10sIFsxNjA1NzU4MTk3LjEzNDg1MywgMjM0OSwgMS4zMDA5NDYyMzU2NTY3MzgzXSwgWzE2MDU3NTgxOTcuMTk2MDQzLCAyMzU0LCAxLjI3NDkwMjEwNTMzMTQyMV0sIFsxNjA1NzU4MTk3LjIwNzY2NCwgMjM1NSwgMS4zMDA3ODk1OTQ2NTAyNjg2XSwgWzE2MDU3NTgxOTcuMjMzMzA5LCAyMzU3LCAxLjI2MzkzMjQ2NjUwNjk1OF0sIFsxNjA1NzU4MTk3LjY0MTgxMSwgMjM2MCwgMS4yNDUzMTA5MDI1OTU1Ml0sIFsxNjA1NzU4MTk3LjY2Njg2LCAyMzYyLCAxLjI0NTY2NTc4ODY1MDUxMjddLCBbMTYwNTc1ODE5Ny42OTEzMjgsIDIzNjQsIDEuMjE2OTQ3NzkzOTYwNTcxM10sIFsxNjA1NzU4MTk3LjcwMzYzMiwgMjM2NSwgMS4yMDExMzM5NjY0NDU5MjI5XSwgWzE2MDU3NTgxOTcuNzg1MzA0LCAyMzcyLCAxLjE4NTg5NTkxOTc5OTgwNDddLCBbMTYwNTc1ODE5Ny44MjEzMDgsIDIzNzUsIDEuMTU4NzE0NzcxMjcwNzUyXSwgWzE2MDU3NTgxOTcuODgxODc0LCAyMzgwLCAxLjEzMjU3Mzg0MzAwMjMxOTNdLCBbMTYwNTc1ODE5OC4xMTM4OTEsIDIzOTksIDEuMTQxNTAxMTg4Mjc4MTk4Ml0sIFsxNjA1NzU4MTk4LjIzNjA2MSwgMjQwOSwgMS4yMDAwODAzOTQ3NDQ4NzNdLCBbMTYwNTc1ODE5OC4zMTg0MzksIDI0MTUsIDEuMjA0NTg0NzE3NzUwNTQ5M10sIFsxNjA1NzU4MTk4LjM5NTM5NCwgMjQyMSwgMS4yMjEzMzg1MTA1MTMzMDU3XSwgWzE2MDU3NTgxOTguNDQ1MjQxLCAyNDI1LCAxLjI3NzI5NDM5NzM1NDEyNl0sIFsxNjA1NzU4MTk4LjQ1NzYxOCwgMjQyNiwgMS4yNjMwOTI1MTc4NTI3ODMyXSwgWzE2MDU3NTgxOTguNjExNTY3LCAyNDM3LCAxLjI1NzU0NjQyNDg2NTcyMjddLCBbMTYwNTc1ODE5OC42MjQwOTEsIDI0MzgsIDEuMjMwOTczNDgyMTMxOTU4XSwgWzE2MDU3NTgxOTguODEwMDQyLCAyNDUzLCAxLjIyNzIxMjE5MDYyODA1MThdLCBbMTYwNTc1ODE5OC45MzE2NDgsIDI0NjMsIDEuMjYyNzg0MjQyNjMwMDA0OV0sIFsxNjA1NzU4MTk5LjA0MDY2NywgMjQ3MiwgMS4zMDc2MDYyMjAyNDUzNjEzXSwgWzE2MDU3NTgxOTkuNjE4MzM0LCAyNDg5LCAxLjIxMjc0NTQyODA4NTMyNzFdLCBbMTYwNTc1ODE5OS44NTMwMzEsIDI1MDcsIDEuMDk0NzI5MDY1ODk1MDgwNl0sIFsxNjA1NzU4MTk5Ljg2NTMxNSwgMjUwOCwgMS4wODgyNzAxODczNzc5Mjk3XSwgWzE2MDU3NTgxOTkuODkwNDc3LCAyNTEwLCAxLjA3NzU2NDIzOTUwMTk1MzFdLCBbMTYwNTc1ODIwMC4wMTU0NDcsIDI1MjAsIDEuMTMyMTAxNTM1Nzk3MTE5MV0sIFsxNjA1NzU4MjAwLjA2NTUxMywgMjUyNCwgMS4xNDkxNjA4NjE5Njg5OTQxXSwgWzE2MDU3NTgyMDAuMjAxMzA3LCAyNTM0LCAxLjI0ODAwNTk4NjIxMzY4NF0sIFsxNjA1NzU4MjAwLjMwNDA3MSwgMjU0MiwgMS4yNjc1NDIxMjM3OTQ1NTU3XSwgWzE2MDU3NTgyMDAuMzE2NjYzLCAyNTQzLCAxLjI1Mzk2NDU0MzM0MjU5MDNdLCBbMTYwNTc1ODIwMC40NTY3OTgsIDI1NTQsIDEuMjIxMzM5MjI1NzY5MDQzXSwgWzE2MDU3NTgyMDAuNTUzNTEsIDI1NjIsIDEuMjQyNDcyNDEwMjAyMDI2NF0sIFsxNjA1NzU4MjAwLjYyNTI1NywgMjU2OCwgMS4yNzYyMDI5MTcwOTg5OTldLCBbMTYwNTc1ODIwMC42MzcxOTgsIDI1NjksIDEuMjI4NDc1ODA5MDk3MjldLCBbMTYwNTc1ODIwMC42NjExNDMsIDI1NzEsIDEuMjY3NDMwNDI0NjkwMjQ2Nl0sIFsxNjA1NzU4MjAwLjY4NTQzLCAyNTczLCAxLjI1NTEwNDA2NDk0MTQwNjJdLCBbMTYwNTc1ODIwMC43NDU4NDcsIDI1NzgsIDEuMjc3NTc3NDAwMjA3NTE5NV0sIFsxNjA1NzU4MjAxLjQyMzE4LCAyNjAzLCAxLjIwMzA0MDM2MTQwNDQxOV0sIFsxNjA1NzU4MjAxLjQzNjk1MSwgMjYwNCwgMS4yMjY4OTY3NjI4NDc5MDA0XSwgWzE2MDU3NTgyMDEuNTU1NDExLCAyNjE0LCAxLjEyMDQ1MDAxOTgzNjQyNThdLCBbMTYwNTc1ODIwMS41NzkzODcsIDI2MTYsIDEuMTc1MTQ2NTc5NzQyNDMxNl0sIFsxNjA1NzU4MjAxLjYyNzQzOSwgMjYyMCwgMS4xMjQ1MjQzNTQ5MzQ2OTI0XSwgWzE2MDU3NTgyMDEuNjM5NDA5LCAyNjIxLCAxLjA5NDMwNTUxNTI4OTMwNjZdLCBbMTYwNTc1ODIwMS44MDk3MjMsIDI2MzUsIDEuMTMwNDY0MTk2MjA1MTM5Ml0sIFsxNjA1NzU4MjAxLjg4MzY5MywgMjY0MSwgMS4yMDQ2MTQ0MDA4NjM2NDc1XSwgWzE2MDU3NTgyMDEuOTQ2NDY0LCAyNjQ2LCAxLjMwNDcwNzI4ODc0MjA2NTRdLCBbMTYwNTc1ODIwMS45NzEyNTcsIDI2NDgsIDEuMjcwNDE3MDk0MjMwNjUxOV0sIFsxNjA1NzU4MjAxLjk5Njg1MywgMjY1MCwgMS4zNTY5NTIxOTAzOTkxN10sIFsxNjA1NzU4MjAyLjAyNDI5OCwgMjY1MiwgMS4zNDI1NzU1NTAwNzkzNDU3XSwgWzE2MDU3NTgyMDIuMTg0MTY0LCAyNjY1LCAxLjM2ODQ4MDIwNTUzNTg4ODddLCBbMTYwNTc1ODIwMi4yMzI0MjUsIDI2NjksIDEuMzI5NTEzMDcyOTY3NTI5M10sIFsxNjA1NzU4MjAyLjI1Nzk2OSwgMjY3MSwgMS4zMjU4ODIwNzcyMTcxMDJdLCBbMTYwNTc1ODIwMi4yOTQ2MDYsIDI2NzQsIDEuMzY4ODQwMzM2Nzk5NjIxNl0sIFsxNjA1NzU4MjAyLjQyMjgwOCwgMjY4NCwgMS4zMDk0MDUwODg0MjQ2ODI2XSwgWzE2MDU3NTgyMDIuNTQ0NDc2LCAyNjk0LCAxLjI3ODQ0MDM1NjI1NDU3NzZdLCBbMTYwNTc1ODIwMi41NjgxMjgsIDI2OTYsIDEuMzY1MzM4NjgzMTI4MzU3XSwgWzE2MDU3NTgyMDIuNzEzNzksIDI3MDgsIDEuMjQ2ODQ0NjQ5MzE0ODgwNF0sIFsxNjA1NzU4MjAyLjcyNjA0MywgMjcwOSwgMS4yNTQ1NjA0NzA1ODEwNTQ3XSwgWzE2MDU3NTgyMDIuNzM4MzU5LCAyNzEwLCAxLjI0NTEzMjgwMzkxNjkzMTJdLCBbMTYwNTc1ODIwMy4yMTY1NjIsIDI3MTgsIDEuMTU0MjU3MDU5MDk3MjldLCBbMTYwNTc1ODIwMy4zMTA2NjMsIDI3MjQsIDEuMTM4MjU5NjQ5Mjc2NzMzNF0sIFsxNjA1NzU4MjAzLjU3MTU5NCwgMjc0MSwgMS4wOTc1Mjg1NzY4NTA4OTExXSwgWzE2MDU3NTgyMDMuNjY3NjU0LCAyNzQ3LCAxLjEzNzk3NzYwMDA5NzY1NjJdLCBbMTYwNTc1ODIwMy42ODg0NzgsIDI3NDgsIDEuMTQ3MDQyMjc0NDc1MDk3N10sIFsxNjA1NzU4MjAzLjgwMjg3MiwgMjc1NiwgMS4xNjMxNjMwNjU5MTAzMzk0XSwgWzE2MDU3NTgyMDMuODkwMTYzLCAyNzYyLCAxLjIwMTg3NjE2MzQ4MjY2Nl0sIFsxNjA1NzU4MjAzLjk3NjkxOSwgMjc2OCwgMS4yNDM1MTQ4OTU0MzkxNDhdLCBbMTYwNTc1ODIwNC4wNTA4MjcsIDI3NzMsIDEuMTg1MzM1MTU5MzAxNzU3OF0sIFsxNjA1NzU4MjA0LjQyOTU2NCwgMjc5NiwgMS4yNTIxNDEzNTY0NjgyMDA3XSwgWzE2MDU3NTgyMDQuNDU5NzYxLCAyNzk4LCAxLjIzMzIyMTI5MjQ5NTcyNzVdLCBbMTYwNTc1ODIwNC41MzMzNTYsIDI4MDMsIDEuMjE5NjA1MzI2NjUyNTI2OV0sIFsxNjA1NzU4MjA0LjYwNTQ0MiwgMjgwOCwgMS4yNTgxNjU4MzYzMzQyMjg1XSwgWzE2MDU3NTgyMDQuODAzMjczLCAyODIxLCAxLjI0ODg2NjMxOTY1NjM3Ml0sIFsxNjA1NzU4MjA0LjkxMTE3NSwgMjgyOCwgMS4yMjI5MDE4MjExMzY0NzQ2XSwgWzE2MDU3NTgyMDUuNDcxMTcsIDI4NDMsIDEuMTUxODc0MDY1Mzk5MTddLCBbMTYwNTc1ODIwNS42MTI4NSwgMjg1NSwgMS4xMjE4NDM1NzY0MzEyNzQ0XSwgWzE2MDU3NTgyMDUuNjQ4NywgMjg1OCwgMS4xMjY2MzQxMjA5NDExNjJdLCBbMTYwNTc1ODIwNS43MjE4MzYsIDI4NjQsIDEuMTY3NzczMjQ2NzY1MTM2N10sIFsxNjA1NzU4MjA1LjgxOTQwOSwgMjg3MiwgMS4yMTY3OTg5MDE1NTc5MjI0XSwgWzE2MDU3NTgyMDUuODMxMzMyLCAyODczLCAxLjIzNDczNDc3MzYzNTg2NDNdLCBbMTYwNTc1ODIwNS44NTUyNDYsIDI4NzUsIDEuMjcyODUwNzUxODc2ODMxXSwgWzE2MDU3NTgyMDUuOTY0OTk1LCAyODg0LCAxLjIzNzI0MzUzMzEzNDQ2MDRdLCBbMTYwNTc1ODIwNi4yNTA5OTYsIDI5MDcsIDEuMTg1NTUxMTY2NTM0NDIzOF0sIFsxNjA1NzU4MjA2LjI2MzcxOCwgMjkwOCwgMS4yMTI0OTM3NzcyNzUwODU0XSwgWzE2MDU3NTgyMDYuMjc1NzAyLCAyOTA5LCAxLjE5MjMxNzk2MjY0NjQ4NDRdLCBbMTYwNTc1ODIwNi4zNjQ4ODMsIDI5MTYsIDEuMTkxMzgwMDIzOTU2Mjk4OF0sIFsxNjA1NzU4MjA2LjUwNDI3OSwgMjkyNywgMS4yMzQ4Nzg1NDAwMzkwNjI1XSwgWzE2MDU3NTgyMDYuNTI3ODA0LCAyOTI5LCAxLjE5ODMxNzI4OTM1MjQxN10sIFsxNjA1NzU4MjA2LjY2OTgyMiwgMjk0MSwgMS4yNTM0MjE0MjU4MTkzOTddLCBbMTYwNTc1ODIwNi42ODE5OTMsIDI5NDIsIDEuMjA2MTY2NzQ0MjMyMTc3N10sIFsxNjA1NzU4MjA2LjcxNzg3NywgMjk0NSwgMS4yMzk2NzA2MzQyNjk3MTQ0XSwgWzE2MDU3NTgyMDYuNzQxODQ5LCAyOTQ3LCAxLjIyMzg0MTc4NjM4NDU4MjVdLCBbMTYwNTc1ODIwNi43NTM5ODQsIDI5NDgsIDEuMjE1NTcyNTk1NTk2MzEzNV0sIFsxNjA1NzU4MjA3LjUyNzM4OSwgMjk3NywgMS4xNzg2MTUzMzE2NDk3ODAzXSwgWzE2MDU3NTgyMDcuNjkyODQ3LCAyOTg5LCAxLjIzMjgyMjI5OTAwMzYwMV0sIFsxNjA1NzU4MjA3LjcwNjU0NiwgMjk5MCwgMS4yNDY3MTk1OTg3NzAxNDE2XSwgWzE2MDU3NTgyMDcuODM0MjgxLCAyOTk5LCAxLjI3MzEyNjEyNTMzNTY5MzRdLCBbMTYwNTc1ODIwNy45MTk1NywgMzAwNSwgMS4yODUwMzA3MjI2MTgxMDNdLCBbMTYwNTc1ODIwNy45NjI3ODEsIDMwMDgsIDEuMjUyMDQ5NDQ2MTA1OTU3XSwgWzE2MDU3NTgyMDguMDUxMzk2LCAzMDE0LCAxLjIzNTA1MDIwMTQxNjAxNTZdLCBbMTYwNTc1ODIwOC4xMTA1NDcsIDMwMTgsIDEuMjIxMTUzMTQwMDY4MDU0Ml0sIFsxNjA1NzU4MjA4LjM1NzU1OSwgMzAzNSwgMS4xNTQwNjgzNTA3OTE5MzEyXSwgWzE2MDU3NTgyMDguMzg3ODEsIDMwMzcsIDEuMTI5MzIyMjkwNDIwNTMyMl0sIFsxNjA1NzU4MjA4LjQwMjc0NiwgMzAzOCwgMS4xMzcyODk3NjI0OTY5NDgyXSwgWzE2MDU3NTgyMDguNDE2MTUxLCAzMDM5LCAxLjEwNzMxNjEzNjM2MDE2ODVdLCBbMTYwNTc1ODIwOC41Nzg4NTQsIDMwNTAsIDEuMTM3ODQwMDMyNTc3NTE0Nl0sIFsxNjA1NzU4MjA5LjIwNTM0MiwgMzA2OCwgMS4xMjQ5MDQzOTQxNDk3ODAzXSwgWzE2MDU3NTgyMDkuNDI5OTMyLCAzMDg1LCAxLjEzMzk1MjYxNzY0NTI2MzddLCBbMTYwNTc1ODIwOS41MjAwMTYsIDMwOTIsIDEuMTI2NzI2NTA4MTQwNTY0XSwgWzE2MDU3NTgyMDkuNTMyMTEyLCAzMDkzLCAxLjE1NzA4ODk5NDk3OTg1ODRdLCBbMTYwNTc1ODIwOS41NjgxODgsIDMwOTYsIDEuMTg0NTYyOTIxNTI0MDQ3OV0sIFsxNjA1NzU4MjA5Ljc2NDQ2OSwgMzExMiwgMS4yNTUzOTQ5MzU2MDc5MTAyXSwgWzE2MDU3NTgyMDkuODEyODYxLCAzMTE2LCAxLjI5MDkyNjY5NDg2OTk5NTFdLCBbMTYwNTc1ODIwOS44NzI1MDMsIDMxMjEsIDEuMjY1Njg0ODQzMDYzMzU0NV0sIFsxNjA1NzU4MjA5Ljg5NjA2MiwgMzEyMywgMS4yMjQ0NjI5ODU5OTI0MzE2XSwgWzE2MDU3NTgyMDkuOTE4NjE5LCAzMTI1LCAxLjI1MjA3OTYwNjA1NjIxMzRdLCBbMTYwNTc1ODIwOS45NDIxNTEsIDMxMjcsIDEuMTc1NjI1MDg1ODMwNjg4NV0sIFsxNjA1NzU4MjA5Ljk2NTQzMiwgMzEyOSwgMS4yMDgxODMyODg1NzQyMTg4XSwgWzE2MDU3NTgyMTAuMDEzNjk0LCAzMTMzLCAxLjIxNTE0NDg3MjY2NTQwNTNdLCBbMTYwNTc1ODIxMC4wMjcxMTgsIDMxMzQsIDEuMTg3NDM5NDQxNjgwOTA4Ml0sIFsxNjA1NzU4MjEwLjE2MzAwMSwgMzE0NSwgMS4wOTkxNjMyOTM4Mzg1MDFdLCBbMTYwNTc1ODIxMC4yMDA4NywgMzE0OCwgMS4xMDg3OTQ2ODkxNzg0NjY4XSwgWzE2MDU3NTgyMTAuMzAxOTM0LCAzMTU2LCAxLjExMjU5NTU1ODE2NjUwNF0sIFsxNjA1NzU4MjEwLjMzOTUyNCwgMzE1OSwgMS4xMDQ5NzI5NTg1NjQ3NTgzXSwgWzE2MDU3NTgyMTAuNDQ4MDMzLCAzMTY4LCAxLjE4NjczMDAyNzE5ODc5MTVdLCBbMTYwNTc1ODIxMC42MzM4NjUsIDMxODMsIDEuMjAwNjM1NTUyNDA2MzExXSwgWzE2MDU3NTgyMTEuMDQ2MDIzLCAzMTg3LCAxLjIxMDU5MDgzOTM4NTk4NjNdLCBbMTYwNTc1ODIxMS4wNzM1MTUsIDMxODksIDEuMTgyMTE2NjI3NjkzMTc2M10sIFsxNjA1NzU4MjExLjI3NDU3MiwgMzIwNCwgMS4wOTkxMDYwNzMzNzk1MTY2XSwgWzE2MDU3NTgyMTEuNDU0MTQzLCAzMjE3LCAxLjE0NTAxMTE4NjU5OTczMTRdLCBbMTYwNTc1ODIxMS43NjYzOTUsIDMyNDAsIDEuMjczNzYxNjMwMDU4Mjg4Nl0sIFsxNjA1NzU4MjExLjk2NzQ4MSwgMzI1NSwgMS4xOTAyOTkwMzQxMTg2NTIzXSwgWzE2MDU3NTgyMTEuOTgwOTg0LCAzMjU2LCAxLjEyMjk0NTY2NjMxMzE3MTRdLCBbMTYwNTc1ODIxMi4wNjE1NjEsIDMyNjIsIDEuMTAyNDQwNTk1NjI2ODMxXSwgWzE2MDU3NTgyMTIuMDc0Nzc5LCAzMjYzLCAxLjA4MzIzODYwMTY4NDU3MDNdLCBbMTYwNTc1ODIxMi4xNDE1NzMsIDMyNjgsIDEuMDIzNTUwNzQ4ODI1MDczMl0sIFsxNjA1NzU4MjEyLjIwODI0NiwgMzI3MywgMS4wMTM1NTk4MTgyNjc4MjIzXSwgWzE2MDU3NTgyMTIuMjYxODE5LCAzMjc3LCAwLjk4NjMyODI0NDIwOTI4OTZdLCBbMTYwNTc1ODIxMi4yODg2MTIsIDMyNzksIDAuOTgyMjE0ODY4MDY4Njk1MV0sIFsxNjA1NzU4MjEyLjUwMDkyOCwgMzI5NSwgMS4wODg3MDg1MTk5MzU2MDhdLCBbMTYwNTc1ODIxMy4wMDY2NDUsIDMzMDYsIDEuMjg0ODI2OTkzOTQyMjYwN10sIFsxNjA1NzU4MjEzLjA5MDE2OSwgMzMxMywgMS4zMjkxMTEwOTkyNDMxNjRdLCBbMTYwNTc1ODIxMy4xMDIzNjksIDMzMTQsIDEuMzM3MTYwMTEwNDczNjMyOF0sIFsxNjA1NzU4MjEzLjE4Njc1MiwgMzMyMSwgMS4zMzgxMTY2NDU4MTI5ODgzXSwgWzE2MDU3NTgyMTMuMjIyNjc2LCAzMzI0LCAxLjI3NzUwODQ5NzIzODE1OTJdLCBbMTYwNTc1ODIxMy41MTk2NTUsIDMzNDgsIDEuMDQ2OTY0Mjg3NzU3ODczNV0sIFsxNjA1NzU4MjEzLjU2NDI2MywgMzM1MSwgMS4wNTcxMjE3NTM2OTI2MjddLCBbMTYwNTc1ODIxMy42NTE3NzcsIDMzNTgsIDEuMDk1MjAwMzAwMjE2Njc0OF0sIFsxNjA1NzU4MjEzLjY4OTAzNywgMzM2MSwgMS4wOTEyNDE1OTgxMjkyNzI1XSwgWzE2MDU3NTgyMTMuNzAxNDA4LCAzMzYyLCAxLjE1MTU1OTgyOTcxMTkxNF0sIFsxNjA1NzU4MjEzLjcyNTc5MywgMzM2NCwgMS4xMjY4MzExNzM4OTY3ODk2XSwgWzE2MDU3NTgyMTMuNzM3OTMyLCAzMzY1LCAxLjEzMTI5MjQ2MjM0ODkzOF0sIFsxNjA1NzU4MjEzLjk5OTkyMSwgMzM4NSwgMS4xODc5NDYyMDAzNzA3ODg2XSwgWzE2MDU3NTgyMTQuMDYxNDY4LCAzMzkwLCAxLjE1MjQ0NzkzODkxOTA2NzRdLCBbMTYwNTc1ODIxNC4xNjkwMzYsIDMzOTksIDEuMTM0NjQ0MDMxNTI0NjU4Ml0sIFsxNjA1NzU4MjE0LjE5MjU5NiwgMzQwMSwgMS4xMTUwODYzMTcwNjIzNzhdLCBbMTYwNTc1ODIxNC4yMTY0MzcsIDM0MDMsIDEuMTMzNzA1Mzc3NTc4NzM1NF0sIFsxNjA1NzU4MjE0Ljg1ODQ3MywgMzQyMywgMS4xMzYwMTE4Mzg5MTI5NjM5XSwgWzE2MDU3NTgyMTQuOTc4Nzk3LCAzNDMxLCAxLjE3MDIyNTE0MzQzMjYxNzJdLCBbMTYwNTc1ODIxNS4xOTgsIDM0NDUsIDEuMTk2NTc4MzgzNDQ1NzM5N10sIFsxNjA1NzU4MjE1LjIxNDc3NywgMzQ0NiwgMS4xNzg4MTczOTEzOTU1Njg4XSwgWzE2MDU3NTgyMTUuMjkwMzE3LCAzNDUxLCAxLjE2NDkxMDA3ODA0ODcwNl0sIFsxNjA1NzU4MjE1LjM2Njg0NCwgMzQ1NiwgMS4xNzU3OTAxOTA2OTY3MTYzXSwgWzE2MDU3NTgyMTUuNDc2MTEyLCAzNDYzLCAxLjE1OTc5ODAyNjA4NDldLCBbMTYwNTc1ODIxNS42NjAwMDUsIDM0NzUsIDEuMTQxOTYwNjIwODgwMTI3XSwgWzE2MDU3NTgyMTUuOTE3NTE0LCAzNDkyLCAxLjEyNzEyNjkzMjE0NDE2NV0sIFsxNjA1NzU4MjE1Ljk0NzU3NSwgMzQ5NCwgMS4xMTIzNzgxMjA0MjIzNjMzXSwgWzE2MDU3NTgyMTUuOTc3NDM5LCAzNDk2LCAxLjEyMDYzODEzMjA5NTMzN10sIFsxNjA1NzU4MjE2LjAyNDU0NiwgMzQ5OSwgMS4xMjYwNjc4NzY4MTU3OTZdLCBbMTYwNTc1ODIxNi4xMDExODEsIDM1MDQsIDEuMTQ1MTc3ODQxMTg2NTIzNF0sIFsxNjA1NzU4MjE2LjM1NTU5NiwgMzUyMSwgMS4xNjgxMDUxMjU0MjcyNDZdLCBbMTYwNTc1ODIxNi40MjcxNDIsIDM1MjYsIDEuMTU1MDc4MTcyNjgzNzE1OF0sIFsxNjA1NzU4MjE3LjA5NjA1NiwgMzU0OCwgMS4xMTg5MjUzMzMwMjMwNzEzXSwgWzE2MDU3NTgyMTcuMTMyMjc4LCAzNTUxLCAxLjA5MDkwMTg1MTY1NDA1MjddLCBbMTYwNTc1ODIxNy4xOTQ0MDIsIDM1NTYsIDEuMDg5OTk3MDUzMTQ2MzYyM10sIFsxNjA1NzU4MjE3LjI4NDI3OSwgMzU2MywgMS4xMzQ5MDgzMTg1MTk1OTIzXSwgWzE2MDU3NTgyMTcuMzM0MjM1LCAzNTY3LCAxLjA5OTA1Njk1OTE1MjIyMTddLCBbMTYwNTc1ODIxNy4zNTc2ODQsIDM1NjksIDEuMTE1NDgxNjE1MDY2NTI4M10sIFsxNjA1NzU4MjE3LjQzNDQzMSwgMzU3NSwgMS4xMTE4NjMyNTU1MDA3OTM1XSwgWzE2MDU3NTgyMTcuNDQ3MzUyLCAzNTc2LCAxLjExMzQ4NjI4OTk3ODAyNzNdLCBbMTYwNTc1ODIxNy41MjE1NzIsIDM1ODIsIDEuMTI1MDU3NDU4ODc3NTYzNV0sIFsxNjA1NzU4MjE3LjYxNTgxMiwgMzU4OSwgMS4xMTMxMzQxNDU3MzY2OTQzXSwgWzE2MDU3NTgyMTcuNjkyMDY1LCAzNTk1LCAxLjExNjI4OTEzODc5Mzk0NTNdLCBbMTYwNTc1ODIxNy43MzA1NiwgMzU5OCwgMS4xMjMzNjg2MjA4NzI0OTc2XSwgWzE2MDU3NTgyMTcuOTQ0MDQ2LCAzNjE1LCAxLjA4MTM0MjgxNjM1Mjg0NDJdLCBbMTYwNTc1ODIxNy45NjkxMjYsIDM2MTcsIDEuMDY2MTUxNzM4MTY2ODA5XSwgWzE2MDU3NTgyMTguMDk0NjQ4LCAzNjI3LCAxLjEwMzczMDQ0MDEzOTc3MDVdLCBbMTYwNTc1ODIxOC4xMzI5NTUsIDM2MzAsIDEuMTU2MzQwNzE4MjY5MzQ4MV0sIFsxNjA1NzU4MjE4LjE1NzIzMywgMzYzMiwgMS4xMDY1OTIxNzgzNDQ3MjY2XSwgWzE2MDU3NTgyMTguMjIyNTc2LCAzNjM3LCAxLjA5MzM2NjAyNjg3ODM1N10sIFsxNjA1NzU4MjE4LjQyNDc1OSwgMzY1MywgMS4xMDIyOTU4NzU1NDkzMTY0XSwgWzE2MDU3NTgyMTguNDUwMjg1LCAzNjU1LCAxLjEyMDUwNDYxNzY5MTA0XSwgWzE2MDU3NTgyMTguOTA4ODU1LCAzNjYxLCAxLjA3OTExMzQ4MzQyODk1NV0sIFsxNjA1NzU4MjE4Ljk2MzU0NywgMzY2NSwgMS4xMDc1Njk2OTQ1MTkwNDNdLCBbMTYwNTc1ODIxOC45OTI2MDMsIDM2NjcsIDEuMTEyNzMyMTcyMDEyMzI5XSwgWzE2MDU3NTgyMTkuMjAyNTU3LCAzNjgxLCAxLjEwNTA5MTU3MTgwNzg2MTNdLCBbMTYwNTc1ODIxOS40NDYwMTIsIDM2OTgsIDEuMDg5NDE5MzY0OTI5MTk5Ml0sIFsxNjA1NzU4MjE5LjYxODIsIDM3MTAsIDEuMDgxNTg0MjE1MTY0MTg0Nl0sIFsxNjA1NzU4MjE5LjcyOTcxNiwgMzcxNywgMS4wOTUxMDg2MjgyNzMwMTAzXSwgWzE2MDU3NTgyMTkuNzQ1NjQ2LCAzNzE4LCAxLjA4MzQ2MTk5OTg5MzE4ODVdLCBbMTYwNTc1ODIxOS45ODk3ODcsIDM3MzYsIDEuMTE0MzI0OTI3MzMwMDE3XSwgWzE2MDU3NTgyMjAuMDE3MDg5LCAzNzM4LCAxLjExMzYwMjYzODI0NDYyOV0sIFsxNjA1NzU4MjIwLjA0NTAyOCwgMzc0MCwgMS4wOTcyNDgwNzczOTI1NzgxXSwgWzE2MDU3NTgyMjAuMDgyNjc5LCAzNzQzLCAxLjA3ODE4MzY1MDk3MDQ1OV0sIFsxNjA1NzU4MjIwLjEyMDYyNSwgMzc0NiwgMS4wMzg2MzIyNzM2NzQwMTEyXSwgWzE2MDU3NTgyMjAuMzM4MDk5LCAzNzYzLCAxLjA2NTM0ODg2MzYwMTY4NDZdLCBbMTYwNTc1ODIyMC40NzIxODgsIDM3NzQsIDEuMDg1NjUzNzgxODkwODY5MV0sIFsxNjA1NzU4MjIwLjQ4MTgwNywgMzc3NSwgMS4wODE0ODEyMTgzMzgwMTI3XSwgWzE2MDU3NTgyMjAuOTI5NzA0LCAzNzgxLCAxLjA0NDQyNjc5ODgyMDQ5NTZdLCBbMTYwNTc1ODIyMS4wMTcwNTUsIDM3ODgsIDEuMDkyMzYyNjQyMjg4MjA4XSwgWzE2MDU3NTgyMjEuMzM1NTEyLCAzODEyLCAxLjA2OTc0NzkyNDgwNDY4NzVdLCBbMTYwNTc1ODIyMS40MTI3NzgsIDM4MTgsIDEuMDM0Mjg2OTc1ODYwNTk1N10sIFsxNjA1NzU4MjIxLjQzOTE1NSwgMzgyMCwgMS4wOTQwMzQ0MzMzNjQ4NjgyXSwgWzE2MDU3NTgyMjEuNzEwODA2LCAzODQxLCAxLjA2ODU0MzA3NjUxNTE5NzhdLCBbMTYwNTc1ODIyMS43NDg0MTIsIDM4NDQsIDEuMDg0MjMxMjU3NDM4NjU5N10sIFsxNjA1NzU4MjIxLjc5NzE2NCwgMzg0OCwgMS4wNDcyMzczOTYyNDAyMzQ0XSwgWzE2MDU3NTgyMjEuODA5MDk3LCAzODQ5LCAxLjAyNTQ3MjY0MDk5MTIxMV0sIFsxNjA1NzU4MjIxLjgyMjYyMywgMzg1MCwgMS4wMjE4MDU1MjQ4MjYwNDk4XSwgWzE2MDU3NTgyMjEuODk5MDQ3LCAzODU2LCAxLjA0MjQwMTMxMzc4MTczODNdLCBbMTYwNTc1ODIyMS45MzU2MjIsIDM4NTksIDEuMTA3MjkwNTA2MzYyOTE1XSwgWzE2MDU3NTgyMjEuOTYxMzU5LCAzODYxLCAxLjA4ODA0ODQ1ODA5OTM2NTJdLCBbMTYwNTc1ODIyMi4wNzYzNTIsIDM4NzAsIDEuMDMwMTQwMTYxNTE0MjgyMl0sIFsxNjA1NzU4MjIyLjE2MDk1NiwgMzg3NywgMS4wNzUyMDI5NDE4OTQ1MzEyXSwgWzE2MDU3NTgyMjIuMzIxOTcsIDM4OTAsIDEuMDI2MDgwNjA4MzY3OTJdLCBbMTYwNTc1ODIyMi43MzgxMiwgMzg5NCwgMS4wMTgxNDk2MTQzMzQxMDY0XSwgWzE2MDU3NTgyMjIuODA0MTMzLCAzODk4LCAxLjAyNjUxNTg0MTQ4NDA2OThdLCBbMTYwNTc1ODIyMy4wMzIxODEsIDM5MTEsIDEuMDI2NjIwODY0ODY4MTY0XSwgWzE2MDU3NTgyMjMuMDY1NDgyLCAzOTEzLCAxLjA1MDk5NTM0OTg4NDAzMzJdLCBbMTYwNTc1ODIyMy4xMTUyOTIsIDM5MTYsIDEuMDgwMDMxMTU2NTM5OTE3XSwgWzE2MDU3NTgyMjMuMzA3NDE1LCAzOTI4LCAxLjAwMzYyNDkxNjA3NjY2MDJdLCBbMTYwNTc1ODIyMy4zNjk1MjEsIDM5MzIsIDEuMDQ3NDQ2ODQ2OTYxOTc1XSwgWzE2MDU3NTgyMjMuNDQ3MzY2LCAzOTM3LCAxLjA2NjI5MTU3MDY2MzQ1MjFdLCBbMTYwNTc1ODIyMy40Nzc0NjgsIDM5MzksIDEuMTA2NjczMjQwNjYxNjIxXSwgWzE2MDU3NTgyMjMuNjMxNTA1LCAzOTQ5LCAxLjAyMjA1MTY5MjAwODk3MjJdLCBbMTYwNTc1ODIyMy42NjM4MzIsIDM5NTEsIDEuMDUzMjY5Mzg2MjkxNTA0XSwgWzE2MDU3NTgyMjMuNjk2MzQ2LCAzOTUzLCAxLjA4MjMzNzczNzA4MzQzNV0sIFsxNjA1NzU4MjIzLjkxNDQ2NiwgMzk2NiwgMC45OTE0NDA3NzMwMTAyNTM5XSwgWzE2MDU3NTgyMjQuMTcxODIzLCAzOTgyLCAxLjAxNjYyNTE2NTkzOTMzMV0sIFsxNjA1NzU4MjI0LjI0ODIzNSwgMzk4NywgMS4wMzI3NzQ2ODY4MTMzNTQ1XSwgWzE2MDU3NTgyMjQuMzU3NTY3LCAzOTk0LCAxLjA3MjE5MDc2MTU2NjE2Ml0sIFsxNjA1NzU4MjI1LjEzMDQ4NiwgNDAxOSwgMS4wMjEwODMzNTQ5NDk5NTEyXSwgWzE2MDU3NTgyMjUuMTQ0NDc0LCA0MDIwLCAwLjk3NTgyMTYxNDI2NTQ0MTldLCBbMTYwNTc1ODIyNS4xNTcxNjIsIDQwMjEsIDEuMDE2Njk4NTk4ODYxNjk0M10sIFsxNjA1NzU4MjI1LjI1NTgxMiwgNDAyOCwgMS4wNTE0NDc2Mjk5Mjg1ODg5XSwgWzE2MDU3NTgyMjUuMzg5OTg5LCA0MDM4LCAxLjAyMzQ1Nzc2NTU3OTIyMzZdLCBbMTYwNTc1ODIyNS40OTQ2MywgNDA0NiwgMS4wMjMwOTk1NDE2NjQxMjM1XSwgWzE2MDU3NTgyMjUuNTgzNjM0LCA0MDUzLCAxLjAyNDk1MzYwMzc0NDUwNjhdLCBbMTYwNTc1ODIyNS42MzMzMywgNDA1NywgMC45NzY1NjI5MTcyMzI1MTM0XSwgWzE2MDU3NTgyMjUuNzc2NTM3LCA0MDY4LCAxLjA1MzY2NjExNDgwNzEyOV0sIFsxNjA1NzU4MjI1Ljg1MDYzNSwgNDA3NCwgMS4wMTc3MTU2OTI1MjAxNDE2XSwgWzE2MDU3NTgyMjUuOTIzNTQ5LCA0MDgwLCAxLjA1MTc5MzIxNzY1ODk5NjZdLCBbMTYwNTc1ODIyNi4xNTYzNSwgNDA5OCwgMS4wMzYyOTU0MTM5NzA5NDczXSwgWzE2MDU3NTgyMjYuMjA4OTc5LCA0MTAyLCAxLjAxNjc0MjgyNTUwODExNzddLCBbMTYwNTc1ODIyNi4zNDYxODEsIDQxMTMsIDAuOTk2MDM5ODY3NDAxMTIzXSwgWzE2MDU3NTgyMjYuNDA1Mzk4LCA0MTE4LCAxLjAzODA2MTg1NzIyMzUxMDddLCBbMTYwNTc1ODIyNi40NzM1NTYsIDQxMjMsIDAuOTk4ODc3NjQ0NTM4ODc5NF0sIFsxNjA1NzU4MjI2LjUyMTI5MywgNDEyNywgMC45ODE2NTUwNjEyNDQ5NjQ2XSwgWzE2MDU3NTgyMjYuNTMzNDMzLCA0MTI4LCAwLjk5NjcyNDI0NzkzMjQzNDFdLCBbMTYwNTc1ODIyNy4wNzY5MjUsIDQxMzksIDEuMDc5OTA2NDYzNjIzMDQ2OV0sIFsxNjA1NzU4MjI3LjA5MjkyMywgNDE0MCwgMC45OTk5NjkxMjQ3OTQwMDYzXSwgWzE2MDU3NTgyMjcuMjc1OTU2LCA0MTUxLCAxLjAzNDY2MjYwNDMzMTk3MDJdLCBbMTYwNTc1ODIyNy4zMTAxNjQsIDQxNTMsIDEuMDEyMzkyOTk3NzQxNjk5Ml0sIFsxNjA1NzU4MjI3LjMyNTg4NSwgNDE1NCwgMS4wNDQ2MjAzOTQ3MDY3MjZdLCBbMTYwNTc1ODIyNy40NDA4MDksIDQxNjEsIDEuMDI5OTg3NTczNjIzNjU3Ml0sIFsxNjA1NzU4MjI3LjQ4NTkzNSwgNDE2NCwgMC45ODUyMDMxNDY5MzQ1MDkzXSwgWzE2MDU3NTgyMjcuNTAyODQ4LCA0MTY1LCAwLjk2MzA1NjMyNTkxMjQ3NTZdLCBbMTYwNTc1ODIyNy41MTkxOSwgNDE2NiwgMC45NDkzMzMxMzEzMTMzMjRdLCBbMTYwNTc1ODIyNy45Nzk3ODgsIDQxOTQsIDEuMDI3OTA5MTU5NjYwMzM5NF0sIFsxNjA1NzU4MjI4LjE5NjA3NywgNDIxMSwgMC45ODg5NjQyMDAwMTk4MzY0XSwgWzE2MDU3NTgyMjguMjU5NTIsIDQyMTYsIDAuOTU5NjM0NDIzMjU1OTIwNF0sIFsxNjA1NzU4MjI4LjI3MTk1OSwgNDIxNywgMC45NzE3MTk2ODIyMTY2NDQzXSwgWzE2MDU3NTgyMjguMjk4MTY0LCA0MjE5LCAwLjk5NTAxNTkxOTIwODUyNjZdLCBbMTYwNTc1ODIyOC40MDA3ODIsIDQyMjcsIDAuOTk2Mzg2NTI4MDE1MTM2N10sIFsxNjA1NzU4MjI5LjUwNDUxMiwgNDI4NSwgMC45Nzc5NjA3NjUzNjE3ODU5XSwgWzE2MDU3NTgyMjkuNjkyMzQ3LCA0MzAwLCAxLjAwOTY4OTY4ODY4MjU1NjJdLCBbMTYwNTc1ODIyOS44NDA4OTcsIDQzMTEsIDEuMDE0MTMwMzUzOTI3NjEyM10sIFsxNjA1NzU4MjI5Ljg1Mzk5NCwgNDMxMiwgMC45NzY2NTQ4ODcxOTk0MDE5XSwgWzE2MDU3NTgyMjkuODc4NDUsIDQzMTQsIDAuOTI5MTY1ODk5NzUzNTcwNl0sIFsxNjA1NzU4MjI5LjkwMjU0OCwgNDMxNiwgMC45ODE4NTYzNDYxMzAzNzExXSwgWzE2MDU3NTgyMjkuOTM4Nzg1LCA0MzE5LCAwLjk4MzU5NjA4NjUwMjA3NTJdLCBbMTYwNTc1ODIyOS45NTExMzQsIDQzMjAsIDAuOTg3MTQ5Mjk4MTkxMDcwNl0sIFsxNjA1NzU4MjI5Ljk3NzYxMiwgNDMyMiwgMS4wMDgxMzY5ODc2ODYxNTcyXSwgWzE2MDU3NTgyMzAuMzA1ODM3LCA0MzQ1LCAxLjAyNDY4NjMzNjUxNzMzNF0sIFsxNjA1NzU4MjMwLjM3NTEyLCA0MzUwLCAwLjk3ODAwODQ0OTA3NzYwNjJdLCBbMTYwNTc1ODIzMC40MTU3MTUsIDQzNTMsIDAuOTc1NjM4MDMxOTU5NTMzN10sIFsxNjA1NzU4MjMwLjUyNTIzMiwgNDM2MSwgMC45NDY1NjQ0MzU5NTg4NjIzXSwgWzE2MDU3NTgyMzEuMDM0MzMxLCA0MzcyLCAxLjAyNTU1NTYxMDY1NjczODNdLCBbMTYwNTc1ODIzMS4xNDIyNzksIDQzODEsIDAuOTY3MjQ4MzgwMTg0MTczNl0sIFsxNjA1NzU4MjMxLjE3OTU3NywgNDM4NCwgMC45NzM3NDQ1NzEyMDg5NTM5XSwgWzE2MDU3NTgyMzEuMTkyMDA4LCA0Mzg1LCAxLjAwMzgxNTY1MDkzOTk0MTRdLCBbMTYwNTc1ODIzMS4zMDI5NTIsIDQzOTQsIDAuOTk2ODM1NzY4MjIyODA4OF0sIFsxNjA1NzU4MjMxLjM3Njc1LCA0NDAwLCAwLjk3MjI3MTg1OTY0NTg0MzVdLCBbMTYwNTc1ODIzMS41NzE2ODQsIDQ0MTYsIDAuOTU3NjA2MDc3MTk0MjEzOV0sIFsxNjA1NzU4MjMxLjY0NTg3NywgNDQyMiwgMC45NTY2ODczMzExOTk2NDZdLCBbMTYwNTc1ODIzMS42OTczOTEsIDQ0MjYsIDAuODk3OTQ1MzQ0NDQ4MDg5Nl0sIFsxNjA1NzU4MjMxLjgwNzgwMywgNDQzNSwgMC45NDY4NTc4MTAwMjA0NDY4XSwgWzE2MDU3NTgyMzEuODMyODcyLCA0NDM3LCAwLjk4NTkxNTU0MTY0ODg2NDddLCBbMTYwNTc1ODIzMS45NTgwNSwgNDQ0NiwgMC45NTQ0MTMwNTYzNzM1OTYyXSwgWzE2MDU3NTgyMzIuMDExMzA0LCA0NDUwLCAwLjk5ODg3NDY2NDMwNjY0MDZdLCBbMTYwNTc1ODIzMi4wODY3ODgsIDQ0NTYsIDAuOTQxMjI3NDM2MDY1NjczOF0sIFsxNjA1NzU4MjMyLjE0OTE1NywgNDQ2MSwgMC45ODgwMjI1NjU4NDE2NzQ4XSwgWzE2MDU3NTgyMzIuMjIyNDIsIDQ0NjcsIDAuOTgxODU5MjA3MTUzMzIwM10sIFsxNjA1NzU4MjMyLjMzNTY3NSwgNDQ3NiwgMC45NTQ3MjEwOTMxNzc3OTU0XSwgWzE2MDU3NTgyMzIuNDE4MDE1LCA0NDgzLCAwLjk4NzA2Njg2NDk2NzM0NjJdLCBbMTYwNTc1ODIzMi44MzUzODEsIDQ0ODcsIDAuOTg2MzU0ODg3NDg1NTA0Ml0sIFsxNjA1NzU4MjMyLjk2NjU2NiwgNDQ5NiwgMC45NDE1OTE4NTg4NjM4MzA2XSwgWzE2MDU3NTgyMzMuMTY4NDg0LCA0NTExLCAwLjk0NTI1NDI2NjI2MjA1NDRdLCBbMTYwNTc1ODIzMy4yNjcxMywgNDUxOCwgMC45ODIwMTYxNDYxODMwMTM5XSwgWzE2MDU3NTgyMzMuMzUwMzM0LCA0NTI0LCAwLjk0MjM2OTM0MTg1MDI4MDhdLCBbMTYwNTc1ODIzMy40MDQ4MTEsIDQ1MjgsIDAuOTU3MjA3Nzk4OTU3ODI0N10sIFsxNjA1NzU4MjMzLjQxODA0NSwgNDUyOSwgMC45NzE5NzQzMTMyNTkxMjQ4XSwgWzE2MDU3NTgyMzMuNjczMzE0LCA0NTQ4LCAwLjk5OTgwMTUxNjUzMjg5OF0sIFsxNjA1NzU4MjMzLjY4NjI5MiwgNDU0OSwgMC45NTUyMDY4NzEwMzI3MTQ4XSwgWzE2MDU3NTgyMzMuNzE0MTQsIDQ1NTEsIDAuOTMyNjk2NzAwMDk2MTMwNF0sIFsxNjA1NzU4MjMzLjc5Mzg3MiwgNDU1NywgMC45NjYwOTkwMjM4MTg5Njk3XSwgWzE2MDU3NTgyMzMuODM1NTY4LCA0NTYwLCAxLjAxOTIzNTEzNDEyNDc1NTldLCBbMTYwNTc1ODIzNC4yMjEwNDYsIDQ1ODcsIDAuOTM2Mjk1ODY2OTY2MjQ3Nl0sIFsxNjA1NzU4MjM0LjI5MjE1NywgNDU5MywgMC45MzcwNzAwMTIwOTI1OTAzXSwgWzE2MDU3NTgyMzQuMzQzMDI4LCA0NTk3LCAwLjk2NDgwNTI0NTM5OTQ3NTFdLCBbMTYwNTc1ODIzNC4zNzk1NTgsIDQ2MDAsIDAuOTkwMTAxMzM3NDMyODYxM10sIFsxNjA1NzU4MjM0Ljg1MDYzMiwgNDYwOCwgMC45MzQ4MDMyNDc0NTE3ODIyXSwgWzE2MDU3NTgyMzQuODc3NzUyLCA0NjEwLCAwLjk2ODEzMTAwNTc2NDAwNzZdLCBbMTYwNTc1ODIzNS4xMzA0NDIsIDQ2MjcsIDAuOTM3MzE1MTA2MzkxOTA2N10sIFsxNjA1NzU4MjM1LjE0MzU5OSwgNDYyOCwgMC45ODAyMzY2NDk1MTMyNDQ2XSwgWzE2MDU3NTgyMzUuNDA2NzU4LCA0NjQ3LCAwLjk1ODc1Mzg4MzgzODY1MzZdLCBbMTYwNTc1ODIzNS40MTk3OTgsIDQ2NDgsIDAuOTM0NDE2ODkwMTQ0MzQ4MV0sIFsxNjA1NzU4MjM1LjQ2MDA1MSwgNDY1MSwgMC45NTg3MjE3NTY5MzUxMTk2XSwgWzE2MDU3NTgyMzUuNTU1MDE2LCA0NjU4LCAwLjk2MDA0NzAwNjYwNzA1NTddLCBbMTYwNTc1ODIzNS41ODE2MDksIDQ2NjAsIDAuOTExODgyMDQyODg0ODI2N10sIFsxNjA1NzU4MjM1LjY4NjIyMywgNDY2OCwgMC45Njk4NTExMzYyMDc1ODA2XSwgWzE2MDU3NTgyMzUuNzEyMjQ1LCA0NjcwLCAwLjk1Nzk3NTk4MzYxOTY4OTldLCBbMTYwNTc1ODIzNS43MjUxNzEsIDQ2NzEsIDAuOTgxNzM4NDQ4MTQzMDA1NF0sIFsxNjA1NzU4MjM1Ljg4NjE5OCwgNDY4NCwgMC45MzQxMjc2ODg0MDc4OThdLCBbMTYwNTc1ODIzNS45MTEzNTQsIDQ2ODYsIDAuOTcyNTU4ODU2MDEwNDM3XSwgWzE2MDU3NTgyMzYuMDQzMTcsIDQ2OTYsIDAuOTM2OTcxMzY2NDA1NDg3MV0sIFsxNjA1NzU4MjM2LjA4MDU5NSwgNDY5OSwgMC45NjI4MzYyNjU1NjM5NjQ4XSwgWzE2MDU3NTgyMzYuMjE3NzE0LCA0NzEwLCAwLjkxNjY3NTMyOTIwODM3NF0sIFsxNjA1NzU4MjM2LjI1NTI4LCA0NzEzLCAwLjk2MDE4OTQ2MTcwODA2ODhdLCBbMTYwNTc1ODIzNi4yNzk2MDIsIDQ3MTUsIDAuOTQ0ODc1NTM4MzQ5MTUxNl0sIFsxNjA1NzU4MjM2LjMwMzc4NCwgNDcxNywgMC45MjY1NTI2NTMzMTI2ODMxXSwgWzE2MDU3NTgyMzYuODE2OTEzLCA0NzI5LCAwLjkyMzMzODg5MDA3NTY4MzZdLCBbMTYwNTc1ODIzNy4wMzMwNzUsIDQ3NDYsIDAuOTU3ODM3ODc5NjU3NzQ1NF0sIFsxNjA1NzU4MjM3LjIxNzEsIDQ3NjEsIDAuOTMzNDk2NDc1MjE5NzI2Nl0sIFsxNjA1NzU4MjM3LjI4ODcxNywgNDc2NywgMC45NTYxNzY1MTkzOTM5MjA5XSwgWzE2MDU3NTgyMzcuMzczMTMzLCA0Nzc0LCAwLjk0ODgwMTQ1Nzg4MTkyNzVdLCBbMTYwNTc1ODIzNy40Njk3MzgsIDQ3ODIsIDAuOTMwMzE4NDc0NzY5NTkyM10sIFsxNjA1NzU4MjM3LjUxNzQwNywgNDc4NiwgMC45MzUyNjM2MzM3MjgwMjczXSwgWzE2MDU3NTgyMzcuNjAyMzA2LCA0NzkzLCAwLjk0NDQ1ODcyMzA2ODIzNzNdLCBbMTYwNTc1ODIzNy42MTQwNzQsIDQ3OTQsIDAuOTI0NjczNzk1NzAwMDczMl0sIFsxNjA1NzU4MjM3LjYyNjQxNCwgNDc5NSwgMC45NzIzNTkxODA0NTA0Mzk1XSwgWzE2MDU3NTgyMzcuNzQ1NywgNDgwNSwgMC45NDMwNzExMjY5Mzc4NjYyXSwgWzE2MDU3NTgyMzguMDA1ODgyLCA0ODI2LCAwLjk1MzYyNDQ4NjkyMzIxNzhdLCBbMTYwNTc1ODIzOC4wNjgxMiwgNDgzMSwgMC45ODYyMzQ3ODQxMjYyODE3XSwgWzE2MDU3NTgyMzguMTI4ODI0LCA0ODM2LCAwLjkzMzg5NTgyNjMzOTcyMTddLCBbMTYwNTc1ODIzOC41NjUyMDMsIDQ4NDIsIDAuOTEwNjEwNjc1ODExNzY3Nl0sIFsxNjA1NzU4MjM4LjY4NTMxOCwgNDg1MiwgMC45MDI5NTMzODYzMDY3NjI3XSwgWzE2MDU3NTgyMzguNzQ1NTQxLCA0ODU3LCAwLjkwMzM5ODUxMzc5Mzk0NTNdLCBbMTYwNTc1ODIzOC44MTY4MzcsIDQ4NjMsIDAuODk2ODEzMTU0MjIwNTgxXSwgWzE2MDU3NTgyMzguODY0NzU1LCA0ODY3LCAwLjk0MDEyOTk5NTM0NjA2OTNdLCBbMTYwNTc1ODIzOC44NzYxMDcsIDQ4NjgsIDAuOTY5MzYyMTM5NzAxODQzM10sIFsxNjA1NzU4MjM4Ljk4MDU1LCA0ODc2LCAwLjkzODEwMDU3NjQwMDc1NjhdLCBbMTYwNTc1ODIzOS4wMTgwNTYsIDQ4NzksIDAuOTQ4ODgzNTMzNDc3NzgzMl0sIFsxNjA1NzU4MjM5LjAzMDU3NCwgNDg4MCwgMC45NjczODY2NjI5NjAwNTI1XSwgWzE2MDU3NTgyMzkuMDU1Njg4LCA0ODgyLCAwLjkyOTIxMTU1NjkxMTQ2ODVdLCBbMTYwNTc1ODIzOS4xMDYxMSwgNDg4NSwgMC45MzEyMzkxODc3MTc0Mzc3XSwgWzE2MDU3NTgyMzkuMjI5NTA2LCA0ODk0LCAwLjkyODQ4NzMwMDg3MjgwMjddLCBbMTYwNTc1ODIzOS4yNjYxOTcsIDQ4OTcsIDAuODk5NzUwNzA5NTMzNjkxNF0sIFsxNjA1NzU4MjM5LjI3ODQyNSwgNDg5OCwgMC45MTQ2MjUwNDg2MzczOTAxXSwgWzE2MDU3NTgyMzkuMzAyODgxLCA0OTAwLCAwLjk1MTY0MDkwMzk0OTczNzVdLCBbMTYwNTc1ODIzOS4zMjg5NTgsIDQ5MDIsIDAuOTIyODk5NzIzMDUyOTc4NV0sIFsxNjA1NzU4MjM5LjM2NDkzLCA0OTA1LCAwLjkxMTg3MDI0MTE2NTE2MTFdLCBbMTYwNTc1ODIzOS4zNzY3NzgsIDQ5MDYsIDAuOTQyMjIzOTA2NTE3MDI4OF0sIFsxNjA1NzU4MjM5LjQ0ODYzNSwgNDkxMiwgMC45NTk5MTMzMTMzODg4MjQ1XSwgWzE2MDU3NTgyMzkuNTIwMjU2LCA0OTE4LCAwLjkzMTQ3NTI4MTcxNTM5MzFdLCBbMTYwNTc1ODIzOS41NDM3NTYsIDQ5MjAsIDAuOTI5OTA1NzcyMjA5MTY3NV0sIFsxNjA1NzU4MjM5LjU3OTM0OCwgNDkyMywgMC45MzY5MjE5NTQxNTQ5NjgzXSwgWzE2MDU3NTgyMzkuODI2MDE2LCA0OTQzLCAwLjkyOTkzOTE1MDgxMDI0MTddLCBbMTYwNTc1ODIzOS44NDk4MzcsIDQ5NDUsIDAuOTI0NzMzODE3NTc3MzYyMV0sIFsxNjA1NzU4MjQwLjM4NzY4MSwgNDk1OCwgMC45MDk1ODc1MDI0Nzk1NTMyXSwgWzE2MDU3NTgyNDAuNTQ3MDg0LCA0OTcwLCAwLjk0Mjg5NjI0NjkxMDA5NTJdLCBbMTYwNTc1ODI0MC44MDMxMDgsIDQ5ODksIDAuOTIzMDIxMzE2NTI4MzIwM10sIFsxNjA1NzU4MjQwLjgyOTg2MiwgNDk5MSwgMC45MzkwNjA1Njg4MDk1MDkzXSwgWzE2MDU3NTgyNDEuMDgyMTU1LCA1MDA3LCAwLjk0MTEyODQ5MjM1NTM0NjddLCBbMTYwNTc1ODI0MS4xMjg2OTksIDUwMTAsIDAuODg2MTE5ODQyNTI5Mjk2OV0sIFsxNjA1NzU4MjQxLjE1OTMxNCwgNTAxMiwgMC44OTc3NjU1MTcyMzQ4MDIyXSwgWzE2MDU3NTgyNDEuMTc0NjI2LCA1MDEzLCAwLjg5MTUzMjE4MjY5MzQ4MTRdLCBbMTYwNTc1ODI0MS40NjkxNjksIDUwMzIsIDAuODU4NjI3Mzc4OTQwNTgyM10sIFsxNjA1NzU4MjQxLjgzODQxOCwgNTA1NiwgMC45Mjk0MDQwNzk5MTQwOTNdLCBbMTYwNTc1ODI0MS44ODI5OTQsIDUwNTksIDAuOTEyMjkwNTEzNTE1NDcyNF0sIFsxNjA1NzU4MjQyLjA4ODYyOSwgNTA3MiwgMC44NzkxNzkzNTg0ODIzNjA4XSwgWzE2MDU3NTgyNDIuNTQ1MzM2LCA1MDgwLCAwLjk2NDg5OTU5OTU1MjE1NDVdLCBbMTYwNTc1ODI0Mi42NDMwNTgsIDUwODgsIDAuOTIzMzEwOTk1MTAxOTI4N10sIFsxNjA1NzU4MjQyLjY1NDU2NCwgNTA4OSwgMC45NDkxMTgxMzczNTk2MTkxXSwgWzE2MDU3NTgyNDIuNjkwOTMzLCA1MDkyLCAwLjkyMzQ0ODAyNjE4MDI2NzNdLCBbMTYwNTc1ODI0Mi43MTQ0MDcsIDUwOTQsIDAuODcyOTExODEwODc0OTM5XSwgWzE2MDU3NTgyNDIuNzI2NzEyLCA1MDk1LCAwLjkyMDI2NzM0MzUyMTExODJdLCBbMTYwNTc1ODI0Mi44OTQ0ODgsIDUxMDksIDAuOTQxMDQyMzA0MDM5MDAxNV0sIFsxNjA1NzU4MjQyLjk4OTg0NSwgNTExNywgMC45Mjg3Mjg5MzgxMDI3MjIyXSwgWzE2MDU3NTgyNDMuMjYyOTc0LCA1MTM5LCAwLjk2NzI4NjI4ODczODI1MDddLCBbMTYwNTc1ODI0My4zMzYwNTUsIDUxNDUsIDAuOTI0MzU5OTE3NjQwNjg2XSwgWzE2MDU3NTgyNDMuMzczMjgxLCA1MTQ4LCAwLjg5MjcwOTAxNjc5OTkyNjhdLCBbMTYwNTc1ODI0My40NjAxMzEsIDUxNTUsIDAuODc4MjM5NzUwODYyMTIxNl0sIFsxNjA1NzU4MjQzLjYxNzQ2MiwgNTE2OCwgMC44ODI0MjgyMjg4NTUxMzMxXSwgWzE2MDU3NTgyNDMuNjQwODc2LCA1MTcwLCAwLjkyMTA4MDI5MTI3MTIwOTddLCBbMTYwNTc1ODI0My42NTI1NjUsIDUxNzEsIDAuOTEzOTQ2OTg2MTk4NDI1M10sIFsxNjA1NzU4MjQzLjczODU3LCA1MTc4LCAwLjkxMjgzMzIxMzgwNjE1MjNdLCBbMTYwNTc1ODI0NC4zNTc4NzksIDUxOTYsIDAuOTM0MTMxMDg1ODcyNjUwMV0sIFsxNjA1NzU4MjQ0LjU5NTkyMywgNTIxMiwgMC44MTYxODU2NTMyMDk2ODYzXSwgWzE2MDU3NTgyNDQuNzAyODQ2LCA1MjE5LCAwLjg2OTExOTY0NDE2NTAzOTFdLCBbMTYwNTc1ODI0NC43ODE5NTgsIDUyMjQsIDAuODczNDI1NDgzNzAzNjEzM10sIFsxNjA1NzU4MjQ0Ljc5Nzg4OCwgNTIyNSwgMC44NTQ3NDQ3OTE5ODQ1NTgxXSwgWzE2MDU3NTgyNDQuODk3MDUxLCA1MjMxLCAwLjkxNjcwOTY2MTQ4Mzc2NDZdLCBbMTYwNTc1ODI0NS4xMDE4NTgsIDUyNDQsIDAuOTAyODg4NDc2ODQ4NjAyM10sIFsxNjA1NzU4MjQ1LjE0MzEyOCwgNTI0NiwgMC44NjEzMTgxMTE0MTk2Nzc3XSwgWzE2MDU3NTgyNDUuMjQyODQ1LCA1MjUyLCAwLjkwMzQ1ODM1Njg1NzI5OThdLCBbMTYwNTc1ODI0NS42Mzg5OTYsIDUyNzgsIDAuODk2ODg4NjEzNzAwODY2N10sIFsxNjA1NzU4MjQ1LjcxMzU4NCwgNTI4MywgMC45MjUzMDI1NjUwOTc4MDg4XSwgWzE2MDU3NTgyNDUuOTA4OTE2LCA1Mjk2LCAwLjg4MzQwODQyNzIzODQ2NDRdLCBbMTYwNTc1ODI0NS45Njg0NTEsIDUzMDAsIDAuODM5NzA2NzE4OTIxNjYxNF0sIFsxNjA1NzU4MjQ2LjYwMzAzNCwgNTMxOCwgMC45NDg4MDM2NjMyNTM3ODQyXSwgWzE2MDU3NTgyNDYuNjk5NTMzLCA1MzI2LCAwLjkzMjI1NjM0MDk4MDUyOThdLCBbMTYwNTc1ODI0Ni45ODMxNTIsIDUzNDksIDAuOTA4MDQ4MDkzMzE4OTM5Ml0sIFsxNjA1NzU4MjQ3LjAyNDQzNiwgNTM1MiwgMC44NjczMTEwMDA4MjM5NzQ2XSwgWzE2MDU3NTgyNDcuMDM3NDM0LCA1MzUzLCAwLjk1MDI0NjIxNDg2NjYzODJdLCBbMTYwNTc1ODI0Ny4wNjI1NTgsIDUzNTUsIDAuODU2Nzg3NDQzMTYxMDEwN10sIFsxNjA1NzU4MjQ3LjA4NjYwOSwgNTM1NywgMC45ODQyOTMzNDE2MzY2NTc3XSwgWzE2MDU3NTgyNDcuMTA1ODgyLCA1MzU4LCAwLjg2OTQzMzE2NDU5NjU1NzZdLCBbMTYwNTc1ODI0Ny4xNTU4NzYsIDUzNjIsIDAuODczMjI0ODU0NDY5Mjk5M10sIFsxNjA1NzU4MjQ3LjM4MzE3NywgNTM4MCwgMC44ODMyNDgyMDk5NTMzMDgxXSwgWzE2MDU3NTgyNDcuNDMyMDc0LCA1Mzg0LCAwLjkwMTUzMTE1OTg3Nzc3NzFdLCBbMTYwNTc1ODI0Ny43MTM5NjEsIDU0MDcsIDAuODU2Mjc5NjExNTg3NTI0NF0sIFsxNjA1NzU4MjQ3Ljg3MjY3OCwgNTQyMCwgMC45MDExNTA0NjUwMTE1OTY3XSwgWzE2MDU3NTgyNDguNDUwMzU2LCA1NDM2LCAwLjg0NzQxMDg1NzY3NzQ1OTddLCBbMTYwNTc1ODI0OC41OTQxOTQsIDU0NDcsIDAuODk0MTM5NjQ3NDgzODI1N10sIFsxNjA1NzU4MjQ4LjYwODQ5MywgNTQ0OCwgMC45MTg2NTc2NjA0ODQzMTRdLCBbMTYwNTc1ODI0OC43OTIxNzUsIDU0NjMsIDAuODc0MzM2OTU3OTMxNTE4Nl0sIFsxNjA1NzU4MjQ4LjgyODQzNiwgNTQ2NiwgMC44Njg3MzUwNzQ5OTY5NDgyXSwgWzE2MDU3NTgyNDguOTU5OTY4LCA1NDc3LCAwLjg1NTA0MDAxMzc5MDEzMDZdLCBbMTYwNTc1ODI0OC45NzIwMzUsIDU0NzgsIDAuOTAzNzczMTI4OTg2MzU4Nl0sIFsxNjA1NzU4MjQ5LjAwOTkwNiwgNTQ4MSwgMC44NzE5MzI0NDY5NTY2MzQ1XSwgWzE2MDU3NTgyNDkuMjM0NDU5LCA1NDk4LCAwLjg1NjUxNjM2MTIzNjU3MjNdLCBbMTYwNTc1ODI0OS4yOTE0NDUsIDU1MDIsIDAuOTA1ODI0NDIyODM2MzAzN10sIFsxNjA1NzU4MjQ5LjU0MDAwMywgNTUyMiwgMC44ODQ5NDk4NjI5NTcwMDA3XSwgWzE2MDU3NTgyNDkuNTY0MTM5LCA1NTI0LCAwLjkxNDI5NDg5ODUwOTk3OTJdLCBbMTYwNTc1ODI0OS43MzI4NTYsIDU1MzgsIDAuODY3MTE1ODU1MjE2OThdLCBbMTYwNTc1ODI0OS43OTIyOTksIDU1NDMsIDAuODUyMDM0MjExMTU4NzUyNF0sIFsxNjA1NzU4MjUwLjMyOTYxLCA1NTU3LCAwLjg2MzE1ODk0MTI2ODkyMDldLCBbMTYwNTc1ODI1MC4zNDI0NzksIDU1NTgsIDAuOTEwMTMxNjkyODg2MzUyNV0sIFsxNjA1NzU4MjUwLjM2NjI0NCwgNTU2MCwgMC44NDM4OTQ3MjAwNzc1MTQ2XSwgWzE2MDU3NTgyNTAuNDI3NzU4LCA1NTY1LCAwLjkwNjQyMjA3ODYwOTQ2NjZdLCBbMTYwNTc1ODI1MC43NzYzMDYsIDU1OTMsIDAuODkzMzUxNjc0MDc5ODk1XSwgWzE2MDU3NTgyNTAuODg3ODExLCA1NjAyLCAwLjg2MzkyMjUzNjM3MzEzODRdLCBbMTYwNTc1ODI1MC45NzUwNDksIDU2MDksIDAuODkyMTkyMTg0OTI1MDc5M10sIFsxNjA1NzU4MjUxLjAyNjUzMywgNTYxMywgMC44NTUzNzAyMjM1MjIxODYzXSwgWzE2MDU3NTgyNTEuMTAxMDE4LCA1NjE5LCAwLjg0MDA1NDQ1MjQxOTI4MV0sIFsxNjA1NzU4MjUxLjE4MDk3MywgNTYyNSwgMC44NTk2NjAwODkwMTU5NjA3XSwgWzE2MDU3NTgyNTEuMjQzOTMxLCA1NjMwLCAwLjg1NDQ2NTAwNzc4MTk4MjRdLCBbMTYwNTc1ODI1MS4yODA4NzMsIDU2MzMsIDAuODQ2OTk4NTEyNzQ0OTAzNl0sIFsxNjA1NzU4MjUxLjMwNDI2MywgNTYzNSwgMC44NzE0NTY2ODI2ODIwMzc0XSwgWzE2MDU3NTgyNTEuNDkxMzQ2LCA1NjUwLCAwLjg1MDk4OTg3ODE3NzY0MjhdLCBbMTYwNTc1ODI1MS42MDE5ODgsIDU2NTksIDAuOTAzOTc0Mjk0NjYyNDc1Nl0sIFsxNjA1NzU4MjUyLjA2MzU5NywgNTY2NywgMC44MTY3MDYwMDE3NTg1NzU0XSwgWzE2MDU3NTgyNTIuMjAxOTY4LCA1Njc3LCAwLjg2MjY2NjcyNjExMjM2NTddLCBbMTYwNTc1ODI1Mi4yODc0OTEsIDU2ODQsIDAuODMzOTUxOTUwMDczMjQyMl0sIFsxNjA1NzU4MjUyLjM1MDE4OCwgNTY4OSwgMC44ODg5ODkwOTA5MTk0OTQ2XSwgWzE2MDU3NTgyNTIuMzc0NTgyLCA1NjkxLCAwLjg3Nzc4NTkyMTA5NjgwMThdLCBbMTYwNTc1ODI1Mi40MTI2MjgsIDU2OTQsIDAuODIzMjgyMzAxNDI1OTMzOF0sIFsxNjA1NzU4MjUyLjUzMTA1OSwgNTcwMywgMC44NDgzOTc0OTMzNjI0MjY4XSwgWzE2MDU3NTgyNTIuNTU2NDcxLCA1NzA1LCAwLjkxMTQ5MTkzMDQ4NDc3MTddLCBbMTYwNTc1ODI1Mi42MzU1NDQsIDU3MTEsIDAuODgyMTU1NTk3MjA5OTMwNF0sIFsxNjA1NzU4MjUyLjc5NDUwNCwgNTcyMywgMC44NzM1NTQ0NjgxNTQ5MDcyXSwgWzE2MDU3NTgyNTIuODczMTkzLCA1NzI4LCAwLjg2MzUyODg0NzY5NDM5N10sIFsxNjA1NzU4MjUzLjAxMjk0OSwgNTczOCwgMC44NDUyODA1MjgwNjg1NDI1XSwgWzE2MDU3NTgyNTMuMTQ4MDUzLCA1NzQ4LCAwLjg3MjAzMTAzMzAzOTA5M10sIFsxNjA1NzU4MjUzLjE3NjEsIDU3NTAsIDAuODczMzIzNzk4MTc5NjI2NV0sIFsxNjA1NzU4MjUzLjM4Njg4NiwgNTc2NSwgMC44NTgyNTYzNDAwMjY4NTU1XSwgWzE2MDU3NTgyNTMuNTMxMDY5LCA1Nzc2LCAwLjg3NDI5ODUxMjkzNTYzODRdLCBbMTYwNTc1ODI1My41NTc4MDksIDU3NzgsIDAuODE3MTY3NTIwNTIzMDcxM10sIFsxNjA1NzU4MjUzLjk2ODkxNCwgNTc4MiwgMC44NDk1MzY4OTU3NTE5NTMxXSwgWzE2MDU3NTgyNTQuMTE3NjEyLCA1Nzk0LCAwLjc2Mzc0NzM5NDA4NDkzMDRdLCBbMTYwNTc1ODI1NC4xNTU3NjcsIDU3OTcsIDAuOTIyNDc4MzE4MjE0NDE2NV0sIFsxNjA1NzU4MjU0LjU5Mjc5NywgNTgzMSwgMC44NzkyMTI0OTg2NjQ4NTZdLCBbMTYwNTc1ODI1NC42ODAyNTMsIDU4MzgsIDAuODk2NDc0NDgwNjI4OTY3M10sIFsxNjA1NzU4MjU0LjcxNjI5MywgNTg0MSwgMC44MTQxMjE2MDM5NjU3NTkzXSwgWzE2MDU3NTgyNTQuNzY0NzE2LCA1ODQ1LCAwLjg5Mjk2MTY4MDg4OTEyOTZdLCBbMTYwNTc1ODI1NC45MzMxNTQsIDU4NTksIDAuODQ2NDYzMzIyNjM5NDY1M10sIFsxNjA1NzU4MjU1LjA2OTQ1NCwgNTg3MCwgMC44MzU3Mjg4ODM3NDMyODYxXSwgWzE2MDU3NTgyNTUuMTU2MzI1LCA1ODc3LCAwLjg1MTc1ODcxODQ5MDYwMDZdLCBbMTYwNTc1ODI1NS4yNDk1MjcsIDU4ODQsIDAuNzkxMTgwMTMzODE5NTgwMV0sIFsxNjA1NzU4MjU1LjM4ODg0OSwgNTg5NCwgMC44NDc2NzAwNzgyNzc1ODc5XSwgWzE2MDU3NTgyNTUuNDI0MzU0LCA1ODk3LCAwLjgzOTc0NDAzMTQyOTI5MDhdLCBbMTYwNTc1ODI1NS44NTQ4MDMsIDU5MDIsIDAuODY0MTUzODYxOTk5NTExN10sIFsxNjA1NzU4MjU1LjkzMzAxOSwgNTkwNywgMC44MjU1ODcwMzQyMjU0NjM5XSwgWzE2MDU3NTgyNTYuMDI0NzU1LCA1OTEzLCAwLjg3OTU2MDk0NzQxODIxMjldLCBbMTYwNTc1ODI1Ni4yMTczMDMsIDU5MjUsIDAuODkxMzAxMDM1ODgxMDQyNV0sIFsxNjA1NzU4MjU2LjIzNDA1NiwgNTkyNiwgMC44NDM3MTg0NjkxNDI5MTM4XSwgWzE2MDU3NTgyNTYuNTA3NzYxLCA1OTQzLCAwLjgxNjMyOTE4MTE5NDMwNTRdLCBbMTYwNTc1ODI1Ni41NTQ1MDUsIDU5NDYsIDAuODQ2NjQ2MTMwMDg0OTkxNV0sIFsxNjA1NzU4MjU2LjY2MzM3MywgNTk1MywgMC45MDMyNzU4NDc0MzQ5OTc2XSwgWzE2MDU3NTgyNTYuODU0NzI1LCA1OTY1LCAwLjg4MDE0MTA3OTQyNTgxMThdLCBbMTYwNTc1ODI1Ny4wOTA0MjEsIDU5ODAsIDAuNzg2NjczNTQ1ODM3NDAyM10sIFsxNjA1NzU4MjU3LjEyNDY5NCwgNTk4MiwgMC44OTE1NTc5MzE5MDAwMjQ0XSwgWzE2MDU3NTgyNTcuMjM0NjQ4LCA1OTg5LCAwLjg0NTQ4MDIwMzYyODU0XSwgWzE2MDU3NTgyNTcuNDAwNTYxLCA1OTk5LCAwLjg3OTkwODE0NDQ3NDAyOTVdLCBbMTYwNTc1ODI1Ny41MjgwODksIDYwMDcsIDAuODUxNDI0ODcyODc1MjEzNl0sIFsxNjA1NzU4MjU3LjU2MDcxNCwgNjAwOSwgMC44Mzg3ODcwNzg4NTc0MjE5XSwgWzE2MDU3NTgyNTcuNTkxNDA1LCA2MDExLCAwLjg0NDAzNjYzODczNjcyNDldLCBbMTYwNTc1ODI1Ny42MzY5NTcsIDYwMTQsIDAuODQyMDQyNTY1MzQ1NzY0Ml0sIFsxNjA1NzU4MjU3LjY3MDAxMywgNjAxNiwgMC45MzEyMzExNDEwOTAzOTMxXSwgWzE2MDU3NTgyNTguMjg3NTksIDU5MDcsIDAuODEyMzUyMTgwNDgwOTU3XSwgWzE2MDU3NTgyNTguNTI1MTMzLCA1OTE3LCAwLjg1NTI5NDY0NDgzMjYxMTFdLCBbMTYwNTc1ODI1OC41NDc3NCwgNTkxOCwgMC44MDg5NDU1MzY2MTM0NjQ0XSwgWzE2MDU3NTgyNTguNzgwMjU3LCA1OTI4LCAwLjg1NTQzNTEzMjk4MDM0NjddLCBbMTYwNTc1ODI1OC44NjI4NTksIDU5MzIsIDAuODQwNjc5OTQzNTYxNTU0XSwgWzE2MDU3NTgyNTguODg2MTgzLCA1OTMzLCAwLjg0NDk4MjQ0NTI0MDAyMDhdLCBbMTYwNTc1ODI1OS4yOTY4MzgsIDU5NTIsIDAuODUzMjc5MjMyOTc4ODIwOF0sIFsxNjA1NzU4MjU5LjQzMTA0OCwgNTk1NywgMC44MjgyOTczNzY2MzI2OTA0XSwgWzE2MDU3NTgyNTkuNDc0NjM1LCA1OTU5LCAwLjg1MDEzMTkyODkyMDc0NThdLCBbMTYwNTc1ODI1OS40OTcwMDgsIDU5NjAsIDAuODE4NjQ1MTE5NjY3MDUzMl0sIFsxNjA1NzU4MjU5LjU2NTA4NCwgNTk2MywgMC44NDYzNzgxNDc2MDIwODEzXSwgWzE2MDU3NTgyNTkuNzczMzU4LCA1OTcyLCAwLjgzMDUyNzY2MzIzMDg5Nl0sIFsxNjA1NzU4MjYwLjE1NTAxMiwgNTk5MCwgMC44NDA0OTg5MjQyNTUzNzExXSwgWzE2MDU3NTgyNjAuNjEzNzQ5LCA2MDEwLCAwLjg0MzI3OTk1Nzc3MTMwMTNdLCBbMTYwNTc1ODI2MC43MTU1MDcsIDYwMTUsIDAuODIzMjAyODQ4NDM0NDQ4Ml0sIFsxNjA1NzU4MjYxLjE5NDExMywgNjAxOSwgMC44NjgyOTA0MjQzNDY5MjM4XSwgWzE2MDU3NTgyNjEuMzI5ODUsIDYwMjQsIDAuODIzMjc3MzU0MjQwNDE3NV0sIFsxNjA1NzU4MjYxLjQ2NTY0MSwgNjAzMCwgMC45MDY0NzU1NDM5NzU4MzAxXSwgWzE2MDU3NTgyNjEuNDg2NzQsIDYwMzEsIDAuODM3ODMzMjg1MzMxNzI2MV0sIFsxNjA1NzU4MjYxLjUwNjk3NCwgNjAzMiwgMC44NjMzMTc1NDkyMjg2NjgyXSwgWzE2MDU3NTgyNjEuNTc1NDYxLCA2MDM1LCAwLjkxNTQ5NDI2MzE3MjE0OTddLCBbMTYwNTc1ODI2MS42NDY3OTcsIDYwMzgsIDAuODM2MDQzMDU5ODI1ODk3Ml0sIFsxNjA1NzU4MjYxLjkyOTI5NiwgNjA1MiwgMC44NTYwMTE5ODY3MzI0ODI5XSwgWzE2MDU3NTgyNjIuMDM1NTk1LCA2MDU3LCAwLjgzOTM2MzE1Nzc0OTE3Nl0sIFsxNjA1NzU4MjYyLjA5NzE1MSwgNjA2MCwgMC44NjY2MDU5OTcwODU1NzEzXSwgWzE2MDU3NTgyNjIuNDUyNjAyLCA2MDc3LCAwLjg2MjUwMDQyOTE1MzQ0MjRdLCBbMTYwNTc1ODI2Mi40NzI4OSwgNjA3OCwgMC43ODgwMjQxMjc0ODMzNjc5XSwgWzE2MDU3NTgyNjIuNTU0ODg3LCA2MDgyLCAwLjg1MTY4NTM0NTE3Mjg4MjFdLCBbMTYwNTc1ODI2Mi42Njk3NjIsIDYwODcsIDAuODMzMjg5OTgwODg4MzY2N10sIFsxNjA1NzU4MjYyLjgxMzA5LCA2MDk0LCAwLjg0Mzk3MTQ5MDg1OTk4NTRdLCBbMTYwNTc1ODI2My4wMDYyNiwgNjEwMywgMC44MTc1MzIxMjIxMzUxNjI0XSwgWzE2MDU3NTgyNjMuMDQ1NzI4LCA2MTA1LCAwLjgyMzI1MTEyODE5NjcxNjNdLCBbMTYwNTc1ODI2My4yNTU3MDUsIDYxMTUsIDAuNzg3MjI1MzY1NjM4NzMyOV0sIFsxNjA1NzU4MjYzLjM5MjI3OCwgNjEyMSwgMC44NTg5MTE3NTI3MDA4MDU3XSwgWzE2MDU3NTgyNjMuNDM3MDg1LCA2MTIzLCAwLjg2MzQ5MDkzOTE0MDMxOThdLCBbMTYwNTc1ODI2My41NjE4NiwgNjEyOSwgMC44NDQ5MDg4OTMxMDgzNjc5XSwgWzE2MDU3NTgyNjMuNjAxMTE0LCA2MTMxLCAwLjg2MjEyMDUwOTE0NzY0NF0sIFsxNjA1NzU4MjYzLjY0MjMzMiwgNjEzMywgMC44MjI3MjIzNzUzOTI5MTM4XSwgWzE2MDU3NTgyNjQuMjg3MTUyLCA2MTQ1LCAwLjgyMjU2NzI4NDEwNzIwODNdLCBbMTYwNTc1ODI2NC4zMjY0NDgsIDYxNDcsIDAuNzY3MjM0MDg2OTkwMzU2NF0sIFsxNjA1NzU4MjY0LjM3MzY4NywgNjE0OSwgMC44MzQ0NTc2MzU4Nzk1MTY2XSwgWzE2MDU3NTgyNjQuNTQ2ODQ4LCA2MTU3LCAwLjg1MjQ5NDM1OTAxNjQxODVdLCBbMTYwNTc1ODI2NC44NTc1MTIsIDYxNzIsIDAuODI4MTk1MjE0MjcxNTQ1NF0sIFsxNjA1NzU4MjY0Ljk0MDI5NCwgNjE3NiwgMC43ODU2MDYwMjY2NDk0NzUxXSwgWzE2MDU3NTgyNjUuMDUyMTg2LCA2MTgxLCAwLjgxMzQ2MTQ4MjUyNDg3MThdLCBbMTYwNTc1ODI2NS4xMTMzNjMsIDYxODQsIDAuODU1MjMxNjQyNzIzMDgzNV0sIFsxNjA1NzU4MjY1LjQ2MTQ4NSwgNjIwMCwgMC44MjA1OTg0ODMwODU2MzIzXSwgWzE2MDU3NTgyNjUuNjY4NTk0LCA2MjEwLCAwLjg1NTgxNzQzNzE3MTkzNl0sIFsxNjA1NzU4MjY1LjY4ODc1NCwgNjIxMSwgMC44Mjk5Mjg5OTQxNzg3NzJdLCBbMTYwNTc1ODI2NS43Mjk2MjksIDYyMTMsIDAuODA5MzcxNzA5ODIzNjA4NF0sIFsxNjA1NzU4MjY1Ljg1NTI5MiwgNjIxOSwgMC44NTAxOTE4MzE1ODg3NDUxXSwgWzE2MDU3NTgyNjUuODc0MTk0LCA2MjIwLCAwLjg4NjI4MzY5NTY5Nzc4NDRdLCBbMTYwNTc1ODI2NS45ODA4ODksIDYyMjUsIDAuODE5MDU5NzI5NTc2MTEwOF0sIFsxNjA1NzU4MjY2LjEyMDU0NCwgNjIzMiwgMC43ODg1MDg4OTIwNTkzMjYyXSwgWzE2MDU3NTgyNjYuMjE3MDc3LCA2MjM3LCAwLjg1ODYwMTMzMTcxMDgxNTRdLCBbMTYwNTc1ODI2Ni4zNTc0NjMsIDYyNDQsIDAuODAzNTQ3NTAxNTY0MDI1OV0sIFsxNjA1NzU4MjY2LjQ2NzQ1NSwgNjI1MCwgMC44ODU4NTkzNzAyMzE2Mjg0XSwgWzE2MDU3NTgyNjcuMTIxODkyLCA2MjYzLCAwLjgwNTgxNTY5NjcxNjMwODZdLCBbMTYwNTc1ODI2Ny4yNTcwNjMsIDYyNzAsIDAuODA3OTU0NjY4OTk4NzE4M10sIFsxNjA1NzU4MjY3LjY1MDc0MiwgNjI4OSwgMC44MjM5Nzg3MjIwOTU0ODk1XSwgWzE2MDU3NTgyNjguMDg0NTYxLCA2MzA5LCAwLjg2NDE3Mzc2OTk1MDg2NjddLCBbMTYwNTc1ODI2OC4xNTI2NDIsIDYzMTIsIDAuNzc0MjkzMDY1MDcxMTA2XSwgWzE2MDU3NTgyNjguMjM2MTA2LCA2MzE2LCAwLjgyOTE2MzczMDE0NDUwMDddLCBbMTYwNTc1ODI2OC4yNTkyNjgsIDYzMTcsIDAuODIyOTExOTc3NzY3OTQ0M10sIFsxNjA1NzU4MjY4LjQwOTE1MiwgNjMyNCwgMC44NzEyMDE2MzQ0MDcwNDM1XSwgWzE2MDU3NTgyNjguNzY0Njc4LCA2MzQxLCAwLjgyMjA2OTg4MzM0NjU1NzZdLCBbMTYwNTc1ODI2OC45ODEzMjYsIDYzNTIsIDAuNzQxNDMzOTc4MDgwNzQ5NV0sIFsxNjA1NzU4MjY5LjE5Mzg1NCwgNjM2MywgMC43ODkzODE4NjE2ODY3MDY1XSwgWzE2MDU3NTgyNjkuMzMxNzM2LCA2MzcwLCAwLjgxODMzODE1NTc0NjQ2XSwgWzE2MDU3NTgyNjkuODcwMDMzLCA2Mzc2LCAwLjgyMDAyNjU3NjUxOTAxMjVdLCBbMTYwNTc1ODI3MC4zNjQwNDgsIDY0MDAsIDAuNzc1NTc1Mzk5Mzk4ODAzN10sIFsxNjA1NzU4MjcwLjc1OTgzNywgNjQyMywgMC44Mzk3Mjc1MjA5NDI2ODhdLCBbMTYwNTc1ODI3MC45MTAwNDYsIDY0MzIsIDAuNzk5ODE4Mjc3MzU5MDA4OF0sIFsxNjA1NzU4MjcxLjE5MDc1LCA2NDQ3LCAwLjgyNDUwMjU4NzMxODQyMDRdLCBbMTYwNTc1ODI3MS4yMDk5NjUsIDY0NDgsIDAuNzk4MDcwMzExNTQ2MzI1N10sIFsxNjA1NzU4MjcxLjM2NzY4MiwgNjQ1NSwgMC43OTM0MDQ5MzY3OTA0NjYzXSwgWzE2MDU3NTgyNzEuNDQxNzU1LCA2NDU5LCAwLjc4MjQxMDE0NDgwNTkwODJdLCBbMTYwNTc1ODI3MS43MDI5NzIsIDY0NzIsIDAuNzgyOTM2MzM0NjA5OTg1NF0sIFsxNjA1NzU4MjcxLjcyMzc0NywgNjQ3MywgMC44ODcxNTEwMDI4ODM5MTExXSwgWzE2MDU3NTgyNzEuOTE4MDIsIDY0ODMsIDAuODM2NDUwMDQwMzQwNDIzNl0sIFsxNjA1NzU4MjcyLjAwMTAyNywgNjQ4NywgMC43NTg2NzE1MjIxNDA1MDI5XSwgWzE2MDU3NTgyNzIuNTUxNTg3LCA2NDk1LCAwLjg0Mzc1MDM1NzYyNzg2ODddLCBbMTYwNTc1ODI3Mi41NzI0NCwgNjQ5NiwgMC44MzgwNTUzMTI2MzM1MTQ0XSwgWzE2MDU3NTgyNzIuNjYxMjkzLCA2NTAwLCAwLjgwNzkyNjY1NDgxNTY3MzhdLCBbMTYwNTc1ODI3Mi44MzYyODQsIDY1MDksIDAuODEwNDQwMzYxNDk5Nzg2NF0sIFsxNjA1NzU4MjcyLjg1NTQ2NywgNjUxMCwgMC44MTI0MTY2NzI3MDY2MDRdLCBbMTYwNTc1ODI3My4wNjc1MTUsIDY1MjAsIDAuODA4NDkzMjU2NTY4OTA4N10sIFsxNjA1NzU4MjczLjA4NTk2MiwgNjUyMSwgMC44NDExOTQyMTI0MzY2NzZdLCBbMTYwNTc1ODI3My4xMDM0OTcsIDY1MjIsIDAuODU1MDQ0NjAzMzQ3Nzc4M10sIFsxNjA1NzU4MjczLjI3MTcxNywgNjUzMCwgMC44MTA3MjQ0OTY4NDE0MzA3XSwgWzE2MDU3NTgyNzMuMzY2NjIxLCA2NTM0LCAwLjc3ODEzNTE4MDQ3MzMyNzZdLCBbMTYwNTc1ODI3My43MjkwMjcsIDY1NTAsIDAuODQxNTYxMTM4NjI5OTEzM10sIFsxNjA1NzU4MjczLjg4NTgyMywgNjU1OCwgMC43ODk1ODI0OTA5MjEwMjA1XSwgWzE2MDU3NTgyNzQuMTYzMjYsIDY1NzQsIDAuNzc4NDc0MzMwOTAyMDk5Nl0sIFsxNjA1NzU4Mjc0LjI1MjM5MywgNjU3OCwgMC44MTMzMzM0NTE3NDc4OTQzXSwgWzE2MDU3NTgyNzQuMjkzMDA1LCA2NTgwLCAwLjgyMzQ0ODUzODc4MDIxMjRdLCBbMTYwNTc1ODI3NC4zMTMzNzQsIDY1ODEsIDAuODI1OTE1Mzk2MjEzNTMxNV0sIFsxNjA1NzU4Mjc0LjM3OTM4NywgNjU4NCwgMC44NDM1MzUxODQ4NjAyMjk1XSwgWzE2MDU3NTgyNzQuNTk1MTAzLCA2NTkzLCAwLjgwMTM0NDAzNzA1NTk2OTJdLCBbMTYwNTc1ODI3NC42MTU2MzcsIDY1OTQsIDAuODQ3MTI0Mjc4NTQ1Mzc5Nl0sIFsxNjA1NzU4Mjc0Ljc5OTk3LCA2NjAzLCAwLjgxMjQxNzk4NDAwODc4OTFdLCBbMTYwNTc1ODI3NC44NjI4NzQsIDY2MDYsIDAuODU4MTc2NjQ4NjE2NzkwOF0sIFsxNjA1NzU4Mjc1LjQxMDQzNCwgNjYxNiwgMC43NDQ0OTU1MTEwNTQ5OTI3XSwgWzE2MDU3NTgyNzUuNTA2Nzk1LCA2NjIxLCAwLjc4NTYxNDQ5MDUwOTAzMzJdLCBbMTYwNTc1ODI3Ni4xNDA5MzYsIDY2NDksIDAuODE0Mzc4Njc4Nzk4Njc1NV0sIFsxNjA1NzU4Mjc2LjMyMzg0NiwgNjY1NywgMC44MDAxOTgzMTY1NzQwOTY3XSwgWzE2MDU3NTgyNzYuNTI3NDQsIDY2NjYsIDAuNzY0NzUzNDYwODg0MDk0Ml0sIFsxNjA1NzU4Mjc2LjU3MTgzNCwgNjY2OCwgMC43NDI1NTkzMTM3NzQxMDg5XSwgWzE2MDU3NTgyNzYuNjUxMzg0LCA2NjcyLCAwLjgwNjI5MTA0Mzc1ODM5MjNdLCBbMTYwNTc1ODI3Ni43OTExNDMsIDY2NzgsIDAuODI5MzEzNzU1MDM1NDAwNF0sIFsxNjA1NzU4Mjc2LjgzMjk5OSwgNjY4MCwgMC44MjcxMTY1NDkwMTUwNDUyXSwgWzE2MDU3NTgyNzYuODUwNzQ1LCA2NjgxLCAwLjc2ODI1OTcwNDExMzAwNjZdLCBbMTYwNTc1ODI3Ny4wMjgwMjksIDY2ODgsIDAuNzg0NzU0ODcyMzIyMDgyNV0sIFsxNjA1NzU4Mjc3LjEwMDYzMiwgNjY5MSwgMC44NDA1NzY1Mjk1MDI4Njg3XSwgWzE2MDU3NTgyNzcuMjE1Mzg3LCA2Njk2LCAwLjgyNTUxODAxMjA0NjgxNF0sIFsxNjA1NzU4Mjc3LjI4NDE0NCwgNjY5OSwgMC43Njg1NTcxOTA4OTUwODA2XSwgWzE2MDU3NTgyNzcuMzA3MDQ4LCA2NzAwLCAwLjg4MDM5NzQzOTAwMjk5MDddLCBbMTYwNTc1ODI3Ny40ODE1NTQsIDY3MDcsIDAuNzYxMTc1MzM0NDUzNTgyOF0sIFsxNjA1NzU4Mjc3LjU4MTc1MywgNjcxMSwgMC44MDU2NTMwOTUyNDUzNjEzXSwgWzE2MDU3NTgyNzcuNjY4NTI0LCA2NzE1LCAwLjc0OTM4MTQ4MjYwMTE2NThdLCBbMTYwNTc1ODI3Ny44OTEzODYsIDY3MjUsIDAuNzkyNjE5MTA5MTUzNzQ3Nl0sIFsxNjA1NzU4Mjc4LjMwNTE4MywgNjcyNiwgMC43NTg5NzgyNDc2NDI1MTcxXSwgWzE2MDU3NTgyNzguNDc0NjU3LCA2NzM4LCAwLjgyNDIzNDAwODc4OTA2MjVdLCBbMTYwNTc1ODI3OC41MzEwOTksIDY3NDIsIDAuNzQyMjc5NTI5NTcxNTMzMl0sIFsxNjA1NzU4Mjc4LjY0OTY4MywgNjc0OSwgMC44MDg3NTAzMzE0MDE4MjVdLCBbMTYwNTc1ODI3OC43NDU0MDUsIDY3NTMsIDAuODYyOTgxNzk2MjY0NjQ4NF0sIFsxNjA1NzU4Mjc4Ljk4NjA3OCwgNjc2NCwgMC43ODg4ODkxNjk2OTI5OTMyXSwgWzE2MDU3NTgyNzkuMjQxMDMzLCA2Nzc2LCAwLjc1MjE2Mzk0NjYyODU3MDZdLCBbMTYwNTc1ODI3OS41NTI3MjcsIDY3OTIsIDAuNzgzMzEwMzUzNzU1OTUwOV0sIFsxNjA1NzU4Mjc5Ljk4Nzg4NywgNjgxMywgMC43NzE1NDk1MjI4NzY3Mzk1XSwgWzE2MDU3NTgyODAuMDg5ODE2LCA2ODE3LCAwLjc5MjkxNDc0ODE5MTgzMzVdLCBbMTYwNTc1ODI4MC40NjE2NzIsIDY4MzIsIDAuODAwNjg2NTk3ODI0MDk2N10sIFsxNjA1NzU4MjgwLjU3NTQ4NSwgNjgzNywgMC43NjczMDIyMTUwOTkzMzQ3XSwgWzE2MDU3NTgyODAuNjUzMjcsIDY4NDAsIDAuODA4Njg4MDQ0NTQ4MDM0N10sIFsxNjA1NzU4MjgxLjE2NjMxNywgNjg0NiwgMC44MDM4OTQwNDI5Njg3NV0sIFsxNjA1NzU4MjgxLjIyNjg1NywgNjg1MCwgMC43NTI4NzM2NTkxMzM5MTExXSwgWzE2MDU3NTgyODEuMjkwMjM2LCA2ODU0LCAwLjc4NTE4NDAyNTc2NDQ2NTNdLCBbMTYwNTc1ODI4MS40NzIwMjksIDY4NjIsIDAuNzc5NjY4MDkyNzI3NjYxMV0sIFsxNjA1NzU4MjgxLjYxODA5NSwgNjg2OCwgMC44Mzg1MTg2MTk1MzczNTM1XSwgWzE2MDU3NTgyODEuNjUyMzg3LCA2ODY5LCAwLjg3MzgzNzQ3MTAwODMwMDhdLCBbMTYwNTc1ODI4MS42Nzc4ODQsIDY4NzAsIDAuODc2NjQ4OTAyODkzMDY2NF0sIFsxNjA1NzU4MjgyLjA1NzAzOCwgNjg4NiwgMC44MDcxNjI5NDA1MDIxNjY3XSwgWzE2MDU3NTgyODIuMTg1NDA3LCA2ODkzLCAwLjc4MzE2NDc5OTIxMzQwOTRdLCBbMTYwNTc1ODI4Mi4yMjQ5MTYsIDY4OTUsIDAuODMyMTIwNDE4NTQ4NTg0XSwgWzE2MDU3NTgyODIuMzU2ODUxLCA2OTAxLCAwLjc3NzkyNTQ5MTMzMzAwNzhdLCBbMTYwNTc1ODI4Mi41MjQyNzgsIDY5MDksIDAuNzgwMTI4NzE3NDIyNDg1NF0sIFsxNjA1NzU4MjgyLjU5Mjc1MSwgNjkxMiwgMC44MDU4MjMwODc2OTIyNjA3XSwgWzE2MDU3NTgyODIuNjc5NzgyLCA2OTE2LCAwLjc1Mzc3NTk1NDI0NjUyMV0sIFsxNjA1NzU4MjgyLjcyMjczLCA2OTE4LCAwLjgwOTQzNTM2NzU4NDIyODVdLCBbMTYwNTc1ODI4Mi44OTY4NTcsIDY5MjYsIDAuNzc2MjkxMDEyNzYzOTc3XSwgWzE2MDU3NTgyODMuMDc3ODA4LCA2OTM0LCAwLjgzMTk2NjA0MjUxODYxNTddLCBbMTYwNTc1ODI4My4xNDI5MTgsIDY5MzcsIDAuNzU5NjQ2NDE1NzEwNDQ5Ml0sIFsxNjA1NzU4MjgzLjQ2NTQ5NiwgNjk1MSwgMC44NTE0MjkyODM2MTg5MjddLCBbMTYwNTc1ODI4My41NTQ2NTIsIDY5NTUsIDAuNzg1MTgwMjcwNjcxODQ0NV0sIFsxNjA1NzU4Mjg0LjA4ODAyOSwgNjk2MywgMC43OTcyNjAyODQ0MjM4MjgxXSwgWzE2MDU3NTgyODQuMTMxMTk2LCA2OTY2LCAwLjg0MDU4OTE2NTY4NzU2MV0sIFsxNjA1NzU4Mjg0LjIxMTc5NSwgNjk3MiwgMC44MzY5NzU1NzQ0OTM0MDgyXSwgWzE2MDU3NTgyODQuNDUyOTY3LCA2OTg5LCAwLjgwMTQ2MzE4Njc0MDg3NTJdLCBbMTYwNTc1ODI4NC40NjYwNzUsIDY5OTAsIDAuNzYzMDQ1MzEwOTc0MTIxMV0sIFsxNjA1NzU4Mjg0LjQ5MjU4OSwgNjk5MiwgMC44MTA1MDcyOTc1MTU4NjkxXSwgWzE2MDU3NTgyODQuODU2NDA1LCA3MDEwLCAwLjgxMDk3Njk4MjExNjY5OTJdLCBbMTYwNTc1ODI4NC45NDQ5MDcsIDcwMTQsIDAuNzc3MDEzMzAxODQ5MzY1Ml0sIFsxNjA1NzU4Mjg1LjAxMzUzNiwgNzAxNywgMC43NDk4NTE0MDU2MjA1NzVdLCBbMTYwNTc1ODI4NS4zNDQyNiwgNzAzMiwgMC44MDQzODc0NTAyMTgyMDA3XSwgWzE2MDU3NTgyODUuNDAxNDY5LCA3MDM1LCAwLjc2NDE5NTI2MzM4NTc3MjddLCBbMTYwNTc1ODI4NS40NzgwODYsIDcwMzksIDAuNzYwOTQ3MDQ4NjY0MDkzXSwgWzE2MDU3NTgyODUuNjI5MTAyLCA3MDQ2LCAwLjc1ODkwNjc4MTY3MzQzMTRdLCBbMTYwNTc1ODI4NS42NzMyNzgsIDcwNDgsIDAuNzg2NzY4MzE3MjIyNTk1Ml0sIFsxNjA1NzU4Mjg1Ljk0MTQxLCA3MDU5LCAwLjgxMTkzMjgwMjIwMDMxNzRdLCBbMTYwNTc1ODI4Ni4wODUzNiwgNzA2NSwgMC43ODAzNTYyODc5NTYyMzc4XSwgWzE2MDU3NTgyODYuMzM4NDU1LCA3MDc2LCAwLjc1Mzk1ODcwMjA4NzQwMjNdXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/scalars/scalars?tag=Generator+XEB+Fidelity+Estimate&run=20201119-035554%2Fmetrics": {
"data": "W1sxNjA1NzU4MTYyLjQ5MjU2NywgMSwgMC44NzU1Nzk3MTQ3NzUwODU0XSwgWzE2MDU3NTgxNjQuNDE3MDY1LCAyLCAwLjY4MDAzMzU2NDU2NzU2NTldLCBbMTYwNTc1ODE2Ni4yNzY3NSwgMywgMC4zODMwOTQ3ODc1OTc2NTYyNV0sIFsxNjA1NzU4MTY4LjEyNDkyNCwgNCwgMC43MDg0MzI2NzQ0MDc5NTldLCBbMTYwNTc1ODE3MC4xMTg4NzMsIDUsIC0wLjMzNDE5ODk1MTcyMTE5MTRdLCBbMTYwNTc1ODE3MS45NzA5MzMsIDYsIDEuMDU0NTAxMDU2NjcxMTQyNl0sIFsxNjA1NzU4MTczLjgxNjgzNiwgNywgLTAuMTQwNzg5ODY2NDQ3NDQ4NzNdLCBbMTYwNTc1ODE3NS43NjQ0NTcsIDgsIDEuODc1MTU5OTc4ODY2NTc3MV0sIFsxNjA1NzU4MTc3LjU4MTQ1OSwgOSwgMC41MDg2NDc0NDE4NjQwMTM3XSwgWzE2MDU3NTgxODAuMDQwNzQ1LCAxMCwgMS42NTY5OTY3MjY5ODk3NDZdLCBbMTYwNTc1ODE4Mi4yNzI0OCwgMTEsIDEuNjE0OTgxODg5NzI0NzMxNF0sIFsxNjA1NzU4MTg0LjEzMDUwMywgMTIsIDAuODgyNzMzODIxODY4ODk2NV0sIFsxNjA1NzU4MTg2LjI0MTAwNywgMTMsIDAuMjI3NDk0MzU5MDE2NDE4NDZdLCBbMTYwNTc1ODE4OC4wNjQxNzksIDE0LCAwLjMyMDg4MjY3ODAzMTkyMTRdLCBbMTYwNTc1ODE4OS45MjM3NzQsIDE1LCAxLjE4OTM3NzA2OTQ3MzI2NjZdLCBbMTYwNTc1ODE5MS43OTQ5OTUsIDE2LCAwLjQ1MDc0NjA1OTQxNzcyNDZdLCBbMTYwNTc1ODE5My42OTY2NDQsIDE3LCAwLjY2NTA5MTUxNDU4NzQwMjNdLCBbMTYwNTc1ODE5NS42ODg2MjMsIDE4LCAwLjM4MDMyMTM4MzQ3NjI1NzNdLCBbMTYwNTc1ODE5Ny41MzI2NDIsIDE5LCAwLjI1MzUzNzc3NDA4NTk5ODU0XSwgWzE2MDU3NTgxOTkuMzc3MDYzLCAyMCwgMC40NDAyOTc5NjEyMzUwNDY0XSwgWzE2MDU3NTgyMDEuMjE2NTU3LCAyMSwgMC4wOTgxMDE4NTQzMjQzNDA4Ml0sIFsxNjA1NzU4MjAzLjA0MDE3MywgMjIsIDAuMjI5ODc5MjYwMDYzMTcxNF0sIFsxNjA1NzU4MjA1LjIyMTQ4MywgMjMsIDAuNTAxNTI3NDI4NjI3MDE0Ml0sIFsxNjA1NzU4MjA3LjAyODA1NiwgMjQsIDAuNDg3MzcyNjM2Nzk1MDQzOTVdLCBbMTYwNTc1ODIwOS4wOTY4NTksIDI1LCAwLjE0MDMxNzIwMTYxNDM3OTg4XSwgWzE2MDU3NTgyMTAuOTIwNzQzLCAyNiwgMC43NTcxNzQ4NDk1MTAxOTI5XSwgWzE2MDU3NTgyMTIuODc1MzI3LCAyNywgMC42NDk5MDY3NTQ0OTM3MTM0XSwgWzE2MDU3NTgyMTQuNzI3NjU3LCAyOCwgMC43NjMyNTcyNjUwOTA5NDI0XSwgWzE2MDU3NTgyMTYuODgxNTMxLCAyOSwgMC4yODY1MDczNjgwODc3Njg1NV0sIFsxNjA1NzU4MjE4Ljc0NzY2MiwgMzAsIDAuMzI2NjU3Mjk1MjI3MDUwOF0sIFsxNjA1NzU4MjIwLjc1NzY0NSwgMzEsIDAuNDA3NDQ0MDAwMjQ0MTQwNl0sIFsxNjA1NzU4MjIyLjYyMzc1NSwgMzIsIDAuNzIzMDU3NTA4NDY4NjI3OV0sIFsxNjA1NzU4MjI0LjkxNjIzNCwgMzMsIDAuOTk2MjE5NjM1MDA5NzY1Nl0sIFsxNjA1NzU4MjI2LjgxNjE1MiwgMzQsIDEuMDc0ODcwODI0ODEzODQyOF0sIFsxNjA1NzU4MjI4LjkxNjk0MiwgMzUsIDEuMjMwNzIxMjM1Mjc1MjY4Nl0sIFsxNjA1NzU4MjMwLjg1MTEwNiwgMzYsIDEuMzAyNDM5OTI4MDU0ODA5Nl0sIFsxNjA1NzU4MjMyLjY4MzM5NSwgMzcsIDEuMTU2MzE3NDcyNDU3ODg1N10sIFsxNjA1NzU4MjM0LjY1NzU1NiwgMzgsIDEuMTcwODA2ODg0NzY1NjI1XSwgWzE2MDU3NTgyMzYuNTk1NjMzLCAzOSwgMS4yMjUyOTk1OTY3ODY0OTldLCBbMTYwNTc1ODIzOC40MDc5NywgNDAsIDEuMjUzNTU1Mjk3ODUxNTYyNV0sIFsxNjA1NzU4MjQwLjI0ODU0NCwgNDEsIDEuMTY3MDQyMDE2OTgzMDMyMl0sIFsxNjA1NzU4MjQyLjM2ODM0NiwgNDIsIDAuOTc2OTE1MzU5NDk3MDcwM10sIFsxNjA1NzU4MjQ0LjE3ODkyOSwgNDMsIDEuMTQ1NjY2NTk5MjczNjgxNl0sIFsxNjA1NzU4MjQ2LjM5NjQ5OCwgNDQsIDEuMDMyNjQ0NTEwMjY5MTY1XSwgWzE2MDU3NTgyNDguMjMwNDI4LCA0NSwgMC45MjcyNjE5NDg1ODU1MTAzXSwgWzE2MDU3NTgyNTAuMDgwOTc0LCA0NiwgMC45NTc0Nzc1Njk1ODAwNzgxXSwgWzE2MDU3NTgyNTEuOTE0NzQ2LCA0NywgMC45ODg4MDQ4MTcxOTk3MDddLCBbMTYwNTc1ODI1My44NjAwMzIsIDQ4LCAwLjg2ODQ0Mjg5MzAyODI1OTNdLCBbMTYwNTc1ODI1NS43MTI2MTQsIDQ5LCAwLjkwMTEyNDcxNTgwNTA1MzddLCBbMTYwNTc1ODI1Ny45NDU1OTIsIDUwLCAwLjc5MTA3NTM0ODg1NDA2NDldLCBbMTYwNTc1ODI2MS4wMTk2OTIsIDUwLCAwLjk3MzQ5ODQ2MzYzMDY3NjNdLCBbMTYwNTc1ODI2My45NDY5NDMsIDUxLCAxLjAzMzMxNzU2NTkxNzk2ODhdLCBbMTYwNTc1ODI2Ni43ODU0LCA1MiwgMC45NDIyMDAzMDMwNzc2OTc4XSwgWzE2MDU3NTgyNjkuNjM1NTg2LCA1MywgMC45NDU4NjA2MjQzMTMzNTQ1XSwgWzE2MDU3NTgyNzIuMzAzMTg5LCA1NCwgMC43Mzc2NTM4NTE1MDkwOTQyXSwgWzE2MDU3NTgyNzUuMTU0ODkzLCA1NSwgMC44NjI1Nzk3MDMzMzA5OTM3XSwgWzE2MDU3NTgyNzguMTY2OTgsIDU2LCAxLjA2MzcyODA5NDEwMDk1MjFdLCBbMTYwNTc1ODI4MC45OTcxMjksIDU3LCAwLjkxNjQ1MTQ1NDE2MjU5NzddLCBbMTYwNTc1ODI4My45Mzk0NjMsIDU4LCAwLjk1NzgxMDQwMTkxNjUwMzldXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/scalars/scalars?tag=Generator+loss&run=20201119-035554%2Fmetrics": {
"data": "W1sxNjA1NzU4MTYwLjE4Mzk5NCwgMTIzLCAwLjcwMjUxNjY3NDk5NTQyMjRdLCBbMTYwNTc1ODE2MC4zNTQ2NTksIDEzNiwgMC43NTIxMTIyNjk0MDE1NTAzXSwgWzE2MDU3NTgxNjAuNDM3NzI2LCAxNDIsIDAuNzYwNTEzMjQ2MDU5NDE3N10sIFsxNjA1NzU4MTYwLjY0NjA3OSwgMTU4LCAwLjczMDMzNTcxMjQzMjg2MTNdLCBbMTYwNTc1ODE2MC42NzY2ODcsIDE2MCwgMC43Mzg5ODgyODAyOTYzMjU3XSwgWzE2MDU3NTgxNjAuNzE3NjEyLCAxNjMsIDAuNzI2NDI4NjI3OTY3ODM0NV0sIFsxNjA1NzU4MTYwLjgxNzE0NCwgMTcxLCAwLjY5OTc4MTI5ODYzNzM5MDFdLCBbMTYwNTc1ODE2MC44NTQyODMsIDE3NCwgMC43MDIzNTg3MjI2ODY3Njc2XSwgWzE2MDU3NTgxNjEuMDQ4OTk3LCAxODksIDAuNzI0MzEzNzM1OTYxOTE0MV0sIFsxNjA1NzU4MTYxLjA4NTk1MSwgMTkyLCAwLjcyNzEwODgzNjE3NDAxMTJdLCBbMTYwNTc1ODE2MS4zNDQ5ODksIDIxMiwgMC42NzI3MDEwMDExNjcyOTc0XSwgWzE2MDU3NTgxNjEuNDQzNzU5LCAyMjAsIDAuNjgxOTc1MTI2MjY2NDc5NV0sIFsxNjA1NzU4MTYxLjQ5MzU0OCwgMjI0LCAwLjY2MjcyODcyNjg2Mzg2MTFdLCBbMTYwNTc1ODE2Mi43MTE2NzksIDI0NCwgMC42NjA1MzkxNTAyMzgwMzcxXSwgWzE2MDU3NTgxNjIuODg1MDQ0LCAyNTcsIDAuNjMyODc0NjY3NjQ0NTAwN10sIFsxNjA1NzU4MTYzLjAyMjQ3OCwgMjY4LCAwLjY4ODkwNjc4ODgyNTk4ODhdLCBbMTYwNTc1ODE2My4wODgzMDEsIDI3MywgMC43NjE2MzkyMzc0MDM4Njk2XSwgWzE2MDU3NTgxNjMuMTMzMjgxLCAyNzYsIDAuNzk4MDI1OTY1NjkwNjEyOF0sIFsxNjA1NzU4MTYzLjI1MDgwNCwgMjg1LCAwLjg1NjY5NTA1NTk2MTYwODldLCBbMTYwNTc1ODE2My4zODkzNCwgMjk2LCAwLjg5MTkwNjE0MjIzNDgwMjJdLCBbMTYwNTc1ODE2My40NTQ0MiwgMzAxLCAwLjg2MjczMTY5NTE3NTE3MDldLCBbMTYwNTc1ODE2My40Nzg4MTksIDMwMywgMC44MzU1MTczNDY4NTg5NzgzXSwgWzE2MDU3NTgxNjMuNDkxMDYyLCAzMDQsIDAuODAzNzcyNDQ5NDkzNDA4Ml0sIFsxNjA1NzU4MTYzLjUzOTkxMSwgMzA4LCAwLjc3MDE3NDc0MTc0NDk5NTFdLCBbMTYwNTc1ODE2My42NDQzMDQsIDMxNiwgMC43Njk1MTU3NTI3OTIzNTg0XSwgWzE2MDU3NTgxNjMuNzkyMTE4LCAzMjUsIDAuNzc5MDgwOTI3MzcxOTc4OF0sIFsxNjA1NzU4MTYzLjg1NTYzLCAzMzAsIDAuODMzMDY2NzAxODg5MDM4MV0sIFsxNjA1NzU4MTYzLjk5Mzg2MywgMzQxLCAwLjg4ODQyNzM3Njc0NzEzMTNdLCBbMTYwNTc1ODE2NC4wNzUwODEsIDM0NywgMC44NzcyMzkwNDg0ODA5ODc1XSwgWzE2MDU3NTgxNjQuMTM3NzYyLCAzNTIsIDAuODM3NjU5MjM5NzY4OTgxOV0sIFsxNjA1NzU4MTY0LjY4NTc3NSwgMzY3LCAwLjc1MzY1Mjg3MDY1NTA1OThdLCBbMTYwNTc1ODE2NC43NzAwNTUsIDM3MywgMC43NzIxNjg1MTcxMTI3MzE5XSwgWzE2MDU3NTgxNjQuODMyNzIxLCAzNzgsIDAuNzczODIyNjY1MjE0NTM4Nl0sIFsxNjA1NzU4MTY0LjkyMTM3NiwgMzg1LCAwLjg3NTA2MTc1MDQxMTk4NzNdLCBbMTYwNTc1ODE2NC45NzEzMTMsIDM4OSwgMC45MDEzMTMwNjY0ODI1NDRdLCBbMTYwNTc1ODE2NC45OTc0MDMsIDM5MSwgMC45MzM4OTY1NDE1OTU0NTldLCBbMTYwNTc1ODE2NS4yNDc1MTUsIDQxMCwgMS4wMTEwMzIxMDQ0OTIxODc1XSwgWzE2MDU3NTgxNjUuMzA5NTQ4LCA0MTUsIDEuMDIzMjgwODU4OTkzNTMwM10sIFsxNjA1NzU4MTY1LjM4MTk4NiwgNDIxLCAxLjAwODQ3NzU2ODYyNjQwMzhdLCBbMTYwNTc1ODE2NS40NDMxMjksIDQyNiwgMS4wMjI4MzE5MTY4MDkwODJdLCBbMTYwNTc1ODE2NS40Njc2NzcsIDQyOCwgMC45ODIzNDAyMTY2MzY2NTc3XSwgWzE2MDU3NTgxNjUuNTY1MzMsIDQzNiwgMC44NjEwMDEwNzQzMTQxMTc0XSwgWzE2MDU3NTgxNjUuNzE0MzQ3LCA0NDgsIDAuODQ3MTA2MDk5MTI4NzIzMV0sIFsxNjA1NzU4MTY1LjgzNTYzOSwgNDU3LCAwLjk0MzQzMTI1ODIwMTU5OTFdLCBbMTYwNTc1ODE2NS45MzA3MzksIDQ2NSwgMS4wNDI0MjcwNjI5ODgyODEyXSwgWzE2MDU3NTgxNjYuNTAwNDE1LCA0ODEsIDAuOTI5Mjg4NjI1NzE3MTYzMV0sIFsxNjA1NzU4MTY2LjU0ODI0MSwgNDg1LCAwLjg5ODk2MDcwOTU3MTgzODRdLCBbMTYwNTc1ODE2Ni42Njc1MzYsIDQ5NSwgMC43MjE0NDYzMzUzMTU3MDQzXSwgWzE2MDU3NTgxNjcuMjI5MzU5LCA1MzksIDAuODM0MjYzODYxMTc5MzUxOF0sIFsxNjA1NzU4MTY3LjI0MTUzNywgNTQwLCAwLjgyODEwODU0OTExODA0Ml0sIFsxNjA1NzU4MTY3LjQ1NDg1NiwgNTU3LCAwLjc2MTI1ODQ4MjkzMzA0NDRdLCBbMTYwNTc1ODE2Ny40ODAwMzIsIDU1OSwgMC43OTE1MjYyNTc5OTE3OTA4XSwgWzE2MDU3NTgxNjcuNDkyMzY4LCA1NjAsIDAuNzgxNDEwMTU3NjgwNTExNV0sIFsxNjA1NzU4MTY3LjUyOTU2LCA1NjMsIDAuNzkwNDQ1ODA0NTk1OTQ3M10sIFsxNjA1NzU4MTY3LjcxMjAwMiwgNTc4LCAwLjgxNTQwMzIyMzAzNzcxOTddLCBbMTYwNTc1ODE2Ny43NDc1NzcsIDU4MSwgMC44MDUwNDA4MzYzMzQyMjg1XSwgWzE2MDU3NTgxNjcuNzU5MTgsIDU4MiwgMC43OTQ0MjU0Mjc5MTM2NjU4XSwgWzE2MDU3NTgxNjguMjgyNzc4LCA1OTIsIDAuNjk3NjIxNTgzOTM4NTk4Nl0sIFsxNjA1NzU4MTY4LjUxNjM4OSwgNjA5LCAwLjY5MDQzNzk3MjU0NTYyMzhdLCBbMTYwNTc1ODE2OC41NDQxMDQsIDYxMSwgMC43MTkyMTcxMjE2MDExMDQ3XSwgWzE2MDU3NTgxNjguODQxNDI5LCA2MzIsIDAuOTM3NzM2NTExMjMwNDY4OF0sIFsxNjA1NzU4MTY4Ljg4Mjk4NiwgNjM1LCAwLjk2MzI1MjcyMzIxNzAxMDVdLCBbMTYwNTc1ODE2OC45OTExOTksIDY0MywgMC45NTgzODkxMDM0MTI2MjgyXSwgWzE2MDU3NTgxNjkuMDczMzQ1LCA2NDksIDAuOTM4NjQ5NjU0Mzg4NDI3N10sIFsxNjA1NzU4MTY5LjEwMDYxOCwgNjUxLCAwLjk2NDE4ODYzNTM0OTI3MzddLCBbMTYwNTc1ODE2OS4xNDAwNTIsIDY1NCwgMC45NDA4NjU0NTcwNTc5NTI5XSwgWzE2MDU3NTgxNjkuMjM5OTIyLCA2NjAsIDAuOTQ4NDM5NDc4ODc0MjA2NV0sIFsxNjA1NzU4MTY5LjMwODIzNSwgNjY1LCAwLjk3NTE3MDAxNjI4ODc1NzNdLCBbMTYwNTc1ODE2OS40MzU1MzYsIDY3NSwgMC45OTg3NDg5NTgxMTA4MDkzXSwgWzE2MDU3NTgxNjkuNTExMDcsIDY4MSwgMS4wMDIzNDM0MTYyMTM5ODkzXSwgWzE2MDU3NTgxNjkuNjQwNzQ5LCA2OTEsIDAuOTc5NzAxNDU5NDA3ODA2NF0sIFsxNjA1NzU4MTY5LjcxNjY1MywgNjk3LCAxLjAwNjEwMjU2MTk1MDY4MzZdLCBbMTYwNTc1ODE2OS43NDI0MzUsIDY5OSwgMS4wNDY0NzU2NDg4ODAwMDQ5XSwgWzE2MDU3NTgxNjkuODEzMDcyLCA3MDQsIDEuMDA4OTgwMTU0OTkxMTVdLCBbMTYwNTc1ODE2OS44Mjc2NjgsIDcwNSwgMS4wMzE3NDYxNDkwNjMxMTA0XSwgWzE2MDU3NTgxNzAuMzgwNTA2LCA3MjAsIDAuOTY2MjcxNDYwMDU2MzA0OV0sIFsxNjA1NzU4MTcwLjYwNjg2NywgNzM4LCAwLjgyNTk0ODIzODM3MjgwMjddLCBbMTYwNTc1ODE3MC42MzQ3ODQsIDc0MCwgMC44MzY5MTgzNTQwMzQ0MjM4XSwgWzE2MDU3NTgxNzAuNzkyODgxLCA3NTIsIDAuODIzMTYzMTUxNzQxMDI3OF0sIFsxNjA1NzU4MTcwLjg4OTQ3OSwgNzU5LCAwLjg0NTg1MTA2MzcyODMzMjVdLCBbMTYwNTc1ODE3MC45MDE2LCA3NjAsIDAuODI0ODM1MDYyMDI2OTc3NV0sIFsxNjA1NzU4MTcwLjkyNTkzNywgNzYyLCAwLjg0MjM3NzA2NjYxMjI0MzddLCBbMTYwNTc1ODE3MC45NjM1NDUsIDc2NSwgMC44MDEyMTY1NDI3MjA3OTQ3XSwgWzE2MDU3NTgxNzAuOTg5MTc2LCA3NjcsIDAuODI2MzY3NjE2NjUzNDQyNF0sIFsxNjA1NzU4MTcxLjEzNzgxLCA3NzksIDAuNzk3NzU4MjgxMjMwOTI2NV0sIFsxNjA1NzU4MTcxLjE3MzUyNSwgNzgyLCAwLjc3MTg3MDYxMzA5ODE0NDVdLCBbMTYwNTc1ODE3MS4yMjMxLCA3ODYsIDAuNzcyODM2NzQ0Nzg1MzA4OF0sIFsxNjA1NzU4MTcxLjI2NDQ4NiwgNzg5LCAwLjczODcwNDkxOTgxNTA2MzVdLCBbMTYwNTc1ODE3MS4zMDA4MjksIDc5MiwgMC43MzUzNjU0NTAzODIyMzI3XSwgWzE2MDU3NTgxNzEuNDEyMTU1LCA4MDEsIDAuNzA3MjY2ODY3MTYwNzk3MV0sIFsxNjA1NzU4MTcxLjQ3MjE1NywgODA2LCAwLjcwNjEwODAzMzY1NzA3NF0sIFsxNjA1NzU4MTcyLjE1ODUwMiwgODMyLCAwLjc0MDY0MTExNzA5NTk0NzNdLCBbMTYwNTc1ODE3Mi4yMDg3NzQsIDgzNiwgMC43MjUwODEzODQxODE5NzYzXSwgWzE2MDU3NTgxNzIuMjU4ODAxLCA4NDAsIDAuNzM2MDczNzkxOTgwNzQzNF0sIFsxNjA1NzU4MTcyLjI3MDk3MywgODQxLCAwLjcxNjc5ODU0MzkzMDA1MzddLCBbMTYwNTc1ODE3Mi4zNTUwODIsIDg0OCwgMC43NDExMDQ4NDEyMzIyOTk4XSwgWzE2MDU3NTgxNzIuNDY1MTkxLCA4NTcsIDAuNzcwNjQ5ODUwMzY4NDk5OF0sIFsxNjA1NzU4MTcyLjUxMjgxNSwgODYxLCAwLjgwMTQyNzI0NTE0MDA3NTddLCBbMTYwNTc1ODE3Mi41NjI4NCwgODY1LCAwLjgwMjQwMzQ1MDAxMjIwN10sIFsxNjA1NzU4MTcyLjYyNDEyLCA4NzAsIDAuODA2OTQ3MjMxMjkyNzI0Nl0sIFsxNjA1NzU4MTcyLjY3MzA4NywgODc0LCAwLjgyNTc0ODQ0MzYwMzUxNTZdLCBbMTYwNTc1ODE3Mi43ODE2NDYsIDg4MywgMC44NTA3NDkxMzUwMTczOTVdLCBbMTYwNTc1ODE3Mi44MzAzNjIsIDg4NywgMC44NjE3MjMzMDM3OTQ4NjA4XSwgWzE2MDU3NTgxNzIuODQyNTEyLCA4ODgsIDAuODUzOTUxODcxMzk1MTExMV0sIFsxNjA1NzU4MTcyLjg1NDYzLCA4ODksIDAuODcxODU0MzA1MjY3MzM0XSwgWzE2MDU3NTgxNzIuODg1NzcyLCA4OTEsIDAuODYxODE1MTU0NTUyNDU5N10sIFsxNjA1NzU4MTcyLjk3MTUxNCwgODk4LCAwLjg2MjA5OTcwNzEyNjYxNzRdLCBbMTYwNTc1ODE3My4wMzIwODYsIDkwMywgMC44NzI3NTI2NjY0NzMzODg3XSwgWzE2MDU3NTgxNzMuMDU2NTk5LCA5MDUsIDAuODM5Mzk2NTM2MzUwMjUwMl0sIFsxNjA1NzU4MTczLjExODcyOSwgOTEwLCAwLjc5NDM4MzIyNzgyNTE2NDhdLCBbMTYwNTc1ODE3My4xNDQ2MDksIDkxMiwgMC44MDkzNTk2Njk2ODUzNjM4XSwgWzE2MDU3NTgxNzMuMTk0MjY1LCA5MTYsIDAuNzUzNjkzNjQwMjMyMDg2Ml0sIFsxNjA1NzU4MTczLjI2NzA3NiwgOTIwLCAwLjc0MTk2ODIxNDUxMTg3MTNdLCBbMTYwNTc1ODE3My4zNDExOTksIDkyNiwgMC43MTIzODc5MTk0MjU5NjQ0XSwgWzE2MDU3NTgxNzMuMzUzNzk3LCA5MjcsIDAuNzE2NzA1OTE4MzEyMDcyOF0sIFsxNjA1NzU4MTc0LjAyNDU4MiwgOTUwLCAwLjY5NDg5MjUyNTY3MjkxMjZdLCBbMTYwNTc1ODE3NC4wNzk5NDgsIDk1NCwgMC43MzQ3MjIzNzU4Njk3NTFdLCBbMTYwNTc1ODE3NC41MDA4NTgsIDk4NywgMS4wMzM5OTAzODMxNDgxOTM0XSwgWzE2MDU3NTgxNzQuNTYzNDI3LCA5OTIsIDEuMDE5ODM1MjMzNjg4MzU0NV0sIFsxNjA1NzU4MTc0LjU4NzE5OSwgOTk0LCAxLjAyNjcxODYxNjQ4NTU5NTddLCBbMTYwNTc1ODE3NC42NzM4NjEsIDEwMDAsIDAuOTg5MjQ0MTYzMDM2MzQ2NF0sIFsxNjA1NzU4MTc0Ljc4MTg4OCwgMTAwOCwgMC45NTk3NDMyNjEzMzcyODAzXSwgWzE2MDU3NTgxNzQuODU4MTI1LCAxMDE0LCAwLjkwMjExMjM2NDc2ODk4MTldLCBbMTYwNTc1ODE3NC45MTc1OTgsIDEwMTgsIDAuODk5Njk1NTc1MjM3Mjc0Ml0sIFsxNjA1NzU4MTc1LjAwNTI5MSwgMTAyNSwgMC44Njc4MDcwMzA2Nzc3OTU0XSwgWzE2MDU3NTgxNzUuMDMzODMxLCAxMDI3LCAwLjg0NzQyMTEwOTY3NjM2MTFdLCBbMTYwNTc1ODE3NS4xMTE2NDMsIDEwMzMsIDAuODIwNTIzODU4MDcwMzczNV0sIFsxNjA1NzU4MTc1LjEzOTI2MiwgMTAzNSwgMC43OTA0NjE5NTc0NTQ2ODE0XSwgWzE2MDU3NTgxNzUuMzMzODg0LCAxMDQ5LCAwLjcxNjA2ODAyOTQwMzY4NjVdLCBbMTYwNTc1ODE3NS4zNDY3NTgsIDEwNTAsIDAuNzE0MjMwNzc1ODMzMTI5OV0sIFsxNjA1NzU4MTc1LjQ4NTk0NSwgMTA2MCwgMC42NzY5NDc1MzQwODQzMjAxXSwgWzE2MDU3NTgxNzUuODg3MDczLCAxMDYzLCAwLjY3NzgxMzQxMDc1ODk3MjJdLCBbMTYwNTc1ODE3Ni4wMDc4NTEsIDEwNzIsIDAuNzAyOTI2MDM5Njk1NzM5N10sIFsxNjA1NzU4MTc2LjA1NTg2MywgMTA3NiwgMC42Nzg5NDUyNDMzNTg2MTIxXSwgWzE2MDU3NTgxNzYuMTA0MTI3LCAxMDgwLCAwLjY4Nzc2Mjk3NTY5Mjc0OV0sIFsxNjA1NzU4MTc2LjIxNDUsIDEwODksIDAuNjk3OTEwMzA4ODM3ODkwNl0sIFsxNjA1NzU4MTc2LjIyNjU3NiwgMTA5MCwgMC43MDc2MTgzNTU3NTEwMzc2XSwgWzE2MDU3NTgxNzYuMzAwMzUzLCAxMDk2LCAwLjczNTA1OTIwMTcxNzM3NjddLCBbMTYwNTc1ODE3Ni4zMTI0NzIsIDEwOTcsIDAuNzE1MDE2MDA3NDIzNDAwOV0sIFsxNjA1NzU4MTc2LjM3Mjg1NCwgMTEwMiwgMC43MzA3MTU3NTE2NDc5NDkyXSwgWzE2MDU3NTgxNzYuNTE2NTQ1LCAxMTE0LCAwLjc1NTExNTgwNzA1NjQyN10sIFsxNjA1NzU4MTc2LjU4OTI2LCAxMTIwLCAwLjc3NTI2OTAzMTUyNDY1ODJdLCBbMTYwNTc1ODE3Ni42MjU0NDksIDExMjMsIDAuNzkwNjY2NDYwOTkwOTA1OF0sIFsxNjA1NzU4MTc2LjczNDc2OSwgMTEzMiwgMC44MDg4MTk2NTE2MDM2OTg3XSwgWzE2MDU3NTgxNzYuNzcwMjM2LCAxMTM1LCAwLjgwNTcyODg1Mjc0ODg3MDhdLCBbMTYwNTc1ODE3Ni44Njc2MzYsIDExNDMsIDAuODA2OTYyNzI4NTAwMzY2Ml0sIFsxNjA1NzU4MTc3LjAyMjI3OSwgMTE1NSwgMC43NTE0OTg5OTcyMTE0NTYzXSwgWzE2MDU3NTgxNzcuMTA4NDYxLCAxMTYyLCAwLjc0NTEwMTE1Mzg1MDU1NTRdLCBbMTYwNTc1ODE3Ny4yNjc1NTMsIDExNzUsIDAuNzIwNzE4ODYwNjI2MjIwN10sIFsxNjA1NzU4MTc3LjcxMTc1OCwgMTE4MSwgMC43NDU2MTI0NDI0OTM0Mzg3XSwgWzE2MDU3NTgxNzcuNzYwMTA2LCAxMTg0LCAwLjcyOTU2NTAyNDM3NTkxNTVdLCBbMTYwNTc1ODE3Ny43OTQ5NTUsIDExODYsIDAuNzQzNjgxOTA3NjUzODA4Nl0sIFsxNjA1NzU4MTc3Ljg1OTE2MSwgMTE5MCwgMC43OTIwNzAzODg3OTM5NDUzXSwgWzE2MDU3NTgxNzcuOTI2OTE3LCAxMTk0LCAwLjc4MTQ2NDIxOTA5MzMyMjhdLCBbMTYwNTc1ODE3Ny45NjU5NjYsIDExOTYsIDAuNzg4MjYyOTAzNjkwMzM4MV0sIFsxNjA1NzU4MTc4LjA2MDk5MiwgMTIwMSwgMC43OTI0ODEzNjI4MTk2NzE2XSwgWzE2MDU3NTgxNzguMDc4NjEsIDEyMDIsIDAuODA1NDg5NTQwMTAwMDk3N10sIFsxNjA1NzU4MTc4LjIzNzY3NywgMTIxMSwgMC43OTUwNTk2ODA5Mzg3MjA3XSwgWzE2MDU3NTgxNzguMzY1MTQzLCAxMjE3LCAwLjc4OTkzMzY4MTQ4ODAzNzFdLCBbMTYwNTc1ODE3OC40MzQ2MDcsIDEyMjEsIDAuNzcyOTQ1NjQyNDcxMzEzNV0sIFsxNjA1NzU4MTc4LjQ1Mjg0NSwgMTIyMiwgMC43NzM1ODA0OTE1NDI4MTYyXSwgWzE2MDU3NTgxNzguNjE5NjEyLCAxMjMyLCAwLjgxODUzMjk0MzcyNTU4NTldLCBbMTYwNTc1ODE3OC43MDc1OTUsIDEyMzcsIDAuODMwNDU1NzgwMDI5Mjk2OV0sIFsxNjA1NzU4MTc4Ljk1MjgxOCwgMTI1MSwgMC45MDcwNTg5NTQyMzg4OTE2XSwgWzE2MDU3NTgxNzkuMzY3MTI3LCAxMjc0LCAwLjkzMDQzMTcyMzU5NDY2NTVdLCBbMTYwNTc1ODE3OS40Mzg5MTcsIDEyNzgsIDAuOTQ3MjA0NzY4NjU3Njg0M10sIFsxNjA1NzU4MTc5LjQ1NzM5LCAxMjc5LCAwLjk1MzY0NDI3NTY2NTI4MzJdLCBbMTYwNTc1ODE3OS40NzQyNTEsIDEyODAsIDAuOTIzMDQwNDQ5NjE5MjkzMl0sIFsxNjA1NzU4MTgwLjE1NDE5NSwgMTI5OCwgMC44MzgxMTUzMzQ1MTA4MDMyXSwgWzE2MDU3NTgxODAuMzU0NTU1LCAxMzEwLCAwLjcyODA0MDM5NzE2NzIwNThdLCBbMTYwNTc1ODE4MC4zNjk3NDksIDEzMTEsIDAuNzQwMTc5NTk4MzMxNDUxNF0sIFsxNjA1NzU4MTgwLjQ2ODQwNCwgMTMxNywgMC42OTMxNTY0ODA3ODkxODQ2XSwgWzE2MDU3NTgxODAuNTgyNjQ0LCAxMzI0LCAwLjY1Mzc4NTEwOTUxOTk1ODVdLCBbMTYwNTc1ODE4MC45OTgxMDgsIDEzNTAsIDAuNjE3NTY3NDc5NjEwNDQzMV0sIFsxNjA1NzU4MTgxLjAzOTk0LCAxMzUyLCAwLjYxODUwNzUwNDQ2MzE5NThdLCBbMTYwNTc1ODE4MS4yMDAxNTMsIDEzNjIsIDAuNjU2NTg5MTUwNDI4NzcyXSwgWzE2MDU3NTgxODEuMzgwNzUyLCAxMzczLCAwLjcwNjU3NTk4OTcyMzIwNTZdLCBbMTYwNTc1ODE4MS40Mjc1NTUsIDEzNzYsIDAuNzE5NDUzMDk2Mzg5NzcwNV0sIFsxNjA1NzU4MTgxLjQ3NDQ1NywgMTM3OSwgMC43MzE1NDA5Nzc5NTQ4NjQ1XSwgWzE2MDU3NTgxODEuNzY4MDM3LCAxMzk5LCAwLjgyMjYzNTgyOTQ0ODddLCBbMTYwNTc1ODE4MS44NTQ5NCwgMTQwNSwgMC44MzQwNjE1MDM0MTAzMzk0XSwgWzE2MDU3NTgxODEuOTU0MTIsIDE0MTIsIDAuNzk5NDU2NzE1NTgzODAxM10sIFsxNjA1NzU4MTgyLjQwNDYyNywgMTQxOCwgMC44MDg1NDY5MDA3NDkyMDY1XSwgWzE2MDU3NTgxODIuNTIyNzA5LCAxNDI4LCAwLjc3NjkxMDE4NTgxMzkwMzhdLCBbMTYwNTc1ODE4Mi41OTQwOTEsIDE0MzQsIDAuNzQ3NzEzOTIzNDU0Mjg0N10sIFsxNjA1NzU4MTgyLjYyOTkyMiwgMTQzNywgMC43NjQ0NTYyMTI1MjA1OTk0XSwgWzE2MDU3NTgxODIuNzYyMjcyLCAxNDQ4LCAwLjc1MTk0MTU2MTY5ODkxMzZdLCBbMTYwNTc1ODE4Mi43OTc3ODgsIDE0NTEsIDAuNzI0OTE5MDgwNzM0MjUyOV0sIFsxNjA1NzU4MTgyLjgzMzgzNSwgMTQ1NCwgMC43MjY5Njc0NTM5NTY2MDRdLCBbMTYwNTc1ODE4Mi44NDU2NjgsIDE0NTUsIDAuNzA4NDYzMTkxOTg2MDg0XSwgWzE2MDU3NTgxODMuMDc2MDEyLCAxNDczLCAwLjczNDY0NTQ4NTg3Nzk5MDddLCBbMTYwNTc1ODE4My40Njc1OTYsIDE1MDMsIDAuNzkwOTk2NjcwNzIyOTYxNF0sIFsxNjA1NzU4MTgzLjUwMzk2NiwgMTUwNiwgMC43NzkxNTQxMjE4NzU3NjI5XSwgWzE2MDU3NTgxODMuNTQxNjEyLCAxNTA5LCAwLjc4MDI0MzAzOTEzMTE2NDZdLCBbMTYwNTc1ODE4My41NTM1NTYsIDE1MTAsIDAuNzY3Njg0MzQwNDc2OTg5N10sIFsxNjA1NzU4MTgzLjgyNTY5NCwgMTUzMiwgMC44MjAyMjE1NDMzMTIwNzI4XSwgWzE2MDU3NTgxODQuMzk5ODEzLCAxNTQ0LCAwLjg2ODI3NzY2ODk1Mjk0MTldLCBbMTYwNTc1ODE4NC40MjcxMTIsIDE1NDYsIDAuODU4NDY1MTk0NzAyMTQ4NF0sIFsxNjA1NzU4MTg0LjQ4MzcxMiwgMTU1MCwgMC44OTMzNjQxMzE0NTA2NTMxXSwgWzE2MDU3NTgxODQuNTQwNTcyLCAxNTU0LCAwLjkyNDcxMDk4ODk5ODQxMzFdLCBbMTYwNTc1ODE4NC41OTkzODQsIDE1NTgsIDAuOTA1NzQxNTEyNzc1NDIxMV0sIFsxNjA1NzU4MTg0Ljk2NjcwNCwgMTU4MywgMC44MDM0MDYzNTc3NjUxOTc4XSwgWzE2MDU3NTgxODQuOTgxOTc4LCAxNTg0LCAwLjc4NTU1NDI4OTgxNzgxMDFdLCBbMTYwNTc1ODE4NS4xNTA5MjIsIDE1OTUsIDAuNzE2MzczNzQxNjI2NzM5NV0sIFsxNjA1NzU4MTg1LjI3NDg2NCwgMTYwMywgMC42NzI4MjkzODk1NzIxNDM2XSwgWzE2MDU3NTgxODUuMzMzODk0LCAxNjA3LCAwLjY0MzYzODY3MDQ0NDQ4ODVdLCBbMTYwNTc1ODE4NS4zNjI2NjUsIDE2MDksIDAuNjQ5NzQ3NjY5Njk2ODA3OV0sIFsxNjA1NzU4MTg1LjUxMTUzMiwgMTYxOSwgMC42NDA4NDkyMzI2NzM2NDVdLCBbMTYwNTc1ODE4NS42MTEwNDYsIDE2MjYsIDAuNjYwNDk1NDAwNDI4NzcyXSwgWzE2MDU3NTgxODUuODI4OTA1LCAxNjQxLCAwLjc1ODU4NzI0MTE3Mjc5MDVdLCBbMTYwNTc1ODE4NS44ODczNDQsIDE2NDUsIDAuODEyNTUwMTg3MTEwOTAwOV0sIFsxNjA1NzU4MTg2LjU2NDAxNSwgMTY2OSwgMC44Njk3MjQ1MTIxMDAyMTk3XSwgWzE2MDU3NTgxODYuNTc2MTM4LCAxNjcwLCAwLjkxMDc0NzcwNjg5MDEwNjJdLCBbMTYwNTc1ODE4Ni43NzE3MDksIDE2ODYsIDAuNzgzNjI2ODU0NDE5NzA4M10sIFsxNjA1NzU4MTg2Ljc4MzU2NSwgMTY4NywgMC43NTk4NzAyMzExNTE1ODA4XSwgWzE2MDU3NTgxODYuODkzODI4LCAxNjk2LCAwLjczNDA1MTc2NDAxMTM4MzFdLCBbMTYwNTc1ODE4Ni45NjkwODUsIDE3MDIsIDAuNzU0OTU1NTg5NzcxMjcwOF0sIFsxNjA1NzU4MTg3LjAyMTMyLCAxNzA2LCAwLjczNzg4ODI3NjU3Njk5NThdLCBbMTYwNTc1ODE4Ny4xNDA0NjcsIDE3MTUsIDAuNzYyMzMxNDg1NzQ4MjkxXSwgWzE2MDU3NTgxODcuMjI4MDEzLCAxNzIyLCAwLjc5MTk2NTMwNTgwNTIwNjNdLCBbMTYwNTc1ODE4Ny4yNDAxMzcsIDE3MjMsIDAuNzUwODQ0NDc4NjA3MTc3N10sIFsxNjA1NzU4MTg3LjQwMjgzMywgMTczNiwgMC43MjU3ODIxNTU5OTA2MDA2XSwgWzE2MDU3NTgxODcuNTExOTM2LCAxNzQ1LCAwLjc0MTI4ODQyMzUzODIwOF0sIFsxNjA1NzU4MTg3LjU3MTkwOCwgMTc1MCwgMC43NDc1Njc4OTIwNzQ1ODVdLCBbMTYwNTc1ODE4Ny42MzE3OTcsIDE3NTUsIDAuNzczNjIxNjc4MzUyMzU2XSwgWzE2MDU3NTgxODcuNjY2NzU3LCAxNzU4LCAwLjgwMjEyOTM4Nzg1NTUyOThdLCBbMTYwNTc1ODE4Ny43MjUzOTUsIDE3NjMsIDAuODg4MjAzOTc4NTM4NTEzMl0sIFsxNjA1NzU4MTg3Ljc2MTcwNSwgMTc2NiwgMC45MTg2Njg2Mjc3Mzg5NTI2XSwgWzE2MDU3NTgxODguMTc4NTI1LCAxNzcwLCAwLjk3MTczNjAxMzg4OTMxMjddLCBbMTYwNTc1ODE4OC4yODA0ODgsIDE3NzgsIDEuMDI1Mjk4NDc2MjE5MTc3Ml0sIFsxNjA1NzU4MTg4LjM3NjE2OCwgMTc4NiwgMS4wMDk4ODgxNzIxNDk2NTgyXSwgWzE2MDU3NTgxODguNDgxMzE4LCAxNzkzLCAwLjk3OTI4OTQ3MjEwMzExODldLCBbMTYwNTc1ODE4OC41NjUxNzYsIDE4MDAsIDAuOTM0MDcwMjI5NTMwMzM0NV0sIFsxNjA1NzU4MTg4LjY3NDM2NSwgMTgwOSwgMC44NDcyMjAwMDM2MDQ4ODg5XSwgWzE2MDU3NTgxODguNzIzNDY3LCAxODEzLCAwLjg0Mjk2MTE5MjEzMTA0MjVdLCBbMTYwNTc1ODE4OC43MzU5MzksIDE4MTQsIDAuODExNTM3Mzg0OTg2ODc3NF0sIFsxNjA1NzU4MTg4Ljc0Nzc4NiwgMTgxNSwgMC43OTM0NDk4MTkwODc5ODIyXSwgWzE2MDU3NTgxODguNzcyMTcyLCAxODE3LCAwLjc3Mzc2Mjk0MTM2MDQ3MzZdLCBbMTYwNTc1ODE4OC44MDk0MDIsIDE4MjAsIDAuNzk1MDkxMjcxNDAwNDUxN10sIFsxNjA1NzU4MTg4Ljg5NDI3LCAxODI3LCAwLjczNzIzMTc5MTAxOTQzOTddLCBbMTYwNTc1ODE4OS4wMDU3MDcsIDE4MzYsIDAuNjgyMjk3NDY4MTg1NDI0OF0sIFsxNjA1NzU4MTg5LjEzMDU0OSwgMTg0NiwgMC42OTE3NzU2Nzk1ODgzMTc5XSwgWzE2MDU3NTgxODkuMTkyOTk0LCAxODUwLCAwLjY2NTM3MTQxNzk5OTI2NzZdLCBbMTYwNTc1ODE4OS4yMTkxMDMsIDE4NTIsIDAuNjg3NjY1ODIwMTIxNzY1MV0sIFsxNjA1NzU4MTg5LjI2MDAzMiwgMTg1NSwgMC42NjcwNDI0MzQyMTU1NDU3XSwgWzE2MDU3NTgxODkuMzI5MzA1LCAxODYwLCAwLjcwNDI2NDU4MTIwMzQ2MDddLCBbMTYwNTc1ODE4OS4zNjc3MTMsIDE4NjMsIDAuNjk5NjI0Nzc2ODQwMjFdLCBbMTYwNTc1ODE4OS4zNzk0NDMsIDE4NjQsIDAuNjk3MjQ1NTM4MjM0NzEwN10sIFsxNjA1NzU4MTg5LjM5MTQ3OCwgMTg2NSwgMC43MDMxNTQ1MDQyOTkxNjM4XSwgWzE2MDU3NTgxODkuNjIxNzI1LCAxODg0LCAwLjc4MDI2NzgzNDY2MzM5MTFdLCBbMTYwNTc1ODE5MC4wOTkwOTYsIDE4OTMsIDAuODA0Mzc4ODY3MTQ5MzUzXSwgWzE2MDU3NTgxOTAuMTgzNTkxLCAxODk5LCAwLjgwOTg0NDA3NjYzMzQ1MzRdLCBbMTYwNTc1ODE5MC4yNzgwNTcsIDE5MDYsIDAuODE3ODE5MDU4ODk1MTExMV0sIFsxNjA1NzU4MTkwLjI5MTc2OCwgMTkwNywgMC44MjUzOTY4OTU0MDg2MzA0XSwgWzE2MDU3NTgxOTAuNDEwMTc4LCAxOTE2LCAwLjg0MTMwMjc1MjQ5NDgxMl0sIFsxNjA1NzU4MTkwLjQ5ODIzNCwgMTkyMywgMC44MTAzNDQ4MTUyNTQyMTE0XSwgWzE2MDU3NTgxOTAuNjQ4NTQsIDE5MzUsIDAuODU1OTg5ODEzODA0NjI2NV0sIFsxNjA1NzU4MTkwLjc2MTA3LCAxOTQ0LCAwLjg1OTU4MDM5NzYwNTg5Nl0sIFsxNjA1NzU4MTkwLjgxMTYzNSwgMTk0OCwgMC44ODE4NTQ1MzQxNDkxNjk5XSwgWzE2MDU3NTgxOTAuOTM4MDIsIDE5NTgsIDAuODE3NzU2ODkxMjUwNjEwNF0sIFsxNjA1NzU4MTkwLjk4ODE3NywgMTk2MiwgMC43NjkyMjExMjcwMzMyMzM2XSwgWzE2MDU3NTgxOTEuMDQ5MTY1LCAxOTY3LCAwLjc1NDMyMTU3NTE2NDc5NDldLCBbMTYwNTc1ODE5MS4xMDAxNTEsIDE5NzEsIDAuNzI2MTk1ODEyMjI1MzQxOF0sIFsxNjA1NzU4MTkxLjI3MjYyNywgMTk4NCwgMC43MjI5MDMzMTEyNTI1OTRdLCBbMTYwNTc1ODE5MS4zMDk3MzksIDE5ODcsIDAuNzU3NTI5NjE2MzU1ODk2XSwgWzE2MDU3NTgxOTEuMzg0NDUzLCAxOTkzLCAwLjc3NDM0ODM3ODE4MTQ1NzVdLCBbMTYwNTc1ODE5MS4zOTYzMzcsIDE5OTQsIDAuNzk0NDEzOTgzODIxODY4OV0sIFsxNjA1NzU4MTkxLjQwODQzNSwgMTk5NSwgMC44MDQyODYwNjI3MTc0Mzc3XSwgWzE2MDU3NTgxOTIuMTg3ODE0LCAyMDI5LCAwLjk4MjI4OTA3NTg1MTQ0MDRdLCBbMTYwNTc1ODE5Mi4yNjg1ODgsIDIwMzUsIDAuOTc2ODk0Mzc4NjYyMTA5NF0sIFsxNjA1NzU4MTkyLjQ5OTUxMSwgMjA1MiwgMC45MTk4OTUxMTI1MTQ0OTU4XSwgWzE2MDU3NTgxOTIuNTIzOTY4LCAyMDU0LCAwLjg5MzY1NzMyNjY5ODMwMzJdLCBbMTYwNTc1ODE5Mi41NDc5OTIsIDIwNTYsIDAuODUzNzQ4Njc5MTYxMDcxOF0sIFsxNjA1NzU4MTkyLjYyMTAxNiwgMjA2MiwgMC44MzEwNDE4MTI4OTY3Mjg1XSwgWzE2MDU3NTgxOTIuNjU3OTM2LCAyMDY1LCAwLjg4ODA0MTYxNTQ4NjE0NV0sIFsxNjA1NzU4MTkyLjY4MTgzOSwgMjA2NywgMC44MzcyNzQ5MDkwMTk0NzAyXSwgWzE2MDU3NTgxOTIuNzE4NzczLCAyMDcwLCAwLjgzMjE2MTI0NzczMDI1NTFdLCBbMTYwNTc1ODE5Mi45MTczNDksIDIwODUsIDAuNzk0NjYxOTk4NzQ4Nzc5M10sIFsxNjA1NzU4MTkzLjA5NjYzOCwgMjA5OSwgMC44MDcwODIwNTY5OTkyMDY1XSwgWzE2MDU3NTgxOTMuMTA4Nzk3LCAyMTAwLCAwLjc5MTkyMTYxNTYwMDU4NTldLCBbMTYwNTc1ODE5My4xMjEwNjEsIDIxMDEsIDAuNzc3NDcyNTU1NjM3MzU5Nl0sIFsxNjA1NzU4MTkzLjM0OTkyNSwgMjExOSwgMC43ODgwMDExMjAwOTA0ODQ2XSwgWzE2MDU3NTgxOTMuMzk3NDE3LCAyMTIzLCAwLjgyNzY1NjY4NjMwNTk5OThdLCBbMTYwNTc1ODE5My45MDA5MzYsIDIxMzEsIDAuODU1NDQwNTU3MDAzMDIxMl0sIFsxNjA1NzU4MTkzLjk1NDQ4OSwgMjEzNSwgMC44NjQ0NjU1OTQyOTE2ODddLCBbMTYwNTc1ODE5NC4wOTE3OTcsIDIxNDUsIDAuODc5MjYxNzkxNzA2MDg1Ml0sIFsxNjA1NzU4MTk0LjEzMjU5NCwgMjE0OCwgMC44ODQ1MDQ1NTY2NTU4ODM4XSwgWzE2MDU3NTgxOTQuMTczMjMsIDIxNTEsIDAuOTEwODA2ODM0Njk3NzIzNF0sIFsxNjA1NzU4MTk0LjIzMDQ1LCAyMTU0LCAwLjg4MzUwNDg2NzU1MzcxMDldLCBbMTYwNTc1ODE5NC41NTQzOCwgMjE3OCwgMC43Nzg4Mzc5MTkyMzUyMjk1XSwgWzE2MDU3NTgxOTQuNzAwNzU5LCAyMTkwLCAwLjc0NTEwNjgxNjI5MTgwOTFdLCBbMTYwNTc1ODE5NC43MTM2NDIsIDIxOTEsIDAuNzE1NTgyNTQ5NTcxOTkxXSwgWzE2MDU3NTgxOTQuNzUxMTU3LCAyMTk0LCAwLjcwNTk4MTMxNDE4MjI4MTVdLCBbMTYwNTc1ODE5NC43NjMzOTQsIDIxOTUsIDAuNzEzNTMxMTM2NTEyNzU2M10sIFsxNjA1NzU4MTk0Ljc4Nzc3LCAyMTk3LCAwLjY5OTU2NDkzMzc3Njg1NTVdLCBbMTYwNTc1ODE5NC44MTI1NDgsIDIxOTksIDAuNzI2NTM4MDYyMDk1NjQyMV0sIFsxNjA1NzU4MTk0Ljg1OTI0MiwgMjIwMywgMC43MjY2Mzg5MTMxNTQ2MDJdLCBbMTYwNTc1ODE5NC45MDc2MTIsIDIyMDcsIDAuNzA5Mzg5MzI4OTU2NjA0XSwgWzE2MDU3NTgxOTQuOTY3MTk0LCAyMjEyLCAwLjY5ODA5MzQxNDMwNjY0MDZdLCBbMTYwNTc1ODE5NC45OTE1MjcsIDIyMTQsIDAuNzI2NjYyNTE2NTkzOTMzMV0sIFsxNjA1NzU4MTk1LjIzMTgzNywgMjIyOSwgMC44Njg4MDg3NDYzMzc4OTA2XSwgWzE2MDU3NTgxOTYuMDE1NTg4LCAyMjU5LCAwLjkxMDE1NzI2MzI3ODk2MTJdLCBbMTYwNTc1ODE5Ni4wNTQ3NTcsIDIyNjIsIDAuODkzNTgxOTI2ODIyNjYyNF0sIFsxNjA1NzU4MTk2LjA2ODM5MiwgMjI2MywgMC45MTEzODA1Mjk0MDM2ODY1XSwgWzE2MDU3NTgxOTYuMTIxODA2LCAyMjY3LCAwLjg0OTIzMDE3MDI0OTkzOV0sIFsxNjA1NzU4MTk2LjE0NzQ2NywgMjI2OSwgMC44NDY3NTU5ODE0NDUzMTI1XSwgWzE2MDU3NTgxOTYuMjA5NzE0LCAyMjc0LCAwLjg3NDY1MzU3NzgwNDU2NTRdLCBbMTYwNTc1ODE5Ni4zMjk2NDYsIDIyODMsIDAuODc0ODAxMTU4OTA1MDI5M10sIFsxNjA1NzU4MTk2LjQyODEwNCwgMjI5MSwgMC44ODA0ODY3MjY3NjA4NjQzXSwgWzE2MDU3NTgxOTYuNDc4MzU5LCAyMjk1LCAwLjkwMjMwMDcxNTQ0NjQ3MjJdLCBbMTYwNTc1ODE5Ni41OTkzOTMsIDIzMDUsIDAuODk3NTM2MDM5MzUyNDE3XSwgWzE2MDU3NTgxOTYuNjI0MTM2LCAyMzA3LCAwLjg5NTA3NjUxMzI5MDQwNTNdLCBbMTYwNTc1ODE5Ni42NDgwMTgsIDIzMDksIDAuODcyMzE2MTIyMDU1MDUzN10sIFsxNjA1NzU4MTk2LjY2MDM0NCwgMjMxMCwgMC44NzExMDMxNjc1MzM4NzQ1XSwgWzE2MDU3NTgxOTYuNzA3NzcyLCAyMzE0LCAwLjgyOTM5NzkxNjc5MzgyMzJdLCBbMTYwNTc1ODE5Ni43NDM2ODUsIDIzMTcsIDAuODU2NDA5NzI4NTI3MDY5MV0sIFsxNjA1NzU4MTk2Ljg0MDM4NiwgMjMyNSwgMC44MjI1ODg1NjI5NjUzOTMxXSwgWzE2MDU3NTgxOTYuODg4MDA2LCAyMzI5LCAwLjc5OTAzOTg0MDY5ODI0MjJdLCBbMTYwNTc1ODE5Ny4wNjExNzQsIDIzNDMsIDAuNzc0NjgxOTI1NzczNjIwNl0sIFsxNjA1NzU4MTk3LjEzNDM5LCAyMzQ5LCAwLjc0Mzg4NzkwMTMwNjE1MjNdLCBbMTYwNTc1ODE5Ny4xOTU1MDEsIDIzNTQsIDAuNzc1MzQ4NDI0OTExNDk5XSwgWzE2MDU3NTgxOTcuMjA3MiwgMjM1NSwgMC43NTc4ODQ4MDA0MzQxMTI1XSwgWzE2MDU3NTgxOTcuMjMyNTgyLCAyMzU3LCAwLjc4MTMwNTg0OTU1MjE1NDVdLCBbMTYwNTc1ODE5Ny42NDExNjcsIDIzNjAsIDAuODIwMzUxNzE5ODU2MjYyMl0sIFsxNjA1NzU4MTk3LjY2NjI5OCwgMjM2MiwgMC44MDM4NTAyMzM1NTQ4NDAxXSwgWzE2MDU3NTgxOTcuNjkwODU0LCAyMzY0LCAwLjg0MDQ3MDU1MjQ0NDQ1OF0sIFsxNjA1NzU4MTk3LjcwMzE2NywgMjM2NSwgMC44NDYxNjgwNDEyMjkyNDhdLCBbMTYwNTc1ODE5Ny43ODQ4MjksIDIzNzIsIDAuODg4OTc4OTU4MTI5ODgyOF0sIFsxNjA1NzU4MTk3LjgyMDg2OCwgMjM3NSwgMC45MjUwNTY0NTc1MTk1MzEyXSwgWzE2MDU3NTgxOTcuODgxNDQxLCAyMzgwLCAwLjkyNzMxMjAxNjQ4NzEyMTZdLCBbMTYwNTc1ODE5OC4xMTM0NDksIDIzOTksIDAuODQ4MDgxMzUwMzI2NTM4MV0sIFsxNjA1NzU4MTk4LjIzNTU5OSwgMjQwOSwgMC43ODkxNjk3ODgzNjA1OTU3XSwgWzE2MDU3NTgxOTguMzE3NzkyLCAyNDE1LCAwLjgwOTc1NTkyMTM2MzgzMDZdLCBbMTYwNTc1ODE5OC4zOTQ5MzEsIDI0MjEsIDAuNzcxODcxMjA5MTQ0NTkyM10sIFsxNjA1NzU4MTk4LjQ0NDc0NiwgMjQyNSwgMC43NjU3NjYxNDM3OTg4MjgxXSwgWzE2MDU3NTgxOTguNDU2OTQ5LCAyNDI2LCAwLjc2OTExMDIwMjc4OTMwNjZdLCBbMTYwNTc1ODE5OC42MTA5MSwgMjQzNywgMC43OTQ4MDY1OTk2MTcwMDQ0XSwgWzE2MDU3NTgxOTguNjIzNjYyLCAyNDM4LCAwLjgxMzM1MzQ3ODkwODUzODhdLCBbMTYwNTc1ODE5OC44MDk1ODIsIDI0NTMsIDAuODIzNjM5MDk0ODI5NTU5M10sIFsxNjA1NzU4MTk4LjkzMTE0NiwgMjQ2MywgMC43ODI1MjQxNjg0OTEzNjM1XSwgWzE2MDU3NTgxOTkuMDQwMTk5LCAyNDcyLCAwLjc2NjE0NTM0ODU0ODg4OTJdLCBbMTYwNTc1ODE5OS42MTc4MzgsIDI0ODksIDAuODU3NTUzNzIwNDc0MjQzMl0sIFsxNjA1NzU4MTk5Ljg1MjQxNiwgMjUwNywgMS4wMzUwNjE4MzYyNDI2NzU4XSwgWzE2MDU3NTgxOTkuODY0ODM5LCAyNTA4LCAxLjA0NzQxMDI0OTcxMDA4M10sIFsxNjA1NzU4MTk5Ljg4OTk5MywgMjUxMCwgMS4wMzI5NTIwNzAyMzYyMDZdLCBbMTYwNTc1ODIwMC4wMTQ5MzUsIDI1MjAsIDAuOTI0NTgyNDgxMzg0Mjc3M10sIFsxNjA1NzU4MjAwLjA2NTAzNCwgMjUyNCwgMC44OTI2Mzc2MTA0MzU0ODU4XSwgWzE2MDU3NTgyMDAuMjAwODQ5LCAyNTM0LCAwLjc5ODA5Mjk2MTMxMTM0MDNdLCBbMTYwNTc1ODIwMC4zMDM2MTksIDI1NDIsIDAuNzU1NzgxNDcxNzI5Mjc4Nl0sIFsxNjA1NzU4MjAwLjMxNjE4MSwgMjU0MywgMC43OTI2OTc5NjYwOTg3ODU0XSwgWzE2MDU3NTgyMDAuNDU2MzQ2LCAyNTU0LCAwLjgxODk5MjAxODY5OTY0Nl0sIFsxNjA1NzU4MjAwLjU1MjkxNiwgMjU2MiwgMC44MzYxMTYzMTM5MzQzMjYyXSwgWzE2MDU3NTgyMDAuNjI0ODIyLCAyNTY4LCAwLjc2MTg4MjcyMjM3Nzc3NzFdLCBbMTYwNTc1ODIwMC42MzY4LCAyNTY5LCAwLjgyNTg0MTcyNDg3MjU4OTFdLCBbMTYwNTc1ODIwMC42NjA3MzksIDI1NzEsIDAuODAwNTE2NzI0NTg2NDg2OF0sIFsxNjA1NzU4MjAwLjY4NDgxNSwgMjU3MywgMC43ODg3MDI0MjgzNDA5MTE5XSwgWzE2MDU3NTgyMDAuNzQ1NDE4LCAyNTc4LCAwLjc2MjE5MDQwMTU1NDEwNzddLCBbMTYwNTc1ODIwMS40MjI3MjcsIDI2MDMsIDAuOTQyODc3NzY5NDcwMjE0OF0sIFsxNjA1NzU4MjAxLjQzNjUwNiwgMjYwNCwgMC44NzEyMTg4MDA1NDQ3Mzg4XSwgWzE2MDU3NTgyMDEuNTU0OTQzLCAyNjE0LCAxLjAzMjI1NTQxMTE0ODA3MTNdLCBbMTYwNTc1ODIwMS41Nzg5NTIsIDI2MTYsIDEuMDI1MjYwNTY3NjY1MV0sIFsxNjA1NzU4MjAxLjYyNjk4NywgMjYyMCwgMS4wNDI5NDM4MzUyNTg0ODM5XSwgWzE2MDU3NTgyMDEuNjM4ODcsIDI2MjEsIDEuMDU1NTAyNTMzOTEyNjU4N10sIFsxNjA1NzU4MjAxLjgwOTI1NSwgMjYzNSwgMS4wMDg2ODYzMDQwOTI0MDcyXSwgWzE2MDU3NTgyMDEuODgzMTg0LCAyNjQxLCAwLjk3MjU4NjY5MTM3OTU0NzFdLCBbMTYwNTc1ODIwMS45NDU5OTcsIDI2NDYsIDAuODk2MzYxODg3NDU0OTg2Nl0sIFsxNjA1NzU4MjAxLjk3MDgyOCwgMjY0OCwgMC44OTE4OTQzNDA1MTUxMzY3XSwgWzE2MDU3NTgyMDEuOTk2MzkxLCAyNjUwLCAwLjg0Nzk1NjA2MTM2MzIyMDJdLCBbMTYwNTc1ODIwMi4wMjM3NjgsIDI2NTIsIDAuODEzNjg1NDc2Nzc5OTM3N10sIFsxNjA1NzU4MjAyLjE4MzUwNSwgMjY2NSwgMC44MzgzMzI4OTE0NjQyMzM0XSwgWzE2MDU3NTgyMDIuMjMxOTE3LCAyNjY5LCAwLjg0Mjc4MjQ5NzQwNjAwNTldLCBbMTYwNTc1ODIwMi4yNTc1LCAyNjcxLCAwLjg1NDc3MTk3MTcwMjU3NTddLCBbMTYwNTc1ODIwMi4yOTQwOTIsIDI2NzQsIDAuODMwOTcyNDMzMDkwMjFdLCBbMTYwNTc1ODIwMi40MjIzNTIsIDI2ODQsIDAuODY4MDY1MTc4Mzk0MzE3Nl0sIFsxNjA1NzU4MjAyLjU0NDAwOCwgMjY5NCwgMC44NTgzMjk1MzQ1MzA2Mzk2XSwgWzE2MDU3NTgyMDIuNTY3NzE5LCAyNjk2LCAwLjc3NDM3ODc3NjU1MDI5M10sIFsxNjA1NzU4MjAyLjcxMzI5MiwgMjcwOCwgMC44OTE5NDg1MjExMzcyMzc1XSwgWzE2MDU3NTgyMDIuNzI1MTg3LCAyNzA5LCAwLjg4NjkyOTYzMTIzMzIxNTNdLCBbMTYwNTc1ODIwMi43Mzc4OCwgMjcxMCwgMC44ODEwMzkyMDIyMTMyODc0XSwgWzE2MDU3NTgyMDMuMjE2MDI0LCAyNzE4LCAwLjk1ODgxNDM4MjU1MzEwMDZdLCBbMTYwNTc1ODIwMy4zMDk5NjksIDI3MjQsIDEuMDEyNDMzNzY3MzE4NzI1Nl0sIFsxNjA1NzU4MjAzLjU3MTEwMSwgMjc0MSwgMC45Nzk4NTU2NTY2MjM4NDAzXSwgWzE2MDU3NTgyMDMuNjY3MDM1LCAyNzQ3LCAwLjkxNTgzNTQ0MDE1ODg0NF0sIFsxNjA1NzU4MjAzLjY4NzgwMywgMjc0OCwgMC44NjY5MDg4NDgyODU2NzVdLCBbMTYwNTc1ODIwMy44MDI0MDgsIDI3NTYsIDAuODM4NjQ3NjYzNTkzMjkyMl0sIFsxNjA1NzU4MjAzLjg4OTcwOSwgMjc2MiwgMC44MjA5NjM5Nzg3NjczOTVdLCBbMTYwNTc1ODIwMy45NzYzMzUsIDI3NjgsIDAuODA4NzQxMDkyNjgxODg0OF0sIFsxNjA1NzU4MjA0LjA1MDM1OSwgMjc3MywgMC44NDIzNzQ0NDQwMDc4NzM1XSwgWzE2MDU3NTgyMDQuNDI5MDc2LCAyNzk2LCAwLjc1NzIyNTI3NTAzOTY3MjldLCBbMTYwNTc1ODIwNC40NTkxNzMsIDI3OTgsIDAuNzY4MzU2ODAwMDc5MzQ1N10sIFsxNjA1NzU4MjA0LjUzMjkwNCwgMjgwMywgMC43NzM0ODIwODQyNzQyOTJdLCBbMTYwNTc1ODIwNC42MDQ5NzEsIDI4MDgsIDAuNzM0NzAzNzE5NjE1OTM2M10sIFsxNjA1NzU4MjA0LjgwMjc5LCAyODIxLCAwLjczMDYzNDc0ODkzNTY5OTVdLCBbMTYwNTc1ODIwNC45MTA2MDksIDI4MjgsIDAuNzczMDkwNDgxNzU4MTE3N10sIFsxNjA1NzU4MjA1LjQ3MDcxNCwgMjg0MywgMC44ODAxMDgxNzc2NjE4OTU4XSwgWzE2MDU3NTgyMDUuNjEyNDEyLCAyODU1LCAwLjkyNTExMTc3MDYyOTg4MjhdLCBbMTYwNTc1ODIwNS42NDgyNSwgMjg1OCwgMC45MTc5NjIzNzIzMDMwMDldLCBbMTYwNTc1ODIwNS43MjEzODcsIDI4NjQsIDAuODc2Mzk4NTYzMzg1MDA5OF0sIFsxNjA1NzU4MjA1LjgxODk1OSwgMjg3MiwgMC44MjQxNTE2MzUxNjk5ODI5XSwgWzE2MDU3NTgyMDUuODMwODg5LCAyODczLCAwLjc4Nzk2OTc2ODA0NzMzMjhdLCBbMTYwNTc1ODIwNS44NTQ3OTUsIDI4NzUsIDAuNzY4OTg4OTA3MzM3MTg4N10sIFsxNjA1NzU4MjA1Ljk2NDU2OSwgMjg4NCwgMC43NzU3MTI5NjY5MTg5NDUzXSwgWzE2MDU3NTgyMDYuMjUwNTE5LCAyOTA3LCAwLjg5MzM5NTMwNDY3OTg3MDZdLCBbMTYwNTc1ODIwNi4yNjMxODYsIDI5MDgsIDAuODYzMjU1MDIzOTU2Mjk4OF0sIFsxNjA1NzU4MjA2LjI3NTI2LCAyOTA5LCAwLjg5MTQ5NjY1ODMyNTE5NTNdLCBbMTYwNTc1ODIwNi4zNjQ0NDEsIDI5MTYsIDAuOTA0MzUwMDQyMzQzMTM5Nl0sIFsxNjA1NzU4MjA2LjUwMzg0NCwgMjkyNywgMC44NjcyMzU2NjA1NTI5Nzg1XSwgWzE2MDU3NTgyMDYuNTI3MzI3LCAyOTI5LCAwLjkwOTcxMDY0NTY3NTY1OTJdLCBbMTYwNTc1ODIwNi42NjkzNjcsIDI5NDEsIDAuOTIzNTkxMDE3NzIzMDgzNV0sIFsxNjA1NzU4MjA2LjY4MTU2NCwgMjk0MiwgMC45NDg4MzA3ODMzNjcxNTddLCBbMTYwNTc1ODIwNi43MTc0MjMsIDI5NDUsIDAuOTIzMzAxNzU2MzgxOTg4NV0sIFsxNjA1NzU4MjA2Ljc0MTQzOCwgMjk0NywgMC45NDQ0NTY5MzQ5Mjg4OTRdLCBbMTYwNTc1ODIwNi43NTM0MywgMjk0OCwgMC45MzQwNzc1MDEyOTY5OTcxXSwgWzE2MDU3NTgyMDcuNTI2OTIzLCAyOTc3LCAwLjk1NTI0ODk1MTkxMTkyNjNdLCBbMTYwNTc1ODIwNy42OTIzMTEsIDI5ODksIDAuODUzNDY0NDg0MjE0NzgyN10sIFsxNjA1NzU4MjA3LjcwNjA4OCwgMjk5MCwgMC44MjQ0MTY1MTgyMTEzNjQ3XSwgWzE2MDU3NTgyMDcuODMzODEzLCAyOTk5LCAwLjc4NDE2Mzk1MTg3Mzc3OTNdLCBbMTYwNTc1ODIwNy45MTkwNjksIDMwMDUsIDAuNzU1NjQ5NTY2NjUwMzkwNl0sIFsxNjA1NzU4MjA3Ljk2MjMsIDMwMDgsIDAuNzcyNzMwOTQ2NTQwODMyNV0sIFsxNjA1NzU4MjA4LjA1MDkwOCwgMzAxNCwgMC43NzAzNjAxMTIxOTAyNDY2XSwgWzE2MDU3NTgyMDguMTA5NjcyLCAzMDE4LCAwLjc5Mjc0NzYxNjc2Nzg4MzNdLCBbMTYwNTc1ODIwOC4zNTcwNTgsIDMwMzUsIDAuODE4NDk5MjA3NDk2NjQzMV0sIFsxNjA1NzU4MjA4LjM4NzM1NiwgMzAzNywgMC44MzU0MjI3NTQyODc3MTk3XSwgWzE2MDU3NTgyMDguNDAyMjkzLCAzMDM4LCAwLjg0NDcwOTE1Nzk0MzcyNTZdLCBbMTYwNTc1ODIwOC40MTU3MjEsIDMwMzksIDAuODQ4NzA5NDA0NDY4NTM2NF0sIFsxNjA1NzU4MjA4LjU3ODQwMSwgMzA1MCwgMC44MjY3MTk2NDE2ODU0ODU4XSwgWzE2MDU3NTgyMDkuMjA0ODgzLCAzMDY4LCAwLjg4MjEzNzcxNTgxNjQ5NzhdLCBbMTYwNTc1ODIwOS40Mjk0NzYsIDMwODUsIDAuOTAzNTY0NTEyNzI5NjQ0OF0sIFsxNjA1NzU4MjA5LjUxOTYyMiwgMzA5MiwgMC45MTIzNDkyMjQwOTA1NzYyXSwgWzE2MDU3NTgyMDkuNTMxNzAzLCAzMDkzLCAwLjg5NTY4NDQ4MDY2NzExNDNdLCBbMTYwNTc1ODIwOS41Njc3ODEsIDMwOTYsIDAuODc1NTY4ODY2NzI5NzM2M10sIFsxNjA1NzU4MjA5Ljc2Mzk5MiwgMzExMiwgMC43OTU3NTA1NTgzNzYzMTIzXSwgWzE2MDU3NTgyMDkuODEyNDI3LCAzMTE2LCAwLjc4MzY4NDYxMTMyMDQ5NTZdLCBbMTYwNTc1ODIwOS44NzE5NDEsIDMxMjEsIDAuNzkxNzkxMDgxNDI4NTI3OF0sIFsxNjA1NzU4MjA5Ljg5NTY0MiwgMzEyMywgMC44MTA1OTQ3OTcxMzQzOTk0XSwgWzE2MDU3NTgyMDkuOTE4MTQyLCAzMTI1LCAwLjgwMzk5ODQxMDcwMTc1MTddLCBbMTYwNTc1ODIwOS45NDE3NDMsIDMxMjcsIDAuODYxMTE5NTY4MzQ3OTMwOV0sIFsxNjA1NzU4MjA5Ljk2NTAwMSwgMzEyOSwgMC44NzU2MzE0NTE2MDY3NTA1XSwgWzE2MDU3NTgyMTAuMDEzMTYzLCAzMTMzLCAwLjg0Njc1ODM2NTYzMTEwMzVdLCBbMTYwNTc1ODIxMC4wMjY2MjcsIDMxMzQsIDAuODg4NzYzMDcwMTA2NTA2M10sIFsxNjA1NzU4MjEwLjE2MjU0LCAzMTQ1LCAxLjAwODkyNzIyNjA2NjU4OTRdLCBbMTYwNTc1ODIxMC4yMDAzOTUsIDMxNDgsIDAuOTkzNDYwNzE0ODE3MDQ3MV0sIFsxNjA1NzU4MjEwLjMwMTI2MywgMzE1NiwgMC45MjI1NzU5NTA2MjI1NTg2XSwgWzE2MDU3NTgyMTAuMzM5MDIxLCAzMTU5LCAwLjkxNDg0MDEwMjE5NTczOTddLCBbMTYwNTc1ODIxMC40NDc2MTMsIDMxNjgsIDAuODYwMTM2MTUxMzEzNzgxN10sIFsxNjA1NzU4MjEwLjYzMzQyMywgMzE4MywgMC44Mzc1MjI5MjM5NDYzODA2XSwgWzE2MDU3NTgyMTEuMDQ1NTU0LCAzMTg3LCAwLjg1MjM2NDAwMzY1ODI5NDddLCBbMTYwNTc1ODIxMS4wNzMwMTYsIDMxODksIDAuODY2MDM4MzIyNDQ4NzMwNV0sIFsxNjA1NzU4MjExLjI3NDAwNiwgMzIwNCwgMC45NDkzMjU2ODA3MzI3MjddLCBbMTYwNTc1ODIxMS40NTM2NywgMzIxNywgMC44NzIzOTUxNTc4MTQwMjU5XSwgWzE2MDU3NTgyMTEuNzY1OTI1LCAzMjQwLCAwLjc3Njg2OTgzMzQ2OTM5MDldLCBbMTYwNTc1ODIxMS45NjcwMzcsIDMyNTUsIDAuODMyODgzNzE1NjI5NTc3Nl0sIFsxNjA1NzU4MjExLjk4MDUxNywgMzI1NiwgMC44NzcwMTM5MjE3Mzc2NzA5XSwgWzE2MDU3NTgyMTIuMDYxMDUxLCAzMjYyLCAwLjk2Mjk3MzM1NjI0Njk0ODJdLCBbMTYwNTc1ODIxMi4wNzQzMjIsIDMyNjMsIDAuOTcwNDAwMTU0NTkwNjA2N10sIFsxNjA1NzU4MjEyLjE0MDk4OSwgMzI2OCwgMS4wNjA3ODY5NjI1MDkxNTUzXSwgWzE2MDU3NTgyMTIuMjA3ODAzLCAzMjczLCAxLjA5NDk0MTEzOTIyMTE5MTRdLCBbMTYwNTc1ODIxMi4yNjEzNjEsIDMyNzcsIDEuMDg5MjUwMzI2MTU2NjE2Ml0sIFsxNjA1NzU4MjEyLjI4ODAyMiwgMzI3OSwgMS4xMTU0ODk3MjEyOTgyMTc4XSwgWzE2MDU3NTgyMTIuNTAwNDg4LCAzMjk1LCAwLjk4NjMwMjYxNDIxMjAzNjFdLCBbMTYwNTc1ODIxMy4wMDYxMjYsIDMzMDYsIDAuODEzNzMyMDI4MDA3NTA3M10sIFsxNjA1NzU4MjEzLjA4OTc1MSwgMzMxMywgMC43NjcwOTQ2MTIxMjE1ODJdLCBbMTYwNTc1ODIxMy4xMDE5MjUsIDMzMTQsIDAuNzMzMzcwMTI1MjkzNzMxN10sIFsxNjA1NzU4MjEzLjE4NjMyMSwgMzMyMSwgMC43NTkwNzMzMTcwNTA5MzM4XSwgWzE2MDU3NTgyMTMuMjIyMTQzLCAzMzI0LCAwLjc5MjU2NjE4MDIyOTE4N10sIFsxNjA1NzU4MjEzLjUxOTExMywgMzM0OCwgMS4wNTAxNDgyNDg2NzI0ODU0XSwgWzE2MDU3NTgyMTMuNTYzODA2LCAzMzUxLCAwLjk4ODA3MDI0OTU1NzQ5NTFdLCBbMTYwNTc1ODIxMy42NTEyOTQsIDMzNTgsIDAuOTE1MjU1NjY1Nzc5MTEzOF0sIFsxNjA1NzU4MjEzLjY4ODU2MywgMzM2MSwgMC44OTUzMjI0NDIwNTQ3NDg1XSwgWzE2MDU3NTgyMTMuNzAwOTIsIDMzNjIsIDAuODYwODM2NTA1ODg5ODkyNl0sIFsxNjA1NzU4MjEzLjcyNTI4MSwgMzM2NCwgMC44Njg1ODk4NzgwODIyNzU0XSwgWzE2MDU3NTgyMTMuNzM3NTAxLCAzMzY1LCAwLjg1NjMyMzA2MzM3MzU2NTddLCBbMTYwNTc1ODIxMy45OTk0OSwgMzM4NSwgMC44Mzg3NTg4MjYyNTU3OTgzXSwgWzE2MDU3NTgyMTQuMDYxMDE2LCAzMzkwLCAwLjg1NTI1MTEzMzQ0MTkyNV0sIFsxNjA1NzU4MjE0LjE2ODYyNSwgMzM5OSwgMC45MTAwNTcwNjc4NzEwOTM4XSwgWzE2MDU3NTgyMTQuMTkyMDc3LCAzNDAxLCAwLjkxMjYxNjY3MDEzMTY4MzNdLCBbMTYwNTc1ODIxNC4yMTU5NDQsIDM0MDMsIDAuOTA4MDUzODc0OTY5NDgyNF0sIFsxNjA1NzU4MjE0Ljg1Nzk4OSwgMzQyMywgMC44NzgwMzAxODA5MzEwOTEzXSwgWzE2MDU3NTgyMTQuOTc4MzUsIDM0MzEsIDAuODg0MDY1NzQ3MjYxMDQ3NF0sIFsxNjA1NzU4MjE1LjE5NzUwNSwgMzQ0NSwgMC44ODAxODQ3MTAwMjU3ODc0XSwgWzE2MDU3NTgyMTUuMjE0MjcsIDM0NDYsIDAuOTAxNjkxOTczMjA5MzgxMV0sIFsxNjA1NzU4MjE1LjI4OTgzNSwgMzQ1MSwgMC44ODIyMTA0OTMwODc3Njg2XSwgWzE2MDU3NTgyMTUuMzY2MzI1LCAzNDU2LCAwLjg3NjAwNzc5NTMzMzg2MjNdLCBbMTYwNTc1ODIxNS40NzU0NTQsIDM0NjMsIDAuOTMwMTU2NDA5NzQwNDQ4XSwgWzE2MDU3NTgyMTUuNjU5NTUsIDM0NzUsIDAuOTEwMDY5OTQyNDc0MzY1Ml0sIFsxNjA1NzU4MjE1LjkxNzAyOSwgMzQ5MiwgMC45NDg0MDA5NzQyNzM2ODE2XSwgWzE2MDU3NTgyMTUuOTQ3MDkxLCAzNDk0LCAwLjk3OTE4NTUyMTYwMjYzMDZdLCBbMTYwNTc1ODIxNS45NzY4MzIsIDM0OTYsIDAuOTI5Mjc4MTM1Mjk5NjgyNl0sIFsxNjA1NzU4MjE2LjAyNDA2MSwgMzQ5OSwgMC45NzIxODM4MjM1ODU1MTAzXSwgWzE2MDU3NTgyMTYuMTAwNzM3LCAzNTA0LCAwLjk1NzI1NzM5MDAyMjI3NzhdLCBbMTYwNTc1ODIxNi4zNTUwODEsIDM1MjEsIDAuOTM1NjMxMDM2NzU4NDIyOV0sIFsxNjA1NzU4MjE2LjQyNjY5NSwgMzUyNiwgMC45MzA1NzQ1MzYzMjM1NDc0XSwgWzE2MDU3NTgyMTcuMDk1NjAxLCAzNTQ4LCAxLjAwOTU2Mjk2OTIwNzc2MzddLCBbMTYwNTc1ODIxNy4xMzE4MTIsIDM1NTEsIDEuMDEzNTc4NTM0MTI2MjgxN10sIFsxNjA1NzU4MjE3LjE5Mzg4OCwgMzU1NiwgMC45NjUzMjQyMjMwNDE1MzQ0XSwgWzE2MDU3NTgyMTcuMjgzNzkzLCAzNTYzLCAwLjg5NzA3MzAzMDQ3MTgwMThdLCBbMTYwNTc1ODIxNy4zMzM3OTEsIDM1NjcsIDAuOTEzODc3ODQ0ODEwNDg1OF0sIFsxNjA1NzU4MjE3LjM1NzI0NCwgMzU2OSwgMC45MzkzNzQzODcyNjQyNTE3XSwgWzE2MDU3NTgyMTcuNDMzOTI4LCAzNTc1LCAwLjkwMTI3Njg4NjQ2MzE2NTNdLCBbMTYwNTc1ODIxNy40NDY4NTUsIDM1NzYsIDAuOTIxMDQ0MTExMjUxODMxXSwgWzE2MDU3NTgyMTcuNTIxMTI5LCAzNTgyLCAwLjkwMzQxMTk4NDQ0MzY2NDZdLCBbMTYwNTc1ODIxNy42MTQ2NTMsIDM1ODksIDAuOTA3MDYyNjQ5NzI2ODY3N10sIFsxNjA1NzU4MjE3LjY5MTMxNCwgMzU5NSwgMC44OTY3NTc2NjIyOTYyOTUyXSwgWzE2MDU3NTgyMTcuNzMwMDkxLCAzNTk4LCAwLjkwODQxODQxNjk3NjkyODddLCBbMTYwNTc1ODIxNy45NDM1OTEsIDM2MTUsIDAuOTE5MjYxNTc0NzQ1MTc4Ml0sIFsxNjA1NzU4MjE3Ljk2ODY3NCwgMzYxNywgMC45MjQ5MDMzOTI3OTE3NDhdLCBbMTYwNTc1ODIxOC4wOTQwOTUsIDM2MjcsIDAuODgzNTY4NTI1MzE0MzMxXSwgWzE2MDU3NTgyMTguMTMyNDY5LCAzNjMwLCAwLjkwMDUzODUwNDEyMzY4NzddLCBbMTYwNTc1ODIxOC4xNTY1NSwgMzYzMiwgMC45MjU0MzQyMzE3NTgxMTc3XSwgWzE2MDU3NTgyMTguMjIyMDY1LCAzNjM3LCAwLjk0Mjg1ODA0MDMzMjc5NDJdLCBbMTYwNTc1ODIxOC40MjQxOTgsIDM2NTMsIDAuOTI0Njc4OTgxMzA0MTY4N10sIFsxNjA1NzU4MjE4LjQ0OTgxMywgMzY1NSwgMC44OTgzOTkwNTUwMDQxMTk5XSwgWzE2MDU3NTgyMTguOTA4MzcyLCAzNjYxLCAwLjk1NTMwNjg4NzYyNjY0OF0sIFsxNjA1NzU4MjE4Ljk2MzA4NCwgMzY2NSwgMC45MzY4MjQ2MTk3NzAwNV0sIFsxNjA1NzU4MjE4Ljk5MjEwNSwgMzY2NywgMC45NDA4OTQ3MjI5Mzg1Mzc2XSwgWzE2MDU3NTgyMTkuMjAyMDczLCAzNjgxLCAwLjkxMTcyNjM1NTU1MjY3MzNdLCBbMTYwNTc1ODIxOS40NDU1MDgsIDM2OTgsIDAuOTEyMTk2Mzk3NzgxMzcyMV0sIFsxNjA1NzU4MjE5LjYxNzc2MSwgMzcxMCwgMC45NjA2MTE4MjAyMjA5NDczXSwgWzE2MDU3NTgyMTkuNzI5MTYzLCAzNzE3LCAwLjk0NDUyNjI1NTEzMDc2NzhdLCBbMTYwNTc1ODIxOS43NDUwOTQsIDM3MTgsIDAuOTQzMjU1MzY0ODk0ODY2OV0sIFsxNjA1NzU4MjE5Ljk4OTI4MywgMzczNiwgMC44ODgyODgwODA2OTIyOTEzXSwgWzE2MDU3NTgyMjAuMDE2Mjk5LCAzNzM4LCAwLjkxODA2MTQzNTIyMjYyNTddLCBbMTYwNTc1ODIyMC4wNDQ1NDksIDM3NDAsIDAuOTIxNzM2MDAxOTY4MzgzOF0sIFsxNjA1NzU4MjIwLjA4MjE5NiwgMzc0MywgMC45MzkzNTkzNjY4OTM3NjgzXSwgWzE2MDU3NTgyMjAuMTIwMDA2LCAzNzQ2LCAwLjk4NDU4MTIzMjA3MDkyMjldLCBbMTYwNTc1ODIyMC4zMzc1MDEsIDM3NjMsIDAuOTM4NzI0NjM3MDMxNTU1Ml0sIFsxNjA1NzU4MjIwLjQ3MTcyOSwgMzc3NCwgMC45ODkyNjEwMzExNTA4MTc5XSwgWzE2MDU3NTgyMjAuNDgxMzM1LCAzNzc1LCAwLjk4MzA0MzI1MzQyMTc4MzRdLCBbMTYwNTc1ODIyMC45MjkyNzUsIDM3ODEsIDAuOTg4MjYzNzI2MjM0NDM2XSwgWzE2MDU3NTgyMjEuMDE2NTY0LCAzNzg4LCAwLjk2MTI3MjAwMTI2NjQ3OTVdLCBbMTYwNTc1ODIyMS4zMzUwMTgsIDM4MTIsIDAuOTU0MjQzNzc5MTgyNDM0MV0sIFsxNjA1NzU4MjIxLjQxMjMxMSwgMzgxOCwgMC45NzI4Mjg5ODQyNjA1NTkxXSwgWzE2MDU3NTgyMjEuNDM4NTk0LCAzODIwLCAwLjk0MjY2ODQzNzk1Nzc2MzddLCBbMTYwNTc1ODIyMS43MTAzMjgsIDM4NDEsIDAuOTYyMjAyNDI5NzcxNDIzM10sIFsxNjA1NzU4MjIxLjc0NzkyOCwgMzg0NCwgMC45NTEyMzcyNjEyOTUzMTg2XSwgWzE2MDU3NTgyMjEuNzk2NzQyLCAzODQ4LCAwLjk1MTk4MzYzMDY1NzE5Nl0sIFsxNjA1NzU4MjIxLjgwODU1OSwgMzg0OSwgMC45ODcwOTM5MjU0NzYwNzQyXSwgWzE2MDU3NTgyMjEuODIyMTU3LCAzODUwLCAwLjk3ODE2MzMwMTk0NDczMjddLCBbMTYwNTc1ODIyMS44OTg1OTYsIDM4NTYsIDAuOTUyMDU4MDE3MjUzODc1N10sIFsxNjA1NzU4MjIxLjkzNDk4MiwgMzg1OSwgMC45NTMxNjIzMTI1MDc2Mjk0XSwgWzE2MDU3NTgyMjEuOTYwODcyLCAzODYxLCAwLjk2Mjk0OTE1Njc2MTE2OTRdLCBbMTYwNTc1ODIyMi4wNzU4OTksIDM4NzAsIDAuOTYyMjIwNTQ5NTgzNDM1MV0sIFsxNjA1NzU4MjIyLjE2MDUyLCAzODc3LCAwLjkzNTc0ODgxNTUzNjQ5OV0sIFsxNjA1NzU4MjIyLjMyMTUzNCwgMzg5MCwgMS4wMDAyMjYyNTkyMzE1Njc0XSwgWzE2MDU3NTgyMjIuNzM3Njg3LCAzODk0LCAxLjAxMDk4NTEzNjAzMjEwNDVdLCBbMTYwNTc1ODIyMi44MDM3MTMsIDM4OTgsIDEuMDE4MDI4MTQwMDY4MDU0Ml0sIFsxNjA1NzU4MjIzLjAzMTY5NiwgMzkxMSwgMC45NzUwODg4OTQzNjcyMThdLCBbMTYwNTc1ODIyMy4wNjQ5NzYsIDM5MTMsIDAuOTUxNTIzODQwNDI3Mzk4N10sIFsxNjA1NzU4MjIzLjExNDgxNiwgMzkxNiwgMC45Mzc3NzU5Njk1MDUzMTAxXSwgWzE2MDU3NTgyMjMuMzA2OTM3LCAzOTI4LCAxLjAyNDA5NDEwNDc2Njg0NTddLCBbMTYwNTc1ODIyMy4zNjkwMDksIDM5MzIsIDAuOTYyMjg2NDcyMzIwNTU2Nl0sIFsxNjA1NzU4MjIzLjQ0Njg3OCwgMzkzNywgMC45NzU4NzU4NTQ0OTIxODc1XSwgWzE2MDU3NTgyMjMuNDc2OTkxLCAzOTM5LCAwLjk0NTEyMTIyODY5NDkxNThdLCBbMTYwNTc1ODIyMy42MzEwMTYsIDM5NDksIDEuMDExOTQ5NjU4MzkzODU5OV0sIFsxNjA1NzU4MjIzLjY2MzMzNiwgMzk1MSwgMC45MTU0NzAxODI4OTU2NjA0XSwgWzE2MDU3NTgyMjMuNjk1ODQ5LCAzOTUzLCAwLjkwOTgzNTU3NzAxMTEwODRdLCBbMTYwNTc1ODIyMy45MTM3MjEsIDM5NjYsIDEuMDI2NzQxMDI3ODMyMDMxMl0sIFsxNjA1NzU4MjI0LjE3MTM0NCwgMzk4MiwgMS4wMTI5NDY5NjMzMTAyNDE3XSwgWzE2MDU3NTgyMjQuMjQ3Njg1LCAzOTg3LCAwLjk1NTI5ODY2MjE4NTY2OV0sIFsxNjA1NzU4MjI0LjM1NzA3OCwgMzk5NCwgMC45ODA4NTA2MzY5NTkwNzU5XSwgWzE2MDU3NTgyMjUuMTI5ODY4LCA0MDE5LCAxLjAxODcwMDcxODg3OTY5OTddLCBbMTYwNTc1ODIyNS4xNDM5MzEsIDQwMjAsIDEuMDg1OTA2Mzg2Mzc1NDI3Ml0sIFsxNjA1NzU4MjI1LjE1NjYxNiwgNDAyMSwgMS4wMTAzMTY0OTExMjcwMTQyXSwgWzE2MDU3NTgyMjUuMjU1MjU5LCA0MDI4LCAwLjk2NzcwNjY4MDI5Nzg1MTZdLCBbMTYwNTc1ODIyNS4zODk0NTcsIDQwMzgsIDAuOTY0MjY3MTM0NjY2NDQyOV0sIFsxNjA1NzU4MjI1LjQ5NDA5MiwgNDA0NiwgMS4wMTM1NjAyOTUxMDQ5ODA1XSwgWzE2MDU3NTgyMjUuNTgzMDkzLCA0MDUzLCAxLjA1NDg1MTQxMjc3MzEzMjNdLCBbMTYwNTc1ODIyNS42MzI4NzQsIDQwNTcsIDEuMDQ5MzQxNTU5NDEwMDk1Ml0sIFsxNjA1NzU4MjI1Ljc3NjA4NywgNDA2OCwgMS4wMjcxMDc1OTYzOTc0XSwgWzE2MDU3NTgyMjUuODUwMTQzLCA0MDc0LCAxLjAwNTk2MzgwMjMzNzY0NjVdLCBbMTYwNTc1ODIyNS45MjMwNiwgNDA4MCwgMC45NzU3OTE5MzExNTIzNDM4XSwgWzE2MDU3NTgyMjYuMTU1ODcyLCA0MDk4LCAxLjA0ODYwMzc3MzExNzA2NTRdLCBbMTYwNTc1ODIyNi4yMDg1MjQsIDQxMDIsIDEuMDU1MjIwMzY1NTI0MjkyXSwgWzE2MDU3NTgyMjYuMzQ1NzQ0LCA0MTEzLCAxLjA4MTA5MTQwMzk2MTE4MTZdLCBbMTYwNTc1ODIyNi40MDQ5MDIsIDQxMTgsIDEuMDQ2NTI1ODM1OTkwOTA1OF0sIFsxNjA1NzU4MjI2LjQ3MzA2NSwgNDEyMywgMS4xMDUzMzcyNjIxNTM2MjU1XSwgWzE2MDU3NTgyMjYuNTIwNzk4LCA0MTI3LCAxLjEyNTgxMDM4NDc1MDM2NjJdLCBbMTYwNTc1ODIyNi41MzI5ODgsIDQxMjgsIDEuMDkwMzY1NDA5ODUxMDc0Ml0sIFsxNjA1NzU4MjI3LjA3NjM4NywgNDEzOSwgMC45ODE4NzI1NTg1OTM3NV0sIFsxNjA1NzU4MjI3LjA5MjMzOSwgNDE0MCwgMS4wNTM3MjYxOTYyODkwNjI1XSwgWzE2MDU3NTgyMjcuMjc1NDcyLCA0MTUxLCAxLjAxMzIzMzE4NDgxNDQ1MzFdLCBbMTYwNTc1ODIyNy4zMDk3MDgsIDQxNTMsIDEuMDYwNDU2Mjc1OTM5OTQxNF0sIFsxNjA1NzU4MjI3LjMyNTM2OSwgNDE1NCwgMS4wNTIwMDYxMjU0NTAxMzQzXSwgWzE2MDU3NTgyMjcuNDQwMzEyLCA0MTYxLCAxLjAzODk1MjU4OTAzNTAzNDJdLCBbMTYwNTc1ODIyNy40ODU0NDksIDQxNjQsIDEuMDM1NTQ4ODA2MTkwNDkwN10sIFsxNjA1NzU4MjI3LjUwMjM3OSwgNDE2NSwgMS4wMzcyNjE0ODYwNTM0NjY4XSwgWzE2MDU3NTgyMjcuNTE4NzYyLCA0MTY2LCAxLjA1Mzg0NzY3MDU1NTExNDddLCBbMTYwNTc1ODIyNy45NzkzMjIsIDQxOTQsIDEuMDMwMzUwOTIzNTM4MjA4XSwgWzE2MDU3NTgyMjguMTk1NjExLCA0MjExLCAxLjA4ODAwNTMwNDMzNjU0NzldLCBbMTYwNTc1ODIyOC4yNTg5NTksIDQyMTYsIDEuMTAxNDMxMTMxMzYyOTE1XSwgWzE2MDU3NTgyMjguMjcxNDc0LCA0MjE3LCAxLjA5NTMwMjEwNDk0OTk1MTJdLCBbMTYwNTc1ODIyOC4yOTc2MjcsIDQyMTksIDEuMDkwNTA0NzY1NTEwNTU5XSwgWzE2MDU3NTgyMjguNDAwMjk2LCA0MjI3LCAxLjA5MDM3MjA4NTU3MTI4OV0sIFsxNjA1NzU4MjI5LjUwNDAxMywgNDI4NSwgMS4wNjU5NTUyODEyNTc2Mjk0XSwgWzE2MDU3NTgyMjkuNjkxODQ0LCA0MzAwLCAxLjA1NDE2OTg5MzI2NDc3MDVdLCBbMTYwNTc1ODIyOS44NDA0MjQsIDQzMTEsIDEuMDgwNjE4NTAwNzA5NTMzN10sIFsxNjA1NzU4MjI5Ljg1MzUyNCwgNDMxMiwgMS4wODkwNDY1OTc0ODA3NzRdLCBbMTYwNTc1ODIyOS44Nzc5ODksIDQzMTQsIDEuMTgyODk0NDY4MzA3NDk1MV0sIFsxNjA1NzU4MjI5LjkwMTk0NiwgNDMxNiwgMS4xMTIyNDE1MDY1NzY1MzhdLCBbMTYwNTc1ODIyOS45MzgzNDMsIDQzMTksIDEuMTIyNjI5MTY1NjQ5NDE0XSwgWzE2MDU3NTgyMjkuOTUwNjk3LCA0MzIwLCAxLjA4MjE5OTU3MzUxNjg0NTddLCBbMTYwNTc1ODIyOS45NzcwOCwgNDMyMiwgMS4xMDU5OTM4NjY5MjA0NzEyXSwgWzE2MDU3NTgyMzAuMzA1MzM2LCA0MzQ1LCAxLjA1ODk3NzM2NTQ5Mzc3NDRdLCBbMTYwNTc1ODIzMC4zNzQ2OTYsIDQzNTAsIDEuMTQxMTAwNDA2NjQ2NzI4NV0sIFsxNjA1NzU4MjMwLjQxNTI0NiwgNDM1MywgMS4xMzYwOTA3NTU0NjI2NDY1XSwgWzE2MDU3NTgyMzAuNTI0NzM5LCA0MzYxLCAxLjEyNDk0MDM5NTM1NTIyNDZdLCBbMTYwNTc1ODIzMS4wMzM4NjgsIDQzNzIsIDEuMDgxMTA0MDQwMTQ1ODc0XSwgWzE2MDU3NTgyMzEuMTQxODM4LCA0MzgxLCAxLjEwOTE1Mjc5Mzg4NDI3NzNdLCBbMTYwNTc1ODIzMS4xNzkwNjgsIDQzODQsIDEuMTAxODEyNjAxMDg5NDc3NV0sIFsxNjA1NzU4MjMxLjE5MTUwNSwgNDM4NSwgMS4wNzMwMzMzMzI4MjQ3MDddLCBbMTYwNTc1ODIzMS4zMDI0NjYsIDQzOTQsIDEuMDg4MTUzMDA0NjQ2MzAxM10sIFsxNjA1NzU4MjMxLjM3NjI3LCA0NDAwLCAxLjEwMDc4NzA0MzU3MTQ3MjJdLCBbMTYwNTc1ODIzMS41NzEyNjYsIDQ0MTYsIDEuMTY4NTY1OTg4NTQwNjQ5NF0sIFsxNjA1NzU4MjMxLjY0NTM5NSwgNDQyMiwgMS4xMDE1NTQ2MzIxODY4ODk2XSwgWzE2MDU3NTgyMzEuNjk2OTA3LCA0NDI2LCAxLjE2OTY2NTQ1NTgxODE3NjNdLCBbMTYwNTc1ODIzMS44MDczMzIsIDQ0MzUsIDEuMTIyNDM1OTI3MzkxMDUyMl0sIFsxNjA1NzU4MjMxLjgzMjQzMSwgNDQzNywgMS4xNDkyOTc3MTQyMzMzOTg0XSwgWzE2MDU3NTgyMzEuOTU3NTEyLCA0NDQ2LCAxLjEzOTIzMDcyODE0OTQxNF0sIFsxNjA1NzU4MjMyLjAxMDgyMiwgNDQ1MCwgMS4xMTkwNjAzOTcxNDgxMzIzXSwgWzE2MDU3NTgyMzIuMDg2Mjg2LCA0NDU2LCAxLjE4NzAyMzA0MzYzMjUwNzNdLCBbMTYwNTc1ODIzMi4xNDg3NSwgNDQ2MSwgMS4wOTM3NDYxODUzMDI3MzQ0XSwgWzE2MDU3NTgyMzIuMjIxOTMsIDQ0NjcsIDEuMTI5MDI5OTg5MjQyNTUzN10sIFsxNjA1NzU4MjMyLjMzNTIzOCwgNDQ3NiwgMS4xNjgzMjA0MTc0MDQxNzQ4XSwgWzE2MDU3NTgyMzIuNDE3NTUyLCA0NDgzLCAxLjEzNTA5MzIxMjEyNzY4NTVdLCBbMTYwNTc1ODIzMi44MzQ4OCwgNDQ4NywgMS4xNDE3MzA1NDY5NTEyOTRdLCBbMTYwNTc1ODIzMi45NjYxMDgsIDQ0OTYsIDEuMTg5OTE3MzI1OTczNTEwN10sIFsxNjA1NzU4MjMzLjE2Nzg5OSwgNDUxMSwgMS4xNjc5NDMxMjAwMDI3NDY2XSwgWzE2MDU3NTgyMzMuMjY2NjYxLCA0NTE4LCAxLjA5MzQ3NzYwNjc3MzM3NjVdLCBbMTYwNTc1ODIzMy4zNDk4MzIsIDQ1MjQsIDEuMTUyOTE0MTY2NDUwNTAwNV0sIFsxNjA1NzU4MjMzLjQwNDIzNywgNDUyOCwgMS4xNDc4Mzc4NzcyNzM1NTk2XSwgWzE2MDU3NTgyMzMuNDE3NjA5LCA0NTI5LCAxLjEwOTg0ODg1NjkyNTk2NDRdLCBbMTYwNTc1ODIzMy42NzI4MSwgNDU0OCwgMS4xMzM0NTk1NjgwMjM2ODE2XSwgWzE2MDU3NTgyMzMuNjg1NjAzLCA0NTQ5LCAxLjEzMTI3NTY1MzgzOTExMTNdLCBbMTYwNTc1ODIzMy43MTM2OTUsIDQ1NTEsIDEuMTY4MDA5MDQyNzM5ODY4Ml0sIFsxNjA1NzU4MjMzLjc5MzM2NCwgNDU1NywgMS4xNjIzMjM5NTE3MjExOTE0XSwgWzE2MDU3NTgyMzMuODM1MDYxLCA0NTYwLCAxLjE0MDkyNDkzMDU3MjUwOThdLCBbMTYwNTc1ODIzNC4yMjA1OTYsIDQ1ODcsIDEuMTMxNTM2MjQ1MzQ2MDY5M10sIFsxNjA1NzU4MjM0LjI5MTc0LCA0NTkzLCAxLjE3NzIyMDgyMTM4MDYxNTJdLCBbMTYwNTc1ODIzNC4zNDI1NjEsIDQ1OTcsIDEuMjEzMjc2Mzg2MjYwOTg2M10sIFsxNjA1NzU4MjM0LjM3OTAzNywgNDYwMCwgMS4xMjU5NzE3OTQxMjg0MThdLCBbMTYwNTc1ODIzNC44NTAxMzQsIDQ2MDgsIDEuMTI2OTI0Mjc2MzUxOTI4N10sIFsxNjA1NzU4MjM0Ljg3NzI1OCwgNDYxMCwgMS4xMzk5NzE5NzE1MTE4NDA4XSwgWzE2MDU3NTgyMzUuMTI5OTcyLCA0NjI3LCAxLjI0NDE0NDc5NzMyNTEzNDNdLCBbMTYwNTc1ODIzNS4xNDMwODYsIDQ2MjgsIDEuMTc1Mjc5ODU1NzI4MTQ5NF0sIFsxNjA1NzU4MjM1LjQwNjEzOSwgNDY0NywgMS4yNTYyMzg5MzczNzc5Mjk3XSwgWzE2MDU3NTgyMzUuNDE5MzMxLCA0NjQ4LCAxLjIwODg2NDkyNzI5MTg3MDFdLCBbMTYwNTc1ODIzNS40NTk1OTgsIDQ2NTEsIDEuMjA3ODczMzQ0NDIxMzg2N10sIFsxNjA1NzU4MjM1LjU1NDM1LCA0NjU4LCAxLjE5MDY3OTMxMTc1MjMxOTNdLCBbMTYwNTc1ODIzNS41ODExNjQsIDQ2NjAsIDEuMjI1NDE0ODcyMTY5NDk0Nl0sIFsxNjA1NzU4MjM1LjY4NTc2LCA0NjY4LCAxLjA4Nzk0MTc2NTc4NTIxNzNdLCBbMTYwNTc1ODIzNS43MTE4MDIsIDQ2NzAsIDEuMTU1Nzk2NzY2MjgxMTI4XSwgWzE2MDU3NTgyMzUuNzI0NzM4LCA0NjcxLCAxLjEyNjI3OTgzMDkzMjYxNzJdLCBbMTYwNTc1ODIzNS44ODU3NDQsIDQ2ODQsIDEuMTgwOTI1MzY5MjYyNjk1M10sIFsxNjA1NzU4MjM1LjkxMDksIDQ2ODYsIDEuMTYxMzI2NDA4Mzg2MjMwNV0sIFsxNjA1NzU4MjM2LjA0Mjc0NCwgNDY5NiwgMS4xNjY2ODE3NjY1MTAwMDk4XSwgWzE2MDU3NTgyMzYuMDgwMDc3LCA0Njk5LCAxLjE0MzY4OTE1NTU3ODYxMzNdLCBbMTYwNTc1ODIzNi4yMTcxOTEsIDQ3MTAsIDEuMjI5MDE2OTAwMDYyNTYxXSwgWzE2MDU3NTgyMzYuMjU0NjcxLCA0NzEzLCAxLjE4MTk5NzA2MDc3NTc1NjhdLCBbMTYwNTc1ODIzNi4yNzkwNzksIDQ3MTUsIDEuMTYxODAzMjQ1NTQ0NDMzNl0sIFsxNjA1NzU4MjM2LjMwMzAxNywgNDcxNywgMS4xOTk5MTIwNzEyMjgwMjczXSwgWzE2MDU3NTgyMzYuODE2NDc5LCA0NzI5LCAxLjIyNDAxMDk0NDM2NjQ1NV0sIFsxNjA1NzU4MjM3LjAzMjYyNiwgNDc0NiwgMS4xNTE4MTg1MTM4NzAyMzkzXSwgWzE2MDU3NTgyMzcuMjE2NTM4LCA0NzYxLCAxLjIxNzM3MDAzMzI2NDE2MDJdLCBbMTYwNTc1ODIzNy4yODgyMzQsIDQ3NjcsIDEuMTM2MzIyNzM2NzQwMTEyM10sIFsxNjA1NzU4MjM3LjM3MjcwMSwgNDc3NCwgMS4xNzcyNzEyNDY5MTAwOTUyXSwgWzE2MDU3NTgyMzcuNDY5MjM5LCA0NzgyLCAxLjE3ODEyMTA4OTkzNTMwMjddLCBbMTYwNTc1ODIzNy41MTY5NDUsIDQ3ODYsIDEuMjI1MDc5NTM2NDM3OTg4M10sIFsxNjA1NzU4MjM3LjYwMTg2LCA0NzkzLCAxLjE4ODE3NTY3ODI1MzE3MzhdLCBbMTYwNTc1ODIzNy42MTM1MzYsIDQ3OTQsIDEuMTY2MTI3MjA0ODk1MDE5NV0sIFsxNjA1NzU4MjM3LjYyNTgyNiwgNDc5NSwgMS4xMTYyNTMwMTgzNzkyMTE0XSwgWzE2MDU3NTgyMzcuNzQ1MDY0LCA0ODA1LCAxLjE3MTU0ODYwNDk2NTIxXSwgWzE2MDU3NTgyMzguMDA1Mzg5LCA0ODI2LCAxLjIwMDcwMjE5MDM5OTE3XSwgWzE2MDU3NTgyMzguMDY3NjY2LCA0ODMxLCAxLjEyNjU5MDQ5MDM0MTE4NjVdLCBbMTYwNTc1ODIzOC4xMjgzOTMsIDQ4MzYsIDEuMjQzNTYxOTgzMTA4NTIwNV0sIFsxNjA1NzU4MjM4LjU2NDY3MywgNDg0MiwgMS4yMzQ3NTI0MTY2MTA3MTc4XSwgWzE2MDU3NTgyMzguNjg0ODY4LCA0ODUyLCAxLjE5ODI5MTQyMDkzNjU4NDVdLCBbMTYwNTc1ODIzOC43NDUwODMsIDQ4NTcsIDEuMjM4NDczMTc2OTU2MTc2OF0sIFsxNjA1NzU4MjM4LjgxNjQyLCA0ODYzLCAxLjE5MjkyMTg3NjkwNzM0ODZdLCBbMTYwNTc1ODIzOC44NjQzMiwgNDg2NywgMS4xOTkzMDEwMDQ0MDk3OV0sIFsxNjA1NzU4MjM4Ljg3NTcxLCA0ODY4LCAxLjIwODA0NTM2MzQyNjIwODVdLCBbMTYwNTc1ODIzOC45ODAwNTYsIDQ4NzYsIDEuMjMwNzYxNTI4MDE1MTM2N10sIFsxNjA1NzU4MjM5LjAxNzYwNSwgNDg3OSwgMS4xNzEzODgxNDkyNjE0NzQ2XSwgWzE2MDU3NTgyMzkuMDMwMDcsIDQ4ODAsIDEuMTcxNTQxNTcxNjE3MTI2NV0sIFsxNjA1NzU4MjM5LjA1NTIzMiwgNDg4MiwgMS4yMjk3Njk1ODc1MTY3ODQ3XSwgWzE2MDU3NTgyMzkuMTA1MzYzLCA0ODg1LCAxLjE1ODYxMTUzNjAyNjAwMV0sIFsxNjA1NzU4MjM5LjIyOTA0NiwgNDg5NCwgMS4yMDIxNTQ5OTQwMTA5MjUzXSwgWzE2MDU3NTgyMzkuMjY1NjQyLCA0ODk3LCAxLjI3MjQ2MDQ2MDY2Mjg0MThdLCBbMTYwNTc1ODIzOS4yNzc5NTUsIDQ4OTgsIDEuMjM1OTIxODU5NzQxMjExXSwgWzE2MDU3NTgyMzkuMzAyNDQsIDQ5MDAsIDEuMjE4MDQwOTQzMTQ1NzUyXSwgWzE2MDU3NTgyMzkuMzI4NTI3LCA0OTAyLCAxLjE5NTAwMTYwMjE3Mjg1MTZdLCBbMTYwNTc1ODIzOS4zNjQ1MjMsIDQ5MDUsIDEuMTk1ODk3NTc5MTkzMTE1Ml0sIFsxNjA1NzU4MjM5LjM3NjM1MywgNDkwNiwgMS4xNzQ4MzM0MTY5Mzg3ODE3XSwgWzE2MDU3NTgyMzkuNDQ4MTE1LCA0OTEyLCAxLjE3MDYwNzkyNDQ2MTM2NDddLCBbMTYwNTc1ODIzOS41MTk3NjcsIDQ5MTgsIDEuMjM4NTExNTYyMzQ3NDEyXSwgWzE2MDU3NTgyMzkuNTQzMjU0LCA0OTIwLCAxLjIwODY3MTA5Mjk4NzA2MDVdLCBbMTYwNTc1ODIzOS41Nzg5MDEsIDQ5MjMsIDEuMTc0NTg1NTgwODI1ODA1N10sIFsxNjA1NzU4MjM5LjgyNTQ0NywgNDk0MywgMS4xODExMDc4Nzg2ODQ5OTc2XSwgWzE2MDU3NTgyMzkuODQ5MzgzLCA0OTQ1LCAxLjIwNzY4MDU4MzAwMDE4M10sIFsxNjA1NzU4MjQwLjM4NzI0OCwgNDk1OCwgMS4xNjU4ODQ5NzE2MTg2NTIzXSwgWzE2MDU3NTgyNDAuNTQ2NTM3LCA0OTcwLCAxLjE2ODQ5MjkxMzI0NjE1NDhdLCBbMTYwNTc1ODI0MC44MDI1NDcsIDQ5ODksIDEuMjY1ODI2OTQwNTM2NDk5XSwgWzE2MDU3NTgyNDAuODI5MzgzLCA0OTkxLCAxLjE5NjQyMjkzNDUzMjE2NTVdLCBbMTYwNTc1ODI0MS4wODE3MTUsIDUwMDcsIDEuMjEwMzQ0MTk1MzY1OTA1OF0sIFsxNjA1NzU4MjQxLjEyODE4LCA1MDEwLCAxLjI0NDE1NjI0MTQxNjkzMTJdLCBbMTYwNTc1ODI0MS4xNTg4MTMsIDUwMTIsIDEuMjU5MTA2ODc0NDY1OTQyNF0sIFsxNjA1NzU4MjQxLjE3NDA5NywgNTAxMywgMS4yMjk3OTE2NDEyMzUzNTE2XSwgWzE2MDU3NTgyNDEuNDY4NzI2LCA1MDMyLCAxLjMyNzYxMzExNTMxMDY2OV0sIFsxNjA1NzU4MjQxLjgzNzkyOSwgNTA1NiwgMS4yNTExMzY1NDEzNjY1NzcxXSwgWzE2MDU3NTgyNDEuODgyNTIzLCA1MDU5LCAxLjIwMDM2NjczNTQ1ODM3NF0sIFsxNjA1NzU4MjQyLjA4ODEyMiwgNTA3MiwgMS4yOTczODI4MzE1NzM0ODYzXSwgWzE2MDU3NTgyNDIuNTQ0ODYyLCA1MDgwLCAxLjI0MDA1OTM3NTc2MjkzOTVdLCBbMTYwNTc1ODI0Mi42NDI2MzcsIDUwODgsIDEuMjAyNjUzMTY5NjMxOTU4XSwgWzE2MDU3NTgyNDIuNjU0MDg2LCA1MDg5LCAxLjIyNzUzODEwODgyNTY4MzZdLCBbMTYwNTc1ODI0Mi42OTAzNjgsIDUwOTIsIDEuMjY1NzU1NDE0OTYyNzY4Nl0sIFsxNjA1NzU4MjQyLjcxMzkzMywgNTA5NCwgMS4yNTAzMTMwNDM1OTQzNjA0XSwgWzE2MDU3NTgyNDIuNzI2MTcyLCA1MDk1LCAxLjMwMjg3MTcwNDEwMTU2MjVdLCBbMTYwNTc1ODI0Mi44OTQwMDMsIDUxMDksIDEuMjE0MTEyMjgxNzk5MzE2NF0sIFsxNjA1NzU4MjQyLjk4OTQzNSwgNTExNywgMS4yNTUzODg0OTgzMDYyNzQ0XSwgWzE2MDU3NTgyNDMuMjYyNTI1LCA1MTM5LCAxLjE4NjY2NDEwNDQ2MTY3XSwgWzE2MDU3NTgyNDMuMzM1NjQsIDUxNDUsIDEuMjEzOTk1MDk5MDY3Njg4XSwgWzE2MDU3NTgyNDMuMzcyNzksIDUxNDgsIDEuMjc3MjA5MjgxOTIxMzg2N10sIFsxNjA1NzU4MjQzLjQ1OTYzOSwgNTE1NSwgMS4zMDk2NjU2Nzk5MzE2NDA2XSwgWzE2MDU3NTgyNDMuNjE2OTg3LCA1MTY4LCAxLjI4ODUxMzMwMjgwMzAzOTZdLCBbMTYwNTc1ODI0My42NDA0MzksIDUxNzAsIDEuMjUwMjA4MDIwMjEwMjY2MV0sIFsxNjA1NzU4MjQzLjY1MjEwNywgNTE3MSwgMS4yNDYwMzAzMzA2NTc5NTldLCBbMTYwNTc1ODI0My43MzgwNjgsIDUxNzgsIDEuMjQ3MDY0OTQ4MDgxOTcwMl0sIFsxNjA1NzU4MjQ0LjM1NzM5NSwgNTE5NiwgMS4yMzY3NjY1NzY3NjY5Njc4XSwgWzE2MDU3NTgyNDQuNTk1NDYyLCA1MjEyLCAxLjMyNzc3NjkwODg3NDUxMTddLCBbMTYwNTc1ODI0NC43MDIzMzEsIDUyMTksIDEuMzE1MTg1MDcwMDM3ODQxOF0sIFsxNjA1NzU4MjQ0Ljc4MTQ2NywgNTIyNCwgMS4yNTI0MTA0MTE4MzQ3MTY4XSwgWzE2MDU3NTgyNDQuNzk3MzY4LCA1MjI1LCAxLjI2NDc1MTA3NjY5ODMwMzJdLCBbMTYwNTc1ODI0NC44OTY1NDEsIDUyMzEsIDEuMTk3MDc5MTgxNjcxMTQyNl0sIFsxNjA1NzU4MjQ1LjEwMTQyNSwgNTI0NCwgMS4zMDc0NzI5NDQyNTk2NDM2XSwgWzE2MDU3NTgyNDUuMTQyNDc4LCA1MjQ2LCAxLjMzMjAxNjcwNjQ2NjY3NDhdLCBbMTYwNTc1ODI0NS4yNDIzNDYsIDUyNTIsIDEuMjgyNjk3Njc3NjEyMzA0N10sIFsxNjA1NzU4MjQ1LjYzODU0NCwgNTI3OCwgMS4yODYwMjYyMzkzOTUxNDE2XSwgWzE2MDU3NTgyNDUuNzEyOTg3LCA1MjgzLCAxLjI1NzIwNjIwMTU1MzM0NDddLCBbMTYwNTc1ODI0NS45MDg0NzQsIDUyOTYsIDEuMzYyMjQ3MjI4NjIyNDM2NV0sIFsxNjA1NzU4MjQ1Ljk2Nzk2NSwgNTMwMCwgMS4zNTgyNDIyNzMzMzA2ODg1XSwgWzE2MDU3NTgyNDYuNjAyNjMzLCA1MzE4LCAxLjI1ODA4Mjg2NjY2ODcwMTJdLCBbMTYwNTc1ODI0Ni42OTkwMzYsIDUzMjYsIDEuMjg5ODYwMTI5MzU2Mzg0M10sIFsxNjA1NzU4MjQ2Ljk4MjcwMiwgNTM0OSwgMS4zMTU3MDk0NzE3MDI1NzU3XSwgWzE2MDU3NTgyNDcuMDIzODk3LCA1MzUyLCAxLjM4NTY4NzU4OTY0NTM4NTddLCBbMTYwNTc1ODI0Ny4wMzY4MzEsIDUzNTMsIDEuMjIxOTcxOTg4Njc3OTc4NV0sIFsxNjA1NzU4MjQ3LjA2MjA3MywgNTM1NSwgMS4zMDQyODQ2OTE4MTA2MDhdLCBbMTYwNTc1ODI0Ny4wODYwNzIsIDUzNTcsIDEuMTU0Nzc2MDk2MzQzOTk0MV0sIFsxNjA1NzU4MjQ3LjEwNTE5OCwgNTM1OCwgMS4yNzYwOTMyNDQ1NTI2MTIzXSwgWzE2MDU3NTgyNDcuMTU1NDI0LCA1MzYyLCAxLjMxOTk5MzczNDM1OTc0MTJdLCBbMTYwNTc1ODI0Ny4zODI3MjMsIDUzODAsIDEuMjgyMTYxNzEyNjQ2NDg0NF0sIFsxNjA1NzU4MjQ3LjQzMTYxNSwgNTM4NCwgMS4yMzc5MjY2MDIzNjM1ODY0XSwgWzE2MDU3NTgyNDcuNzEzNTEzLCA1NDA3LCAxLjM0MjEyNDQ2MjEyNzY4NTVdLCBbMTYwNTc1ODI0Ny44NzIyMjgsIDU0MjAsIDEuMzc4NDc1MzA4NDE4Mjc0XSwgWzE2MDU3NTgyNDguNDQ5ODc2LCA1NDM2LCAxLjI4OTU3NDI2NTQ4MDA0MTVdLCBbMTYwNTc1ODI0OC41OTM2OTgsIDU0NDcsIDEuMzE0NTQxMTAxNDU1Njg4NV0sIFsxNjA1NzU4MjQ4LjYwODAwOCwgNTQ0OCwgMS4zMDk2MzM5NzAyNjA2MjAxXSwgWzE2MDU3NTgyNDguNzkxNzExLCA1NDYzLCAxLjM5MjM3NzYxNDk3NDk3NTZdLCBbMTYwNTc1ODI0OC44Mjc5NTYsIDU0NjYsIDEuMzUyNTM5MTgxNzA5Mjg5Nl0sIFsxNjA1NzU4MjQ4Ljk1OTQ5MiwgNTQ3NywgMS4yOTUwNTc0MTU5NjIyMTkyXSwgWzE2MDU3NTgyNDguOTcxNTA4LCA1NDc4LCAxLjI5ODExODQ3MjA5OTMwNDJdLCBbMTYwNTc1ODI0OS4wMDk0MTksIDU0ODEsIDEuMzAyNDU5MDAxNTQxMTM3N10sIFsxNjA1NzU4MjQ5LjIzMzcwMiwgNTQ5OCwgMS4zMTE5NjExNzQwMTEyMzA1XSwgWzE2MDU3NTgyNDkuMjkwOTY5LCA1NTAyLCAxLjI4Njg3MDM2MDM3NDQ1MDddLCBbMTYwNTc1ODI0OS41MzkzMzksIDU1MjIsIDEuMjkzMjAzODMwNzE4OTk0MV0sIFsxNjA1NzU4MjQ5LjU2MzcwNCwgNTUyNCwgMS4yODY1OTc5NjcxNDc4MjcxXSwgWzE2MDU3NTgyNDkuNzMyNDIyLCA1NTM4LCAxLjMwNzQzMDc0NDE3MTE0MjZdLCBbMTYwNTc1ODI0OS43OTE4MTMsIDU1NDMsIDEuMzQ4ODEwOTExMTc4NTg4OV0sIFsxNjA1NzU4MjUwLjMyOTExOSwgNTU1NywgMS4yNzQzMjI5ODY2MDI3ODMyXSwgWzE2MDU3NTgyNTAuMzQyMDE3LCA1NTU4LCAxLjIzMzk5NzEwNjU1MjEyNF0sIFsxNjA1NzU4MjUwLjM2NTc5NywgNTU2MCwgMS4yNjg3MjQ5MTgzNjU0Nzg1XSwgWzE2MDU3NTgyNTAuNDI3MzA1LCA1NTY1LCAxLjI5MTExMjMwMzczMzgyNTddLCBbMTYwNTc1ODI1MC43NzU4MzIsIDU1OTMsIDEuMzI3NTQ3NTUwMjAxNDE2XSwgWzE2MDU3NTgyNTAuODg3MzY5LCA1NjAyLCAxLjM4MDEwODM1NjQ3NTgzXSwgWzE2MDU3NTgyNTAuOTc0NTg0LCA1NjA5LCAxLjI4NTY2MzAwODY4OTg4MDRdLCBbMTYwNTc1ODI1MS4wMjU4OTksIDU2MTMsIDEuMzQ4MTY3ODk2MjcwNzUyXSwgWzE2MDU3NTgyNTEuMTAwNTI4LCA1NjE5LCAxLjQyNTk4NzYwMTI4MDIxMjRdLCBbMTYwNTc1ODI1MS4xODAxNzEsIDU2MjUsIDEuMzM5MjEzMjUyMDY3NTY2XSwgWzE2MDU3NTgyNTEuMjQzNDc3LCA1NjMwLCAxLjM2MjMwMTU4ODA1ODQ3MTddLCBbMTYwNTc1ODI1MS4yODA0NTEsIDU2MzMsIDEuMjg4MzEwMTcwMTczNjQ1XSwgWzE2MDU3NTgyNTEuMzAzODE0LCA1NjM1LCAxLjMxMTUwNzIyNTAzNjYyMV0sIFsxNjA1NzU4MjUxLjQ5MDg5NSwgNTY1MCwgMS40MTkzMzY0MzgxNzkwMTYxXSwgWzE2MDU3NTgyNTEuNjAxNTMyLCA1NjU5LCAxLjIxNzM1NTk2NjU2Nzk5MzJdLCBbMTYwNTc1ODI1Mi4wNjMwNzksIDU2NjcsIDEuNDEzNTMzMDkxNTQ1MTA1XSwgWzE2MDU3NTgyNTIuMjAxNTA4LCA1Njc3LCAxLjQxNjY1Mzc1MjMyNjk2NTNdLCBbMTYwNTc1ODI1Mi4yODY4MjMsIDU2ODQsIDEuMzUxODM0MDU4NzYxNTk2N10sIFsxNjA1NzU4MjUyLjM0OTc0MywgNTY4OSwgMS4yMjM0OTg0NjM2MzA2NzYzXSwgWzE2MDU3NTgyNTIuMzc0MTIyLCA1NjkxLCAxLjI3MTk2MDk3MzczOTYyNF0sIFsxNjA1NzU4MjUyLjQxMjEzOCwgNTY5NCwgMS4zOTcyODQwMzA5MTQzMDY2XSwgWzE2MDU3NTgyNTIuNTMwNjMxLCA1NzAzLCAxLjQwMzI1OTk5MjU5OTQ4NzNdLCBbMTYwNTc1ODI1Mi41NTYwMjEsIDU3MDUsIDEuMzIyNDM3Mjg2Mzc2OTUzMV0sIFsxNjA1NzU4MjUyLjYzNTA5MiwgNTcxMSwgMS4zNzM1Mzg3MzI1Mjg2ODY1XSwgWzE2MDU3NTgyNTIuNzk0MDIyLCA1NzIzLCAxLjM0MDQ0MTcwMzc5NjM4NjddLCBbMTYwNTc1ODI1Mi44NzIxODMsIDU3MjgsIDEuMzk1NjIzOTIyMzQ4MDIyNV0sIFsxNjA1NzU4MjUzLjAxMjQ3NywgNTczOCwgMS4zNTg5NzQ0NTY3ODcxMDk0XSwgWzE2MDU3NTgyNTMuMTQ3NjE2LCA1NzQ4LCAxLjQwODc0MzYxOTkxODgyMzJdLCBbMTYwNTc1ODI1My4xNzU1MTcsIDU3NTAsIDEuMzc3NzgwMDc5ODQxNjEzOF0sIFsxNjA1NzU4MjUzLjM4NjQyNSwgNTc2NSwgMS4zNzc0Njc2MzIyOTM3MDEyXSwgWzE2MDU3NTgyNTMuNTMwNjM4LCA1Nzc2LCAxLjM4ODQzNjA3OTAyNTI2ODZdLCBbMTYwNTc1ODI1My41NTczNzYsIDU3NzgsIDEuNDU2OTcwNDUzMjYyMzI5XSwgWzE2MDU3NTgyNTMuOTY4NDYyLCA1NzgyLCAxLjQwNTI5MzEwNzAzMjc3NTldLCBbMTYwNTc1ODI1NC4xMTcwOTgsIDU3OTQsIDEuNDEyOTE4Njg2ODY2NzYwM10sIFsxNjA1NzU4MjU0LjE1NTAxOSwgNTc5NywgMS4yMzg2NjUzNDIzMzA5MzI2XSwgWzE2MDU3NTgyNTQuNTkyMDQ2LCA1ODMxLCAxLjM3MjYwMDY3NDYyOTIxMTRdLCBbMTYwNTc1ODI1NC42Nzk4MDQsIDU4MzgsIDEuMjQxNDUxMjYzNDI3NzM0NF0sIFsxNjA1NzU4MjU0LjcxNTgzNiwgNTg0MSwgMS4zNzk2Mzk5ODMxNzcxODVdLCBbMTYwNTc1ODI1NC43NjQxOTksIDU4NDUsIDEuMzU5MzY4MDg1ODYxMjA2XSwgWzE2MDU3NTgyNTQuOTMyNzI2LCA1ODU5LCAxLjM4MjkwNDUyOTU3MTUzMzJdLCBbMTYwNTc1ODI1NS4wNjg5NzMsIDU4NzAsIDEuMzQ4MDMwNDQ3OTU5OV0sIFsxNjA1NzU4MjU1LjE1NTg2MywgNTg3NywgMS4zNjM0ODM2NjczNzM2NTcyXSwgWzE2MDU3NTgyNTUuMjQ5MDA1LCA1ODg0LCAxLjUyNzg2NTQwOTg1MTA3NDJdLCBbMTYwNTc1ODI1NS4zODg0MDUsIDU4OTQsIDEuMzQ2MzgzOTI5MjUyNjI0NV0sIFsxNjA1NzU4MjU1LjQyMzc3NSwgNTg5NywgMS4zOTY5MzcxMzE4ODE3MTM5XSwgWzE2MDU3NTgyNTUuODU0MzY0LCA1OTAyLCAxLjMxMDUyODM5NzU2MDExOTZdLCBbMTYwNTc1ODI1NS45MzI1MDksIDU5MDcsIDEuMzY0NjU5NjY3MDE1MDc1N10sIFsxNjA1NzU4MjU2LjAyNDIyNiwgNTkxMywgMS4zNjY1MTExMDY0OTEwODg5XSwgWzE2MDU3NTgyNTYuMjE2Nzk2LCA1OTI1LCAxLjM1MTMxMjM5ODkxMDUyMjVdLCBbMTYwNTc1ODI1Ni4yMzM1NzIsIDU5MjYsIDEuNDA0NTYzMTg4NTUyODU2NF0sIFsxNjA1NzU4MjU2LjUwNzIwMywgNTk0MywgMS40MDY5NTQyODg0ODI2NjZdLCBbMTYwNTc1ODI1Ni41NTQwNDMsIDU5NDYsIDEuNDIxNzExOTIxNjkxODk0NV0sIFsxNjA1NzU4MjU2LjY2Mjg5NiwgNTk1MywgMS4zMjgzODI0OTIwNjU0Mjk3XSwgWzE2MDU3NTgyNTYuODU0MjMsIDU5NjUsIDEuMzI5NjMwODUxNzQ1NjA1NV0sIFsxNjA1NzU4MjU3LjA4OTkyLCA1OTgwLCAxLjQ0ODMyODQ5NTAyNTYzNDhdLCBbMTYwNTc1ODI1Ny4xMjQxNjUsIDU5ODIsIDEuMzQ3NDI3ODQ1MDAxMjIwN10sIFsxNjA1NzU4MjU3LjIzNDAxMiwgNTk4OSwgMS40MjAxMjkyOTkxNjM4MTg0XSwgWzE2MDU3NTgyNTcuNDAwMDE0LCA1OTk5LCAxLjQwOTcyNzIxNTc2NjkwNjddLCBbMTYwNTc1ODI1Ny41Mjc2MTQsIDYwMDcsIDEuMzYwMDk4MTIzNTUwNDE1XSwgWzE2MDU3NTgyNTcuNTYwMjQ2LCA2MDA5LCAxLjM5NzQ1MzA2OTY4Njg4OTZdLCBbMTYwNTc1ODI1Ny41OTA4MDQsIDYwMTEsIDEuNDMzMjI1ODcwMTMyNDQ2M10sIFsxNjA1NzU4MjU3LjYzNjUxLCA2MDE0LCAxLjQwMTk3NjIyNzc2MDMxNV0sIFsxNjA1NzU4MjU3LjY2OTU3MywgNjAxNiwgMS4zNDE0MzU2NzA4NTI2NjExXSwgWzE2MDU3NTgyNTguMjg2ODYyLCA1OTA3LCAxLjQ1NTAzODc4NTkzNDQ0ODJdLCBbMTYwNTc1ODI1OC41MjQ1MDgsIDU5MTcsIDEuMzkyODExNTM2Nzg4OTQwNF0sIFsxNjA1NzU4MjU4LjU0NzE5NSwgNTkxOCwgMS41MzMzMDE1OTE4NzMxNjldLCBbMTYwNTc1ODI1OC43Nzk3MjUsIDU5MjgsIDEuMzgwODA0NTM4NzI2ODA2Nl0sIFsxNjA1NzU4MjU4Ljg2MjM2MiwgNTkzMiwgMS4zNTk2ODcwODk5MjAwNDRdLCBbMTYwNTc1ODI1OC44ODU3MDcsIDU5MzMsIDEuMzkxNDU4MzkyMTQzMjQ5NV0sIFsxNjA1NzU4MjU5LjI5NjI4MywgNTk1MiwgMS40MDE0NzkyNDQyMzIxNzc3XSwgWzE2MDU3NTgyNTkuNDMwMzUyLCA1OTU3LCAxLjM1NDAwODMxNjk5MzcxMzRdLCBbMTYwNTc1ODI1OS40NzQwNCwgNTk1OSwgMS40MzU2MDY5NTY0ODE5MzM2XSwgWzE2MDU3NTgyNTkuNDk2NDg2LCA1OTYwLCAxLjQyMjE5NjYyNjY2MzIwOF0sIFsxNjA1NzU4MjU5LjU2NDUyMSwgNTk2MywgMS4zNjI5ODQ2NTcyODc1OTc3XSwgWzE2MDU3NTgyNTkuNzcyODI2LCA1OTcyLCAxLjQ4NTE5ODczNjE5MDc5Nl0sIFsxNjA1NzU4MjYwLjE1NDMzMiwgNTk5MCwgMS40MjgyMzMzODUwODYwNTk2XSwgWzE2MDU3NTgyNjAuNjEzMTQxLCA2MDEwLCAxLjQ4MTMxNTI1NTE2NTFdLCBbMTYwNTc1ODI2MC43MTUwMDgsIDYwMTUsIDEuNDMyNDYzNTI2NzI1NzY5XSwgWzE2MDU3NTgyNjEuMTkzNTc1LCA2MDE5LCAxLjQzODk2NTY3ODIxNTAyNjldLCBbMTYwNTc1ODI2MS4zMjkyNTgsIDYwMjQsIDEuNDEzMzI0NzEzNzA2OTcwMl0sIFsxNjA1NzU4MjYxLjQ2NTA2OSwgNjAzMCwgMS4zMTc2NTY4NzQ2NTY2NzcyXSwgWzE2MDU3NTgyNjEuNDg2MTc5LCA2MDMxLCAxLjQ0MTY1MDYyOTA0MzU3OV0sIFsxNjA1NzU4MjYxLjUwNjAxNywgNjAzMiwgMS4zNzc0OTEyMzU3MzMwMzIyXSwgWzE2MDU3NTgyNjEuNTc0ODk0LCA2MDM1LCAxLjM0MjQwNjAzNDQ2OTYwNDVdLCBbMTYwNTc1ODI2MS42NDYxMjQsIDYwMzgsIDEuNDI2NTc2MTM3NTQyNzI0Nl0sIFsxNjA1NzU4MjYxLjkyODc5MSwgNjA1MiwgMS40NTExOTYxOTM2OTUwNjg0XSwgWzE2MDU3NTgyNjIuMDM1MDIyLCA2MDU3LCAxLjQwNDA1Nzk3OTU4Mzc0MDJdLCBbMTYwNTc1ODI2Mi4wOTY1MzUsIDYwNjAsIDEuNDI3MTQ4ODE4OTY5NzI2Nl0sIFsxNjA1NzU4MjYyLjQ1MjA1NCwgNjA3NywgMS40NjE0NDM0MjQyMjQ4NTM1XSwgWzE2MDU3NTgyNjIuNDcyMzkzLCA2MDc4LCAxLjUzMDM0Njc1MTIxMzA3MzddLCBbMTYwNTc1ODI2Mi41NTQyMzMsIDYwODIsIDEuMzc2MzA2NTMzODEzNDc2Nl0sIFsxNjA1NzU4MjYyLjY2OTIzLCA2MDg3LCAxLjM4NDg2MTQ2OTI2ODc5ODhdLCBbMTYwNTc1ODI2Mi44MTI1OSwgNjA5NCwgMS40Mzc4MjY1MTQyNDQwNzk2XSwgWzE2MDU3NTgyNjMuMDA1NzM2LCA2MTAzLCAxLjQ2OTI5MjQwMjI2NzQ1Nl0sIFsxNjA1NzU4MjYzLjA0NTE2OCwgNjEwNSwgMS40NDkyNzE2Nzg5MjQ1NjA1XSwgWzE2MDU3NTgyNjMuMjU0OTU3LCA2MTE1LCAxLjQ1NjQ4OTgwMTQwNjg2MDRdLCBbMTYwNTc1ODI2My4zOTE3NjEsIDYxMjEsIDEuMzgwMDQ2ODQ0NDgyNDIxOV0sIFsxNjA1NzU4MjYzLjQzNjU0NSwgNjEyMywgMS4zNjYyNjk4MjY4ODkwMzhdLCBbMTYwNTc1ODI2My41NjEzMjQsIDYxMjksIDEuNDg1NTgwMDg2NzA4MDY4OF0sIFsxNjA1NzU4MjYzLjYwMDU5OCwgNjEzMSwgMS40MTE2MDM2ODkxOTM3MjU2XSwgWzE2MDU3NTgyNjMuNjQxODE2LCA2MTMzLCAxLjQ1NzEyMjU2NDMxNTc5Nl0sIFsxNjA1NzU4MjY0LjI4NjYzMSwgNjE0NSwgMS4zODQ3MjU0NTE0Njk0MjE0XSwgWzE2MDU3NTgyNjQuMzI1ODIsIDYxNDcsIDEuNTExNDg0MTQ2MTE4MTY0XSwgWzE2MDU3NTgyNjQuMzczMTIxLCA2MTQ5LCAxLjM2NjY3NTg1MzcyOTI0OF0sIFsxNjA1NzU4MjY0LjU0NjMzOCwgNjE1NywgMS40NTI0NzI5MjUxODYxNTcyXSwgWzE2MDU3NTgyNjQuODU2OTc1LCA2MTcyLCAxLjQ4OTc1MzEyNzA5ODA4MzVdLCBbMTYwNTc1ODI2NC45Mzk3NTksIDYxNzYsIDEuNDUxMTA1MzU2MjE2NDMwN10sIFsxNjA1NzU4MjY1LjA1MTY5MiwgNjE4MSwgMS40MDk0MzM2MDMyODY3NDMyXSwgWzE2MDU3NTgyNjUuMTEyODQ0LCA2MTg0LCAxLjM3OTA5NjAzMTE4ODk2NDhdLCBbMTYwNTc1ODI2NS40NjA5MiwgNjIwMCwgMS40NjgxNTMyMzgyOTY1MDg4XSwgWzE2MDU3NTgyNjUuNjY4MDQ0LCA2MjEwLCAxLjQxMDIzNjU5NzA2MTE1NzJdLCBbMTYwNTc1ODI2NS42ODgxODEsIDYyMTEsIDEuNDQyODIwMDcyMTc0MDcyM10sIFsxNjA1NzU4MjY1LjcyOTA0OSwgNjIxMywgMS41Mzc0NTQ2MDUxMDI1MzldLCBbMTYwNTc1ODI2NS44NTQ3NTYsIDYyMTksIDEuNDEzMzI1MTkwNTQ0MTI4NF0sIFsxNjA1NzU4MjY1Ljg3MzY5MiwgNjIyMCwgMS4zOTk5MjUzNTExNDI4ODMzXSwgWzE2MDU3NTgyNjUuOTgwMzg3LCA2MjI1LCAxLjQ1NDM5NzY3ODM3NTI0NDFdLCBbMTYwNTc1ODI2Ni4xMjAwMjEsIDYyMzIsIDEuNTIwNjg5NzI1ODc1ODU0NV0sIFsxNjA1NzU4MjY2LjIxNjU3NCwgNjIzNywgMS40MTQ1NjQxMzI2OTA0Mjk3XSwgWzE2MDU3NTgyNjYuMzU2OTUyLCA2MjQ0LCAxLjUxMjA0MTgwNzE3NDY4MjZdLCBbMTYwNTc1ODI2Ni40NjY5MzUsIDYyNTAsIDEuMzcwNzcxNDA4MDgxMDU0N10sIFsxNjA1NzU4MjY3LjEyMTM3OSwgNjI2MywgMS40NDY0ODU1MTk0MDkxNzk3XSwgWzE2MDU3NTgyNjcuMjU2NTc4LCA2MjcwLCAxLjQzNzYyOTgxODkxNjMyMDhdLCBbMTYwNTc1ODI2Ny42NTAxODksIDYyODksIDEuNDQ2MTA0NzY0OTM4MzU0NV0sIFsxNjA1NzU4MjY4LjA4NDAyMSwgNjMwOSwgMS40MTIxMjI3MjY0NDA0Mjk3XSwgWzE2MDU3NTgyNjguMTUyMDg4LCA2MzEyLCAxLjU2NzY2Nzg0MTkxMTMxNl0sIFsxNjA1NzU4MjY4LjIzNTYxNywgNjMxNiwgMS41MTg0ODk5NTY4NTU3NzRdLCBbMTYwNTc1ODI2OC4yNTg2NjQsIDYzMTcsIDEuNDU1MzQ2MTA3NDgyOTEwMl0sIFsxNjA1NzU4MjY4LjQwODY3MiwgNjMyNCwgMS41MDgxODMzNjAwOTk3OTI1XSwgWzE2MDU3NTgyNjguNzY0MTMsIDYzNDEsIDEuNDA0NDc1OTI3MzUyOTA1M10sIFsxNjA1NzU4MjY4Ljk4MDc4LCA2MzUyLCAxLjUzMjUyMTk2MzExOTUwNjhdLCBbMTYwNTc1ODI2OS4xOTMzNjUsIDYzNjMsIDEuNDY1NzYyNDk1OTk0NTY3OV0sIFsxNjA1NzU4MjY5LjMzMTIwMiwgNjM3MCwgMS40NzM2MjI2Nzk3MTAzODgyXSwgWzE2MDU3NTgyNjkuODY5NTM4LCA2Mzc2LCAxLjQ3MTc1MzU5NzI1OTUyMTVdLCBbMTYwNTc1ODI3MC4zNjM1MywgNjQwMCwgMS41NDg0MjY1MDg5MDM1MDM0XSwgWzE2MDU3NTgyNzAuNzU5MTgyLCA2NDIzLCAxLjQ0OTE5OTQzODA5NTA5MjhdLCBbMTYwNTc1ODI3MC45MDk1NSwgNjQzMiwgMS41MTUxOTA4Mzk3Njc0NTZdLCBbMTYwNTc1ODI3MS4xOTAyMzEsIDY0NDcsIDEuNTE1OTgzMzQzMTI0Mzg5Nl0sIFsxNjA1NzU4MjcxLjIwOTM3LCA2NDQ4LCAxLjQ0NzAwMDg2MTE2NzkwNzddLCBbMTYwNTc1ODI3MS4zNjcxMTgsIDY0NTUsIDEuNDUzNTE0ODE0Mzc2ODMxXSwgWzE2MDU3NTgyNzEuNDQxMjM4LCA2NDU5LCAxLjUxMjU2NTM3NDM3NDM4OTZdLCBbMTYwNTc1ODI3MS43MDI0NjIsIDY0NzIsIDEuNDkzMTYwMjQ3ODAyNzM0NF0sIFsxNjA1NzU4MjcxLjcyMzEyOCwgNjQ3MywgMS40MTg1MTExNTIyNjc0NTZdLCBbMTYwNTc1ODI3MS45MTc1MjEsIDY0ODMsIDEuNDgzNjU4OTA5Nzk3NjY4NV0sIFsxNjA1NzU4MjcyLjAwMDUwNiwgNjQ4NywgMS42MDQwMzUzNzc1MDI0NDE0XSwgWzE2MDU3NTgyNzIuNTUwOTksIDY0OTUsIDEuNTEwNjAxNTIwNTM4MzNdLCBbMTYwNTc1ODI3Mi41NzE4NjYsIDY0OTYsIDEuNTAzOTgwODc1MDE1MjU4OF0sIFsxNjA1NzU4MjcyLjY2MDcxNywgNjUwMCwgMS40NjgzMzIwNTIyMzA4MzVdLCBbMTYwNTc1ODI3Mi44MzU3OCwgNjUwOSwgMS41MjE1MjIwNDUxMzU0OThdLCBbMTYwNTc1ODI3Mi44NTQ5NCwgNjUxMCwgMS40NDY5ODM4MTQyMzk1MDJdLCBbMTYwNTc1ODI3My4wNjY5NjMsIDY1MjAsIDEuNTc1MjI2NTQ1MzMzODYyM10sIFsxNjA1NzU4MjczLjA4NTQyMywgNjUyMSwgMS41Mjc0MTE0NjA4NzY0NjQ4XSwgWzE2MDU3NTgyNzMuMTAyOTA2LCA2NTIyLCAxLjQyMDA4OTg0MDg4ODk3N10sIFsxNjA1NzU4MjczLjI3MTE3MywgNjUzMCwgMS41MDUzMzEwMzk0Mjg3MTFdLCBbMTYwNTc1ODI3My4zNjYxMDEsIDY1MzQsIDEuNTQwNzcxOTYxMjEyMTU4Ml0sIFsxNjA1NzU4MjczLjcyODQ5MywgNjU1MCwgMS40NTAyNDk2NzE5MzYwMzUyXSwgWzE2MDU3NTgyNzMuODg1MjcsIDY1NTgsIDEuNTA3NDg5NjgxMjQzODk2NV0sIFsxNjA1NzU4Mjc0LjE2Mjc3MywgNjU3NCwgMS42MzA0Mjg0MzM0MTgyNzRdLCBbMTYwNTc1ODI3NC4yNTE4NTQsIDY1NzgsIDEuNDk0MzA0MTgwMTQ1MjYzN10sIFsxNjA1NzU4Mjc0LjI5MjQ1MywgNjU4MCwgMS40MzkyNTkxNzE0ODU5MDA5XSwgWzE2MDU3NTgyNzQuMzEyODM3LCA2NTgxLCAxLjQxMDg4Mjk0OTgyOTEwMTZdLCBbMTYwNTc1ODI3NC4zNzg4MjcsIDY1ODQsIDEuNDM3MzY1MTc0MjkzNTE4XSwgWzE2MDU3NTgyNzQuNTk0NDg4LCA2NTkzLCAxLjQ3MDY0ODc2NTU2Mzk2NDhdLCBbMTYwNTc1ODI3NC42MTUwNjksIDY1OTQsIDEuNDUzMjE2MDc1ODk3MjE2OF0sIFsxNjA1NzU4Mjc0Ljc5OTQyMSwgNjYwMywgMS40NzY2NzA3NDIwMzQ5MTJdLCBbMTYwNTc1ODI3NC44NjIzMywgNjYwNiwgMS40NDY5NjE2NDEzMTE2NDU1XSwgWzE2MDU3NTgyNzUuNDA5ODg1LCA2NjE2LCAxLjU4NzcxMzI0MTU3NzE0ODRdLCBbMTYwNTc1ODI3NS41MDYyODIsIDY2MjEsIDEuNTcxODIzMzU4NTM1NzY2Nl0sIFsxNjA1NzU4Mjc2LjE0MDQ1MSwgNjY0OSwgMS41NDYxNzA4MzA3MjY2MjM1XSwgWzE2MDU3NTgyNzYuMzIzMzE0LCA2NjU3LCAxLjQ2MzA1MzM0NTY4MDIzNjhdLCBbMTYwNTc1ODI3Ni41MjY4NjUsIDY2NjYsIDEuNTM5MjI0NjI0NjMzNzg5XSwgWzE2MDU3NTgyNzYuNTcxMjksIDY2NjgsIDEuNTc4OTEyMDE5NzI5NjE0M10sIFsxNjA1NzU4Mjc2LjY1MDc4NSwgNjY3MiwgMS40NTg1NjAyMjgzNDc3NzgzXSwgWzE2MDU3NTgyNzYuNzkwNjQ2LCA2Njc4LCAxLjUyMjM2ODE5MjY3MjcyOTVdLCBbMTYwNTc1ODI3Ni44MzI0ODcsIDY2ODAsIDEuNTQwMDY5NDYwODY4ODM1NF0sIFsxNjA1NzU4Mjc2Ljg1MDIzNSwgNjY4MSwgMS41NTYxMzYxMzEyODY2MjFdLCBbMTYwNTc1ODI3Ny4wMjc0ODcsIDY2ODgsIDEuNTE0NDE3NDA5ODk2ODUwNl0sIFsxNjA1NzU4Mjc3LjA5OTk3NCwgNjY5MSwgMS40NDQ0NTY4MTU3MTk2MDQ1XSwgWzE2MDU3NTgyNzcuMjE0NzE4LCA2Njk2LCAxLjU2MjAwODg1NzcyNzA1MDhdLCBbMTYwNTc1ODI3Ny4yODM2MiwgNjY5OSwgMS41NTU3MDQ4MzIwNzcwMjY0XSwgWzE2MDU3NTgyNzcuMzA2NTE3LCA2NzAwLCAxLjQ2NzU5NjQxMTcwNTAxN10sIFsxNjA1NzU4Mjc3LjQ4MDkxMSwgNjcwNywgMS41NzY3NTA5OTM3Mjg2Mzc3XSwgWzE2MDU3NTgyNzcuNTgxMTg3LCA2NzExLCAxLjUwNjc4NDMxOTg3NzYyNDVdLCBbMTYwNTc1ODI3Ny42Njc5NjMsIDY3MTUsIDEuNTUyODc4Mzc5ODIxNzc3M10sIFsxNjA1NzU4Mjc3Ljg5MDg1MSwgNjcyNSwgMS40OTg5OTQxMTIwMTQ3NzA1XSwgWzE2MDU3NTgyNzguMzA0NjkyLCA2NzI2LCAxLjQ3Mjg3ODQ1NjExNTcyMjddLCBbMTYwNTc1ODI3OC40NzQxMDUsIDY3MzgsIDEuNTM1NDc5Nzg0MDExODQwOF0sIFsxNjA1NzU4Mjc4LjUzMDU4NiwgNjc0MiwgMS41NDA4MjUzNjY5NzM4NzddLCBbMTYwNTc1ODI3OC42NDkxMjUsIDY3NDksIDEuNTA2MzI0MDUyODEwNjY5XSwgWzE2MDU3NTgyNzguNzQ0ODgzLCA2NzUzLCAxLjQxOTQ4NDg1Mzc0NDUwNjhdLCBbMTYwNTc1ODI3OC45ODU1ODYsIDY3NjQsIDEuNTg4NzAxNDg2NTg3NTI0NF0sIFsxNjA1NzU4Mjc5LjI0MDU0NSwgNjc3NiwgMS41NDg3NTQ4MTEyODY5MjYzXSwgWzE2MDU3NTgyNzkuNTUxOTE5LCA2NzkyLCAxLjUyMzE0ODA1OTg0NDk3MDddLCBbMTYwNTc1ODI3OS45ODcyNzksIDY4MTMsIDEuNjA5ODY1OTAzODU0MzcwMV0sIFsxNjA1NzU4MjgwLjA4OTE4MywgNjgxNywgMS41NTAyMzU3NDgyOTEwMTU2XSwgWzE2MDU3NTgyODAuNDYwOTgyLCA2ODMyLCAxLjYyMjM5NjQ2OTExNjIxMV0sIFsxNjA1NzU4MjgwLjU3NDg4NSwgNjgzNywgMS42Mjc5MTk5MTIzMzgyNTY4XSwgWzE2MDU3NTgyODAuNjUyNzIzLCA2ODQwLCAxLjQwODczNTYzMjg5NjQyMzNdLCBbMTYwNTc1ODI4MS4xNjU3NzcsIDY4NDYsIDEuNDI2NDc0MzMyODA5NDQ4Ml0sIFsxNjA1NzU4MjgxLjIyNjI1OSwgNjg1MCwgMS42NDY5OTgyODYyNDcyNTM0XSwgWzE2MDU3NTgyODEuMjg5NjgsIDY4NTQsIDEuNDk3NTM2NTQwMDMxNDMzXSwgWzE2MDU3NTgyODEuNDcxNTAzLCA2ODYyLCAxLjU5Nzg2MjM2Mjg2MTYzMzNdLCBbMTYwNTc1ODI4MS42MTczMTgsIDY4NjgsIDEuNTI0NjM3MzQxNDk5MzI4Nl0sIFsxNjA1NzU4MjgxLjY1MTU5NCwgNjg2OSwgMS41MjY5MTEyNTg2OTc1MDk4XSwgWzE2MDU3NTgyODEuNjc3MzQ4LCA2ODcwLCAxLjQ0NzczOTgzOTU1MzgzM10sIFsxNjA1NzU4MjgyLjA1NjUzMiwgNjg4NiwgMS40OTE2NjkwNTg3OTk3NDM3XSwgWzE2MDU3NTgyODIuMTg0ODczLCA2ODkzLCAxLjUwMDEwMDM3NDIyMTgwMThdLCBbMTYwNTc1ODI4Mi4yMjQzNzcsIDY4OTUsIDEuNDEyNzkyNjgyNjQ3NzA1XSwgWzE2MDU3NTgyODIuMzU2MjYyLCA2OTAxLCAxLjQ5NjM1MDc2NTIyODI3MTVdLCBbMTYwNTc1ODI4Mi41MjM2NjksIDY5MDksIDEuNTM5NTM1OTk5Mjk4MDk1N10sIFsxNjA1NzU4MjgyLjU5MTc4NywgNjkxMiwgMS41Mzg2ODk4NTE3NjA4NjQzXSwgWzE2MDU3NTgyODIuNjc5MjQ5LCA2OTE2LCAxLjU1Mzg4MDIxNDY5MTE2Ml0sIFsxNjA1NzU4MjgyLjcyMjIzNSwgNjkxOCwgMS41NDIzMzkzMjQ5NTExNzE5XSwgWzE2MDU3NTgyODIuODk2MzE3LCA2OTI2LCAxLjYxMDc1Njk5MzI5Mzc2MjJdLCBbMTYwNTc1ODI4My4wNzY3MDYsIDY5MzQsIDEuNDM3ODc5MDg1NTQwNzcxNV0sIFsxNjA1NzU4MjgzLjE0MjQwOSwgNjkzNywgMS41ODY5NTA3Nzg5NjExODE2XSwgWzE2MDU3NTgyODMuNDY0OTUyLCA2OTUxLCAxLjUxMDI0ODY2MTA0MTI1OThdLCBbMTYwNTc1ODI4My41NTQwOTQsIDY5NTUsIDEuNTcwMDk3ODA0MDY5NTE5XSwgWzE2MDU3NTgyODQuMDg3NTM3LCA2OTYzLCAxLjUyNTkzMzI2NTY4NjAzNTJdLCBbMTYwNTc1ODI4NC4xMzA2ODIsIDY5NjYsIDEuNDk3OTU1NDQxNDc0OTE0Nl0sIFsxNjA1NzU4Mjg0LjIxMTE2NiwgNjk3MiwgMS41NTMxMzA2MjY2Nzg0NjY4XSwgWzE2MDU3NTgyODQuNDUyNDE0LCA2OTg5LCAxLjQ4MzEyNjE2MzQ4MjY2Nl0sIFsxNjA1NzU4Mjg0LjQ2NTYwMywgNjk5MCwgMS42MTk1NTQ1MTk2NTMzMjAzXSwgWzE2MDU3NTgyODQuNDkyMDc3LCA2OTkyLCAxLjUzODk3OTA1MzQ5NzMxNDVdLCBbMTYwNTc1ODI4NC44NTU4OTksIDcwMTAsIDEuNTAzMDQ1MjAxMzAxNTc0N10sIFsxNjA1NzU4Mjg0Ljk0NDM4LCA3MDE0LCAxLjU1ODI4OTUyNzg5MzA2NjRdLCBbMTYwNTc1ODI4NS4wMTI5ODEsIDcwMTcsIDEuNTY5ODYzMDgwOTc4MzkzNl0sIFsxNjA1NzU4Mjg1LjM0MzY5NiwgNzAzMiwgMS41NDIzOTkxNjgwMTQ1MjY0XSwgWzE2MDU3NTgyODUuNDAwODg1LCA3MDM1LCAxLjYwNjA3OTgxNjgxODIzNzNdLCBbMTYwNTc1ODI4NS40Nzc1ODksIDcwMzksIDEuNTc0NzQ4OTkyOTE5OTIxOV0sIFsxNjA1NzU4Mjg1LjYyODU5NywgNzA0NiwgMS41MzEzNjExMDMwNTc4NjEzXSwgWzE2MDU3NTgyODUuNjcyNzU0LCA3MDQ4LCAxLjU3NjE3NjI4NTc0MzcxMzRdLCBbMTYwNTc1ODI4NS45NDA4NzUsIDcwNTksIDEuNDc2ODY5MTA2MjkyNzI0Nl0sIFsxNjA1NzU4Mjg2LjA4NDgzMiwgNzA2NSwgMS42MTk5OTI2MTM3OTI0MTk0XSwgWzE2MDU3NTgyODYuMzM3OTM0LCA3MDc2LCAxLjU2MTg5ODExMjI5NzA1OF1d",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin/scalars/tags": {
"data": "eyIyMDIwMTExOS0wMzU1NTQvbWV0cmljcyI6IHsiR2VuZXJhdG9yIGxvc3MiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgIkRpc2NyaW1pbmF0b3IgbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiR2VuZXJhdG9yIFhFQiBGaWRlbGl0eSBFc3RpbWF0ZSI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9fX0=",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugin_entry.html?name=profile": {
"data": "CjwhRE9DVFlQRSBodG1sPgo8aGVhZD48YmFzZSBocmVmPSJwbHVnaW4vcHJvZmlsZS8iIC8+PC9oZWFkPgo8Ym9keT48c2NyaXB0IHR5cGU9Im1vZHVsZSI+aW1wb3J0KCIuL2luZGV4LmpzIikudGhlbigobSkgPT4gdm9pZCBtLnJlbmRlcigpKTs8L3NjcmlwdD48L2JvZHk+Cg==",
"headers": [
[
"content-type",
"text/html; charset=utf-8"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/plugins_listing": {
"data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyLXYyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRpc3RyaWJ1dGlvbnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQifX0sICJoaXN0b2dyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJiZWhvbGRlciI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiB0cnVlLCAidGFiX25hbWUiOiAiYmVob2xkZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWJlaG9sZGVyLWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19LCAicHJvZmlsZSI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInByb2ZpbGUiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi9wcm9maWxlL2luZGV4LmpzIn19fQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/data/runs": {
"data": "WyIyMDIwMTExOS0wMzU1NTQvbWV0cmljcyIsICIyMDIwMTExOS0wMzU1NTQiXQ==",
"headers": [
[
"content-type",
"application/json"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/icon_bundle.svg": {
"data": "PHN2Zz48ZGVmcz4KPHN2ZyBpZD0iY29udGVudF9jb3B5XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIGlkPSJoZWxwX291dGxpbmVfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ii8+PC9zdmc+PHN2ZyBpZD0iaW5mb19vdXRsaW5lXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIvPjwvc3ZnPjxzdmcgaWQ9InJlZnJlc2hfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1eiIvPjwvc3ZnPjxzdmcgaWQ9InNldHRpbmdzXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOS40MyAxMi45OGMuMDQtLjMyLjA3LS42NC4wNy0uOThzLS4wMy0uNjYtLjA3LS45OGwyLjExLTEuNjVjLjE5LS4xNS4yNC0uNDIuMTItLjY0bC0yLTMuNDZjLS4xMi0uMjItLjM5LS4zLS42MS0uMjJsLTIuNDkgMWMtLjUyLS40LTEuMDgtLjczLTEuNjktLjk4bC0uMzgtMi42NUMxNC40NiAyLjE4IDE0LjI1IDIgMTQgMmgtNGMtLjI1IDAtLjQ2LjE4LS40OS40MmwtLjM4IDIuNjVjLS42MS4yNS0xLjE3LjU5LTEuNjkuOThsLTIuNDktMWMtLjIzLS4wOS0uNDkgMC0uNjEuMjJsLTIgMy40NmMtLjEzLjIyLS4wNy40OS4xMi42NGwyLjExIDEuNjVjLS4wNC4zMi0uMDcuNjUtLjA3Ljk4cy4wMy42Ni4wNy45OGwtMi4xMSAxLjY1Yy0uMTkuMTUtLjI0LjQyLS4xMi42NGwyIDMuNDZjLjEyLjIyLjM5LjMuNjEuMjJsMi40OS0xYy41Mi40IDEuMDguNzMgMS42OS45OGwuMzggMi42NWMuMDMuMjQuMjQuNDIuNDkuNDJoNGMuMjUgMCAuNDYtLjE4LjQ5LS40MmwuMzgtMi42NWMuNjEtLjI1IDEuMTctLjU5IDEuNjktLjk4bDIuNDkgMWMuMjMuMDkuNDkgMCAuNjEtLjIybDItMy40NmMuMTItLjIyLjA3LS40OS0uMTItLjY0bC0yLjExLTEuNjV6TTEyIDE1LjVjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41czEuNTctMy41IDMuNS0zLjUgMy41IDEuNTcgMy41IDMuNS0xLjU3IDMuNS0zLjUgMy41eiIvPjwvc3ZnPjwvZGVmcz48L3N2Zz4K",
"headers": [
[
"content-type",
"image/svg+xml; charset=utf-8"
]
],
"ok": true,
"status": 200,
"status_text": ""
},
"https://localhost:6006/index.js": {
"data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLEpiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBTYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJkpiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClNiKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHI9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXtyKHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih4KXt0cnl7cShBKHgpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHc9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB3fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHcoeCl7cmV0dXJuIGZ1bmN0aW9uKEMpe0FbeF09Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHcoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIFViKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHIobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHIsayl9cihiLm5leHQoKSl9KX1mdW5jdGlvbiBXYihiKXtyZXR1cm4gVWIoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHgsQyl7dmFyIEc9IiI7aWYoeClpZih4PXgudG9Mb3dlckNhc2UoKSwiICI9PT14fHxBLnRlc3QoeCkpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHgpKUc9ImVzYyI7ZWxzZSBpZigxPT14Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh4KSlHPXh9ZWxzZSBHPXcudGVzdCh4KT94LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09eD8iKiI6eDtyZXR1cm4gR31mdW5jdGlvbiBkKHgpe3ZhciBDPSIiO3gmJih4IGluIHA/Qz1wW3hdOnUudGVzdCh4KT8oeD1wYXJzZUludCh4LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHgpLnRvTG93ZXJDYXNlKCkpOkM9eC50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHgpe3ZhciBDPSIiO051bWJlcih4KSYmKEM9NjU8PXgmJjkwPj14P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIreCk6MTEyPD14JiYxMjM+PXg/ImYiKyh4LTExMisxKTo0ODw9eCYmNTc+PXg/ClN0cmluZyh4LTQ4KTo5Njw9eCYmMTA1Pj14P1N0cmluZyh4LTk2KTptW3hdKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHgsQyl7cmV0dXJuIHgua2V5P2IoeC5rZXksQyk6eC5kZXRhaWwmJnguZGV0YWlsLmtleT9iKHguZGV0YWlsLmtleSxDKTpkKHgua2V5SWRlbnRpZmllcil8fGYoeC5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh4LEMpe3JldHVybiBoKEMseC5oYXNNb2RpZmllcnMpPT09eC5rZXkmJigheC5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEheC5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXguY3RybEtleSYmISFDLmFsdEtleT09PSEheC5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF4Lm1ldGFLZXkpfWZ1bmN0aW9uIHIoeCl7cmV0dXJuIDE9PT14Lmxlbmd0aD97Y29tYm86eCxrZXk6eCxldmVudDoia2V5ZG93biJ9Onguc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp4LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwoeCl7cmV0dXJuIHgudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiByKEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx3PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbeF09Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHgsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx4KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB4PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09eC5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ4LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHh9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgeCBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh4LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t4XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXtsKHgpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3hdKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQseCxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHgsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgeCxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXg9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz14WzBdLEc9eFsxXSx4PXhbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcseCl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih4LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8eC5sZW5ndGg7RysrKXt2YXIgRD14W0ddWzBdLEI9eFtHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih4LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh4KTtELmtleWJvYXJkRXZlbnQ9Rzt4PW5ldyBDdXN0b21FdmVudCh4LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMseCk7eC5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1yaXBwbGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxfcmlwcGxlQ29udGFpbmVyOnt0eXBlOk9iamVjdH19LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZvY3VzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKCl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX2Rvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLnByZXNzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKGIpfSxlbnN1cmVSaXBwbGU6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGFzUmlwcGxlKCkpe3RoaXMuX3JpcHBsZT10aGlzLl9jcmVhdGVSaXBwbGUoKTt0aGlzLl9yaXBwbGUubm9pbms9dGhpcy5ub2luazt2YXIgZD10aGlzLl9yaXBwbGVDb250YWluZXJ8fHRoaXMucm9vdDtkJiZQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh0aGlzLl9yaXBwbGUpO2lmKGIpe2Q9ClBvbHltZXIuZG9tKHRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcyk7dmFyIGY9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtkLmRlZXBDb250YWlucyhmKSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbihiKX19fSxnZXRSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLmVuc3VyZVJpcHBsZSgpO3JldHVybiB0aGlzLl9yaXBwbGV9LGhhc1JpcHBsZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fcmlwcGxlfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLXJpcHBsZSIpfSxfbm9pbmtDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUubm9pbms9Yil9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItYnV0dG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9MTt0aGlzLmRpc2FibGVkP2I9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP2I9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJihiPTMpO3RoaXMuX3NldEVsZXZhdGlvbihiKX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIiwKYil9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlEb3duSGFuZGxlci5jYWxsKHRoaXMsYik7dGhpcy5oYXNSaXBwbGUoKSYmMT50aGlzLmdldFJpcHBsZSgpLnJpcHBsZXMubGVuZ3RoJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKCl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGwuX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX07UG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWV0YS9pcm9uLW1ldGEuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25NZXRhPWZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbk1ldGFbIiAiXShkKTt0aGlzLnR5cGU9ZCYmZC50eXBlfHwiZGVmYXVsdCI7dGhpcy5rZXk9ZCYmZC5rZXk7ZCYmInZhbHVlImluIGQmJih0aGlzLnZhbHVlPWQudmFsdWUpfTtQb2x5bWVyLklyb25NZXRhWyIgIl09ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbk1ldGEudHlwZXM9e307UG9seW1lci5Jcm9uTWV0YS5wcm90b3R5cGU9e2dldCB2YWx1ZSgpe3ZhciBkPXRoaXMudHlwZSxmPXRoaXMua2V5O2lmKGQmJmYpcmV0dXJuIFBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF0mJlBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF1bZl19LHNldCB2YWx1ZShkKXt2YXIgZj10aGlzLnR5cGUsaD10aGlzLmtleTtmJiZoJiYoZj1Qb2x5bWVyLklyb25NZXRhLnR5cGVzW2ZdPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl18fHt9LG51bGw9PWQ/ZGVsZXRlIGZbaF06ZltoXT1kKX0sZ2V0IGxpc3QoKXtpZih0aGlzLnR5cGUpe3ZhciBkPQpQb2x5bWVyLklyb25NZXRhLnR5cGVzW3RoaXMudHlwZV07cmV0dXJuIGQ/T2JqZWN0LmtleXMoZCkubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBiW3RoaXMudHlwZV1bZl19LHRoaXMpOltdfX0sYnlLZXk6ZnVuY3Rpb24oZCl7dGhpcy5rZXk9ZDtyZXR1cm4gdGhpcy52YWx1ZX19O3ZhciBiPVBvbHltZXIuSXJvbk1ldGEudHlwZXM7UG9seW1lcih7aXM6Imlyb24tbWV0YSIscHJvcGVydGllczp7dHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSxrZXk6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxmOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9zZWxmQ2hhbmdlZCJ9LF9fbWV0YTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfX2NvbXB1dGVNZXRhKHR5cGUsIGtleSwgdmFsdWUpIn19LGhvc3RBdHRyaWJ1dGVzOntoaWRkZW46ITB9LF9fY29tcHV0ZU1ldGE6ZnVuY3Rpb24oZCxmLGgpe2Q9bmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6ZCwKa2V5OmZ9KTt2b2lkIDAhPT1oJiZoIT09ZC52YWx1ZT9kLnZhbHVlPWg6dGhpcy52YWx1ZSE9PWQudmFsdWUmJih0aGlzLnZhbHVlPWQudmFsdWUpO3JldHVybiBkfSxnZXQgbGlzdCgpe3JldHVybiB0aGlzLl9fbWV0YSYmdGhpcy5fX21ldGEubGlzdH0sX3NlbGZDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QmJih0aGlzLnZhbHVlPXRoaXMpfSxieUtleTpmdW5jdGlvbihkKXtyZXR1cm4obmV3IFBvbHltZXIuSXJvbk1ldGEoe3R5cGU6dGhpcy50eXBlLGtleTpkfSkpLnZhbHVlfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXZhbGlkYXRhYmxlLWJlaGF2aW9yL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1udWxsOwpQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YT1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZToidmFsaWRhdG9yIn0pfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIil9LGdldCBfdmFsaWRhdG9yKCl7cmV0dXJuIFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhJiZQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YS5ieUtleSh0aGlzLnZhbGlkYXRvcil9LGhhc1ZhbGlkYXRvcjpmdW5jdGlvbigpe3JldHVybiBudWxsIT0KdGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbihiKXt0aGlzLmludmFsaWQ9dm9pZCAwPT09YiYmdm9pZCAwIT09dGhpcy52YWx1ZT8hdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk6IXRoaXMuX2dldFZhbGlkaXR5KGIpO3JldHVybiF0aGlzLmludmFsaWR9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5oYXNWYWxpZGF0b3IoKT90aGlzLl92YWxpZGF0b3IudmFsaWRhdGUoYik6ITB9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci9pcm9uLWZvcm0tZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3I9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcGFyZW50Rm9ybTp7dHlwZTpPYmplY3R9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuRWxlbWVudHx8dGhpcy5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC1yZWdpc3RlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpeyFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuX3BhcmVudEZvcm0mJnRoaXMuX3BhcmVudEZvcm0uZmlyZSgiaXJvbi1mb3JtLWVsZW1lbnQtdW5yZWdpc3RlciIse3RhcmdldDp0aGlzfSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci9pcm9uLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG5vdGlmeTohMCxvYnNlcnZlcjoiX2NoZWNrZWRDaGFuZ2VkIn0sdG9nZ2xlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiIsb2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3JlcXVpcmVkQ2hhbmdlZChyZXF1aXJlZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faGFzSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9ITB9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5jaGVja2VkfSxfcmVxdWlyZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZXF1aXJlZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsCiJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiKX0sX2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9dGhpcy5jaGVja2VkO3RoaXMuZmlyZSgiaXJvbi1jaGFuZ2UiKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMudmFsdWV8fG51bGw9PT10aGlzLnZhbHVlKXRoaXMudmFsdWU9Im9uIn19O1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWlua3ktZm9jdXMtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsPXtvYnNlcnZlcnM6WyJfZm9jdXNlZENoYW5nZWQocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxfZm9jdXNlZENoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmdGhpcy5lbnN1cmVSaXBwbGUoKTt0aGlzLmhhc1JpcHBsZSgpJiYodGhpcy5fcmlwcGxlLmhvbGREb3duPWIpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGI9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTtiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJjZW50ZXIiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIpO3JldHVybiBifX07UG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1jaGVja2VkLWVsZW1lbnQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2J1dHRvblN0YXRlQ2hhbmdlZC5jYWxsKHRoaXMpOyF0aGlzLmRpc2FibGVkJiZ0aGlzLmlzQXR0YWNoZWQmJih0aGlzLmNoZWNrZWQ9dGhpcy5hY3RpdmUpfX07ClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yPVtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3IsUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0SGVscGVyPXt9O1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRD0xO1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0SW5wdXRJRD0xOwpQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2xhYmVsOnt0eXBlOlN0cmluZ30sdmFsdWU6e25vdGlmeTohMCx0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW52YWxpZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSx0eXBlOnt0eXBlOlN0cmluZ30sbGlzdDp7dHlwZTpTdHJpbmd9LHBhdHRlcm46e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxlcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nfSxjaGFyQ291bnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdmFsaWRhdG9yOnt0eXBlOlN0cmluZ30sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZywKdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b2ZvY3VzQ2hhbmdlZCJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LG1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1pbjp7dHlwZTpTdHJpbmd9LG1heDp7dHlwZTpTdHJpbmd9LHN0ZXA6e3R5cGU6U3RyaW5nfSxuYW1lOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxyZWFkb25seTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzaXplOnt0eXBlOk51bWJlcn0sYXV0b2NhcGl0YWxpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiJub25lIn0sYXV0b2NvcnJlY3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvc2F2ZTp7dHlwZTpTdHJpbmd9LHJlc3VsdHM6e3R5cGU6TnVtYmVyfSxhY2NlcHQ6e3R5cGU6U3RyaW5nfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxfYXJpYURlc2NyaWJlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sCl9hcmlhTGFiZWxsZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9pbnB1dElkOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCJ9LGtleUJpbmRpbmdzOnsic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxob3N0QXR0cmlidXRlczp7dGFiaW5kZXg6MH0sZ2V0IGlucHV0RWxlbWVudCgpe3RoaXMuJHx8KHRoaXMuJD17fSk7dGhpcy4kLmlucHV0fHwodGhpcy5fZ2VuZXJhdGVJbnB1dElkKCksdGhpcy4kLmlucHV0PXRoaXMuJCQoIiMiK3RoaXMuX2lucHV0SWQpKTtyZXR1cm4gdGhpcy4kLmlucHV0fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnR9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl90eXBlc1RoYXRIYXZlVGV4dD0iZGF0ZSBkYXRldGltZSBkYXRldGltZS1sb2NhbCBtb250aCB0aW1lIHdlZWsgZmlsZSIuc3BsaXQoIiAiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpOwohUG9seW1lci5FbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuaW5wdXRFbGVtZW50LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKX0sX2FwcGVuZFN0cmluZ1dpdGhTcGFjZTpmdW5jdGlvbihiLGQpe3JldHVybiBiP2IrIiAiK2Q6ZH0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXtiPVBvbHltZXIuZG9tKGIpLnJvb3RUYXJnZXQ7aWYoYi5pZCl0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxiLmlkKTtlbHNle3ZhciBkPSJwYXBlci1pbnB1dC1hZGQtb24tIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dEFkZG9uSUQrKztiLmlkPWQ7dGhpcy5fYXJpYURlc2NyaWJlZEJ5PXRoaXMuX2FwcGVuZFN0cmluZ1dpdGhTcGFjZSh0aGlzLl9hcmlhRGVzY3JpYmVkQnksZCl9fSx2YWxpZGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC52YWxpZGF0ZSgpfSwKX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9mb2N1c0JsdXJIYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmZvY3VzZWQmJiF0aGlzLl9zaGlmdFRhYlByZXNzZWQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX0sX29uU2hpZnRUYWJEb3duOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSEwO3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsYik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSExfSwxKX0sX2hhbmRsZUF1dG9WYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCl9LHVwZGF0ZVZhbHVlQW5kUHJlc2VydmVDYXJldDpmdW5jdGlvbihiKXt0cnl7dmFyIGQ9CnRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0O3RoaXMudmFsdWU9Yjt0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydD1kO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvbkVuZD1kfWNhdGNoKGYpe3RoaXMudmFsdWU9Yn19LF9jb21wdXRlQWx3YXlzRmxvYXRMYWJlbDpmdW5jdGlvbihiLGQpe3JldHVybiBkfHxifSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7aWYoYil7aWYoYi5pZCl2YXIgZD1iLmlkO2Vsc2UgZD0icGFwZXItaW5wdXQtbGFiZWwtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dExhYmVsSUQrKyxiLmlkPWQ7dGhpcy5fYXJpYUxhYmVsbGVkQnk9ZH1lbHNlIHRoaXMuX2FyaWFMYWJlbGxlZEJ5PSIifSxfZ2VuZXJhdGVJbnB1dElkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRJZCYmIiIhPT10aGlzLl9pbnB1dElkfHwodGhpcy5faW5wdXRJZD0KImlucHV0LSIrUG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEKyspfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYil7dGhpcy5zaGFkb3dSb290JiZ0aGlzLmZpcmUoYi50eXBlLHtzb3VyY2VFdmVudDpifSx7bm9kZTp0aGlzLGJ1YmJsZXM6Yi5idWJibGVzLGNhbmNlbGFibGU6Yi5jYW5jZWxhYmxlfSl9LF9hdXRvZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodGhpcy5hdXRvZm9jdXMmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQpe3ZhciBiPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7YiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50JiZiIT09ZG9jdW1lbnQuYm9keSYmYiE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfX19O1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yPVtQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWFkZG9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcj17YXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImFkZG9uLWF0dGFjaGVkIil9LHVwZGF0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZml0LWJlaGF2aW9yL2lyb24tZml0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRml0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NpemluZ1RhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LGZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvd30sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LHBvc2l0aW9uVGFyZ2V0Ont0eXBlOkVsZW1lbnR9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmd9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sYXV0b0ZpdE9uQXR0YWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maXRJbmZvOnt0eXBlOk9iamVjdH19LGdldCBfZml0V2lkdGgoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lcldpZHRoOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH0sCmdldCBfZml0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJIZWlnaHQ6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH0sZ2V0IF9maXRMZWZ0KCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSxnZXQgX2ZpdFRvcCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfSxnZXQgX2RlZmF1bHRQb3NpdGlvblRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGU7YiYmYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmKGI9Yi5ob3N0KTtyZXR1cm4gYn0sZ2V0IF9sb2NhbGVIb3Jpem9udGFsQWxpZ24oKXtpZih0aGlzLl9pc1JUTCl7aWYoInJpZ2h0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJsZWZ0IjsKaWYoImxlZnQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuInJpZ2h0In1yZXR1cm4gdGhpcy5ob3Jpem9udGFsQWxpZ259LGdldCBfX3Nob3VsZFBvc2l0aW9uKCl7cmV0dXJuKHRoaXMuaG9yaXpvbnRhbEFsaWdufHx0aGlzLnZlcnRpY2FsQWxpZ24pJiZ0aGlzLnBvc2l0aW9uVGFyZ2V0fSxhdHRhY2hlZDpmdW5jdGlvbigpeyJ1bmRlZmluZWQiPT09dHlwZW9mIHRoaXMuX2lzUlRMJiYodGhpcy5faXNSVEw9InJ0bCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7dGhpcy5wb3NpdGlvblRhcmdldD10aGlzLnBvc2l0aW9uVGFyZ2V0fHx0aGlzLl9kZWZhdWx0UG9zaXRpb25UYXJnZXQ7dGhpcy5hdXRvRml0T25BdHRhY2gmJigibm9uZSI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXNwbGF5P3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZpdCgpfS5iaW5kKHRoaXMpKTood2luZG93LlNoYWR5RE9NJiZTaGFkeURPTS5mbHVzaCgpLAp0aGlzLmZpdCgpKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2RlZmVycmVkRml0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX19kZWZlcnJlZEZpdCksdGhpcy5fX2RlZmVycmVkRml0PW51bGwpfSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uKCk7dGhpcy5jb25zdHJhaW4oKTt0aGlzLmNlbnRlcigpfSxfZGlzY292ZXJJbmZvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZpdEluZm8pe3ZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLGQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zaXppbmdUYXJnZXQpO3RoaXMuX2ZpdEluZm89e2lubGluZVN0eWxlOnt0b3A6dGhpcy5zdHlsZS50b3B8fCIiLGxlZnQ6dGhpcy5zdHlsZS5sZWZ0fHwiIixwb3NpdGlvbjp0aGlzLnN0eWxlLnBvc2l0aW9ufHwiIn0sc2l6ZXJJbmxpbmVTdHlsZTp7bWF4V2lkdGg6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGh8fCIiLG1heEhlaWdodDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHR8fAoiIixib3hTaXppbmc6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nfHwiIn0scG9zaXRpb25lZEJ5Ont2ZXJ0aWNhbGx5OiJhdXRvIiE9PWIudG9wPyJ0b3AiOiJhdXRvIiE9PWIuYm90dG9tPyJib3R0b20iOm51bGwsaG9yaXpvbnRhbGx5OiJhdXRvIiE9PWIubGVmdD8ibGVmdCI6ImF1dG8iIT09Yi5yaWdodD8icmlnaHQiOm51bGx9LHNpemVkQnk6e2hlaWdodDoibm9uZSIhPT1kLm1heEhlaWdodCx3aWR0aDoibm9uZSIhPT1kLm1heFdpZHRoLG1pbldpZHRoOnBhcnNlSW50KGQubWluV2lkdGgsMTApfHwwLG1pbkhlaWdodDpwYXJzZUludChkLm1pbkhlaWdodCwxMCl8fDB9LG1hcmdpbjp7dG9wOnBhcnNlSW50KGIubWFyZ2luVG9wLDEwKXx8MCxyaWdodDpwYXJzZUludChiLm1hcmdpblJpZ2h0LDEwKXx8MCxib3R0b206cGFyc2VJbnQoYi5tYXJnaW5Cb3R0b20sMTApfHwwLGxlZnQ6cGFyc2VJbnQoYi5tYXJnaW5MZWZ0LDEwKXx8MH19fX0scmVzZXRGaXQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5fZml0SW5mb3x8e30sZDtmb3IoZCBpbiBiLnNpemVySW5saW5lU3R5bGUpdGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbZF09Yi5zaXplcklubGluZVN0eWxlW2RdO2ZvcihkIGluIGIuaW5saW5lU3R5bGUpdGhpcy5zdHlsZVtkXT1iLmlubGluZVN0eWxlW2RdO3RoaXMuX2ZpdEluZm89bnVsbH0scmVmaXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0LGQ9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wO3RoaXMucmVzZXRGaXQoKTt0aGlzLmZpdCgpO3RoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQ9Yjt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxUb3A9ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzLl9fc2hvdWxkUG9zaXRpb24pe3RoaXMuX2Rpc2NvdmVySW5mbygpO3RoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIjt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3RoaXMuc3R5bGUubGVmdD0iMHB4IjsKdGhpcy5zdHlsZS50b3A9IjBweCI7dmFyIGI9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxkPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLnBvc2l0aW9uVGFyZ2V0KSxmPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pLGg9dGhpcy5fZml0SW5mby5tYXJnaW4saz10aGlzLl9fZ2V0UG9zaXRpb24odGhpcy5fbG9jYWxlSG9yaXpvbnRhbEFsaWduLHRoaXMudmVydGljYWxBbGlnbix7d2lkdGg6Yi53aWR0aCtoLmxlZnQraC5yaWdodCxoZWlnaHQ6Yi5oZWlnaHQraC50b3AraC5ib3R0b219LGIsZCxmKTtkPWsubGVmdCtoLmxlZnQ7az1rLnRvcCtoLnRvcDt2YXIgcj1NYXRoLm1pbihmLnJpZ2h0LWgucmlnaHQsZCtiLndpZHRoKSxsPU1hdGgubWluKGYuYm90dG9tLWguYm90dG9tLGsrYi5oZWlnaHQpO2Q9TWF0aC5tYXgoZi5sZWZ0K2gubGVmdCxNYXRoLm1pbihkLHItdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSk7az1NYXRoLm1heChmLnRvcCsKaC50b3AsTWF0aC5taW4oayxsLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1NYXRoLm1heChyLWQsdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSsicHgiO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodD1NYXRoLm1heChsLWssdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbkhlaWdodCkrInB4Ijt0aGlzLnN0eWxlLmxlZnQ9ZC1iLmxlZnQrInB4Ijt0aGlzLnN0eWxlLnRvcD1rLWIudG9wKyJweCJ9fSxjb25zdHJhaW46ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgYj10aGlzLl9maXRJbmZvO2IucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zdHlsZS50b3A9IjBweCIpO2IucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseXx8KHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIiwKdGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3ZhciBkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yi5zaXplZEJ5LmhlaWdodHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZCxiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5LCJ0b3AiLCJib3R0b20iLCJIZWlnaHQiKTtiLnNpemVkQnkud2lkdGh8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5LCJsZWZ0IiwicmlnaHQiLCJXaWR0aCIpfX0sX3NpemVEaW1lbnNpb246ZnVuY3Rpb24oYixkLGYsaCxrKXt0aGlzLl9fc2l6ZURpbWVuc2lvbihiLGQsZixoLGspfSxfX3NpemVEaW1lbnNpb246ZnVuY3Rpb24oYixkLGYsaCxrKXt2YXIgcj10aGlzLl9maXRJbmZvLGw9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7bD0iV2lkdGgiPT09az9sLndpZHRoOmwuaGVpZ2h0O2Q9ZD09PWg7dmFyIHA9CiJvZmZzZXQiK2s7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbIm1heCIra109bC1yLm1hcmdpbltkP2Y6aF0tKGQ/bC1iW2hdOmJbZl0pLSh0aGlzW3BdLXRoaXMuc2l6aW5nVGFyZ2V0W3BdKSsicHgifSxjZW50ZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgYj10aGlzLl9maXRJbmZvLnBvc2l0aW9uZWRCeTtpZighYi52ZXJ0aWNhbGx5fHwhYi5ob3Jpem9udGFsbHkpe3RoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIjtiLnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnRvcD0iMHB4Iik7Yi5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLmxlZnQ9IjBweCIpO3ZhciBkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTtiLnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnRvcD1mLnRvcC1kLnRvcCsoZi5oZWlnaHQtZC5oZWlnaHQpLzIrInB4Iik7Yi5ob3Jpem9udGFsbHl8fAoodGhpcy5zdHlsZS5sZWZ0PWYubGVmdC1kLmxlZnQrKGYud2lkdGgtZC53aWR0aCkvMisicHgiKX19fSxfX2dldE5vcm1hbGl6ZWRSZWN0OmZ1bmN0aW9uKGIpe3JldHVybiBiPT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxiPT09d2luZG93P3t0b3A6MCxsZWZ0OjAsd2lkdGg6d2luZG93LmlubmVyV2lkdGgsaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCxyaWdodDp3aW5kb3cuaW5uZXJXaWR0aCxib3R0b206d2luZG93LmlubmVySGVpZ2h0fTpiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxfX2dldE9mZnNjcmVlbkFyZWE6ZnVuY3Rpb24oYixkLGYpe3JldHVybiBNYXRoLmFicyhNYXRoLm1pbigwLGIudG9wKStNYXRoLm1pbigwLGYuYm90dG9tLShiLnRvcCtkLmhlaWdodCkpKSpkLndpZHRoK01hdGguYWJzKE1hdGgubWluKDAsYi5sZWZ0KStNYXRoLm1pbigwLGYucmlnaHQtKGIubGVmdCtkLndpZHRoKSkpKmQuaGVpZ2h0fSxfX2dldFBvc2l0aW9uOmZ1bmN0aW9uKGIsZCwKZixoLGsscil7dmFyIGw9W3t2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ay50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ay5ib3R0b20tZi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXR9XTsKaWYodGhpcy5ub092ZXJsYXApe2Zvcih2YXIgcD0wLG09bC5sZW5ndGg7cDxtO3ArKyl7dmFyIG49e30scTtmb3IocSBpbiBsW3BdKW5bcV09bFtwXVtxXTtsLnB1c2gobil9bFswXS50b3A9bFsxXS50b3ArPWsuaGVpZ2h0O2xbMl0udG9wPWxbM10udG9wLT1rLmhlaWdodDtsWzRdLmxlZnQ9bFs2XS5sZWZ0Kz1rLndpZHRoO2xbNV0ubGVmdD1sWzddLmxlZnQtPWsud2lkdGh9ZD0iYXV0byI9PT1kP251bGw6ZDtiPSJhdXRvIj09PWI/bnVsbDpiO2ImJiJjZW50ZXIiIT09Ynx8KGwucHVzaCh7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP2suaGVpZ2h0OjApLGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ay5ib3R0b20tCmYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2suaGVpZ2h0OjApLGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSkpO2QmJiJtaWRkbGUiIT09ZHx8KGwucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSxsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wLWguaGVpZ2h0LzIray5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5yaWdodC1mLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ay53aWR0aDowKX0pKTsibWlkZGxlIj09PWQmJiJjZW50ZXIiPT09CmImJmwucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsudG9wLWguaGVpZ2h0LzIray5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0LWgud2lkdGgvMitrLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSk7Zm9yKHA9MDtwPGwubGVuZ3RoO3ArKyl7aD1sW3BdO2s9aC52ZXJ0aWNhbEFsaWduPT09ZDttPWguaG9yaXpvbnRhbEFsaWduPT09YjtpZighdGhpcy5keW5hbWljQWxpZ24mJiF0aGlzLm5vT3ZlcmxhcCYmayYmbSl7dmFyIHU9aDticmVha31uPSghZHx8aykmJighYnx8bSk7aWYodGhpcy5keW5hbWljQWxpZ258fG4pe2gub2Zmc2NyZWVuQXJlYT10aGlzLl9fZ2V0T2Zmc2NyZWVuQXJlYShoLGYscik7aWYoMD09PWgub2Zmc2NyZWVuQXJlYSYmbil7dT1oO2JyZWFrfXU9dXx8aDtuPWgub2Zmc2NyZWVuQXJlYS11Lm9mZnNjcmVlbkFyZWE7aWYoMD5ufHwwPT09biYmKGt8fG0pKXU9aH19cmV0dXJuIHV9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXJlc2l6YWJsZS1iZWhhdmlvci9pcm9uLXJlc2l6YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOntfcGFyZW50UmVzaXphYmxlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3BhcmVudFJlc2l6YWJsZUNoYW5nZWQifSxfbm90aWZ5aW5nRGVzY2VuZGFudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnsiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIjoiX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzPVtdO3RoaXMuX2JvdW5kTm90aWZ5UmVzaXplPXRoaXMubm90aWZ5UmVzaXplLmJpbmQodGhpcyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnRSZXNpemFibGU/dGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpOndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLAp0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSk7dGhpcy5fcGFyZW50UmVzaXphYmxlPW51bGx9LG5vdGlmeVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmZvckVhY2goZnVuY3Rpb24oYil7dGhpcy5yZXNpemVyU2hvdWxkTm90aWZ5KGIpJiZ0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGIpfSx0aGlzKSx0aGlzLl9maXJlUmVzaXplKCkpfSxhc3NpZ25QYXJlbnRSZXNpemFibGU6ZnVuY3Rpb24oYil7dGhpcy5fcGFyZW50UmVzaXphYmxlPWJ9LHN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YoYik7LTE8ZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLnNwbGljZShkLDEpLHRoaXMudW5saXN0ZW4oYiwiaXJvbi1yZXNpemUiLCJfb25EZXNjZW5kYW50SXJvblJlc2l6ZSIpKX0scmVzaXplclNob3VsZE5vdGlmeTpmdW5jdGlvbigpe3JldHVybiEwfSwKX29uRGVzY2VuZGFudElyb25SZXNpemU6ZnVuY3Rpb24oYil7dGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD9iLnN0b3BQcm9wYWdhdGlvbigpOlBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93fHx0aGlzLl9maXJlUmVzaXplKCl9LF9maXJlUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLXJlc2l6ZSIsbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITF9KX0sX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLnJvb3RUYXJnZXQ7ZCE9PXRoaXMmJigtMT09PXRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YoZCkmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5wdXNoKGQpLHRoaXMubGlzdGVuKGQsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSksZC5hc3NpZ25QYXJlbnRSZXNpemFibGUodGhpcyksdGhpcy5fbm90aWZ5RGVzY2VuZGFudChkKSxiLnN0b3BQcm9wYWdhdGlvbigpKX0sCl9wYXJlbnRSZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKX0sX25vdGlmeURlc2NlbmRhbnQ6ZnVuY3Rpb24oYil7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD0hMCxiLm5vdGlmeVJlc2l6ZSgpLHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITEpfSxfcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQpaWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGI9dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixmdW5jdGlvbiBmKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZik7YigpfSl9ZWxzZSB0aGlzLmZpcmUoImlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyIsCm51bGwse25vZGU6dGhpcyxidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KSx0aGlzLl9wYXJlbnRSZXNpemFibGV8fCh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSksdGhpcy5ub3RpZnlSZXNpemUoKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1vdmVybGF5LW1hbmFnZXIuaHRtbC5qcwpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheXM9W107dGhpcy5fbWluaW11bVo9MTAxO3RoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsO1BvbHltZXIuR2VzdHVyZXMuYWRkKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwidGFwIixmdW5jdGlvbigpe30pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsdGhpcy5fb25DYXB0dXJlQ2xpY2suYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX29uQ2FwdHVyZUZvY3VzLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuX29uQ2FwdHVyZUtleURvd24uYmluZCh0aGlzKSwhMCl9OwpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcyxnZXQgYmFja2Ryb3BFbGVtZW50KCl7dGhpcy5fYmFja2Ryb3BFbGVtZW50fHwodGhpcy5fYmFja2Ryb3BFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tb3ZlcmxheS1iYWNrZHJvcCIpKTtyZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50fSxnZXQgZGVlcEFjdGl2ZUVsZW1lbnQoKXt2YXIgYj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2ImJiExIT09YiBpbnN0YW5jZW9mIEVsZW1lbnR8fChiPWRvY3VtZW50LmJvZHkpO2Zvcig7Yi5yb290JiZQb2x5bWVyLmRvbShiLnJvb3QpLmFjdGl2ZUVsZW1lbnQ7KWI9UG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50O3JldHVybiBifSxfYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQ6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fb3ZlcmxheXNbYl07aWYoZCl7dmFyIGY9CnRoaXMuX292ZXJsYXlzLmxlbmd0aC0xLGg9dGhpcy5fb3ZlcmxheXNbZl07aCYmdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KGQsaCkmJmYtLTtpZighKGI+PWYpKXtoPU1hdGgubWF4KHRoaXMuY3VycmVudE92ZXJsYXlaKCksdGhpcy5fbWluaW11bVopO2Zvcih0aGlzLl9nZXRaKGQpPD1oJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGQsaCk7YjxmOyl0aGlzLl9vdmVybGF5c1tiXT10aGlzLl9vdmVybGF5c1tiKzFdLGIrKzt0aGlzLl9vdmVybGF5c1tmXT1kfX19LGFkZE9yUmVtb3ZlT3ZlcmxheTpmdW5jdGlvbihiKXtiLm9wZW5lZD90aGlzLmFkZE92ZXJsYXkoYik6dGhpcy5yZW1vdmVPdmVybGF5KGIpfSxhZGRPdmVybGF5OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmluZGV4T2YoYik7aWYoMDw9ZCl0aGlzLl9icmluZ092ZXJsYXlBdEluZGV4VG9Gcm9udChkKTtlbHNle2Q9dGhpcy5fb3ZlcmxheXMubGVuZ3RoO3ZhciBmPXRoaXMuX292ZXJsYXlzW2QtMV0saD0KTWF0aC5tYXgodGhpcy5fZ2V0WihmKSx0aGlzLl9taW5pbXVtWiksaz10aGlzLl9nZXRaKGIpO2YmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShiLGYpJiYodGhpcy5fYXBwbHlPdmVybGF5WihmLGgpLGQtLSxoPU1hdGgubWF4KHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheXNbZC0xXSksdGhpcy5fbWluaW11bVopKTtrPD1oJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGIsaCk7dGhpcy5fb3ZlcmxheXMuc3BsaWNlKGQsMCxiKX10aGlzLnRyYWNrQmFja2Ryb3AoKX0scmVtb3ZlT3ZlcmxheTpmdW5jdGlvbihiKXtiPXRoaXMuX292ZXJsYXlzLmluZGV4T2YoYik7LTEhPT1iJiYodGhpcy5fb3ZlcmxheXMuc3BsaWNlKGIsMSksdGhpcy50cmFja0JhY2tkcm9wKCkpfSxjdXJyZW50T3ZlcmxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vdmVybGF5c1t0aGlzLl9vdmVybGF5cy5sZW5ndGgtMV19LGN1cnJlbnRPdmVybGF5WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRaKHRoaXMuY3VycmVudE92ZXJsYXkoKSl9LAplbnN1cmVNaW5pbXVtWjpmdW5jdGlvbihiKXt0aGlzLl9taW5pbXVtWj1NYXRoLm1heCh0aGlzLl9taW5pbXVtWixiKX0sZm9jdXNPdmVybGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2ImJmIuX2FwcGx5Rm9jdXMoKX0sdHJhY2tCYWNrZHJvcDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX292ZXJsYXlXaXRoQmFja2Ryb3AoKTtpZihifHx0aGlzLl9iYWNrZHJvcEVsZW1lbnQpdGhpcy5iYWNrZHJvcEVsZW1lbnQuc3R5bGUuekluZGV4PXRoaXMuX2dldFooYiktMSx0aGlzLmJhY2tkcm9wRWxlbWVudC5vcGVuZWQ9ISFiLHRoaXMuYmFja2Ryb3BFbGVtZW50LnByZXBhcmUoKX0sZ2V0QmFja2Ryb3BzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPVtdLGQ9MDtkPHRoaXMuX292ZXJsYXlzLmxlbmd0aDtkKyspdGhpcy5fb3ZlcmxheXNbZF0ud2l0aEJhY2tkcm9wJiZiLnB1c2godGhpcy5fb3ZlcmxheXNbZF0pO3JldHVybiBifSxiYWNrZHJvcFo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCkpLQoxfSxfb3ZlcmxheVdpdGhCYWNrZHJvcDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9vdmVybGF5cy5sZW5ndGgtMTswPD1iO2ItLSlpZih0aGlzLl9vdmVybGF5c1tiXS53aXRoQmFja2Ryb3ApcmV0dXJuIHRoaXMuX292ZXJsYXlzW2JdfSxfZ2V0WjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9taW5pbXVtWjtiJiYoYj1OdW1iZXIoYi5zdHlsZS56SW5kZXh8fHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGIpLnpJbmRleCksYj09PWImJihkPWIpKTtyZXR1cm4gZH0sX3NldFo6ZnVuY3Rpb24oYixkKXtiLnN0eWxlLnpJbmRleD1kfSxfYXBwbHlPdmVybGF5WjpmdW5jdGlvbihiLGQpe3RoaXMuX3NldFooYixkKzIpfSxfb3ZlcmxheUluUGF0aDpmdW5jdGlvbihiKXtiPWJ8fFtdO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWlmKGJbZF0uX21hbmFnZXI9PT10aGlzKXJldHVybiBiW2RdfSxfb25DYXB0dXJlQ2xpY2s6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLQoxO2lmKC0xIT09ZClmb3IodmFyIGY9UG9seW1lci5kb20oYikucGF0aCxoOyhoPXRoaXMuX292ZXJsYXlzW2RdKSYmdGhpcy5fb3ZlcmxheUluUGF0aChmKSE9PWg7KWlmKGguX29uQ2FwdHVyZUNsaWNrKGIpLGguYWxsb3dDbGlja1Rocm91Z2gpZC0tO2Vsc2UgYnJlYWt9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmZC5fb25DYXB0dXJlRm9jdXMoYil9LF9vbkNhcHR1cmVLZXlEb3duOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuY3VycmVudE92ZXJsYXkoKTtkJiYoUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvci5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoYiwiZXNjIik/ZC5fb25DYXB0dXJlRXNjKGIpOlBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInRhYiIpJiZkLl9vbkNhcHR1cmVUYWIoYikpfSxfc2hvdWxkQmVCZWhpbmRPdmVybGF5OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIWIuYWx3YXlzT25Ub3AmJgpkLmFsd2F5c09uVG9wfX07UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXI9bmV3IFBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3M7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tc2Nyb2xsLW1hbmFnZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj0wLGQ9MCxmPW51bGwsaD1bXSxrPVsid2hlZWwiLCJtb3VzZXdoZWVsIiwiRE9NTW91c2VTY3JvbGwiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIl07UG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlcj17Z2V0IGN1cnJlbnRMb2NraW5nRWxlbWVudCgpe3JldHVybiB0aGlzLl9sb2NraW5nRWxlbWVudHNbdGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aC0xXX0sZWxlbWVudElzU2Nyb2xsTG9ja2VkOmZ1bmN0aW9uKHIpe3ZhciBsPXRoaXMuY3VycmVudExvY2tpbmdFbGVtZW50O2lmKHZvaWQgMD09PWwpcmV0dXJuITE7aWYodGhpcy5faGFzQ2FjaGVkTG9ja2VkRWxlbWVudChyKSlyZXR1cm4hMDtpZih0aGlzLl9oYXNDYWNoZWRVbmxvY2tlZEVsZW1lbnQocikpcmV0dXJuITE7KGw9ISFsJiZsIT09ciYmIXRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKGwscikpP3RoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHIpOnRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlLnB1c2gocik7CnJldHVybiBsfSxwdXNoU2Nyb2xsTG9jazpmdW5jdGlvbihyKXswPD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZihyKXx8KDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCksdGhpcy5fbG9ja2luZ0VsZW1lbnRzLnB1c2gociksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdKX0scmVtb3ZlU2Nyb2xsTG9jazpmdW5jdGlvbihyKXtyPXRoaXMuX2xvY2tpbmdFbGVtZW50cy5pbmRleE9mKHIpOy0xIT09ciYmKHRoaXMuX2xvY2tpbmdFbGVtZW50cy5zcGxpY2UociwxKSx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGU9W10sdGhpcy5fdW5sb2NrZWRFbGVtZW50Q2FjaGU9W10sMD09PXRoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgmJnRoaXMuX3VubG9ja1Njcm9sbEludGVyYWN0aW9ucygpKX0sX2xvY2tpbmdFbGVtZW50czpbXSxfbG9ja2VkRWxlbWVudENhY2hlOm51bGwsCl91bmxvY2tlZEVsZW1lbnRDYWNoZTpudWxsLF9oYXNDYWNoZWRMb2NrZWRFbGVtZW50OmZ1bmN0aW9uKHIpe3JldHVybi0xPHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHIpfSxfaGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50OmZ1bmN0aW9uKHIpe3JldHVybi0xPHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlLmluZGV4T2Yocil9LF9jb21wb3NlZFRyZWVDb250YWluczpmdW5jdGlvbihyLGwpe3ZhciBwLG07aWYoci5jb250YWlucyhsKSlyZXR1cm4hMDtyPVBvbHltZXIuZG9tKHIpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQsc2xvdCIpO2ZvcihwPTA7cDxyLmxlbmd0aDsrK3Ape3ZhciBuPVBvbHltZXIuZG9tKHJbcF0pLmdldERpc3RyaWJ1dGVkTm9kZXMoKTtmb3IobT0wO208bi5sZW5ndGg7KyttKWlmKG5bbV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5fY29tcG9zZWRUcmVlQ29udGFpbnMoblttXSxsKSlyZXR1cm4hMH1yZXR1cm4hMX0sX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlcjpmdW5jdGlvbihyKXtyLmNhbmNlbGFibGUmJgp0aGlzLl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nKHIpJiZyLnByZXZlbnREZWZhdWx0KCk7ci50YXJnZXRUb3VjaGVzJiYocj1yLnRhcmdldFRvdWNoZXNbMF0sYj1yLnBhZ2VYLGQ9ci5wYWdlWSl9LF9sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPXRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8dGhpcy5fc2Nyb2xsSW50ZXJhY3Rpb25IYW5kbGVyLmJpbmQodGhpcyk7Zm9yKHZhciByPTAsbD1rLmxlbmd0aDtyPGw7cisrKWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoa1tyXSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSxfdW5sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zOmZ1bmN0aW9uKCl7Zm9yKHZhciByPTAsbD1rLmxlbmd0aDtyPGw7cisrKWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoa1tyXSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSwKX3Nob3VsZFByZXZlbnRTY3JvbGxpbmc6ZnVuY3Rpb24ocil7dmFyIGw9UG9seW1lci5kb20ocikucm9vdFRhcmdldDsidG91Y2htb3ZlIiE9PXIudHlwZSYmZiE9PWwmJihmPWwsaD10aGlzLl9nZXRTY3JvbGxhYmxlTm9kZXMoUG9seW1lci5kb20ocikucGF0aCkpO2lmKCFoLmxlbmd0aClyZXR1cm4hMDtpZigidG91Y2hzdGFydCI9PT1yLnR5cGUpcmV0dXJuITE7cj10aGlzLl9nZXRTY3JvbGxJbmZvKHIpO3JldHVybiF0aGlzLl9nZXRTY3JvbGxpbmdOb2RlKGgsci5kZWx0YVgsci5kZWx0YVkpfSxfZ2V0U2Nyb2xsYWJsZU5vZGVzOmZ1bmN0aW9uKHIpe2Zvcih2YXIgbD1bXSxwPXIuaW5kZXhPZih0aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudCksbT0wO208PXA7bSsrKWlmKHJbbV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIG49clttXSxxPW4uc3R5bGU7InNjcm9sbCIhPT1xLm92ZXJmbG93JiYiYXV0byIhPT1xLm92ZXJmbG93JiYocT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuKSk7CiJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvd3x8bC5wdXNoKG4pfXJldHVybiBsfSxfZ2V0U2Nyb2xsaW5nTm9kZTpmdW5jdGlvbihyLGwscCl7aWYobHx8cClmb3IodmFyIG09TWF0aC5hYnMocCk+PU1hdGguYWJzKGwpLG49MDtuPHIubGVuZ3RoO24rKyl7dmFyIHE9cltuXTtpZihtPzA+cD8wPHEuc2Nyb2xsVG9wOnEuc2Nyb2xsVG9wPHEuc2Nyb2xsSGVpZ2h0LXEuY2xpZW50SGVpZ2h0OjA+bD8wPHEuc2Nyb2xsTGVmdDpxLnNjcm9sbExlZnQ8cS5zY3JvbGxXaWR0aC1xLmNsaWVudFdpZHRoKXJldHVybiBxfX0sX2dldFNjcm9sbEluZm86ZnVuY3Rpb24ocil7dmFyIGw9e2RlbHRhWDpyLmRlbHRhWCxkZWx0YVk6ci5kZWx0YVl9OyJkZWx0YVgiaW4gcnx8KCJ3aGVlbERlbHRhWCJpbiByJiYid2hlZWxEZWx0YVkiaW4gcj8obC5kZWx0YVg9LXIud2hlZWxEZWx0YVgsbC5kZWx0YVk9LXIud2hlZWxEZWx0YVkpOiJ3aGVlbERlbHRhImluIHI/KGwuZGVsdGFYPQowLGwuZGVsdGFZPS1yLndoZWVsRGVsdGEpOiJheGlzImluIHI/KGwuZGVsdGFYPTE9PT1yLmF4aXM/ci5kZXRhaWw6MCxsLmRlbHRhWT0yPT09ci5heGlzP3IuZGV0YWlsOjApOnIudGFyZ2V0VG91Y2hlcyYmKHI9ci50YXJnZXRUb3VjaGVzWzBdLGwuZGVsdGFYPWItci5wYWdlWCxsLmRlbHRhWT1kLXIucGFnZVkpKTtyZXR1cm4gbH19fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1mb2N1c2FibGVzLWhlbHBlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPUVsZW1lbnQucHJvdG90eXBlLGQ9Yi5tYXRjaGVzfHxiLm1hdGNoZXNTZWxlY3Rvcnx8Yi5tb3pNYXRjaGVzU2VsZWN0b3J8fGIubXNNYXRjaGVzU2VsZWN0b3J8fGIub01hdGNoZXNTZWxlY3Rvcnx8Yi53ZWJraXRNYXRjaGVzU2VsZWN0b3I7UG9seW1lci5Jcm9uRm9jdXNhYmxlc0hlbHBlcj17Z2V0VGFiYmFibGVOb2RlczpmdW5jdGlvbihmKXt2YXIgaD1bXTtyZXR1cm4gdGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZixoKT90aGlzLl9zb3J0QnlUYWJJbmRleChoKTpofSxpc0ZvY3VzYWJsZTpmdW5jdGlvbihmKXtyZXR1cm4gZC5jYWxsKGYsImlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24sIG9iamVjdCIpP2QuY2FsbChmLCI6bm90KFtkaXNhYmxlZF0pIik6ZC5jYWxsKGYsImFbaHJlZl0sIGFyZWFbaHJlZl0sIGlmcmFtZSwgW3RhYmluZGV4XSwgW2NvbnRlbnRFZGl0YWJsZV0iKX0saXNUYWJiYWJsZTpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKSYmCmQuY2FsbChmLCc6bm90KFt0YWJpbmRleFx4M2QiLTEiXSknKSYmdGhpcy5faXNWaXNpYmxlKGYpfSxfbm9ybWFsaXplZFRhYkluZGV4OmZ1bmN0aW9uKGYpe3JldHVybiB0aGlzLmlzRm9jdXNhYmxlKGYpPyhmPWYuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwwLE51bWJlcihmKSk6LTF9LF9jb2xsZWN0VGFiYmFibGVOb2RlczpmdW5jdGlvbihmLGgpe2lmKGYubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERXx8IXRoaXMuX2lzVmlzaWJsZShmKSlyZXR1cm4hMTt2YXIgaz10aGlzLl9ub3JtYWxpemVkVGFiSW5kZXgoZikscj0wPGs7MDw9ayYmaC5wdXNoKGYpO2Y9ImNvbnRlbnQiPT09Zi5sb2NhbE5hbWV8fCJzbG90Ij09PWYubG9jYWxOYW1lP1BvbHltZXIuZG9tKGYpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpQb2x5bWVyLmRvbShmLnJvb3R8fGYpLmNoaWxkcmVuO2ZvcihrPTA7azxmLmxlbmd0aDtrKyspcj10aGlzLl9jb2xsZWN0VGFiYmFibGVOb2RlcyhmW2tdLGgpfHxyOwpyZXR1cm4gcn0sX2lzVmlzaWJsZTpmdW5jdGlvbihmKXt2YXIgaD1mLnN0eWxlO3JldHVybiJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXk/KGg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZiksImhpZGRlbiIhPT1oLnZpc2liaWxpdHkmJiJub25lIiE9PWguZGlzcGxheSk6ITF9LF9zb3J0QnlUYWJJbmRleDpmdW5jdGlvbihmKXt2YXIgaD1mLmxlbmd0aDtpZigyPmgpcmV0dXJuIGY7dmFyIGs9TWF0aC5jZWlsKGgvMik7aD10aGlzLl9zb3J0QnlUYWJJbmRleChmLnNsaWNlKDAsaykpO2Y9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZShrKSk7cmV0dXJuIHRoaXMuX21lcmdlU29ydEJ5VGFiSW5kZXgoaCxmKX0sX21lcmdlU29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZixoKXtmb3IodmFyIGs9W107MDxmLmxlbmd0aCYmMDxoLmxlbmd0aDspdGhpcy5faGFzTG93ZXJUYWJPcmRlcihmWzBdLGhbMF0pP2sucHVzaChoLnNoaWZ0KCkpOmsucHVzaChmLnNoaWZ0KCkpOwpyZXR1cm4gay5jb25jYXQoZixoKX0sX2hhc0xvd2VyVGFiT3JkZXI6ZnVuY3Rpb24oZixoKXtmPU1hdGgubWF4KGYudGFiSW5kZXgsMCk7aD1NYXRoLm1heChoLnRhYkluZGV4LDApO3JldHVybiAwPT09Znx8MD09PWg/aD5mOmY+aH19fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLW92ZXJsYXktYmVoYXZpb3IvaXJvbi1vdmVybGF5LWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7b3BlbmVkOntvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNhbmNlbGVkOntvYnNlcnZlcjoiX2NhbmNlbGVkQ2hhbmdlZCIscmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aXRoQmFja2Ryb3A6e29ic2VydmVyOiJfd2l0aEJhY2tkcm9wQ2hhbmdlZCIsdHlwZTpCb29sZWFufSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uRXNjS2V5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2luZ1JlYXNvbjp7dHlwZTpPYmplY3R9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dDbGlja1Rocm91Z2g6e3R5cGU6Qm9vbGVhbn0sYWx3YXlzT25Ub3A6e3R5cGU6Qm9vbGVhbn0sCnNjcm9sbEFjdGlvbjp7dHlwZTpTdHJpbmd9LF9tYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlcn0sX2ZvY3VzZWRDaGlsZDp7dHlwZTpPYmplY3R9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vbklyb25SZXNpemUifSxvYnNlcnZlcnM6WyJfX3VwZGF0ZVNjcm9sbE9ic2VydmVycyhpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbikiXSxnZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX21hbmFnZXIuYmFja2Ryb3BFbGVtZW50fSxnZXQgX2ZvY3VzTm9kZSgpe3JldHVybiB0aGlzLl9mb2N1c2VkQ2hpbGR8fFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoIlthdXRvZm9jdXNdIil8fHRoaXN9LGdldCBfZm9jdXNhYmxlTm9kZXMoKXtyZXR1cm4gUG9seW1lci5Jcm9uRm9jdXNhYmxlc0hlbHBlci5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0KdGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGw7dGhpcy5fX3JhZnM9e307dGhpcy5fX3Njcm9sbFRvcD10aGlzLl9fc2Nyb2xsTGVmdD10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsO3RoaXMuX19vbkNhcHR1cmVTY3JvbGw9dGhpcy5fX29uQ2FwdHVyZVNjcm9sbC5iaW5kKHRoaXMpO3RoaXMuX19yb290Tm9kZXM9bnVsbDt0aGlzLl9lbnN1cmVTZXR1cCgpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiZ0aGlzLl9vcGVuZWRDaGFuZ2VkKHRoaXMub3BlbmVkKTt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXModGhpcy5fb25Ob2Rlc0NoYW5nZSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpO3RoaXMuX29ic2VydmVyPW51bGw7Zm9yKHZhciBiIGluIHRoaXMuX19yYWZzKW51bGwhPT0KdGhpcy5fX3JhZnNbYl0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX19yYWZzW2JdKTt0aGlzLl9fcmFmcz17fTt0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyk7dGhpcy5fX2lzQW5pbWF0aW5nJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6KHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSkpfSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSEwfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMX0sY2FuY2VsOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNhbmNlbGVkIixiLHtjYW5jZWxhYmxlOiEwfSkuZGVmYXVsdFByZXZlbnRlZHx8KHRoaXMuX3NldENhbmNlbGVkKCEwKSx0aGlzLm9wZW5lZD0KITEpfSxpbnZhbGlkYXRlVGFiYmFibGVzOmZ1bmN0aW9uKCl7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbH0sX2Vuc3VyZVNldHVwOmZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheVNldHVwfHwodGhpcy5fb3ZlcmxheVNldHVwPSEwLHRoaXMuc3R5bGUub3V0bGluZT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIil9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpO3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19pc0FuaW1hdGluZz0hMCx0aGlzLl9fZGVyYWYoIl9fb3BlbmVkQ2hhbmdlZCIsdGhpcy5fX29wZW5lZENoYW5nZWQpKX0sX2NhbmNlbGVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fHt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jYW5jZWxlZD0KdGhpcy5jYW5jZWxlZH0sX3dpdGhCYWNrZHJvcENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLndpdGhCYWNrZHJvcCYmIXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpPyh0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMCk6dGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4JiYodGhpcy5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4IiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSExKTt0aGlzLm9wZW5lZCYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9tYW5hZ2VyLnRyYWNrQmFja2Ryb3AoKX0sX3ByZXBhcmVSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O3RoaXMuX3ByZXBhcmVQb3NpdGlvbmluZygpO3RoaXMucmVmaXQoKTt0aGlzLl9maW5pc2hQb3NpdGlvbmluZygpO3RoaXMubm9BdXRvRm9jdXMmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT0KdGhpcy5fZm9jdXNOb2RlJiYodGhpcy5fZm9jdXNOb2RlLmJsdXIoKSx0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZS5mb2N1cygpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF9maW5pc2hSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLm5vdGlmeVJlc2l6ZSgpO3RoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1vcGVuZWQiKX0sX2ZpbmlzaFJlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zdHlsZS56SW5kZXg9IiI7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktY2xvc2VkIix0aGlzLmNsb3NpbmdSZWFzb24pfSxfcHJlcGFyZVBvc2l0aW9uaW5nOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uPQp0aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249Im5vbmUiO3RoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJub25lIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LF9maW5pc2hQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3A7dGhpcy5zdHlsZS50cmFuc2l0aW9uPXRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0iIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLnN0eWxlLmRpc3BsYXk9IiI7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3B9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcGVuZWQpdGhpcy5ub0F1dG9Gb2N1c3x8dGhpcy5fZm9jdXNOb2RlLmZvY3VzKCk7ZWxzZXt0aGlzLl9mb2N1c05vZGUuYmx1cigpO3RoaXMuX2ZvY3VzZWRDaGlsZD1udWxsO2lmKHRoaXMucmVzdG9yZUZvY3VzT25DbG9zZSYmCnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlKXt2YXIgYj10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50OyhiPT09ZG9jdW1lbnQuYm9keXx8UG9seW1lci5kb20odGhpcykuZGVlcENvbnRhaW5zKGIpKSYmdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKX10aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsOyhiPXRoaXMuX21hbmFnZXIuY3VycmVudE92ZXJsYXkoKSkmJnRoaXMhPT1iJiZiLl9hcHBseUZvY3VzKCl9fSxfb25DYXB0dXJlQ2xpY2s6ZnVuY3Rpb24oYil7dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrfHx0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZUZvY3VzOmZ1bmN0aW9uKGIpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXRoOy0xPT09ZC5pbmRleE9mKHRoaXMpPyhiLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2FwcGx5Rm9jdXMoKSk6dGhpcy5fZm9jdXNlZENoaWxkPWRbMF19fSxfb25DYXB0dXJlRXNjOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbkVzY0tleXx8CnRoaXMuY2FuY2VsKGIpfSxfb25DYXB0dXJlVGFiOmZ1bmN0aW9uKGIpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpO3ZhciBkPWIuc2hpZnRLZXksZj1kP3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlO2Q9ZD90aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZTtpZihmPT09ZClmPSEwO2Vsc2V7dmFyIGg9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDtmPWg9PT1mfHxoPT09dGhpc31mJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzZWRDaGlsZD1kLHRoaXMuX2FwcGx5Rm9jdXMoKSl9fSxfb25Jcm9uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJnRoaXMuX19kZXJhZigicmVmaXQiLHRoaXMucmVmaXQpfSxfb25Ob2Rlc0NoYW5nZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiYKKHRoaXMuaW52YWxpZGF0ZVRhYmJhYmxlcygpLHRoaXMubm90aWZ5UmVzaXplKCkpfSxfX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZXx8IXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSl7dmFyIGI9dGhpcy5fZm9jdXNhYmxlTm9kZXM7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT1iWzBdO3RoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1iW2IubGVuZ3RoLTFdfX0sX19vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/KHRoaXMuX3ByZXBhcmVSZW5kZXJPcGVuZWQoKSx0aGlzLl9tYW5hZ2VyLmFkZE92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlck9wZW5lZCgpKToodGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJDbG9zZWQoKSl9LF9fZGVyYWY6ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLl9fcmFmczsKbnVsbCE9PWZbYl0mJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGZbYl0pO2ZbYl09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7ZltiXT1udWxsO2QuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSl9LF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOmZ1bmN0aW9uKGIsZCxmKXtiJiZkJiZ0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihmKT8oImxvY2siPT09ZiYmKHRoaXMuX19zYXZlU2Nyb2xsUG9zaXRpb24oKSxQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnB1c2hTY3JvbGxMb2NrKHRoaXMpKSx0aGlzLl9fYWRkU2Nyb2xsTGlzdGVuZXJzKCkpOihQb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyLnJlbW92ZVNjcm9sbExvY2sodGhpcyksdGhpcy5fX3JlbW92ZVNjcm9sbExpc3RlbmVycygpKX0sX19hZGRTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Jvb3ROb2Rlcyl7dGhpcy5fX3Jvb3ROb2Rlcz1bXTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdylmb3IodmFyIGI9CnRoaXM7YjspYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmYi5ob3N0JiZ0aGlzLl9fcm9vdE5vZGVzLnB1c2goYiksYj1iLmhvc3R8fGIuYXNzaWduZWRTbG90fHxiLnBhcmVudE5vZGU7dGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGRvY3VtZW50KX10aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKX0sX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl9fcm9vdE5vZGVzJiZ0aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goZnVuY3Rpb24oYil7Yi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSx0aGlzKTt0aGlzLmlzQXR0YWNoZWR8fCh0aGlzLl9fcm9vdE5vZGVzPW51bGwpfSxfX2lzVmFsaWRTY3JvbGxBY3Rpb246ZnVuY3Rpb24oYil7cmV0dXJuImxvY2siPT09CmJ8fCJyZWZpdCI9PT1ifHwiY2FuY2VsIj09PWJ9LF9fb25DYXB0dXJlU2Nyb2xsOmZ1bmN0aW9uKGIpe2lmKCEodGhpcy5fX2lzQW5pbWF0aW5nfHwwPD1Qb2x5bWVyLmRvbShiKS5wYXRoLmluZGV4T2YodGhpcykpKXN3aXRjaCh0aGlzLnNjcm9sbEFjdGlvbil7Y2FzZSAibG9jayI6dGhpcy5fX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbigpO2JyZWFrO2Nhc2UgInJlZml0Ijp0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KTticmVhaztjYXNlICJjYW5jZWwiOnRoaXMuY2FuY2VsKGIpfX0sX19zYXZlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyh0aGlzLl9fc2Nyb2xsVG9wPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX19zY3JvbGxMZWZ0PWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCk6KHRoaXMuX19zY3JvbGxUb3A9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApLHRoaXMuX19zY3JvbGxMZWZ0PU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkpfSxfX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe2RvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ/KGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KTooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0PWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCl9fTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3I9W1BvbHltZXIuSXJvbkZpdEJlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLApQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsXX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRhYmxlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxlbnRyeUFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9lbnRyeUFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfSxleGl0QW5pbWF0aW9uOntvYnNlcnZlcjoiX2V4aXRBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ319LF9lbnRyeUFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZW50cnk9W3tuYW1lOnRoaXMuZW50cnlBbmltYXRpb24sbm9kZTp0aGlzfV19LF9leGl0QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fTt0aGlzLmFuaW1hdGlvbkNvbmZpZy5leGl0PVt7bmFtZTp0aGlzLmV4aXRBbmltYXRpb24sbm9kZTp0aGlzfV19LF9jb3B5UHJvcGVydGllczpmdW5jdGlvbihiLApkKXtmb3IodmFyIGYgaW4gZCliW2ZdPWRbZl19LF9jbG9uZUNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17aXNDbG9uZTohMH07dGhpcy5fY29weVByb3BlcnRpZXMoZCxiKTtyZXR1cm4gZH0sX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZTpmdW5jdGlvbihiLGQsZil7aWYodGhpcy5hbmltYXRpb25Db25maWcpaWYodGhpcy5hbmltYXRpb25Db25maWcudmFsdWUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWcudmFsdWUpdGhpcy5fd2Fybih0aGlzLl9sb2dmKCJwbGF5QW5pbWF0aW9uIiwiUGxlYXNlIHB1dCAnYW5pbWF0aW9uQ29uZmlnJyBpbnNpZGUgb2YgeW91ciBjb21wb25lbnRzICdwcm9wZXJ0aWVzJyBvYmplY3QgaW5zdGVhZCBvZiBvdXRzaWRlIG9mIGl0LiIpKTtlbHNle3ZhciBoPWI/dGhpcy5hbmltYXRpb25Db25maWdbYl06dGhpcy5hbmltYXRpb25Db25maWc7QXJyYXkuaXNBcnJheShoKXx8KGg9W2hdKTtpZihoKWZvcih2YXIgayxyPTA7az0KaFtyXTtyKyspaWYoay5hbmltYXRhYmxlKWsuYW5pbWF0YWJsZS5fZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlKGsudHlwZXx8YixkLGYpO2Vsc2UgaWYoay5pZCl7dmFyIGw9ZFtrLmlkXTtsPyhsLmlzQ2xvbmV8fChkW2suaWRdPXRoaXMuX2Nsb25lQ29uZmlnKGwpLGw9ZFtrLmlkXSksdGhpcy5fY29weVByb3BlcnRpZXMobCxrKSk6ZFtrLmlkXT1rfWVsc2UgZi5wdXNoKGspfX0sZ2V0QW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKGIpe3ZhciBkPXt9LGY9W107dGhpcy5fZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlKGIsZCxmKTtmb3IodmFyIGggaW4gZClmLnB1c2goZFtoXSk7cmV0dXJuIGZ9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1ydW5uZXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGw9e19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKGIpe3ZhciBkPVtdLGY9W107aWYoMDxiLmxlbmd0aClmb3IodmFyIGgsaz0wO2g9YltrXTtrKyspe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaC5uYW1lKTtpZihyLmlzTmVvbkFuaW1hdGlvbil7dmFyIGw9bnVsbDtyLmNvbmZpZ3VyZXx8KHIuY29uZmlndXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9KTtsPXIuY29uZmlndXJlKGgpO2YucHVzaCh7cmVzdWx0OmwsY29uZmlnOmh9KX1lbHNlIGNvbnNvbGUud2Fybih0aGlzLmlzKyI6IixoLm5hbWUsIm5vdCBmb3VuZCEiKX1mb3IoYj0wO2I8Zi5sZW5ndGg7YisrKXtsPWZbYl0ucmVzdWx0O2g9ZltiXS5jb25maWc7dHJ5eyJmdW5jdGlvbiIhPXR5cGVvZiBsLmNhbmNlbCYmKGw9ZG9jdW1lbnQudGltZWxpbmUucGxheShsKSl9Y2F0Y2gocCl7bD1udWxsLGNvbnNvbGUud2FybigiQ291bGRudCBwbGF5IiwKIigiLGgubmFtZSwiKS4iLHApfWwmJmQucHVzaCh7bmVvbkFuaW1hdGlvbjpyLGNvbmZpZzpoLGFuaW1hdGlvbjpsfSl9cmV0dXJuIGR9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9ITAsZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKCJmaW5pc2hlZCIhPWJbZl0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7ZD0hMTticmVha31yZXR1cm4gZH0sX2NvbXBsZXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKWJbZF0ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZShiW2RdLmNvbmZpZyk7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKGIpO2lmKGYpe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9O3RoaXMuX2FjdGl2ZVtiXSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVtiXSksZGVsZXRlIHRoaXMuX2FjdGl2ZVtiXSk7CnZhciBoPXRoaXMuX2NvbmZpZ3VyZUFuaW1hdGlvbnMoZik7aWYoMD09aC5sZW5ndGgpdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGQse2J1YmJsZXM6ITF9KTtlbHNlIGZvcih0aGlzLl9hY3RpdmVbYl09aCxmPTA7ZjxoLmxlbmd0aDtmKyspaFtmXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShoKSYmKHRoaXMuX2NvbXBsZXRlKGgpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGQse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9fSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGIgaW4gdGhpcy5fYWN0aXZlKXt2YXIgZD10aGlzLl9hY3RpdmVbYl0sZjtmb3IoZiBpbiBkKWRbZl0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19OwpQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcj1bUG9seW1lci5OZW9uQW5pbWF0YWJsZUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uRHJvcGRvd25TY3JvbGxNYW5hZ2VyPVBvbHltZXIuSXJvblNjcm9sbE1hbmFnZXJ9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0aW9uLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FuaW1hdGlvblRpbWluZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246NTAwLGVhc2luZzoiY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSIsZmlsbDoiYm90aCJ9fX19LGlzTmVvbkFuaW1hdGlvbjohMCxjcmVhdGVkOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5hbmltYXRlfHxjb25zb2xlLndhcm4oIk5vIHdlYiBhbmltYXRpb25zIGRldGVjdGVkLiBUaGlzIGVsZW1lbnQgd2lsbCBub3QgZnVuY3Rpb24gd2l0aG91dCBhIHdlYiBhbmltYXRpb25zIHBvbHlmaWxsLiIpfSx0aW1pbmdGcm9tQ29uZmlnOmZ1bmN0aW9uKGIpe2lmKGIudGltaW5nKWZvcih2YXIgZCBpbiBiLnRpbWluZyl0aGlzLmFuaW1hdGlvblRpbWluZ1tkXT1iLnRpbWluZ1tkXTtyZXR1cm4gdGhpcy5hbmltYXRpb25UaW1pbmd9LHNldFByZWZpeGVkUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2Zvcih2YXIgaD0Ke3RyYW5zZm9ybTpbIndlYmtpdFRyYW5zZm9ybSJdLHRyYW5zZm9ybU9yaWdpbjpbIm1velRyYW5zZm9ybU9yaWdpbiIsIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdfVtkXSxrLHI9MDtrPWhbcl07cisrKWIuc3R5bGVba109ZjtiLnN0eWxlW2RdPWZ9LGNvbXBsZXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vYW5pbWF0aW9ucy9mYWRlLWluLWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLWluLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGIubm9kZSxbe29wYWNpdHk6IjAifSx7b3BhY2l0eToiMSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1vdXQtYW5pbWF0aW9uLmh0bWwuanMKUG9seW1lcih7aXM6ImZhZGUtb3V0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGIubm9kZSxbe29wYWNpdHk6IjEifSx7b3BhY2l0eToiMCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1lbnUtYnV0dG9uL3BhcGVyLW1lbnUtYnV0dG9uLWFuaW1hdGlvbnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYvMisicHgifSx7aGVpZ2h0OmYrInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7UG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy13aWR0aC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3t3aWR0aDpmLzIrInB4In0se3dpZHRoOmYrInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7ClBvbHltZXIoe2lzOiJwYXBlci1tZW51LXNocmluay13aWR0aC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXt2YXIgZD1iLm5vZGUsZj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3t3aWR0aDpmKyJweCJ9LHt3aWR0aDpmLWYvMjArInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyhiKSl9fSk7ClBvbHltZXIoe2lzOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7dGhpcy5zZXRQcmVmaXhlZFByb3BlcnR5KGQsInRyYW5zZm9ybU9yaWdpbiIsIjAgMCIpO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGQsW3toZWlnaHQ6ZisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgwKSJ9LHtoZWlnaHQ6Zi8yKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yMHB4KSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJvcHRpb24iLHRhYmluZGV4OiIwIn19O1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9ySW1wbF07CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIGFjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHIpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7cjxrLmxlbmd0aDtyKyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3JdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1tyXXx8IkUiPT09a1tyXSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbcl0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3JdfHwiRSI9PT1rW3JdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1tyXSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1tyXSl8fCIrIj09PWtbcl18fCItIj09PWtbcl0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbcl0pKWJyZWFrO3JldHVybiByfWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGsscil7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT1yLmxlbmd0aD8wOi0xO2lmKHA9PT1yLmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHJbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZChyLHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHIuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHJbcF0pKXJldHVybi0xfWVsc2V7aWYoaChyW3BdKSlyZXR1cm4gMTtpZihrW2xdPHJbcF0pcmV0dXJuLTE7aWYoa1tsXT5yW3BdKXJldHVybiAxfWwrKztwKyt9fX19KShhY3x8KGFjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgZGM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx3LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3cmJih5LndpdGhDcmVkZW50aWFscz13KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB3IGluIHEpdyYmdS5hcHBlbmQodyxxW3ddKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyByIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHIucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj1yO2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHIoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgodyxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6dyxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4odz0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4gd30sdz0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXcubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh3KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh3LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp3LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgdz0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih4PT57IXgub2smJnRoaXMuX21heFJldHJpZXM+dz8odysrLHkoKSk6KEEoeCksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx3KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx3KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHcpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHcsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz93KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCByPS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZityK2t9fSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHI9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09cltyLmxlbmd0aC0xXSYmKHI9ci5zbGljZSgwLHIubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYociwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYociwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+ZihyKyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+ZihyLCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHIsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+ZihyLCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZihyLGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXtyKz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHIrPWwrU3RyaW5nKHApKTtyZXR1cm4gcn1mdW5jdGlvbiBoKHI9e30pe2NvbnN0IGw9T2JqZWN0LmtleXMocikuc29ydCgpLmZpbHRlcihtPT5yW21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXJbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrcik7az1yfTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQoYWMuY29tcGFyZVRhZ05hbWVzKX19KShkY3x8KGRjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKGRjfHwoZGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy9jYXRlZ29yaXphdGlvblV0aWxzLmpzCnZhciBrYzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSxuKXtjb25zdCBxPSgoKT0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChuKX1jYXRjaCh1KXtyZXR1cm4gbnVsbH19KSgpO3JldHVybntuYW1lOm4sbWV0YWRhdGE6e3R5cGU6cC5TRUFSQ0hfUkVTVUxUUyx2YWxpZFJlZ2V4OiEhcSx1bml2ZXJzYWxSZWdleDoiLioiPT09bn0saXRlbXM6cT9tLmZpbHRlcih1PT51Lm1hdGNoKHEpKTpbXX19ZnVuY3Rpb24gZihtLG49Ii8iKXtjb25zdCBxPVtdLHU9e307bS5mb3JFYWNoKHc9Pnt2YXIgQT13LmluZGV4T2Yobik7QT0wPD1BP3cuc2xpY2UoMCxBKTp3O2lmKCF1W0FdKXtjb25zdCB5PXtuYW1lOkEsbWV0YWRhdGE6e3R5cGU6cC5QUkVGSVhfR1JPVVB9LGl0ZW1zOltdfTt1W0FdPXk7cS5wdXNoKHkpfXVbQV0uaXRlbXMucHVzaCh3KX0pO3JldHVybiBxfWZ1bmN0aW9uIGgobSxuPSIiKXtuPVtkKG0sbildO209ZihtKTtyZXR1cm5bXS5jb25jYXQobixtKX1mdW5jdGlvbiBrKG0sbixxKXtjb25zdCB1PQpkYy5nZXRUYWdzKG0pO3E9aCh1LHEpO2NvbnN0IHc9cihfLnBpY2sobSxuKSk7cmV0dXJuIHEubWFwKCh7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6eH0pPT4oe25hbWU6QSxtZXRhZGF0YTp5LGl0ZW1zOngubWFwKEM9Pih7dGFnOkMscnVuczoody5nZXQoQyl8fFtdKS5zbGljZSgpfSkpfSkpfWZ1bmN0aW9uIHIobSl7Y29uc3Qgbj1uZXcgTWFwO09iamVjdC5rZXlzKG0pLmZvckVhY2gocT0+e21bcV0uZm9yRWFjaCh1PT57Y29uc3Qgdz1uLmdldCh1KXx8W107dy5wdXNoKHEpO24uc2V0KHUsdyl9KX0pO3JldHVybiBufWZ1bmN0aW9uIGwobSxuKXtjb25zdCBxPWFjLmNvbXBhcmVUYWdOYW1lcyhtLnRhZyxuLnRhZyk7cmV0dXJuIDAhPXE/cTphYy5jb21wYXJlVGFnTmFtZXMobS5ydW4sbi5ydW4pfWxldCBwOyhmdW5jdGlvbihtKXttW20uU0VBUkNIX1JFU1VMVFM9MF09IlNFQVJDSF9SRVNVTFRTIjttW20uUFJFRklYX0dST1VQPTFdPSJQUkVGSVhfR1JPVVAifSkocD1iLkNhdGVnb3J5VHlwZXx8CihiLkNhdGVnb3J5VHlwZT17fSkpO2IuY2F0ZWdvcml6ZUJ5U2VhcmNoUXVlcnk9ZDtiLmNhdGVnb3JpemVCeVByZWZpeD1mO2IuY2F0ZWdvcml6ZT1oO2IuY2F0ZWdvcml6ZVRhZ3M9aztiLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnM9ZnVuY3Rpb24obSxuLHEpe3JldHVybiBrKG0sbixxKS5tYXAoZnVuY3Rpb24odSl7Y29uc3Qgdz1fLmZsYXR0ZW4odS5pdGVtcy5tYXAoKHt0YWc6QSxydW5zOnl9KT0+eS5tYXAoeD0+KHt0YWc6QSxydW46eH0pKSkpO3cuc29ydChsKTtyZXR1cm57bmFtZTp1Lm5hbWUsbWV0YWRhdGE6dS5tZXRhZGF0YSxpdGVtczp3fX0pfX0pKGtjfHwoa2M9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMuanMKdmFyIHhjOyhmdW5jdGlvbihiKXtsZXQgZD0hMTtiLnNldFVzZUhhc2g9ZnVuY3Rpb24oaCl7ZD1ofTtiLnVzZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZH07bGV0IGY9IiI7Yi5zZXRGYWtlSGFzaD1mdW5jdGlvbihoKXtmPWh9O2IuZ2V0RmFrZUhhc2g9ZnVuY3Rpb24oKXtyZXR1cm4gZn19KSh4Y3x8KHhjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ2xvYmFscy9nbG9iYWxzLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1nbG9iYWxzIixfdGVtcGxhdGU6bnVsbCx0Zl9nbG9iYWxzOmJ9KX0pKHhjfHwoeGM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL2xpc3RlbmVycy5qcwp2YXIgYmQ7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGspe3RoaXMubGlzdGVuZXI9a319Yi5MaXN0ZW5LZXk9ZDtjb25zdCBmPW5ldyBTZXQsaD1uZXcgU2V0O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e2YuZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCgpPT57aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTtiLmFkZEhhc2hMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2YuYWRkKGspO3JldHVybiBrfTtiLmFkZFN0b3JhZ2VMaXN0ZW5lcj1mdW5jdGlvbihrKXtrPW5ldyBkKGspO2guYWRkKGspO3JldHVybiBrfTtiLmZpcmVTdG9yYWdlQ2hhbmdlZD1mdW5jdGlvbigpe2guZm9yRWFjaChrPT5rLmxpc3RlbmVyKCkpfTtiLnJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2YuZGVsZXRlKGspfTtiLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5PWZ1bmN0aW9uKGspe2guZGVsZXRlKGspfX0pKGJkfHwKKGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS9zdG9yYWdlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKG4scSl7ZnVuY3Rpb24gdSh4LEM9e30pe2NvbnN0IHtkZWZhdWx0VmFsdWU6Ryx1c2VMb2NhbFN0b3JhZ2U6RD0hMX09Qzt4PUQ/d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHgpOmwoaCgpKVt4XTtyZXR1cm4gdm9pZCAwPT14P18uY2xvbmVEZWVwKEcpOm4oeCl9ZnVuY3Rpb24gdyh4LEMsRz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpELHVzZUxvY2FsU3RvcmFnZTpCPSExLHVzZUxvY2F0aW9uUmVwbGFjZTpIPSExfT1HO0c9cShDKTtCPyh3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oeCxHKSxiLmZpcmVTdG9yYWdlQ2hhbmdlZCgpKTpfLmlzRXF1YWwoQyx1KHgse3VzZUxvY2FsU3RvcmFnZTpCfSkpfHwoXy5pc0VxdWFsKEMsRCk/cCh4KTooQz1sKGgoKSksQ1t4XT1HLGsocihDKSxIKSkpfWNvbnN0IEE9W10seT1bXTtyZXR1cm57Z2V0OnUsc2V0OncsZ2V0SW5pdGlhbGl6ZXI6ZnVuY3Rpb24oeCxDKXtjb25zdCBHPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTpDLmRlZmF1bHRWYWx1ZSwKcG9seW1lclByb3BlcnR5OngsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx4KSxCPSgpPT57Y29uc3QgSz11KEQsRyk7Xy5pc0VxdWFsKEssdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0pfHwodGhpc1tHLnBvbHltZXJQcm9wZXJ0eV09Syl9LEg9KEcudXNlTG9jYWxTdG9yYWdlP2IuYWRkU3RvcmFnZUxpc3RlbmVyOmIuYWRkSGFzaExpc3RlbmVyKSgoKT0+QigpKTtHLnVzZUxvY2FsU3RvcmFnZT95LnB1c2goSCk6QS5wdXNoKEgpO0IoKTtyZXR1cm4gdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV19fSxnZXRPYnNlcnZlcjpmdW5jdGlvbih4LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLHBvbHltZXJQcm9wZXJ0eTp4LHVzZUxvY2FsU3RvcmFnZTohMX0sQyk7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgRD1mKHRoaXMseCk7dyhELHRoaXNbRy5wb2x5bWVyUHJvcGVydHldLEcpfX0sZGlzcG9zZUJpbmRpbmc6ZnVuY3Rpb24oKXtBLmZvckVhY2goeD0+CmIucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXkoeCkpO3kuZm9yRWFjaCh4PT5iLnJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5KHgpKX19fWZ1bmN0aW9uIGYobixxKXtuPW5bYi5ESVNBTUJJR1VBVE9SXTtyZXR1cm4obnVsbD09bj9bcV06W24scV0pLmpvaW4oIi4iKX1mdW5jdGlvbiBoKCl7cmV0dXJuIHhjLnVzZUhhc2goKT93aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKTp4Yy5nZXRGYWtlSGFzaCgpfWZ1bmN0aW9uIGsobixxPSExKXt4Yy51c2VIYXNoKCk/cT93aW5kb3cubG9jYXRpb24ucmVwbGFjZSgiIyIrbik6d2luZG93LmxvY2F0aW9uLmhhc2g9bjp4Yy5zZXRGYWtlSGFzaChuKX1mdW5jdGlvbiByKG4pe2xldCBxPSIiO3ZvaWQgMCE9PW5bYi5UQUJdJiYocSs9bltiLlRBQl0pO2NvbnN0IHU9T2JqZWN0LmtleXMobikubWFwKHc9Plt3LG5bd11dKS5maWx0ZXIodz0+d1swXSE9PWIuVEFCKS5tYXAodz0+ZW5jb2RlVVJJQ29tcG9uZW50KHdbMF0pKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQod1sxXSkpLmpvaW4oIlx4MjYiKTsKcmV0dXJuIDA8dS5sZW5ndGg/cSsiXHgyNiIrdTpxfWZ1bmN0aW9uIGwobil7Y29uc3QgcT17fTtuLnNwbGl0KCJceDI2IikuZm9yRWFjaCh1PT57dT11LnNwbGl0KCJceDNkIik7MT09PXUubGVuZ3RoP3FbYi5UQUJdPXVbMF06Mj09PXUubGVuZ3RoJiYocVtkZWNvZGVVUklDb21wb25lbnQodVswXSldPWRlY29kZVVSSUNvbXBvbmVudCh1WzFdKSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBwKG4pe2NvbnN0IHE9bChoKCkpO2RlbGV0ZSBxW25dO2socihxKSl9Yi5UQUI9Il9fdGFiX18iO2IuRElTQU1CSUdVQVRPUj0iZGlzYW1iaWd1YXRvciI7Yi51cmxEaWN0PXt9O2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayhyKHEpKTt0aGlzLnVybERpY3Q9cX19KShiZHx8KGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9hcnJheS11cGRhdGUtaGVscGVyLmpzCnZhciBjZDsoZnVuY3Rpb24oYil7Yi5BcnJheVVwZGF0ZUhlbHBlcj17dXBkYXRlQXJyYXlQcm9wKGQsZixoKXtsZXQgaz10aGlzLmdldChkKTtpZighQXJyYXkuaXNBcnJheShmKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7ZH0nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoayl8fChrPVtdLHRoaXMuc2V0KGQsaykpO2NvbnN0IHI9bmV3IFNldChmLm1hcCgobSxuKT0+aChtLG4pKSk7bGV0IGw9MCxwPTA7Zm9yKDtsPGsubGVuZ3RoJiZwPGYubGVuZ3RoOylyLmhhcyhoKGtbbF0sbCkpPyhoKGtbbF0sbCk9PWgoZltwXSxwKT90aGlzLnNldChgJHtkfS4ke2x9YCxmW3BdKTp0aGlzLnNwbGljZShkLGwsMCxmW3BdKSxwKyssbCsrKTp0aGlzLnNwbGljZShkLGwsMSk7bDxrLmxlbmd0aCYmdGhpcy5zcGxpY2UoZCxsKTtwPGYubGVuZ3RoJiZ0aGlzLnB1c2goZCwuLi5mLnNsaWNlKHApKX19fSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWRvbS1yZXBlYXQuaHRtbC5qcwp2YXIgcmQ7CihmdW5jdGlvbihiKXtiLlRmRG9tUmVwZWF0QmVoYXZpb3I9W2NkLkFycmF5VXBkYXRlSGVscGVyLHtwcm9wZXJ0aWVzOnthczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxfY29udGVudEFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfZG9tQm9vdHN0cmFwcGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jdG9yOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5udWxsfSxfcmVuZGVyZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9yZW5kZXJlZFRlbXBsYXRlSW5zdDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBNYXB9LF9scnVDYWNoZWRJdGVtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBNYXB9LF9jYWNoZVNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjEwfSxfZ2V0SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+ZD0+SlNPTi5zdHJpbmdpZnkoZCl9fSxvYnNlcnZlcnM6WyJfYm9vdHN0cmFwRG9tKF9pdGVtc1JlbmRlcmVkLCBpc0F0dGFjaGVkKSIsIl91cGRhdGVEb20oX3JlbmRlcmVkSXRlbXMuKiwgX2RvbUJvb3RzdHJhcHBlZCkiLAoiX3VwZGF0ZUFjdGl2ZShfY29udGVudEFjdGl2ZSkiLCJfdHJpbUNhY2hlKF9jYWNoZVNpemUpIl0sc2V0Q2FjaGVTaXplKGQpe3RoaXMuX2NhY2hlU2l6ZT1kfSxzZXRHZXRJdGVtS2V5KGQpe3RoaXMuX2dldEl0ZW1LZXk9ZH0sdXBkYXRlRG9tKGQpe3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfcmVuZGVyZWRJdGVtcyIsZCx0aGlzLl9nZXRJdGVtS2V5KX0sX2Vuc3VyZVRlbXBsYXRpemVkKCl7aWYoIXRoaXMuaXNBdHRhY2hlZClyZXR1cm4hMTt0aGlzLl9jdG9yfHwodGhpcy5fY3Rvcj1Qb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIiksdGhpcyx7cGFyZW50TW9kZWw6ITAsaW5zdGFuY2VQcm9wczp7W3RoaXMuYXNdOiEwLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSxmb3J3YXJkSG9zdFByb3A6ZnVuY3Rpb24oZCxmKXt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5mb3JFYWNoKGg9PntoLmZvcndhcmRIb3N0UHJvcChkLApmKX0pfX0pKTtyZXR1cm4hMH0sX2Jvb3RzdHJhcERvbSgpe3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkmJiF0aGlzLl9kb21Cb290c3RyYXBwZWQmJigobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZD0+e2Zvcihjb25zdCBmIG9mIGQpaWYoImNoaWxkTGlzdCI9PT1mLnR5cGUpZm9yKGNvbnN0IGggb2YgZi5hZGRlZE5vZGVzKWggaW5zdGFuY2VvZiBFbGVtZW50JiZoLnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIil9KSkub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSxBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goZD0+e1BvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKGQpfSksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuY2xlYXIoKSx0aGlzLl9yZW5kZXJlZEl0ZW1zLmZvckVhY2goKGQsZik9PnRoaXMuX2luc2VydEl0ZW0oZCxmKSksdGhpcy5fZG9tQm9vdHN0cmFwcGVkPSEwKX0sX3VwZGF0ZUFjdGl2ZSgpe3RoaXMuX2RvbUJvb3RzdHJhcHBlZCYmCkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYiX3JlbmRlcmVkSXRlbXMubGVuZ3RoIiE9ZC5wYXRoKWlmKCJfcmVuZGVyZWRJdGVtcy5zcGxpY2VzIj09PWQucGF0aClkLnZhbHVlLmluZGV4U3BsaWNlcy5mb3JFYWNoKGY9Pntjb25zdCBoPWYuaW5kZXgsaz1mLmFkZGVkQ291bnQscj1mLm9iamVjdDtmLnJlbW92ZWQuZm9yRWFjaChsPT57dGhpcy5fcmVtb3ZlSXRlbShsLHRoaXMuY2hpbGRyZW5baF0pfSk7ci5zbGljZShoLGgraykuZm9yRWFjaCgobCxwKT0+dGhpcy5faW5zZXJ0SXRlbShsLGgrcCkpO3RoaXMuX3RyaW1DYWNoZSgpfSk7ZWxzZXtjb25zdCBmPXRoaXMuX2dldEl0ZW1LZXkoZC52YWx1ZSk7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuaGFzKGYpPwp0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsZil7aWYoIXRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHRlbXBsYXRpemVkIGJlZm9yZSBpbnNlcnRpbmcgYW4gaXRlbSIpO2NvbnN0IGg9dGhpcy5fZ2V0SXRlbUtleShkKTtpZih0aGlzLl9scnVDYWNoZWRJdGVtcy5oYXMoaCkpZD10aGlzLl9scnVDYWNoZWRJdGVtcy5nZXQoaCksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGgpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChoKS5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpO2Vsc2V7Y29uc3Qgaz1uZXcgdGhpcy5fY3Rvcih7W3RoaXMuYXNdOmQsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9KTsKZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9BcnJheS5mcm9tKGQuY2hpbGRyZW4pOltkXSkuZm9yRWFjaChrPT5rLnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIikpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGQpKX0sX3JlbW92ZUl0ZW0oZCxmKXtQb2x5bWVyLmRvbShmLnBhcmVudE5vZGUpLnJlbW92ZUNoaWxkKGYpO2Q9dGhpcy5fZ2V0SXRlbUtleShkKTt0aGlzLl9scnVDYWNoZWRJdGVtcy5zZXQoZCxmKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZCkubm90aWZ5UGF0aCgiYWN0aXZlIiwhMSl9LF90cmltQ2FjaGUoKXtmb3IoO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNpemU+dGhpcy5fY2FjaGVTaXplOyl7Y29uc3QgW2RdPQp0aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShyZHx8KHJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBzZDsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9YmQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgsYmQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkoc2R8fChzZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpzZH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy1iZWhhdmlvci9wYXBlci1kaWFsb2ctYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiZGlhbG9nIix0YWJpbmRleDoiLTEifSxwcm9wZXJ0aWVzOnttb2RhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfX3JlYWRpZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl9tb2RhbENoYW5nZWQobW9kYWwsIF9fcmVhZGllZCkiXSxsaXN0ZW5lcnM6e3RhcDoiX29uRGlhbG9nQ2xpY2sifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s7dGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleTt0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcDt0aGlzLl9fcmVhZGllZD0hMH0sX21vZGFsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihiPyh0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9CnRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5LHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wLHRoaXMud2l0aEJhY2tkcm9wPXRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9ITApOih0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrJiZ0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5ub0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5LHRoaXMud2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wJiZ0aGlzLl9fcHJldldpdGhCYWNrZHJvcCkpfSxfdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZDpmdW5jdGlvbihiKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHwKe307dGhpcy5jbG9zaW5nUmVhc29uLmNvbmZpcm1lZD1ifSxfb25EaWFsb2dDbGljazpmdW5jdGlvbihiKXtmb3IodmFyIGQ9UG9seW1lci5kb20oYikucGF0aCxmPTAsaD1kLmluZGV4T2YodGhpcyk7ZjxoO2YrKyl7dmFyIGs9ZFtmXTtpZihrLmhhc0F0dHJpYnV0ZSYmKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctZGlzbWlzcyIpfHxrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSkpe3RoaXMuX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQoay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpO3RoaXMuY2xvc2UoKTtiLnN0b3BQcm9wYWdhdGlvbigpO2JyZWFrfX19fTtQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3I9W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcixQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsXX0pKCk7CgovLyBodHRwczovL2QzanMub3JnIHY1LjcuMCBDb3B5cmlnaHQgMjAxOCBNaWtlIEJvc3RvY2sKIWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4odC5kMz10LmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZSh0KXt2YXIgZTtyZXR1cm4gMT09PXQubGVuZ3RoJiYoZT10LHQ9ZnVuY3Rpb24odCxyKXtyZXR1cm4gbihlKHQpLHIpfSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fXZhciByPWUobiksaT1yLnJpZ2h0LG89ci5sZWZ0O2Z1bmN0aW9uIGEodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gZih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPTAsYT0tMSxmPTAsYz0wO2lmKG51bGw9PW4pZm9yKDsrK2E8aTspaXNOYU4oZT11KHRbYV0pKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2Vsc2UgZm9yKDsrK2E8aTspaXNOYU4oZT11KG4odFthXSxhLHQpKSl8fChjKz0ocj1lLWYpKihlLShmKz1yLysrbykpKTtpZihvPjEpcmV0dXJuIGMvKG8tMSl9ZnVuY3Rpb24gYyh0LG4pe3ZhciBlPWYodCxuKTtyZXR1cm4gZT9NYXRoLnNxcnQoZSk6ZX1mdW5jdGlvbiBzKHQsbil7dmFyIGUscixpLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1uKXtmb3IoOysrYTxvOylpZihudWxsIT0oZT10W2FdKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPXRbYV0pJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShlPW4odFthXSxhLHQpKSYmZT49ZSlmb3Iocj1pPWU7KythPG87KW51bGwhPShlPW4odFthXSxhLHQpKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSk7cmV0dXJuW3IsaV19dmFyIGw9QXJyYXkucHJvdG90eXBlLGg9bC5zbGljZSxkPWwubWFwO2Z1bmN0aW9uIHAodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHYodCl7cmV0dXJuIHR9ZnVuY3Rpb24gZyh0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb312YXIgeT1NYXRoLnNxcnQoNTApLF89TWF0aC5zcXJ0KDEwKSxiPU1hdGguc3FydCgyKTtmdW5jdGlvbiBtKHQsbixlKXt2YXIgcixpLG8sYSx1PS0xO2lmKGU9K2UsKHQ9K3QpPT09KG49K24pJiZlPjApcmV0dXJuW3RdO2lmKChyPW48dCkmJihpPXQsdD1uLG49aSksMD09PShhPXgodCxuLGUpKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxuPU1hdGguZmxvb3Iobi9hKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrdTxpOylvW3VdPSh0K3UpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksbj1NYXRoLmNlaWwobiphKSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrdTxpOylvW3VdPSh0LXUpL2E7cmV0dXJuIHImJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24geCh0LG4sZSl7dmFyIHI9KG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj15PzEwOm8+PV8/NTpvPj1iPzI6MSl9ZnVuY3Rpb24gdyh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49eT9pKj0xMDpvPj1fP2kqPTU6bz49YiYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIE0odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gQSh0LG4sZSl7aWYobnVsbD09ZSYmKGU9dSkscj10Lmxlbmd0aCl7aWYoKG49K24pPD0wfHxyPDIpcmV0dXJuK2UodFswXSwwLHQpO2lmKG4+PTEpcmV0dXJuK2UodFtyLTFdLHItMSx0KTt2YXIgcixpPShyLTEpKm4sbz1NYXRoLmZsb29yKGkpLGE9K2UodFtvXSxvLHQpO3JldHVybiBhKygrZSh0W28rMV0sbysxLHQpLWEpKihpLW8pfX1mdW5jdGlvbiBUKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJmU+ciYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPnImJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIE4odCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89LTEsYT0wOysrbzxpOylhKz10W29dLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSk7LS1pPj0wOylmb3Iobj0ocj10W2ldKS5sZW5ndGg7LS1uPj0wOyllWy0tYV09cltuXTtyZXR1cm4gZX1mdW5jdGlvbiBTKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89LTE7aWYobnVsbD09bil7Zm9yKDsrK288aTspaWYobnVsbCE9KGU9dFtvXSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9dFtvXSkmJnI+ZSYmKHI9ZSl9ZWxzZSBmb3IoOysrbzxpOylpZihudWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+PWUpZm9yKHI9ZTsrK288aTspbnVsbCE9KGU9bih0W29dLG8sdCkpJiZyPmUmJihyPWUpO3JldHVybiByfWZ1bmN0aW9uIEUodCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT1TKHQsaykscj1uZXcgQXJyYXkoZSk7KytuPGU7KWZvcih2YXIgaSxvPS0xLGE9cltuXT1uZXcgQXJyYXkoaSk7KytvPGk7KWFbb109dFtvXVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBrKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgQz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gUCh0KXtyZXR1cm4gdH12YXIgej0xLFI9MixMPTMsRD00LFU9MWUtNjtmdW5jdGlvbiBxKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gTyh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIFkoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gQih0LG4pe3ZhciBlPVtdLHI9bnVsbCxpPW51bGwsbz02LGE9Nix1PTMsZj10PT09enx8dD09PUQ/LTE6MSxjPXQ9PT1EfHx0PT09Uj8ieCI6InkiLHM9dD09PXp8fHQ9PT1MP3E6TztmdW5jdGlvbiBsKGwpe3ZhciBoPW51bGw9PXI/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4sZSk6bi5kb21haW4oKTpyLGQ9bnVsbD09aT9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4sZSk6UDppLHA9TWF0aC5tYXgobywwKSt1LHY9bi5yYW5nZSgpLGc9K3ZbMF0rLjUseT0rdlt2Lmxlbmd0aC0xXSsuNSxfPShuLmJhbmR3aWR0aD9mdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMSkvMjtyZXR1cm4gdC5yb3VuZCgpJiYobj1NYXRoLnJvdW5kKG4pKSxmdW5jdGlvbihlKXtyZXR1cm4rdChlKStufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybit0KG4pfX0pKG4uY29weSgpKSxiPWwuc2VsZWN0aW9uP2wuc2VsZWN0aW9uKCk6bCxtPWIuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHg9Yi5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLG4pLm9yZGVyKCksdz14LmV4aXQoKSxNPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxBPXguc2VsZWN0KCJsaW5lIiksVD14LnNlbGVjdCgidGV4dCIpO209bS5tZXJnZShtLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSx4PXgubWVyZ2UoTSksQT1BLm1lcmdlKE0uYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihjKyIyIixmKm8pKSxUPVQubWVyZ2UoTS5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihjLGYqcCkuYXR0cigiZHkiLHQ9PT16PyIwZW0iOnQ9PT1MPyIwLjcxZW0iOiIwLjMyZW0iKSksbCE9PWImJihtPW0udHJhbnNpdGlvbihsKSx4PXgudHJhbnNpdGlvbihsKSxBPUEudHJhbnNpdGlvbihsKSxUPVQudHJhbnNpdGlvbihsKSx3PXcudHJhbnNpdGlvbihsKS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PV8odCkpP3ModCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSksTS5hdHRyKCJvcGFjaXR5IixVKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHMobiYmaXNGaW5pdGUobj1uKHQpKT9uOl8odCkpfSkpLHcucmVtb3ZlKCksbS5hdHRyKCJkIix0PT09RHx8dD09Uj9hPyJNIitmKmErIiwiK2crIkgwLjVWIit5KyJIIitmKmE6Ik0wLjUsIitnKyJWIit5OmE/Ik0iK2crIiwiK2YqYSsiVjAuNUgiK3krIlYiK2YqYToiTSIrZysiLDAuNUgiK3kpLHguYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gcyhfKHQpKX0pLEEuYXR0cihjKyIyIixmKm8pLFQuYXR0cihjLGYqcCkudGV4dChkKSxiLmZpbHRlcihZKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09Uj8ic3RhcnQiOnQ9PT1EPyJlbmQiOiJtaWRkbGUiKSxiLmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ffSl9cmV0dXJuIGwuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxsKTpufSxsLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGU9Qy5jYWxsKGFyZ3VtZW50cyksbH0sbC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/W106Qy5jYWxsKHQpLGwpOmUuc2xpY2UoKX0sbC50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDpDLmNhbGwodCksbCk6ciYmci5zbGljZSgpfSxsLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxsKTppfSxsLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsbCk6b30sbC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGwpOm99LGwudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxsKTphfSxsLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGwpOnV9LGx9dmFyIEY9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gSSgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcil0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtyW3RdPVtdfXJldHVybiBuZXcgSChyKX1mdW5jdGlvbiBIKHQpe3RoaXMuXz10fWZ1bmN0aW9uIGoodCxuKXtmb3IodmFyIGUscj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZigoZT10W3JdKS5uYW1lPT09bilyZXR1cm4gZS52YWx1ZX1mdW5jdGlvbiBYKHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT1GLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1lJiZ0LnB1c2goe25hbWU6bix2YWx1ZTplfSksdH1ILnByb3RvdHlwZT1JLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10aGlzLl8sbz0ocj1pLCh0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7aWYoZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx0JiYhci5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSksYT0tMSx1PW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO2Zvcig7KythPHU7KWlmKGU9KHQ9b1thXSkudHlwZSlpW2VdPVgoaVtlXSx0Lm5hbWUsbik7ZWxzZSBpZihudWxsPT1uKWZvcihlIGluIGkpaVtlXT1YKGlbZV0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KythPHU7KWlmKChlPSh0PW9bYV0pLnR5cGUpJiYoZT1qKGlbZV0sdC5uYW1lKSkpcmV0dXJuIGV9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IEgodCl9LGNhbGw6ZnVuY3Rpb24odCxuKXtpZigoZT1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBlLHIsaT1uZXcgQXJyYXkoZSksbz0wO288ZTsrK28paVtvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsZT0ocj10aGlzLl9bdF0pLmxlbmd0aDtvPGU7KytvKXJbb10udmFsdWUuYXBwbHkobixpKX0sYXBwbHk6ZnVuY3Rpb24odCxuLGUpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciByPXRoaXMuX1t0XSxpPTAsbz1yLmxlbmd0aDtpPG87KytpKXJbaV0udmFsdWUuYXBwbHkobixlKX19O3ZhciBHPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixWPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpHLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gJCh0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxWLmhhc093blByb3BlcnR5KG4pP3tzcGFjZTpWW25dLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVyh0KXt2YXIgbj0kKHQpO3JldHVybihuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUcmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUc/bi5jcmVhdGVFbGVtZW50KHQpOm4uY3JlYXRlRWxlbWVudE5TKGUsdCl9fSkobil9ZnVuY3Rpb24gWigpe31mdW5jdGlvbiBRKHQpe3JldHVybiBudWxsPT10P1o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBKKCl7cmV0dXJuW119ZnVuY3Rpb24gSyh0KXtyZXR1cm4gbnVsbD09dD9KOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19dmFyIHR0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgbnQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFudC5tYXRjaGVzKXt2YXIgZXQ9bnQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxudC5tc01hdGNoZXNTZWxlY3Rvcnx8bnQubW96TWF0Y2hlc1NlbGVjdG9yfHxudC5vTWF0Y2hlc1NlbGVjdG9yO3R0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBldC5jYWxsKHRoaXMsdCl9fX19dmFyIHJ0PXR0O2Z1bmN0aW9uIGl0KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIG90KHQsbil7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1ufW90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b3QsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxuKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX07dmFyIGF0PSIkIjtmdW5jdGlvbiB1dCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHU9MCxmPW4ubGVuZ3RoLGM9by5sZW5ndGg7dTxjOysrdSkoYT1uW3VdKT8oYS5fX2RhdGFfXz1vW3VdLHJbdV09YSk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IoO3U8ZjsrK3UpKGE9blt1XSkmJihpW3VdPWEpfWZ1bmN0aW9uIGZ0KHQsbixlLHIsaSxvLGEpe3ZhciB1LGYsYyxzPXt9LGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxkPW5ldyBBcnJheShsKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJihkW3VdPWM9YXQrYS5jYWxsKGYsZi5fX2RhdGFfXyx1LG4pLGMgaW4gcz9pW3VdPWY6c1tjXT1mKTtmb3IodT0wO3U8aDsrK3UpKGY9c1tjPWF0K2EuY2FsbCh0LG9bdV0sdSxvKV0pPyhyW3VdPWYsZi5fX2RhdGFfXz1vW3VdLHNbY109bnVsbCk6ZVt1XT1uZXcgb3QodCxvW3VdKTtmb3IodT0wO3U8bDsrK3UpKGY9blt1XSkmJnNbZFt1XV09PT1mJiYoaVt1XT1mKX1mdW5jdGlvbiBjdCh0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBzdCh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxzdCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gZHQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgcHQodCl9ZnVuY3Rpb24gcHQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPWh0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gdnQodCxuKXtmb3IodmFyIGU9ZHQodCkscj0tMSxpPW4ubGVuZ3RoOysrcjxpOyllLmFkZChuW3JdKX1mdW5jdGlvbiBndCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUucmVtb3ZlKG5bcl0pfWZ1bmN0aW9uIHl0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBfdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGJ0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIG10KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24geHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB3dCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIE10KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITEpLHRoaXMubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIEF0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITApLHRoaXMubmV4dFNpYmxpbmcpfXB0LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKHQpe3RoaXMuX25hbWVzLmluZGV4T2YodCk8MCYmKHRoaXMuX25hbWVzLnB1c2godCksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWVzLmluZGV4T2YodCk7bj49MCYmKHRoaXMuX25hbWVzLnNwbGljZShuLDEpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LGNvbnRhaW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKHQpPj0wfX07dmFyIFR0PXt9Oyh0LmV2ZW50PW51bGwsInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCkmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KFR0PXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pKTtmdW5jdGlvbiBOdCh0LG4sZSl7cmV0dXJuIHQ9U3QodCxuLGUpLGZ1bmN0aW9uKG4pe3ZhciBlPW4ucmVsYXRlZFRhcmdldDtlJiYoZT09PXRoaXN8fDgmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLG4pfX1mdW5jdGlvbiBTdChuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuZXZlbnQ7dC5ldmVudD1pO3RyeXtuLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUscil9ZmluYWxseXt0LmV2ZW50PW99fX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5jYXB0dXJlKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24ga3QodCxuLGUpe3ZhciByPVR0Lmhhc093blByb3BlcnR5KHQudHlwZSk/TnQ6U3Q7cmV0dXJuIGZ1bmN0aW9uKGksbyxhKXt2YXIgdSxmPXRoaXMuX19vbixjPXIobixvLGEpO2lmKGYpZm9yKHZhciBzPTAsbD1mLmxlbmd0aDtzPGw7KytzKWlmKCh1PWZbc10pLnR5cGU9PT10LnR5cGUmJnUubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyLHUuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHUudHlwZSx1Lmxpc3RlbmVyPWMsdS5jYXB0dXJlPWUpLHZvaWQodS52YWx1ZT1uKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsZSksdT17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6bixsaXN0ZW5lcjpjLGNhcHR1cmU6ZX0sZj9mLnB1c2godSk6dGhpcy5fX29uPVt1XX19ZnVuY3Rpb24gQ3QobixlLHIsaSl7dmFyIG89dC5ldmVudDtuLnNvdXJjZUV2ZW50PXQuZXZlbnQsdC5ldmVudD1uO3RyeXtyZXR1cm4gZS5hcHBseShyLGkpfWZpbmFsbHl7dC5ldmVudD1vfX1mdW5jdGlvbiBQdCh0LG4sZSl7dmFyIHI9c3QodCksaT1yLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkobixlKTooaT1yLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGU/KGkuaW5pdEV2ZW50KG4sZS5idWJibGVzLGUuY2FuY2VsYWJsZSksaS5kZXRhaWw9ZS5kZXRhaWwpOmkuaW5pdEV2ZW50KG4sITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIHp0PVtudWxsXTtmdW5jdGlvbiBSdCh0LG4pe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bn1mdW5jdGlvbiBMdCgpe3JldHVybiBuZXcgUnQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx6dCl9ZnVuY3Rpb24gRHQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtbdF1dLHp0KX1SdC5wcm90b3R5cGU9THQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSdCxzZWxlY3Q6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYSx1PW5baV0sZj11Lmxlbmd0aCxjPXJbaV09bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShvPXVbc10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbc109YSk7cmV0dXJuIG5ldyBSdChyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPVtdLGk9W10sbz0wO288ZTsrK28pZm9yKHZhciBhLHU9bltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiYoci5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyx1KSksaS5wdXNoKGEpKTtyZXR1cm4gbmV3IFJ0KHIsaSl9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cnQodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYT1uW2ldLHU9YS5sZW5ndGgsZj1yW2ldPVtdLGM9MDtjPHU7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmYucHVzaChvKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24odCxuKXtpZighdClyZXR1cm4gcD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHM9LTEsdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3BbKytzXT10fSkscDt2YXIgZSxyPW4/ZnQ6dXQsaT10aGlzLl9wYXJlbnRzLG89dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYoZT10LHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0pO2Zvcih2YXIgYT1vLmxlbmd0aCx1PW5ldyBBcnJheShhKSxmPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSxzPTA7czxhOysrcyl7dmFyIGw9aVtzXSxoPW9bc10sZD1oLmxlbmd0aCxwPXQuY2FsbChsLGwmJmwuX19kYXRhX18scyxpKSx2PXAubGVuZ3RoLGc9ZltzXT1uZXcgQXJyYXkodikseT11W3NdPW5ldyBBcnJheSh2KTtyKGwsaCxnLHksY1tzXT1uZXcgQXJyYXkoZCkscCxuKTtmb3IodmFyIF8sYixtPTAseD0wO208djsrK20paWYoXz1nW21dKXtmb3IobT49eCYmKHg9bSsxKTshKGI9eVt4XSkmJisreDx2Oyk7Xy5fbmV4dD1ifHxudWxsfX1yZXR1cm4odT1uZXcgUnQodSxpKSkuX2VudGVyPWYsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBSdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoaXQpLHRoaXMuX3BhcmVudHMpfSxtZXJnZTpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUnQoYSx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsYT1pW29dOy0tbz49MDspKHI9aVtvXSkmJihhJiZhIT09ci5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1jdCk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEsdT1lW29dLGY9dS5sZW5ndGgsYz1pW29dPW5ldyBBcnJheShmKSxzPTA7czxmOysrcykoYT11W3NdKSYmKGNbc109YSk7Yy5zb3J0KG4pfXJldHVybiBuZXcgUnQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPSQodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZS5sb2NhbD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fTplLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19OmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19KSh0LG4sbnVsbD09ZT8iIjplKSk6bHQodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1lfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fSkodCxuKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1odCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1kdCh0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT92dDpndCkodGhpcyx0KX19Om4/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dnQodGhpcyx0KX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2d0KHRoaXMsdCl9fSkoZSxuKSl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/eXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX0pKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9fdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goYnQpfSxsb3dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2gobXQpfSxhcHBlbmQ6ZnVuY3Rpb24odCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpXKHQpO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCkscj1udWxsPT1uP3h0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246UShuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2god3QpfSxjbG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9BdDpNdCl9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9KHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IodT1uP2t0OkV0LG51bGw9PWUmJihlPSExKSxyPTA7cjxhOysrcil0aGlzLmVhY2godShvW3JdLG4sZSkpO3JldHVybiB0aGlzfXZhciB1PXRoaXMubm9kZSgpLl9fb247aWYodSlmb3IodmFyIGYsYz0wLHM9dS5sZW5ndGg7YzxzOysrYylmb3Iocj0wLGY9dVtjXTtyPGE7KytyKWlmKChpPW9bcl0pLnR5cGU9PT1mLnR5cGUmJmkubmFtZT09PWYubmFtZSlyZXR1cm4gZi52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0LG4pfX0pKHQsbikpfX07dmFyIFV0PTA7ZnVuY3Rpb24gcXQoKXtyZXR1cm4gbmV3IE90fWZ1bmN0aW9uIE90KCl7dGhpcy5fPSJAIisoKytVdCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIFl0KCl7Zm9yKHZhciBuLGU9dC5ldmVudDtuPWUuc291cmNlRXZlbnQ7KWU9bjtyZXR1cm4gZX1mdW5jdGlvbiBCdCh0LG4pe3ZhciBlPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKGUuY3JlYXRlU1ZHUG9pbnQpe3ZhciByPWUuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gci54PW4uY2xpZW50WCxyLnk9bi5jbGllbnRZLFsocj1yLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSkpLngsci55XX12YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltuLmNsaWVudFgtaS5sZWZ0LXQuY2xpZW50TGVmdCxuLmNsaWVudFktaS50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uIEZ0KHQpe3ZhciBuPVl0KCk7cmV0dXJuIG4uY2hhbmdlZFRvdWNoZXMmJihuPW4uY2hhbmdlZFRvdWNoZXNbMF0pLEJ0KHQsbil9ZnVuY3Rpb24gSXQodCxuLGUpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGU9bixuPVl0KCkuY2hhbmdlZFRvdWNoZXMpO2Zvcih2YXIgcixpPTAsbz1uP24ubGVuZ3RoOjA7aTxvOysraSlpZigocj1uW2ldKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gQnQodCxyKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBIdCgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24ganQoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBYdCh0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsanQsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIsanQsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfWZ1bmN0aW9uIEd0KHQsbil7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1EdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO24mJihyLm9uKCJjbGljay5kcmFnIixqdCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gZT9yLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKTooZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PWUuX19ub3NlbGVjdCxkZWxldGUgZS5fX25vc2VsZWN0KX1mdW5jdGlvbiBWdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gJHQodCxuLGUscixpLG8sYSx1LGYsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnN1YmplY3Q9ZSx0aGlzLmlkZW50aWZpZXI9cix0aGlzLmFjdGl2ZT1pLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9dSx0aGlzLmR5PWYsdGhpcy5fPWN9ZnVuY3Rpb24gV3QoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gWnQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlfWZ1bmN0aW9uIFF0KG4pe3JldHVybiBudWxsPT1uP3t4OnQuZXZlbnQueCx5OnQuZXZlbnQueX06bn1mdW5jdGlvbiBKdCgpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBLdCh0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gdG4odCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24gbm4oKXt9T3QucHJvdG90eXBlPXF0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6T3QsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sJHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIGVuPSJcXHMqKFsrLV0/XFxkKylcXHMqIixybj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixvbj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsYW49L14jKFswLTlhLWZdezN9KSQvLHVuPS9eIyhbMC05YS1mXXs2fSkkLyxmbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZW4sZW4sZW5dKyJcXCkkIiksY249bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW29uLG9uLG9uXSsiXFwpJCIpLHNuPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZW4sZW4sZW4scm5dKyJcXCkkIiksbG49bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tvbixvbixvbixybl0rIlxcKSQiKSxobj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcm4sb24sb25dKyJcXCkkIiksZG49bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tybixvbixvbixybl0rIlxcKSQiKSxwbj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB2bih0KXt2YXIgbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKG49YW4uZXhlYyh0KSk/bmV3IG1uKChuPXBhcnNlSW50KG5bMV0sMTYpKT4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpOihuPXVuLmV4ZWModCkpP2duKHBhcnNlSW50KG5bMV0sMTYpKToobj1mbi5leGVjKHQpKT9uZXcgbW4oblsxXSxuWzJdLG5bM10sMSk6KG49Y24uZXhlYyh0KSk/bmV3IG1uKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPXNuLmV4ZWModCkpP3luKG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPWxuLmV4ZWModCkpP3luKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPWhuLmV4ZWModCkpP3duKG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49ZG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpwbi5oYXNPd25Qcm9wZXJ0eSh0KT9nbihwblt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IG1uKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gZ24odCl7cmV0dXJuIG5ldyBtbih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24geW4odCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyBtbih0LG4sZSxyKX1mdW5jdGlvbiBfbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksdD9uZXcgbW4oKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IG1ufWZ1bmN0aW9uIGJuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fbih0KTpuZXcgbW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIG1uKHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiB4bih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHduKHQsbixlLHIpe3JldHVybiByPD0wP3Q9bj1lPU5hTjplPD0wfHxlPj0xP3Q9bj1OYU46bjw9MCYmKHQ9TmFOKSxuZXcgQW4odCxuLGUscil9ZnVuY3Rpb24gTW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gbmV3IEFuKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIG5ufHwodD12bih0KSksIXQpcmV0dXJuIG5ldyBBbjtpZih0IGluc3RhbmNlb2YgQW4pcmV0dXJuIHQ7dmFyIG49KHQ9dC5yZ2IoKSkuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSxhPU5hTix1PW8taSxmPShvK2kpLzI7cmV0dXJuIHU/KGE9bj09PW8/KGUtcikvdSs2KihlPHIpOmU9PT1vPyhyLW4pL3UrMjoobi1lKS91KzQsdS89ZjwuNT9vK2k6Mi1vLWksYSo9NjApOnU9Zj4wJiZmPDE/MDphLG5ldyBBbihhLHUsZix0Lm9wYWNpdHkpfSh0KTpuZXcgQW4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEFuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBUbih0LG4sZSl7cmV0dXJuIDI1NSoodDw2MD9uKyhlLW4pKnQvNjA6dDwxODA/ZTp0PDI0MD9uKyhlLW4pKigyNDAtdCkvNjA6bil9S3Qobm4sdm4se2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuaGV4KCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksS3QobW4sYm4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgbW4odGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmdGhpcy5yPD0yNTUmJjA8PXRoaXMuZyYmdGhpcy5nPD0yNTUmJjA8PXRoaXMuYiYmdGhpcy5iPD0yNTUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIyIreG4odGhpcy5yKSt4bih0aGlzLmcpK3huKHRoaXMuYil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpLEt0KEFuLE1uLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgQW4odGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBtbihUbih0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxUbih0LGksciksVG4odDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX19KSk7dmFyIE5uPU1hdGguUEkvMTgwLFNuPTE4MC9NYXRoLlBJLEVuPS45NjQyMixrbj0xLENuPS44MjUyMSxQbj00LzI5LHpuPTYvMjksUm49Myp6bip6bixMbj16bip6bip6bjtmdW5jdGlvbiBEbih0KXtpZih0IGluc3RhbmNlb2YgcW4pcmV0dXJuIG5ldyBxbih0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBqbil7aWYoaXNOYU4odC5oKSlyZXR1cm4gbmV3IHFuKHQubCwwLDAsdC5vcGFjaXR5KTt2YXIgbj10LmgqTm47cmV0dXJuIG5ldyBxbih0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBtbnx8KHQ9X24odCkpO3ZhciBlLHIsaT1Gbih0LnIpLG89Rm4odC5nKSxhPUZuKHQuYiksdT1PbigoLjIyMjUwNDUqaSsuNzE2ODc4NipvKy4wNjA2MTY5KmEpL2tuKTtyZXR1cm4gaT09PW8mJm89PT1hP2U9cj11OihlPU9uKCguNDM2MDc0NyppKy4zODUwNjQ5Km8rLjE0MzA4MDQqYSkvRW4pLHI9T24oKC4wMTM5MzIyKmkrLjA5NzEwNDUqbysuNzE0MTczMyphKS9DbikpLG5ldyBxbigxMTYqdS0xNiw1MDAqKGUtdSksMjAwKih1LXIpLHQub3BhY2l0eSl9ZnVuY3Rpb24gVW4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0RuKHQpOm5ldyBxbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gcW4odCxuLGUscil7dGhpcy5sPSt0LHRoaXMuYT0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0PkxuP01hdGgucG93KHQsMS8zKTp0L1JuK1BufWZ1bmN0aW9uIFluKHQpe3JldHVybiB0PnpuP3QqdCp0OlJuKih0LVBuKX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIEZuKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIEluKHQpe2lmKHQgaW5zdGFuY2VvZiBqbilyZXR1cm4gbmV3IGpuKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHFufHwodD1Ebih0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGpuKE5hTiwwLHQubCx0Lm9wYWNpdHkpO3ZhciBuPU1hdGguYXRhbjIodC5iLHQuYSkqU247cmV0dXJuIG5ldyBqbihuPDA/biszNjA6bixNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBIbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBqbih0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5jPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9S3QocW4sVW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcW4odGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgbW4oQm4oMy4xMzM4NTYxKihuPUVuKlluKG4pKS0xLjYxNjg2NjcqKHQ9a24qWW4odCkpLS40OTA2MTQ2KihlPUNuKlluKGUpKSksQm4oLS45Nzg3Njg0Km4rMS45MTYxNDE1KnQrLjAzMzQ1NCplKSxCbiguMDcxOTQ1MypuLS4yMjg5OTE0KnQrMS40MDUyNDI3KmUpLHRoaXMub3BhY2l0eSl9fSkpLEt0KGpuLEhuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGpuKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcykucmdiKCl9fSkpO3ZhciBYbj0tLjE0ODYxLEduPTEuNzgyNzcsVm49LS4yOTIyNywkbj0tLjkwNjQ5LFduPTEuOTcyOTQsWm49V24qJG4sUW49V24qR24sSm49R24qVm4tJG4qWG47ZnVuY3Rpb24gS24odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiB0ZSlyZXR1cm4gbmV3IHRlKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KEpuKnIrWm4qbi1RbiplKS8oSm4rWm4tUW4pLG89ci1pLGE9KFduKihlLWkpLVZuKm8pLyRuLHU9TWF0aC5zcXJ0KGEqYStvKm8pLyhXbippKigxLWkpKSxmPXU/TWF0aC5hdGFuMihhLG8pKlNuLTEyMDpOYU47cmV0dXJuIG5ldyB0ZShmPDA/ZiszNjA6Zix1LGksdC5vcGFjaXR5KX0odCk6bmV3IHRlKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiB0ZSh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gbmUodCxuLGUscixpKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqbisoNC02Km8rMyphKSplKygxKzMqdCszKm8tMyphKSpyK2EqaSkvNn1mdW5jdGlvbiBlZSh0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLGE9cj4wP3Rbci0xXToyKmktbyx1PXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gbmUoKGUtci9uKSpuLGEsaSxvLHUpfX1mdW5jdGlvbiByZSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLGE9dFsocisxKSVuXSx1PXRbKHIrMiklbl07cmV0dXJuIG5lKChlLXIvbikqbixpLG8sYSx1KX19ZnVuY3Rpb24gaWUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG9lKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24gYWUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlPjE4MHx8ZTwtMTgwP2UtMzYwKk1hdGgucm91bmQoZS8zNjApOmUpOmllKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gdWUodCl7cmV0dXJuIDE9PSh0PSt0KT9mZTpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiB0PU1hdGgucG93KHQsZSksbj1NYXRoLnBvdyhuLGUpLXQsZT0xL2UsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucG93KHQrcipuLGUpfX0obixlLHQpOmllKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIGZlKHQsbil7dmFyIGU9bi10O3JldHVybiBlP29lKHQsZSk6aWUoaXNOYU4odCk/bjp0KX1LdCh0ZSxLbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IHRlKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpObixuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgbW4oMjU1KihuK2UqKFhuKnIrR24qaSkpLDI1NSoobitlKihWbipyKyRuKmkpKSwyNTUqKG4rZSooV24qcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBjZT1mdW5jdGlvbiB0KG4pe3ZhciBlPXVlKG4pO2Z1bmN0aW9uIHIodCxuKXt2YXIgcj1lKCh0PWJuKHQpKS5yLChuPWJuKG4pKS5yKSxpPWUodC5nLG4uZyksbz1lKHQuYixuLmIpLGE9ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnI9cihuKSx0Lmc9aShuKSx0LmI9byhuKSx0Lm9wYWNpdHk9YShuKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KDEpO2Z1bmN0aW9uIHNlKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9Ym4obltlXSksb1tlXT1yLnJ8fDAsYVtlXT1yLmd8fDAsdVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSxhPXQoYSksdT10KHUpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9YSh0KSxyLmI9dSh0KSxyKyIifX19dmFyIGxlPXNlKGVlKSxoZT1zZShyZSk7ZnVuY3Rpb24gZGUodCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1tZSh0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSlhW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSlhW2VdPW9bZV0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIHBlKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24ocil7cmV0dXJuIGUuc2V0VGltZSh0K24qciksZX19ZnVuY3Rpb24gdmUodCxuKXtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIGdlKHQsbil7dmFyIGUscj17fSxpPXt9O2ZvcihlIGluIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09biYmIm9iamVjdCI9PXR5cGVvZiBufHwobj17fSksbillIGluIHQ/cltlXT1tZSh0W2VdLG5bZV0pOmlbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGUgaW4gcilpW2VdPXJbZV0odCk7cmV0dXJuIGl9fXZhciB5ZT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csX2U9bmV3IFJlZ0V4cCh5ZS5zb3VyY2UsImciKTtmdW5jdGlvbiBiZSh0LG4pe3ZhciBlLHIsaSxvPXllLmxhc3RJbmRleD1fZS5sYXN0SW5kZXg9MCxhPS0xLHU9W10sZj1bXTtmb3IodCs9IiIsbis9IiI7KGU9eWUuZXhlYyh0KSkmJihyPV9lLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksdVthXT91W2FdKz1pOnVbKythXT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP3VbYV0/dVthXSs9cjp1WysrYV09cjoodVsrK2FdPW51bGwsZi5wdXNoKHtpOmEseDp2ZShlLHIpfSkpLG89X2UubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLHVbYV0/dVthXSs9aTp1WysrYV09aSksdS5sZW5ndGg8Mj9mWzBdP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19KGZbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShuKToobj1mLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpdVsoZT1mW3JdKS5pXT1lLngodCk7cmV0dXJuIHUuam9pbigiIil9KX1mdW5jdGlvbiBtZSh0LG4pe3ZhciBlLHI9dHlwZW9mIG47cmV0dXJuIG51bGw9PW58fCJib29sZWFuIj09PXI/aWUobik6KCJudW1iZXIiPT09cj92ZToic3RyaW5nIj09PXI/KGU9dm4obikpPyhuPWUsY2UpOmJlOm4gaW5zdGFuY2VvZiB2bj9jZTpuIGluc3RhbmNlb2YgRGF0ZT9wZTpBcnJheS5pc0FycmF5KG4pP2RlOiJmdW5jdGlvbiIhPXR5cGVvZiBuLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9nZTp2ZSkodCxuKX1mdW5jdGlvbiB4ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQrbiplKX19dmFyIHdlLE1lLEFlLFRlLE5lPTE4MC9NYXRoLlBJLFNlPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEVlKHQsbixlLHIsaSxvKXt2YXIgYSx1LGY7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPWEsbi89YSksKGY9dCplK24qcikmJihlLT10KmYsci09bipmKSwodT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89dSxyLz11LGYvPXUpLHQqcjxuKmUmJih0PS10LG49LW4sZj0tZixhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKk5lLHNrZXdYOk1hdGguYXRhbihmKSpOZSxzY2FsZVg6YSxzY2FsZVk6dX19ZnVuY3Rpb24ga2UodCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHU9W10sZj1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSxmdW5jdGlvbih0LHIsaSxvLGEsdSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgZj1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO3UucHVzaCh7aTpmLTQseDp2ZSh0LGkpfSx7aTpmLTIseDp2ZShyLG8pfSl9ZWxzZShpfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX0oby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHUsZiksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX0oby5yb3RhdGUsYS5yb3RhdGUsdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6dmUodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9KG8uc2tld1gsYS5za2V3WCx1LGYpLGZ1bmN0aW9uKHQsbixlLHIsbyxhKXtpZih0IT09ZXx8biE9PXIpe3ZhciB1PW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6dS00LHg6dmUodCxlKX0se2k6dS0yLHg6dmUobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9KG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHUsZiksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj1mLmxlbmd0aDsrK2U8cjspdVsobj1mW2VdKS5pXT1uLngodCk7cmV0dXJuIHUuam9pbigiIil9fX12YXIgQ2U9a2UoZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dD9TZTood2V8fCh3ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxNZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsQWU9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLHdlLnN0eWxlLnRyYW5zZm9ybT10LHQ9QWUuZ2V0Q29tcHV0ZWRTdHlsZShNZS5hcHBlbmRDaGlsZCh3ZSksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksTWUucmVtb3ZlQ2hpbGQod2UpLEVlKCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9LCJweCwgIiwicHgpIiwiZGVnKSIpLFBlPWtlKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1NlOihUZXx8KFRlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFRlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1UZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9FZSgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpTZSl9LCIsICIsIikiLCIpIiksemU9TWF0aC5TUVJUMixSZT0yLExlPTQsRGU9MWUtMTI7ZnVuY3Rpb24gVWUodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gcWUodCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sYT10WzJdLHU9blswXSxmPW5bMV0sYz1uWzJdLHM9dS1pLGw9Zi1vLGg9cypzK2wqbDtpZihoPERlKXI9TWF0aC5sb2coYy9hKS96ZSxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqcyxvK3QqbCxhKk1hdGguZXhwKHplKnQqcildfTtlbHNle3ZhciBkPU1hdGguc3FydChoKSxwPShjKmMtYSphK0xlKmgpLygyKmEqUmUqZCksdj0oYypjLWEqYS1MZSpoKS8oMipjKlJlKmQpLGc9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSx5PU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oeS1nKS96ZSxlPWZ1bmN0aW9uKHQpe3ZhciBuLGU9dCpyLHU9VWUoZyksZj1hLyhSZSpkKSoodSoobj16ZSplK2csKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpKS1mdW5jdGlvbih0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0oZykpO3JldHVybltpK2YqcyxvK2YqbCxhKnUvVWUoemUqZStnKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9ZnVuY3Rpb24gT2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1NbihuKSkuaCwoZT1NbihlKSkuaCksaT1mZShuLnMsZS5zKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLnM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIFllPU9lKGFlKSxCZT1PZShmZSk7ZnVuY3Rpb24gRmUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dCgobj1IbihuKSkuaCwoZT1IbihlKSkuaCksaT1mZShuLmMsZS5jKSxvPWZlKG4ubCxlLmwpLGE9ZmUobi5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9cih0KSxuLmM9aSh0KSxuLmw9byh0KSxuLm9wYWNpdHk9YSh0KSxuKyIifX19dmFyIEllPUZlKGFlKSxIZT1GZShmZSk7ZnVuY3Rpb24gamUodCl7cmV0dXJuIGZ1bmN0aW9uIG4oZSl7ZnVuY3Rpb24gcihuLHIpe3ZhciBpPXQoKG49S24obikpLmgsKHI9S24ocikpLmgpLG89ZmUobi5zLHIucyksYT1mZShuLmwsci5sKSx1PWZlKG4ub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPWkodCksbi5zPW8odCksbi5sPWEoTWF0aC5wb3codCxlKSksbi5vcGFjaXR5PXUodCksbisiIn19cmV0dXJuIGU9K2Usci5nYW1tYT1uLHJ9KDEpfXZhciBYZT1qZShhZSksR2U9amUoZmUpO3ZhciBWZSwkZSxXZT0wLFplPTAsUWU9MCxKZT0xZTMsS2U9MCx0cj0wLG5yPTAsZXI9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUscnI9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gaXIoKXtyZXR1cm4gdHJ8fChycihvciksdHI9ZXIubm93KCkrbnIpfWZ1bmN0aW9uIG9yKCl7dHI9MH1mdW5jdGlvbiBhcigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gdXIodCxuLGUpe3ZhciByPW5ldyBhcjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIGZyKCl7aXIoKSwrK1dlO2Zvcih2YXIgdCxuPVZlO247KSh0PXRyLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1XZX1mdW5jdGlvbiBjcigpe3RyPShLZT1lci5ub3coKSkrbnIsV2U9WmU9MDt0cnl7ZnIoKX1maW5hbGx5e1dlPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9VmUscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46VmU9bik7JGU9dCxscihyKX0oKSx0cj0wfX1mdW5jdGlvbiBzcigpe3ZhciB0PWVyLm5vdygpLG49dC1LZTtuPkplJiYobnItPW4sS2U9dCl9ZnVuY3Rpb24gbHIodCl7V2V8fChaZSYmKFplPWNsZWFyVGltZW91dChaZSkpLHQtdHI+MjQ/KHQ8MS8wJiYoWmU9c2V0VGltZW91dChjcix0LWVyLm5vdygpLW5yKSksUWUmJihRZT1jbGVhckludGVydmFsKFFlKSkpOihRZXx8KEtlPWVyLm5vdygpLFFlPXNldEludGVydmFsKHNyLEplKSksV2U9MSxycihjcikpKX1mdW5jdGlvbiBocih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9YXIucHJvdG90eXBlPXVyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YXIscmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP2lyKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fCRlPT09dGhpc3x8KCRlPyRlLl9uZXh0PXRoaXM6VmU9dGhpcywkZT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLGxyKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGxyKCkpfX07dmFyIGRyPUkoInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikscHI9W10sdnI9MCxncj0xLHlyPTIsX3I9Myxicj00LG1yPTUseHI9NjtmdW5jdGlvbiB3cih0LG4sZSxyLGksbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYoZSBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyFmdW5jdGlvbih0LG4sZSl7dmFyIHIsaT10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGYpe3ZhciBjLHMsbCxoO2lmKGUuc3RhdGUhPT1ncilyZXR1cm4gdSgpO2ZvcihjIGluIGkpaWYoKGg9aVtjXSkubmFtZT09PWUubmFtZSl7aWYoaC5zdGF0ZT09PV9yKXJldHVybiBocihvKTtoLnN0YXRlPT09YnI/KGguc3RhdGU9eHIsaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBpW2NdKTorYzxuJiYoaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtjXSl9aWYoaHIoZnVuY3Rpb24oKXtlLnN0YXRlPT09X3ImJihlLnN0YXRlPWJyLGUudGltZXIucmVzdGFydChhLGUuZGVsYXksZS50aW1lKSxhKGYpKX0pLGUuc3RhdGU9eXIsZS5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZS5zdGF0ZT09PXlyKXtmb3IoZS5zdGF0ZT1fcixyPW5ldyBBcnJheShsPWUudHdlZW4ubGVuZ3RoKSxjPTAscz0tMTtjPGw7KytjKShoPWUudHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSkmJihyWysrc109aCk7ci5sZW5ndGg9cysxfX1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgaT1uPGUuZHVyYXRpb24/ZS5lYXNlLmNhbGwobnVsbCxuL2UuZHVyYXRpb24pOihlLnRpbWVyLnJlc3RhcnQodSksZS5zdGF0ZT1tciwxKSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXJbb10uY2FsbChudWxsLGkpO2Uuc3RhdGU9PT1tciYmKGUub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSx1KCkpfWZ1bmN0aW9uIHUoKXtmb3IodmFyIHIgaW4gZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxkZWxldGUgaVtuXSxpKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259aVtuXT1lLGUudGltZXI9dXIoZnVuY3Rpb24odCl7ZS5zdGF0ZT1ncixlLnRpbWVyLnJlc3RhcnQobyxlLmRlbGF5LGUudGltZSksZS5kZWxheTw9dCYmbyh0LWUuZGVsYXkpfSwwLGUudGltZSl9KHQsZSx7bmFtZTpuLGluZGV4OnIsZ3JvdXA6aSxvbjpkcix0d2Vlbjpwcix0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTp2cn0pfWZ1bmN0aW9uIE1yKHQsbil7dmFyIGU9VHIodCxuKTtpZihlLnN0YXRlPnZyKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gQXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+eXIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzdGFydGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gVHIodCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gZX1mdW5jdGlvbiBOcih0LG4pe3ZhciBlLHIsaSxvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKGkgaW4gbj1udWxsPT1uP251bGw6bisiIixvKShlPW9baV0pLm5hbWU9PT1uPyhyPWUuc3RhdGU+eXImJmUuc3RhdGU8bXIsZS5zdGF0ZT14cixlLnRpbWVyLnN0b3AoKSxyJiZlLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBTcih0LG4sZSl7dmFyIHI9dC5faWQ7cmV0dXJuIHQuZWFjaChmdW5jdGlvbigpe3ZhciB0PUFyKHRoaXMscik7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbbl09ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxmdW5jdGlvbih0KXtyZXR1cm4gVHIodCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gRXIodCxuKXt2YXIgZTtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBuP3ZlOm4gaW5zdGFuY2VvZiB2bj9jZTooZT12bihuKSk/KG49ZSxjZSk6YmUpKHQsbil9dmFyIGtyPUx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcjt2YXIgQ3I9MDtmdW5jdGlvbiBQcih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24genIodCl7cmV0dXJuIEx0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBScigpe3JldHVybisrQ3J9dmFyIExyPUx0LnByb3RvdHlwZTtmdW5jdGlvbiBEcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBVcih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1Qci5wcm90b3R5cGU9enIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQcixzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciB1LGYsYz1yW2FdLHM9Yy5sZW5ndGgsbD1vW2FdPW5ldyBBcnJheShzKSxoPTA7aDxzOysraCkodT1jW2hdKSYmKGY9dC5jYWxsKHUsdS5fX2RhdGFfXyxoLGMpKSYmKCJfX2RhdGFfXyJpbiB1JiYoZi5fX2RhdGFfXz11Ll9fZGF0YV9fKSxsW2hdPWYsd3IobFtoXSxuLGUsaCxsLFRyKHUsZSkpKTtyZXR1cm4gbmV3IFByKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1LKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSxhPVtdLHU9MDt1PGk7Kyt1KWZvcih2YXIgZixjPXJbdV0scz1jLmxlbmd0aCxsPTA7bDxzOysrbClpZihmPWNbbF0pe2Zvcih2YXIgaCxkPXQuY2FsbChmLGYuX19kYXRhX18sbCxjKSxwPVRyKGYsZSksdj0wLGc9ZC5sZW5ndGg7djxnOysrdikoaD1kW3ZdKSYmd3IoaCxuLGUsdixkLHApO28ucHVzaChkKSxhLnB1c2goZil9cmV0dXJuIG5ldyBQcihvLGEsbixlKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksYT1uZXcgQXJyYXkociksdT0wO3U8bzsrK3UpZm9yKHZhciBmLGM9blt1XSxzPWVbdV0sbD1jLmxlbmd0aCxoPWFbdV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShmPWNbZF18fHNbZF0pJiYoaFtkXT1mKTtmb3IoO3U8cjsrK3UpYVt1XT1uW3VdO3JldHVybiBuZXcgUHIoYSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxzZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGtyKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9uYW1lLG49dGhpcy5faWQsZT1ScigpLHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKWlmKGE9dVtjXSl7dmFyIHM9VHIoYSxuKTt3cihhLHQsZSxjLHUse3RpbWU6cy50aW1lK3MuZGVsYXkrcy5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOnMuZHVyYXRpb24sZWFzZTpzLmVhc2V9KX1yZXR1cm4gbmV3IFByKHIsdGhpcy5fcGFyZW50cyx0LGUpfSxjYWxsOkxyLmNhbGwsbm9kZXM6THIubm9kZXMsbm9kZTpMci5ub2RlLHNpemU6THIuc2l6ZSxlbXB0eTpMci5lbXB0eSxlYWNoOkxyLmVhY2gsb246ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP1RyKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaChmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCl7dmFyIG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJih0PXQuc2xpY2UoMCxuKSksIXR8fCJzdGFydCI9PT10fSl9KG4pP01yOkFyO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSx1PWEub247dSE9PXImJihpPShyPXUpLmNvcHkoKSkub24obixlKSxhLm9uPWl9fShlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KSxyPSJ0cmFuc2Zvcm0iPT09ZT9QZTpFcjtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2Ygbj8oZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHU9ZSh0aGlzKTtpZihudWxsIT11KXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlLHIsU3IodGhpcywiYXR0ci4iK3QsbikpOm51bGw9PW4/KGUubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkoZSk6KGUubG9jYWw/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KShlLHIsbisiIikpfSxhdHRyVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3ZhciByPSQodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfTpmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlKHQscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9KShyLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP0NlOkVyO3JldHVybiBudWxsPT1uP3RoaXMuc3R5bGVUd2Vlbih0LGZ1bmN0aW9uKHQsbil7dmFyIGUscixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09ZSYmYT09PXI/aTppPW4oZT1vLHI9YSl9fSh0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX0odCkpOnRoaXMuc3R5bGVUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9bHQodGhpcyx0KSx1PWUodGhpcyk7cmV0dXJuIG51bGw9PXUmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHU9bHQodGhpcyx0KSksYT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSl9fSh0LHIsU3IodGhpcywic3R5bGUuIit0LG4pKTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1sdCh0aGlzLHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19KHQscixuKyIiKSxlKX0sc3R5bGVUd2VlbjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKHI9dGhpcy50d2VlbihyKSkmJnIuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4ocixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4ocixmdW5jdGlvbih0LG4sZSl7ZnVuY3Rpb24gcigpe3ZhciByPXRoaXMsaT1uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gaSYmZnVuY3Rpb24obil7ci5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkobiksZSl9fXJldHVybiByLl92YWx1ZT1uLHJ9KHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19KFNyKHRoaXMsInRleHQiLHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLCh0PXRoaXMuX2lkLGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9KSk7dmFyIHR9LHR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7aWYodCs9IiIsYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHIsaT1Ucih0aGlzLm5vZGUoKSxlKS50d2VlbixvPTAsYT1pLmxlbmd0aDtvPGE7KytvKWlmKChyPWlbb10pLm5hbWU9PT10KXJldHVybiByLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/ZnVuY3Rpb24odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPUFyKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKWZvcih2YXIgYT0wLHU9KHI9ZT1vKS5sZW5ndGg7YTx1OysrYSlpZihyW2FdLm5hbWU9PT1uKXsocj1yLnNsaWNlKCkpLnNwbGljZShhLDEpO2JyZWFrfWkudHdlZW49cn19OmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1Bcih0aGlzLHQpLGE9by50d2VlbjtpZihhIT09cil7aT0ocj1hKS5zbGljZSgpO2Zvcih2YXIgdT17bmFtZTpuLHZhbHVlOmV9LGY9MCxjPWkubGVuZ3RoO2Y8YzsrK2YpaWYoaVtmXS5uYW1lPT09bil7aVtmXT11O2JyZWFrfWY9PT1jJiZpLnB1c2godSl9by50d2Vlbj1pfX0pKGUsdCxuKSl9LGRlbGF5OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtNcih0aGlzLHQpLmRlbGF5PW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG49K24sZnVuY3Rpb24oKXtBcih0aGlzLHQpLmR1cmF0aW9uPW59fSkobix0KSk6VHIodGhpcy5ub2RlKCksbikuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZWFzZT1ufX0obix0KSk6VHIodGhpcy5ub2RlKCksbikuZWFzZX19O3ZhciBxcj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucG93KHQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLE9yPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsbil9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLFlyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KHQsbik6Mi1NYXRoLnBvdygyLXQsbikpLzJ9cmV0dXJuIG49K24sZS5leHBvbmVudD10LGV9KDMpLEJyPU1hdGguUEksRnI9QnIvMjtmdW5jdGlvbiBJcih0KXtyZXR1cm4oMS1NYXRoLmNvcyhCcip0KSkvMn1mdW5jdGlvbiBIcih0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIGpyKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBYcj00LzExLEdyPTYvMTEsVnI9OC8xMSwkcj0uNzUsV3I9OS8xMSxacj0xMC8xMSxRcj0uOTM3NSxKcj0yMS8yMixLcj02My82NCx0aT0xL1hyL1hyO2Z1bmN0aW9uIG5pKHQpe3JldHVybih0PSt0KTxYcj90aSp0KnQ6dDxWcj90aSoodC09R3IpKnQrJHI6dDxacj90aSoodC09V3IpKnQrUXI6dGkqKHQtPUpyKSp0K0tyfXZhciBlaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLHJpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksaWk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8MT90KnQqKChuKzEpKnQtbik6KHQtPTIpKnQqKChuKzEpKnQrbikrMikvMn1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLG9pPTIqTWF0aC5QSSxhaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0tdCkqTWF0aC5zaW4oKHItdCkvZSl9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLHVpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtyKS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksZmk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoci10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKHIrdCkvZSkpLzJ9cmV0dXJuIGkuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpvaSl9LGkucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LGl9KDEsLjMpLGNpPXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpVcn07ZnVuY3Rpb24gc2kodCxuKXtmb3IodmFyIGU7IShlPXQuX190cmFuc2l0aW9uKXx8IShlPWVbbl0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gY2kudGltZT1pcigpLGNpO3JldHVybiBlfUx0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe05yKHRoaXMsdCl9KX0sTHQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZTt0IGluc3RhbmNlb2YgUHI/KG49dC5faWQsdD10Ll9uYW1lKToobj1ScigpLChlPWNpKS50aW1lPWlyKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgYSx1PXJbb10sZj11Lmxlbmd0aCxjPTA7YzxmOysrYykoYT11W2NdKSYmd3IoYSx0LG4sYyx1LGV8fHNpKGEsbikpO3JldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsbil9O3ZhciBsaT1bbnVsbF07ZnVuY3Rpb24gaGkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGRpKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9ZnVuY3Rpb24gcGkoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHZpKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9dmFyIGdpPXtuYW1lOiJkcmFnIn0seWk9e25hbWU6InNwYWNlIn0sX2k9e25hbWU6ImhhbmRsZSJ9LGJpPXtuYW1lOiJjZW50ZXIifSxtaT17bmFtZToieCIsaGFuZGxlczpbImUiLCJ3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW3RbMF0sblswXVsxXV0sW3RbMV0sblsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0seGk9e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1tuWzBdWzBdLHRbMF1dLFtuWzFdWzBdLHRbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LHdpPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLm1hcChFaSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LE1pPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxBaT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sVGk9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LE5pPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LFNpPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIEVpKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGtpKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIENpKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFBpKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gemkodCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBSaShuKXt2YXIgZSxyPUNpLGk9a2ksbz1JKHUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxhPTY7ZnVuY3Rpb24gdSh0KXt2YXIgZT10LnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbRWkoIm92ZXJsYXkiKV0pO2UuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSkubWVyZ2UoZSkuZWFjaChmdW5jdGlvbigpe3ZhciB0PVBpKHRoaXMpLmV4dGVudDtEdCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSx0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW0VpKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciByPXQuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YShuLmhhbmRsZXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pO3IuZXhpdCgpLnJlbW92ZSgpLHIuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkuYXR0cigiY3Vyc29yIixmdW5jdGlvbih0KXtyZXR1cm4gTWlbdC50eXBlXX0pLHQuZWFjaChmKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIHRvdWNoc3RhcnQuYnJ1c2giLGwpfWZ1bmN0aW9uIGYoKXt2YXIgdD1EdCh0aGlzKSxuPVBpKHRoaXMpLnNlbGVjdGlvbjtuPyh0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixuWzBdWzBdKS5hdHRyKCJ5IixuWzBdWzFdKS5hdHRyKCJ3aWR0aCIsblsxXVswXS1uWzBdWzBdKS5hdHRyKCJoZWlnaHQiLG5bMV1bMV0tblswXVsxXSksdC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/blsxXVswXS1hLzI6blswXVswXS1hLzJ9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4icyI9PT10LnR5cGVbMF0/blsxXVsxXS1hLzI6blswXVsxXS1hLzJ9KS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK2E6YX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/blsxXVsxXS1uWzBdWzFdK2E6YX0pKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gYyh0LG4pe3JldHVybiB0Ll9fYnJ1c2guZW1pdHRlcnx8bmV3IHModCxuKX1mdW5jdGlvbiBzKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MH1mdW5jdGlvbiBsKCl7aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiB2aSgpfWVsc2UgaWYoZSlyZXR1cm47aWYoaS5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciByLG8sYSx1LHMsbCxoLGQscCx2LGcseSxfLGI9dGhpcyxtPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUseD0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/bT0ib3ZlcmxheSI6bSk/Z2k6dC5ldmVudC5hbHRLZXk/Ymk6X2ksdz1uPT09eGk/bnVsbDpOaVttXSxNPW49PT1taT9udWxsOlNpW21dLEE9UGkoYiksVD1BLmV4dGVudCxOPUEuc2VsZWN0aW9uLFM9VFswXVswXSxFPVRbMF1bMV0saz1UWzFdWzBdLEM9VFsxXVsxXSxQPXcmJk0mJnQuZXZlbnQuc2hpZnRLZXksej1GdChiKSxSPXosTD1jKGIsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PW0/QS5zZWxlY3Rpb249Tj1bW3I9bj09PXhpP1M6elswXSxhPW49PT1taT9FOnpbMV1dLFtzPW49PT14aT9rOnIsaD1uPT09bWk/QzphXV06KHI9TlswXVswXSxhPU5bMF1bMV0scz1OWzFdWzBdLGg9TlsxXVsxXSksbz1yLHU9YSxsPXMsZD1oO3ZhciBEPUR0KGIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLFU9RC5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixNaVttXSk7aWYodC5ldmVudC50b3VjaGVzKUQub24oInRvdWNobW92ZS5icnVzaCIsTywhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixCLCEwKTtlbHNle3ZhciBxPUR0KHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGZ1bmN0aW9uKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpQPXcmJk07YnJlYWs7Y2FzZSAxODp4PT09X2kmJih3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpLFkoKSk7YnJlYWs7Y2FzZSAzMjp4IT09X2kmJnghPT1iaXx8KHc8MD9zPWwtcDp3PjAmJihyPW8tcCksTTwwP2g9ZC12Ok0+MCYmKGE9dS12KSx4PXlpLFUuYXR0cigiY3Vyc29yIixNaS5zZWxlY3Rpb24pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJrZXl1cC5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlAmJih5PV89UD0hMSxZKCkpO2JyZWFrO2Nhc2UgMTg6eD09PWJpJiYodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pLFkoKSk7YnJlYWs7Y2FzZSAzMjp4PT09eWkmJih0LmV2ZW50LmFsdEtleT8odyYmKHM9bC1wKncscj1vK3AqdyksTSYmKGg9ZC12Kk0sYT11K3YqTSkseD1iaSk6KHc8MD9zPWw6dz4wJiYocj1vKSxNPDA/aD1kOk0+MCYmKGE9dSkseD1faSksVS5hdHRyKCJjdXJzb3IiLE1pW21dKSxZKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZpKCl9LCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixPLCEwKS5vbigibW91c2V1cC5icnVzaCIsQiwhMCk7WHQodC5ldmVudC52aWV3KX1waSgpLE5yKGIpLGYuY2FsbChiKSxMLnN0YXJ0KCl9ZnVuY3Rpb24gTygpe3ZhciB0PUZ0KGIpOyFQfHx5fHxffHwoTWF0aC5hYnModFswXS1SWzBdKT5NYXRoLmFicyh0WzFdLVJbMV0pP189ITA6eT0hMCksUj10LGc9ITAsdmkoKSxZKCl9ZnVuY3Rpb24gWSgpe3ZhciB0O3N3aXRjaChwPVJbMF0telswXSx2PVJbMV0telsxXSx4KXtjYXNlIHlpOmNhc2UgZ2k6dyYmKHA9TWF0aC5tYXgoUy1yLE1hdGgubWluKGstcyxwKSksbz1yK3AsbD1zK3ApLE0mJih2PU1hdGgubWF4KEUtYSxNYXRoLm1pbihDLWgsdikpLHU9YSt2LGQ9aCt2KTticmVhaztjYXNlIF9pOnc8MD8ocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1yLHApKSxvPXIrcCxsPXMpOnc+MCYmKHA9TWF0aC5tYXgoUy1zLE1hdGgubWluKGstcyxwKSksbz1yLGw9cytwKSxNPDA/KHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtYSx2KSksdT1hK3YsZD1oKTpNPjAmJih2PU1hdGgubWF4KEUtaCxNYXRoLm1pbihDLWgsdikpLHU9YSxkPWgrdik7YnJlYWs7Y2FzZSBiaTp3JiYobz1NYXRoLm1heChTLE1hdGgubWluKGssci1wKncpKSxsPU1hdGgubWF4KFMsTWF0aC5taW4oayxzK3AqdykpKSxNJiYodT1NYXRoLm1heChFLE1hdGgubWluKEMsYS12Kk0pKSxkPU1hdGgubWF4KEUsTWF0aC5taW4oQyxoK3YqTSkpKX1sPG8mJih3Kj0tMSx0PXIscj1zLHM9dCx0PW8sbz1sLGw9dCxtIGluIEFpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1BaVttXV0pKSxkPHUmJihNKj0tMSx0PWEsYT1oLGg9dCx0PXUsdT1kLGQ9dCxtIGluIFRpJiZVLmF0dHIoImN1cnNvciIsTWlbbT1UaVttXV0pKSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHkmJihvPU5bMF1bMF0sbD1OWzFdWzBdKSxfJiYodT1OWzBdWzFdLGQ9TlsxXVsxXSksTlswXVswXT09PW8mJk5bMF1bMV09PT11JiZOWzFdWzBdPT09bCYmTlsxXVsxXT09PWR8fChBLnNlbGVjdGlvbj1bW28sdV0sW2wsZF1dLGYuY2FsbChiKSxMLmJydXNoKCkpfWZ1bmN0aW9uIEIoKXtpZihwaSgpLHQuZXZlbnQudG91Y2hlcyl7aWYodC5ldmVudC50b3VjaGVzLmxlbmd0aClyZXR1cm47ZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0sNTAwKSxELm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLG51bGwpfWVsc2UgR3QodC5ldmVudC52aWV3LGcpLHEub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO0QuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxVLmF0dHIoImN1cnNvciIsTWkub3ZlcmxheSksQS5zZWxlY3Rpb24mJihOPUEuc2VsZWN0aW9uKSx6aShOKSYmKEEuc2VsZWN0aW9uPW51bGwsZi5jYWxsKGIpKSxMLmVuZCgpfX1mdW5jdGlvbiBoKCl7dmFyIHQ9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiB0LmV4dGVudD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmRpbT1uLHR9cmV0dXJuIHUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2ModGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe3ZhciB0PXRoaXMscj10Ll9fYnJ1c2gsaT1jKHQsYXJndW1lbnRzKSxvPXIuc2VsZWN0aW9uLGE9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHIuZXh0ZW50KSx1PW1lKG8sYSk7ZnVuY3Rpb24gcyhuKXtyLnNlbGVjdGlvbj0xPT09biYmemkoYSk/bnVsbDp1KG4pLGYuY2FsbCh0KSxpLmJydXNoKCl9cmV0dXJuIG8mJmE/czpzKDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dGhpcy5fX2JydXNoLGk9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsdCk6ZSxyLmV4dGVudCksbz1jKHRoaXMsdCkuYmVmb3Jlc3RhcnQoKTtOcih0aGlzKSxyLnNlbGVjdGlvbj1udWxsPT1pfHx6aShpKT9udWxsOmksZi5jYWxsKHRoaXMpLG8uc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LHMucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7Q3QobmV3IGRpKHUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLG8uYXBwbHksbyxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx1LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx1KTpyfSx1LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhpKCEhdCksdSk6aX0sdS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LHUpOmF9LHUub249ZnVuY3Rpb24oKXt2YXIgdD1vLm9uLmFwcGx5KG8sYXJndW1lbnRzKTtyZXR1cm4gdD09PW8/dTp0fSx1fXZhciBMaT1NYXRoLmNvcyxEaT1NYXRoLnNpbixVaT1NYXRoLlBJLHFpPVVpLzIsT2k9MipVaSxZaT1NYXRoLm1heDt2YXIgQmk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEZpKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgSWk9TWF0aC5QSSxIaT0yKklpLGppPUhpLTFlLTY7ZnVuY3Rpb24gWGkoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBHaSgpe3JldHVybiBuZXcgWGl9ZnVuY3Rpb24gVmkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uICRpKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gWmkodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBRaSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1YaS5wcm90b3R5cGU9R2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYaSxtb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rbil9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iUSIrICt0KyIsIisgK24rIiwiKyh0aGlzLl94MT0rZSkrIiwiKyh0aGlzLl95MT0rcil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtuKyIsIisgK2UrIiwiKyArcisiLCIrKHRoaXMuX3gxPStpKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxuLGUscixpKXt0PSt0LG49K24sZT0rZSxyPStyLGk9K2k7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSx1PWUtdCxmPXItbixjPW8tdCxzPWEtbixsPWMqYytzKnM7aWYoaTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2kpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlIGlmKGw+MWUtNilpZihNYXRoLmFicyhzKnUtZipjKT4xZS02JiZpKXt2YXIgaD1lLW8sZD1yLWEscD11KnUrZipmLHY9aCpoK2QqZCxnPU1hdGguc3FydChwKSx5PU1hdGguc3FydChsKSxfPWkqTWF0aC50YW4oKElpLU1hdGguYWNvcygocCtsLXYpLygyKmcqeSkpKS8yKSxiPV8veSxtPV8vZztNYXRoLmFicyhiLTEpPjFlLTYmJih0aGlzLl8rPSJMIisodCtiKmMpKyIsIisobitiKnMpKSx0aGlzLl8rPSJBIitpKyIsIitpKyIsMCwwLCIrICsocypoPmMqZCkrIiwiKyh0aGlzLl94MT10K20qdSkrIiwiKyh0aGlzLl95MT1uK20qZil9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlO30sYXJjOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0PSt0LG49K247dmFyIGE9KGU9K2UpKk1hdGguY29zKHIpLHU9ZSpNYXRoLnNpbihyKSxmPXQrYSxjPW4rdSxzPTFebyxsPW8/ci1pOmktcjtpZihlPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrZSk7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2YrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWYpPjFlLTZ8fE1hdGguYWJzKHRoaXMuX3kxLWMpPjFlLTYpJiYodGhpcy5fKz0iTCIrZisiLCIrYyksZSYmKGw8MCYmKGw9bCVIaStIaSksbD5qaT90aGlzLl8rPSJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHQtYSkrIiwiKyhuLXUpKyJBIitlKyIsIitlKyIsMCwxLCIrcysiLCIrKHRoaXMuX3gxPWYpKyIsIisodGhpcy5feTE9Yyk6bD4xZS02JiYodGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsIisgKyhsPj1JaSkrIiwiK3MrIiwiKyh0aGlzLl94MT10K2UqTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9bitlKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbikrImgiKyArZSsidiIrICtyKyJoIistZSsiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2Z1bmN0aW9uIEppKCl7fWZ1bmN0aW9uIEtpKHQsbil7dmFyIGU9bmV3IEppO2lmKHQgaW5zdGFuY2VvZiBKaSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciBhIGluIHQpZS5zZXQoYSx0W2FdKTtyZXR1cm4gZX1mdW5jdGlvbiB0bygpe3JldHVybnt9fWZ1bmN0aW9uIG5vKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gZW8oKXtyZXR1cm4gS2koKX1mdW5jdGlvbiBybyh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBpbygpe31KaS5wcm90b3R5cGU9S2kucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKaSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbIiQiK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPSIkIit0O3JldHVybiBuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2godGhpc1tuXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgb289S2kucHJvdG90eXBlO2Z1bmN0aW9uIGFvKHQsbil7dmFyIGU9bmV3IGlvO2lmKHQgaW5zdGFuY2VvZiBpbyl0LmVhY2goZnVuY3Rpb24odCl7ZS5hZGQodCl9KTtlbHNlIGlmKHQpe3ZhciByPS0xLGk9dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysrcjxpOyllLmFkZCh0W3JdKTtlbHNlIGZvcig7KytyPGk7KWUuYWRkKG4odFtyXSxyLHQpKX1yZXR1cm4gZX1pby5wcm90b3R5cGU9YW8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppbyxoYXM6b28uaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6b28ucmVtb3ZlLGNsZWFyOm9vLmNsZWFyLHZhbHVlczpvby5rZXlzLHNpemU6b28uc2l6ZSxlbXB0eTpvby5lbXB0eSxlYWNoOm9vLmVhY2h9O3ZhciB1bz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gZm8odCxuKXtyZXR1cm4gdC1ufWZ1bmN0aW9uIGNvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBzbyh0LG4pe2Zvcih2YXIgZSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWlmKGU9bG8odCxuW3JdKSlyZXR1cm4gZTtyZXR1cm4gMH1mdW5jdGlvbiBsbyh0LG4pe2Zvcih2YXIgZT1uWzBdLHI9blsxXSxpPS0xLG89MCxhPXQubGVuZ3RoLHU9YS0xO288YTt1PW8rKyl7dmFyIGY9dFtvXSxjPWZbMF0scz1mWzFdLGw9dFt1XSxoPWxbMF0sZD1sWzFdO2lmKGhvKGYsbCxuKSlyZXR1cm4gMDtzPnIhPWQ+ciYmZTwoaC1jKSooci1zKS8oZC1zKStjJiYoaT0taSl9cmV0dXJuIGl9ZnVuY3Rpb24gaG8odCxuLGUpe3ZhciByLGksbyxhO3JldHVybiBmdW5jdGlvbih0LG4sZSl7cmV0dXJuKG5bMF0tdFswXSkqKGVbMV0tdFsxXSk9PShlWzBdLXRbMF0pKihuWzFdLXRbMV0pfSh0LG4sZSkmJihpPXRbcj0rKHRbMF09PT1uWzBdKV0sbz1lW3JdLGE9bltyXSxpPD1vJiZvPD1hfHxhPD1vJiZvPD1pKX1mdW5jdGlvbiBwbygpe312YXIgdm89W1tdLFtbWzEsMS41XSxbLjUsMV1dXSxbW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbLjUsMV1dXSxbW1sxLC41XSxbMS41LDFdXV0sW1tbMSwxLjVdLFsuNSwxXV0sW1sxLC41XSxbMS41LDFdXV0sW1tbMSwuNV0sWzEsMS41XV1dLFtbWzEsLjVdLFsuNSwxXV1dLFtbWy41LDFdLFsxLC41XV1dLFtbWzEsMS41XSxbMSwuNV1dXSxbW1suNSwxXSxbMSwuNV1dLFtbMS41LDFdLFsxLDEuNV1dXSxbW1sxLjUsMV0sWzEsLjVdXV0sW1tbLjUsMV0sWzEuNSwxXV1dLFtbWzEsMS41XSxbMS41LDFdXV0sW1tbLjUsMV0sWzEsMS41XV1dLFtdXTtmdW5jdGlvbiBnbygpe3ZhciB0PTEsbj0xLGU9TSxyPXU7ZnVuY3Rpb24gaSh0KXt2YXIgbj1lKHQpO2lmKEFycmF5LmlzQXJyYXkobikpbj1uLnNsaWNlKCkuc29ydChmbyk7ZWxzZXt2YXIgcj1zKHQpLGk9clswXSxhPXJbMV07bj13KGksYSxuKSxuPWcoTWF0aC5mbG9vcihpL24pKm4sTWF0aC5mbG9vcihhL24pKm4sbil9cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHQsbil9KX1mdW5jdGlvbiBvKGUsaSl7dmFyIG89W10sdT1bXTtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe3ZhciBvLHUsZixjLHMsbCxoPW5ldyBBcnJheSxkPW5ldyBBcnJheTtvPXU9LTEsYz1lWzBdPj1yLHZvW2M8PDFdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylmPWMsYz1lW28rMV0+PXIsdm9bZnxjPDwxXS5mb3JFYWNoKHApO3ZvW2M8PDBdLmZvckVhY2gocCk7Zm9yKDsrK3U8bi0xOyl7Zm9yKG89LTEsYz1lW3UqdCt0XT49cixzPWVbdSp0XT49cix2b1tjPDwxfHM8PDJdLmZvckVhY2gocCk7KytvPHQtMTspZj1jLGM9ZVt1KnQrdCtvKzFdPj1yLGw9cyxzPWVbdSp0K28rMV0+PXIsdm9bZnxjPDwxfHM8PDJ8bDw8M10uZm9yRWFjaChwKTt2b1tjfHM8PDNdLmZvckVhY2gocCl9bz0tMSxzPWVbdSp0XT49cix2b1tzPDwyXS5mb3JFYWNoKHApO2Zvcig7KytvPHQtMTspbD1zLHM9ZVt1KnQrbysxXT49cix2b1tzPDwyfGw8PDNdLmZvckVhY2gocCk7ZnVuY3Rpb24gcCh0KXt2YXIgbixlLHI9W3RbMF1bMF0rbyx0WzBdWzFdK3VdLGY9W3RbMV1bMF0rbyx0WzFdWzFdK3VdLGM9YShyKSxzPWEoZik7KG49ZFtjXSk/KGU9aFtzXSk/KGRlbGV0ZSBkW24uZW5kXSxkZWxldGUgaFtlLnN0YXJ0XSxuPT09ZT8obi5yaW5nLnB1c2goZiksaShuLnJpbmcpKTpoW24uc3RhcnRdPWRbZS5lbmRdPXtzdGFydDpuLnN0YXJ0LGVuZDplLmVuZCxyaW5nOm4ucmluZy5jb25jYXQoZS5yaW5nKX0pOihkZWxldGUgZFtuLmVuZF0sbi5yaW5nLnB1c2goZiksZFtuLmVuZD1zXT1uKToobj1oW3NdKT8oZT1kW2NdKT8oZGVsZXRlIGhbbi5zdGFydF0sZGVsZXRlIGRbZS5lbmRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbZS5zdGFydF09ZFtuLmVuZF09e3N0YXJ0OmUuc3RhcnQsZW5kOm4uZW5kLHJpbmc6ZS5yaW5nLmNvbmNhdChuLnJpbmcpfSk6KGRlbGV0ZSBoW24uc3RhcnRdLG4ucmluZy51bnNoaWZ0KHIpLGhbbi5zdGFydD1jXT1uKTpoW2NdPWRbc109e3N0YXJ0OmMsZW5kOnMscmluZzpbcixmXX19dm9bczw8M10uZm9yRWFjaChwKX0oZSxpLGZ1bmN0aW9uKHQpe3IodCxlLGkpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGgscj10W2UtMV1bMV0qdFswXVswXS10W2UtMV1bMF0qdFswXVsxXTsrK248ZTspcis9dFtuLTFdWzFdKnRbbl1bMF0tdFtuLTFdWzBdKnRbbl1bMV07cmV0dXJuIHJ9KHQpPjA/by5wdXNoKFt0XSk6dS5wdXNoKHQpfSksdS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj1vLmxlbmd0aDtlPHI7KytlKWlmKC0xIT09c28oKG49b1tlXSlbMF0sdCkpcmV0dXJuIHZvaWQgbi5wdXNoKHQpfSkse3R5cGU6Ik11bHRpUG9seWdvbiIsdmFsdWU6aSxjb29yZGluYXRlczpvfX1mdW5jdGlvbiBhKG4pe3JldHVybiAyKm5bMF0rblsxXSoodCsxKSo0fWZ1bmN0aW9uIHUoZSxyLGkpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbyxhPWVbMF0sdT1lWzFdLGY9MHxhLGM9MHx1LHM9cltjKnQrZl07YT4wJiZhPHQmJmY9PT1hJiYobz1yW2MqdCtmLTFdLGVbMF09YSsoaS1vKS8ocy1vKS0uNSksdT4wJiZ1PG4mJmM9PT11JiYobz1yWyhjLTEpKnQrZl0sZVsxXT11KyhpLW8pLyhzLW8pLS41KX0pfXJldHVybiBpLmNvbnRvdXI9byxpLnNpemU9ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3Qsbl07dmFyIHI9TWF0aC5jZWlsKGVbMF0pLG89TWF0aC5jZWlsKGVbMV0pO2lmKCEocj4wJiZvPjApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9cixuPW8saX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9jbyh1by5jYWxsKHQpKTpjbyh0KSxpKTplfSxpLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10P3U6cG8saSk6cj09PXV9LGl9ZnVuY3Rpb24geW8odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxpOysrYSlmb3IodmFyIHU9MCxmPTA7dTxyK2U7Kyt1KXU8ciYmKGYrPXQuZGF0YVt1K2Eqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW3UtbythKnJdKSxuLmRhdGFbdS1lK2Eqcl09Zi9NYXRoLm1pbih1KzEsci0xK28tdSxvKSl9ZnVuY3Rpb24gX28odCxuLGUpe2Zvcih2YXIgcj10LndpZHRoLGk9dC5oZWlnaHQsbz0xKyhlPDwxKSxhPTA7YTxyOysrYSlmb3IodmFyIHU9MCxmPTA7dTxpK2U7Kyt1KXU8aSYmKGYrPXQuZGF0YVthK3Uqcl0pLHU+PWUmJih1Pj1vJiYoZi09dC5kYXRhW2ErKHUtbykqcl0pLG4uZGF0YVthKyh1LWUpKnJdPWYvTWF0aC5taW4odSsxLGktMStvLXUsbykpfWZ1bmN0aW9uIGJvKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHhvKCl7cmV0dXJuIDF9dmFyIHdvPXt9LE1vPXt9LEFvPTM0LFRvPTEwLE5vPTEzO2Z1bmN0aW9uIFNvKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxuKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK24rIl0ifSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gRW8odCl7dmFyIG49bmV3IFJlZ0V4cCgnWyInK3QrIlxuXHJdIiksZT10LmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gcih0LG4pe3ZhciByLGk9W10sbz10Lmxlbmd0aCxhPTAsdT0wLGY9bzw9MCxjPSExO2Z1bmN0aW9uIHMoKXtpZihmKXJldHVybiBNbztpZihjKXJldHVybiBjPSExLHdvO3ZhciBuLHIsaT1hO2lmKHQuY2hhckNvZGVBdChpKT09PUFvKXtmb3IoO2ErKzxvJiZ0LmNoYXJDb2RlQXQoYSkhPT1Bb3x8dC5jaGFyQ29kZUF0KCsrYSk9PT1BbzspO3JldHVybihuPWEpPj1vP2Y9ITA6KHI9dC5jaGFyQ29kZUF0KGErKykpPT09VG8/Yz0hMDpyPT09Tm8mJihjPSEwLHQuY2hhckNvZGVBdChhKT09PVRvJiYrK2EpLHQuc2xpY2UoaSsxLG4tMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTxvOyl7aWYoKHI9dC5jaGFyQ29kZUF0KG49YSsrKSk9PT1UbyljPSEwO2Vsc2UgaWYocj09PU5vKWM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYTtlbHNlIGlmKHIhPT1lKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKGksbil9cmV0dXJuIGY9ITAsdC5zbGljZShpLG8pfWZvcih0LmNoYXJDb2RlQXQoby0xKT09PVRvJiYtLW8sdC5jaGFyQ29kZUF0KG8tMSk9PT1ObyYmLS1vOyhyPXMoKSkhPT1Nbzspe2Zvcih2YXIgbD1bXTtyIT09d28mJnIhPT1NbzspbC5wdXNoKHIpLHI9cygpO24mJm51bGw9PShsPW4obCx1KyspKXx8aS5wdXNoKGwpfXJldHVybiBpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG4ubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbD09dD8iIjpuLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxuKXt2YXIgZSxpLG89cih0LGZ1bmN0aW9uKHQscil7aWYoZSlyZXR1cm4gZSh0LHItMSk7aT10LGU9bj9mdW5jdGlvbih0LG4pe3ZhciBlPVNvKHQpO3JldHVybiBmdW5jdGlvbihyLGkpe3JldHVybiBuKGUociksaSx0KX19KHQsbik6U28odCl9KTtyZXR1cm4gby5jb2x1bW5zPWl8fFtdLG99LHBhcnNlUm93czpyLGZvcm1hdDpmdW5jdGlvbihuLGUpe3JldHVybiBudWxsPT1lJiYoZT1mdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLGU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIHIgaW4gdClyIGluIG58fGUucHVzaChuW3JdPXIpfSksZX0obikpLFtlLm1hcChvKS5qb2luKHQpXS5jb25jYXQobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBvKG5bdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfSxmb3JtYXRSb3dzOmZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChpKS5qb2luKCJcbiIpfX19dmFyIGtvPUVvKCIsIiksQ289a28ucGFyc2UsUG89a28ucGFyc2VSb3dzLHpvPWtvLmZvcm1hdCxSbz1rby5mb3JtYXRSb3dzLExvPUVvKCJcdCIpLERvPUxvLnBhcnNlLFVvPUxvLnBhcnNlUm93cyxxbz1Mby5mb3JtYXQsT289TG8uZm9ybWF0Um93cztmdW5jdGlvbiBZbyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQuYmxvYigpfWZ1bmN0aW9uIEJvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpfWZ1bmN0aW9uIEZvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC50ZXh0KCl9ZnVuY3Rpb24gSW8odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEZvKX1mdW5jdGlvbiBIbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApLElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gdChuLHIpfSl9fXZhciBqbz1IbyhDbyksWG89SG8oRG8pO2Z1bmN0aW9uIEdvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5qc29uKCl9ZnVuY3Rpb24gVm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIElvKG4sZSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKG4sdCl9KX19dmFyICRvPVZvKCJhcHBsaWNhdGlvbi94bWwiKSxXbz1WbygidGV4dC9odG1sIiksWm89Vm8oImltYWdlL3N2Zyt4bWwiKTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gSm8oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24gS28odCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSx2PXQuX3gwLGc9dC5feTAseT10Ll94MSxfPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoYz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywocz1lPj0oYT0oZytfKS8yKSk/Zz1hOl89YSxpPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gaVtsXT1wLHQ7aWYodT0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSxmPSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLG49PT11JiZlPT09ZilyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hfXdoaWxlKChsPXM8PDF8Yyk9PShoPShmPj1hKTw8MXx1Pj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH1mdW5jdGlvbiB0YSh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiBuYSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBlYSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiByYSh0LG4sZSl7dmFyIHI9bmV3IGlhKG51bGw9PW4/bmE6bixudWxsPT1lP2VhOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIGlhKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gb2EodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufXZhciBhYT1yYS5wcm90b3R5cGU9aWEucHJvdG90eXBlO2Z1bmN0aW9uIHVhKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBmYSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gY2EodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gc2EodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gbGEodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBoYSh0KXtyZXR1cm4gdC55fWFhLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IGlhKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1vYShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPW9hKG4pKTtyZXR1cm4gZX0sYWEuYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gS28odGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sYWEuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0xLzAsYz0xLzAscz0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KGFbZV09cix1W2VdPWkscjxmJiYoZj1yKSxyPnMmJihzPXIpLGk8YyYmKGM9aSksaT5sJiYobD1pKSk7Zm9yKHM8ZiYmKGY9dGhpcy5feDAscz10aGlzLl94MSksbDxjJiYoYz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGYsYykuY292ZXIocyxsKSxlPTA7ZTxvOysrZSlLbyh0aGlzLGFbZV0sdVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sYWEuY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgYSx1LGY9aS1lLGM9dGhpcy5fcm9vdDtzd2l0Y2godT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksdD4oaT1lK2YpfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKG89cisoZio9MiksKGU9aS1mKT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksdD4oaT1lK2YpfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3soYT1uZXcgQXJyYXkoNCkpW3VdPWMsYz1hfXdoaWxlKHI9by0oZio9MiksKGU9aS1mKT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxhYS5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sYWEuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGEsdSxmLGMscz10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEsZD10aGlzLl95MSxwPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmcC5wdXNoKG5ldyB0YSh2LHMsbCxoLGQpKSxudWxsPT1lP2U9MS8wOihzPXQtZSxsPW4tZSxoPXQrZSxkPW4rZSxlKj1lKTtmPXAucG9wKCk7KWlmKCEoISh2PWYubm9kZSl8fChpPWYueDApPmh8fChvPWYueTApPmR8fChhPWYueDEpPHN8fCh1PWYueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgZz0oaSthKS8yLHk9KG8rdSkvMjtwLnB1c2gobmV3IHRhKHZbM10sZyx5LGEsdSksbmV3IHRhKHZbMl0saSx5LGcsdSksbmV3IHRhKHZbMV0sZyxvLGEseSksbmV3IHRhKHZbMF0saSxvLGcseSkpLChjPShuPj15KTw8MXx0Pj1nKSYmKGY9cFtwLmxlbmd0aC0xXSxwW3AubGVuZ3RoLTFdPXBbcC5sZW5ndGgtMS1jXSxwW3AubGVuZ3RoLTEtY109Zil9ZWxzZXt2YXIgXz10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLGI9bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSxtPV8qXytiKmI7aWYobTxlKXt2YXIgeD1NYXRoLnNxcnQoZT1tKTtzPXQteCxsPW4teCxoPXQreCxkPW4reCxyPXYuZGF0YX19cmV0dXJuIHJ9LGFhLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsLGgsZD10aGlzLl9yb290LHA9dGhpcy5feDAsdj10aGlzLl95MCxnPXRoaXMuX3gxLHk9dGhpcy5feTE7aWYoIWQpcmV0dXJuIHRoaXM7aWYoZC5sZW5ndGgpZm9yKDs7KXtpZigoYz1vPj0odT0ocCtnKS8yKSk/cD11Omc9dSwocz1hPj0oZj0odit5KS8yKSk/dj1mOnk9ZixuPWQsIShkPWRbbD1zPDwxfGNdKSlyZXR1cm4gdGhpcztpZighZC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtkLmRhdGEhPT10OylpZihyPWQsIShkPWQubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9ZC5uZXh0KSYmZGVsZXRlIGQubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKGQ9blswXXx8blsxXXx8blsyXXx8blszXSkmJmQ9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFkLmxlbmd0aCYmKGU/ZVtoXT1kOnRoaXMuX3Jvb3Q9ZCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sYWEucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sYWEucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxhYS5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LGFhLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYSx1PVtdLGY9dGhpcy5fcm9vdDtmb3IoZiYmdS5wdXNoKG5ldyB0YShmLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj11LnBvcCgpOylpZighdChmPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSxhPW4ueTEpJiZmLmxlbmd0aCl7dmFyIGM9KHIrbykvMixzPShpK2EpLzI7KGU9ZlszXSkmJnUucHVzaChuZXcgdGEoZSxjLHMsbyxhKSksKGU9ZlsyXSkmJnUucHVzaChuZXcgdGEoZSxyLHMsYyxhKSksKGU9ZlsxXSkmJnUucHVzaChuZXcgdGEoZSxjLGksbyxzKSksKGU9ZlswXSkmJnUucHVzaChuZXcgdGEoZSxyLGksYyxzKSl9cmV0dXJuIHRoaXN9LGFhLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IHRhKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLGE9bi54MCx1PW4ueTAsZj1uLngxLGM9bi55MSxzPShhK2YpLzIsbD0odStjKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IHRhKG8sYSx1LHMsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IHRhKG8scyx1LGYsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IHRhKG8sYSxsLHMsYykpLChvPWlbM10pJiZlLnB1c2gobmV3IHRhKG8scyxsLGYsYykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGFhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxhYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIGRhPTEwLHBhPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiB2YSh0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX1mdW5jdGlvbiBnYSh0KXtyZXR1cm4odD12YShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciB5YSxfYT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBiYSh0KXtyZXR1cm4gbmV3IG1hKHQpfWZ1bmN0aW9uIG1hKHQpe2lmKCEobj1fYS5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBuO3RoaXMuZmlsbD1uWzFdfHwiICIsdGhpcy5hbGlnbj1uWzJdfHwiPiIsdGhpcy5zaWduPW5bM118fCItIix0aGlzLnN5bWJvbD1uWzRdfHwiIix0aGlzLnplcm89ISFuWzVdLHRoaXMud2lkdGg9bls2XSYmK25bNl0sdGhpcy5jb21tYT0hIW5bN10sdGhpcy5wcmVjaXNpb249bls4XSYmK25bOF0uc2xpY2UoMSksdGhpcy50cmltPSEhbls5XSx0aGlzLnR5cGU9blsxMF18fCIifWZ1bmN0aW9uIHhhKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrcjpyLmxlbmd0aD5pKzE/ci5zbGljZSgwLGkrMSkrIi4iK3Iuc2xpY2UoaSsxKTpyK25ldyBBcnJheShpLXIubGVuZ3RoKzIpLmpvaW4oIjAiKX1iYS5wcm90b3R5cGU9bWEucHJvdG90eXBlLG1hLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciB3YT17IiUiOmZ1bmN0aW9uKHQsbil7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKG4pfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRXhwb25lbnRpYWwobil9LGY6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b0ZpeGVkKG4pfSxnOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9QcmVjaXNpb24obil9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxuKXtyZXR1cm4geGEoMTAwKnQsbil9LHI6eGEsczpmdW5jdGlvbih0LG4pe3ZhciBlPXZhKHQsbik7aWYoIWUpcmV0dXJuIHQrIiI7dmFyIHI9ZVswXSxpPWVbMV0sbz1pLSh5YT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkpKzEsYT1yLmxlbmd0aDtyZXR1cm4gbz09PWE/cjpvPmE/cituZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/ci5zbGljZSgwLG8pKyIuIityLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK3ZhKHQsTWF0aC5tYXgoMCxuK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIE1hKHQpe3JldHVybiB0fXZhciBBYSxUYT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gTmEodCl7dmFyIG4sZSxyPXQuZ3JvdXBpbmcmJnQudGhvdXNhbmRzPyhuPXQuZ3JvdXBpbmcsZT10LnRob3VzYW5kcyxmdW5jdGlvbih0LHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPVtdLGE9MCx1PW5bMF0sZj0wO2k+MCYmdT4wJiYoZit1KzE+ciYmKHU9TWF0aC5tYXgoMSxyLWYpKSxvLnB1c2godC5zdWJzdHJpbmcoaS09dSxpK3UpKSwhKChmKz11KzEpPnIpKTspdT1uW2E9KGErMSklbi5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfSk6TWEsaT10LmN1cnJlbmN5LG89dC5kZWNpbWFsLGE9dC5udW1lcmFscz9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19KHQubnVtZXJhbHMpOk1hLHU9dC5wZXJjZW50fHwiJSI7ZnVuY3Rpb24gZih0KXt2YXIgbj0odD1iYSh0KSkuZmlsbCxlPXQuYWxpZ24sZj10LnNpZ24sYz10LnN5bWJvbCxzPXQuemVybyxsPXQud2lkdGgsaD10LmNvbW1hLGQ9dC5wcmVjaXNpb24scD10LnRyaW0sdj10LnR5cGU7Im4iPT09dj8oaD0hMCx2PSJnIik6d2Fbdl18fChudWxsPT1kJiYoZD0xMikscD0hMCx2PSJnIiksKHN8fCIwIj09PW4mJiI9Ij09PWUpJiYocz0hMCxuPSIwIixlPSI9Iik7dmFyIGc9IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3Qodik/IjAiK3YudG9Mb3dlckNhc2UoKToiIix5PSIkIj09PWM/aVsxXTovWyVwXS8udGVzdCh2KT91OiIiLF89d2Fbdl0sYj0vW2RlZmdwcnMlXS8udGVzdCh2KTtmdW5jdGlvbiBtKHQpe3ZhciBpLHUsYyxtPWcseD15O2lmKCJjIj09PXYpeD1fKHQpK3gsdD0iIjtlbHNle3ZhciB3PSh0PSt0KTwwO2lmKHQ9XyhNYXRoLmFicyh0KSxkKSxwJiYodD1mdW5jdGlvbih0KXt0OmZvcih2YXIgbixlPXQubGVuZ3RoLHI9MSxpPS0xO3I8ZTsrK3Ipc3dpdGNoKHRbcl0pe2Nhc2UiLiI6aT1uPXI7YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9ciksbj1yO2JyZWFrO2RlZmF1bHQ6aWYoaT4wKXtpZighK3Rbcl0pYnJlYWsgdDtpPTB9fXJldHVybiBpPjA/dC5zbGljZSgwLGkpK3Quc2xpY2UobisxKTp0fSh0KSksdyYmMD09K3QmJih3PSExKSxtPSh3PyIoIj09PWY/ZjoiLSI6Ii0iPT09Znx8IigiPT09Zj8iIjpmKSttLHg9KCJzIj09PXY/VGFbOCt5YS8zXToiIikreCsodyYmIigiPT09Zj8iKSI6IiIpLGIpZm9yKGk9LTEsdT10Lmxlbmd0aDsrK2k8dTspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7eD0oNDY9PT1jP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK3gsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWgmJiFzJiYodD1yKHQsMS8wKSk7dmFyIE09bS5sZW5ndGgrdC5sZW5ndGgreC5sZW5ndGgsQT1NPGw/bmV3IEFycmF5KGwtTSsxKS5qb2luKG4pOiIiO3N3aXRjaChoJiZzJiYodD1yKEErdCxBLmxlbmd0aD9sLXgubGVuZ3RoOjEvMCksQT0iIiksZSl7Y2FzZSI8Ijp0PW0rdCt4K0E7YnJlYWs7Y2FzZSI9Ijp0PW0rQSt0K3g7YnJlYWs7Y2FzZSJeIjp0PUEuc2xpY2UoMCxNPUEubGVuZ3RoPj4xKSttK3QreCtBLnNsaWNlKE0pO2JyZWFrO2RlZmF1bHQ6dD1BK20rdCt4fXJldHVybiBhKHQpfXJldHVybiBkPW51bGw9PWQ/NjovW2dwcnNdLy50ZXN0KHYpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZCkpLG0udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbX1yZXR1cm57Zm9ybWF0OmYsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsbil7dmFyIGU9ZigoKHQ9YmEodCkpLnR5cGU9ImYiLHQpKSxyPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSksaT1NYXRoLnBvdygxMCwtciksbz1UYVs4K3IvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKGkqdCkrb319fX1mdW5jdGlvbiBTYShuKXtyZXR1cm4gQWE9TmEobiksdC5mb3JtYXQ9QWEuZm9ybWF0LHQuZm9ybWF0UHJlZml4PUFhLmZvcm1hdFByZWZpeCxBYX1mdW5jdGlvbiBFYSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBrYSh0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGdhKG4pLzMpKSktZ2EoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBDYSh0LG4pe3JldHVybiB0PU1hdGguYWJzKHQpLG49TWF0aC5hYnMobiktdCxNYXRoLm1heCgwLGdhKG4pLWdhKHQpKSsxfWZ1bmN0aW9uIFBhKCl7cmV0dXJuIG5ldyB6YX1mdW5jdGlvbiB6YSgpe3RoaXMucmVzZXQoKX1TYSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KSx6YS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnphLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7TGEoUmEsdCx0aGlzLnQpLExhKHRoaXMsUmEucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPVJhLnQ6dGhpcy5zPVJhLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIFJhPW5ldyB6YTtmdW5jdGlvbiBMYSh0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfXZhciBEYT0xZS02LFVhPTFlLTEyLHFhPU1hdGguUEksT2E9cWEvMixZYT1xYS80LEJhPTIqcWEsRmE9MTgwL3FhLElhPXFhLzE4MCxIYT1NYXRoLmFicyxqYT1NYXRoLmF0YW4sWGE9TWF0aC5hdGFuMixHYT1NYXRoLmNvcyxWYT1NYXRoLmNlaWwsJGE9TWF0aC5leHAsV2E9TWF0aC5sb2csWmE9TWF0aC5wb3csUWE9TWF0aC5zaW4sSmE9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LEthPU1hdGguc3FydCx0dT1NYXRoLnRhbjtmdW5jdGlvbiBudSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9xYTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gZXUodCl7cmV0dXJuIHQ+MT9PYTp0PC0xPy1PYTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcnUodCl7cmV0dXJuKHQ9UWEodC8yKSkqdH1mdW5jdGlvbiBpdSgpe31mdW5jdGlvbiBvdSh0LG4pe3QmJnV1Lmhhc093blByb3BlcnR5KHQudHlwZSkmJnV1W3QudHlwZV0odCxuKX12YXIgYXU9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtvdSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXS5nZW9tZXRyeSxuKX19LHV1PXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7ZnUodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWZ1KGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe2N1KHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspY3UoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KW91KGVbcl0sbil9fTtmdW5jdGlvbiBmdSh0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBjdSh0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KWZ1KHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBzdSh0LG4pe3QmJmF1Lmhhc093blByb3BlcnR5KHQudHlwZSk/YXVbdC50eXBlXSh0LG4pOm91KHQsbil9dmFyIGx1LGh1LGR1LHB1LHZ1LGd1PVBhKCkseXU9UGEoKSxfdT17cG9pbnQ6aXUsbGluZVN0YXJ0Oml1LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Z3UucmVzZXQoKSxfdS5saW5lU3RhcnQ9YnUsX3UubGluZUVuZD1tdX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStndTt5dS5hZGQodDwwP0JhK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9aXV9LHNwaGVyZTpmdW5jdGlvbigpe3l1LmFkZChCYSl9fTtmdW5jdGlvbiBidSgpe191LnBvaW50PXh1fWZ1bmN0aW9uIG11KCl7d3UobHUsaHUpfWZ1bmN0aW9uIHh1KHQsbil7X3UucG9pbnQ9d3UsbHU9dCxodT1uLGR1PXQqPUlhLHB1PUdhKG49KG4qPUlhKS8yK1lhKSx2dT1RYShuKX1mdW5jdGlvbiB3dSh0LG4pe3ZhciBlPSh0Kj1JYSktZHUscj1lPj0wPzE6LTEsaT1yKmUsbz1HYShuPShuKj1JYSkvMitZYSksYT1RYShuKSx1PXZ1KmEsZj1wdSpvK3UqR2EoaSksYz11KnIqUWEoaSk7Z3UuYWRkKFhhKGMsZikpLGR1PXQscHU9byx2dT1hfWZ1bmN0aW9uIE11KHQpe3JldHVybltYYSh0WzFdLHRbMF0pLGV1KHRbMl0pXX1mdW5jdGlvbiBBdSh0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUdhKGUpO3JldHVybltyKkdhKG4pLHIqUWEobiksUWEoZSldfWZ1bmN0aW9uIFR1KHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIE51KHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBTdSh0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIEV1KHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBrdSh0KXt2YXIgbj1LYSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59dmFyIEN1LFB1LHp1LFJ1LEx1LER1LFV1LHF1LE91LFl1LEJ1LEZ1LEl1LEh1LGp1LFh1LEd1LFZ1LCR1LFd1LFp1LFF1LEp1LEt1LHRmLG5mLGVmPVBhKCkscmY9e3BvaW50Om9mLGxpbmVTdGFydDp1ZixsaW5lRW5kOmZmLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3JmLnBvaW50PWNmLHJmLmxpbmVTdGFydD1zZixyZi5saW5lRW5kPWxmLGVmLnJlc2V0KCksX3UucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtfdS5wb2x5Z29uRW5kKCkscmYucG9pbnQ9b2YscmYubGluZVN0YXJ0PXVmLHJmLmxpbmVFbmQ9ZmYsZ3U8MD8oQ3U9LSh6dT0xODApLFB1PS0oUnU9OTApKTplZj5EYT9SdT05MDplZjwtRGEmJihQdT0tOTApLFl1WzBdPUN1LFl1WzFdPXp1fX07ZnVuY3Rpb24gb2YodCxuKXtPdS5wdXNoKFl1PVtDdT10LHp1PXRdKSxuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pfWZ1bmN0aW9uIGFmKHQsbil7dmFyIGU9QXUoW3QqSWEsbipJYV0pO2lmKHF1KXt2YXIgcj1OdShxdSxlKSxpPU51KFtyWzFdLC1yWzBdLDBdLHIpO2t1KGkpLGk9TXUoaSk7dmFyIG8sYT10LUx1LHU9YT4wPzE6LTEsZj1pWzBdKkZhKnUsYz1IYShhKT4xODA7Y14odSpMdTxmJiZmPHUqdCk/KG89aVsxXSpGYSk+UnUmJihSdT1vKTpjXih1Kkx1PChmPShmKzM2MCklMzYwLTE4MCkmJmY8dSp0KT8obz0taVsxXSpGYSk8UHUmJihQdT1vKToobjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSksYz90PEx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpOnp1Pj1DdT8odDxDdSYmKEN1PXQpLHQ+enUmJih6dT10KSk6dD5MdT9oZihDdSx0KT5oZihDdSx6dSkmJih6dT10KTpoZih0LHp1KT5oZihDdSx6dSkmJihDdT10KX1lbHNlIE91LnB1c2goWXU9W0N1PXQsenU9dF0pO248UHUmJihQdT1uKSxuPlJ1JiYoUnU9bikscXU9ZSxMdT10fWZ1bmN0aW9uIHVmKCl7cmYucG9pbnQ9YWZ9ZnVuY3Rpb24gZmYoKXtZdVswXT1DdSxZdVsxXT16dSxyZi5wb2ludD1vZixxdT1udWxsfWZ1bmN0aW9uIGNmKHQsbil7aWYocXUpe3ZhciBlPXQtTHU7ZWYuYWRkKEhhKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgRHU9dCxVdT1uO191LnBvaW50KHQsbiksYWYodCxuKX1mdW5jdGlvbiBzZigpe191LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGxmKCl7Y2YoRHUsVXUpLF91LmxpbmVFbmQoKSxIYShlZik+RGEmJihDdT0tKHp1PTE4MCkpLFl1WzBdPUN1LFl1WzFdPXp1LHF1PW51bGx9ZnVuY3Rpb24gaGYodCxuKXtyZXR1cm4obi09dCk8MD9uKzM2MDpufWZ1bmN0aW9uIGRmKHQsbil7cmV0dXJuIHRbMF0tblswXX1mdW5jdGlvbiBwZih0LG4pe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59dmFyIHZmPXtzcGhlcmU6aXUscG9pbnQ6Z2YsbGluZVN0YXJ0Ol9mLGxpbmVFbmQ6eGYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dmYubGluZVN0YXJ0PXdmLHZmLmxpbmVFbmQ9TWZ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9X2YsdmYubGluZUVuZD14Zn19O2Z1bmN0aW9uIGdmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO3lmKGUqR2EodCksZSpRYSh0KSxRYShuKSl9ZnVuY3Rpb24geWYodCxuLGUpe0l1Kz0odC1JdSkvKytCdSxIdSs9KG4tSHUpL0J1LGp1Kz0oZS1qdSkvQnV9ZnVuY3Rpb24gX2YoKXt2Zi5wb2ludD1iZn1mdW5jdGlvbiBiZih0LG4pe3QqPUlhO3ZhciBlPUdhKG4qPUlhKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobiksdmYucG9pbnQ9bWYseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIG1mKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPVhhKEthKChhPXRmKm8tbmYqaSkqYSsoYT1uZipyLUt1Km8pKmErKGE9S3UqaS10ZipyKSphKSxLdSpyK3RmKmkrbmYqbyk7RnUrPWEsWHUrPWEqKEt1KyhLdT1yKSksR3UrPWEqKHRmKyh0Zj1pKSksVnUrPWEqKG5mKyhuZj1vKSkseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIHhmKCl7dmYucG9pbnQ9Z2Z9ZnVuY3Rpb24gd2YoKXt2Zi5wb2ludD1BZn1mdW5jdGlvbiBNZigpe1RmKFF1LEp1KSx2Zi5wb2ludD1nZn1mdW5jdGlvbiBBZih0LG4pe1F1PXQsSnU9bix0Kj1JYSxuKj1JYSx2Zi5wb2ludD1UZjt2YXIgZT1HYShuKTtLdT1lKkdhKHQpLHRmPWUqUWEodCksbmY9UWEobikseWYoS3UsdGYsbmYpfWZ1bmN0aW9uIFRmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpLHI9ZSpHYSh0KSxpPWUqUWEodCksbz1RYShuKSxhPXRmKm8tbmYqaSx1PW5mKnItS3UqbyxmPUt1KmktdGYqcixjPUthKGEqYSt1KnUrZipmKSxzPWV1KGMpLGw9YyYmLXMvYzskdSs9bCphLFd1Kz1sKnUsWnUrPWwqZixGdSs9cyxYdSs9cyooS3UrKEt1PXIpKSxHdSs9cyoodGYrKHRmPWkpKSxWdSs9cyoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gTmYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFNmKHQsbil7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPXQoZSxyKSxuKGVbMF0sZVsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZuLmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuKGU9bi5pbnZlcnQoZSxyKSkmJnQuaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIEVmKHQsbil7cmV0dXJuW3Q+cWE/dC1CYTp0PC1xYT90K0JhOnQsbl19ZnVuY3Rpb24ga2YodCxuLGUpe3JldHVybih0JT1CYSk/bnx8ZT9TZihQZih0KSx6ZihuLGUpKTpQZih0KTpufHxlP3pmKG4sZSk6RWZ9ZnVuY3Rpb24gQ2YodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuWyhuKz10KT5xYT9uLUJhOm48LXFhP24rQmE6bixlXX19ZnVuY3Rpb24gUGYodCl7dmFyIG49Q2YodCk7cmV0dXJuIG4uaW52ZXJ0PUNmKC10KSxufWZ1bmN0aW9uIHpmKHQsbil7dmFyIGU9R2EodCkscj1RYSh0KSxpPUdhKG4pLG89UWEobik7ZnVuY3Rpb24gYSh0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqZSt1KnI7cmV0dXJuW1hhKGYqaS1zKm8sdSplLWMqciksZXUocyppK2YqbyldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBhPUdhKG4pLHU9R2EodCkqYSxmPVFhKHQpKmEsYz1RYShuKSxzPWMqaS1mKm87cmV0dXJuW1hhKGYqaStjKm8sdSplK3MqciksZXUocyplLXUqcildfSxhfWZ1bmN0aW9uIFJmKHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuKG49dChuWzBdKklhLG5bMV0qSWEpKVswXSo9RmEsblsxXSo9RmEsbn1yZXR1cm4gdD1rZih0WzBdKklhLHRbMV0qSWEsdC5sZW5ndGg+Mj90WzJdKklhOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybihuPXQuaW52ZXJ0KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufSxufWZ1bmN0aW9uIExmKHQsbixlLHIsaSxvKXtpZihlKXt2YXIgYT1HYShuKSx1PVFhKG4pLGY9ciplO251bGw9PWk/KGk9bityKkJhLG89bi1mLzIpOihpPURmKGEsaSksbz1EZihhLG8pLChyPjA/aTxvOmk+bykmJihpKz1yKkJhKSk7Zm9yKHZhciBjLHM9aTtyPjA/cz5vOnM8bztzLT1mKWM9TXUoW2EsLXUqR2EocyksLXUqUWEocyldKSx0LnBvaW50KGNbMF0sY1sxXSl9fWZ1bmN0aW9uIERmKHQsbil7KG49QXUobikpWzBdLT10LGt1KG4pO3ZhciBlPW51KC1uWzFdKTtyZXR1cm4oKC1uWzJdPDA/LWU6ZSkrQmEtRGEpJUJhfWZ1bmN0aW9uIFVmKCl7dmFyIHQsbj1bXTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixlKXt0LnB1c2goW24sZV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6aXUscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24gcWYodCxuKXtyZXR1cm4gSGEodFswXS1uWzBdKTxEYSYmSGEodFsxXS1uWzFdKTxEYX1mdW5jdGlvbiBPZih0LG4sZSxyKXt0aGlzLng9dCx0aGlzLno9bix0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFlmKHQsbixlLHIsaSl7dmFyIG8sYSx1PVtdLGY9W107aWYodC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEoKG49dC5sZW5ndGgtMSk8PTApKXt2YXIgbixlLHI9dFswXSxhPXRbbl07aWYocWYocixhKSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtpLmxpbmVFbmQoKX1lbHNlIHUucHVzaChlPW5ldyBPZihyLHQsbnVsbCwhMCkpLGYucHVzaChlLm89bmV3IE9mKHIsbnVsbCxlLCExKSksdS5wdXNoKGU9bmV3IE9mKGEsdCxudWxsLCExKSksZi5wdXNoKGUubz1uZXcgT2YoYSxudWxsLGUsITApKX19KSx1Lmxlbmd0aCl7Zm9yKGYuc29ydChuKSxCZih1KSxCZihmKSxvPTAsYT1mLmxlbmd0aDtvPGE7KytvKWZbb10uZT1lPSFlO2Zvcih2YXIgYyxzLGw9dVswXTs7KXtmb3IodmFyIGg9bCxkPSEwO2gudjspaWYoKGg9aC5uKT09PWwpcmV0dXJuO2M9aC56LGkubGluZVN0YXJ0KCk7ZG97aWYoaC52PWguby52PSEwLGguZSl7aWYoZClmb3Iobz0wLGE9Yy5sZW5ndGg7bzxhOysrbylpLnBvaW50KChzPWNbb10pWzBdLHNbMV0pO2Vsc2UgcihoLngsaC5uLngsMSxpKTtoPWgubn1lbHNle2lmKGQpZm9yKGM9aC5wLnosbz1jLmxlbmd0aC0xO28+PTA7LS1vKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLnAueCwtMSxpKTtoPWgucH1jPShoPWgubykueixkPSFkfXdoaWxlKCFoLnYpO2kubGluZUVuZCgpfX19ZnVuY3Rpb24gQmYodCl7aWYobj10Lmxlbmd0aCl7Zm9yKHZhciBuLGUscj0wLGk9dFswXTsrK3I8bjspaS5uPWU9dFtyXSxlLnA9aSxpPWU7aS5uPWU9dFswXSxlLnA9aX19RWYuaW52ZXJ0PUVmO3ZhciBGZj1QYSgpO2Z1bmN0aW9uIElmKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1RYShyKSxvPVtRYShlKSwtR2EoZSksMF0sYT0wLHU9MDtGZi5yZXNldCgpLDE9PT1pP3I9T2ErRGE6LTE9PT1pJiYocj0tT2EtRGEpO2Zvcih2YXIgZj0wLGM9dC5sZW5ndGg7ZjxjOysrZilpZihsPShzPXRbZl0pLmxlbmd0aClmb3IodmFyIHMsbCxoPXNbbC0xXSxkPWhbMF0scD1oWzFdLzIrWWEsdj1RYShwKSxnPUdhKHApLHk9MDt5PGw7Kyt5LGQ9Yix2PXgsZz13LGg9Xyl7dmFyIF89c1t5XSxiPV9bMF0sbT1fWzFdLzIrWWEseD1RYShtKSx3PUdhKG0pLE09Yi1kLEE9TT49MD8xOi0xLFQ9QSpNLE49VD5xYSxTPXYqeDtpZihGZi5hZGQoWGEoUypBKlFhKFQpLGcqdytTKkdhKFQpKSksYSs9Tj9NK0EqQmE6TSxOXmQ+PWVeYj49ZSl7dmFyIEU9TnUoQXUoaCksQXUoXykpO2t1KEUpO3ZhciBrPU51KG8sRSk7a3Uoayk7dmFyIEM9KE5eTT49MD8tMToxKSpldShrWzJdKTsocj5DfHxyPT09QyYmKEVbMF18fEVbMV0pKSYmKHUrPU5eTT49MD8xOi0xKX19cmV0dXJuKGE8LURhfHxhPERhJiZGZjwtRGEpXjEmdX1mdW5jdGlvbiBIZih0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG8sYSx1LGY9bihpKSxjPVVmKCkscz1uKGMpLGw9ITEsaD17cG9pbnQ6ZCxsaW5lU3RhcnQ6dixsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aC5wb2ludD15LGgubGluZVN0YXJ0PV8saC5saW5lRW5kPWIsYT1bXSxvPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7aC5wb2ludD1kLGgubGluZVN0YXJ0PXYsaC5saW5lRW5kPWcsYT1OKGEpO3ZhciB0PUlmKG8scik7YS5sZW5ndGg/KGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLFlmKGEsWGYsdCxlLGkpKTp0JiYobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxsJiYoaS5wb2x5Z29uRW5kKCksbD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gZChuLGUpe3QobixlKSYmaS5wb2ludChuLGUpfWZ1bmN0aW9uIHAodCxuKXtmLnBvaW50KHQsbil9ZnVuY3Rpb24gdigpe2gucG9pbnQ9cCxmLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtoLnBvaW50PWQsZi5saW5lRW5kKCl9ZnVuY3Rpb24geSh0LG4pe3UucHVzaChbdCxuXSkscy5wb2ludCh0LG4pfWZ1bmN0aW9uIF8oKXtzLmxpbmVTdGFydCgpLHU9W119ZnVuY3Rpb24gYigpe3kodVswXVswXSx1WzBdWzFdKSxzLmxpbmVFbmQoKTt2YXIgdCxuLGUscixmPXMuY2xlYW4oKSxoPWMucmVzdWx0KCksZD1oLmxlbmd0aDtpZih1LnBvcCgpLG8ucHVzaCh1KSx1PW51bGwsZClpZigxJmYpe2lmKChuPShlPWhbMF0pLmxlbmd0aC0xKT4wKXtmb3IobHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksaS5saW5lU3RhcnQoKSx0PTA7dDxuOysrdClpLnBvaW50KChyPWVbdF0pWzBdLHJbMV0pO2kubGluZUVuZCgpfX1lbHNlIGQ+MSYmMiZmJiZoLnB1c2goaC5wb3AoKS5jb25jYXQoaC5zaGlmdCgpKSksYS5wdXNoKGguZmlsdGVyKGpmKSl9cmV0dXJuIGh9fWZ1bmN0aW9uIGpmKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIFhmKHQsbil7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLU9hLURhOk9hLXRbMV0pLSgobj1uLngpWzBdPDA/blsxXS1PYS1EYTpPYS1uWzFdKX12YXIgR2Y9SGYoZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24odCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLGEpe3ZhciB1PW8+MD9xYTotcWEsZj1IYShvLWUpO0hhKGYtcWEpPERhPyh0LnBvaW50KGUscj0ocithKS8yPjA/T2E6LU9hKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksdC5wb2ludChvLHIpLG49MCk6aSE9PXUmJmY+PXFhJiYoSGEoZS1pKTxEYSYmKGUtPWkqRGEpLEhhKG8tdSk8RGEmJihvLT11KkRhKSxyPWZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYT1RYSh0LWUpO3JldHVybiBIYShhKT5EYT9qYSgoUWEobikqKG89R2EocikpKlFhKGUpLVFhKHIpKihpPUdhKG4pKSpRYSh0KSkvKGkqbyphKSk6KG4rcikvMn0oZSxyLG8sYSksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh1LHIpLG49MCksdC5wb2ludChlPW8scj1hKSxpPXV9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLW59fX0sZnVuY3Rpb24odCxuLGUscil7dmFyIGk7aWYobnVsbD09dClpPWUqT2Esci5wb2ludCgtcWEsaSksci5wb2ludCgwLGkpLHIucG9pbnQocWEsaSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLXFhLC1pKSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSxpKTtlbHNlIGlmKEhhKHRbMF0tblswXSk+RGEpe3ZhciBvPXRbMF08blswXT9xYTotcWE7aT1lKm8vMixyLnBvaW50KC1vLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG8saSl9ZWxzZSByLnBvaW50KG5bMF0sblsxXSl9LFstcWEsLU9hXSk7ZnVuY3Rpb24gVmYodCl7dmFyIG49R2EodCksZT02KklhLHI9bj4wLGk9SGEobik+RGE7ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBHYSh0KSpHYShlKT5ufWZ1bmN0aW9uIGEodCxlLHIpe3ZhciBpPVsxLDAsMF0sbz1OdShBdSh0KSxBdShlKSksYT1UdShvLG8pLHU9b1swXSxmPWEtdSp1O2lmKCFmKXJldHVybiFyJiZ0O3ZhciBjPW4qYS9mLHM9LW4qdS9mLGw9TnUoaSxvKSxoPUV1KGksYyk7U3UoaCxFdShvLHMpKTt2YXIgZD1sLHA9VHUoaCxkKSx2PVR1KGQsZCksZz1wKnAtdiooVHUoaCxoKS0xKTtpZighKGc8MCkpe3ZhciB5PUthKGcpLF89RXUoZCwoLXAteSkvdik7aWYoU3UoXyxoKSxfPU11KF8pLCFyKXJldHVybiBfO3ZhciBiLG09dFswXSx4PWVbMF0sdz10WzFdLE09ZVsxXTt4PG0mJihiPW0sbT14LHg9Yik7dmFyIEE9eC1tLFQ9SGEoQS1xYSk8RGE7aWYoIVQmJk08dyYmKGI9dyx3PU0sTT1iKSxUfHxBPERhP1Q/dytNPjBeX1sxXTwoSGEoX1swXS1tKTxEYT93Ok0pOnc8PV9bMV0mJl9bMV08PU06QT5xYV4obTw9X1swXSYmX1swXTw9eCkpe3ZhciBOPUV1KGQsKC1wK3kpL3YpO3JldHVybiBTdShOLGgpLFtfLE11KE4pXX19fWZ1bmN0aW9uIHUobixlKXt2YXIgaT1yP3Q6cWEtdCxvPTA7cmV0dXJuIG48LWk/b3w9MTpuPmkmJihvfD0yKSxlPC1pP298PTQ6ZT5pJiYob3w9OCksb31yZXR1cm4gSGYobyxmdW5jdGlvbih0KXt2YXIgbixlLGYsYyxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWY9ITEscz0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBkLHA9W2wsaF0sdj1vKGwsaCksZz1yP3Y/MDp1KGwsaCk6dj91KGwrKGw8MD9xYTotcWEpLGgpOjA7aWYoIW4mJihjPWY9dikmJnQubGluZVN0YXJ0KCksdiE9PWYmJighKGQ9YShuLHApKXx8cWYobixkKXx8cWYocCxkKSkmJihwWzBdKz1EYSxwWzFdKz1EYSx2PW8ocFswXSxwWzFdKSksdiE9PWYpcz0wLHY/KHQubGluZVN0YXJ0KCksZD1hKHAsbiksdC5wb2ludChkWzBdLGRbMV0pKTooZD1hKG4scCksdC5wb2ludChkWzBdLGRbMV0pLHQubGluZUVuZCgpKSxuPWQ7ZWxzZSBpZihpJiZuJiZyXnYpe3ZhciB5O2cmZXx8ISh5PWEocCxuLCEwKSl8fChzPTAscj8odC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSksdC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh5WzFdWzBdLHlbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh5WzBdWzBdLHlbMF1bMV0pKSl9IXZ8fG4mJnFmKG4scCl8fHQucG9pbnQocFswXSxwWzFdKSxuPXAsZj12LGU9Z30sbGluZUVuZDpmdW5jdGlvbigpe2YmJnQubGluZUVuZCgpLG49bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3woYyYmZik8PDF9fX0sZnVuY3Rpb24obixyLGksbyl7TGYobyx0LGUsaSxuLHIpfSxyP1swLC10XTpbLXFhLHQtcWFdKX12YXIgJGY9MWU5LFdmPS0kZjtmdW5jdGlvbiBaZih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sdSxjKXt2YXIgcz0wLGw9MDtpZihudWxsPT1pfHwocz1hKGksdSkpIT09KGw9YShvLHUpKXx8ZihpLG8pPDBedT4wKWRve2MucG9pbnQoMD09PXN8fDM9PT1zP3Q6ZSxzPjE/cjpuKX13aGlsZSgocz0ocyt1KzQpJTQpIT09bCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShyLGkpe3JldHVybiBIYShyWzBdLXQpPERhP2k+MD8wOjM6SGEoclswXS1lKTxEYT9pPjA/MjoxOkhhKHJbMV0tbik8RGE/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIHUodCxuKXtyZXR1cm4gZih0Lngsbi54KX1mdW5jdGlvbiBmKHQsbil7dmFyIGU9YSh0LDEpLHI9YShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgZixjLHMsbCxoLGQscCx2LGcseSxfLGI9YSxtPVVmKCkseD17cG9pbnQ6dyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt4LnBvaW50PU0sYyYmYy5wdXNoKHM9W10pO3k9ITAsZz0hMSxwPXY9TmFOfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmKE0obCxoKSxkJiZnJiZtLnJlam9pbigpLGYucHVzaChtLnJlc3VsdCgpKSk7eC5wb2ludD13LGcmJmIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtiPW0sZj1bXSxjPVtdLF89ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLGU9MCxpPWMubGVuZ3RoO2U8aTsrK2UpZm9yKHZhciBvLGEsdT1jW2VdLGY9MSxzPXUubGVuZ3RoLGw9dVswXSxoPWxbMF0sZD1sWzFdO2Y8czsrK2Ypbz1oLGE9ZCxsPXVbZl0saD1sWzBdLGQ9bFsxXSxhPD1yP2Q+ciYmKGgtbykqKHItYSk+KGQtYSkqKHQtbykmJisrbjpkPD1yJiYoaC1vKSooci1hKTwoZC1hKSoodC1vKSYmLS1uO3JldHVybiBufSgpLGU9XyYmbixpPShmPU4oZikpLmxlbmd0aDsoZXx8aSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLGkmJllmKGYsdSxuLG8sYSksYS5wb2x5Z29uRW5kKCkpO2I9YSxmPWM9cz1udWxsfX07ZnVuY3Rpb24gdyh0LG4pe2kodCxuKSYmYi5wb2ludCh0LG4pfWZ1bmN0aW9uIE0obyxhKXt2YXIgdT1pKG8sYSk7aWYoYyYmcy5wdXNoKFtvLGFdKSx5KWw9byxoPWEsZD11LHk9ITEsdSYmKGIubGluZVN0YXJ0KCksYi5wb2ludChvLGEpKTtlbHNlIGlmKHUmJmcpYi5wb2ludChvLGEpO2Vsc2V7dmFyIGY9W3A9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYscCkpLHY9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsdikpXSxtPVtvPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLG8pKSxhPU1hdGgubWF4KFdmLE1hdGgubWluKCRmLGEpKV07IWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgYSx1PXRbMF0sZj10WzFdLGM9MCxzPTEsbD1uWzBdLXUsaD1uWzFdLWY7aWYoYT1lLXUsbHx8IShhPjApKXtpZihhLz1sLGw8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYobD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1pLXUsbHx8IShhPDApKXtpZihhLz1sLGw8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYobD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9aWYoYT1yLWYsaHx8IShhPjApKXtpZihhLz1oLGg8MCl7aWYoYTxjKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYoaD4wKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9aWYoYT1vLWYsaHx8IShhPDApKXtpZihhLz1oLGg8MCl7aWYoYT5zKXJldHVybjthPmMmJihjPWEpfWVsc2UgaWYoaD4wKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9cmV0dXJuIGM+MCYmKHRbMF09dStjKmwsdFsxXT1mK2MqaCksczwxJiYoblswXT11K3MqbCxuWzFdPWYrcypoKSwhMH19fX19KGYsbSx0LG4sZSxyKT91JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSksXz0hMSk6KGd8fChiLmxpbmVTdGFydCgpLGIucG9pbnQoZlswXSxmWzFdKSksYi5wb2ludChtWzBdLG1bMV0pLHV8fGIubGluZUVuZCgpLF89ITEpfXA9byx2PWEsZz11fXJldHVybiB4fX12YXIgUWYsSmYsS2YsdGM9UGEoKSxuYz17c3BoZXJlOml1LHBvaW50Oml1LGxpbmVTdGFydDpmdW5jdGlvbigpe25jLnBvaW50PXJjLG5jLmxpbmVFbmQ9ZWN9LGxpbmVFbmQ6aXUscG9seWdvblN0YXJ0Oml1LHBvbHlnb25FbmQ6aXV9O2Z1bmN0aW9uIGVjKCl7bmMucG9pbnQ9bmMubGluZUVuZD1pdX1mdW5jdGlvbiByYyh0LG4pe1FmPXQqPUlhLEpmPVFhKG4qPUlhKSxLZj1HYShuKSxuYy5wb2ludD1pY31mdW5jdGlvbiBpYyh0LG4pe3QqPUlhO3ZhciBlPVFhKG4qPUlhKSxyPUdhKG4pLGk9SGEodC1RZiksbz1HYShpKSxhPXIqUWEoaSksdT1LZiplLUpmKnIqbyxmPUpmKmUrS2YqcipvO3RjLmFkZChYYShLYShhKmErdSp1KSxmKSksUWY9dCxKZj1lLEtmPXJ9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHRjLnJlc2V0KCksc3UodCxuYyksK3RjfXZhciBhYz1bbnVsbCxudWxsXSx1Yz17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YWN9O2Z1bmN0aW9uIGZjKHQsbil7cmV0dXJuIGFjWzBdPXQsYWNbMV09bixvYyh1Yyl9dmFyIGNjPXtGZWF0dXJlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGxjKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLmdlb21ldHJ5LG4pKXJldHVybiEwO3JldHVybiExfX0sc2M9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LG4pe3JldHVybiBoYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihoYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGRjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoZGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe3JldHVybiBwYyh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKHBjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10Lmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihsYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gbGModCxuKXtyZXR1cm4hKCF0fHwhc2MuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJnNjW3QudHlwZV0odCxuKX1mdW5jdGlvbiBoYyh0LG4pe3JldHVybiAwPT09ZmModCxuKX1mdW5jdGlvbiBkYyh0LG4pe3ZhciBlPWZjKHRbMF0sdFsxXSk7cmV0dXJuIGZjKHRbMF0sbikrZmMobix0WzFdKTw9ZStEYX1mdW5jdGlvbiBwYyh0LG4pe3JldHVybiEhSWYodC5tYXAodmMpLGdjKG4pKX1mdW5jdGlvbiB2Yyh0KXtyZXR1cm4odD10Lm1hcChnYykpLnBvcCgpLHR9ZnVuY3Rpb24gZ2ModCl7cmV0dXJuW3RbMF0qSWEsdFsxXSpJYV19ZnVuY3Rpb24geWModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIF9jKHQsbixlKXt2YXIgcj1nKHQsbi1EYSxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBiYygpe3ZhciB0LG4sZSxyLGksbyxhLHUsZixjLHMsbCxoPTEwLGQ9aCxwPTkwLHY9MzYwLHk9Mi41O2Z1bmN0aW9uIF8oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpiKCl9fWZ1bmN0aW9uIGIoKXtyZXR1cm4gZyhWYShyL3ApKnAsZSxwKS5tYXAocykuY29uY2F0KGcoVmEodS92KSp2LGEsdikubWFwKGwpKS5jb25jYXQoZyhWYShuL2gpKmgsdCxoKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIEhhKHQlcCk+RGF9KS5tYXAoZikpLmNvbmNhdChnKFZhKG8vZCkqZCxpLGQpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCV2KT5EYX0pLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYigpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sXy5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltzKHIpLmNvbmNhdChsKGEpLnNsaWNlKDEpLHMoZSkucmV2ZXJzZSgpLnNsaWNlKDEpLGwodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxfLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLmV4dGVudE1ham9yKHQpLmV4dGVudE1pbm9yKHQpOl8uZXh0ZW50TWlub3IoKX0sXy5leHRlbnRNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLHU9K3RbMF1bMV0sYT0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksdT5hJiYodD11LHU9YSxhPXQpLF8ucHJlY2lzaW9uKHkpKTpbW3IsdV0sW2UsYV1dfSxfLmV4dGVudE1pbm9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHQ9K2VbMV1bMF0sbz0rZVswXVsxXSxpPStlWzFdWzFdLG4+dCYmKGU9bixuPXQsdD1lKSxvPmkmJihlPW8sbz1pLGk9ZSksXy5wcmVjaXNpb24oeSkpOltbbixvXSxbdCxpXV19LF8uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLnN0ZXBNYWpvcih0KS5zdGVwTWlub3IodCk6Xy5zdGVwTWlub3IoKX0sXy5zdGVwTWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxfKTpbcCx2XX0sXy5zdGVwTWlub3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3RbMF0sZD0rdFsxXSxfKTpbaCxkXX0sXy5wcmVjaXNpb249ZnVuY3Rpb24oaCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2gsZj15YyhvLGksOTApLGM9X2Mobix0LHkpLHM9eWModSxhLDkwKSxsPV9jKHIsZSx5KSxfKTp5fSxfLmV4dGVudE1ham9yKFtbLTE4MCwtOTArRGFdLFsxODAsOTAtRGFdXSkuZXh0ZW50TWlub3IoW1stMTgwLC04MC1EYV0sWzE4MCw4MCtEYV1dKX1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gdH12YXIgeGMsd2MsTWMsQWMsVGM9UGEoKSxOYz1QYSgpLFNjPXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTYy5saW5lU3RhcnQ9RWMsU2MubGluZUVuZD1QY30scG9seWdvbkVuZDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1TYy5saW5lRW5kPVNjLnBvaW50PWl1LFRjLmFkZChIYShOYykpLE5jLnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVRjLzI7cmV0dXJuIFRjLnJlc2V0KCksdH19O2Z1bmN0aW9uIEVjKCl7U2MucG9pbnQ9a2N9ZnVuY3Rpb24ga2ModCxuKXtTYy5wb2ludD1DYyx4Yz1NYz10LHdjPUFjPW59ZnVuY3Rpb24gQ2ModCxuKXtOYy5hZGQoQWMqdC1NYypuKSxNYz10LEFjPW59ZnVuY3Rpb24gUGMoKXtDYyh4Yyx3Yyl9dmFyIHpjPTEvMCxSYz16YyxMYz0temMsRGM9TGMsVWM9e3BvaW50OmZ1bmN0aW9uKHQsbil7dDx6YyYmKHpjPXQpO3Q+TGMmJihMYz10KTtuPFJjJiYoUmM9bik7bj5EYyYmKERjPW4pfSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW3pjLFJjXSxbTGMsRGNdXTtyZXR1cm4gTGM9RGM9LShSYz16Yz0xLzApLHR9fTt2YXIgcWMsT2MsWWMsQmMsRmM9MCxJYz0wLEhjPTAsamM9MCxYYz0wLEdjPTAsVmM9MCwkYz0wLFdjPTAsWmM9e3BvaW50OlFjLGxpbmVTdGFydDpKYyxsaW5lRW5kOm5zLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1pjLmxpbmVTdGFydD1lcyxaYy5saW5lRW5kPXJzfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WmMucG9pbnQ9UWMsWmMubGluZVN0YXJ0PUpjLFpjLmxpbmVFbmQ9bnN9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVdjP1tWYy9XYywkYy9XY106R2M/W2pjL0djLFhjL0djXTpIYz9bRmMvSGMsSWMvSGNdOltOYU4sTmFOXTtyZXR1cm4gRmM9SWM9SGM9amM9WGM9R2M9VmM9JGM9V2M9MCx0fX07ZnVuY3Rpb24gUWModCxuKXtGYys9dCxJYys9biwrK0hjfWZ1bmN0aW9uIEpjKCl7WmMucG9pbnQ9S2N9ZnVuY3Rpb24gS2ModCxuKXtaYy5wb2ludD10cyxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIHRzKHQsbil7dmFyIGU9dC1ZYyxyPW4tQmMsaT1LYShlKmUrcipyKTtqYys9aSooWWMrdCkvMixYYys9aSooQmMrbikvMixHYys9aSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIG5zKCl7WmMucG9pbnQ9UWN9ZnVuY3Rpb24gZXMoKXtaYy5wb2ludD1pc31mdW5jdGlvbiBycygpe29zKHFjLE9jKX1mdW5jdGlvbiBpcyh0LG4pe1pjLnBvaW50PW9zLFFjKHFjPVljPXQsT2M9QmM9bil9ZnVuY3Rpb24gb3ModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFZjKz0oaT1CYyp0LVljKm4pKihZYyt0KSwkYys9aSooQmMrbiksV2MrPTMqaSxRYyhZYz10LEJjPW4pfWZ1bmN0aW9uIGFzKHQpe3RoaXMuX2NvbnRleHQ9dH1hcy5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsQmEpfX0scmVzdWx0Oml1fTt2YXIgdXMsZnMsY3Msc3MsbHMsaHM9UGEoKSxkcz17cG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZHMucG9pbnQ9cHN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt1cyYmdnMoZnMsY3MpLGRzLnBvaW50PWl1fSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt1cz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3VzPW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PStocztyZXR1cm4gaHMucmVzZXQoKSx0fX07ZnVuY3Rpb24gcHModCxuKXtkcy5wb2ludD12cyxmcz1zcz10LGNzPWxzPW59ZnVuY3Rpb24gdnModCxuKXtzcy09dCxscy09bixocy5hZGQoS2Eoc3Mqc3MrbHMqbHMpKSxzcz10LGxzPW59ZnVuY3Rpb24gZ3MoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24geXModCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gX3ModCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW5ldyBicztmb3IodmFyIHIgaW4gdCllW3JdPXRbcl07cmV0dXJuIGUuc3RyZWFtPW4sZX19ZnVuY3Rpb24gYnMoKXt9ZnVuY3Rpb24gbXModCxuLGUpe3ZhciByPXQuY2xpcEV4dGVudCYmdC5jbGlwRXh0ZW50KCk7cmV0dXJuIHQuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPXImJnQuY2xpcEV4dGVudChudWxsKSxzdShlLHQuc3RyZWFtKFVjKSksbihVYy5yZXN1bHQoKSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KHIpLHR9ZnVuY3Rpb24geHModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPW5bMV1bMF0tblswXVswXSxpPW5bMV1bMV0tblswXVsxXSxvPU1hdGgubWluKHIvKGVbMV1bMF0tZVswXVswXSksaS8oZVsxXVsxXS1lWzBdWzFdKSksYT0rblswXVswXSsoci1vKihlWzFdWzBdK2VbMF1bMF0pKS8yLHU9K25bMF1bMV0rKGktbyooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2EsdV0pfSxlKX1mdW5jdGlvbiB3cyh0LG4sZSl7cmV0dXJuIHhzKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIE1zKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMF0tZVswXVswXSksbz0oci1pKihlWzFdWzBdK2VbMF1bMF0pKS8yLGE9LWkqZVswXVsxXTt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1mdW5jdGlvbiBBcyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzFdLWVbMF1bMV0pLG89LWkqZVswXVswXSxhPShyLWkqKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0sZSl9Z3MucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxfY2lyY2xlOnlzKDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpIT09dGhpcy5fcmFkaXVzJiYodGhpcy5fcmFkaXVzPXQsdGhpcy5fY2lyY2xlPW51bGwpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsbik7YnJlYWs7ZGVmYXVsdDpudWxsPT10aGlzLl9jaXJjbGUmJih0aGlzLl9jaXJjbGU9eXModGhpcy5fcmFkaXVzKSksdGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4sdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9cmV0dXJuIG51bGx9fSxicy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJzLHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCxuKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBUcz0xNixOcz1HYSgzMCpJYSk7ZnVuY3Rpb24gU3ModCxuKXtyZXR1cm4rbj9mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUocixpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnKXt2YXIgeT1jLXIsXz1zLWksYj15KnkrXypfO2lmKGI+NCpuJiZ2LS0pe3ZhciBtPWEraCx4PXUrZCx3PWYrcCxNPUthKG0qbSt4Kngrdyp3KSxBPWV1KHcvPU0pLFQ9SGEoSGEodyktMSk8RGF8fEhhKG8tbCk8RGE/KG8rbCkvMjpYYSh4LG0pLE49dChULEEpLFM9TlswXSxFPU5bMV0saz1TLXIsQz1FLWksUD1fKmsteSpDOyhQKlAvYj5ufHxIYSgoeSprK18qQykvYi0uNSk+LjN8fGEqaCt1KmQrZipwPE5zKSYmKGUocixpLG8sYSx1LGYsUyxFLFQsbS89TSx4Lz1NLHcsdixnKSxnLnBvaW50KFMsRSksZShTLEUsVCxtLHgsdyxjLHMsbCxoLGQscCx2LGcpKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByLGksbyxhLHUsZixjLHMsbCxoLGQscCx2PXtwb2ludDpnLGxpbmVTdGFydDp5LGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLHYubGluZVN0YXJ0PW19LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSx2LmxpbmVTdGFydD15fX07ZnVuY3Rpb24gZyhlLHIpe2U9dChlLHIpLG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiB5KCl7cz1OYU4sdi5wb2ludD1fLG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gXyhyLGkpe3ZhciBvPUF1KFtyLGldKSxhPXQocixpKTtlKHMsbCxjLGgsZCxwLHM9YVswXSxsPWFbMV0sYz1yLGg9b1swXSxkPW9bMV0scD1vWzJdLFRzLG4pLG4ucG9pbnQocyxsKX1mdW5jdGlvbiBiKCl7di5wb2ludD1nLG4ubGluZUVuZCgpfWZ1bmN0aW9uIG0oKXt5KCksdi5wb2ludD14LHYubGluZUVuZD13fWZ1bmN0aW9uIHgodCxuKXtfKHI9dCxuKSxpPXMsbz1sLGE9aCx1PWQsZj1wLHYucG9pbnQ9X31mdW5jdGlvbiB3KCl7ZShzLGwsYyxoLGQscCxpLG8scixhLHUsZixUcyxuKSx2LmxpbmVFbmQ9YixiKCl9cmV0dXJuIHZ9fSh0LG4pOmZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXtuPXQobixlKSx0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pfSh0KX12YXIgRXM9X3Moe3BvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5zdHJlYW0ucG9pbnQodCpJYSxuKklhKX19KTtmdW5jdGlvbiBrcyh0LG4sZSxyKXt2YXIgaT1HYShyKSxvPVFhKHIpLGE9aSp0LHU9byp0LGY9aS90LGM9by90LHM9KG8qZS1pKm4pL3QsbD0obypuK2kqZSkvdDtmdW5jdGlvbiBoKHQscil7cmV0dXJuW2EqdC11KnIrbixlLXUqdC1hKnJdfXJldHVybiBoLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVybltmKnQtYypuK3MsbC1jKnQtZipuXX0saH1mdW5jdGlvbiBDcyh0KXtyZXR1cm4gUHMoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gUHModCl7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbD0xNTAsaD00ODAsZD0yNTAscD0wLHY9MCxnPTAseT0wLF89MCxiPTAsbT1udWxsLHg9R2Ysdz1udWxsLE09bWMsQT0uNTtmdW5jdGlvbiBUKHQpe3JldHVybiBmKHRbMF0qSWEsdFsxXSpJYSl9ZnVuY3Rpb24gTih0KXtyZXR1cm4odD1mLmludmVydCh0WzBdLHRbMV0pKSYmW3RbMF0qRmEsdFsxXSpGYV19ZnVuY3Rpb24gUygpe3ZhciB0PWtzKGwsMCwwLGIpLmFwcGx5KG51bGwsbihwLHYpKSxyPShiP2tzOmZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKHIsaSl7cmV0dXJuW24rdCpyLGUtdCppXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24ocixpKXtyZXR1cm5bKHItbikvdCwoZS1pKS90XX0scn0pKGwsaC10WzBdLGQtdFsxXSxiKTtyZXR1cm4gZT1rZihnLHksXyksdT1TZihuLHIpLGY9U2YoZSx1KSxhPVNzKHUsQSksRSgpfWZ1bmN0aW9uIEUoKXtyZXR1cm4gYz1zPW51bGwsVH1yZXR1cm4gVC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnM9PT10P2M6Yz1FcyhmdW5jdGlvbih0KXtyZXR1cm4gX3Moe3BvaW50OmZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuLGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLHJbMV0pfX0pfShlKSh4KGEoTShzPXQpKSkpKX0sVC5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsbT12b2lkIDAsRSgpKTp4fSxULnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPXQsdz1yPWk9bz1udWxsLEUoKSk6TX0sVC5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9K3Q/VmYobT10KklhKToobT1udWxsLEdmKSxFKCkpOm0qRmF9LFQuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1udWxsPT10Pyh3PXI9aT1vPW51bGwsbWMpOlpmKHc9K3RbMF1bMF0scj0rdFswXVsxXSxpPSt0WzFdWzBdLG89K3RbMV1bMV0pLEUoKSk6bnVsbD09dz9udWxsOltbdyxyXSxbaSxvXV19LFQuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsUygpKTpsfSxULnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLFMoKSk6W2gsZF19LFQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPXRbMF0lMzYwKklhLHY9dFsxXSUzNjAqSWEsUygpKTpbcCpGYSx2KkZhXX0sVC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqSWEseT10WzFdJTM2MCpJYSxfPXQubGVuZ3RoPjI/dFsyXSUzNjAqSWE6MCxTKCkpOltnKkZhLHkqRmEsXypGYV19LFQuYW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dCUzNjAqSWEsUygpKTpiKkZhfSxULnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Tcyh1LEE9dCp0KSxFKCkpOkthKEEpfSxULmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhULHQsbil9LFQuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhULHQsbil9LFQuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMoVCx0LG4pfSxULmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhULHQsbil9LGZ1bmN0aW9uKCl7cmV0dXJuIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksVC5pbnZlcnQ9bi5pbnZlcnQmJk4sUygpfX1mdW5jdGlvbiB6cyh0KXt2YXIgbj0wLGU9cWEvMyxyPVBzKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpJYSxlPXRbMV0qSWEpOltuKkZhLGUqRmFdfSxpfWZ1bmN0aW9uIFJzKHQsbil7dmFyIGU9UWEodCkscj0oZStRYShuKSkvMjtpZihIYShyKTxEYSlyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49R2EodCk7ZnVuY3Rpb24gZSh0LGUpe3JldHVyblt0Km4sUWEoZSkvbl19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3QvbixldShlKm4pXX0sZX0odCk7dmFyIGk9MStlKigyKnItZSksbz1LYShpKS9yO2Z1bmN0aW9uIGEodCxuKXt2YXIgZT1LYShpLTIqcipRYShuKSkvcjtyZXR1cm5bZSpRYSh0Kj1yKSxvLWUqR2EodCldfXJldHVybiBhLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSxldSgoaS0odCp0K2UqZSkqcipyKS8oMipyKSldfSxhfWZ1bmN0aW9uIExzKCl7cmV0dXJuIHpzKFJzKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIERzKCl7cmV0dXJuIExzKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gVXModCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9R2EobiksaT1HYShlKSxvPXQocippKTtyZXR1cm5bbyppKlFhKG4pLG8qUWEoZSldfX1mdW5jdGlvbiBxcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1LYShuKm4rZSplKSxpPXQociksbz1RYShpKSxhPUdhKGkpO3JldHVybltYYShuKm8sciphKSxldShyJiZlKm8vcildfX12YXIgT3M9VXMoZnVuY3Rpb24odCl7cmV0dXJuIEthKDIvKDErdCkpfSk7T3MuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiAyKmV1KHQvMil9KTt2YXIgWXM9VXMoZnVuY3Rpb24odCl7cmV0dXJuKHQ9bnUodCkpJiZ0L1FhKHQpfSk7ZnVuY3Rpb24gQnModCxuKXtyZXR1cm5bdCxXYSh0dSgoT2ErbikvMikpXX1mdW5jdGlvbiBGcyh0KXt2YXIgbixlLHIsaT1Dcyh0KSxvPWkuY2VudGVyLGE9aS5zY2FsZSx1PWkudHJhbnNsYXRlLGY9aS5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiBzKCl7dmFyIG89cWEqYSgpLHU9aShSZihpLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gZihudWxsPT1jP1tbdVswXS1vLHVbMV0tb10sW3VbMF0rbyx1WzFdK29dXTp0PT09QnM/W1tNYXRoLm1heCh1WzBdLW8sYyksbl0sW01hdGgubWluKHVbMF0rbyxlKSxyXV06W1tjLE1hdGgubWF4KHVbMV0tbyxuKV0sW2UsTWF0aC5taW4odVsxXStvLHIpXV0pfXJldHVybiBpLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHMoKSk6YSgpfSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSh0KSxzKCkpOnUoKX0saS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCkscygpKTpvKCl9LGkuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPW49ZT1yPW51bGw6KGM9K3RbMF1bMF0sbj0rdFswXVsxXSxlPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHMoKSk6bnVsbD09Yz9udWxsOltbYyxuXSxbZSxyXV19LHMoKX1mdW5jdGlvbiBJcyh0KXtyZXR1cm4gdHUoKE9hK3QpLzIpfWZ1bmN0aW9uIEhzKHQsbil7dmFyIGU9R2EodCkscj10PT09bj9RYSh0KTpXYShlL0dhKG4pKS9XYShJcyhuKS9Jcyh0KSksaT1lKlphKElzKHQpLHIpL3I7aWYoIXIpcmV0dXJuIEJzO2Z1bmN0aW9uIG8odCxuKXtpPjA/bjwtT2ErRGEmJihuPS1PYStEYSk6bj5PYS1EYSYmKG49T2EtRGEpO3ZhciBlPWkvWmEoSXMobikscik7cmV0dXJuW2UqUWEocip0KSxpLWUqR2Eocip0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uLG89SmEocikqS2EodCp0K2UqZSk7cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksMipqYShaYShpL28sMS9yKSktT2FdfSxvfWZ1bmN0aW9uIGpzKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gWHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOihlLUdhKG4pKS8obi10KSxpPWUvcit0O2lmKEhhKHIpPERhKXJldHVybiBqcztmdW5jdGlvbiBvKHQsbil7dmFyIGU9aS1uLG89cip0O3JldHVybltlKlFhKG8pLGktZSpHYShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGktSmEocikqS2EodCp0K2UqZSldfSxvfVlzLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gdH0pLEJzLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqamEoJGEobikpLU9hXX0sanMuaW52ZXJ0PWpzO3ZhciBHcz0xLjM0MDI2NCxWcz0tLjA4MTEwNiwkcz04OTNlLTYsV3M9LjAwMzc5Nixacz1LYSgzKS8yO2Z1bmN0aW9uIFFzKHQsbil7dmFyIGU9ZXUoWnMqUWEobikpLHI9ZSplLGk9cipyKnI7cmV0dXJuW3QqR2EoZSkvKFpzKihHcyszKlZzKnIraSooNyokcys5KldzKnIpKSksZSooR3MrVnMqcitpKigkcytXcypyKSldfWZ1bmN0aW9uIEpzKHQsbil7dmFyIGU9R2Eobikscj1HYSh0KSplO3JldHVybltlKlFhKHQpL3IsUWEobikvcl19ZnVuY3Rpb24gS3ModCxuLGUscil7cmV0dXJuIDE9PT10JiYxPT09biYmMD09PWUmJjA9PT1yP21jOl9zKHtwb2ludDpmdW5jdGlvbihpLG8pe3RoaXMuc3RyZWFtLnBvaW50KGkqdCtlLG8qbityKX19KX1mdW5jdGlvbiB0bCh0LG4pe3ZhciBlPW4qbixyPWUqZTtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSplK3IqKHIqKC4wMDM5NzEqZS0uMDAxNTI5KnIpLS4wMTM3OTEpKSxuKigxLjAwNzIyNitlKiguMDE1MDg1K3IqKC4wMjg4NzQqZS0uMDQ0NDc1LS4wMDU5MTYqcikpKV19ZnVuY3Rpb24gbmwodCxuKXtyZXR1cm5bR2EobikqUWEodCksUWEobildfWZ1bmN0aW9uIGVsKHQsbil7dmFyIGU9R2Eobikscj0xK0dhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBybCh0LG4pe3JldHVybltXYSh0dSgoT2ErbikvMikpLC10XX1mdW5jdGlvbiBpbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBvbCh0LG4pe3JldHVybiB0K24ueH1mdW5jdGlvbiBhbCh0LG4pe3JldHVybiBNYXRoLm1heCh0LG4ueSl9ZnVuY3Rpb24gdWwodCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBmbCh0LG4pe3ZhciBlLHIsaSxvLGEsdT1uZXcgaGwodCksZj0rdC52YWx1ZSYmKHUudmFsdWU9dC52YWx1ZSksYz1bdV07Zm9yKG51bGw9PW4mJihuPWNsKTtlPWMucG9wKCk7KWlmKGYmJihlLnZhbHVlPStlLmRhdGEudmFsdWUpLChpPW4oZS5kYXRhKSkmJihhPWkubGVuZ3RoKSlmb3IoZS5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKHI9ZS5jaGlsZHJlbltvXT1uZXcgaGwoaVtvXSkpLHIucGFyZW50PWUsci5kZXB0aD1lLmRlcHRoKzE7cmV0dXJuIHUuZWFjaEJlZm9yZShsbCl9ZnVuY3Rpb24gY2wodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gc2wodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIGxsKHQpe3ZhciBuPTA7ZG97dC5oZWlnaHQ9bn13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrbil9ZnVuY3Rpb24gaGwodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9UXMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHI9bixpPXIqcixvPWkqaSppLGE9MDthPDEyJiYobz0oaT0oci09ZT0ociooR3MrVnMqaStvKigkcytXcyppKSktbikvKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpKSpyKSppKmksIShIYShlKTxVYSkpOysrYSk7cmV0dXJuW1pzKnQqKEdzKzMqVnMqaStvKig3KiRzKzkqV3MqaSkpL0dhKHIpLGV1KFFhKHIpL1pzKV19LEpzLmludmVydD1xcyhqYSksdGwuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uLGk9MjU7ZG97dmFyIG89cipyLGE9bypvO3ItPWU9KHIqKDEuMDA3MjI2K28qKC4wMTUwODUrYSooLjAyODg3NCpvLS4wNDQ0NzUtLjAwNTkxNiphKSkpLW4pLygxLjAwNzIyNitvKiguMDQ1MjU1K2EqKC4yNTk4NjYqby0uMzExMzI1LS4wMDU5MTYqMTEqYSkpKX13aGlsZShIYShlKT5EYSYmLS1pPjApO3JldHVyblt0LyguODcwNysobz1yKnIpKihvKihvKm8qbyooLjAwMzk3MS0uMDAxNTI5Km8pLS4wMTM3OTEpLS4xMzE5NzkpKSxyXX0sbmwuaW52ZXJ0PXFzKGV1KSxlbC5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqamEodCl9KSxybC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMipqYSgkYSh0KSktT2FdfSxobC5wcm90b3R5cGU9ZmwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpobCxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hBZnRlcih1bCl9LGVhY2g6ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10aGlzLGE9W29dO2Rve2ZvcihuPWEucmV2ZXJzZSgpLGE9W107bz1uLnBvcCgpOylpZih0KG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcilhLnB1c2goZVtyXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXRoaXMsbz1baV0sYT1bXTtpPW8ucG9wKCk7KWlmKGEucHVzaChpKSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pO2Zvcig7aT1hLnBvcCgpOyl0KGkpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0rdChuLmRhdGEpfHwwLHI9bi5jaGlsZHJlbixpPXImJnIubGVuZ3RoOy0taT49MDspZSs9cltpXS52YWx1ZTtuLnZhbHVlPWV9KX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pfSxwYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9ZnVuY3Rpb24odCxuKXtpZih0PT09bilyZXR1cm4gdDt2YXIgZT10LmFuY2VzdG9ycygpLHI9bi5hbmNlc3RvcnMoKSxpPW51bGw7Zm9yKHQ9ZS5wb3AoKSxuPXIucG9wKCk7dD09PW47KWk9dCx0PWUucG9wKCksbj1yLnBvcCgpO3JldHVybiBpfShuLHQpLHI9W25dO24hPT1lOyluPW4ucGFyZW50LHIucHVzaChuKTtmb3IodmFyIGk9ci5sZW5ndGg7dCE9PWU7KXIuc3BsaWNlKGksMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxuPVt0XTt0PXQucGFyZW50OyluLnB1c2godCk7cmV0dXJuIG59LGRlc2NlbmRhbnRzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt0LnB1c2gobil9KSx0fSxsZWF2ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW58fHQucHVzaChuKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goZnVuY3Rpb24oZSl7ZSE9PXQmJm4ucHVzaCh7c291cmNlOmUucGFyZW50LHRhcmdldDplfSl9KSxufSxjb3B5OmZ1bmN0aW9uKCl7cmV0dXJuIGZsKHRoaXMpLmVhY2hCZWZvcmUoc2wpfX07dmFyIGRsPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBwbCh0KXtmb3IodmFyIG4sZSxyPTAsaT0odD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXQubGVuZ3RoO3I7KWU9TWF0aC5yYW5kb20oKSpyLS18MCxuPXRbcl0sdFtyXT10W2VdLHRbZV09bjtyZXR1cm4gdH0oZGwuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJnlsKGUsbik/KytyOihlPWJsKG89dmwobyxuKSkscj0wKTtyZXR1cm4gZX1mdW5jdGlvbiB2bCh0LG4pe3ZhciBlLHI7aWYoX2wobix0KSlyZXR1cm5bbl07Zm9yKGU9MDtlPHQubGVuZ3RoOysrZSlpZihnbChuLHRbZV0pJiZfbChtbCh0W2VdLG4pLHQpKXJldHVyblt0W2VdLG5dO2ZvcihlPTA7ZTx0Lmxlbmd0aC0xOysrZSlmb3Iocj1lKzE7cjx0Lmxlbmd0aDsrK3IpaWYoZ2wobWwodFtlXSx0W3JdKSxuKSYmZ2wobWwodFtlXSxuKSx0W3JdKSYmZ2wobWwodFtyXSxuKSx0W2VdKSYmX2woeGwodFtlXSx0W3JdLG4pLHQpKXJldHVyblt0W2VdLHRbcl0sbl07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIGdsKHQsbil7dmFyIGU9dC5yLW4ucixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPDB8fGUqZTxyKnIraSppfWZ1bmN0aW9uIHlsKHQsbil7dmFyIGU9dC5yLW4ucisxZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gX2wodCxuKXtmb3IodmFyIGU9MDtlPG4ubGVuZ3RoOysrZSlpZigheWwodCxuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBibCh0KXtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpyZXR1cm57eDoobj10WzBdKS54LHk6bi55LHI6bi5yfTtjYXNlIDI6cmV0dXJuIG1sKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiB4bCh0WzBdLHRbMV0sdFsyXSl9dmFyIG59ZnVuY3Rpb24gbWwodCxuKXt2YXIgZT10Lngscj10LnksaT10LnIsbz1uLngsYT1uLnksdT1uLnIsZj1vLWUsYz1hLXIscz11LWksbD1NYXRoLnNxcnQoZipmK2MqYyk7cmV0dXJue3g6KGUrbytmL2wqcykvMix5OihyK2ErYy9sKnMpLzIscjoobCtpK3UpLzJ9fWZ1bmN0aW9uIHhsKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz10LnIsYT1uLngsdT1uLnksZj1uLnIsYz1lLngscz1lLnksbD1lLnIsaD1yLWEsZD1yLWMscD1pLXUsdj1pLXMsZz1mLW8seT1sLW8sXz1yKnIraSppLW8qbyxiPV8tYSphLXUqdStmKmYsbT1fLWMqYy1zKnMrbCpsLHg9ZCpwLWgqdix3PShwKm0tdipiKS8oMip4KS1yLE09KHYqZy1wKnkpL3gsQT0oZCpiLWgqbSkvKDIqeCktaSxUPShoKnktZCpnKS94LE49TSpNK1QqVC0xLFM9Mioobyt3Kk0rQSpUKSxFPXcqdytBKkEtbypvLGs9LShOPyhTK01hdGguc3FydChTKlMtNCpOKkUpKS8oMipOKTpFL1MpO3JldHVybnt4OnIrdytNKmsseTppK0ErVCprLHI6a319ZnVuY3Rpb24gd2wodCxuLGUpe3ZhciByLGksbyxhLHU9dC54LW4ueCxmPXQueS1uLnksYz11KnUrZipmO2M/KGk9bi5yK2UucixpKj1pLGE9dC5yK2UucixpPihhKj1hKT8ocj0oYythLWkpLygyKmMpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsYS9jLXIqcikpLGUueD10Lngtcip1LW8qZixlLnk9dC55LXIqZitvKnUpOihyPShjK2ktYSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxpL2MtcipyKSksZS54PW4ueCtyKnUtbypmLGUueT1uLnkrcipmK28qdSkpOihlLng9bi54K2UucixlLnk9bi55KX1mdW5jdGlvbiBNbCh0LG4pe3ZhciBlPXQucituLnItMWUtNixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPjAmJmUqZT5yKnIraSppfWZ1bmN0aW9uIEFsKHQpe3ZhciBuPXQuXyxlPXQubmV4dC5fLHI9bi5yK2UucixpPShuLngqZS5yK2UueCpuLnIpL3Isbz0obi55KmUucitlLnkqbi5yKS9yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIFRsKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBObCh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGw7aWYoKG49dFswXSkueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2Uucjt3bChlLG4scj10WzJdKSxuPW5ldyBUbChuKSxlPW5ldyBUbChlKSxyPW5ldyBUbChyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcih1PTM7dTxpOysrdSl7d2wobi5fLGUuXyxyPXRbdV0pLHI9bmV3IFRsKHIpLGY9ZS5uZXh0LGM9bi5wcmV2aW91cyxzPWUuXy5yLGw9bi5fLnI7ZG97aWYoczw9bCl7aWYoTWwoZi5fLHIuXykpe2U9ZixuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS11O2NvbnRpbnVlIHR9cys9Zi5fLnIsZj1mLm5leHR9ZWxzZXtpZihNbChjLl8sci5fKSl7KG49YykubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1sKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGYhPT1jLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLG89QWwobik7KHI9ci5uZXh0KSE9PWU7KShhPUFsKHIpKTxvJiYobj1yLG89YSk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1wbChuKSx1PTA7dTxpOysrdSkobj10W3VdKS54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBTbCh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRWwoKXtyZXR1cm4gMH1mdW5jdGlvbiBrbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ2wodCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBQbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIHpsKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLGE9ci5sZW5ndGgsdT10KGUpKm58fDA7aWYodSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yKz11O2lmKG89TmwociksdSlmb3IoaT0wO2k8YTsrK2kpcltpXS5yLT11O2Uucj1vK3V9fX1mdW5jdGlvbiBSbCh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBMbCh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gRGwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihyLW4pL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqY312YXIgVWw9IiQiLHFsPXtkZXB0aDotMX0sT2w9e307ZnVuY3Rpb24gWWwodCl7cmV0dXJuIHQuaWR9ZnVuY3Rpb24gQmwodCl7cmV0dXJuIHQucGFyZW50SWR9ZnVuY3Rpb24gRmwodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gSWwodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uWzBdOnQudH1mdW5jdGlvbiBIbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bbi5sZW5ndGgtMV06dC50fWZ1bmN0aW9uIGpsKHQsbixlKXt2YXIgcj1lLyhuLmktdC5pKTtuLmMtPXIsbi5zKz1lLHQuYys9cixuLnorPWUsbi5tKz1lfWZ1bmN0aW9uIFhsKHQsbixlKXtyZXR1cm4gdC5hLnBhcmVudD09PW4ucGFyZW50P3QuYTplfWZ1bmN0aW9uIEdsKHQsbil7dGhpcy5fPXQsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPW51bGwsdGhpcy5BPW51bGwsdGhpcy5hPXRoaXMsdGhpcy56PTAsdGhpcy5tPTAsdGhpcy5jPTAsdGhpcy5zPTAsdGhpcy50PW51bGwsdGhpcy5pPW59ZnVuY3Rpb24gVmwodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsZj1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7Kyt1PGY7KShvPWFbdV0pLngwPW4sby54MT1yLG8ueTA9ZSxvLnkxPWUrPW8udmFsdWUqY31HbC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShobC5wcm90b3R5cGUpO3ZhciAkbD0oMStNYXRoLnNxcnQoNSkpLzI7ZnVuY3Rpb24gV2wodCxuLGUscixpLG8pe2Zvcih2YXIgYSx1LGYsYyxzLGwsaCxkLHAsdixnLHk9W10sXz1uLmNoaWxkcmVuLGI9MCxtPTAseD1fLmxlbmd0aCx3PW4udmFsdWU7Yjx4Oyl7Zj1pLWUsYz1vLXI7ZG97cz1fW20rK10udmFsdWV9d2hpbGUoIXMmJm08eCk7Zm9yKGw9aD1zLGc9cypzKih2PU1hdGgubWF4KGMvZixmL2MpLyh3KnQpKSxwPU1hdGgubWF4KGgvZyxnL2wpO208eDsrK20pe2lmKHMrPXU9X1ttXS52YWx1ZSx1PGwmJihsPXUpLHU+aCYmKGg9dSksZz1zKnMqdiwoZD1NYXRoLm1heChoL2csZy9sKSk+cCl7cy09dTticmVha31wPWR9eS5wdXNoKGE9e3ZhbHVlOnMsZGljZTpmPGMsY2hpbGRyZW46Xy5zbGljZShiLG0pfSksYS5kaWNlP0RsKGEsZSxyLGksdz9yKz1jKnMvdzpvKTpWbChhLGUscix3P2UrPWYqcy93Omksbyksdy09cyxiPW19cmV0dXJuIHl9dmFyIFpsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe1dsKG4sdCxlLHIsaSxvKX1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7dmFyIFFsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PW4pZm9yKHZhciBhLHUsZixjLHMsbD0tMSxoPWEubGVuZ3RoLGQ9dC52YWx1ZTsrK2w8aDspe2ZvcihmPSh1PWFbbF0pLmNoaWxkcmVuLGM9dS52YWx1ZT0wLHM9Zi5sZW5ndGg7YzxzOysrYyl1LnZhbHVlKz1mW2NdLnZhbHVlO3UuZGljZT9EbCh1LGUscixpLHIrPShvLXIpKnUudmFsdWUvZCk6VmwodSxlLHIsZSs9KGktZSkqdS52YWx1ZS9kLG8pLGQtPXUudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPVdsKG4sdCxlLHIsaSxvKSxhLnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oJGwpO2Z1bmN0aW9uIEpsKHQsbil7cmV0dXJuIHRbMF0tblswXXx8dFsxXS1uWzFdfWZ1bmN0aW9uIEtsKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPVswLDFdLGE9Mix1PTI7dTxpOysrdSl7Zm9yKDthPjEmJihuPXRbb1thLTJdXSxlPXRbb1thLTFdXSxyPXRbdV0sKGVbMF0tblswXSkqKHJbMV0tblsxXSktKGVbMV0tblsxXSkqKHJbMF0tblswXSk8PTApOyktLWE7b1thKytdPXV9cmV0dXJuIG8uc2xpY2UoMCxhKX1mdW5jdGlvbiB0aCgpe3JldHVybiBNYXRoLnJhbmRvbSgpfXZhciBuaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGVoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLHJoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSgpe3ZhciB0PWVoLnNvdXJjZShuKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxpaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAscj0wO3I8dDsrK3IpZSs9bigpO3JldHVybiBlfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksb2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPWloLnNvdXJjZShuKSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSgpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxhaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksdWg9QXJyYXkucHJvdG90eXBlLGZoPXVoLm1hcCxjaD11aC5zbGljZSxzaD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBsaCh0KXt2YXIgbj1LaSgpLGU9W10scj1zaDtmdW5jdGlvbiBpKGkpe3ZhciBvPWkrIiIsYT1uLmdldChvKTtpZighYSl7aWYociE9PXNoKXJldHVybiByO24uc2V0KG8sYT1lLnB1c2goaSkpfXJldHVybiB0WyhhLTEpJXQubGVuZ3RoXX1yZXR1cm4gdD1udWxsPT10P1tdOmNoLmNhbGwodCksaS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLG49S2koKTtmb3IodmFyIHIsbyxhPS0xLHU9dC5sZW5ndGg7KythPHU7KW4uaGFzKG89KHI9dFthXSkrIiIpfHxuLnNldChvLGUucHVzaChyKSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9Y2guY2FsbChuKSxpKTp0LnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkpOnJ9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBsaCgpLmRvbWFpbihlKS5yYW5nZSh0KS51bmtub3duKHIpfSxpfWZ1bmN0aW9uIGhoKCl7dmFyIHQsbixlPWxoKCkudW5rbm93bih2b2lkIDApLHI9ZS5kb21haW4saT1lLnJhbmdlLG89WzAsMV0sYT0hMSx1PTAsZj0wLGM9LjU7ZnVuY3Rpb24gcygpe3ZhciBlPXIoKS5sZW5ndGgscz1vWzFdPG9bMF0sbD1vW3MtMF0saD1vWzEtc107dD0oaC1sKS9NYXRoLm1heCgxLGUtdSsyKmYpLGEmJih0PU1hdGguZmxvb3IodCkpLGwrPShoLWwtdCooZS11KSkqYyxuPXQqKDEtdSksYSYmKGw9TWF0aC5yb3VuZChsKSxuPU1hdGgucm91bmQobikpO3ZhciBkPWcoZSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBsK3Qqbn0pO3JldHVybiBpKHM/ZC5yZXZlcnNlKCk6ZCl9cmV0dXJuIGRlbGV0ZSBlLnVua25vd24sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHIodCkscygpKTpyKCl9LGUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSxzKCkpOm8uc2xpY2UoKX0sZS5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCxzKCl9LGUuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGUuc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxlLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCxzKCkpOmF9LGUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1mPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6dX0sZS5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmZ9LGUuYWxpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOmN9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBoaCgpLmRvbWFpbihyKCkpLnJhbmdlKG8pLnJvdW5kKGEpLnBhZGRpbmdJbm5lcih1KS5wYWRkaW5nT3V0ZXIoZikuYWxpZ24oYyl9LHMoKX1mdW5jdGlvbiBkaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gcGgodCl7cmV0dXJuK3R9dmFyIHZoPVswLDFdO2Z1bmN0aW9uIGdoKHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmRoKG4pfWZ1bmN0aW9uIHloKHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLGE9blswXSx1PW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksYT1yKHUsYSkpOihpPWUoaSxvKSxhPXIoYSx1KSksZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fWZ1bmN0aW9uIF9oKHQsbixlLHIpe3ZhciBvPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLGE9bmV3IEFycmF5KG8pLHU9bmV3IEFycmF5KG8pLGY9LTE7Zm9yKHRbb108dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrZjxvOylhW2ZdPWUodFtmXSx0W2YrMV0pLHVbZl09cihuW2ZdLG5bZisxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPWkodCxuLDEsbyktMTtyZXR1cm4gdVtlXShhW2VdKG4pKX19ZnVuY3Rpb24gYmgodCxuKXtyZXR1cm4gbi5kb21haW4odC5kb21haW4oKSkucmFuZ2UodC5yYW5nZSgpKS5pbnRlcnBvbGF0ZSh0LmludGVycG9sYXRlKCkpLmNsYW1wKHQuY2xhbXAoKSl9ZnVuY3Rpb24gbWgodCxuKXt2YXIgZSxyLGksbz12aCxhPXZoLHU9bWUsZj0hMTtmdW5jdGlvbiBjKCl7cmV0dXJuIGU9TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/X2g6eWgscj1pPW51bGwsc31mdW5jdGlvbiBzKG4pe3JldHVybihyfHwocj1lKG8sYSxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fSh0KTp0LHUpKSkoK24pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4oaXx8KGk9ZShhLG8sZ2gsZj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD0wP246dD49MT9lOnIodCl9fX0obik6bikpKSgrdCl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWZoLmNhbGwodCxwaCksYygpKTpvLnNsaWNlKCl9LHMucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Y2guY2FsbCh0KSxjKCkpOmEuc2xpY2UoKX0scy5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhPWNoLmNhbGwodCksdT14ZSxjKCl9LHMuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ISF0LGMoKSk6Zn0scy5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGMoKSk6dX0sYygpfWZ1bmN0aW9uIHhoKG4pe3ZhciBlPW4uZG9tYWluO3JldHVybiBuLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gbShuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7cmV0dXJuIGZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvPW5bMF0sYT1uW24ubGVuZ3RoLTFdLHU9dyhvLGEsbnVsbD09ZT8xMDplKTtzd2l0Y2goKHI9YmEobnVsbD09cj8iLGYiOnIpKS50eXBlKXtjYXNlInMiOnZhciBmPU1hdGgubWF4KE1hdGguYWJzKG8pLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9a2EodSxmKSl8fChyLnByZWNpc2lvbj1pKSx0LmZvcm1hdFByZWZpeChyLGYpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPUNhKHUsTWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpKSl8fChyLnByZWNpc2lvbj1pLSgiZSI9PT1yLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9RWEodSkpfHwoci5wcmVjaXNpb249aS0yKigiJSI9PT1yLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQocil9KGUoKSxuLHIpfSxuLm5pY2U9ZnVuY3Rpb24odCl7bnVsbD09dCYmKHQ9MTApO3ZhciByLGk9ZSgpLG89MCxhPWkubGVuZ3RoLTEsdT1pW29dLGY9aVthXTtyZXR1cm4gZjx1JiYocj11LHU9ZixmPXIscj1vLG89YSxhPXIpLChyPXgodSxmLHQpKT4wP3I9eCh1PU1hdGguZmxvb3IodS9yKSpyLGY9TWF0aC5jZWlsKGYvcikqcix0KTpyPDAmJihyPXgodT1NYXRoLmNlaWwodSpyKS9yLGY9TWF0aC5mbG9vcihmKnIpL3IsdCkpLHI+MD8oaVtvXT1NYXRoLmZsb29yKHUvcikqcixpW2FdPU1hdGguY2VpbChmL3IpKnIsZShpKSk6cjwwJiYoaVtvXT1NYXRoLmNlaWwodSpyKS9yLGlbYV09TWF0aC5mbG9vcihmKnIpL3IsZShpKSksbn0sbn1mdW5jdGlvbiB3aCh0LG4pe3ZhciBlLHI9MCxpPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W3JdLGE9dFtpXTtyZXR1cm4gYTxvJiYoZT1yLHI9aSxpPWUsZT1vLG89YSxhPWUpLHRbcl09bi5mbG9vcihvKSx0W2ldPW4uY2VpbChhKSx0fWZ1bmN0aW9uIE1oKHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06ZGgobil9ZnVuY3Rpb24gQWgodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIFRoKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBOaCh0KXtyZXR1cm4gMTA9PT10P1RoOnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIFNoKHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBFaCh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBraCh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24gQ2goKXt2YXIgdD0xLG49bWgoZnVuY3Rpb24obixlKXtyZXR1cm4oZT1raChlLHQpLShuPWtoKG4sdCkpKT9mdW5jdGlvbihyKXtyZXR1cm4oa2gocix0KS1uKS9lfTpkaChlKX0sZnVuY3Rpb24obixlKXtyZXR1cm4gZT1raChlLHQpLShuPWtoKG4sdCkpLGZ1bmN0aW9uKHIpe3JldHVybiBraChuK2UqciwxL3QpfX0pLGU9bi5kb21haW47cmV0dXJuIG4uZXhwb25lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZShlKCkpKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYmgobixDaCgpLmV4cG9uZW50KHQpKX0seGgobil9dmFyIFBoPW5ldyBEYXRlLHpoPW5ldyBEYXRlO2Z1bmN0aW9uIFJoKHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj1uZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZShlLTEpKSxuKGUsMSksdChlKSxlfSxpLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBuPWkodCksZT1pLmNlaWwodCk7cmV0dXJuIHQtbjxlLXQ/bjplfSxpLm9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQ9bmV3IERhdGUoK3QpLG51bGw9PWU/MTpNYXRoLmZsb29yKGUpKSx0fSxpLnJhbmdlPWZ1bmN0aW9uKGUscixvKXt2YXIgYSx1PVtdO2lmKGU9aS5jZWlsKGUpLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShlPHImJm8+MCkpcmV0dXJuIHU7ZG97dS5wdXNoKGE9bmV3IERhdGUoK2UpKSxuKGUsbyksdChlKX13aGlsZShhPGUmJmU8cik7cmV0dXJuIHV9LGkuZmlsdGVyPWZ1bmN0aW9uKGUpe3JldHVybiBSaChmdW5jdGlvbihuKXtpZihuPj1uKWZvcig7dChuKSwhZShuKTspbi5zZXRUaW1lKG4tMSl9LGZ1bmN0aW9uKHQscil7aWYodD49dClpZihyPDApZm9yKDsrK3I8PTA7KWZvcig7bih0LC0xKSwhZSh0KTspO2Vsc2UgZm9yKDstLXI+PTA7KWZvcig7bih0LDEpLCFlKHQpOyk7fSl9LGUmJihpLmNvdW50PWZ1bmN0aW9uKG4scil7cmV0dXJuIFBoLnNldFRpbWUoK24pLHpoLnNldFRpbWUoK3IpLHQoUGgpLHQoemgpLE1hdGguZmxvb3IoZShQaCx6aCkpfSxpLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9mdW5jdGlvbihuKXtyZXR1cm4gcihuKSV0PT0wfTpmdW5jdGlvbihuKXtyZXR1cm4gaS5jb3VudCgwLG4pJXQ9PTB9KTppOm51bGx9KSxpfXZhciBMaD1SaChmdW5jdGlvbigpe30sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3Qrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0pO0xoLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/UmgoZnVuY3Rpb24obil7bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0sZnVuY3Rpb24obixlKXtuLnNldFRpbWUoK24rZSp0KX0sZnVuY3Rpb24obixlKXtyZXR1cm4oZS1uKS90fSk6TGg6bnVsbH07dmFyIERoPUxoLnJhbmdlLFVoPTZlNCxxaD02MDQ4ZTUsT2g9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzFlMypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8xZTN9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLFloPU9oLnJhbmdlLEJoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvVWgpKlVoKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLEZoPUJoLnJhbmdlLEloPVJoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpVaCUzNmU1O248MCYmKG4rPTM2ZTUpLHQuc2V0VGltZSgzNmU1Kk1hdGguZmxvb3IoKCt0LW4pLzM2ZTUpK24pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxIaD1JaC5yYW5nZSxqaD1SaChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksWGg9amgucmFuZ2U7ZnVuY3Rpb24gR2godCl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe24uc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSs3LXQpJTcpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqVWgpL3FofSl9dmFyIFZoPUdoKDApLCRoPUdoKDEpLFdoPUdoKDIpLFpoPUdoKDMpLFFoPUdoKDQpLEpoPUdoKDUpLEtoPUdoKDYpLHRkPVZoLnJhbmdlLG5kPSRoLnJhbmdlLGVkPVdoLnJhbmdlLHJkPVpoLnJhbmdlLGlkPVFoLnJhbmdlLG9kPUpoLnJhbmdlLGFkPUtoLnJhbmdlLHVkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0TW9udGgodC5nZXRNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLGZkPXVkLnJhbmdlLGNkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSk7Y2QuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldEZ1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRGdWxsWWVhcigpL3QpKnQpLG4uc2V0TW9udGgoMCwxKSxuLnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgc2Q9Y2QucmFuZ2UsbGQ9UmgoZnVuY3Rpb24odCl7dC5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0K24qVWgpfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL1VofSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSxoZD1sZC5yYW5nZSxkZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSxwZD1kZC5yYW5nZSx2ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRGF0ZSgpLTF9KSxnZD12ZC5yYW5nZTtmdW5jdGlvbiB5ZCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9xaH0pfXZhciBfZD15ZCgwKSxiZD15ZCgxKSxtZD15ZCgyKSx4ZD15ZCgzKSx3ZD15ZCg0KSxNZD15ZCg1KSxBZD15ZCg2KSxUZD1fZC5yYW5nZSxOZD1iZC5yYW5nZSxTZD1tZC5yYW5nZSxFZD14ZC5yYW5nZSxrZD13ZC5yYW5nZSxDZD1NZC5yYW5nZSxQZD1BZC5yYW5nZSx6ZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMioobi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSxSZD16ZC5yYW5nZSxMZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pO0xkLmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/UmgoZnVuY3Rpb24obil7bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24obixlKXtuLnNldFVUQ0Z1bGxZZWFyKG4uZ2V0VVRDRnVsbFllYXIoKStlKnQpfSk6bnVsbH07dmFyIERkPUxkLnJhbmdlO2Z1bmN0aW9uIFVkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBxZCh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBPZCh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBZZCh0KXt2YXIgbj10LmRhdGVUaW1lLGU9dC5kYXRlLHI9dC50aW1lLGk9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMsdT10Lm1vbnRocyxmPXQuc2hvcnRNb250aHMsYz1WZChpKSxzPSRkKGkpLGw9VmQobyksaD0kZChvKSxkPVZkKGEpLHA9JGQoYSksdj1WZCh1KSxnPSRkKHUpLHk9VmQoZiksXz0kZChmKSxiPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6cHAsZTpwcCxmOmJwLEg6dnAsSTpncCxqOnlwLEw6X3AsbTptcCxNOnhwLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldEhvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOndwLHU6TXAsVTpBcCxWOlRwLHc6TnAsVzpTcCx4Om51bGwsWDpudWxsLHk6RXAsWTprcCxaOkNwLCIlIjokcH0sbT17YTpmdW5jdGlvbih0KXtyZXR1cm4gYVt0LmdldFVUQ0RheSgpXX0sQTpmdW5jdGlvbih0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uKHQpe3JldHVybiB1W3QuZ2V0VVRDTW9udGgoKV19LGM6bnVsbCxkOlBwLGU6UHAsZjpVcCxIOnpwLEk6UnAsajpMcCxMOkRwLG06cXAsTTpPcCxwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxROldwLHM6WnAsUzpZcCx1OkJwLFU6RnAsVjpJcCx3OkhwLFc6anAseDpudWxsLFg6bnVsbCx5OlhwLFk6R3AsWjpWcCwiJSI6JHB9LHg9e2E6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PXBbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9bC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9aFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj15LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1fW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPWdbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbih0LGUscil7cmV0dXJuIEEodCxuLGUscil9LGQ6aXAsZTppcCxmOnNwLEg6YXAsSTphcCxqOm9wLEw6Y3AsbTpycCxNOnVwLHA6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWMuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXNbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sUTpocCxzOmRwLFM6ZnAsdTpaZCxVOlFkLFY6SmQsdzpXZCxXOktkLHg6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBBKHQsZSxuLHIpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gQSh0LHIsbixlKX0seTpucCxZOnRwLFo6ZXAsIiUiOmxwfTtmdW5jdGlvbiB3KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyxhPVtdLHU9LTEsZj0wLGM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrdTxjOykzNz09PXQuY2hhckNvZGVBdCh1KSYmKGEucHVzaCh0LnNsaWNlKGYsdSkpLG51bGwhPShpPUZkW3I9dC5jaGFyQXQoKyt1KV0pP3I9dC5jaGFyQXQoKyt1KTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSxhLnB1c2gociksZj11KzEpO3JldHVybiBhLnB1c2godC5zbGljZShmLHUpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBNKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbz1PZCgxOTAwKTtpZihBKG8sdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhpPShyPXFkKE9kKG8ueSkpKS5nZXRVVENEYXkoKSxyPWk+NHx8MD09PWk/YmQuY2VpbChyKTpiZChyKSxyPXZkLm9mZnNldChyLDcqKG8uVi0xKSksby55PXIuZ2V0VVRDRnVsbFllYXIoKSxvLm09ci5nZXRVVENNb250aCgpLG8uZD1yLmdldFVUQ0RhdGUoKSsoby53KzYpJTcpOihpPShyPW4oT2Qoby55KSkpLmdldERheSgpLHI9aT40fHwwPT09aT8kaC5jZWlsKHIpOiRoKHIpLHI9amgub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRGdWxsWWVhcigpLG8ubT1yLmdldE1vbnRoKCksby5kPXIuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCksaT0iWiJpbiBvP3FkKE9kKG8ueSkpLmdldFVUQ0RheSgpOm4oT2Qoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShpKzUpJTc6by53Kzcqby5VLShpKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxxZChvKSk6bihvKX19ZnVuY3Rpb24gQSh0LG4sZSxyKXtmb3IodmFyIGksbyxhPTAsdT1uLmxlbmd0aCxmPWUubGVuZ3RoO2E8dTspe2lmKHI+PWYpcmV0dXJuLTE7aWYoMzc9PT0oaT1uLmNoYXJDb2RlQXQoYSsrKSkpe2lmKGk9bi5jaGFyQXQoYSsrKSwhKG89eFtpIGluIEZkP24uY2hhckF0KGErKyk6aV0pfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfXJldHVybiBiLng9dyhlLGIpLGIuWD13KHIsYiksYi5jPXcobixiKSxtLng9dyhlLG0pLG0uWD13KHIsbSksbS5jPXcobixtKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsYik7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0Kz0iIixVZCk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBuPXcodCs9IiIsbSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49TSh0LHFkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19dmFyIEJkLEZkPXsiLSI6IiIsXzoiICIsMDoiMCJ9LElkPS9eXHMqXGQrLyxIZD0vXiUvLGpkPS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiBYZCh0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBHZCh0KXtyZXR1cm4gdC5yZXBsYWNlKGpkLCJcXCQmIil9ZnVuY3Rpb24gVmQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKEdkKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gJGQodCl7Zm9yKHZhciBuPXt9LGU9LTEscj10Lmxlbmd0aDsrK2U8cjspblt0W2VdLnRvTG93ZXJDYXNlKCldPWU7cmV0dXJuIG59ZnVuY3Rpb24gV2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0Lnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByPyh0LnU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUWQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSmQodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlY9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS2QodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Llc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrNCkpO3JldHVybiByPyh0Lnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lnk9K3JbMF0rKCtyWzBdPjY4PzE5MDA6MmUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBlcCh0LG4sZSl7dmFyIHI9L14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Llo9clsxXT8wOi0oclsyXSsoclszXXx8IjAwIikpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQubT0wLHQuZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KHQuTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzcCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuTD1NYXRoLmZsb29yKHJbMF0vMWUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBscCh0LG4sZSl7dmFyIHI9SGQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBocCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5RPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGRwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9MWUzKityWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24gdnAodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gZ3AodCxuKXtyZXR1cm4gWGQodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIHlwKHQsbil7cmV0dXJuIFhkKDEramguY291bnQoY2QodCksdCksbiwzKX1mdW5jdGlvbiBfcCh0LG4pe3JldHVybiBYZCh0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gYnAodCxuKXtyZXR1cm4gX3AodCxuKSsiMDAwIn1mdW5jdGlvbiBtcCh0LG4pe3JldHVybiBYZCh0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIHhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gd3AodCxuKXtyZXR1cm4gWGQodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBNcCh0KXt2YXIgbj10LmdldERheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gQXAodCxuKXtyZXR1cm4gWGQoVmguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBUcCh0LG4pe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIHQ9ZT49NHx8MD09PWU/UWgodCk6UWguY2VpbCh0KSxYZChRaC5jb3VudChjZCh0KSx0KSsoND09PWNkKHQpLmdldERheSgpKSxuLDIpfWZ1bmN0aW9uIE5wKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIFNwKHQsbil7cmV0dXJuIFhkKCRoLmNvdW50KGNkKHQpLHQpLG4sMil9ZnVuY3Rpb24gRXAodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIGtwKHQsbil7cmV0dXJuIFhkKHQuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBDcCh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK1hkKG4vNjB8MCwiMCIsMikrWGQobiU2MCwiMCIsMil9ZnVuY3Rpb24gUHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiB6cCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBScCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gTHAodCxuKXtyZXR1cm4gWGQoMSt2ZC5jb3VudChMZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIERwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBVcCh0LG4pe3JldHVybiBEcCh0LG4pKyIwMDAifWZ1bmN0aW9uIHFwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24gT3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiBZcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIEJwKHQpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBGcCh0LG4pe3JldHVybiBYZChfZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIElwKHQsbil7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT93ZCh0KTp3ZC5jZWlsKHQpLFhkKHdkLmNvdW50KExkKHQpLHQpKyg0PT09TGQodCkuZ2V0VVRDRGF5KCkpLG4sMil9ZnVuY3Rpb24gSHAodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24ganAodCxuKXtyZXR1cm4gWGQoYmQuY291bnQoTGQodCksdCksbiwyKX1mdW5jdGlvbiBYcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gR3AodCxuKXtyZXR1cm4gWGQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIFZwKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiAkcCgpe3JldHVybiIlIn1mdW5jdGlvbiBXcCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBacCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfWZ1bmN0aW9uIFFwKG4pe3JldHVybiBCZD1ZZChuKSx0LnRpbWVGb3JtYXQ9QmQuZm9ybWF0LHQudGltZVBhcnNlPUJkLnBhcnNlLHQudXRjRm9ybWF0PUJkLnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPUJkLnV0Y1BhcnNlLEJkfVFwKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIEpwPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OnQudXRjRm9ybWF0KCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTt2YXIgS3A9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbih0KXt2YXIgbj1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4obik/bnVsbDpufTp0LnV0Y1BhcnNlKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKSx0dj0xZTMsbnY9NjAqdHYsZXY9NjAqbnYscnY9MjQqZXYsaXY9Nypydixvdj0zMCpydixhdj0zNjUqcnY7ZnVuY3Rpb24gdXYodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIGZ2KHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIGN2KHQsbixyLGksbyxhLHUsZixjKXt2YXIgcz1taChnaCx2ZSksbD1zLmludmVydCxoPXMuZG9tYWluLGQ9YygiLiVMIikscD1jKCI6JVMiKSx2PWMoIiVJOiVNIiksZz1jKCIlSSAlcCIpLHk9YygiJWEgJWQiKSxfPWMoIiViICVkIiksYj1jKCIlQiIpLG09YygiJVkiKSx4PVtbdSwxLHR2XSxbdSw1LDUqdHZdLFt1LDE1LDE1KnR2XSxbdSwzMCwzMCp0dl0sW2EsMSxudl0sW2EsNSw1Km52XSxbYSwxNSwxNSpudl0sW2EsMzAsMzAqbnZdLFtvLDEsZXZdLFtvLDMsMypldl0sW28sNiw2KmV2XSxbbywxMiwxMipldl0sW2ksMSxydl0sW2ksMiwyKnJ2XSxbciwxLGl2XSxbbiwxLG92XSxbbiwzLDMqb3ZdLFt0LDEsYXZdXTtmdW5jdGlvbiBNKGUpe3JldHVybih1KGUpPGU/ZDphKGUpPGU/cDpvKGUpPGU/djppKGUpPGU/ZzpuKGUpPGU/cihlKTxlP3k6Xzp0KGUpPGU/YjptKShlKX1mdW5jdGlvbiBBKG4scixpLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciBhPU1hdGguYWJzKGktcikvbix1PWUoZnVuY3Rpb24odCl7cmV0dXJuIHRbMl19KS5yaWdodCh4LGEpO3U9PT14Lmxlbmd0aD8obz13KHIvYXYsaS9hdixuKSxuPXQpOnU/KG89KHU9eFthL3hbdS0xXVsyXTx4W3VdWzJdL2E/dS0xOnVdKVsxXSxuPXVbMF0pOihvPU1hdGgubWF4KHcocixpLG4pLDEpLG49Zil9cmV0dXJuIG51bGw9PW8/bjpuLmV2ZXJ5KG8pfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUobCh0KSl9LHMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2goZmguY2FsbCh0LGZ2KSk6aCgpLm1hcCh1dil9LHMudGlja3M9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPWgoKSxpPXJbMF0sbz1yW3IubGVuZ3RoLTFdLGE9bzxpO3JldHVybiBhJiYoZT1pLGk9byxvPWUpLGU9KGU9QSh0LGksbyxuKSk/ZS5yYW5nZShpLG8rMSk6W10sYT9lLnJldmVyc2UoKTplfSxzLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09bj9NOmMobil9LHMubmljZT1mdW5jdGlvbih0LG4pe3ZhciBlPWgoKTtyZXR1cm4odD1BKHQsZVswXSxlW2UubGVuZ3RoLTFdLG4pKT9oKHdoKGUsdCkpOnN9LHMuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChzLGN2KHQsbixyLGksbyxhLHUsZixjKSl9LHN9ZnVuY3Rpb24gc3YodCl7Zm9yKHZhciBuPXQubGVuZ3RoLzZ8MCxlPW5ldyBBcnJheShuKSxyPTA7cjxuOyllW3JdPSIjIit0LnNsaWNlKDYqciw2Kisrcik7cmV0dXJuIGV9dmFyIGx2PXN2KCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxodj1zdigiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2IiksZHY9c3YoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpLHB2PXN2KCJhNmNlZTMxZjc4YjRiMmRmOGEzM2EwMmNmYjlhOTllMzFhMWNmZGJmNmZmZjdmMDBjYWIyZDY2YTNkOWFmZmZmOTliMTU5MjgiKSx2dj1zdigiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZmZmNjZTVkOGJkZmRkYWVjZjJmMmYyIiksZ3Y9c3YoImIzZTJjZGZkY2RhY2NiZDVlOGY0Y2FlNGU2ZjVjOWZmZjJhZWYxZTJjY2NjY2NjYyIpLHl2PXN2KCJlNDFhMWMzNzdlYjg0ZGFmNGE5ODRlYTNmZjdmMDBmZmZmMzNhNjU2MjhmNzgxYmY5OTk5OTkiKSxfdj1zdigiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0ZmZkOTJmZTVjNDk0YjNiM2IzIiksYnY9c3YoIjhkZDNjN2ZmZmZiM2JlYmFkYWZiODA3MjgwYjFkM2ZkYjQ2MmIzZGU2OWZjY2RlNWQ5ZDlkOWJjODBiZGNjZWJjNWZmZWQ2ZiIpO2Z1bmN0aW9uIG12KHQpe3JldHVybiBsZSh0W3QubGVuZ3RoLTFdKX12YXIgeHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZDhiMzY1ZjVmNWY1NWFiNGFjIiwiYTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4NTcxIiwiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIikubWFwKHN2KSx3dj1tdih4diksTXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiYWY4ZGMzZjdmN2Y3N2ZiZjdiIiwiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwiN2IzMjk0YzJhNWNmZjdmN2Y3YTZkYmEwMDA4ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIikubWFwKHN2KSxBdj1tdihNdiksVHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2IiwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IikubWFwKHN2KSxOdj1tdihUdiksU3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiOTk4ZWMzZjdmN2Y3ZjFhMzQwIiwiNWUzYzk5YjJhYmQyZmRiODYzZTY2MTAxIiwiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwiNTQyNzg4OTk4ZWMzZDhkYWViZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4OTk4ZWMzZDhkYWViZjdmN2Y3ZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IikubWFwKHN2KSxFdj1tdihTdiksa3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZjdmN2Y3NjdhOWNmIiwiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwiY2EwMDIwZjRhNTgyZjdmN2Y3OTJjNWRlMDU3MWIwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIikubWFwKHN2KSxDdj1tdihrdiksUHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZmZmZmZmOTk5OTk5IiwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwIiwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIikubWFwKHN2KSx6dj1tdihQdiksUnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFiZmRiIiwiZDcxOTFjZmRhZTYxYWJkOWU5MmM3YmI2IiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZmZmZmJmZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IikubWFwKHN2KSxMdj1tdihSdiksRHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFjZjYwIiwiZDcxOTFjZmRhZTYxYTZkOTZhMWE5NjQxIiwiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZmZmZmJmZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IikubWFwKHN2KSxVdj1tdihEdikscXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTlkNTk0IiwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhIiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIikubWFwKHN2KSxPdj1tdihxdiksWXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWY5OTlkOGM5MmNhMjVmIiwiZWRmOGZiYjJlMmUyNjZjMmE0MjM4YjQ1IiwiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxCdj1tdihZdiksRnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBlY2Y0OWViY2RhODg1NmE3IiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkODEwZjdjNGQwMDRiIikubWFwKHN2KSxJdj1tdihGdiksSHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBmM2RiYThkZGI1NDNhMmNhIiwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlIiwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxIikubWFwKHN2KSxqdj1tdihIdiksWHY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIikubWFwKHN2KSxHdj1tdihYdiksVnY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlMmYwYTZiZGRiMWM5MDk5IiwiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwiZjZlZmY3YmRjOWUxNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2YzU5MDE0NjM2IikubWFwKHN2KSwkdj1tdihWdiksV3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlN2YyYTZiZGRiMmI4Y2JlIiwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwIiwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IikubWFwKHN2KSxadj1tdihXdiksUXY9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTdlMWVmYzk5NGM3ZGQxYzc3IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTgwMDQzNjcwMDFmIikubWFwKHN2KSxKdj1tdihRdiksS3Y9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmRlMGRkZmE5ZmI1YzUxYjhhIiwiZmVlYmUyZmJiNGI5Zjc2OGExYWUwMTdlIiwiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3NDkwMDZhIikubWFwKHN2KSx0Zz1tdihLdiksbmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IikubWFwKHN2KSxlZz1tdihuZykscmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjdmY2I5YWRkZDhlMzFhMzU0IiwiZmZmZmNjYzJlNjk5NzhjNjc5MjM4NDQzIiwiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA2ODM3MDA0NTI5IikubWFwKHN2KSxpZz1tdihyZyksb2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZmN2JjZmVjNDRmZDk1ZjBlIiwiZmZmZmQ0ZmVkOThlZmU5OTI5Y2M0YzAyIiwiZmZmZmQ0ZmVkOThlZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IikubWFwKHN2KSxhZz1tdihvZyksdWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZlZGEwZmViMjRjZjAzYjIwIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2IikubWFwKHN2KSxmZz1tdih1ZyksY2c9bmV3IEFycmF5KDMpLmNvbmNhdCgiZGVlYmY3OWVjYWUxMzE4MmJkIiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg1MTljMDgzMDZiIikubWFwKHN2KSxzZz1tdihjZyksbGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWUwYTFkOTliMzFhMzU0IiwiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwiZWRmOGU5YmFlNGIzNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKHN2KSxoZz1tdihsZyksZGc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjBmMGYwYmRiZGJkNjM2MzYzIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIikubWFwKHN2KSxwZz1tdihkZyksdmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWZlZGY1YmNiZGRjNzU2YmIxIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIikubWFwKHN2KSxnZz1tdih2ZykseWc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlMGQyZmM5MjcyZGUyZDI2IiwiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwiZmVlNWQ5ZmNhZTkxZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIikubWFwKHN2KSxfZz1tdih5ZyksYmc9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlNmNlZmRhZTZiZTY1NTBkIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0IikubWFwKHN2KSxtZz1tdihiZykseGc9R2UoS24oMzAwLC41LDApLEtuKC0yNDAsLjUsMSkpLHdnPUdlKEtuKC0xMDAsLjc1LC4zNSksS24oODAsMS41LC44KSksTWc9R2UoS24oMjYwLC43NSwuMzUpLEtuKDgwLDEuNSwuOCkpLEFnPUtuKCk7dmFyIFRnPWJuKCksTmc9TWF0aC5QSS8zLFNnPTIqTWF0aC5QSS8zO2Z1bmN0aW9uIEVnKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fXZhciBrZz1FZyhzdigiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLENnPUVnKHN2KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksUGc9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSx6Zz1FZyhzdigiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpO2Z1bmN0aW9uIFJnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgTGc9TWF0aC5hYnMsRGc9TWF0aC5hdGFuMixVZz1NYXRoLmNvcyxxZz1NYXRoLm1heCxPZz1NYXRoLm1pbixZZz1NYXRoLnNpbixCZz1NYXRoLnNxcnQsRmc9MWUtMTIsSWc9TWF0aC5QSSxIZz1JZy8yLGpnPTIqSWc7ZnVuY3Rpb24gWGcodCl7cmV0dXJuIHQ+PTE/SGc6dDw9LTE/LUhnOk1hdGguYXNpbih0KX1mdW5jdGlvbiBHZyh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBWZyh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiAkZyh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFdnKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIFpnKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIFFnKHQsbixlLHIsaSxvLGEpe3ZhciB1PXQtZSxmPW4tcixjPShhP286LW8pL0JnKHUqdStmKmYpLHM9YypmLGw9LWMqdSxoPXQrcyxkPW4rbCxwPWUrcyx2PXIrbCxnPShoK3ApLzIseT0oZCt2KS8yLF89cC1oLGI9di1kLG09XypfK2IqYix4PWktbyx3PWgqdi1wKmQsTT0oYjwwPy0xOjEpKkJnKHFnKDAseCp4Km0tdyp3KSksQT0odypiLV8qTSkvbSxUPSgtdypfLWIqTSkvbSxOPSh3KmIrXypNKS9tLFM9KC13Kl8rYipNKS9tLEU9QS1nLGs9VC15LEM9Ti1nLFA9Uy15O3JldHVybiBFKkUrayprPkMqQytQKlAmJihBPU4sVD1TKSx7Y3g6QSxjeTpULHgwMTotcyx5MDE6LWwseDExOkEqKGkveC0xKSx5MTE6VCooaS94LTEpfX1mdW5jdGlvbiBKZyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gS2codCl7cmV0dXJuIG5ldyBKZyh0KX1mdW5jdGlvbiB0eSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBueSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBleSgpe3ZhciB0PXR5LG49bnksZT1SZyghMCkscj1udWxsLGk9S2csbz1udWxsO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHM9YS5sZW5ndGgsbD0hMTtmb3IobnVsbD09ciYmKG89aShjPUdpKCkpKSx1PTA7dTw9czsrK3UpISh1PHMmJmUoZj1hW3VdLHUsYSkpPT09bCYmKChsPSFsKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxsJiZvLnBvaW50KCt0KGYsdSxhKSwrbihmLHUsYSkpO2lmKGMpcmV0dXJuIG89bnVsbCxjKyIifHxudWxsfXJldHVybiBhLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm59LGEuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCEhdCksYSk6ZX0sYS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPXImJihvPWkocikpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9yPW89bnVsbDpvPWkocj10KSxhKTpyfSxhfWZ1bmN0aW9uIHJ5KCl7dmFyIHQ9dHksbj1udWxsLGU9UmcoMCkscj1ueSxpPVJnKCEwKSxvPW51bGwsYT1LZyx1PW51bGw7ZnVuY3Rpb24gZihmKXt2YXIgYyxzLGwsaCxkLHA9Zi5sZW5ndGgsdj0hMSxnPW5ldyBBcnJheShwKSx5PW5ldyBBcnJheShwKTtmb3IobnVsbD09byYmKHU9YShkPUdpKCkpKSxjPTA7Yzw9cDsrK2Mpe2lmKCEoYzxwJiZpKGg9ZltjXSxjLGYpKT09PXYpaWYodj0hdilzPWMsdS5hcmVhU3RhcnQoKSx1LmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHUubGluZUVuZCgpLHUubGluZVN0YXJ0KCksbD1jLTE7bD49czstLWwpdS5wb2ludChnW2xdLHlbbF0pO3UubGluZUVuZCgpLHUuYXJlYUVuZCgpfXYmJihnW2NdPSt0KGgsYyxmKSx5W2NdPStlKGgsYyxmKSx1LnBvaW50KG4/K24oaCxjLGYpOmdbY10scj8rcihoLGMsZik6eVtjXSkpfWlmKGQpcmV0dXJuIHU9bnVsbCxkKyIifHxudWxsfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZXkoKS5kZWZpbmVkKGkpLmN1cnZlKGEpLmNvbnRleHQobyl9cmV0dXJuIGYueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlJnKCtlKSxuPW51bGwsZik6dH0sZi54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpufSxmLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCkscj1udWxsLGYpOmV9LGYueTA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6cn0sZi5saW5lWDA9Zi5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShlKX0sZi5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShyKX0sZi5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngobikueShlKX0sZi5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxmKTppfSxmLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbnVsbCE9byYmKHU9YShvKSksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P289dT1udWxsOnU9YShvPXQpLGYpOm99LGZ9ZnVuY3Rpb24gaXkodCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gb3kodCl7cmV0dXJuIHR9SmcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsbil9fX07dmFyIGF5PWZ5KEtnKTtmdW5jdGlvbiB1eSh0KXt0aGlzLl9jdXJ2ZT10fWZ1bmN0aW9uIGZ5KHQpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG5ldyB1eSh0KG4pKX1yZXR1cm4gbi5fY3VydmU9dCxufWZ1bmN0aW9uIGN5KHQpe3ZhciBuPXQuY3VydmU7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIHN5KCl7cmV0dXJuIGN5KGV5KCkuY3VydmUoYXkpKX1mdW5jdGlvbiBseSgpe3ZhciB0PXJ5KCkuY3VydmUoYXkpLG49dC5jdXJ2ZSxlPXQubGluZVgwLHI9dC5saW5lWDEsaT10LmxpbmVZMCxvPXQubGluZVkxO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQuc3RhcnRBbmdsZT10LngwLGRlbGV0ZSB0LngwLHQuZW5kQW5nbGU9dC54MSxkZWxldGUgdC54MSx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmlubmVyUmFkaXVzPXQueTAsZGVsZXRlIHQueTAsdC5vdXRlclJhZGl1cz10LnkxLGRlbGV0ZSB0LnkxLHQubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3koZSgpKX0sZGVsZXRlIHQubGluZVgwLHQubGluZUVuZEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KHIoKSl9LGRlbGV0ZSB0LmxpbmVYMSx0LmxpbmVJbm5lclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShpKCkpfSxkZWxldGUgdC5saW5lWTAsdC5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gY3kobygpKX0sZGVsZXRlIHQubGluZVkxLHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihmeSh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBoeSh0LG4pe3JldHVyblsobj0rbikqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxuKk1hdGguc2luKHQpXX11eS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBkeT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gcHkodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIHZ5KHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBneSh0KXt2YXIgbj1weSxlPXZ5LHI9dHksaT1ueSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9ZHkuY2FsbChhcmd1bWVudHMpLGY9bi5hcHBseSh0aGlzLHUpLGM9ZS5hcHBseSh0aGlzLHUpO2lmKG98fChvPWE9R2koKSksdChvLCtyLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksK2kuYXBwbHkodGhpcyx1KSwrci5hcHBseSh0aGlzLCh1WzBdPWMsdSkpLCtpLmFwcGx5KHRoaXMsdSkpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOnJ9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX1mdW5jdGlvbiB5eSh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIF95KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gYnkodCxuLGUscixpKXt2YXIgbz1oeShuLGUpLGE9aHkobixlPShlK2kpLzIpLHU9aHkocixlKSxmPWh5KHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8oYVswXSxhWzFdLHVbMF0sdVsxXSxmWzBdLGZbMV0pfXZhciBteT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0lnKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsamcpfX0seHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sd3k9TWF0aC5zcXJ0KDEvMyksTXk9Mip3eSxBeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL015KSxyPWUqd3k7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxUeT1NYXRoLnNpbihJZy8xMCkvTWF0aC5zaW4oNypJZy8xMCksTnk9TWF0aC5zaW4oamcvMTApKlR5LFN5PS1NYXRoLmNvcyhqZy8xMCkqVHksRXk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqbikscj1OeSplLGk9U3kqZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciBhPWpnKm8vNSx1PU1hdGguY29zKGEpLGY9TWF0aC5zaW4oYSk7dC5saW5lVG8oZiplLC11KmUpLHQubGluZVRvKHUqci1mKmksZipyK3UqaSl9dC5jbG9zZVBhdGgoKX19LGt5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSxDeT1NYXRoLnNxcnQoMyksUHk9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqQ3kpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLUN5KmUsLWUpLHQubGluZVRvKEN5KmUsLWUpLHQuY2xvc2VQYXRoKCl9fSx6eT1NYXRoLnNxcnQoMykvMixSeT0xL01hdGguc3FydCgxMiksTHk9MyooUnkvMisxKSxEeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL0x5KSxyPWUvMixpPWUqUnksbz1yLGE9ZSpSeStlLHU9LW8sZj1hO3QubW92ZVRvKHIsaSksdC5saW5lVG8obyxhKSx0LmxpbmVUbyh1LGYpLHQubGluZVRvKC0uNSpyLXp5KmksenkqcistLjUqaSksdC5saW5lVG8oLS41Km8tenkqYSx6eSpvKy0uNSphKSx0LmxpbmVUbygtLjUqdS16eSpmLHp5KnUrLS41KmYpLHQubGluZVRvKC0uNSpyK3p5KmksLS41KmktenkqciksdC5saW5lVG8oLS41Km8renkqYSwtLjUqYS16eSpvKSx0LmxpbmVUbygtLjUqdSt6eSpmLC0uNSpmLXp5KnUpLHQuY2xvc2VQYXRoKCl9fSxVeT1bbXkseHksQXksa3ksRXksUHksRHldO2Z1bmN0aW9uIHF5KCl7fWZ1bmN0aW9uIE95KHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBZeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gQnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEZ5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBJeSh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBZeSh0KSx0aGlzLl9iZXRhPW59WXkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpPeSh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sQnkucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9bix0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzYpO2JyZWFrO2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBlPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYscj0odGhpcy5feTArNCp0aGlzLl95MStuKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8oZSxyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6T3kodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LEl5LnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aC0xO2lmKGU+MClmb3IodmFyIHIsaT10WzBdLG89blswXSxhPXRbZV0taSx1PW5bZV0tbyxmPS0xOysrZjw9ZTspcj1mL2UsdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2ZdKygxLXRoaXMuX2JldGEpKihpK3IqYSksdGhpcy5fYmV0YSpuW2ZdKygxLXRoaXMuX2JldGEpKihvK3IqdSkpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrbil9fTt2YXIgSHk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxPT09bj9uZXcgWXkodCk6bmV3IEl5KHQsbil9cmV0dXJuIGUuYmV0YT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC44NSk7ZnVuY3Rpb24gankodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBYeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9WHkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOmp5KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEd5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFh5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFZ5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1WeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciAkeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBWeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBXeSh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9V3kucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6ankodGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBaeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBXeSh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtmdW5jdGlvbiBReSh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLGE9dC5feTI7aWYodC5fbDAxX2E+Rmcpe3ZhciB1PTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGY9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqdS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9mLGk9KGkqdS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9mfWlmKHQuX2wyM19hPkZnKXt2YXIgYz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxzPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKmMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9zLGE9KGEqYyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL3N9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLGEsdC5feDIsdC5feTIpfWZ1bmN0aW9uIEp5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59SnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBLeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IEp5KHQsbik6bmV3IFh5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gdF8odCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn10Xy5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIG5fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgdF8odCxuKTpuZXcgVnkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBlXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWVfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpReSh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciByXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IGVfKHQsbik6bmV3IFd5KHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7ZnVuY3Rpb24gaV8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIG9fKHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBhXyh0LG4sZSl7dmFyIHI9dC5feDEtdC5feDAsaT1uLXQuX3gxLG89KHQuX3kxLXQuX3kwKS8ocnx8aTwwJiYtMCksYT0oZS10Ll95MSkvKGl8fHI8MCYmLTApLHU9KG8qaSthKnIpLyhyK2kpO3JldHVybihvXyhvKStvXyhhKSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnMoYSksLjUqTWF0aC5hYnModSkpfHwwfWZ1bmN0aW9uIHVfKHQsbil7dmFyIGU9dC5feDEtdC5feDA7cmV0dXJuIGU/KDMqKHQuX3kxLXQuX3kwKS9lLW4pLzI6bn1mdW5jdGlvbiBmXyh0LG4sZSl7dmFyIHI9dC5feDAsaT10Ll95MCxvPXQuX3gxLGE9dC5feTEsdT0oby1yKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyK3UsaSt1Km4sby11LGEtdSplLG8sYSl9ZnVuY3Rpb24gY18odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHNfKHQpe3RoaXMuX2NvbnRleHQ9bmV3IGxfKHQpfWZ1bmN0aW9uIGxfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBoXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZF8odCl7dmFyIG4sZSxyPXQubGVuZ3RoLTEsaT1uZXcgQXJyYXkociksbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocik7Zm9yKGlbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxuPTE7bjxyLTE7KytuKWlbbl09MSxvW25dPTQsYVtuXT00KnRbbl0rMip0W24rMV07Zm9yKGlbci0xXT0yLG9bci0xXT03LGFbci0xXT04KnRbci0xXSt0W3JdLG49MTtuPHI7KytuKWU9aVtuXS9vW24tMV0sb1tuXS09ZSxhW25dLT1lKmFbbi0xXTtmb3IoaVtyLTFdPWFbci0xXS9vW3ItMV0sbj1yLTI7bj49MDstLW4paVtuXT0oYVtuXS1pW24rMV0pL29bbl07Zm9yKG9bci0xXT0odFtyXStpW3ItMV0pLzIsbj0wO248ci0xOysrbilvW25dPTIqdFtuKzFdLWlbbisxXTtyZXR1cm5baSxvXX1mdW5jdGlvbiBwXyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl90PW59ZnVuY3Rpb24gdl8odCxuKXtpZigoaT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG89MSxhPXRbblswXV0sdT1hLmxlbmd0aDtvPGk7KytvKWZvcihyPWEsYT10W25bb11dLGU9MDtlPHU7KytlKWFbZV1bMV0rPWFbZV1bMF09aXNOYU4ocltlXVsxXSk/cltlXVswXTpyW2VdWzFdfWZ1bmN0aW9uIGdfKHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPW5ldyBBcnJheShuKTstLW4+PTA7KWVbbl09bjtyZXR1cm4gZX1mdW5jdGlvbiB5Xyh0LG4pe3JldHVybiB0W25dfWZ1bmN0aW9uIF9fKHQpe3ZhciBuPXQubWFwKGJfKTtyZXR1cm4gZ18odCkuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuW3RdLW5bZV19KX1mdW5jdGlvbiBiXyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9ZnVuY3Rpb24gbV8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHhfKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHdfKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIE1fKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gQV8odCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBUXyh0LG4pe3ZhciBlPW4scj1uLlIsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gTl8odCxuKXt2YXIgZT1uLHI9bi5MLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIFNfKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBFXyh0LG4sZSxyKXt2YXIgaT1bbnVsbCxudWxsXSxvPUpfLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1uLGUmJkNfKGksdCxuLGUpLHImJkNfKGksbix0LHIpLFpfW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLFpfW24uaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24ga18odCxuLGUpe3ZhciByPVtuLGVdO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIENfKHQsbixlLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09ZT90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PW4sdC5yaWdodD1lKX1mdW5jdGlvbiBQXyh0LG4sZSxyLGkpe3ZhciBvLGE9dFswXSx1PXRbMV0sZj1hWzBdLGM9YVsxXSxzPTAsbD0xLGg9dVswXS1mLGQ9dVsxXS1jO2lmKG89bi1mLGh8fCEobz4wKSl7aWYoby89aCxoPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGg+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89ci1mLGh8fCEobzwwKSl7aWYoby89aCxoPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGg+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWlmKG89ZS1jLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88cylyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWlmKG89aS1jLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+bClyZXR1cm47bz5zJiYocz1vKX1lbHNlIGlmKGQ+MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfXJldHVybiEocz4wfHxsPDEpfHwocz4wJiYodFswXT1bZitzKmgsYytzKmRdKSxsPDEmJih0WzFdPVtmK2wqaCxjK2wqZF0pLCEwKX19fX19ZnVuY3Rpb24gel8odCxuLGUscixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIGEsdSxmPXRbMF0sYz10LmxlZnQscz10LnJpZ2h0LGw9Y1swXSxoPWNbMV0sZD1zWzBdLHA9c1sxXSx2PShsK2QpLzIsZz0oaCtwKS8yO2lmKHA9PT1oKXtpZih2PG58fHY+PXIpcmV0dXJuO2lmKGw+ZCl7aWYoZil7aWYoZlsxXT49aSlyZXR1cm59ZWxzZSBmPVt2LGVdO289W3YsaV19ZWxzZXtpZihmKXtpZihmWzFdPGUpcmV0dXJufWVsc2UgZj1bdixpXTtvPVt2LGVdfX1lbHNlIGlmKHU9Zy0oYT0obC1kKS8ocC1oKSkqdixhPC0xfHxhPjEpaWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9WyhlLXUpL2EsZV07bz1bKGktdSkvYSxpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVsoaS11KS9hLGldO289WyhlLXUpL2EsZV19ZWxzZSBpZihoPHApe2lmKGYpe2lmKGZbMF0+PXIpcmV0dXJufWVsc2UgZj1bbixhKm4rdV07bz1bcixhKnIrdV19ZWxzZXtpZihmKXtpZihmWzBdPG4pcmV0dXJufWVsc2UgZj1bcixhKnIrdV07bz1bbixhKm4rdV19cmV0dXJuIHRbMF09Zix0WzFdPW8sITB9ZnVuY3Rpb24gUl8odCxuKXt2YXIgZT10LnNpdGUscj1uLmxlZnQsaT1uLnJpZ2h0O3JldHVybiBlPT09aSYmKGk9cixyPWUpLGk/TWF0aC5hdGFuMihpWzFdLXJbMV0saVswXS1yWzBdKTooZT09PXI/KHI9blsxXSxpPW5bMF0pOihyPW5bMF0saT1uWzFdKSxNYXRoLmF0YW4yKHJbMF0taVswXSxpWzFdLXJbMV0pKX1mdW5jdGlvbiBMXyh0LG4pe3JldHVybiBuWysobi5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gRF8odCxuKXtyZXR1cm4gblsrKG4ubGVmdD09PXQuc2l0ZSldfWlfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX0sY18ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOmZfKHRoaXMsdGhpcy5fdDAsdV8odGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1OYU47aWYobj0rbiwodD0rdCkhPT10aGlzLl94MXx8biE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLGZfKHRoaXMsdV8odGhpcyxlPWFfKHRoaXMsdCxuKSksZSk7YnJlYWs7ZGVmYXVsdDpmXyh0aGlzLHRoaXMuX3QwLGU9YV8odGhpcyx0LG4pKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW4sdGhpcy5fdDA9ZX19fSwoc18ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoY18ucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxuKXtjXy5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLG4sdCl9LGxfLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5tb3ZlVG8obix0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5saW5lVG8obix0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG4sdCxyLGUsbyxpKX19LGhfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGg7aWYoZSlpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sblswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxuWzBdKSwyPT09ZSl0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLG5bMV0pO2Vsc2UgZm9yKHZhciByPWRfKHQpLGk9ZF8obiksbz0wLGE9MTthPGU7KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oclswXVtvXSxpWzBdW29dLHJbMV1bb10saVsxXVtvXSx0W2FdLG5bYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PWUpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19LHBfLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19LE1fLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TV8saW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1TXyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOyllPT09KHI9ZS5VKS5MPyhpPXIuUikmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuUiYmKFRfKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLE5fKHRoaXMscikpOihpPXIuTCkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKE5fKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLFRfKHRoaXMscikpLGU9dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgbixlLHIsaT10LlUsbz10LkwsYT10LlI7aWYoZT1vP2E/U18oYSk6bzphLGk/aS5MPT09dD9pLkw9ZTppLlI9ZTp0aGlzLl89ZSxvJiZhPyhyPWUuQyxlLkM9dC5DLGUuTD1vLG8uVT1lLGUhPT1hPyhpPWUuVSxlLlU9dC5VLHQ9ZS5SLGkuTD10LGUuUj1hLGEuVT1lKTooZS5VPWksaT1lLHQ9ZS5SKSk6KHI9dC5DLHQ9ZSksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigobj1pLlIpLkMmJihuLkM9ITEsaS5DPSEwLFRfKHRoaXMsaSksbj1pLlIpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uUiYmbi5SLkN8fChuLkwuQz0hMSxuLkM9ITAsTl8odGhpcyxuKSxuPWkuUiksbi5DPWkuQyxpLkM9bi5SLkM9ITEsVF8odGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigobj1pLkwpLkMmJihuLkM9ITEsaS5DPSEwLE5fKHRoaXMsaSksbj1pLkwpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uTCYmbi5MLkN8fChuLlIuQz0hMSxuLkM9ITAsVF8odGhpcyxuKSxuPWkuTCksbi5DPWkuQyxpLkM9bi5MLkM9ITEsTl8odGhpcyxpKSx0PXRoaXMuXzticmVha31uLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBVXyxxXz1bXTtmdW5jdGlvbiBPXygpe0FfKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBZXyh0KXt2YXIgbj10LlAsZT10Lk47aWYobiYmZSl7dmFyIHI9bi5zaXRlLGk9dC5zaXRlLG89ZS5zaXRlO2lmKHIhPT1vKXt2YXIgYT1pWzBdLHU9aVsxXSxmPXJbMF0tYSxjPXJbMV0tdSxzPW9bMF0tYSxsPW9bMV0tdSxoPTIqKGYqbC1jKnMpO2lmKCEoaD49LXRiKSl7dmFyIGQ9ZipmK2MqYyxwPXMqcytsKmwsdj0obCpkLWMqcCkvaCxnPShmKnAtcypkKS9oLHk9cV8ucG9wKCl8fG5ldyBPXzt5LmFyYz10LHkuc2l0ZT1pLHkueD12K2EseS55PSh5LmN5PWcrdSkrTWF0aC5zcXJ0KHYqditnKmcpLHQuY2lyY2xlPXk7Zm9yKHZhciBfPW51bGwsYj1RXy5fO2I7KWlmKHkueTxiLnl8fHkueT09PWIueSYmeS54PD1iLngpe2lmKCFiLkwpe189Yi5QO2JyZWFrfWI9Yi5MfWVsc2V7aWYoIWIuUil7Xz1iO2JyZWFrfWI9Yi5SfVFfLmluc2VydChfLHkpLF98fChVXz15KX19fX1mdW5jdGlvbiBCXyh0KXt2YXIgbj10LmNpcmNsZTtuJiYobi5QfHwoVV89bi5OKSxRXy5yZW1vdmUobikscV8ucHVzaChuKSxBXyhuKSx0LmNpcmNsZT1udWxsKX12YXIgRl89W107ZnVuY3Rpb24gSV8oKXtBXyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gSF8odCl7dmFyIG49Rl8ucG9wKCl8fG5ldyBJXztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiBqXyh0KXtCXyh0KSxXXy5yZW1vdmUodCksRl8ucHVzaCh0KSxBXyh0KX1mdW5jdGlvbiBYXyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCxhPXQuTix1PVt0XTtqXyh0KTtmb3IodmFyIGY9bztmLmNpcmNsZSYmTWF0aC5hYnMoZS1mLmNpcmNsZS54KTxLXyYmTWF0aC5hYnMoci1mLmNpcmNsZS5jeSk8S187KW89Zi5QLHUudW5zaGlmdChmKSxqXyhmKSxmPW87dS51bnNoaWZ0KGYpLEJfKGYpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhlLWMuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWMuY2lyY2xlLmN5KTxLXzspYT1jLk4sdS5wdXNoKGMpLGpfKGMpLGM9YTt1LnB1c2goYyksQl8oYyk7dmFyIHMsbD11Lmxlbmd0aDtmb3Iocz0xO3M8bDsrK3MpYz11W3NdLGY9dVtzLTFdLENfKGMuZWRnZSxmLnNpdGUsYy5zaXRlLGkpO2Y9dVswXSwoYz11W2wtMV0pLmVkZ2U9RV8oZi5zaXRlLGMuc2l0ZSxudWxsLGkpLFlfKGYpLFlfKGMpfWZ1bmN0aW9uIEdfKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sYT10WzFdLHU9V18uXzt1OylpZigocj1WXyh1LGEpLW8pPktfKXU9dS5MO2Vsc2V7aWYoISgoaT1vLSRfKHUsYSkpPktfKSl7cj4tS18/KG49dS5QLGU9dSk6aT4tS18/KG49dSxlPXUuTik6bj1lPXU7YnJlYWt9aWYoIXUuUil7bj11O2JyZWFrfXU9dS5SfSFmdW5jdGlvbih0KXtaX1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KHQpO3ZhciBmPUhfKHQpO2lmKFdfLmluc2VydChuLGYpLG58fGUpe2lmKG49PT1lKXJldHVybiBCXyhuKSxlPUhfKG4uc2l0ZSksV18uaW5zZXJ0KGYsZSksZi5lZGdlPWUuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKSxZXyhuKSx2b2lkIFlfKGUpO2lmKGUpe0JfKG4pLEJfKGUpO3ZhciBjPW4uc2l0ZSxzPWNbMF0sbD1jWzFdLGg9dFswXS1zLGQ9dFsxXS1sLHA9ZS5zaXRlLHY9cFswXS1zLGc9cFsxXS1sLHk9MiooaCpnLWQqdiksXz1oKmgrZCpkLGI9dip2K2cqZyxtPVsoZypfLWQqYikveStzLChoKmItdipfKS95K2xdO0NfKGUuZWRnZSxjLHAsbSksZi5lZGdlPUVfKGMsdCxudWxsLG0pLGUuZWRnZT1FXyh0LHAsbnVsbCxtKSxZXyhuKSxZXyhlKX1lbHNlIGYuZWRnZT1FXyhuLnNpdGUsZi5zaXRlKX19ZnVuY3Rpb24gVl8odCxuKXt2YXIgZT10LnNpdGUscj1lWzBdLGk9ZVsxXSxvPWktbjtpZighbylyZXR1cm4gcjt2YXIgYT10LlA7aWYoIWEpcmV0dXJuLTEvMDt2YXIgdT0oZT1hLnNpdGUpWzBdLGY9ZVsxXSxjPWYtbjtpZighYylyZXR1cm4gdTt2YXIgcz11LXIsbD0xL28tMS9jLGg9cy9jO3JldHVybiBsPygtaCtNYXRoLnNxcnQoaCpoLTIqbCoocypzLygtMipjKS1mK2MvMitpLW8vMikpKS9sK3I6KHIrdSkvMn1mdW5jdGlvbiAkXyh0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiBWXyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9dmFyIFdfLFpfLFFfLEpfLEtfPTFlLTYsdGI9MWUtMTI7ZnVuY3Rpb24gbmIodCxuKXtyZXR1cm4gblsxXS10WzFdfHxuWzBdLXRbMF19ZnVuY3Rpb24gZWIodCxuKXt2YXIgZSxyLGksbz10LnNvcnQobmIpLnBvcCgpO2ZvcihKXz1bXSxaXz1uZXcgQXJyYXkodC5sZW5ndGgpLFdfPW5ldyBNXyxRXz1uZXcgTV87OylpZihpPVVfLG8mJighaXx8b1sxXTxpLnl8fG9bMV09PT1pLnkmJm9bMF08aS54KSlvWzBdPT09ZSYmb1sxXT09PXJ8fChHXyhvKSxlPW9bMF0scj1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztYXyhpLmFyYyl9aWYoZnVuY3Rpb24oKXtmb3IodmFyIHQsbixlLHIsaT0wLG89Wl8ubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9Wl9baV0pJiYocj0obj10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxyOysrZSlhW2VdPWUsdVtlXT1SXyh0LEpfW25bZV1dKTtmb3IoYS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHVbbl0tdVt0XX0pLGU9MDtlPHI7KytlKXVbZV09blthW2VdXTtmb3IoZT0wO2U8cjsrK2UpbltlXT11W2VdfX0oKSxuKXt2YXIgYT0rblswXVswXSx1PStuWzBdWzFdLGY9K25bMV1bMF0sYz0rblsxXVsxXTshZnVuY3Rpb24odCxuLGUscil7Zm9yKHZhciBpLG89Sl8ubGVuZ3RoO28tLTspel8oaT1KX1tvXSx0LG4sZSxyKSYmUF8oaSx0LG4sZSxyKSYmKE1hdGguYWJzKGlbMF1bMF0taVsxXVswXSk+S198fE1hdGguYWJzKGlbMF1bMV0taVsxXVsxXSk+S18pfHxkZWxldGUgSl9bb119KGEsdSxmLGMpLGZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sYSx1LGYsYyxzLGwsaCxkLHAsdixnPVpfLmxlbmd0aCx5PSEwO2ZvcihpPTA7aTxnOysraSlpZihvPVpfW2ldKXtmb3IoYT1vLnNpdGUsdT0oZj1vLmhhbGZlZGdlcykubGVuZ3RoO3UtLTspSl9bZlt1XV18fGYuc3BsaWNlKHUsMSk7Zm9yKHU9MCxjPWYubGVuZ3RoO3U8YzspcD0oZD1EXyhvLEpfW2ZbdV1dKSlbMF0sdj1kWzFdLGw9KHM9TF8obyxKX1tmWysrdSVjXV0pKVswXSxoPXNbMV0sKE1hdGguYWJzKHAtbCk+S198fE1hdGguYWJzKHYtaCk+S18pJiYoZi5zcGxpY2UodSwwLEpfLnB1c2goa18oYSxkLE1hdGguYWJzKHAtdCk8S18mJnItdj5LXz9bdCxNYXRoLmFicyhsLXQpPEtfP2g6cl06TWF0aC5hYnModi1yKTxLXyYmZS1wPktfP1tNYXRoLmFicyhoLXIpPEtfP2w6ZSxyXTpNYXRoLmFicyhwLWUpPEtfJiZ2LW4+S18/W2UsTWF0aC5hYnMobC1lKTxLXz9oOm5dOk1hdGguYWJzKHYtbik8S18mJnAtdD5LXz9bTWF0aC5hYnMoaC1uKTxLXz9sOnQsbl06bnVsbCkpLTEpLCsrYyk7YyYmKHk9ITEpfWlmKHkpe3ZhciBfLGIsbSx4PTEvMDtmb3IoaT0wLHk9bnVsbDtpPGc7KytpKShvPVpfW2ldKSYmKG09KF89KGE9by5zaXRlKVswXS10KSpfKyhiPWFbMV0tbikqYik8eCYmKHg9bSx5PW8pO2lmKHkpe3ZhciB3PVt0LG5dLE09W3Qscl0sQT1bZSxyXSxUPVtlLG5dO3kuaGFsZmVkZ2VzLnB1c2goSl8ucHVzaChrXyhhPXkuc2l0ZSx3LE0pKS0xLEpfLnB1c2goa18oYSxNLEEpKS0xLEpfLnB1c2goa18oYSxBLFQpKS0xLEpfLnB1c2goa18oYSxULHcpKS0xKX19Zm9yKGk9MDtpPGc7KytpKShvPVpfW2ldKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIFpfW2ldKX0oYSx1LGYsYyl9dGhpcy5lZGdlcz1KXyx0aGlzLmNlbGxzPVpfLFdfPVFfPUpfPVpfPW51bGx9ZnVuY3Rpb24gcmIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGliKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMudHJhbnNmb3JtPWV9ZnVuY3Rpb24gb2IodCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWViLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZWIscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihuKXt2YXIgZT1uLmhhbGZlZGdlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIExfKG4sdFtlXSl9KTtyZXR1cm4gZS5kYXRhPW4uc2l0ZS5kYXRhLGV9KX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sbj10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvPShpPWUuaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8sYSx1LGYsYyxzPWUuc2l0ZSxsPS0xLGg9bltpW28tMV1dLGQ9aC5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdDsrK2w8bzspYT1kLGQ9KGg9bltpW2xdXSkubGVmdD09PXM/aC5yaWdodDpoLmxlZnQsYSYmZCYmcjxhLmluZGV4JiZyPGQuaW5kZXgmJihmPWEsYz1kLCgodT1zKVswXS1jWzBdKSooZlsxXS11WzFdKS0odVswXS1mWzBdKSooY1sxXS11WzFdKTwwKSYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLGQuZGF0YV0pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pfSxmaW5kOmZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPXRoaXMsYT1vLl9mb3VuZHx8MCx1PW8uY2VsbHMubGVuZ3RoOyEoaT1vLmNlbGxzW2FdKTspaWYoKythPj11KXJldHVybiBudWxsO3ZhciBmPXQtaS5zaXRlWzBdLGM9bi1pLnNpdGVbMV0scz1mKmYrYypjO2Rve2k9by5jZWxsc1tyPWFdLGE9bnVsbCxpLmhhbGZlZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciByPW8uZWRnZXNbZV0sdT1yLmxlZnQ7aWYodSE9PWkuc2l0ZSYmdXx8KHU9ci5yaWdodCkpe3ZhciBmPXQtdVswXSxjPW4tdVsxXSxsPWYqZitjKmM7bDxzJiYocz1sLGE9dS5pbmRleCl9fSl9d2hpbGUobnVsbCE9PWEpO3JldHVybiBvLl9mb3VuZD1yLG51bGw9PWV8fHM8PWUqZT9pLnNpdGU6bnVsbH19LG9iLnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2Isc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IG9iKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gMD09PXQmMD09PW4/dGhpczpuZXcgb2IodGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKm4pfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIgYWI9bmV3IG9iKDEsMCwwKTtmdW5jdGlvbiB1Yih0KXtyZXR1cm4gdC5fX3pvb218fGFifWZ1bmN0aW9uIGZiKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBjYigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHNiKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIGxiKCl7dmFyIHQsbixlPXRoaXM7cmV0dXJuIGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PShlPWUub3duZXJTVkdFbGVtZW50fHxlKS53aWR0aC5iYXNlVmFsLnZhbHVlLG49ZS5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9ZS5jbGllbnRXaWR0aCxuPWUuY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3Qsbl1dfWZ1bmN0aW9uIGhiKCl7cmV0dXJuIHRoaXMuX196b29tfHxhYn1mdW5jdGlvbiBkYigpe3JldHVybi10LmV2ZW50LmRlbHRhWSoodC5ldmVudC5kZWx0YU1vZGU/MTIwOjEpLzUwMH1mdW5jdGlvbiBwYigpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB2Yih0LG4sZSl7dmFyIHI9dC5pbnZlcnRYKG5bMF1bMF0pLWVbMF1bMF0saT10LmludmVydFgoblsxXVswXSktZVsxXVswXSxvPXQuaW52ZXJ0WShuWzBdWzFdKS1lWzBdWzFdLGE9dC5pbnZlcnRZKG5bMV1bMV0pLWVbMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKGk+cj8ocitpKS8yOk1hdGgubWluKDAscil8fE1hdGgubWF4KDAsaSksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9dWIucHJvdG90eXBlPW9iLnByb3RvdHlwZSx0LnZlcnNpb249IjUuNy4wIix0LmJpc2VjdD1pLHQuYmlzZWN0UmlnaHQ9aSx0LmJpc2VjdExlZnQ9byx0LmFzY2VuZGluZz1uLHQuYmlzZWN0b3I9ZSx0LmNyb3NzPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sdSxmPXQubGVuZ3RoLGM9bi5sZW5ndGgscz1uZXcgQXJyYXkoZipjKTtmb3IobnVsbD09ZSYmKGU9YSkscj1vPTA7cjxmOysrcilmb3IodT10W3JdLGk9MDtpPGM7KytpLCsrbylzW29dPWUodSxuW2ldKTtyZXR1cm4gc30sdC5kZXNjZW5kaW5nPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfSx0LmRldmlhdGlvbj1jLHQuZXh0ZW50PXMsdC5oaXN0b2dyYW09ZnVuY3Rpb24oKXt2YXIgdD12LG49cyxlPU07ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHU9ci5sZW5ndGgsZj1uZXcgQXJyYXkodSk7Zm9yKG89MDtvPHU7KytvKWZbb109dChyW29dLG8scik7dmFyIGM9bihmKSxzPWNbMF0sbD1jWzFdLGg9ZShmLHMsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9dyhzLGwsaCksaD1nKE1hdGguY2VpbChzL2gpKmgsbCxoKSk7Zm9yKHZhciBkPWgubGVuZ3RoO2hbMF08PXM7KWguc2hpZnQoKSwtLWQ7Zm9yKDtoW2QtMV0+bDspaC5wb3AoKSwtLWQ7dmFyIHAsdj1uZXcgQXJyYXkoZCsxKTtmb3Iobz0wO288PWQ7KytvKShwPXZbb109W10pLngwPW8+MD9oW28tMV06cyxwLngxPW88ZD9oW29dOmw7Zm9yKG89MDtvPHU7KytvKXM8PShhPWZbb10pJiZhPD1sJiZ2W2koaCxhLDAsZCldLnB1c2gocltvXSk7cmV0dXJuIHZ9cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpwKG4pLHIpOnR9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cChbdFswXSx0WzFdXSkscik6bn0sci50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9wKGguY2FsbCh0KSk6cCh0KSxyKTplfSxyfSx0LnRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PWQuY2FsbCh0LHUpLnNvcnQobiksTWF0aC5jZWlsKChyLWUpLygyKihBKHQsLjc1KS1BKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTY290dD1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIE1hdGguY2VpbCgoZS1uKS8oMy41KmModCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdC50aHJlc2hvbGRTdHVyZ2VzPU0sdC5tYXg9VCx0Lm1lYW49ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9cixvPS0xLGE9MDtpZihudWxsPT1uKWZvcig7KytvPHI7KWlzTmFOKGU9dSh0W29dKSk/LS1pOmErPWU7ZWxzZSBmb3IoOysrbzxyOylpc05hTihlPXUobih0W29dLG8sdCkpKT8tLWk6YSs9ZTtpZihpKXJldHVybiBhL2l9LHQubWVkaWFuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsaT10Lmxlbmd0aCxvPS0xLGE9W107aWYobnVsbD09ZSlmb3IoOysrbzxpOylpc05hTihyPXUodFtvXSkpfHxhLnB1c2gocik7ZWxzZSBmb3IoOysrbzxpOylpc05hTihyPXUoZSh0W29dLG8sdCkpKXx8YS5wdXNoKHIpO3JldHVybiBBKGEuc29ydChuKSwuNSl9LHQubWVyZ2U9Tix0Lm1pbj1TLHQucGFpcnM9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1hKTtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLTEsaT10WzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT1uKGksaT10WysrZV0pO3JldHVybiBvfSx0LnBlcm11dGU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbbltlXV07cmV0dXJuIHJ9LHQucXVhbnRpbGU9QSx0LnJhbmdlPWcsdC5zY2FuPWZ1bmN0aW9uKHQsZSl7aWYocj10Lmxlbmd0aCl7dmFyIHIsaSxvPTAsYT0wLHU9dFthXTtmb3IobnVsbD09ZSYmKGU9bik7KytvPHI7KShlKGk9dFtvXSx1KTwwfHwwIT09ZSh1LHUpKSYmKHU9aSxhPW8pO3JldHVybiAwPT09ZSh1LHUpP2E6dm9pZCAwfX0sdC5zaHVmZmxlPWZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIHIsaSxvPShudWxsPT1lP3QubGVuZ3RoOmUpLShuPW51bGw9PW4/MDorbik7bzspaT1NYXRoLnJhbmRvbSgpKm8tLXwwLHI9dFtvK25dLHRbbytuXT10W2krbl0sdFtpK25dPXI7cmV0dXJuIHR9LHQuc3VtPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10Lmxlbmd0aCxpPS0xLG89MDtpZihudWxsPT1uKWZvcig7KytpPHI7KShlPSt0W2ldKSYmKG8rPWUpO2Vsc2UgZm9yKDsrK2k8cjspKGU9K24odFtpXSxpLHQpKSYmKG8rPWUpO3JldHVybiBvfSx0LnRpY2tzPW0sdC50aWNrSW5jcmVtZW50PXgsdC50aWNrU3RlcD13LHQudHJhbnNwb3NlPUUsdC52YXJpYW5jZT1mLHQuemlwPWZ1bmN0aW9uKCl7cmV0dXJuIEUoYXJndW1lbnRzKX0sdC5heGlzVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBCKHosdCl9LHQuYXhpc1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBCKFIsdCl9LHQuYXhpc0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gQihMLHQpfSx0LmF4aXNMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBCKEQsdCl9LHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gUmkod2kpfSx0LmJydXNoWD1mdW5jdGlvbigpe3JldHVybiBSaShtaSl9LHQuYnJ1c2hZPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKHhpKX0sdC5icnVzaFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfSx0LmNob3JkPWZ1bmN0aW9uKCl7dmFyIHQ9MCxuPW51bGwsZT1udWxsLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBvLGEsdSxmLGMscyxsPWkubGVuZ3RoLGg9W10sZD1nKGwpLHA9W10sdj1bXSx5PXYuZ3JvdXBzPW5ldyBBcnJheShsKSxfPW5ldyBBcnJheShsKmwpO2ZvcihvPTAsYz0tMTsrK2M8bDspe2ZvcihhPTAscz0tMTsrK3M8bDspYSs9aVtjXVtzXTtoLnB1c2goYSkscC5wdXNoKGcobCkpLG8rPWF9Zm9yKG4mJmQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKGhbdF0saFtlXSl9KSxlJiZwLmZvckVhY2goZnVuY3Rpb24odCxuKXt0LnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gZShpW25dW3RdLGlbbl1bcl0pfSl9KSxmPShvPVlpKDAsT2ktdCpsKS9vKT90Ok9pL2wsYT0wLGM9LTE7KytjPGw7KXtmb3IodT1hLHM9LTE7KytzPGw7KXt2YXIgYj1kW2NdLG09cFtiXVtzXSx4PWlbYl1bbV0sdz1hLE09YSs9eCpvO19bbSpsK2JdPXtpbmRleDpiLHN1YmluZGV4Om0sc3RhcnRBbmdsZTp3LGVuZEFuZ2xlOk0sdmFsdWU6eH19eVtiXT17aW5kZXg6YixzdGFydEFuZ2xlOnUsZW5kQW5nbGU6YSx2YWx1ZTpoW2JdfSxhKz1mfWZvcihjPS0xOysrYzxsOylmb3Iocz1jLTE7KytzPGw7KXt2YXIgQT1fW3MqbCtjXSxUPV9bYypsK3NdOyhBLnZhbHVlfHxULnZhbHVlKSYmdi5wdXNoKEEudmFsdWU8VC52YWx1ZT97c291cmNlOlQsdGFyZ2V0OkF9Ontzb3VyY2U6QSx0YXJnZXQ6VH0pfXJldHVybiByP3Yuc29ydChyKTp2fXJldHVybiBpLnBhZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVlpKDAsbiksaSk6dH0saS5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSk6bn0saS5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSk6ZX0saS5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bnVsbDoobj10LHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0LnNvdXJjZS52YWx1ZSt0LnRhcmdldC52YWx1ZSxlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSl9KS5fPXQsaSk6ciYmci5fO3ZhciBufSxpfSx0LnJpYmJvbj1mdW5jdGlvbigpe3ZhciB0PVZpLG49JGksZT1XaSxyPVppLGk9UWksbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSx1PUJpLmNhbGwoYXJndW1lbnRzKSxmPXQuYXBwbHkodGhpcyx1KSxjPW4uYXBwbHkodGhpcyx1KSxzPStlLmFwcGx5KHRoaXMsKHVbMF09Zix1KSksbD1yLmFwcGx5KHRoaXMsdSktcWksaD1pLmFwcGx5KHRoaXMsdSktcWksZD1zKkxpKGwpLHA9cypEaShsKSx2PStlLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksZz1yLmFwcGx5KHRoaXMsdSktcWkseT1pLmFwcGx5KHRoaXMsdSktcWk7aWYob3x8KG89YT1HaSgpKSxvLm1vdmVUbyhkLHApLG8uYXJjKDAsMCxzLGwsaCksbD09PWcmJmg9PT15fHwoby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KkxpKGcpLHYqRGkoZykpLG8uYXJjKDAsMCx2LGcseSkpLG8ucXVhZHJhdGljQ3VydmVUbygwLDAsZCxwKSxvLmNsb3NlUGF0aCgpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGaSgrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTppfSxhLnNvdXJjZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGEpOnR9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9LHQubmVzdD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPVtdLGk9W107ZnVuY3Rpb24gbyhlLGksYSx1KXtpZihpPj1yLmxlbmd0aClyZXR1cm4gbnVsbCE9dCYmZS5zb3J0KHQpLG51bGwhPW4/bihlKTplO2Zvcih2YXIgZixjLHMsbD0tMSxoPWUubGVuZ3RoLGQ9cltpKytdLHA9S2koKSx2PWEoKTsrK2w8aDspKHM9cC5nZXQoZj1kKGM9ZVtsXSkrIiIpKT9zLnB1c2goYyk6cC5zZXQoZixbY10pO3JldHVybiBwLmVhY2goZnVuY3Rpb24odCxuKXt1KHYsbixvKHQsaSxhLHUpKX0pLHZ9cmV0dXJuIGU9e29iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsdG8sbm8pfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLGVvLHJvKX0sZW50cmllczpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gdChlLG8pe2lmKCsrbz5yLmxlbmd0aClyZXR1cm4gZTt2YXIgYSx1PWlbby0xXTtyZXR1cm4gbnVsbCE9biYmbz49ci5sZW5ndGg/YT1lLmVudHJpZXMoKTooYT1bXSxlLmVhY2goZnVuY3Rpb24obixlKXthLnB1c2goe2tleTplLHZhbHVlczp0KG4sbyl9KX0pKSxudWxsIT11P2Euc29ydChmdW5jdGlvbih0LG4pe3JldHVybiB1KHQua2V5LG4ua2V5KX0pOmF9KG8odCwwLGVvLHJvKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiByLnB1c2godCksZX0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGlbci5sZW5ndGgtMV09dCxlfSxzb3J0VmFsdWVzOmZ1bmN0aW9uKG4pe3JldHVybiB0PW4sZX0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBuPXQsZX19fSx0LnNldD1hbyx0Lm1hcD1LaSx0LmtleXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKGUpO3JldHVybiBufSx0LnZhbHVlcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2godFtlXSk7cmV0dXJuIG59LHQuZW50cmllcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goe2tleTplLHZhbHVlOnRbZV19KTtyZXR1cm4gbn0sdC5jb2xvcj12bix0LnJnYj1ibix0LmhzbD1Nbix0LmxhYj1Vbix0LmhjbD1Ibix0LmxjaD1mdW5jdGlvbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/SW4odCk6bmV3IGpuKGUsbix0LG51bGw9PXI/MTpyKX0sdC5ncmF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBxbih0LDAsMCxudWxsPT1uPzE6bil9LHQuY3ViZWhlbGl4PUtuLHQuY29udG91cnM9Z28sdC5jb250b3VyRGVuc2l0eT1mdW5jdGlvbigpe3ZhciB0PWJvLG49bW8sZT14byxyPTk2MCxpPTUwMCxvPTIwLGE9Mix1PTMqbyxmPXIrMip1Pj5hLGM9aSsyKnU+PmEscz1jbygyMCk7ZnVuY3Rpb24gbChyKXt2YXIgaT1uZXcgRmxvYXQzMkFycmF5KGYqYyksbD1uZXcgRmxvYXQzMkFycmF5KGYqYyk7ci5mb3JFYWNoKGZ1bmN0aW9uKHIsbyxzKXt2YXIgbD0rdChyLG8scykrdT4+YSxoPStuKHIsbyxzKSt1Pj5hLGQ9K2UocixvLHMpO2w+PTAmJmw8ZiYmaD49MCYmaDxjJiYoaVtsK2gqZl0rPWQpfSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSk7dmFyIGQ9cyhpKTtpZighQXJyYXkuaXNBcnJheShkKSl7dmFyIHA9VChpKTtkPXcoMCxwLGQpLChkPWcoMCxNYXRoLmZsb29yKHAvZCkqZCxkKSkuc2hpZnQoKX1yZXR1cm4gZ28oKS50aHJlc2hvbGRzKGQpLnNpemUoW2YsY10pKGkpLm1hcChoKX1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnZhbHVlKj1NYXRoLnBvdygyLC0yKmEpLHQuY29vcmRpbmF0ZXMuZm9yRWFjaChkKSx0fWZ1bmN0aW9uIGQodCl7dC5mb3JFYWNoKHApfWZ1bmN0aW9uIHAodCl7dC5mb3JFYWNoKHYpfWZ1bmN0aW9uIHYodCl7dFswXT10WzBdKk1hdGgucG93KDIsYSktdSx0WzFdPXRbMV0qTWF0aC5wb3coMixhKS11fWZ1bmN0aW9uIHkoKXtyZXR1cm4gZj1yKzIqKHU9MypvKT4+YSxjPWkrMip1Pj5hLGx9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmNvKCtuKSxsKTp0fSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6bn0sbC53ZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjbygrdCksbCk6ZX0sbC5zaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltyLGldO3ZhciBuPU1hdGguY2VpbCh0WzBdKSxlPU1hdGguY2VpbCh0WzFdKTtpZighKG4+PTB8fG4+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHI9bixpPWUseSgpfSxsLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikseSgpfSxsLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGwpOnN9LGwuYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz1NYXRoLnJvdW5kKChNYXRoLnNxcnQoNCp0KnQrMSktMSkvMikseSgpfSxsfSx0LmRpc3BhdGNoPUksdC5kcmFnPWZ1bmN0aW9uKCl7dmFyIG4sZSxyLGksbz1XdCxhPVp0LHU9UXQsZj1KdCxjPXt9LHM9SSgic3RhcnQiLCJkcmFnIiwiZW5kIiksbD0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIoZikub24oInRvdWNoc3RhcnQuZHJhZyIseSkub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixiKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHU9bSgibW91c2UiLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpLEZ0LHRoaXMsYXJndW1lbnRzKTt1JiYoRHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHYsITApLm9uKCJtb3VzZXVwLmRyYWciLGcsITApLFh0KHQuZXZlbnQudmlldyksSHQoKSxyPSExLG49dC5ldmVudC5jbGllbnRYLGU9dC5ldmVudC5jbGllbnRZLHUoInN0YXJ0IikpfX1mdW5jdGlvbiB2KCl7aWYoanQoKSwhcil7dmFyIGk9dC5ldmVudC5jbGllbnRYLW4sbz10LmV2ZW50LmNsaWVudFktZTtyPWkqaStvKm8+aH1jLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gZygpe0R0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksR3QodC5ldmVudC52aWV3LHIpLGp0KCksYy5tb3VzZSgiZW5kIil9ZnVuY3Rpb24geSgpe2lmKG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5sZW5ndGg7Zm9yKG49MDtuPHU7KytuKShlPW0ocltuXS5pZGVudGlmaWVyLGksSXQsdGhpcyxhcmd1bWVudHMpKSYmKEh0KCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT1jW3Jbbl0uaWRlbnRpZmllcl0pJiYoanQoKSxlKCJkcmFnIikpfWZ1bmN0aW9uIGIoKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxvPXIubGVuZ3RoO2ZvcihpJiZjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aT1udWxsfSw1MDApLG49MDtuPG87KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihIdCgpLGUoImVuZCIpKX1mdW5jdGlvbiBtKG4sZSxyLGksbyl7dmFyIGEsZixoLHA9cihlLG4pLHY9cy5jb3B5KCk7aWYoQ3QobmV3ICR0KGQsImJlZm9yZXN0YXJ0IixhLG4sbCxwWzBdLHBbMV0sMCwwLHYpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPSh0LmV2ZW50LnN1YmplY3Q9YT11LmFwcGx5KGksbykpJiYoZj1hLngtcFswXXx8MCxoPWEueS1wWzFdfHwwLCEwKX0pKXJldHVybiBmdW5jdGlvbiB0KHUpe3ZhciBzLGc9cDtzd2l0Y2godSl7Y2FzZSJzdGFydCI6Y1tuXT10LHM9bCsrO2JyZWFrO2Nhc2UiZW5kIjpkZWxldGUgY1tuXSwtLWw7Y2FzZSJkcmFnIjpwPXIoZSxuKSxzPWx9Q3QobmV3ICR0KGQsdSxhLG4scyxwWzBdK2YscFsxXStoLHBbMF0tZ1swXSxwWzFdLWdbMV0sdiksdi5hcHBseSx2LFt1LGksb10pfX1yZXR1cm4gZC5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOm99LGQuY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6YX0sZC5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VnQodCksZCk6dX0sZC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCghIXQpLGQpOmZ9LGQub249ZnVuY3Rpb24oKXt2YXIgdD1zLm9uLmFwcGx5KHMsYXJndW1lbnRzKTtyZXR1cm4gdD09PXM/ZDp0fSxkLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9KHQ9K3QpKnQsZCk6TWF0aC5zcXJ0KGgpfSxkfSx0LmRyYWdEaXNhYmxlPVh0LHQuZHJhZ0VuYWJsZT1HdCx0LmRzdkZvcm1hdD1Fbyx0LmNzdlBhcnNlPUNvLHQuY3N2UGFyc2VSb3dzPVBvLHQuY3N2Rm9ybWF0PXpvLHQuY3N2Rm9ybWF0Um93cz1Sbyx0LnRzdlBhcnNlPURvLHQudHN2UGFyc2VSb3dzPVVvLHQudHN2Rm9ybWF0PXFvLHQudHN2Rm9ybWF0Um93cz1Pbyx0LmVhc2VMaW5lYXI9ZnVuY3Rpb24odCl7cmV0dXJuK3R9LHQuZWFzZVF1YWQ9RHIsdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHQuZWFzZVF1YWRJbk91dD1Ecix0LmVhc2VDdWJpYz1Vcix0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSx0LmVhc2VDdWJpY0luT3V0PVVyLHQuZWFzZVBvbHk9WXIsdC5lYXNlUG9seUluPXFyLHQuZWFzZVBvbHlPdXQ9T3IsdC5lYXNlUG9seUluT3V0PVlyLHQuZWFzZVNpbj1Jcix0LmVhc2VTaW5Jbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KkZyKX0sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KkZyKX0sdC5lYXNlU2luSW5PdXQ9SXIsdC5lYXNlRXhwPUhyLHQuZWFzZUV4cEluPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfSx0LmVhc2VFeHBPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LHQuZWFzZUV4cEluT3V0PUhyLHQuZWFzZUNpcmNsZT1qcix0LmVhc2VDaXJjbGVJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSx0LmVhc2VDaXJjbGVPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LHQuZWFzZUNpcmNsZUluT3V0PWpyLHQuZWFzZUJvdW5jZT1uaSx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1uaSgxLXQpfSx0LmVhc2VCb3VuY2VPdXQ9bmksdC5lYXNlQm91bmNlSW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLW5pKDEtdCk6bmkodC0xKSsxKS8yfSx0LmVhc2VCYWNrPWlpLHQuZWFzZUJhY2tJbj1laSx0LmVhc2VCYWNrT3V0PXJpLHQuZWFzZUJhY2tJbk91dD1paSx0LmVhc2VFbGFzdGljPXVpLHQuZWFzZUVsYXN0aWNJbj1haSx0LmVhc2VFbGFzdGljT3V0PXVpLHQuZWFzZUVsYXN0aWNJbk91dD1maSx0LmJsb2I9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKFlvKX0sdC5idWZmZXI9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEJvKX0sdC5kc3Y9ZnVuY3Rpb24odCxuLGUscil7Mz09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9dm9pZCAwKTt2YXIgaT1Fbyh0KTtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBpLnBhcnNlKHQscil9KX0sdC5jc3Y9am8sdC50c3Y9WG8sdC5pbWFnZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3ZhciBpPW5ldyBJbWFnZTtmb3IodmFyIG8gaW4gbilpW29dPW5bb107aS5vbmVycm9yPXIsaS5vbmxvYWQ9ZnVuY3Rpb24oKXtlKGkpfSxpLnNyYz10fSl9LHQuanNvbj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oR28pfSx0LnRleHQ9SW8sdC54bWw9JG8sdC5odG1sPVdvLHQuc3ZnPVpvLHQuZm9yY2VDZW50ZXI9ZnVuY3Rpb24odCxuKXt2YXIgZTtmdW5jdGlvbiByKCl7dmFyIHIsaSxvPWUubGVuZ3RoLGE9MCx1PTA7Zm9yKHI9MDtyPG87KytyKWErPShpPWVbcl0pLngsdSs9aS55O2ZvcihhPWEvby10LHU9dS9vLW4scj0wO3I8bzsrK3IpKGk9ZVtyXSkueC09YSxpLnktPXV9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLHIuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXR9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0scn0sdC5mb3JjZUNvbGxpZGU9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPTEsaT0xO2Z1bmN0aW9uIG8oKXtmb3IodmFyIHQsbyx1LGYsYyxzLGwsaD1uLmxlbmd0aCxkPTA7ZDxpOysrZClmb3Iobz1yYShuLHVhLGZhKS52aXNpdEFmdGVyKGEpLHQ9MDt0PGg7Kyt0KXU9blt0XSxzPWVbdS5pbmRleF0sbD1zKnMsZj11LngrdS52eCxjPXUueSt1LnZ5LG8udmlzaXQocCk7ZnVuY3Rpb24gcCh0LG4sZSxpLG8pe3ZhciBhPXQuZGF0YSxoPXQucixkPXMraDtpZighYSlyZXR1cm4gbj5mK2R8fGk8Zi1kfHxlPmMrZHx8bzxjLWQ7aWYoYS5pbmRleD51LmluZGV4KXt2YXIgcD1mLWEueC1hLnZ4LHY9Yy1hLnktYS52eSxnPXAqcCt2KnY7ZzxkKmQmJigwPT09cCYmKGcrPShwPUpvKCkpKnApLDA9PT12JiYoZys9KHY9Sm8oKSkqdiksZz0oZC0oZz1NYXRoLnNxcnQoZykpKS9nKnIsdS52eCs9KHAqPWcpKihkPShoKj1oKS8obCtoKSksdS52eSs9KHYqPWcpKmQsYS52eC09cCooZD0xLWQpLGEudnktPXYqZCl9fX1mdW5jdGlvbiBhKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPWVbdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gdSgpe2lmKG4pe3ZhciByLGksbz1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1uW3JdLGVbaS5pbmRleF09K3QoaSxyLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8xOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCx1KCl9LG8uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxvKTppfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8ucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLHUoKSxvKTp0fSxvfSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGE9Y2EsdT1mdW5jdGlvbih0KXtyZXR1cm4gMS9NYXRoLm1pbihpW3Quc291cmNlLmluZGV4XSxpW3QudGFyZ2V0LmluZGV4XSl9LGY9UW8oMzApLGM9MTtmdW5jdGlvbiBzKHIpe2Zvcih2YXIgaT0wLGE9dC5sZW5ndGg7aTxjOysraSlmb3IodmFyIHUsZixzLGwsaCxkLHAsdj0wO3Y8YTsrK3YpZj0odT10W3ZdKS5zb3VyY2UsbD0ocz11LnRhcmdldCkueCtzLnZ4LWYueC1mLnZ4fHxKbygpLGg9cy55K3MudnktZi55LWYudnl8fEpvKCksbCo9ZD0oKGQ9TWF0aC5zcXJ0KGwqbCtoKmgpKS1lW3ZdKS9kKnIqblt2XSxoKj1kLHMudngtPWwqKHA9b1t2XSkscy52eS09aCpwLGYudngrPWwqKHA9MS1wKSxmLnZ5Kz1oKnB9ZnVuY3Rpb24gbCgpe2lmKHIpe3ZhciB1LGYsYz1yLmxlbmd0aCxzPXQubGVuZ3RoLGw9S2kocixhKTtmb3IodT0wLGk9bmV3IEFycmF5KGMpO3U8czsrK3UpKGY9dFt1XSkuaW5kZXg9dSwib2JqZWN0IiE9dHlwZW9mIGYuc291cmNlJiYoZi5zb3VyY2U9c2EobCxmLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgZi50YXJnZXQmJihmLnRhcmdldD1zYShsLGYudGFyZ2V0KSksaVtmLnNvdXJjZS5pbmRleF09KGlbZi5zb3VyY2UuaW5kZXhdfHwwKSsxLGlbZi50YXJnZXQuaW5kZXhdPShpW2YudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3IodT0wLG89bmV3IEFycmF5KHMpO3U8czsrK3UpZj10W3VdLG9bdV09aVtmLnNvdXJjZS5pbmRleF0vKGlbZi5zb3VyY2UuaW5kZXhdK2lbZi50YXJnZXQuaW5kZXhdKTtuPW5ldyBBcnJheShzKSxoKCksZT1uZXcgQXJyYXkocyksZCgpfX1mdW5jdGlvbiBoKCl7aWYocilmb3IodmFyIGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpbltlXT0rdSh0W2VdLGUsdCl9ZnVuY3Rpb24gZCgpe2lmKHIpZm9yKHZhciBuPTAsaT10Lmxlbmd0aDtuPGk7KytuKWVbbl09K2YodFtuXSxuLHQpfXJldHVybiBudWxsPT10JiYodD1bXSkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxsKCl9LHMubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixsKCkscyk6dH0scy5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LHMpOmF9LHMuaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxzKTpjfSxzLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGgoKSxzKTp1fSxzLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGQoKSxzKTpmfSxzfSx0LmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpPVFvKC0zMCksbz0xLGE9MS8wLHU9LjgxO2Z1bmN0aW9uIGYocil7dmFyIGksbz10Lmxlbmd0aCxhPXJhKHQsbGEsaGEpLnZpc2l0QWZ0ZXIocyk7Zm9yKGU9cixpPTA7aTxvOysraSluPXRbaV0sYS52aXNpdChsKX1mdW5jdGlvbiBjKCl7aWYodCl7dmFyIG4sZSxvPXQubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKSxuPTA7bjxvOysrbillPXRbbl0scltlLmluZGV4XT0raShlLG4sdCl9fWZ1bmN0aW9uIHModCl7dmFyIG4sZSxpLG8sYSx1PTAsZj0wO2lmKHQubGVuZ3RoKXtmb3IoaT1vPWE9MDthPDQ7KythKShuPXRbYV0pJiYoZT1NYXRoLmFicyhuLnZhbHVlKSkmJih1Kz1uLnZhbHVlLGYrPWUsaSs9ZSpuLngsbys9ZSpuLnkpO3QueD1pL2YsdC55PW8vZn1lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPXJbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIGwodCxpLGYsYyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIHM9dC54LW4ueCxsPXQueS1uLnksaD1jLWksZD1zKnMrbCpsO2lmKGgqaC91PGQpcmV0dXJuIGQ8YSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSxuLnZ4Kz1zKnQudmFsdWUqZS9kLG4udnkrPWwqdC52YWx1ZSplL2QpLCEwO2lmKCEodC5sZW5ndGh8fGQ+PWEpKXsodC5kYXRhIT09bnx8dC5uZXh0KSYmKDA9PT1zJiYoZCs9KHM9Sm8oKSkqcyksMD09PWwmJihkKz0obD1KbygpKSpsKSxkPG8mJihkPU1hdGguc3FydChvKmQpKSk7ZG97dC5kYXRhIT09biYmKGg9clt0LmRhdGEuaW5kZXhdKmUvZCxuLnZ4Kz1zKmgsbi52eSs9bCpoKX13aGlsZSh0PXQubmV4dCl9fXJldHVybiBmLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGMoKX0sZi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxjKCksZik6aX0sZi5kaXN0YW5jZU1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10KnQsZik6TWF0aC5zcXJ0KG8pfSxmLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQqdCxmKTpNYXRoLnNxcnQoYSl9LGYudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCp0LGYpOk1hdGguc3FydCh1KX0sZn0sdC5mb3JjZVJhZGlhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGE9UW8oLjEpO2Z1bmN0aW9uIHUodCl7Zm9yKHZhciBhPTAsdT1yLmxlbmd0aDthPHU7KythKXt2YXIgZj1yW2FdLGM9Zi54LW58fDFlLTYscz1mLnktZXx8MWUtNixsPU1hdGguc3FydChjKmMrcypzKSxoPShvW2FdLWwpKmlbYV0qdC9sO2YudngrPWMqaCxmLnZ5Kz1zKmh9fWZ1bmN0aW9uIGYoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilvW25dPSt0KHJbbl0sbixyKSxpW25dPWlzTmFOKG9bbl0pPzA6K2EocltuXSxuLHIpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8oK3QpKSxudWxsPT1uJiYobj0wKSxudWxsPT1lJiYoZT0wKSx1LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGYoKX0sdS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxmKCksdSk6YX0sdS5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksZigpLHUpOnR9LHUueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCx1KTpufSx1Lnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsdSk6ZX0sdX0sdC5mb3JjZVNpbXVsYXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZT0xLHI9LjAwMSxpPTEtTWF0aC5wb3cociwxLzMwMCksbz0wLGE9LjYsdT1LaSgpLGY9dXIocyksYz1JKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gcygpe2woKSxjLmNhbGwoInRpY2siLG4pLGU8ciYmKGYuc3RvcCgpLGMuY2FsbCgiZW5kIixuKSl9ZnVuY3Rpb24gbCgpe3ZhciBuLHIsZj10Lmxlbmd0aDtmb3IoZSs9KG8tZSkqaSx1LmVhY2goZnVuY3Rpb24odCl7dChlKX0pLG49MDtuPGY7KytuKW51bGw9PShyPXRbbl0pLmZ4P3IueCs9ci52eCo9YTooci54PXIuZngsci52eD0wKSxudWxsPT1yLmZ5P3IueSs9ci52eSo9YTooci55PXIuZnksci52eT0wKX1mdW5jdGlvbiBoKCl7Zm9yKHZhciBuLGU9MCxyPXQubGVuZ3RoO2U8cjsrK2Upe2lmKChuPXRbZV0pLmluZGV4PWUsaXNOYU4obi54KXx8aXNOYU4obi55KSl7dmFyIGk9ZGEqTWF0aC5zcXJ0KGUpLG89ZSpwYTtuLng9aSpNYXRoLmNvcyhvKSxuLnk9aSpNYXRoLnNpbihvKX0oaXNOYU4obi52eCl8fGlzTmFOKG4udnkpKSYmKG4udng9bi52eT0wKX19ZnVuY3Rpb24gZChuKXtyZXR1cm4gbi5pbml0aWFsaXplJiZuLmluaXRpYWxpemUodCksbn1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGgoKSxuPXt0aWNrOmwscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBmLnJlc3RhcnQocyksbn0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBmLnN0b3AoKSxufSxub2RlczpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGgoKSx1LmVhY2goZCksbik6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qsbik6ZX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbik6cn0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKToraX0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsbik6MS1hfSxmb3JjZTpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PWU/dS5yZW1vdmUodCk6dS5zZXQodCxkKGUpKSxuKTp1LmdldCh0KX0sZmluZDpmdW5jdGlvbihuLGUscil7dmFyIGksbyxhLHUsZixjPTAscz10Lmxlbmd0aDtmb3IobnVsbD09cj9yPTEvMDpyKj1yLGM9MDtjPHM7KytjKShhPShpPW4tKHU9dFtjXSkueCkqaSsobz1lLXUueSkqbyk8ciYmKGY9dSxyPWEpO3JldHVybiBmfSxvbjpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxlKSxuKTpjLm9uKHQpfX19LHQuZm9yY2VYPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ4Kz0ocltvXS1pLngpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcmNlWT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaT1RbyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGksbz0wLGE9bi5sZW5ndGg7bzxhOysrbykoaT1uW29dKS52eSs9KHJbb10taS55KSplW29dKnR9ZnVuY3Rpb24gYSgpe2lmKG4pe3ZhciBvLGE9bi5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KGEpLHI9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKWVbb109aXNOYU4ocltvXT0rdChuW29dLG8sbikpPzA6K2kobltvXSxvLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UW8obnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksYSgpLG8pOml9LG8ueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxhKCksbyk6dH0sb30sdC5mb3JtYXREZWZhdWx0TG9jYWxlPVNhLHQuZm9ybWF0TG9jYWxlPU5hLHQuZm9ybWF0U3BlY2lmaWVyPWJhLHQucHJlY2lzaW9uRml4ZWQ9RWEsdC5wcmVjaXNpb25QcmVmaXg9a2EsdC5wcmVjaXNpb25Sb3VuZD1DYSx0Lmdlb0FyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHl1LnJlc2V0KCksc3UodCxfdSksMip5dX0sdC5nZW9Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU7aWYoUnU9enU9LShDdT1QdT0xLzApLE91PVtdLHN1KHQscmYpLGU9T3UubGVuZ3RoKXtmb3IoT3Uuc29ydChkZiksbj0xLG89W3I9T3VbMF1dO248ZTsrK24pcGYociwoaT1PdVtuXSlbMF0pfHxwZihyLGlbMV0pPyhoZihyWzBdLGlbMV0pPmhmKHJbMF0sclsxXSkmJihyWzFdPWlbMV0pLGhmKGlbMF0sclsxXSk+aGYoclswXSxyWzFdKSYmKHJbMF09aVswXSkpOm8ucHVzaChyPWkpO2ZvcihhPS0xLzAsbj0wLHI9b1tlPW8ubGVuZ3RoLTFdO248PWU7cj1pLCsrbilpPW9bbl0sKHU9aGYoclsxXSxpWzBdKSk+YSYmKGE9dSxDdT1pWzBdLHp1PXJbMV0pfXJldHVybiBPdT1ZdT1udWxsLEN1PT09MS8wfHxQdT09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1tDdSxQdV0sW3p1LFJ1XV19LHQuZ2VvQ2VudHJvaWQ9ZnVuY3Rpb24odCl7QnU9RnU9SXU9SHU9anU9WHU9R3U9VnU9JHU9V3U9WnU9MCxzdSh0LHZmKTt2YXIgbj0kdSxlPVd1LHI9WnUsaT1uKm4rZSplK3IqcjtyZXR1cm4gaTxVYSYmKG49WHUsZT1HdSxyPVZ1LEZ1PERhJiYobj1JdSxlPUh1LHI9anUpLChpPW4qbitlKmUrcipyKTxVYSk/W05hTixOYU5dOltYYShlLG4pKkZhLGV1KHIvS2EoaSkpKkZhXX0sdC5nZW9DaXJjbGU9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9TmYoWzAsMF0pLHI9TmYoOTApLGk9TmYoNiksbz17cG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goZT1uKGUscikpLGVbMF0qPUZhLGVbMV0qPUZhfX07ZnVuY3Rpb24gYSgpe3ZhciBhPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqSWEsZj1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYTtyZXR1cm4gdD1bXSxuPWtmKC1hWzBdKklhLC1hWzFdKklhLDApLmludmVydCxMZihvLHUsZiwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9bj1udWxsLGF9cmV0dXJuIGEuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmYoWyt0WzBdLCt0WzFdXSksYSk6ZX0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6cn0sYS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZigrdCksYSk6aX0sYX0sdC5nZW9DbGlwQW50aW1lcmlkaWFuPUdmLHQuZ2VvQ2xpcENpcmNsZT1WZix0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCxhPTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9WmYocixpLG8sYSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt1WzBdWzBdLGk9K3VbMF1bMV0sbz0rdVsxXVswXSxhPSt1WzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyxhXV19fX0sdC5nZW9DbGlwUmVjdGFuZ2xlPVpmLHQuZ2VvQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmY2MuaGFzT3duUHJvcGVydHkodC50eXBlKT9jY1t0LnR5cGVdOmxjKSh0LG4pfSx0Lmdlb0Rpc3RhbmNlPWZjLHQuZ2VvR3JhdGljdWxlPWJjLHQuZ2VvR3JhdGljdWxlMTA9ZnVuY3Rpb24oKXtyZXR1cm4gYmMoKSgpfSx0Lmdlb0ludGVycG9sYXRlPWZ1bmN0aW9uKHQsbil7dmFyIGU9dFswXSpJYSxyPXRbMV0qSWEsaT1uWzBdKklhLG89blsxXSpJYSxhPUdhKHIpLHU9UWEociksZj1HYShvKSxjPVFhKG8pLHM9YSpHYShlKSxsPWEqUWEoZSksaD1mKkdhKGkpLGQ9ZipRYShpKSxwPTIqZXUoS2EocnUoby1yKSthKmYqcnUoaS1lKSkpLHY9UWEocCksZz1wP2Z1bmN0aW9uKHQpe3ZhciBuPVFhKHQqPXApL3YsZT1RYShwLXQpL3Yscj1lKnMrbipoLGk9ZSpsK24qZCxvPWUqdStuKmM7cmV0dXJuW1hhKGkscikqRmEsWGEobyxLYShyKnIraSppKSkqRmFdfTpmdW5jdGlvbigpe3JldHVybltlKkZhLHIqRmFdfTtyZXR1cm4gZy5kaXN0YW5jZT1wLGd9LHQuZ2VvTGVuZ3RoPW9jLHQuZ2VvUGF0aD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT00LjU7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksc3UodCxlKHIpKSksci5yZXN1bHQoKX1yZXR1cm4gby5hcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoU2MpKSxTYy5yZXN1bHQoKX0sby5tZWFzdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoZHMpKSxkcy5yZXN1bHQoKX0sby5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShVYykpLFVjLnJlc3VsdCgpfSxvLmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBzdSh0LGUoWmMpKSxaYy5yZXN1bHQoKX0sby5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PW4/KHQ9bnVsbCxtYyk6KHQ9bikuc3RyZWFtLG8pOnR9LG8uY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10PyhuPW51bGwsbmV3IGdzKTpuZXcgYXMobj10KSwiZnVuY3Rpb24iIT10eXBlb2YgaSYmci5wb2ludFJhZGl1cyhpKSxvKTpufSxvLnBvaW50UmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHIucG9pbnRSYWRpdXMoK3QpLCt0KSxvKTppfSxvLnByb2plY3Rpb24odCkuY29udGV4dChuKX0sdC5nZW9BbGJlcnM9RHMsdC5nZW9BbGJlcnNVc2E9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT1EcygpLHU9THMoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9THMoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXtvPVt0LG5dfX07ZnVuY3Rpb24gcyh0KXt2YXIgbj10WzBdLGE9dFsxXTtyZXR1cm4gbz1udWxsLGUucG9pbnQobixhKSxvfHwoci5wb2ludChuLGEpLG8pfHwoaS5wb2ludChuLGEpLG8pfWZ1bmN0aW9uIGwoKXtyZXR1cm4gdD1uPW51bGwsc31yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIG49YS5zY2FsZSgpLGU9YS50cmFuc2xhdGUoKSxyPSh0WzBdLWVbMF0pL24saT0odFsxXS1lWzFdKS9uO3JldHVybihpPj0uMTImJmk8LjIzNCYmcj49LS40MjUmJnI8LS4yMTQ/dTppPj0uMTY2JiZpPC4yMzQmJnI+PS0uMjE0JiZyPC0uMTE1P2Y6YSkuaW52ZXJ0KHQpfSxzLnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDoocj1bYS5zdHJlYW0obj1lKSx1LnN0cmVhbShlKSxmLnN0cmVhbShlKV0saT1yLmxlbmd0aCx0PXtwb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT0tMTsrK2U8aTspcltlXS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9LTE7Kyt0PGk7KXJbdF0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5wb2x5Z29uRW5kKCl9fSk7dmFyIHIsaX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKHQpLHUucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLGwoKSk6YS5wcmVjaXNpb24oKX0scy5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5zY2FsZSh0KSx1LnNjYWxlKC4zNSp0KSxmLnNjYWxlKHQpLHMudHJhbnNsYXRlKGEudHJhbnNsYXRlKCkpKTphLnNjYWxlKCl9LHMudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLnRyYW5zbGF0ZSgpO3ZhciBuPWEuc2NhbGUoKSxvPSt0WzBdLHM9K3RbMV07cmV0dXJuIGU9YS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW28tLjQ1NSpuLHMtLjIzOCpuXSxbbysuNDU1Km4scysuMjM4Km5dXSkuc3RyZWFtKGMpLHI9dS50cmFuc2xhdGUoW28tLjMwNypuLHMrLjIwMSpuXSkuY2xpcEV4dGVudChbW28tLjQyNSpuK0RhLHMrLjEyKm4rRGFdLFtvLS4yMTQqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksaT1mLnRyYW5zbGF0ZShbby0uMjA1Km4scysuMjEyKm5dKS5jbGlwRXh0ZW50KFtbby0uMjE0Km4rRGEscysuMTY2Km4rRGFdLFtvLS4xMTUqbi1EYSxzKy4yMzQqbi1EYV1dKS5zdHJlYW0oYyksbCgpfSxzLmZpdEV4dGVudD1mdW5jdGlvbih0LG4pe3JldHVybiB4cyhzLHQsbil9LHMuZml0U2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiB3cyhzLHQsbil9LHMuZml0V2lkdGg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMocyx0LG4pfSxzLmZpdEhlaWdodD1mdW5jdGlvbih0LG4pe3JldHVybiBBcyhzLHQsbil9LHMuc2NhbGUoMTA3MCl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIENzKE9zKS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9T3MsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBDcyhZcykuc2NhbGUoNzkuNDE4OCkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PVlzLHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4genMoSHMpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9SHMsdC5nZW9Db25pY0VxdWFsQXJlYT1Mcyx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PVJzLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiB6cyhYcykuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PVhzLHQuZ2VvRXF1YWxFYXJ0aD1mdW5jdGlvbigpe3JldHVybiBDcyhRcykuc2NhbGUoMTc3LjE1OCl9LHQuZ2VvRXF1YWxFYXJ0aFJhdz1Rcyx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBDcyhqcykuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9anMsdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBDcyhKcykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz1Kcyx0Lmdlb0lkZW50aXR5PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHIsaSxvLGE9MSx1PTAsZj0wLGM9MSxzPTEsbD1tYyxoPW51bGwsZD1tYztmdW5jdGlvbiBwKCl7cmV0dXJuIHI9aT1udWxsLG99cmV0dXJuIG89e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gciYmaT09PXQ/cjpyPWwoZChpPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9cixoPXQ9bj1lPW51bGwscCgpKTpkfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PXI/KGg9dD1uPWU9bnVsbCxtYyk6WmYoaD0rclswXVswXSx0PStyWzBdWzFdLG49K3JbMV1bMF0sZT0rclsxXVsxXSkscCgpKTpudWxsPT1oP251bGw6W1toLHRdLFtuLGVdXX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoKGE9K3QpKmMsYSpzLHUsZikscCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqcyx1PSt0WzBdLGY9K3RbMV0pLHAoKSk6W3UsZl19LHJlZmxlY3RYOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUtzKGEqKGM9dD8tMToxKSxhKnMsdSxmKSxwKCkpOmM8MH0scmVmbGVjdFk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSpjLGEqKHM9dD8tMToxKSx1LGYpLHAoKSk6czwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4geHMobyx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKG8sdCxuKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gTXMobyx0LG4pfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gQXMobyx0LG4pfX19LHQuZ2VvUHJvamVjdGlvbj1Dcyx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVBzLHQuZ2VvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gRnMoQnMpLnNjYWxlKDk2MS9CYSl9LHQuZ2VvTWVyY2F0b3JSYXc9QnMsdC5nZW9OYXR1cmFsRWFydGgxPWZ1bmN0aW9uKCl7cmV0dXJuIENzKHRsKS5zY2FsZSgxNzUuMjk1KX0sdC5nZW9OYXR1cmFsRWFydGgxUmF3PXRsLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKG5sKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK0RhKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9bmwsdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGVsKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9ZWwsdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1GcyhybCksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6Wyh0PW4oKSlbMV0sLXRbMF1dfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6Wyh0PWUoKSlbMF0sdFsxXSx0WzJdLTkwXX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PXJsLHQuZ2VvUm90YXRpb249UmYsdC5nZW9TdHJlYW09c3UsdC5nZW9UcmFuc2Zvcm09ZnVuY3Rpb24odCl7cmV0dXJue3N0cmVhbTpfcyh0KX19LHQuY2x1c3Rlcj1mdW5jdGlvbigpe3ZhciB0PWlsLG49MSxlPTEscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvLGE9MDtpLmVhY2hBZnRlcihmdW5jdGlvbihuKXt2YXIgZT1uLmNoaWxkcmVuO2U/KG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZWR1Y2Uob2wsMCkvdC5sZW5ndGh9KGUpLG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gMSt0LnJlZHVjZShhbCwwKX0oZSkpOihuLng9bz9hKz10KG4sbyk6MCxuLnk9MCxvPW4pfSk7dmFyIHU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uWzBdO3JldHVybiB0fShpKSxmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9bltuLmxlbmd0aC0xXTtyZXR1cm4gdH0oaSksYz11LngtdCh1LGYpLzIscz1mLngrdChmLHUpLzI7cmV0dXJuIGkuZWFjaEFmdGVyKHI/ZnVuY3Rpb24odCl7dC54PSh0LngtaS54KSpuLHQueT0oaS55LXQueSkqZX06ZnVuY3Rpb24odCl7dC54PSh0LngtYykvKHMtYykqbix0Lnk9KDEtKGkueT90LnkvaS55OjEpKSplfSl9cmV0dXJuIGkuc2VwYXJhdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMSxuPSt0WzBdLGU9K3RbMV0saSk6cj9udWxsOltuLGVdfSxpLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEwLG49K3RbMF0sZT0rdFsxXSxpKTpyP1tuLGVdOm51bGx9LGl9LHQuaGllcmFyY2h5PWZsLHQucGFjaz1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj0xLGU9MSxyPUVsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIGkueD1uLzIsaS55PWUvMix0P2kuZWFjaEJlZm9yZShQbCh0KSkuZWFjaEFmdGVyKHpsKHIsLjUpKS5lYWNoQmVmb3JlKFJsKDEpKTppLmVhY2hCZWZvcmUoUGwoQ2wpKS5lYWNoQWZ0ZXIoemwoRWwsMSkpLmVhY2hBZnRlcih6bChyLGkuci9NYXRoLm1pbihuLGUpKSkuZWFjaEJlZm9yZShSbChNYXRoLm1pbihuLGUpLygyKmkucikpKSxpfXJldHVybiBpLnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT0oZT1uKT9udWxsOlNsKGUpLGkpOnQ7dmFyIGV9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGkpOltuLGVdfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCksaSk6cn0saX0sdC5wYWNrU2libGluZ3M9ZnVuY3Rpb24odCl7cmV0dXJuIE5sKHQpLHR9LHQucGFja0VuY2xvc2U9cGwsdC5wYXJ0aXRpb249ZnVuY3Rpb24oKXt2YXIgdD0xLG49MSxlPTAscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvPWkuaGVpZ2h0KzE7cmV0dXJuIGkueDA9aS55MD1lLGkueDE9dCxpLnkxPW4vbyxpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7ci5jaGlsZHJlbiYmRGwocixyLngwLHQqKHIuZGVwdGgrMSkvbixyLngxLHQqKHIuZGVwdGgrMikvbik7dmFyIGk9ci54MCxvPXIueTAsYT1yLngxLWUsdT1yLnkxLWU7YTxpJiYoaT1hPShpK2EpLzIpLHU8byYmKG89dT0obyt1KS8yKSxyLngwPWksci55MD1vLHIueDE9YSxyLnkxPXV9fShuLG8pKSxyJiZpLmVhY2hCZWZvcmUoTGwpLGl9cmV0dXJuIGkucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGkpOnJ9LGkuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZVswXSxuPStlWzFdLGkpOlt0LG5dfSxpLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sdC5zdHJhdGlmeT1mdW5jdGlvbigpe3ZhciB0PVlsLG49Qmw7ZnVuY3Rpb24gZShlKXt2YXIgcixpLG8sYSx1LGYsYyxzPWUubGVuZ3RoLGw9bmV3IEFycmF5KHMpLGg9e307Zm9yKGk9MDtpPHM7KytpKXI9ZVtpXSx1PWxbaV09bmV3IGhsKHIpLG51bGwhPShmPXQocixpLGUpKSYmKGYrPSIiKSYmKGhbYz1VbCsodS5pZD1mKV09YyBpbiBoP09sOnUpO2ZvcihpPTA7aTxzOysraSlpZih1PWxbaV0sbnVsbCE9KGY9bihlW2ldLGksZSkpJiYoZis9IiIpKXtpZighKGE9aFtVbCtmXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2YpO2lmKGE9PT1PbCl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitmKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaCh1KTphLmNoaWxkcmVuPVt1XSx1LnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz11fWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PXFsLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1zfSkuZWFjaEJlZm9yZShsbCksby5wYXJlbnQ9bnVsbCxzPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXJldHVybiBlLmlkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLGUpOnR9LGUucGFyZW50SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U2wodCksZSk6bn0sZX0sdC50cmVlPWZ1bmN0aW9uKCl7dmFyIHQ9Rmwsbj0xLGU9MSxyPW51bGw7ZnVuY3Rpb24gaShpKXt2YXIgZj1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGksbyxhPW5ldyBHbCh0LDApLHU9W2FdO249dS5wb3AoKTspaWYocj1uLl8uY2hpbGRyZW4pZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KG89ci5sZW5ndGgpLGk9by0xO2k+PTA7LS1pKXUucHVzaChlPW4uY2hpbGRyZW5baV09bmV3IEdsKHJbaV0saSkpLGUucGFyZW50PW47cmV0dXJuKGEucGFyZW50PW5ldyBHbChudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0oaSk7aWYoZi5lYWNoQWZ0ZXIobyksZi5wYXJlbnQubT0tZi56LGYuZWFjaEJlZm9yZShhKSxyKWkuZWFjaEJlZm9yZSh1KTtlbHNle3ZhciBjPWkscz1pLGw9aTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PGMueCYmKGM9dCksdC54PnMueCYmKHM9dCksdC5kZXB0aD5sLmRlcHRoJiYobD10KX0pO3ZhciBoPWM9PT1zPzE6dChjLHMpLzIsZD1oLWMueCxwPW4vKHMueCtoK2QpLHY9ZS8obC5kZXB0aHx8MSk7aS5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueD0odC54K2QpKnAsdC55PXQuZGVwdGgqdn0pfXJldHVybiBpfWZ1bmN0aW9uIG8obil7dmFyIGU9bi5jaGlsZHJlbixyPW4ucGFyZW50LmNoaWxkcmVuLGk9bi5pP3Jbbi5pLTFdOm51bGw7aWYoZSl7IWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPTAscj0wLGk9dC5jaGlsZHJlbixvPWkubGVuZ3RoOy0tbz49MDspKG49aVtvXSkueis9ZSxuLm0rPWUsZSs9bi5zKyhyKz1uLmMpfShuKTt2YXIgbz0oZVswXS56K2VbZS5sZW5ndGgtMV0ueikvMjtpPyhuLno9aS56K3Qobi5fLGkuXyksbi5tPW4uei1vKTpuLno9b31lbHNlIGkmJihuLno9aS56K3Qobi5fLGkuXykpO24ucGFyZW50LkE9ZnVuY3Rpb24obixlLHIpe2lmKGUpe2Zvcih2YXIgaSxvPW4sYT1uLHU9ZSxmPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHM9YS5tLGw9dS5tLGg9Zi5tO3U9SGwodSksbz1JbChvKSx1JiZvOylmPUlsKGYpLChhPUhsKGEpKS5hPW4sKGk9dS56K2wtby56LWMrdCh1Ll8sby5fKSk+MCYmKGpsKFhsKHUsbixyKSxuLGkpLGMrPWkscys9aSksbCs9dS5tLGMrPW8ubSxoKz1mLm0scys9YS5tO3UmJiFIbChhKSYmKGEudD11LGEubSs9bC1zKSxvJiYhSWwoZikmJihmLnQ9byxmLm0rPWMtaCxyPW4pfXJldHVybiByfShuLGksbi5wYXJlbnQuQXx8clswXSl9ZnVuY3Rpb24gYSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gdSh0KXt0LngqPW4sdC55PXQuZGVwdGgqZX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC50cmVlbWFwPWZ1bmN0aW9uKCl7dmFyIHQ9Wmwsbj0hMSxlPTEscj0xLGk9WzBdLG89RWwsYT1FbCx1PUVsLGY9RWwsYz1FbDtmdW5jdGlvbiBzKHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPWUsdC55MT1yLHQuZWFjaEJlZm9yZShsKSxpPVswXSxuJiZ0LmVhY2hCZWZvcmUoTGwpLHR9ZnVuY3Rpb24gbChuKXt2YXIgZT1pW24uZGVwdGhdLHI9bi54MCtlLHM9bi55MCtlLGw9bi54MS1lLGg9bi55MS1lO2w8ciYmKHI9bD0ocitsKS8yKSxoPHMmJihzPWg9KHMraCkvMiksbi54MD1yLG4ueTA9cyxuLngxPWwsbi55MT1oLG4uY2hpbGRyZW4mJihlPWlbbi5kZXB0aCsxXT1vKG4pLzIscis9YyhuKS1lLHMrPWEobiktZSwobC09dShuKS1lKTxyJiYocj1sPShyK2wpLzIpLChoLT1mKG4pLWUpPHMmJihzPWg9KHMraCkvMiksdChuLHIscyxsLGgpKX1yZXR1cm4gcy5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0hIXQscyk6bn0scy5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0scyk6W2Uscl19LHMudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1TbChuKSxzKTp0fSxzLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nSW5uZXIodCkucGFkZGluZ091dGVyKHQpOnMucGFkZGluZ0lubmVyKCl9LHMucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOm99LHMucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3MucGFkZGluZ1RvcCh0KS5wYWRkaW5nUmlnaHQodCkucGFkZGluZ0JvdHRvbSh0KS5wYWRkaW5nTGVmdCh0KTpzLnBhZGRpbmdUb3AoKX0scy5wYWRkaW5nVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmF9LHMucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOnV9LHMucGFkZGluZ0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxzKTpmfSxzLnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmN9LHN9LHQudHJlZW1hcEJpbmFyeT1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLGEsdT10LmNoaWxkcmVuLGY9dS5sZW5ndGgsYz1uZXcgQXJyYXkoZisxKTtmb3IoY1swXT1hPW89MDtvPGY7KytvKWNbbysxXT1hKz11W29dLnZhbHVlOyFmdW5jdGlvbiB0KG4sZSxyLGksbyxhLGYpe2lmKG4+PWUtMSl7dmFyIHM9dVtuXTtyZXR1cm4gcy54MD1pLHMueTA9byxzLngxPWEsdm9pZChzLnkxPWYpfWZvcih2YXIgbD1jW25dLGg9ci8yK2wsZD1uKzEscD1lLTE7ZDxwOyl7dmFyIHY9ZCtwPj4+MTtjW3ZdPGg/ZD12KzE6cD12fWgtY1tkLTFdPGNbZF0taCYmbisxPGQmJi0tZDt2YXIgZz1jW2RdLWwseT1yLWc7aWYoYS1pPmYtbyl7dmFyIF89KGkqeSthKmcpL3I7dChuLGQsZyxpLG8sXyxmKSx0KGQsZSx5LF8sbyxhLGYpfWVsc2V7dmFyIGI9KG8qeStmKmcpL3I7dChuLGQsZyxpLG8sYSxiKSx0KGQsZSx5LGksYixhLGYpfX0oMCxmLHQudmFsdWUsbixlLHIsaSl9LHQudHJlZW1hcERpY2U9RGwsdC50cmVlbWFwU2xpY2U9VmwsdC50cmVlbWFwU2xpY2VEaWNlPWZ1bmN0aW9uKHQsbixlLHIsaSl7KDEmdC5kZXB0aD9WbDpEbCkodCxuLGUscixpKX0sdC50cmVlbWFwU3F1YXJpZnk9WmwsdC50cmVlbWFwUmVzcXVhcmlmeT1RbCx0LmludGVycG9sYXRlPW1lLHQuaW50ZXJwb2xhdGVBcnJheT1kZSx0LmludGVycG9sYXRlQmFzaXM9ZWUsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPXJlLHQuaW50ZXJwb2xhdGVEYXRlPXBlLHQuaW50ZXJwb2xhdGVEaXNjcmV0ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX0sdC5pbnRlcnBvbGF0ZUh1ZT1mdW5jdGlvbih0LG4pe3ZhciBlPWFlKCt0LCtuKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49ZSh0KTtyZXR1cm4gbi0zNjAqTWF0aC5mbG9vcihuLzM2MCl9fSx0LmludGVycG9sYXRlTnVtYmVyPXZlLHQuaW50ZXJwb2xhdGVPYmplY3Q9Z2UsdC5pbnRlcnBvbGF0ZVJvdW5kPXhlLHQuaW50ZXJwb2xhdGVTdHJpbmc9YmUsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1DZSx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPVBlLHQuaW50ZXJwb2xhdGVab29tPXFlLHQuaW50ZXJwb2xhdGVSZ2I9Y2UsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPWxlLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD1oZSx0LmludGVycG9sYXRlSHNsPVllLHQuaW50ZXJwb2xhdGVIc2xMb25nPUJlLHQuaW50ZXJwb2xhdGVMYWI9ZnVuY3Rpb24odCxuKXt2YXIgZT1mZSgodD1Vbih0KSkubCwobj1VbihuKSkubCkscj1mZSh0LmEsbi5hKSxpPWZlKHQuYixuLmIpLG89ZmUodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX0sdC5pbnRlcnBvbGF0ZUhjbD1JZSx0LmludGVycG9sYXRlSGNsTG9uZz1IZSx0LmludGVycG9sYXRlQ3ViZWhlbGl4PVhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPUdlLHQucGllY2V3aXNlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPTAscj1uLmxlbmd0aC0xLGk9blswXSxvPW5ldyBBcnJheShyPDA/MDpyKTtlPHI7KW9bZV09dChpLGk9blsrK2VdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49TWF0aC5tYXgoMCxNYXRoLm1pbihyLTEsTWF0aC5mbG9vcih0Kj1yKSkpO3JldHVybiBvW25dKHQtbil9fSx0LnF1YW50aXplPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LHQucGF0aD1HaSx0LnBvbHlnb25BcmVhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sdC5wb2x5Z29uQ2VudHJvaWQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCxhPTAsdT10W2ktMV0sZj0wOysrcjxpOyluPXUsdT10W3JdLGYrPWU9blswXSp1WzFdLXVbMF0qblsxXSxvKz0oblswXSt1WzBdKSplLGErPShuWzFdK3VbMV0pKmU7cmV0dXJuW28vKGYqPTMpLGEvZl19LHQucG9seWdvbkh1bGw9ZnVuY3Rpb24odCl7aWYoKGU9dC5sZW5ndGgpPDMpcmV0dXJuIG51bGw7dmFyIG4sZSxyPW5ldyBBcnJheShlKSxpPW5ldyBBcnJheShlKTtmb3Iobj0wO248ZTsrK24pcltuXT1bK3Rbbl1bMF0sK3Rbbl1bMV0sbl07Zm9yKHIuc29ydChKbCksbj0wO248ZTsrK24paVtuXT1bcltuXVswXSwtcltuXVsxXV07dmFyIG89S2wociksYT1LbChpKSx1PWFbMF09PT1vWzBdLGY9YVthLmxlbmd0aC0xXT09PW9bby5sZW5ndGgtMV0sYz1bXTtmb3Iobj1vLmxlbmd0aC0xO24+PTA7LS1uKWMucHVzaCh0W3Jbb1tuXV1bMl1dKTtmb3Iobj0rdTtuPGEubGVuZ3RoLWY7KytuKWMucHVzaCh0W3JbYVtuXV1bMl1dKTtyZXR1cm4gY30sdC5wb2x5Z29uQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscixpPXQubGVuZ3RoLG89dFtpLTFdLGE9blswXSx1PW5bMV0sZj1vWzBdLGM9b1sxXSxzPSExLGw9MDtsPGk7KytsKWU9KG89dFtsXSlbMF0sKHI9b1sxXSk+dSE9Yz51JiZhPChmLWUpKih1LXIpLyhjLXIpK2UmJihzPSFzKSxmPWUsYz1yO3JldHVybiBzfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLGE9b1swXSx1PW9bMV0sZj0wOysrcjxpOyluPWEsZT11LG4tPWE9KG89dFtyXSlbMF0sZS09dT1vWzFdLGYrPU1hdGguc3FydChuKm4rZSplKTtyZXR1cm4gZn0sdC5xdWFkdHJlZT1yYSx0LnJhbmRvbVVuaWZvcm09bmgsdC5yYW5kb21Ob3JtYWw9ZWgsdC5yYW5kb21Mb2dOb3JtYWw9cmgsdC5yYW5kb21CYXRlcz1vaCx0LnJhbmRvbUlyd2luSGFsbD1paCx0LnJhbmRvbUV4cG9uZW50aWFsPWFoLHQuc2NhbGVCYW5kPWhoLHQuc2NhbGVQb2ludD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiB0KG4pe3ZhciBlPW4uY29weTtyZXR1cm4gbi5wYWRkaW5nPW4ucGFkZGluZ091dGVyLGRlbGV0ZSBuLnBhZGRpbmdJbm5lcixkZWxldGUgbi5wYWRkaW5nT3V0ZXIsbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoZSgpKX0sbn0oaGgoKS5wYWRkaW5nSW5uZXIoMSkpfSx0LnNjYWxlSWRlbnRpdHk9ZnVuY3Rpb24gdCgpe3ZhciBuPVswLDFdO2Z1bmN0aW9uIGUodCl7cmV0dXJuK3R9cmV0dXJuIGUuaW52ZXJ0PWUsZS5kb21haW49ZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1maC5jYWxsKHQscGgpLGUpOm4uc2xpY2UoKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obil9LHhoKGUpfSx0LnNjYWxlTGluZWFyPWZ1bmN0aW9uIHQoKXt2YXIgbj1taChnaCx2ZSk7cmV0dXJuIG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLHQoKSl9LHhoKG4pfSx0LnNjYWxlTG9nPWZ1bmN0aW9uIG4oKXt2YXIgZT1taChNaCxBaCkuZG9tYWluKFsxLDEwXSkscj1lLmRvbWFpbixpPTEwLG89U2goMTApLGE9TmgoMTApO2Z1bmN0aW9uIHUoKXtyZXR1cm4gbz1TaChpKSxhPU5oKGkpLHIoKVswXTwwJiYobz1FaChvKSxhPUVoKGEpKSxlfXJldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsdSgpKTppfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSx1KCkpOnIoKX0sZS50aWNrcz1mdW5jdGlvbih0KXt2YXIgbixlPXIoKSx1PWVbMF0sZj1lW2UubGVuZ3RoLTFdOyhuPWY8dSkmJihoPXUsdT1mLGY9aCk7dmFyIGMscyxsLGg9byh1KSxkPW8oZikscD1udWxsPT10PzEwOit0LHY9W107aWYoIShpJTEpJiZkLWg8cCl7aWYoaD1NYXRoLnJvdW5kKGgpLTEsZD1NYXRoLnJvdW5kKGQpKzEsdT4wKXtmb3IoO2g8ZDsrK2gpZm9yKHM9MSxjPWEoaCk7czxpOysrcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2UgZm9yKDtoPGQ7KytoKWZvcihzPWktMSxjPWEoaCk7cz49MTstLXMpaWYoISgobD1jKnMpPHUpKXtpZihsPmYpYnJlYWs7di5wdXNoKGwpfX1lbHNlIHY9bShoLGQsTWF0aC5taW4oZC1oLHApKS5tYXAoYSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgdT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC9hKE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PXU/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKHdoKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIGEoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBiaChlLG4oKS5iYXNlKGkpKX0sZX0sdC5zY2FsZU9yZGluYWw9bGgsdC5zY2FsZUltcGxpY2l0PXNoLHQuc2NhbGVQb3c9Q2gsdC5zY2FsZVNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gQ2goKS5leHBvbmVudCguNSl9LHQuc2NhbGVRdWFudGlsZT1mdW5jdGlvbiB0KCl7dmFyIGU9W10scj1bXSxvPVtdO2Z1bmN0aW9uIGEoKXt2YXIgdD0wLG49TWF0aC5tYXgoMSxyLmxlbmd0aCk7Zm9yKG89bmV3IEFycmF5KG4tMSk7Kyt0PG47KW9bdC0xXT1BKGUsdC9uKTtyZXR1cm4gdX1mdW5jdGlvbiB1KHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltpKG8sdCldfXJldHVybiB1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1yLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9vW24tMV06ZVswXSxuPG8ubGVuZ3RoP29bbl06ZVtlLmxlbmd0aC0xXV19LHUuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIHIsaT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0ocj10W2ldKXx8aXNOYU4ocj0rcil8fGUucHVzaChyKTtyZXR1cm4gZS5zb3J0KG4pLGEoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1jaC5jYWxsKHQpLGEoKSk6ci5zbGljZSgpfSx1LnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKGUpLnJhbmdlKHIpfSx1fSx0LnNjYWxlUXVhbnRpemU9ZnVuY3Rpb24gdCgpe3ZhciBuPTAsZT0xLHI9MSxvPVsuNV0sYT1bMCwxXTtmdW5jdGlvbiB1KHQpe2lmKHQ8PXQpcmV0dXJuIGFbaShvLHQsMCxyKV19ZnVuY3Rpb24gZigpe3ZhciB0PS0xO2ZvcihvPW5ldyBBcnJheShyKTsrK3Q8cjspb1t0XT0oKHQrMSkqZS0odC1yKSpuKS8ocisxKTtyZXR1cm4gdX1yZXR1cm4gdS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0sZT0rdFsxXSxmKCkpOltuLGVdfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPShhPWNoLmNhbGwodCkpLmxlbmd0aC0xLGYoKSk6YS5zbGljZSgpfSx1LmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1hLmluZGV4T2YodCk7cmV0dXJuIGk8MD9bTmFOLE5hTl06aTwxP1tuLG9bMF1dOmk+PXI/W29bci0xXSxlXTpbb1tpLTFdLG9baV1dfSx1LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihbbixlXSkucmFuZ2UoYSl9LHhoKHUpfSx0LnNjYWxlVGhyZXNob2xkPWZ1bmN0aW9uIHQoKXt2YXIgbj1bLjVdLGU9WzAsMV0scj0xO2Z1bmN0aW9uIG8odCl7aWYodDw9dClyZXR1cm4gZVtpKG4sdCwwLHIpXX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Y2guY2FsbCh0KSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLG8pOm4uc2xpY2UoKX0sby5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6ZS5zbGljZSgpfSxvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1lLmluZGV4T2YodCk7cmV0dXJuW25bci0xXSxuW3JdXX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4obikucmFuZ2UoZSl9LG99LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KGNkLHVkLFZoLGpoLEloLEJoLE9oLExoLHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSx0LnNjYWxlVXRjPWZ1bmN0aW9uKCl7cmV0dXJuIGN2KExkLHpkLF9kLHZkLGRkLGxkLE9oLExoLHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHQuc2NhbGVTZXF1ZW50aWFsPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPTEsaT0xLG89ITE7ZnVuY3Rpb24gYSh0KXt2YXIgcj0odC1lKSppO3JldHVybiBuKG8/TWF0aC5tYXgoMCxNYXRoLm1pbigxLHIpKTpyKX1yZXR1cm4gYS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxpPWU9PT1yPzA6MS8oci1lKSxhKTpbZSxyXX0sYS5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0hIXQsYSk6b30sYS5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChuKS5kb21haW4oW2Uscl0pLmNsYW1wKG8pfSx4aChhKX0sdC5zY2FsZURpdmVyZ2luZz1mdW5jdGlvbiB0KG4pe3ZhciBlPTAscj0uNSxpPTEsbz0xLGE9MSx1PSExO2Z1bmN0aW9uIGYodCl7dmFyIGU9LjUrKCh0PSt0KS1yKSoodDxyP286YSk7cmV0dXJuIG4odT9NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpOmUpfXJldHVybiBmLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9K3RbMl0sbz1lPT09cj8wOi41LyhyLWUpLGE9cj09PWk/MDouNS8oaS1yKSxmKTpbZSxyLGldfSxmLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSEhdCxmKTp1fSxmLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGYpOm59LGYuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyLGldKS5jbGFtcCh1KX0seGgoZil9LHQuc2NoZW1lQ2F0ZWdvcnkxMD1sdix0LnNjaGVtZUFjY2VudD1odix0LnNjaGVtZURhcmsyPWR2LHQuc2NoZW1lUGFpcmVkPXB2LHQuc2NoZW1lUGFzdGVsMT12dix0LnNjaGVtZVBhc3RlbDI9Z3YsdC5zY2hlbWVTZXQxPXl2LHQuc2NoZW1lU2V0Mj1fdix0LnNjaGVtZVNldDM9YnYsdC5pbnRlcnBvbGF0ZUJyQkc9d3YsdC5zY2hlbWVCckJHPXh2LHQuaW50ZXJwb2xhdGVQUkduPUF2LHQuc2NoZW1lUFJHbj1Ndix0LmludGVycG9sYXRlUGlZRz1Odix0LnNjaGVtZVBpWUc9VHYsdC5pbnRlcnBvbGF0ZVB1T3I9RXYsdC5zY2hlbWVQdU9yPVN2LHQuaW50ZXJwb2xhdGVSZEJ1PUN2LHQuc2NoZW1lUmRCdT1rdix0LmludGVycG9sYXRlUmRHeT16dix0LnNjaGVtZVJkR3k9UHYsdC5pbnRlcnBvbGF0ZVJkWWxCdT1Mdix0LnNjaGVtZVJkWWxCdT1Sdix0LmludGVycG9sYXRlUmRZbEduPVV2LHQuc2NoZW1lUmRZbEduPUR2LHQuaW50ZXJwb2xhdGVTcGVjdHJhbD1Pdix0LnNjaGVtZVNwZWN0cmFsPXF2LHQuaW50ZXJwb2xhdGVCdUduPUJ2LHQuc2NoZW1lQnVHbj1Zdix0LmludGVycG9sYXRlQnVQdT1Jdix0LnNjaGVtZUJ1UHU9RnYsdC5pbnRlcnBvbGF0ZUduQnU9anYsdC5zY2hlbWVHbkJ1PUh2LHQuaW50ZXJwb2xhdGVPclJkPUd2LHQuc2NoZW1lT3JSZD1Ydix0LmludGVycG9sYXRlUHVCdUduPSR2LHQuc2NoZW1lUHVCdUduPVZ2LHQuaW50ZXJwb2xhdGVQdUJ1PVp2LHQuc2NoZW1lUHVCdT1Xdix0LmludGVycG9sYXRlUHVSZD1Kdix0LnNjaGVtZVB1UmQ9UXYsdC5pbnRlcnBvbGF0ZVJkUHU9dGcsdC5zY2hlbWVSZFB1PUt2LHQuaW50ZXJwb2xhdGVZbEduQnU9ZWcsdC5zY2hlbWVZbEduQnU9bmcsdC5pbnRlcnBvbGF0ZVlsR249aWcsdC5zY2hlbWVZbEduPXJnLHQuaW50ZXJwb2xhdGVZbE9yQnI9YWcsdC5zY2hlbWVZbE9yQnI9b2csdC5pbnRlcnBvbGF0ZVlsT3JSZD1mZyx0LnNjaGVtZVlsT3JSZD11Zyx0LmludGVycG9sYXRlQmx1ZXM9c2csdC5zY2hlbWVCbHVlcz1jZyx0LmludGVycG9sYXRlR3JlZW5zPWhnLHQuc2NoZW1lR3JlZW5zPWxnLHQuaW50ZXJwb2xhdGVHcmV5cz1wZyx0LnNjaGVtZUdyZXlzPWRnLHQuaW50ZXJwb2xhdGVQdXJwbGVzPWdnLHQuc2NoZW1lUHVycGxlcz12Zyx0LmludGVycG9sYXRlUmVkcz1fZyx0LnNjaGVtZVJlZHM9eWcsdC5pbnRlcnBvbGF0ZU9yYW5nZXM9bWcsdC5zY2hlbWVPcmFuZ2VzPWJnLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PXhnLHQuaW50ZXJwb2xhdGVSYWluYm93PWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gQWcuaD0zNjAqdC0xMDAsQWcucz0xLjUtMS41Km4sQWcubD0uOC0uOSpuLEFnKyIifSx0LmludGVycG9sYXRlV2FybT13Zyx0LmludGVycG9sYXRlQ29vbD1NZyx0LmludGVycG9sYXRlU2luZWJvdz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxUZy5yPTI1NSoobj1NYXRoLnNpbih0KSkqbixUZy5nPTI1NSoobj1NYXRoLnNpbih0K05nKSkqbixUZy5iPTI1NSoobj1NYXRoLnNpbih0K1NnKSkqbixUZysiIn0sdC5pbnRlcnBvbGF0ZVZpcmlkaXM9a2csdC5pbnRlcnBvbGF0ZU1hZ21hPUNnLHQuaW50ZXJwb2xhdGVJbmZlcm5vPVBnLHQuaW50ZXJwb2xhdGVQbGFzbWE9emcsdC5jcmVhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIER0KFcodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sdC5jcmVhdG9yPVcsdC5sb2NhbD1xdCx0Lm1hdGNoZXI9cnQsdC5tb3VzZT1GdCx0Lm5hbWVzcGFjZT0kLHQubmFtZXNwYWNlcz1WLHQuY2xpZW50UG9pbnQ9QnQsdC5zZWxlY3Q9RHQsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBSdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBSdChbbnVsbD09dD9bXTp0XSx6dCl9LHQuc2VsZWN0aW9uPUx0LHQuc2VsZWN0b3I9USx0LnNlbGVjdG9yQWxsPUssdC5zdHlsZT1sdCx0LnRvdWNoPUl0LHQudG91Y2hlcz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPVl0KCkudG91Y2hlcyk7Zm9yKHZhciBlPTAscj1uP24ubGVuZ3RoOjAsaT1uZXcgQXJyYXkocik7ZTxyOysrZSlpW2VdPUJ0KHQsbltlXSk7cmV0dXJuIGl9LHQud2luZG93PXN0LHQuY3VzdG9tRXZlbnQ9Q3QsdC5hcmM9ZnVuY3Rpb24oKXt2YXIgdD1HZyxuPVZnLGU9UmcoMCkscj1udWxsLGk9JGcsbz1XZyxhPVpnLHU9bnVsbDtmdW5jdGlvbiBmKCl7dmFyIGYsYyxzLGw9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyktSGcscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyx2PUxnKHAtZCksZz1wPmQ7aWYodXx8KHU9Zj1HaSgpKSxoPGwmJihjPWgsaD1sLGw9YyksaD5GZylpZih2PmpnLUZnKXUubW92ZVRvKGgqVWcoZCksaCpZZyhkKSksdS5hcmMoMCwwLGgsZCxwLCFnKSxsPkZnJiYodS5tb3ZlVG8obCpVZyhwKSxsKllnKHApKSx1LmFyYygwLDAsbCxwLGQsZykpO2Vsc2V7dmFyIHksXyxiPWQsbT1wLHg9ZCx3PXAsTT12LEE9dixUPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsTj1UPkZnJiYocj8rci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6QmcobCpsK2gqaCkpLFM9T2coTGcoaC1sKS8yLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksRT1TLGs9UztpZihOPkZnKXt2YXIgQz1YZyhOL2wqWWcoVCkpLFA9WGcoTi9oKllnKFQpKTsoTS09MipDKT5GZz8oeCs9Qyo9Zz8xOi0xLHctPUMpOihNPTAseD13PShkK3ApLzIpLChBLT0yKlApPkZnPyhiKz1QKj1nPzE6LTEsbS09UCk6KEE9MCxiPW09KGQrcCkvMil9dmFyIHo9aCpVZyhiKSxSPWgqWWcoYiksTD1sKlVnKHcpLEQ9bCpZZyh3KTtpZihTPkZnKXt2YXIgVT1oKlVnKG0pLHE9aCpZZyhtKSxPPWwqVWcoeCksWT1sKllnKHgpO2lmKHY8SWcpe3ZhciBCPU0+Rmc/ZnVuY3Rpb24odCxuLGUscixpLG8sYSx1KXt2YXIgZj1lLXQsYz1yLW4scz1hLWksbD11LW8saD0ocyoobi1vKS1sKih0LWkpKS8obCpmLXMqYyk7cmV0dXJuW3QraCpmLG4raCpjXX0oeixSLE8sWSxVLHEsTCxEKTpbTCxEXSxGPXotQlswXSxJPVItQlsxXSxIPVUtQlswXSxqPXEtQlsxXSxYPTEvWWcoKChzPShGKkgrSSpqKS8oQmcoRipGK0kqSSkqQmcoSCpIK2oqaikpKT4xPzA6czwtMT9JZzpNYXRoLmFjb3MocykpLzIpLEc9QmcoQlswXSpCWzBdK0JbMV0qQlsxXSk7RT1PZyhTLChsLUcpLyhYLTEpKSxrPU9nKFMsKGgtRykvKFgrMSkpfX1BPkZnP2s+Rmc/KHk9UWcoTyxZLHosUixoLGssZyksXz1RZyhVLHEsTCxELGgsayxnKSx1Lm1vdmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLGs8Uz91LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LGssRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGgsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLCFnKSx1LmFyYyhfLmN4LF8uY3ksayxEZyhfLnkxMSxfLngxMSksRGcoXy55MDEsXy54MDEpLCFnKSkpOih1Lm1vdmVUbyh6LFIpLHUuYXJjKDAsMCxoLGIsbSwhZykpOnUubW92ZVRvKHosUiksbD5GZyYmTT5GZz9FPkZnPyh5PVFnKEwsRCxVLHEsbCwtRSxnKSxfPVFnKHosUixPLFksbCwtRSxnKSx1LmxpbmVUbyh5LmN4K3kueDAxLHkuY3kreS55MDEpLEU8Uz91LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoXy55MDEsXy54MDEpLCFnKToodS5hcmMoeS5jeCx5LmN5LEUsRGcoeS55MDEseS54MDEpLERnKHkueTExLHkueDExKSwhZyksdS5hcmMoMCwwLGwsRGcoeS5jeSt5LnkxMSx5LmN4K3kueDExKSxEZyhfLmN5K18ueTExLF8uY3grXy54MTEpLGcpLHUuYXJjKF8uY3gsXy5jeSxFLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6dS5hcmMoMCwwLGwsdyx4LGcpOnUubGluZVRvKEwsRCl9ZWxzZSB1Lm1vdmVUbygwLDApO2lmKHUuY2xvc2VQYXRoKCksZilyZXR1cm4gdT1udWxsLGYrIiJ8fG51bGx9cmV0dXJuIGYuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgZT0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIscj0oK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItSWcvMjtyZXR1cm5bVWcocikqZSxZZyhyKSplXX0sZi5pbm5lclJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxmKTp0fSxmLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmV9LGYucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6aX0sZi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpvfSxmLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOmF9LGYuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT10P251bGw6dCxmKTp1fSxmfSx0LmFyZWE9cnksdC5saW5lPWV5LHQucGllPWZ1bmN0aW9uKCl7dmFyIHQ9b3ksbj1peSxlPW51bGwscj1SZygwKSxpPVJnKGpnKSxvPVJnKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHUsZixjLHMsbCxoPWEubGVuZ3RoLGQ9MCxwPW5ldyBBcnJheShoKSx2PW5ldyBBcnJheShoKSxnPStyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx5PU1hdGgubWluKGpnLE1hdGgubWF4KC1qZyxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSksXz1NYXRoLm1pbihNYXRoLmFicyh5KS9oLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxiPV8qKHk8MD8tMToxKTtmb3IodT0wO3U8aDsrK3UpKGw9dltwW3VdPXVdPSt0KGFbdV0sdSxhKSk+MCYmKGQrPWwpO2ZvcihudWxsIT1uP3Auc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBuKHZbdF0sdltlXSl9KTpudWxsIT1lJiZwLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShhW3RdLGFbbl0pfSksdT0wLGM9ZD8oeS1oKmIpL2Q6MDt1PGg7Kyt1LGc9cylmPXBbdV0scz1nKygobD12W2ZdKT4wP2wqYzowKStiLHZbZl09e2RhdGE6YVtmXSxpbmRleDp1LHZhbHVlOmwsc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnMscGFkQW5nbGU6X307cmV0dXJuIHZ9cmV0dXJuIGEudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZygrbiksYSk6dH0sYS5zb3J0VmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTppfSxhLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOm99LGF9LHQuYXJlYVJhZGlhbD1seSx0LnJhZGlhbEFyZWE9bHksdC5saW5lUmFkaWFsPXN5LHQucmFkaWFsTGluZT1zeSx0LnBvaW50UmFkaWFsPWh5LHQubGlua0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4gZ3koeXkpfSx0LmxpbmtWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiBneShfeSl9LHQubGlua1JhZGlhbD1mdW5jdGlvbigpe3ZhciB0PWd5KGJ5KTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSx0LnN5bWJvbD1mdW5jdGlvbigpe3ZhciB0PVJnKG15KSxuPVJnKDY0KSxlPW51bGw7ZnVuY3Rpb24gcigpe3ZhciByO2lmKGV8fChlPXI9R2koKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhlLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscilyZXR1cm4gZT1udWxsLHIrIiJ8fG51bGx9cmV0dXJuIHIudHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKG4pLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyKTpufSxyLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOnQscik6ZX0scn0sdC5zeW1ib2xzPVV5LHQuc3ltYm9sQ2lyY2xlPW15LHQuc3ltYm9sQ3Jvc3M9eHksdC5zeW1ib2xEaWFtb25kPUF5LHQuc3ltYm9sU3F1YXJlPWt5LHQuc3ltYm9sU3Rhcj1FeSx0LnN5bWJvbFRyaWFuZ2xlPVB5LHQuc3ltYm9sV3llPUR5LHQuY3VydmVCYXNpc0Nsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEJ5KHQpfSx0LmN1cnZlQmFzaXNPcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRnkodCl9LHQuY3VydmVCYXNpcz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFl5KHQpfSx0LmN1cnZlQnVuZGxlPUh5LHQuY3VydmVDYXJkaW5hbENsb3NlZD0keSx0LmN1cnZlQ2FyZGluYWxPcGVuPVp5LHQuY3VydmVDYXJkaW5hbD1HeSx0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1uXyx0LmN1cnZlQ2F0bXVsbFJvbU9wZW49cl8sdC5jdXJ2ZUNhdG11bGxSb209S3ksdC5jdXJ2ZUxpbmVhckNsb3NlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGlfKHQpfSx0LmN1cnZlTGluZWFyPUtnLHQuY3VydmVNb25vdG9uZVg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjXyh0KX0sdC5jdXJ2ZU1vbm90b25lWT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHNfKHQpfSx0LmN1cnZlTmF0dXJhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGhfKHQpfSx0LmN1cnZlU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsLjUpfSx0LmN1cnZlU3RlcEFmdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwxKX0sdC5jdXJ2ZVN0ZXBCZWZvcmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDApfSx0LnN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQ9UmcoW10pLG49Z18sZT12XyxyPXlfO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1PXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGY9aS5sZW5ndGgsYz11Lmxlbmd0aCxzPW5ldyBBcnJheShjKTtmb3Iobz0wO288YzsrK28pe2Zvcih2YXIgbCxoPXVbb10sZD1zW29dPW5ldyBBcnJheShmKSxwPTA7cDxmOysrcClkW3BdPWw9WzAsK3IoaVtwXSxoLHAsaSldLGwuZGF0YT1pW3BdO2Qua2V5PWh9Zm9yKG89MCxhPW4ocyk7bzxjOysrbylzW2Fbb11dLmluZGV4PW87cmV0dXJuIGUocyxhKSxzfXJldHVybiBpLmtleXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpSZyhkeS5jYWxsKG4pKSxpKTp0fSxpLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGkpOnJ9LGkub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9nXzoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKGR5LmNhbGwodCkpLGkpOm59LGkub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/dl86dCxpKTplfSxpfSx0LnN0YWNrT2Zmc2V0RXhwYW5kPWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfXZfKHQsbil9fSx0LnN0YWNrT2Zmc2V0RGl2ZXJnaW5nPWZ1bmN0aW9uKHQsbil7aWYoKHU9dC5sZW5ndGgpPjEpZm9yKHZhciBlLHIsaSxvLGEsdSxmPTAsYz10W25bMF1dLmxlbmd0aDtmPGM7KytmKWZvcihvPWE9MCxlPTA7ZTx1OysrZSkoaT0ocj10W25bZV1dW2ZdKVsxXS1yWzBdKT49MD8oclswXT1vLHJbMV09bys9aSk6aTwwPyhyWzFdPWEsclswXT1hKz1pKTpyWzBdPW99LHQuc3RhY2tPZmZzZXROb25lPXZfLHQuc3RhY2tPZmZzZXRTaWxob3VldHRlPWZ1bmN0aW9uKHQsbil7aWYoKGU9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyPTAsaT10W25bMF1dLG89aS5sZW5ndGg7cjxvOysrcil7Zm9yKHZhciBhPTAsdT0wO2E8ZTsrK2EpdSs9dFthXVtyXVsxXXx8MDtpW3JdWzFdKz1pW3JdWzBdPS11LzJ9dl8odCxuKX19LHQuc3RhY2tPZmZzZXRXaWdnbGU9ZnVuY3Rpb24odCxuKXtpZigoaT10Lmxlbmd0aCk+MCYmKHI9KGU9dFtuWzBdXSkubGVuZ3RoKT4wKXtmb3IodmFyIGUscixpLG89MCxhPTE7YTxyOysrYSl7Zm9yKHZhciB1PTAsZj0wLGM9MDt1PGk7Kyt1KXtmb3IodmFyIHM9dFtuW3VdXSxsPXNbYV1bMV18fDAsaD0obC0oc1thLTFdWzFdfHwwKSkvMixkPTA7ZDx1OysrZCl7dmFyIHA9dFtuW2RdXTtoKz0ocFthXVsxXXx8MCktKHBbYS0xXVsxXXx8MCl9Zis9bCxjKz1oKmx9ZVthLTFdWzFdKz1lW2EtMV1bMF09byxmJiYoby09Yy9mKX1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLHZfKHQsbil9fSx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9X18sdC5zdGFja09yZGVyRGVzY2VuZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gX18odCkucmV2ZXJzZSgpfSx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoYl8pLG89Z18odCkuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBpW25dLWlbdF19KSxhPTAsdT0wLGY9W10sYz1bXTtmb3Iobj0wO248cjsrK24pZT1vW25dLGE8dT8oYSs9aVtlXSxmLnB1c2goZSkpOih1Kz1pW2VdLGMucHVzaChlKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChmKX0sdC5zdGFja09yZGVyTm9uZT1nXyx0LnN0YWNrT3JkZXJSZXZlcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBnXyh0KS5yZXZlcnNlKCl9LHQudGltZUludGVydmFsPVJoLHQudGltZU1pbGxpc2Vjb25kPUxoLHQudGltZU1pbGxpc2Vjb25kcz1EaCx0LnV0Y01pbGxpc2Vjb25kPUxoLHQudXRjTWlsbGlzZWNvbmRzPURoLHQudGltZVNlY29uZD1PaCx0LnRpbWVTZWNvbmRzPVloLHQudXRjU2Vjb25kPU9oLHQudXRjU2Vjb25kcz1ZaCx0LnRpbWVNaW51dGU9QmgsdC50aW1lTWludXRlcz1GaCx0LnRpbWVIb3VyPUloLHQudGltZUhvdXJzPUhoLHQudGltZURheT1qaCx0LnRpbWVEYXlzPVhoLHQudGltZVdlZWs9VmgsdC50aW1lV2Vla3M9dGQsdC50aW1lU3VuZGF5PVZoLHQudGltZVN1bmRheXM9dGQsdC50aW1lTW9uZGF5PSRoLHQudGltZU1vbmRheXM9bmQsdC50aW1lVHVlc2RheT1XaCx0LnRpbWVUdWVzZGF5cz1lZCx0LnRpbWVXZWRuZXNkYXk9WmgsdC50aW1lV2VkbmVzZGF5cz1yZCx0LnRpbWVUaHVyc2RheT1RaCx0LnRpbWVUaHVyc2RheXM9aWQsdC50aW1lRnJpZGF5PUpoLHQudGltZUZyaWRheXM9b2QsdC50aW1lU2F0dXJkYXk9S2gsdC50aW1lU2F0dXJkYXlzPWFkLHQudGltZU1vbnRoPXVkLHQudGltZU1vbnRocz1mZCx0LnRpbWVZZWFyPWNkLHQudGltZVllYXJzPXNkLHQudXRjTWludXRlPWxkLHQudXRjTWludXRlcz1oZCx0LnV0Y0hvdXI9ZGQsdC51dGNIb3Vycz1wZCx0LnV0Y0RheT12ZCx0LnV0Y0RheXM9Z2QsdC51dGNXZWVrPV9kLHQudXRjV2Vla3M9VGQsdC51dGNTdW5kYXk9X2QsdC51dGNTdW5kYXlzPVRkLHQudXRjTW9uZGF5PWJkLHQudXRjTW9uZGF5cz1OZCx0LnV0Y1R1ZXNkYXk9bWQsdC51dGNUdWVzZGF5cz1TZCx0LnV0Y1dlZG5lc2RheT14ZCx0LnV0Y1dlZG5lc2RheXM9RWQsdC51dGNUaHVyc2RheT13ZCx0LnV0Y1RodXJzZGF5cz1rZCx0LnV0Y0ZyaWRheT1NZCx0LnV0Y0ZyaWRheXM9Q2QsdC51dGNTYXR1cmRheT1BZCx0LnV0Y1NhdHVyZGF5cz1QZCx0LnV0Y01vbnRoPXpkLHQudXRjTW9udGhzPVJkLHQudXRjWWVhcj1MZCx0LnV0Y1llYXJzPURkLHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9UXAsdC50aW1lRm9ybWF0TG9jYWxlPVlkLHQuaXNvRm9ybWF0PUpwLHQuaXNvUGFyc2U9S3AsdC5ub3c9aXIsdC50aW1lcj11cix0LnRpbWVyRmx1c2g9ZnIsdC50aW1lb3V0PWhyLHQuaW50ZXJ2YWw9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyBhcixpPW47cmV0dXJuIG51bGw9PW4/KHIucmVzdGFydCh0LG4sZSkscik6KG49K24sZT1udWxsPT1lP2lyKCk6K2Usci5yZXN0YXJ0KGZ1bmN0aW9uIG8oYSl7YSs9aSxyLnJlc3RhcnQobyxpKz1uLGUpLHQoYSl9LG4sZSkscil9LHQudHJhbnNpdGlvbj16cix0LmFjdGl2ZT1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Ll9fdHJhbnNpdGlvbjtpZihpKWZvcihyIGluIG49bnVsbD09bj9udWxsOm4rIiIsaSlpZigoZT1pW3JdKS5zdGF0ZT5nciYmZS5uYW1lPT09bilyZXR1cm4gbmV3IFByKFtbdF1dLGxpLG4sK3IpO3JldHVybiBudWxsfSx0LmludGVycnVwdD1Ocix0LnZvcm9ub2k9ZnVuY3Rpb24oKXt2YXIgdD14XyxuPXdfLGU9bnVsbDtmdW5jdGlvbiByKHIpe3JldHVybiBuZXcgZWIoci5tYXAoZnVuY3Rpb24oZSxpKXt2YXIgbz1bTWF0aC5yb3VuZCh0KGUsaSxyKS9LXykqS18sTWF0aC5yb3VuZChuKGUsaSxyKS9LXykqS19dO3JldHVybiBvLmluZGV4PWksby5kYXRhPWUsb30pLGUpfXJldHVybiByLnBvbHlnb25zPWZ1bmN0aW9uKHQpe3JldHVybiByKHQpLnBvbHlnb25zKCl9LHIubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkubGlua3MoKX0sci50cmlhbmdsZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkudHJpYW5nbGVzKCl9LHIueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm1fKCtuKSxyKTp0fSxyLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptXygrdCkscik6bn0sci5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOltbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dLHIpOmUmJltbZVswXVswXSxlWzBdWzFdXSxbZVsxXVswXSxlWzFdWzFdXV19LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1swLDBdLFsrdFswXSwrdFsxXV1dLHIpOmUmJltlWzFdWzBdLWVbMF1bMF0sZVsxXVsxXS1lWzBdWzFdXX0scn0sdC56b29tPWZ1bmN0aW9uKCl7dmFyIG4sZSxyPXNiLGk9bGIsbz12YixhPWRiLHU9cGIsZj1bMCwxLzBdLGM9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0scz0yNTAsbD1xZSxoPVtdLGQ9SSgic3RhcnQiLCJ6b29tIiwiZW5kIikscD01MDAsdj0xNTAsZz0wO2Z1bmN0aW9uIHkodCl7dC5wcm9wZXJ0eSgiX196b29tIixoYikub24oIndoZWVsLnpvb20iLEEpLm9uKCJtb3VzZWRvd24uem9vbSIsVCkub24oImRibGNsaWNrLnpvb20iLE4pLmZpbHRlcih1KS5vbigidG91Y2hzdGFydC56b29tIixTKS5vbigidG91Y2htb3ZlLnpvb20iLEUpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLGspLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBfKHQsbil7cmV0dXJuKG49TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4pKSk9PT10Lms/dDpuZXcgb2Iobix0LngsdC55KX1mdW5jdGlvbiBiKHQsbixlKXt2YXIgcj1uWzBdLWVbMF0qdC5rLGk9blsxXS1lWzFdKnQuaztyZXR1cm4gcj09PXQueCYmaT09PXQueT90Om5ldyBvYih0LmsscixpKX1mdW5jdGlvbiBtKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHgodCxuLGUpe3Qub24oInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pLnR3ZWVuKCJ6b29tIixmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxyPXcodGhpcyx0KSxvPWkuYXBwbHkodGhpcyx0KSxhPWV8fG0obyksdT1NYXRoLm1heChvWzFdWzBdLW9bMF1bMF0sb1sxXVsxXS1vWzBdWzFdKSxmPXRoaXMuX196b29tLGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLHQpOm4scz1sKGYuaW52ZXJ0KGEpLmNvbmNhdCh1L2YuayksYy5pbnZlcnQoYSkuY29uY2F0KHUvYy5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9YztlbHNle3ZhciBuPXModCksZT11L25bMl07dD1uZXcgb2IoZSxhWzBdLW5bMF0qZSxhWzFdLW5bMV0qZSl9ci56b29tKG51bGwsdCl9fSl9ZnVuY3Rpb24gdyh0LG4pe2Zvcih2YXIgZSxyPTAsaT1oLmxlbmd0aDtyPGk7KytyKWlmKChlPWhbcl0pLnRoYXQ9PT10KXJldHVybiBlO3JldHVybiBuZXcgTSh0LG4pfWZ1bmN0aW9uIE0odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9aS5hcHBseSh0LG4pfWZ1bmN0aW9uIEEoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dyh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxlPU1hdGgubWF4KGZbMF0sTWF0aC5taW4oZlsxXSxuLmsqTWF0aC5wb3coMixhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpKSxpPUZ0KHRoaXMpO2lmKHQud2hlZWwpdC5tb3VzZVswXVswXT09PWlbMF0mJnQubW91c2VbMF1bMV09PT1pWzFdfHwodC5tb3VzZVsxXT1uLmludmVydCh0Lm1vdXNlWzBdPWkpKSxjbGVhclRpbWVvdXQodC53aGVlbCk7ZWxzZXtpZihuLms9PT1lKXJldHVybjt0Lm1vdXNlPVtpLG4uaW52ZXJ0KGkpXSxOcih0aGlzKSx0LnN0YXJ0KCl9Y2IoKSx0LndoZWVsPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LndoZWVsPW51bGwsdC5lbmQoKX0sdiksdC56b29tKCJtb3VzZSIsbyhiKF8obixlKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGMpKX19ZnVuY3Rpb24gVCgpe2lmKCFlJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dyh0aGlzLGFyZ3VtZW50cyksaT1EdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsZnVuY3Rpb24oKXtpZihjYigpLCFuLm1vdmVkKXt2YXIgZT10LmV2ZW50LmNsaWVudFgtdSxyPXQuZXZlbnQuY2xpZW50WS1mO24ubW92ZWQ9ZSplK3Iqcj5nfW4uem9vbSgibW91c2UiLG8oYihuLnRoYXQuX196b29tLG4ubW91c2VbMF09RnQobi50aGF0KSxuLm1vdXNlWzFdKSxuLmV4dGVudCxjKSl9LCEwKS5vbigibW91c2V1cC56b29tIixmdW5jdGlvbigpe2kub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksR3QodC5ldmVudC52aWV3LG4ubW92ZWQpLGNiKCksbi5lbmQoKX0sITApLGE9RnQodGhpcyksdT10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFk7WHQodC5ldmVudC52aWV3KSxmYigpLG4ubW91c2U9W2EsdGhpcy5fX3pvb20uaW52ZXJ0KGEpXSxOcih0aGlzKSxuLnN0YXJ0KCl9fWZ1bmN0aW9uIE4oKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49dGhpcy5fX3pvb20sZT1GdCh0aGlzKSxhPW4uaW52ZXJ0KGUpLHU9bi5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpLGY9byhiKF8obix1KSxlLGEpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGMpO2NiKCkscz4wP0R0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihzKS5jYWxsKHgsZixlKTpEdCh0aGlzKS5jYWxsKHkudHJhbnNmb3JtLGYpfX1mdW5jdGlvbiBTKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGksbyxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGM9Zi5sZW5ndGg7Zm9yKGZiKCksaT0wO2k8YzsrK2kpYT1bYT1JdCh0aGlzLGYsKG89ZltpXSkuaWRlbnRpZmllciksdGhpcy5fX3pvb20uaW52ZXJ0KGEpLG8uaWRlbnRpZmllcl0sdS50b3VjaDA/dS50b3VjaDF8fCh1LnRvdWNoMT1hKToodS50b3VjaDA9YSxlPSEwKTtpZihuJiYobj1jbGVhclRpbWVvdXQobiksIXUudG91Y2gxKSlyZXR1cm4gdS5lbmQoKSx2b2lkKChhPUR0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIikpJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7ZSYmKG49c2V0VGltZW91dChmdW5jdGlvbigpe249bnVsbH0scCksTnIodGhpcyksdS5zdGFydCgpKX19ZnVuY3Rpb24gRSgpe3ZhciBlLHIsaSxhLHU9dyh0aGlzLGFyZ3VtZW50cyksZj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLHM9Zi5sZW5ndGg7Zm9yKGNiKCksbiYmKG49Y2xlYXJUaW1lb3V0KG4pKSxlPTA7ZTxzOysrZSlpPUl0KHRoaXMsZiwocj1mW2VdKS5pZGVudGlmaWVyKSx1LnRvdWNoMCYmdS50b3VjaDBbMl09PT1yLmlkZW50aWZpZXI/dS50b3VjaDBbMF09aTp1LnRvdWNoMSYmdS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJih1LnRvdWNoMVswXT1pKTtpZihyPXUudGhhdC5fX3pvb20sdS50b3VjaDEpe3ZhciBsPXUudG91Y2gwWzBdLGg9dS50b3VjaDBbMV0sZD11LnRvdWNoMVswXSxwPXUudG91Y2gxWzFdLHY9KHY9ZFswXS1sWzBdKSp2Kyh2PWRbMV0tbFsxXSkqdixnPShnPXBbMF0taFswXSkqZysoZz1wWzFdLWhbMV0pKmc7cj1fKHIsTWF0aC5zcXJ0KHYvZykpLGk9WyhsWzBdK2RbMF0pLzIsKGxbMV0rZFsxXSkvMl0sYT1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCF1LnRvdWNoMClyZXR1cm47aT11LnRvdWNoMFswXSxhPXUudG91Y2gwWzFdfXUuem9vbSgidG91Y2giLG8oYihyLGksYSksdS5leHRlbnQsYykpfWZ1bmN0aW9uIGsoKXt2YXIgbixyLGk9dyh0aGlzLGFyZ3VtZW50cyksbz10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGE9by5sZW5ndGg7Zm9yKGZiKCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dChmdW5jdGlvbigpe2U9bnVsbH0scCksbj0wO248YTsrK24pcj1vW25dLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09ci5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDA/aS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTppLmVuZCgpfXJldHVybiB5LnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLGhiKSx0IT09ZT94KHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0seS5zY2FsZUJ5PWZ1bmN0aW9uKHQsbil7eS5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bil9KX0seS5zY2FsZVRvPWZ1bmN0aW9uKHQsbil7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5fX3pvb20scj1tKHQpLGE9ZS5pbnZlcnQociksdT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuO3JldHVybiBvKGIoXyhlLHUpLHIsYSksdCxjKX0pfSx5LnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIG8odGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyl9KX0seS50cmFuc2xhdGVUbz1mdW5jdGlvbih0LG4sZSl7eS50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dGhpcy5fX3pvb20sYT1tKHQpO3JldHVybiBvKGFiLnRyYW5zbGF0ZShhWzBdLGFbMV0pLnNjYWxlKHIuaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiwiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUpLHQsYyl9KX0sTS5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWgucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihoLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgaWIoeSx0LHRoaXMudGhhdC5fX3pvb20pLGQuYXBwbHksZCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSx5LndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYigrdCkseSk6YX0seS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnJ9LHkudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoISF0KSx5KTp1fSx5LmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSx5KTppfSx5LnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmWzBdPSt0WzBdLGZbMV09K3RbMV0seSk6W2ZbMF0sZlsxXV19LHkudHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjWzBdWzBdPSt0WzBdWzBdLGNbMV1bMF09K3RbMV1bMF0sY1swXVsxXT0rdFswXVsxXSxjWzFdWzFdPSt0WzFdWzFdLHkpOltbY1swXVswXSxjWzBdWzFdXSxbY1sxXVswXSxjWzFdWzFdXV19LHkuY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQseSk6b30seS5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCx5KTpzfSx5LmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQseSk6bH0seS5vbj1mdW5jdGlvbigpe3ZhciB0PWQub24uYXBwbHkoZCxhcmd1bWVudHMpO3JldHVybiB0PT09ZD95OnR9LHkuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0odD0rdCkqdCx5KTpNYXRoLnNxcnQoZyl9LHl9LHQuem9vbVRyYW5zZm9ybT11Yix0Lnpvb21JZGVudGl0eT1hYixPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9yZWdpc3RyeS5qcwp2YXIgcGU7CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7ZC5OT1RfTE9BREVEPSJOT1RfTE9BREVEIjtkLkxPQURFRD0iTE9BREVEIjtkLkZBSUxFRD0iRkFJTEVEIn0pKGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZXx8KGIuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT17fSkpO2IuZGFzaGJvYXJkUmVnaXN0cnk9e307Yi5yZWdpc3RlckRhc2hib2FyZD1mdW5jdGlvbigpe3ZhciBkPXtwbHVnaW46ImJlaG9sZGVyIixlbGVtZW50TmFtZToidGYtYmVob2xkZXItZGFzaGJvYXJkIixzaG91bGRSZW1vdmVEb206ITB9O2lmKCFkLnBsdWdpbil0aHJvdyBFcnJvcigiRGFzaGJvYXJkLnBsdWdpbiBtdXN0IGJlIHByZXNlbnQiKTtpZighZC5lbGVtZW50TmFtZSl0aHJvdyBFcnJvcigiRGFzaGJvYXJkLmVsZW1lbnROYW1lIG11c3QgYmUgcHJlc2VudCIpO2lmKGQucGx1Z2luIGluIGIuZGFzaGJvYXJkUmVnaXN0cnkpdGhyb3cgRXJyb3IoYFBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7ZC5wbHVnaW59YCk7ZC50YWJOYW1lfHwKKGQudGFiTmFtZT1kLnBsdWdpbik7Yi5kYXNoYm9hcmRSZWdpc3RyeVtkLnBsdWdpbl09ZH19KShwZXx8KHBlPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdXRpbHMvdXRpbHMuanMKdmFyIHJmOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChmLGgsayl7cmV0dXJuIDE9PT1mP2g6a31iLmFnZ3JlZ2F0ZVRhZ0luZm89ZnVuY3Rpb24oZixoKXtsZXQgaz12b2lkIDA7Y29uc3Qgcj17fTtPYmplY3Qua2V5cyhmKS5mb3JFYWNoKHA9Pntjb25zdCBtPWZbcF07dm9pZCAwPT09ayYmKGs9bS5kaXNwbGF5TmFtZSk7ayE9PW0uZGlzcGxheU5hbWUmJihrPW51bGwpO3ZvaWQgMD09PXJbbS5kZXNjcmlwdGlvbl0mJihyW20uZGVzY3JpcHRpb25dPVtdKTtyW20uZGVzY3JpcHRpb25dLnB1c2gocCl9KTtoPW51bGwhPWs/azpoO2NvbnN0IGw9KCgpPT57Y29uc3QgcD1PYmplY3Qua2V5cyhyKTtyZXR1cm4gMD09PXAubGVuZ3RoPyIiOjE9PT1wLmxlbmd0aD9wWzBdOmAkeyJceDNjcFx4M2VceDNjc3Ryb25nXHgzZU11bHRpcGxlIGRlc2NyaXB0aW9uczpceDNjL3N0cm9uZ1x4M2VceDNjL3BceDNlIn08dWw+JHtwLm1hcChtPT57Y29uc3Qgbj1yW21dLm1hcCh1PT5gPGNvZGU+JHt1LnJlcGxhY2UoLzwvZywiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZywKIlx4MjZndDsiKS5yZXBsYWNlKC8mL2csIlx4MjZhbXA7Iil9PC9jb2RlPmApLHE9MjxuLmxlbmd0aD9uLnNsaWNlKDAsbi5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIituW24ubGVuZ3RoLTFdOm4uam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAke2Qobi5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtxfTo8L3A+JHttfTwvbGk+YH0pLmpvaW4oIiIpfTwvdWw+YH0pKCk7cmV0dXJue2Rpc3BsYXlOYW1lOmgsZGVzY3JpcHRpb246bH19fSkocmZ8fChyZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYixkKXtyZXR1cm5bYnx8ZD8iYWN0aXZlIjoiIixkPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWIpO3RoaXMuX19jb29saW5nRG93bj0hYiYmZH0sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJsb2FkaW5nIj09PWI/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YjoodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYiksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGIpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGYpe2ZbZi5MT0FESU5HPTBdPSJMT0FESU5HIjtmW2YuTE9BREVEPTFdPSJMT0FERUQifSkoZHx8KGQ9e30pKTtiLkRhdGFMb2FkZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sbG9hZEtleTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmY9PlN0cmluZyhmKX0sbG9hZERhdGFDYWxsYmFjazpGdW5jdGlvbixyZXF1ZXN0RGF0YTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmPT50aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5nZXREYXRhTG9hZFVybChmKSl9fSxnZXREYXRhTG9hZFVybDpGdW5jdGlvbixkYXRhTG9hZGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKdmFsdWU6ITF9LF9kYXRhTG9hZFN0YXRlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9sb2FkRGF0YUFzeW5jOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCk7dGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sCl9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8udGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9LF9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9LF9sb2FkRGF0YUltcGwoKXt0aGlzLmFjdGl2ZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz10aGlzLmFzeW5jKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57aWYoIWYuY2FuY2VsbGVkKXJldHVybiB0aGlzLl9zZXREYXRhTG9hZGluZyghMCksZj10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKGg9Pgp7aD10aGlzLmdldERhdGFMb2FkTmFtZShoKTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoaCl9KS5tYXAoaD0+e2NvbnN0IGs9dGhpcy5nZXREYXRhTG9hZE5hbWUoaCk7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURJTkcpO3JldHVybiB0aGlzLnJlcXVlc3REYXRhKGgpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHI9PntyLmNhbmNlbGxlZHx8KHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGssZC5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGgsci52YWx1ZSkpO3JldHVybiBrfSkpfSksUHJvbWlzZS5hbGwoZikudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoaD0+e2lmKCFoLmNhbmNlbGxlZCl7Y29uc3Qgaz1uZXcgU2V0KGgudmFsdWUpO2lmKHRoaXMuZGF0YVRvTG9hZC5zb21lKHI9PmsuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKHIpKSkpdGhpcy5vbkxvYWRGaW5pc2goKX1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLnNvbWUoaz0+Cms9PT1kLkxPQURJTkcpfHx0aGlzLl9zZXREYXRhTG9hZGluZyghMSl9KSwoKT0+e30pLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7Y2FuY2VsbGVkOmh9KT0+e2h8fCh0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfSkpfSkpKX19fSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvcGxvdHRhYmxlLmpzCi8qCiBNSVQKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KCiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KCiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KIE1JVAoKIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBjb252ZW5pZW50IHRodW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UKIG9mIGNyZWF0aW5nIGEgbWVtb2l6ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdHMgaW5wdXRzIGZyb20gbXV0YWJsZSBjbGFzcyBwcm9wZXJ0aWVzLgogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KIFBsb3R0YWJsZSAzLjcuMCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZSkKIENvcHlyaWdodCAyMDE0LTIwMTcgUGFsYW50aXIgVGVjaG5vbG9naWVzCiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRSkKIGlzLXBsYWluLW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcGxhaW4tb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1kKHJlcXVpcmUoImQzIikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImQzIl0sZCk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBsb3R0YWJsZT1kKHJlcXVpcmUoImQzIikpOmIuUGxvdHRhYmxlPWQoYi5kMyl9KSh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBmdW5jdGlvbihkKXtmdW5jdGlvbiBmKGspe2lmKGhba10pcmV0dXJuIGhba10uZXhwb3J0czt2YXIgcj1oW2tdPXtpOmssbDohMSxleHBvcnRzOnt9fTtkW2tdLmNhbGwoci5leHBvcnRzLHIsci5leHBvcnRzLGYpO3IubD0hMDtyZXR1cm4gci5leHBvcnRzfXZhciBoPXt9O2YubT1kO2YuYz1oO2YuaT1mdW5jdGlvbihrKXtyZXR1cm4ga307Zi5kPWZ1bmN0aW9uKGsscixsKXtmLm8oayxyKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGssCnIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDpsfSl9O2Yubj1mdW5jdGlvbihrKXt2YXIgcj1rJiZrLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4ga1siZGVmYXVsdCJdfTpmdW5jdGlvbigpe3JldHVybiBrfTtmLmQociwiYSIscik7cmV0dXJuIHJ9O2Yubz1mdW5jdGlvbihrLHIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoayxyKX07Zi5wPSIiO3JldHVybiBmKGYucz0xNDApfShbZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ZD1oKDEwNyk7Zi5BcnJheT1kO2Q9aCgxMTApO2YuQ29sb3I9ZDtkPWgoNTUpO2YuRE9NPWQ7ZD1oKDU2KTtmLk1hdGg9ZDtkPWgoMTEzKTtmLk9iamVjdD1kO2Q9aCg1Nyk7Zi5SVHJlZT1kO2Q9aCgxMTUpO2YuU3RhY2tpbmc9ZDtkPWgoMzUpO2YuV2luZG93PWQ7ayhoKDEwOCkpO2soaCgxMDkpKTtrKGgoMTIpKTsKayhoKDExMSkpO2soaCgxMTIpKTtrKGgoNTgpKTtrKGgoMTE2KSl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1ifSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhHLEQsQil7dmFyIEg9RC5hY2Nlc3NvcjtEPUQuc2NhbGU7aWYobnVsbD09RClyZXR1cm5bXTt2YXIgSz1HLmRhdGEoKTtudWxsIT1CJiYoSz1LLmZpbHRlcihmdW5jdGlvbihMLEope3JldHVybiBCKEwsSixHKX0pKTtLPUsubWFwKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEgoTCxKLEcpfSk7cmV0dXJuIEQuZXh0ZW50T2ZWYWx1ZXMoSyl9dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEcsRCl7ZnVuY3Rpb24gQigpe3RoaXMuY29uc3RydWN0b3I9R31mb3IodmFyIEggaW4gRClELmhhc093blByb3BlcnR5KEgpJiYoR1tIXT1EW0hdKTtHLnByb3RvdHlwZT1udWxsPT09RD9PYmplY3QuY3JlYXRlKEQpOihCLnByb3RvdHlwZT1ELnByb3RvdHlwZSxuZXcgQil9LGw9aCgxKSxwPWgoNyk7ZD1oKDQpO3ZhciBtPQpoKDE4KSxuPWgoNikscT1oKDkpLHU9aCgyMCksdz1oKDApLEE9aCgxMikseT1oKDEwKSx4PWgoNTEpLEM9aCg1Mik7Zi5SZW5kZXJlcj15Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO2g9ZnVuY3Rpb24oRyl7ZnVuY3Rpb24gRCgpe3ZhciBCPUcuY2FsbCh0aGlzKXx8dGhpcztCLl9kYXRhQ2hhbmdlZD0hMTtCLl9hdHRyRXh0ZW50cz17fTtCLl9hbmltYXRlPSExO0IuX2FuaW1hdG9ycz17fTtCLl9wcm9wZXJ0eUV4dGVudHM9e307Qi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe0IuX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH07Qi5fb3ZlcmZsb3dIaWRkZW49ITA7Qi5hZGRDbGFzcygicGxvdCIpO0IuX2RhdGFzZXRUb0RyYXdlcj1uZXcgdy5NYXA7Qi5fYXR0ckJpbmRpbmdzPWwubWFwKCk7Qi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihLLEwpe3JldHVybiBCLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlKEssTCl9O0IuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIucmVuZGVyKCl9OwpCLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLl9vbkRhdGFzZXRVcGRhdGUoKX07Qi5fcHJvcGVydHlCaW5kaW5ncz1sLm1hcCgpO3ZhciBIPShuZXcgcC5FYXNpbmcpLm1heFRvdGFsRHVyYXRpb24oRC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5hbmltYXRvcih4LkFuaW1hdG9yLk1BSU4sSCk7Qi5hbmltYXRvcih4LkFuaW1hdG9yLlJFU0VULG5ldyBwLk51bGwpO0IuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT13LldpbmRvdy5kZWJvdW5jZShDLkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLEIuX3Jlc2V0RW50aXR5U3RvcmUpO3JldHVybiBCfXIoRCxHKTtELmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gSC5yZWR1Y2UoZnVuY3Rpb24oSyxMKXtyZXR1cm4gSytMLmFuaW1hdG9yLnRvdGFsVGltZShCLmxlbmd0aCl9LDApfTtELmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKEIsSCl7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKEspe3ZhciBMPQpLLmF0dHJUb1Byb2plY3RvcixKPXt9O09iamVjdC5rZXlzKEwpLmZvckVhY2goZnVuY3Rpb24oTyl7SltPXT1mdW5jdGlvbihTLE4pe3JldHVybiBMW09dKFMsTixIKX19KTtyZXR1cm57YXR0clRvQXBwbGllZFByb2plY3RvcjpKLGFuaW1hdG9yOksuYW5pbWF0b3J9fSl9O0QucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihCKXtCPUEuY29lcmNlRXh0ZXJuYWxEMyhCKTtHLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLEIpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5faXNTZXR1cHx8KEcucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLAohMCksdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEIuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChIKX0pKX07RC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTtCLmVtcHR5KCkmJihCPXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCksQi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSkpfTtELnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24oQixILEssTCl7Ry5wcm90b3R5cGUuc2V0Qm91bmRzLmNhbGwodGhpcyxCLEgsSyxMKTt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7bnVsbCE9dGhpcy5fY2FudmFzJiYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQmJih0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLAp0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiKSksdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoImhlaWdodCIsdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIpKSwoSz10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiZLLmRyYXdJbWFnZSh0aGlzLl9jYW52YXMubm9kZSgpLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITApLEs9bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLEIqSyksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsSCpLKSxMPXRoaXMuX2NhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJihMLnNldFRyYW5zZm9ybShLLDAsMCxLLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzJiZMLmRyYXdJbWFnZSh0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLDAsMCxCLEgpKX07RC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBCPXRoaXM7CkcucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe3JldHVybiBILm9mZlVwZGF0ZShCLl9yZW5kZXJDYWxsYmFjayl9KTt0aGlzLmRhdGFzZXRzKFtdKX07RC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihCKXtCPXRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQik7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qi51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qi51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbi5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcS5TVkdEcmF3ZXIoInBhdGgiLCIiKX0sZnVuY3Rpb24oQil7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihCLGZ1bmN0aW9uKCl7fSl9KX07RC5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKEIpe3JldHVybiB0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCk/CnRoaXMuX2FuaW1hdG9yc1tCXXx8bmV3IHAuTnVsbDpuZXcgcC5OdWxsfTtELnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLnJlbmRlckxvd1ByaW9yaXR5KCl9O0QucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oQixILEspe2lmKG51bGw9PUgpcmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7dGhpcy5fYmluZEF0dHIoQixILEspO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24oQixILEssTCl7dmFyIEo9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQik7Sj1udWxsIT1KP0ouc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEg/SDpmdW5jdGlvbigpe3JldHVybiBIfSxzY2FsZTpLLHBvc3RTY2FsZTpMfSk7Cm51bGwhPUomJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KEosQik7bnVsbCE9SyYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KEssQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24oQixILEspe3ZhciBMPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7TD1udWxsIT1MP0wuc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgSD9IOmZ1bmN0aW9uKCl7cmV0dXJuIEh9LHNjYWxlOkt9KTtudWxsIT1MJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShMLEIpO251bGwhPUsmJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShLLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfTtELnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvciYmKHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpKTtyZXR1cm4gdy5PYmplY3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9O0QucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBCPXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEssTCl7QltMXT1ELl9zY2FsZWRBY2Nlc3NvcihLKX0pO3ZhciBIPXRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpO09iamVjdC5rZXlzKEgpLmZvckVhY2goZnVuY3Rpb24oSyl7bnVsbD09QltLXSYmKEJbS109SFtLXSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtHLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX2lzQW5jaG9yZWQmJih0aGlzLl9wYWludCgpLAp0aGlzLl9kYXRhQ2hhbmdlZD0hMSk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2soKX07RC5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24oQil7aWYobnVsbD09QilyZXR1cm4gdGhpcy5fYW5pbWF0ZTt0aGlzLl9hbmltYXRlPUI7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe0cucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciBCPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgpe0g9SC5zY2FsZTtudWxsIT1IJiYtMT09PUIuaW5kZXhPZihIKSYmQi5wdXNoKEgpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgpe0g9SC5zY2FsZTtudWxsIT1IJiYtMT09PUIuaW5kZXhPZihIKSYmQi5wdXNoKEgpfSk7CnJldHVybiBCfTtELnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0pfTtELnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcztudWxsPT10aGlzLl9hdHRyRXh0ZW50c1tCXSYmKHRoaXMuX2F0dHJFeHRlbnRzW0JdPXUubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gSC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBILl9hdHRyQmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbihLLEwpe3JldHVybiBudWxsPT1MfHxudWxsPT1MLmFjY2Vzc29yP251bGw6Sy5tYXAoZnVuY3Rpb24oSil7cmV0dXJuIGsoSiwKTCxudWxsKX0pfSkpO3JldHVybiB0aGlzLl9hdHRyRXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcztudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0mJih0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBILmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEguX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbigpe3JldHVybiBILl9maWx0ZXJGb3JQcm9wZXJ0eShCKX0sZnVuY3Rpb24oSyxMLEope3JldHVybiBudWxsPT1MfHxudWxsPT1MLmFjY2Vzc29yP251bGw6Sy5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIGsoTyxMLEopfSl9KSk7cmV0dXJuIHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZT1mdW5jdGlvbihCLEgpe3ZhciBLPXRoaXM7aWYoIXRoaXMuX2lzQW5jaG9yZWQmJgohSClyZXR1cm5bXTt2YXIgTD1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihKLE8pe0ouc2NhbGU9PT1CJiYoSj1LLmdldEV4dGVudHNGb3JBdHRyKE8pLG51bGwhPUomJihMPUwuY29uY2F0KGwubWVyZ2UoSikpKSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSixPKXtKLnNjYWxlPT09QiYmKEo9Sy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoTyksbnVsbCE9SiYmKEw9TC5jb25jYXQobC5tZXJnZShKKSkpKX0pO3JldHVybiBMfTtELnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbihCLEgpe2lmKHZvaWQgMD09PUgpcmV0dXJuIHRoaXMuX2FuaW1hdG9yc1tCXTt0aGlzLl9hbmltYXRvcnNbQl09SDtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMifTtELnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX2FkZERhdGFzZXQoQik7CnRoaXMuX29uRGF0YXNldFVwZGF0ZSgpfTtELnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3ZhciBIPXRoaXMuX2NyZWF0ZURyYXdlcihCKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KEIsSCk7dGhpcy5faXNTZXR1cCYmdGhpcy5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEIpO0Iub25VcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe2lmKC0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YoQikpcmV0dXJuIHRoaXM7dGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKEIpO0Iub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKEIpOwpyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihCKXt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpLnJlbW92ZSgpfTtELnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihCKXt2YXIgSD10aGlzLEs9W107dGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oTCxKKXtyZXR1cm4gSy5wdXNoKEopfSk7aWYobnVsbD09QilyZXR1cm4gSztLLmZvckVhY2goZnVuY3Rpb24oTCl7cmV0dXJuIEguX3JlbW92ZURhdGFzZXQoTCl9KTtCLmZvckVhY2goZnVuY3Rpb24oTCl7cmV0dXJuIEguX2FkZERhdGFzZXQoTCl9KTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IHAuTnVsbH1dfTtELnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe307RC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEg9dGhpcyxLPVtdO0IuZm9yRWFjaChmdW5jdGlvbihMLEope3ZhciBPPUguX2RhdGFzZXRUb0RyYXdlci5nZXQoTCksUz0wO0wuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oTixSKXt2YXIgWD1ILl9waXhlbFBvaW50KE4sUixMKTt3Lk1hdGguaXNOYU4oWC54KXx8dy5NYXRoLmlzTmFOKFgueSl8fChLLnB1c2goe2RhdHVtOk4sZ2V0IHBvc2l0aW9uKCl7cmV0dXJuIEguX3BpeGVsUG9pbnQuY2FsbChILE4sUixMKX0saW5kZXg6UixkYXRhc2V0OkwsZGF0YXNldEluZGV4OkosY29tcG9uZW50OkgsZHJhd2VyOk8sdmFsaWREYXR1bUluZGV4OlN9KSxTKyspfSl9KTtyZXR1cm4gS307RC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgQj1uZXcgdy5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7cmV0dXJuIEIuc2V0KEgsCkguZGF0YSgpKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5fcGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I7dmFyIEg9dGhpcy5fZ2VuZXJhdGVEcmF3U3RlcHMoKSxLPXRoaXMuX2dldERhdGFUb0RyYXcoKSxMPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEIuX2RhdGFzZXRUb0RyYXdlci5nZXQoTyl9KTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIEo9dGhpcy5fY2FudmFzLm5vZGUoKTtKLmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxKLmNsaWVudFdpZHRoLEouY2xpZW50SGVpZ2h0KTt0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihPLFMpe3ZhciBOPUQuYXBwbHlEcmF3U3RlcHMoSCxPKTtMW1NdLmRyYXcoSy5nZXQoTyksTil9KTtKPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEQuZ2V0VG90YWxEcmF3VGltZShLLmdldChPKSwKSCl9KTtKPXcuTWF0aC5tYXgoSiwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQoSil9O0QucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQil7dmFyIEg9dGhpczt2b2lkIDA9PT1CJiYoQj10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBsLnNlbGVjdEFsbCgpO3ZhciBLPVtdO0IuZm9yRWFjaChmdW5jdGlvbihMKXtMPUguX2RhdGFzZXRUb0RyYXdlci5nZXQoTCk7bnVsbCE9TCYmKEw9TC5nZXRWaXN1YWxQcmltaXRpdmVzKCksSy5wdXNoLmFwcGx5KEssTCkpfSk7cmV0dXJuIGwuc2VsZWN0QWxsKEspfTtELnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZShCKS5lbnRpdGllcygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSC5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KEspfSl9O0QucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbihCKXtmdW5jdGlvbiBIKEope3JldHVybiBLLl9lbnRpdHlCb3VuZHMoSil9CnZhciBLPXRoaXM7aWYodm9pZCAwIT09Qil7dmFyIEw9bmV3IHcuRW50aXR5U3RvcmU7TC5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyhCKSxILHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpO3JldHVybiBMfXZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoTD1uZXcgdy5FbnRpdHlTdG9yZSxMLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHRoaXMuZGF0YXNldHMoKSksSCx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSx0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZT1MKTtyZXR1cm4gdGhpcy5fY2FjaGVkRW50aXR5U3RvcmV9O0QucHJvdG90eXBlLl9sb2NhbE9yaWdpbkJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTp0aGlzLmhlaWdodCgpfX19O0QucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQil7Qj10aGlzLl9waXhlbFBvaW50KEIuZGF0dW0sCkIuaW5kZXgsQi5kYXRhc2V0KTtyZXR1cm57eDpCLngseTpCLnksd2lkdGg6MCxoZWlnaHQ6MH19O0QucHJvdG90eXBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHk9ZnVuY3Rpb24oQil7cmV0dXJue2JvdW5kczp0aGlzLl9lbnRpdHlCb3VuZHMoQiksY29tcG9uZW50OkIuY29tcG9uZW50LGRhdGFzZXQ6Qi5kYXRhc2V0LGRhdGFzZXRJbmRleDpCLmRhdGFzZXRJbmRleCxkYXR1bTpCLmRhdHVtLGluZGV4OkIuaW5kZXgscG9zaXRpb246Qi5wb3NpdGlvbixzZWxlY3Rpb246bC5zZWxlY3QoQi5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW0IudmFsaWREYXR1bUluZGV4XSl9fTtELnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKTt9O0QucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oQil7Qj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QoQik7CnJldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoQil9O0QucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oQixIKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PUg/e3g6Qi50b3BMZWZ0LngseTpCLnRvcExlZnQueSx3aWR0aDpCLmJvdHRvbVJpZ2h0LngtQi50b3BMZWZ0LngsaGVpZ2h0OkIuYm90dG9tUmlnaHQueS1CLnRvcExlZnQueX06e3g6Qi5taW4seTpILm1pbix3aWR0aDpCLm1heC1CLm1pbixoZWlnaHQ6SC5tYXgtSC5taW59KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSC5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KEspfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPQpmdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihCKXt2YXIgSD10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShLKX0pfTtELnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTsKRC5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9uVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTtELnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7cmV0dXJue319O0QuX3NjYWxlZEFjY2Vzc29yPWZ1bmN0aW9uKEIpe3ZhciBIPUIuc2NhbGUsSz1CLmFjY2Vzc29yLEw9Qi5wb3N0U2NhbGUsSj1udWxsPT1IP0s6ZnVuY3Rpb24oTyxTLE4pe3JldHVybiBILnNjYWxlKEsoTyxTLE4pKX07cmV0dXJuIG51bGw9PUw/SjpmdW5jdGlvbihPLFMsTil7cmV0dXJuIEwoSihPLFMsTiksTyxTLE4pfX07RC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19O0QucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH07cmV0dXJuIER9KGQuQ29tcG9uZW50KTtoLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMDtmLlBsb3Q9aH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7Zm9yKHZhciBtIGluIHApZi5oYXNPd25Qcm9wZXJ0eShtKXx8KGZbbV09cFttXSl9ZD1oKDEwNSk7Zi5UaWNrR2VuZXJhdG9ycz1kO2soaCg1NCkpO2soaCgxMDEpKTtrKGgoMTAyKSk7ayhoKDEwMykpO2soaCgxMDQpKTtrKGgoMTA2KSk7dmFyIHI9aCg1NCksbD1oKDExKTtmLmlzVHJhbnNmb3JtYWJsZT1mdW5jdGlvbihwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGwuUXVhbnRpdGF0aXZlU2NhbGV8fHAgaW5zdGFuY2VvZiByLkNhdGVnb3J5fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSkscj1oKDMwKSxsPWgoMCkscD1oKDEyKTtkPWgoMTApO2YuWEFsaWdubWVudD1kLm1ha2VFbnVtKFsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0pOwpmLllBbGlnbm1lbnQ9ZC5tYWtlRW51bShbInRvcCIsImNlbnRlciIsImJvdHRvbSJdKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbSgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExO3RoaXMuX29yaWdpbj17eDowLHk6MH07dGhpcy5feEFsaWdubWVudD0ibGVmdCI7dGhpcy5feUFsaWdubWVudD0idG9wIjt0aGlzLl9pc0FuY2hvcmVkPXRoaXMuX2lzU2V0dXA9ITE7dGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQ7dGhpcy5fZGVzdHJveWVkPSExO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3RoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1tLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24obil7bj1wLmNvZXJjZUV4dGVybmFsRDMobik7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTt0aGlzLmlzUm9vdCgpJiYKKHRoaXMuX3Jvb3RFbGVtZW50PW4sdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpO251bGwhPXRoaXMuX2VsZW1lbnQ/bi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PW4uYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKTt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKG4pe3RoaXMuX2lzQW5jaG9yZWQmJm4odGhpcyk7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24obil7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24ocSl7bi5fZWxlbWVudC5jbGFzc2VkKHEsCiEwKX0pLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IGwuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fb3ZlcmZsb3dIaWRkZW4/dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIiwhMCk6dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfTttLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW58fG51bGw9PXF8fG51bGw9PXUpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsIT10aGlzLl9yb290RWxlbWVudCluPXt4OjAseTowfSx1PXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKSxxPWwuRE9NLmVsZW1lbnRXaWR0aCh1KSx1PWwuRE9NLmVsZW1lbnRIZWlnaHQodSk7ZWxzZSB0aHJvdyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7fXZhciB3PXRoaXMuX3NpemVGcm9tT2ZmZXIocSx1KSxBPXcuaGVpZ2h0O3c9dy53aWR0aDt0aGlzLnNldEJvdW5kcyh3LEEsbi54KyhxLXcpKm0uX3hBbGlnblRvUHJvcG9ydGlvblt0aGlzLl94QWxpZ25tZW50XSxuLnkrKHUtQSkqbS5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihuLHEsdSx3KXt2b2lkIDA9PT11JiYodT0wKTt2b2lkIDA9PT13JiYodz0wKTt0aGlzLl93aWR0aD1uO3RoaXMuX2hlaWdodD1xO3RoaXMuX29yaWdpbj17eDp1LHk6d307bnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6dSsicHgiLGhlaWdodDpxKyJweCIsdG9wOncrInB4Iix3aWR0aDpuKyJweCJ9KTtudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDpuLGhlaWdodDpxfSl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5yZXF1ZXN0ZWRTcGFjZShuLHEpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbihuLHUubWluV2lkdGgpOm4saGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihxLHUubWluSGVpZ2h0KTpxfX07bS5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJjA8PXRoaXMud2lkdGgoKSYmMDw9dGhpcy5oZWlnaHQoKSYmci5yZWdpc3RlclRvUmVuZGVyKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O20ucHJvdG90eXBlLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiZyLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfTttLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbihuKXt0aGlzLl9yZXNpemVIYW5kbGVyPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJih0aGlzLmlzUm9vdCgpP3RoaXMuX3NjaGVkdWxlQ29tcHV0ZUxheW91dCgpOgp0aGlzLnBhcmVudCgpLnJlZHJhdygpKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fTttLnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbihuKXt0aGlzLmRldGFjaCgpO2lmKG51bGwhPW4pe249InN0cmluZyI9PT10eXBlb2Ygbj9rLnNlbGVjdChuKTpuIGluc3RhbmNlb2YgRWxlbWVudD9rLnNlbGVjdChuKTpwLmNvZXJjZUV4dGVybmFsRDMobik7aWYoIW4ubm9kZSgpfHxudWxsPT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIHJlcXVpcmVzIGEgdmFsaWQgRWxlbWVudCB0byByZW5kZXJUbyIpO2lmKCJzdmciPT09bi5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3Iobil9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CnIucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyk7ci5mbHVzaCgpfTttLnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7bj1uLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09bS5feEFsaWduVG9Qcm9wb3J0aW9uW25dKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrbik7dGhpcy5feEFsaWdubWVudD1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnlBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feUFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl95QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl95QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PQpuPyExOm51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXMobik6dGhpcy5fZWxlbWVudC5jbGFzc2VkKG4pfTttLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZChuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMCkpfTttLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihuKXtudWxsIT1uJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobiwhMSkpfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITF9O20ucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMucGFyZW50KG51bGwpO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7dGhpcy5faXNBbmNob3JlZD0KITE7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24obil7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuZGVsZXRlKG4pfTttLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24obil7aWYodm9pZCAwPT09bilyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT1uJiYhbi5oYXModGhpcykpdGhyb3cgRXJyb3IoIlBhc3NlZCBpbnZhbGlkIHBhcmVudCIpO3RoaXMuX3BhcmVudD1uO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm9yaWdpbigpO3JldHVybnt0b3BMZWZ0Om4sYm90dG9tUmlnaHQ6e3g6bi54K3RoaXMud2lkdGgoKSx5Om4ueSt0aGlzLmhlaWdodCgpfX19O20ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWQ9CiEwO3RoaXMuZGV0YWNoKCl9O20ucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofTttLnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fTttLnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX07bS5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXMub3JpZ2luKCkscT10aGlzLnBhcmVudCgpO251bGwhPXE7KXt2YXIgdT1xLm9yaWdpbigpO24ueCs9dS54O24ueSs9dS55O3E9cS5wYXJlbnQoKX1yZXR1cm4gbn07bS5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzOyFuLmlzUm9vdCgpOyluPW4ucGFyZW50KCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfTttLnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9OwptLnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9O20ucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH07bS5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fTttLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9O3JldHVybiBtfSgpO2QuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfTtkLl95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX07Zi5Db21wb25lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDU5KSk7ayhoKDYyKSk7ayhoKDEzMykpO2soaCgyMSkpO2soaCg2NCkpO2soaCg2NikpfSwKZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIpe3RoaXMuX3N2Z0RyYXdlckZhY3Rvcnk9azt0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5PXJ9aC5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKGspe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIHI9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO3IuYXR0YWNoVG8oayk7dGhpcy5fY3VycmVudERyYXdlcj1yfTtoLnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnkoay5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9O2gucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfTtoLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT0KdGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKX07aC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihrLHIpe3RoaXMuX2N1cnJlbnREcmF3ZXIuZHJhdyhrLHIpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpfTtoLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGspe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoayl9O3JldHVybiBofSgpO2YuUHJveHlEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDcwKSk7ayhoKDcxKSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe3ZvaWQgMD09PXAmJihwPTMpO3IocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBtLnRvRml4ZWQocCl9fQpmdW5jdGlvbiByKHApe2lmKDA+cHx8MjA8cCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZihwIT09TWF0aC5mbG9vcihwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTt9dmFyIGw9aCgxKTtmLmN1cnJlbmN5PWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1wJiYocD0yKTt2b2lkIDA9PT1tJiYobT0iJCIpO3ZvaWQgMD09PW4mJihuPSEwKTt2YXIgcT1rKHApO3JldHVybiBmdW5jdGlvbih1KXt2YXIgdz1xKE1hdGguYWJzKHUpKTsiIiE9PXcmJih3PW4/bSt3OncrbSwwPnUmJih3PSItIit3KSk7cmV0dXJuIHd9fTtmLmZpeGVkPWs7Zi5nZW5lcmFsPWZ1bmN0aW9uKCl7dmFyIHA7dm9pZCAwPT09cCYmKHA9Myk7cihwKTtyZXR1cm4gZnVuY3Rpb24obSl7aWYoIm51bWJlciI9PT10eXBlb2YgbSl7dmFyIG49TWF0aC5wb3coMTAscCk7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKG0qCm4pL24pfXJldHVybiBTdHJpbmcobSl9fTtmLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBTdHJpbmcocCl9fTtmLnBlcmNlbnRhZ2U9ZnVuY3Rpb24ocCl7dm9pZCAwPT09cCYmKHA9MCk7dmFyIG09ayhwKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHE9bi50b1N0cmluZygpO3E9TWF0aC5wb3coMTAscS5sZW5ndGgtKHEuaW5kZXhPZigiLiIpKzEpKTtyZXR1cm4gbShwYXJzZUludCgoMTAwKm4qcSkudG9TdHJpbmcoKSwxMCkvcSkrIiUifX07Zi5zaVN1ZmZpeD1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTtyKHApO3JldHVybiBmdW5jdGlvbihtKXtyZXR1cm4gbC5mb3JtYXQoIi4iK3ArInMiKShtKX19O2Yuc2hvcnRTY2FsZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0zKTtyKHApO3ZhciBtPWwuZm9ybWF0KCIuIitwKyJlIiksbj1sLmZvcm1hdCgiLiIrcCsiZiIpLHE9TWF0aC5wb3coMTAsMTgpLHU9TWF0aC5wb3coMTAsLXApOwpyZXR1cm4gZnVuY3Rpb24odyl7dmFyIEE9TWF0aC5hYnModyk7aWYoKEE8dXx8QT49cSkmJjAhPT1BKXJldHVybiBtKHcpO2Zvcih2YXIgeT0tMTtBPj1NYXRoLnBvdygxRTMseSsyKSYmND55Oyl5Kys7QT0tMT09PXk/bih3KTpuKHcvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV07aWYoMDx3JiYiMTAwMCI9PT1BLnN1YnN0cigwLDQpfHwwPncmJiItMTAwMCI9PT1BLnN1YnN0cigwLDUpKTQ+eT8oeSsrLEE9bih3L01hdGgucG93KDFFMyx5KzEpKSsiS01CVFEiW3ldKTpBPW0odyk7cmV0dXJuIEF9fTtmLm11bHRpVGltZT1mdW5jdGlvbigpe3ZhciBwPVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PQptLmdldE1pbnV0ZXMoKX19LHtzcGVjaWZpZXI6IiVJICVwIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldEhvdXJzKCl9fSx7c3BlY2lmaWVyOiIlYSAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXREYXkoKSYmMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIgJWQiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMSE9PW0uZ2V0RGF0ZSgpfX0se3NwZWNpZmllcjoiJWIiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0TW9udGgoKX19XTtyZXR1cm4gZnVuY3Rpb24obSl7dmFyIG49cC5maWx0ZXIoZnVuY3Rpb24ocSl7cmV0dXJuIHEucHJlZGljYXRlKG0pfSk7cmV0dXJuIGwudGltZUZvcm1hdCgwPG4ubGVuZ3RoP25bMF0uc3BlY2lmaWVyOiIlWSIpKG0pfX07Zi50aW1lPWZ1bmN0aW9uKHApe3JldHVybiBsLnRpbWVGb3JtYXQocCl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSxyPWgoMCk7CmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSl7dGhpcy5fcm9vdD1rLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKTt0aGlzLl9jbGFzc05hbWU9bTt0aGlzLl9zdmdFbGVtZW50TmFtZT1wfWwucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3RoaXMuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cyhwKTt2YXIgcT0wO20uZm9yRWFjaChmdW5jdGlvbih1KXtyLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIG4uX2RyYXdTdGVwKHUpfSxxKTtxKz11LmFuaW1hdG9yLnRvdGFsVGltZShwLmxlbmd0aCl9KX07bC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlcyYmKHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz10aGlzLl9zZWxlY3Rpb24ubm9kZXMoKSk7cmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlc307CmwucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW3BdfTtsLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfTtsLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihwKXtwLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9O2wucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH07bC5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9O2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7fTtsLnByb3RvdHlwZS5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzPWZ1bmN0aW9uKHApe3A9cC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPW19KTtwPXRoaXMuX3Jvb3Quc2VsZWN0QWxsKHRoaXMuc2VsZWN0b3IoKSkuZGF0YShwKTsKdGhpcy5fc2VsZWN0aW9uPXAuZW50ZXIoKS5hcHBlbmQodGhpcy5fc3ZnRWxlbWVudE5hbWUpLm1lcmdlKHApO3AuZXhpdCgpLnJlbW92ZSgpO3RoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlcz1udWxsO251bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKTt0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9O2wucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbihwKXt2YXIgbT10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goZnVuY3Rpb24obil7bnVsbCE9cC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dJiZtLl9zZWxlY3Rpb24uYXR0cihuLHAuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSl9KTtwLmFuaW1hdG9yLmFuaW1hdGUodGhpcy5fc2VsZWN0aW9uLHAuYXR0clRvQXBwbGllZFByb2plY3Rvcik7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsCiEwKX07cmV0dXJuIGx9KCk7Zi5TVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmKXtmLm1ha2VFbnVtPWZ1bmN0aW9uKGgpe3JldHVybiBoLnJlZHVjZShmdW5jdGlvbihrLHIpe2tbcl09cjtyZXR1cm4ga30se30pfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihtLG4pe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW19Zm9yKHZhciB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG1bdV09blt1XSk7bS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHEpfSxyPWgoMSksbD1oKDI2KSxwPWgoMCk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKCl7dmFyIHE9bS5jYWxsKHRoaXMpfHx0aGlzO3EuX3RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odSl7cmV0dXJuIHUuZGVmYXVsdFRpY2tzKCl9O3EuX3BhZFByb3BvcnRpb249LjA1O3EuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD0KITA7cS5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnM9bmV3IHAuU2V0O3JldHVybiBxfWsobixtKTtuLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dGhpcy5fZG9tYWluTWF4PXRoaXMuX2RvbWFpbk1pbj1udWxsO20ucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKX07bi5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGU9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLl9kb21haW5NaW4mJm51bGwhPXRoaXMuX2RvbWFpbk1heCl0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NYXhdKTtlbHNle3ZhciBxPXRoaXMuX2dldEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbj8ocT1xWzFdLHRoaXMuX2RvbWFpbk1pbj49cSYmKHE9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NaW5dKVsxXSksdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4scV0pKToKbnVsbCE9dGhpcy5fZG9tYWluTWF4PyhxPXFbMF0sdGhpcy5fZG9tYWluTWF4PD1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWF4LHRoaXMuX2RvbWFpbk1heF0pWzBdKSx0aGlzLl9zZXREb21haW4oW3EsdGhpcy5fZG9tYWluTWF4XSkpOm0ucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyl9fTtuLnByb3RvdHlwZS5fZ2V0VW5ib3VuZGVkRXh0ZW50PWZ1bmN0aW9uKHEpe3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHEpO3ZhciB1PXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09cS5sZW5ndGgmJihxPVtwLk1hdGgubWluKHEsdVswXSkscC5NYXRoLm1heChxLHVbMV0pXSx1PXRoaXMuX3BhZERvbWFpbihxKSk7cmV0dXJuIHV9O24ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoKTtudWxsIT10aGlzLl9kb21haW5NaW4mJgoocVswXT10aGlzLl9kb21haW5NaW4pO251bGwhPXRoaXMuX2RvbWFpbk1heCYmKHFbMV09dGhpcy5fZG9tYWluTWF4KTtyZXR1cm4gcX07bi5wcm90b3R5cGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcj1mdW5jdGlvbihxKXt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5hZGQocSk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtuLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZShxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnBhZFByb3BvcnRpb249ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbjtpZigwPnEpdGhyb3cgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTt0aGlzLl9wYWRQcm9wb3J0aW9uPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwpyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX3BhZERvbWFpbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO2lmKHFbMF0udmFsdWVPZigpPT09cVsxXS52YWx1ZU9mKCkpcmV0dXJuIHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKHEpO2lmKDA9PT10aGlzLl9wYWRQcm9wb3J0aW9uKXJldHVybiBxO3ZhciB3PXRoaXMuX3BhZFByb3BvcnRpb24vMixBPXFbMF0seT1xWzFdLHg9ITEsQz0hMTt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKEQpe0QodSkuZm9yRWFjaChmdW5jdGlvbihCKXtCLnZhbHVlT2YoKT09PUEudmFsdWVPZigpJiYoeD0hMCk7Qi52YWx1ZU9mKCk9PT15LnZhbHVlT2YoKSYmKEM9ITApfSl9KTt2YXIgRz10aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocSk7cT14P0E6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShBKS0odGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp3KTt3PUM/Cnk6dGhpcy5pbnZlcnQodGhpcy5zY2FsZSh5KSsodGhpcy5zY2FsZSh5KS10aGlzLnNjYWxlKEEpKSp3KTt0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oRyk7cmV0dXJuIHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD90aGlzLl9uaWNlRG9tYWluKFtxLHddKTpbcSx3XX07bi5wcm90b3R5cGUuc25hcHBpbmdEb21haW5FbmFibGVkPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9cSx0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCkpfTtuLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKTt9O24ucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihxKXtudWxsIT1xJiYodGhpcy5fZG9tYWluTWluPXFbMF0sdGhpcy5fZG9tYWluTWF4PXFbMV0pOwpyZXR1cm4gbS5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxxKX07bi5wcm90b3R5cGUuZG9tYWluTWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuZG9tYWluKClbMF07dGhpcy5fZG9tYWluTWluPXE7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5kb21haW5NYXg9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVsxXTt0aGlzLl9kb21haW5NYXg9cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHEpe3E9ci5leHRlbnQocS5maWx0ZXIoZnVuY3Rpb24odSl7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKCt1KX0pKTtyZXR1cm4gbnVsbD09cVswXXx8bnVsbD09cVsxXT9bXTpxfTtuLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHEsdSl7dmFyIHc9dGhpczt0aGlzLmRvbWFpbih0aGlzLnJhbmdlKCkubWFwKGZ1bmN0aW9uKEEpe3JldHVybiB3LmludmVydChsLnpvb21PdXQoQSwKcSx1KSl9KSl9O24ucHJvdG90eXBlLnBhbj1mdW5jdGlvbihxKXt2YXIgdT10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHUuaW52ZXJ0KHcrcSl9KSl9O24ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpO307bi5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnRlZFRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCIpO307bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKTsKfTtuLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpO307bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHcpe3JldHVybiBwLk1hdGguaXNOYU4odyl8fEluZmluaXR5PT09d3x8LUluZmluaXR5PT09d311KHFbMF0pfHx1KHFbMV0pP3AuV2luZG93Lndhcm4oIldhcm5pbmc6IFF1YW50aXRhdGl2ZVNjYWxlcyBjYW5ub3QgdGFrZSBOYU4gb3IgSW5maW5pdHkgYXMgYSBkb21haW4gdmFsdWUuIElnbm9yaW5nLiIpOm0ucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpO307bi5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0dlbmVyYXRvcih0aGlzKX07Cm4ucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9uaWNlRG9tYWluIik7fTtuLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZGVmYXVsdEV4dGVudCIpO307bi5wcm90b3R5cGUudGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBxPVBsb3R0YWJsZS5TY2FsZXMuVGlja0dlbmVyYXRvcnMuaW50ZWdlclRpY2tHZW5lcmF0b3IoKTtudWxsIT1xJiYodGhpcy5fdGlja0dlbmVyYXRvcj1xKX07cmV0dXJuIG59KGgoMTcpLlNjYWxlKTtkLl9ERUZBVUxUX05VTV9USUNLUz0xMDtmLlF1YW50aXRhdGl2ZVNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpO2YuY29lcmNlRXh0ZXJuYWxEMz1mdW5jdGlvbihyKXtpZihudWxsPT1yLmF0dHJzKXtpZihudWxsPT1yLm5vZGVzKXt2YXIgbD1bXTtyLmVhY2goZnVuY3Rpb24oKXtsLnB1c2godGhpcyl9KTsKcmV0dXJuIGsuc2VsZWN0QWxsKGwpfXJldHVybiBrLnNlbGVjdEFsbChyLm5vZGVzKCkpfXJldHVybiByfX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDgzKSk7ayhoKDg0KSk7ayhoKDg1KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg0NCkpO2soaCg0NSkpO2soaCg0NikpO2soaCgxOCkpO2soaCg2KSk7ayhoKDMzKSk7ayhoKDM0KSk7ayhoKDQ3KSk7ayhoKDkpKTtrKGgoNDgpKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3ZhciBrPXRoaXM7dGhpcy5fYW5jaG9yQ2FsbGJhY2s9ZnVuY3Rpb24ocil7cmV0dXJuIGsuX2FuY2hvcihyKX07dGhpcy5fZW5hYmxlZD0hMH1oLnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbihrKXt0aGlzLl9kaXNjb25uZWN0KCk7CnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89azt0aGlzLl9jb25uZWN0KCk7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRldGFjaEZyb209ZnVuY3Rpb24oKXt0aGlzLmRldGFjaCgpfTtoLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLl9kaXNjb25uZWN0KCk7dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1udWxsO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9ayk/dGhpcy5fY29ubmVjdCgpOnRoaXMuX2Rpc2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9O2gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9O2gucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKGspe3ZhciByPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7CnJldHVybnt4OmsueC1yLngseTprLnktci55fX07aC5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PWZ1bmN0aW9uKGspe3JldHVybiAwPD1rLngmJjA8PWsueSYmay54PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJmsueTw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07aC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQoKSYmbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmIXRoaXMuX2lzQW5jaG9yZWQpdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O2gucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKTtudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9O3JldHVybiBofSgpOwpmLkludGVyYWN0aW9uPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJihuW3ddPXFbd10pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0scj1oKDMpLGw9aCgwKSxwPWgoNTIpLG09aCgyKTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTt1Ll9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO3UuX2RlZmVycmVkUmVuZGVyaW5nPSExO3UuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24odyxBLHkseCl7dS5faXNBbmNob3JlZCYmKG51bGwhPXUuX3JlbmRlckFyZWEmJnUuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwKInRyYW5zbGF0ZSgiK3crIiwgIitBKyIpIHNjYWxlKCIreSsiLCAiK3grIikiKSxudWxsIT11Ll9jYW52YXMmJnUuX2NhbnZhcy5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdysicHgsICIrQSsicHgpIHNjYWxlKCIreSsiLCAiK3grIikiKSl9O3UuYWRkQ2xhc3MoInh5LXBsb3QiKTt1Ll9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9O3UuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKX07dS5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtpZih1LmRlZmVycmVkUmVuZGVyaW5nKCkpe3ZhciB3PXUueCgpJiZ1LngoKS5zY2FsZSxBPXUueSgpJiZ1LnkoKS5zY2FsZTt1Ll9kZWZlcnJlZFJlbmRlcmVyLnVwZGF0ZURvbWFpbnModyxBKX1lbHNlIHUucmVuZGVyKCl9Owp1Ll9kZWZlcnJlZFJlbmRlcmVyPW5ldyBwLkRlZmVycmVkUmVuZGVyZXIoZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW5kZXIoKX0sdS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybSk7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuZGVmZXJyZWRSZW5kZXJpbmcoKSYmdGhpcy5fZGVmZXJyZWRSZW5kZXJlci5yZXNldFRyYW5zZm9ybXMoKTtyZXR1cm4gbi5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyl9O3EucHJvdG90eXBlLmRlZmVycmVkUmVuZGVyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nfTtxLnByb3RvdHlwZS54PWZ1bmN0aW9uKHUsdyxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9YX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1hfS0VZLHUsdyxBKTt1PXRoaXMud2lkdGgoKTtudWxsIT13JiZudWxsIT11JiZ3LnJhbmdlKFswLHVdKTsKdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUueT1mdW5jdGlvbih1LHcsQSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQocS5fWV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShxLl9ZX0tFWSx1LHcsQSk7dT10aGlzLmhlaWdodCgpO251bGwhPXcmJm51bGwhPXUmJih3IGluc3RhbmNlb2Ygci5DYXRlZ29yeT93LnJhbmdlKFswLHVdKTp3LnJhbmdlKFt1LDBdKSk7dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKHUpe3JldHVybiJ4Ij09PXUmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/dGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoInkiKToKInkiPT09dSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieCIpOm51bGx9O3EucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih1KXt1PXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHUpO2lmKG51bGwhPXUpe3ZhciB3PXUuYWNjZXNzb3IsQT11LnNjYWxlO2lmKG51bGwhPUEpcmV0dXJuIGZ1bmN0aW9uKHkseCxDKXt2YXIgRz1BLnJhbmdlKCk7cmV0dXJuIGwuTWF0aC5pblJhbmdlKEEuc2NhbGUodyh5LHgsQykpLEdbMF0sR1sxXSl9fXJldHVybiBudWxsfTtxLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx3KXtuLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHUsdyk7dS5vZmZVcGRhdGUodz09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9OwpxLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHUsdyl7bi5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx3KTt1Lm9uVXBkYXRlKHc9PT1xLl9YX0tFWT90aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrOnRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayk7dGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZT1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPwoieCI6dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj8ieSI6Im5vbmUiO3N3aXRjaCh1KXtjYXNlICJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlICJ5Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3RoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITA7dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKTticmVhaztjYXNlICJub25lIjp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPXRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiSW52YWxpZCBzY2FsZSBuYW1lICciK3UrIicsIG11c3QgYmUgJ3gnLCAneScgb3IgJ25vbmUnIik7fXJldHVybiB0aGlzfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHUsdyxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcywKdSx3LEEpO3U9KHU9dGhpcy54KCkpJiZ1LnNjYWxlO251bGwhPXUmJnUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk7dT0odT10aGlzLnkoKSkmJnUuc2NhbGU7bnVsbCE9dSYmKHUgaW5zdGFuY2VvZiByLkNhdGVnb3J5P3UucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pOnUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbj1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLnNjYWxlO251bGwhPXUmJnUuYXV0b0RvbWFpbigpfTtxLnByb3RvdHlwZS5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy55KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLnNob3dBbGxEYXRhPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7dGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVg9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCl9O3EucHJvdG90eXBlLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWT1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX3Byb2plY3RvcnNSZWFkeT1mdW5jdGlvbigpe3ZhciB1PXRoaXMueCgpLHc9dGhpcy55KCk7cmV0dXJuIG51bGwhPXUmJm51bGwhPXUuYWNjZXNzb3ImJm51bGwhPXcmJm51bGwhPXcuYWNjZXNzb3J9O3EucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHUsdyxBKXt2YXIgeT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpyZXR1cm57eDp5KHUsdyxBKSx5OngodSx3LEEpfX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KHkseCxDKXt2YXIgRz1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHcueCgpKSh5LHgsQyk7eT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHcueSgpKSh5LHgsQyk7cmV0dXJuIGwuTWF0aC5pc1ZhbGlkTnVtYmVyKEcpJiZsLk1hdGguaXNWYWxpZE51bWJlcih5KX12YXIgdz10aGlzLEE9bi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5KXtBLnNldCh5LEEuZ2V0KHkpLmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiB1KHgsQyx5KX0pKX0pO3JldHVybiBBfTtyZXR1cm4gcX0obS5QbG90KTtkLl9YX0tFWT0ieCI7ZC5fWV9LRVk9InkiO2YuWFlQbG90PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9CiEwO3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITE7dGhpcy5fdXBkYXRlSWQ9MDt0aGlzLl9jYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnM9bmV3IGsuU2V0fXIucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3IucHJvdG90eXBlLl9nZXRBbGxJbmNsdWRlZFZhbHVlcz1mdW5jdGlvbihsKXt2YXIgcD10aGlzO3ZvaWQgMD09PWwmJihsPSExKTt2YXIgbT1bXTt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe249bihwLGwpO209bS5jb25jYXQobil9KTtyZXR1cm4gbX07ci5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybltdfTtyLnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuYWRkKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShsKTsKcmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKys7dGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9O3IucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMDt0aGlzLl9zZXREb21haW4odGhpcy5fZ2V0RXh0ZW50KCkpfTtyLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX07ci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGUiKTt9O3IucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O3IucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9nZXREb21haW4oKTsKdGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITE7dGhpcy5fc2V0RG9tYWluKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9nZXREb21haW4iKTt9O3IucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obCl7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzc3x8KHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITAsdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKGwpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSl9O3IucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKTt9O3IucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldFJhbmdlKCk7CnRoaXMuX3NldFJhbmdlKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIik7fTtyLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIik7fTtyLnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKGwpe3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZChsKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07ci5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9OwpyZXR1cm4gcn0oKTtmLlNjYWxlPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHEsdSx3LEEpe2Zvcih2YXIgeT17fSx4PTA7eDx1Lmxlbmd0aDt4Kyspe3ZhciBDPXVbeF07cS5oYXNPd25Qcm9wZXJ0eShDKSYmKHlbQ109cVtDXSh3LEEpKX1yZXR1cm4geX1mdW5jdGlvbiByKHEpe3JldHVybihudWxsIT1xWyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQocVsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gbChxKXtyZXR1cm4obnVsbCE9cVsiZmlsbC1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJmaWxsLW9wYWNpdHkiXSk6MSkqKG51bGwhPXEub3BhY2l0eT9wYXJzZUZsb2F0KHEub3BhY2l0eSk6MSl9ZnVuY3Rpb24gcChxKXtyZXR1cm4gbnVsbCE9cVsic3Ryb2tlLXdpZHRoIl0/cGFyc2VGbG9hdChxWyJzdHJva2Utd2lkdGgiXSk6MX1mdW5jdGlvbiBtKHEsdSl7aWYodS5zdHJva2Upe3EubGluZVdpZHRoPQpwKHUpO3ZhciB3PW4uY29sb3IodS5zdHJva2UpO3cub3BhY2l0eSo9cih1KTtxLnN0cm9rZVN0eWxlPXcudG9TdHJpbmcoKTtxLnN0cm9rZSgpfXUuZmlsbCYmKHc9bi5jb2xvcih1LmZpbGwpLHcub3BhY2l0eSo9bCh1KSxxLmZpbGxTdHlsZT13LnRvU3RyaW5nKCkscS5maWxsKCkpfXZhciBuPWgoMSk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHEodSx3KXt0aGlzLl9jb250ZXh0PXU7dGhpcy5fZHJhd1N0ZXA9d31xLnByb3RvdHlwZS5nZXREcmF3U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmF3U3RlcH07cS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih1LHcpe3c9d1t3Lmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpO3RoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdSx3KTt0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX07cS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PQpmdW5jdGlvbigpe3JldHVybiBudWxsfTtxLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9O3JldHVybiBxfSgpO2YuQ2FudmFzRHJhd2VyPWQ7Zi5Db250ZXh0U3R5bGVBdHRycz0iZmlsbC1vcGFjaXR5IGZpbGwgb3BhY2l0eSBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggc3Ryb2tlIi5zcGxpdCgiICIpO2YucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzPWZ1bmN0aW9uKHEsdSx3LEEpe3JldHVybiBrKHEsZi5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQodSksdyxBKX07Zi5yZXNvbHZlQXR0cmlidXRlcz1rO2YuZ2V0U3Ryb2tlV2lkdGg9cDtmLnJlbmRlckFyZWE9ZnVuY3Rpb24ocSx1LHcsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh3KTtxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlckxpbmU9ZnVuY3Rpb24ocSx1LHcsQSl7cS5zYXZlKCk7cS5iZWdpblBhdGgoKTt1LmNvbnRleHQocSk7dSh3KTsKcS5saW5lSm9pbj0icm91bmQiO20ocSxBKTtxLnJlc3RvcmUoKX07Zi5yZW5kZXJQYXRoV2l0aFN0eWxlPW19LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg1MCkpO2soaCgyNykpO2soaCg1MSkpO2soaCg5MykpO2soaCg1MykpO2soaCg5NCkpO2soaCg5NSkpO2soaCg5NikpO2soaCg5NykpO2soaCg5OCkpO2soaCg5OSkpO2soaCgxMDApKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9ayhoKDkyKSk7ayhoKDkxKSk7ZD1oKDQ5KTtmLnNpZ249ZC5zaWdufSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMTM0KSk7ayhoKDEzNSkpO2soaCgxMzYpKTtrKGgoMTM3KSl9LGZ1bmN0aW9uKGQsCmYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHcgaW4gcSlxLmhhc093blByb3BlcnR5KHcpJiYoblt3XT1xW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCgxKSxsPWgoNSk7ZD1oKDQpO3ZhciBwPWgoOCksbT1oKDApO2g9aCgxMCk7Zi5BeGlzT3JpZW50YXRpb249aC5tYWtlRW51bShbImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInRvcCJdKTtoPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEodSx3KXt2YXIgQT1uLmNhbGwodGhpcyl8fHRoaXM7QS5fZW5kVGlja0xlbmd0aD01O0EuX2lubmVyVGlja0xlbmd0aD01O0EuX3RpY2tMYWJlbFBhZGRpbmc9MTA7QS5fbWFyZ2luPTE1O0EuX3Nob3dFbmRUaWNrTGFiZWxzPSExO0EuX2Fubm90YXRpb25zRW5hYmxlZD0hMTtBLl9hbm5vdGF0aW9uVGllckNvdW50PQoxO2lmKG51bGw9PXV8fG51bGw9PXcpdGhyb3cgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtBLl9zY2FsZT11O0Eub3JpZW50YXRpb24odyk7QS5fc2V0RGVmYXVsdEFsaWdubWVudCgpO0EuYWRkQ2xhc3MoImF4aXMiKTtBLmlzSG9yaXpvbnRhbCgpP0EuYWRkQ2xhc3MoIngtYXhpcyIpOkEuYWRkQ2xhc3MoInktYXhpcyIpO0EuZm9ybWF0dGVyKHAuaWRlbnRpdHkoKSk7QS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEEuX3Jlc2NhbGUoKX07QS5fc2NhbGUub25VcGRhdGUoQS5fcmVzY2FsZUNhbGxiYWNrKTtBLl9hbm5vdGF0ZWRUaWNrcz1bXTtBLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXAuaWRlbnRpdHkoKTtyZXR1cm4gQX1rKHEsbik7cS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX07CnEucHJvdG90eXBlLnRpY2tMYWJlbERhdGFPbkVsZW1lbnQ9ZnVuY3Rpb24odSl7aWYobnVsbCE9dSl7Zm9yKHZhciB3O251bGwhPXUmJnUuY2xhc3NMaXN0JiZ2b2lkIDA9PT13Oyl1LmNsYXNzTGlzdC5jb250YWlucyhxLlRJQ0tfTEFCRUxfQ0xBU1MpP3c9dTp1PXUucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwPT09dT92b2lkIDA6ci5zZWxlY3QodSkuZGF0dW0oKX19O3EucHJvdG90eXBlLl9jb21wdXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciB1PTAsdz0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKHc9dGhpcy5fY29tcHV0ZUhlaWdodCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQT0KdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMipxLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7dys9QSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKX19ZWxzZSB1PXRoaXMuX2NvbXB1dGVXaWR0aCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYoQT10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyx1Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKTtyZXR1cm57bWluV2lkdGg6dSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCl9O3EucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuX3Jlc2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfTtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbih1LHcsQSl7bi5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdSx3LEEpO3RoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5fc2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih1LHcpe3ZhciBBPXRoaXMucmVxdWVzdGVkU3BhY2UodSx3KTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dSxoZWlnaHQ6QS5taW5IZWlnaHR9OntoZWlnaHQ6dyx3aWR0aDpBLm1pbldpZHRofX07cS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj0KdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKTt0aGlzLl9iYXNlbGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tbGluZS1jb250YWluZXIiLCEwKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tY2lyY2xlLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsITApO3ZhciB1PXRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiLAohMCk7dT1uZXcgbC5TdmdDb250ZXh0KHUubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih1KTt0aGlzLl9hbm5vdGF0aW9uV3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIsdSl9O3EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHc9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitxLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh1KSxBPXcuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh3KTtBLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpKTtyLnNlbGVjdChBLm5vZGVzKClbMF0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTsKci5zZWxlY3QoQS5ub2RlcygpW3UubGVuZ3RoLTFdKS5jbGFzc2VkKHEuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSk7dy5leGl0KCkucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUuYXR0cnModGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCkpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGVkVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGVkVGlja3N9O3EucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjt0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyPXU7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbnNFbmFibGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWR9O3EucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudH07cS5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoZmEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiB5KGZhKTtjYXNlICJ0b3AiOmNhc2UgImxlZnQiOnJldHVybiB5KGZhKS1ELmdldChmYSkuaGVpZ2h0fX1mdW5jdGlvbiB3KGZhKXtyZXR1cm4gTC5oYXMoZmEpPyJoaWRkZW4iOiJ2aXNpYmxlIn1mdW5jdGlvbiBBKGZhKXtyZXR1cm4gQy5fc2NhbGUuc2NhbGUoZmEpfWZ1bmN0aW9uIHkoZmEpe3N3aXRjaChDLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnJldHVybiBLLmdldChmYSkqSCtPO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIEotCk8tSy5nZXQoZmEpKkh9fWZ1bmN0aW9uIHgoZmEsb2EsWil7ZmE9ZmEuc2VsZWN0QWxsKCIuIitaKS5kYXRhKEIpO29hPWZhLmVudGVyKCkuYXBwZW5kKG9hKS5jbGFzc2VkKFosITApLm1lcmdlKGZhKTtmYS5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIG9hfXZhciBDPXRoaXMsRz1xLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcsRD1uZXcgbS5NYXAsQj10aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCk7Qi5mb3JFYWNoKGZ1bmN0aW9uKGZhKXt2YXIgb2E9Qy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoQy5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoZmEpKTtELnNldChmYSx7d2lkdGg6b2Eud2lkdGgrMipHLGhlaWdodDpvYS5oZWlnaHQrMipHfSl9KTt2YXIgSD10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKkcsSz10aGlzLl9hbm5vdGF0aW9uVG9UaWVyKEQpLEw9bmV3IG0uU2V0LEo9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOgp0aGlzLndpZHRoKCksTz10aGlzLl9jb3JlU2l6ZSgpLFM9TWF0aC5taW4odGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCksTWF0aC5mbG9vcigoSi1PKS9IKSk7Sy5mb3JFYWNoKGZ1bmN0aW9uKGZhLG9hKXsoLTE9PT1mYXx8ZmE+PVMpJiZMLmFkZChvYSl9KTtzd2l0Y2godGhpcy5vcmllbnRhdGlvbigpKXtjYXNlICJib3R0b20iOmNhc2UgInJpZ2h0Ijp2YXIgTj0wO2JyZWFrO2Nhc2UgInRvcCI6Tj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOk49dGhpcy53aWR0aCgpfXZhciBSPXRoaXMuaXNIb3Jpem9udGFsKCk7eCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwibGluZSIscS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MpLmF0dHJzKHt4MTpSP0E6Tix4MjpSP0E6eSx5MTpSP046QSx5MjpSP3k6QSx2aXNpYmlsaXR5Ond9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiksCiJjaXJjbGUiLHEuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MpLmF0dHJzKHtjeDpSP0E6TixjeTpSP046QSxyOjN9KTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIpLCJyZWN0IixxLkFOTk9UQVRJT05fUkVDVF9DTEFTUykuYXR0cnMoe3g6Uj9BOnUseTpSP3U6QSx3aWR0aDpSP2Z1bmN0aW9uKGZhKXtyZXR1cm4gRC5nZXQoZmEpLndpZHRofTpmdW5jdGlvbihmYSl7cmV0dXJuIEQuZ2V0KGZhKS5oZWlnaHR9LGhlaWdodDpSP2Z1bmN0aW9uKGZhKXtyZXR1cm4gRC5nZXQoZmEpLmhlaWdodH06ZnVuY3Rpb24oZmEpe3JldHVybiBELmdldChmYSkud2lkdGh9LHZpc2liaWxpdHk6d30pO3ZhciBYPXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsYWE9dGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCk7Tj14KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiKSwiZyIscS5BTk5PVEFUSU9OX0xBQkVMX0NMQVNTKTsKTi5zZWxlY3RBbGwoIi50ZXh0LWNvbnRhaW5lciIpLnJlbW92ZSgpO04uYXR0cnMoe3RyYW5zZm9ybTpmdW5jdGlvbihmYSl7dmFyIG9hPVI/QShmYSk6dShmYSk7ZmE9Uj91KGZhKTpBKGZhKTtyZXR1cm4idHJhbnNsYXRlKCIrb2ErIiwiK2ZhKyIpIn0sdmlzaWJpbGl0eTp3fSkuZWFjaChmdW5jdGlvbihmYSl7WC53cml0ZShhYShmYSksUj9ELmdldChmYSkud2lkdGg6RC5nZXQoZmEpLmhlaWdodCxSP0QuZ2V0KGZhKS5oZWlnaHQ6RC5nZXQoZmEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpSPzA6OTB9LHIuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHc9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6Cm0uTWF0aC5pblJhbmdlKHUuX3NjYWxlLnNjYWxlKEEpLHdbMF0sd1sxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksdz10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4odyx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgdz10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9CncuX3NjYWxlLnNjYWxlKEMpLEQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+eCl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihLKXtyZXR1cm4gQVtLXS5zb21lKGZ1bmN0aW9uKEwpe3ZhciBKPXcuX3NjYWxlLnNjYWxlKEwpO0w9dS5nZXQoTCkud2lkdGg7cmV0dXJuIEcrRD49SiYmRzw9SitMfSl9LEg9MDtCKEgpOylIKyssQS5sZW5ndGg9PT1IJiZBLnB1c2goW10pO0FbSF0ucHVzaChDKTt5LnNldChDLEgpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoeCl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHgpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp3LHkueDI9dyk6KHkueTE9dyx5LnkyPXcpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt3LmVtcHR5KCl8fHcuZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHc9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT1yLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXcuaW5kZXhPZihBKSYmci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXIucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07ci5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3IucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3IucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3IucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTtyLnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHJ9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT1yW2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHIobixxLHUsdyl7dmFyIEE9MTxxO3U9QT93OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUsdyxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09dyYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobikseD1tKG4pLEM9eD9JbmZpbml0eTotSW5maW5pdHk7eD14Py1JbmZpbml0eTpJbmZpbml0eTt3PW51bGw9PQp3P0M6dztBPW51bGw9PUE/eDpBO3g9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9eFswXTt4PXhbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7dmFyIEc9aCh4LHEsdSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXcpPyhxPShBLXcpLyh4LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHgscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh4LHEsQSksem9vbUFtb3VudDpxfTpDPHchPXk/e2NlbnRlclBvaW50OmsobixxLHcpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx3LEEseSx4KXtxPXIobixxLHcsQSk7cmV0dXJuIGwobixxLHUseSx4KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz1yO2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx3KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHg9QVsxXTtBPXAobik7MDxxIT09QT8odT13LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih4KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhILApLLEwpe3ZhciBKPUguc2NhbGU7aWYoSiBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTD1KLnJhbmdlQmFuZCgpO2Vsc2V7dmFyIE89SC5hY2Nlc3NvcjtIPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihLLm1hcChmdW5jdGlvbihTKXtyZXR1cm4gUy5kYXRhKCkubWFwKGZ1bmN0aW9uKE4sUil7cmV0dXJuIE8oTixSLFMpfSkuZmlsdGVyKGZ1bmN0aW9uKE4pe3JldHVybiBudWxsIT1OfSkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBOLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuK1N9KTtILnNvcnQoZnVuY3Rpb24oUyxOKXtyZXR1cm4gUy1OfSk7SD1ILm1hcChmdW5jdGlvbihTKXtyZXR1cm4gSi5zY2FsZShTKX0pO0g9bC5wYWlycyhIKTtMPUMuTWF0aC5taW4oSCxmdW5jdGlvbihTKXtyZXR1cm4gTWF0aC5hYnMoU1sxXS1TWzBdKX0sTCpCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7TCo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gTH0KdmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEgsSyl7ZnVuY3Rpb24gTCgpe3RoaXMuY29uc3RydWN0b3I9SH1mb3IodmFyIEogaW4gSylLLmhhc093blByb3BlcnR5KEopJiYoSFtKXT1LW0pdKTtILnByb3RvdHlwZT1udWxsPT09Sz9PYmplY3QuY3JlYXRlKEspOihMLnByb3RvdHlwZT1LLnByb3RvdHlwZSxuZXcgTCl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx3PWgoMzQpLEE9aCgyMCkseT1oKDMpLHg9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSyhMKXt2b2lkIDA9PT0KTCYmKEw9InZlcnRpY2FsIik7dmFyIEo9SC5jYWxsKHRoaXMpfHx0aGlzO0ouX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtKLl9sYWJlbHNFbmFibGVkPSExO0ouX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0ouX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0ouX2JhckFsaWdubWVudD0ibWlkZGxlIjtKLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0ouX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7Si5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TCYmImhvcml6b250YWwiIT09TCl0aHJvdyBFcnJvcihMKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0ouX2lzVmVydGljYWw9InZlcnRpY2FsIj09PUw7Si5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0ouYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtKLmF0dHIoSy5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEouX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtKLl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7Si5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ouYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEp9cihLLEgpO0sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTCxKLE8pe0gucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLEwsSixPKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLng9ZnVuY3Rpb24oTCxKKXtpZihudWxsPT1MKXJldHVybiBILnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09Sj9ILnByb3RvdHlwZS54LmNhbGwodGhpcyxMKTpILnByb3RvdHlwZS54LmNhbGwodGhpcyxMLEopO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS55PWZ1bmN0aW9uKEwsSil7aWYobnVsbD09CkwpcmV0dXJuIEgucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1KP0gucHJvdG90eXBlLnkuY2FsbCh0aGlzLEwpOkgucHJvdG90eXBlLnkuY2FsbCh0aGlzLEwsSik7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O0sucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O0sucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChLLl9CQVJfRU5EX0tFWSl9O0sucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihMKXtpZihudWxsPT1MKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PUw7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtLLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtLLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3LlJlY3RhbmdsZVNWR0RyYXdlcihLLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKEwpe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTCl9KX07Sy5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtLLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBMPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIEw/TCBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O0sucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTCl7SC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTCl9O0sucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEwpe0gucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxMKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihMKXtILnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxMKX07Sy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTCl7SC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEwpO3JldHVybiB0aGlzfTtLLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihMKXtpZihudWxsPT1MKXJldHVybiBILnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0gucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTCxKKXtpZihudWxsPT1MKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TDtudWxsIT1KJiYodGhpcy5fbGFiZWxzUG9zaXRpb249Sik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKEwpe2lmKG51bGw9PUwpcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPUw7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0sucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTCl7dmFyIEo9SC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTCksTz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoSy5fTEFCRUxfQVJFQV9DTEFTUywKITApLFM9bmV3IHAuU3ZnQ29udGV4dChPLm5vZGUoKSksTj1uZXcgcC5DYWNoZU1lYXN1cmVyKFMpO1M9bmV3IHAuV3JpdGVyKE4sUyk7dGhpcy5fbGFiZWxDb25maWcuc2V0KEwse2xhYmVsQXJlYTpPLG1lYXN1cmVyOk4sd3JpdGVyOlN9KTtyZXR1cm4gSn07Sy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihMKXtILnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxMKTt2YXIgSj10aGlzLl9sYWJlbENvbmZpZy5nZXQoTCk7bnVsbCE9SiYmKEoubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShMKSl9O0sucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTCl7dmFyIEo9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gTyhiYSxrYSxXLEVhKXtyZXR1cm4gSi5fcGl4ZWxQb2ludEJhcihmYShiYSxrYSxXKSxvYSxFYSl9CnZhciBTPUouX2lzVmVydGljYWw/TC54OkwueSxOPUouX2lzVmVydGljYWw/TC55OkwueCxSPUouYm91bmRzKCksWD17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueC1SLnRvcExlZnQueH0sYWE9e21pbjowLG1heDpSLmJvdHRvbVJpZ2h0LnktUi50b3BMZWZ0Lnl9LGZhPUQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoSi5sZW5ndGgoKSksb2E9Si5sZW5ndGgoKS5zY2FsZS5zY2FsZShKLmJhc2VsaW5lVmFsdWUoKSksWj1JbmZpbml0eSxjYT1JbmZpbml0eSxqYTtKLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihiYSl7dmFyIGthPUouX2VudGl0eUJvdW5kcyhiYSk7aWYoQy5ET00uaW50ZXJzZWN0c0JCb3goWCxhYSxrYSkpe3ZhciBXPTAsRWE9MDtpZighQy5ET00uaW50ZXJzZWN0c0JCb3goTC54LEwueSxrYSwuNSkpe0VhPU8oYmEuZGF0dW0sYmEuaW5kZXgsYmEuZGF0YXNldCxrYSk7Vz1NYXRoLmFicyhTLShKLl9pc1ZlcnRpY2FsP0VhLng6RWEueSkpOwp2YXIgdmE9Si5faXNWZXJ0aWNhbD9rYS55OmthLng7a2E9dmErKEouX2lzVmVydGljYWw/a2EuaGVpZ2h0OmthLndpZHRoKTtFYT1OPj12YS0uNSYmTjw9a2ErLjU/MDpNYXRoLmFicyhOLShKLl9pc1ZlcnRpY2FsP0VhLnk6RWEueCkpfWlmKFc8Wnx8Vz09PVomJkVhPGNhKWphPWJhLFo9VyxjYT1FYX19KTtpZih2b2lkIDAhPT1qYSlyZXR1cm4gSi5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KGphKX0pfTtLLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEwpe3JldHVybiB0aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyhMLngsTC55KX07Sy5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEwsSil7dmFyIE89dGhpcyxTPVtdO3RoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKE4pe0MuRE9NLmludGVyc2VjdHNCQm94KEwsSixPLl9lbnRpdHlCb3VuZHMoTikpJiZTLnB1c2goTy5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pKX0pOwpyZXR1cm4gU307Sy5wcm90b3R5cGUuX3VwZGF0ZUxlbmd0aFNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpe3ZhciBMPXRoaXMubGVuZ3RoKCkuc2NhbGU7TCBpbnN0YW5jZW9mIHguUXVhbnRpdGF0aXZlU2NhbGUmJihMLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSxMLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9fTtLLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBMPXRoaXM7dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7cmV0dXJuIEgucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwoTCl9KX07Sy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihMKXt2YXIgSj10aGlzLE89dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7Ck89e3gxOnRoaXMuX2lzVmVydGljYWw/MDpPLHkxOnRoaXMuX2lzVmVydGljYWw/TzowLHgyOnRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOk8seTI6dGhpcy5faXNWZXJ0aWNhbD9POnRoaXMuaGVpZ2h0KCl9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUsTyk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUyl7cmV0dXJuIEouX2xhYmVsQ29uZmlnLmdldChTKS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KTt0aGlzLl9sYWJlbHNFbmFibGVkJiZDLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEouX2RyYXdMYWJlbHMoKX0sTCl9O0sucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihMKXt2YXIgSj10aGlzLE89SC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxMKTtpZigieCI9PT1MJiZ0aGlzLl9pc1ZlcnRpY2FsKUw9dGhpcy54KCk7CmVsc2V7aWYoInkiIT09THx8dGhpcy5faXNWZXJ0aWNhbClyZXR1cm4gTztMPXRoaXMueSgpfWlmKCEoTCYmTC5zY2FsZSYmTC5zY2FsZSBpbnN0YW5jZW9mIHguUXVhbnRpdGF0aXZlU2NhbGUpKXJldHVybiBPO3ZhciBTPUwuc2NhbGUsTj10aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpO3JldHVybiBPPU8ubWFwKGZ1bmN0aW9uKFIpe3JldHVybiBsLmV4dGVudChbUy5pbnZlcnQoSi5fZ2V0UG9zaXRpb25BdHRyKFMuc2NhbGUoUlswXSksTikpLFMuaW52ZXJ0KEouX2dldFBvc2l0aW9uQXR0cihTLnNjYWxlKFJbMF0pLE4pK04pLFMuaW52ZXJ0KEouX2dldFBvc2l0aW9uQXR0cihTLnNjYWxlKFJbMV0pLE4pKSxTLmludmVydChKLl9nZXRQb3NpdGlvbkF0dHIoUy5zY2FsZShSWzFdKSxOKStOKV0pfSl9O0sucHJvdG90eXBlLl9nZXRQb3NpdGlvbkF0dHI9ZnVuY3Rpb24oTCxKKXt0aGlzLl9pc1ZlcnRpY2FsfHwoTC09SixKKj0tMSk7c3dpdGNoKHRoaXMuX2JhckFsaWdubWVudCl7Y2FzZSAic3RhcnQiOnJldHVybiBMOwpjYXNlICJlbmQiOnJldHVybiBMLUo7ZGVmYXVsdDpyZXR1cm4gTC1KLzJ9fTtLLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBMPXRoaXMsSj10aGlzLl9nZXREYXRhVG9EcmF3KCksTz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxTPXRoaXMuZGF0YXNldHMoKS5zb21lKGZ1bmN0aW9uKE4pe3JldHVybiBKLmdldChOKS5zb21lKGZ1bmN0aW9uKFIsWCl7cmV0dXJuIG51bGw9PVI/ITE6TC5fZHJhd0xhYmVsKFIsWCxOLE8pfSl9KTt0aGlzLl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZSYmUyYmdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTil7cmV0dXJuIEwuX2xhYmVsQ29uZmlnLmdldChOKS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KX07Sy5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbihMLEosTyxTKXt2YXIgTj10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyksUj1OLmxhYmVsQXJlYSxYPU4ubWVhc3VyZXI7Tj1OLndyaXRlcjsKdmFyIGFhPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsZmE9YWEoTCxKLE8pO2FhPXRoaXMubGVuZ3RoKCkuc2NhbGU7dmFyIG9hPW51bGwhPWFhP2FhLnNjYWxlKGZhKTpmYSxaPW51bGwhPWFhP2FhLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxjYT17eDpTLngoTCxKLE8pLHk6Uy55KEwsSixPKX07YWE9e3dpZHRoOlMud2lkdGgoTCxKLE8pLGhlaWdodDpTLmhlaWdodChMLEosTyl9O2ZhPXRoaXMuX2xhYmVsRm9ybWF0dGVyKGZhLEwsSixPKTtYPVgubWVhc3VyZShmYSk7dmFyIGphPXRoaXMuX3Nob3VsZFNob3dMYWJlbE9uQmFyKGNhLGFhLFgpO2NhPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhjYSxhYSxYLGphLHRoaXMuX2lzVmVydGljYWw/b2E8PVo6b2E8Wik7b2E9Y2EuY29udGFpbmVyRGltZW5zaW9ucztaPWNhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2NhPWNhLmFsaWdubWVudDtMPVMuZmlsbChMLEosTyk7Uj10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihSLApaLGphLEwpO04ud3JpdGUoZmEsb2Eud2lkdGgsb2EuaGVpZ2h0LHt4QWxpZ246Y2EueCx5QWxpZ246Y2EueX0sUi5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP2FhLndpZHRoPFgud2lkdGg6YWEuaGVpZ2h0PFguaGVpZ2h0fTtLLnByb3RvdHlwZS5fc2hvdWxkU2hvd0xhYmVsT25CYXI9ZnVuY3Rpb24oTCxKLE8pe2lmKHRoaXMuX2xhYmVsc1Bvc2l0aW9uPT09Zi5MYWJlbHNQb3NpdGlvbi5vdXRzaWRlKXJldHVybiExO0w9dGhpcy5faXNWZXJ0aWNhbD9MLnk6TC54O3ZhciBTPXRoaXMuX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtKPXRoaXMuX2lzVmVydGljYWw/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCk7Tz10aGlzLl9pc1ZlcnRpY2FsP08uaGVpZ2h0Ok8ud2lkdGg7dmFyIE49TCtTO04+Sj9TPUotTDowPkwmJihTPU4pO3JldHVybiBPK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPD1TfTtLLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzPQpmdW5jdGlvbihMLEosTyxTLE4pe2Z1bmN0aW9uIFIoa2Epe3N3aXRjaChrYSl7Y2FzZSAidG9wTGVmdCI6Wj1YLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IjtqYSs9Sy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7YmErPUsuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2JyZWFrO2Nhc2UgImNlbnRlciI6YmErPShmYStvYSkvMjticmVhaztjYXNlICJib3R0b21SaWdodCI6Wj1YLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsamEtPUsuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLGJhKz1jYS1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1vYX19dmFyIFg9dGhpcyxhYT10aGlzLl9pc1ZlcnRpY2FsP0wueTpMLngsZmE9dGhpcy5faXNWZXJ0aWNhbD9KLmhlaWdodDpKLndpZHRoLG9hPXRoaXMuX2lzVmVydGljYWw/Ty5oZWlnaHQ6Ty53aWR0aCxaPSJjZW50ZXIiLGNhPWZhLGphPWFhLGJhPWFhO2lmKFMpc3dpdGNoKHRoaXMuX2xhYmVsc1Bvc2l0aW9uKXtjYXNlIGYuTGFiZWxzUG9zaXRpb24uc3RhcnQ6Tj8KUigiYm90dG9tUmlnaHQiKTpSKCJ0b3BMZWZ0Iik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLm1pZGRsZTpSKCJjZW50ZXIiKTticmVhaztjYXNlIGYuTGFiZWxzUG9zaXRpb24uZW5kOk4/UigidG9wTGVmdCIpOlIoImJvdHRvbVJpZ2h0Iil9ZWxzZSBOPyhaPXRoaXMuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiLGNhPWZhK0suX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK29hLGphLT1LLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitvYSxiYS09Sy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrb2EpOihaPXRoaXMuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixjYT1mYStLLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitvYSxiYSs9ZmErSy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIpO3JldHVybntjb250YWluZXJEaW1lbnNpb25zOnt3aWR0aDp0aGlzLl9pc1ZlcnRpY2FsP0oud2lkdGg6Y2EsaGVpZ2h0OnRoaXMuX2lzVmVydGljYWw/Y2E6Si5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/CkwueDpqYSx5OnRoaXMuX2lzVmVydGljYWw/amE6TC55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP0wueCtKLndpZHRoLzItTy53aWR0aC8yOmJhLHk6dGhpcy5faXNWZXJ0aWNhbD9iYTpMLnkrSi5oZWlnaHQvMi1PLmhlaWdodC8yfSxhbGlnbm1lbnQ6e3g6dGhpcy5faXNWZXJ0aWNhbD8iY2VudGVyIjpaLHk6dGhpcy5faXNWZXJ0aWNhbD9aOiJjZW50ZXIifX19O0sucHJvdG90eXBlLl9jcmVhdGVMYWJlbENvbnRhaW5lcj1mdW5jdGlvbihMLEosTyxTKXtMPUwuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSi54KyIsICIrSi55KyIpIik7Tz8oTC5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKSxPPTEuNipDLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsUyk8Qy5Db2xvci5jb250cmFzdCgiYmxhY2siLFMpLEwuY2xhc3NlZChPPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKSk6TC5jbGFzc2VkKCJvZmYtYmFyLWxhYmVsIiwhMCk7cmV0dXJuIEx9OwpLLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgTD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBKPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE89dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksUz10aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7Slt0aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCJdPWZ1bmN0aW9uKCl7cmV0dXJuIE99O0pbU109ZnVuY3Rpb24oKXtyZXR1cm4gMH07TC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6SixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLlJFU0VUKX0pfUwucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEcuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gTH07Sy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTChjYSwKamEsYmEpe3JldHVybiBNYXRoLmFicyhTLWFhKGNhLGphLGJhKSl9dmFyIEo9dGhpcyxPPUgucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLFM9dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTj10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUj10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxmYT1PW0suX0JBUl9USElDS05FU1NfS0VZXSxvYT1PLmdhcCxaPW51bGw9PW9hP2ZhOmZ1bmN0aW9uKGNhLGphLGJhKXtyZXR1cm4gZmEoY2EsamEsYmEpLW9hKGNhLGphLGJhKX07Ty53aWR0aD10aGlzLl9pc1ZlcnRpY2FsP1o6TDtPLmhlaWdodD10aGlzLl9pc1ZlcnRpY2FsP0w6WjtPW05dPWZ1bmN0aW9uKGNhLGphLGJhKXtjYT1hYShjYSxqYSxiYSk7cmV0dXJuIGNhPlM/ClM6Y2F9O09bUl09ZnVuY3Rpb24oY2EsamEsYmEpe3JldHVybiBKLl9nZXRQb3NpdGlvbkF0dHIoWChjYSxqYSxiYSksZmEoY2EsamEsYmEpKX07cmV0dXJuIE99O0sucHJvdG90eXBlLl91cGRhdGVUaGlja25lc3NBdHRyPWZ1bmN0aW9uKCl7dmFyIEw9dGhpcyxKPXRoaXMucG9zaXRpb24oKSxPPXRoaXMuYmFyRW5kKCk7bnVsbCE9SiYmbnVsbCE9Tz8odGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMSx0aGlzLmF0dHIoSy5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oUyxOLFIpe3ZhciBYPUouYWNjZXNzb3IoUyxOLFIpO1M9Ty5hY2Nlc3NvcihTLE4sUik7WD1KLnNjYWxlP0ouc2NhbGUuc2NhbGUoWCk6WDtTPU8uc2NhbGU/Ty5zY2FsZS5zY2FsZShTKTpTO3JldHVybiBNYXRoLmFicyhTLVgpfSkpOih0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwLHRoaXMuYXR0cihLLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbigpe3JldHVybiBMLl9iYXJQaXhlbFRoaWNrbmVzcygpfSkpfTsKSy5wcm90b3R5cGUuX2JhclBpeGVsVGhpY2tuZXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzKHRoaXMucG9zaXRpb24oKSx0aGlzLmRhdGFzZXRzKCksdGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6dGhpcy5oZWlnaHQoKSk6MDowfTtLLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihMKXt2b2lkIDA9PT1MJiYoTD10aGlzLmRhdGFzZXRzKCkpO3JldHVybiB0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT9ILnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsTCk6W119O0sucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oTCl7cmV0dXJuIHRoaXMuX3BpeGVsQm91bmRzKEwuZGF0dW0sTC5pbmRleCxMLmRhdGFzZXQpfTtLLnByb3RvdHlwZS5fcGl4ZWxCb3VuZHM9ZnVuY3Rpb24oTCxKLE8pe3ZhciBTPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwpyZXR1cm57eDpTLngoTCxKLE8pLHk6Uy55KEwsSixPKSx3aWR0aDpTLndpZHRoKEwsSixPKSxoZWlnaHQ6Uy5oZWlnaHQoTCxKLE8pfX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oTCxKLE8pe3ZhciBTPXRoaXMuX3BpeGVsQm91bmRzKEwsSixPKTtMPSh0aGlzLl9pc1ZlcnRpY2FsP0QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOkQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKShMLEosTyk7Sj0odGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKS5zY2FsZTp0aGlzLngoKS5zY2FsZSkuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpO3JldHVybiB0aGlzLl9waXhlbFBvaW50QmFyKEwsSixTKX07Sy5wcm90b3R5cGUuX3BpeGVsUG9pbnRCYXI9ZnVuY3Rpb24oTCxKLE8pe2lmKHRoaXMuX2lzVmVydGljYWwpe3ZhciBTPU8ueCtPLndpZHRoLzI7TD1MPD1KP08ueTpPLnkrTy5oZWlnaHR9ZWxzZSBTPUw+PUo/Ty54K08ud2lkdGg6Ty54LEw9Ty55K08uaGVpZ2h0LwoyO3JldHVybnt4OlMseTpMfX07Sy5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEwsSil7SC5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyxMLEopfTtLLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBMPXRoaXMsSj1uZXcgQy5NYXAsTz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxTPXRoaXMud2lkdGgoKSxOPXRoaXMuaGVpZ2h0KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUil7dmFyIFg9Ui5kYXRhKCkubWFwKGZ1bmN0aW9uKGFhLGZhKXtyZXR1cm4gTC5faXNEYXR1bU9uU2NyZWVuKE8sUyxOLGFhLGZhLFIpP2FhOm51bGx9KTtKLnNldChSLFgpfSk7cmV0dXJuIEp9O0sucHJvdG90eXBlLl9pc0RhdHVtT25TY3JlZW49ZnVuY3Rpb24oTCxKLE8sUyxOLFIpe3ZhciBYPUwueChTLE4sUiksYWE9TC55KFMsTixSKSxmYT1MLndpZHRoKFMsTixSKTtMPUwuaGVpZ2h0KFMsTixSKTsKcmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFgpJiZDLk1hdGguaXNWYWxpZE51bWJlcihhYSkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGZhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoTCk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoWCxhYSxmYSxMLEosTyk6ITF9O3JldHVybiBLfShoLlhZUGxvdCk7Qi5fQkFSX1RISUNLTkVTU19SQVRJTz0uOTU7Qi5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU89LjQ7Qi5fQkFSX0FSRUFfQ0xBU1M9ImJhci1hcmVhIjtCLl9CQVJfRU5EX0tFWT0iYmFyRW5kIjtCLl9CQVJfVEhJQ0tORVNTX0tFWT0id2lkdGgiO0IuX0xBQkVMX0FSRUFfQ0xBU1M9ImJhci1sYWJlbC10ZXh0LWFyZWEiO0IuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSPTEwO2YuQmFyPUJ9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odyxBKXtmdW5jdGlvbiB5KCl7dGhpcy5jb25zdHJ1Y3Rvcj13fWZvcih2YXIgeCBpbiBBKUEuaGFzT3duUHJvcGVydHkoeCkmJgood1t4XT1BW3hdKTt3LnByb3RvdHlwZT1udWxsPT09QT9PYmplY3QuY3JlYXRlKEEpOih5LnByb3RvdHlwZT1BLnByb3RvdHlwZSxuZXcgeSl9LHI9aCgxKSxsPWgoNSkscD1oKDgpLG09aCgzKSxuPWgoMCk7ZD1oKDEwKTt2YXIgcT1oKDIyKTtmLlRpbWVJbnRlcnZhbD1kLm1ha2VFbnVtKCJzZWNvbmQgbWludXRlIGhvdXIgZGF5IHdlZWsgbW9udGggeWVhciIuc3BsaXQoIiAiKSk7Zi5UaW1lQXhpc09yaWVudGF0aW9uPWQubWFrZUVudW0oWyJ0b3AiLCJib3R0b20iXSk7Zi5UaWVyTGFiZWxQb3NpdGlvbj1kLm1ha2VFbnVtKFsiYmV0d2VlbiIsImNlbnRlciJdKTtoPWZ1bmN0aW9uKHcpe2Z1bmN0aW9uIEEoeSx4KXt5PXcuY2FsbCh0aGlzLHkseCl8fHRoaXM7eS5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPW51bGw7eS5fdGllckxhYmVsUG9zaXRpb25zPVtdO3kuYWRkQ2xhc3MoInRpbWUtYXhpcyIpO3kudGlja0xhYmVsUGFkZGluZyg1KTt5LmF4aXNDb25maWd1cmF0aW9ucyhBLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyk7CnkuYW5ub3RhdGlvbkZvcm1hdHRlcihwLnRpbWUoIiVhICViICVkLCAlWSIpKTtyZXR1cm4geX1rKEEsdyk7QS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucztpZigheS5ldmVyeShmdW5jdGlvbih4KXtyZXR1cm4iYmV0d2VlbiI9PT14LnRvTG93ZXJDYXNlKCl8fCJjZW50ZXIiPT09eC50b0xvd2VyQ2FzZSgpfSkpdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpO3RoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucz15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLm1heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb247dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPXk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuY3VycmVudEF4aXNDb25maWd1cmF0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF19O0EucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsIT15KXt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnM9eTt0aGlzLl9udW1UaWVycz1uLk1hdGgubWF4KHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcubGVuZ3RofSksMCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fc2V0dXBEb21FbGVtZW50cygpO3k9dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoKTtmb3IodmFyIHg9W10sQz0wO0M8dGhpcy5fbnVtVGllcnM7QysrKXgucHVzaCh5W0NdfHwiYmV0d2VlbiIpO3RoaXMudGllckxhYmVsUG9zaXRpb25zKHgpO3RoaXMucmVkcmF3KCl9fTtBLnByb3RvdHlwZS5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXg9CmZ1bmN0aW9uKCl7dmFyIHk9dGhpcyx4PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGg7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24oQyxHKXtHPHgmJkMuZXZlcnkoZnVuY3Rpb24oRCl7cmV0dXJuIHkuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbihEKX0pJiYoeD1HKX0pO3g9PT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoJiYobi5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpLC0teCk7cmV0dXJuIHh9O0EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHkpe2lmKHkmJigicmlnaHQiPT09eS50b0xvd2VyQ2FzZSgpfHwibGVmdCI9PT15LnRvTG93ZXJDYXNlKCkpKXRocm93IEVycm9yKHkrIiBpcyBub3QgYSBzdXBwb3J0ZWQgb3JpZW50YXRpb24gZm9yIFRpbWVBeGlzIC0gb25seSBob3Jpem9udGFsIG9yaWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIik7CnJldHVybiB3LnByb3RvdHlwZS5vcmllbnRhdGlvbi5jYWxsKHRoaXMseSl9O0EucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt0aGlzLl90aWVySGVpZ2h0cz1bXTtmb3IodmFyIHg9MDt4PHRoaXMuX251bVRpZXJzO3grKyl0aGlzLl90aWVySGVpZ2h0cy5wdXNoKHkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrKCJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT8wOnRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpKSk7cmV0dXJuIHIuc3VtKHRoaXMuX3RpZXJIZWlnaHRzKX07QS5wcm90b3R5cGUuX2dldEludGVydmFsTGVuZ3RoPWZ1bmN0aW9uKHkpe3ZhciB4PXRoaXMuX3NjYWxlLmRvbWFpbigpWzBdO3k9bS5UaW1lLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHkuaW50ZXJ2YWwpLm9mZnNldCh4LHkuc3RlcCk7cmV0dXJuIHk+dGhpcy5fc2NhbGUuZG9tYWluKClbMV0/dGhpcy53aWR0aCgpOgpNYXRoLmFicyh0aGlzLl9zY2FsZS5zY2FsZSh5KS10aGlzLl9zY2FsZS5zY2FsZSh4KSl9O0EucHJvdG90eXBlLl9tYXhXaWR0aEZvckludGVydmFsPWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHkuZm9ybWF0dGVyKEEuX0xPTkdfREFURSkpLndpZHRofTtBLnByb3RvdHlwZS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHkpe2lmKG51bGwhPXRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbil7dmFyIHg9QS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uXSxDPUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3kuaW50ZXJ2YWxdO2lmKG51bGwhPXgmJm51bGwhPUMmJkM8eClyZXR1cm4hMX14PXRoaXMuX21heFdpZHRoRm9ySW50ZXJ2YWwoeSkrMip0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoeSksCnRoaXMud2lkdGgoKSk+PXh9O0EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHkseCl7dmFyIEM9dy5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHkseCk7eT10aGlzLl90aWVySGVpZ2h0cy5yZWR1Y2UoZnVuY3Rpb24oRyxEKXtyZXR1cm4gRytEPkMuaGVpZ2h0P0c6RytEfSk7eD10aGlzLm1hcmdpbigpKyh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKnRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk6MCk7Qy5oZWlnaHQ9TWF0aC5taW4oQy5oZWlnaHQseSt4KTtyZXR1cm4gQ307QS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fc2V0dXBEb21FbGVtZW50cygpfTtBLnByb3RvdHlwZS5fc2V0dXBEb21FbGVtZW50cz1mdW5jdGlvbigpe3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrQS5USU1FX0FYSVNfVElFUl9DTEFTUykucmVtb3ZlKCk7CnRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnM9W107dGhpcy5fdGllck1hcmtDb250YWluZXJzPVtdO3RoaXMuX3RpZXJCYXNlbGluZXM9W107dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnJlbW92ZSgpO3RoaXMuX2Jhc2VsaW5lLnJlbW92ZSgpO2Zvcih2YXIgeT0wO3k8dGhpcy5fbnVtVGllcnM7Kyt5KXt2YXIgeD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKEEuVElNRV9BWElTX1RJRVJfQ0xBU1MsITApO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMucHVzaCh4LmFwcGVuZCgiZyIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllck1hcmtDb250YWluZXJzLnB1c2goeC5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX01BUktfQ0xBU1MrIi1jb250YWluZXIiLCEwKSk7dGhpcy5fdGllckJhc2VsaW5lcy5wdXNoKHguYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKSl9eT1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbMF0ubm9kZSgpKTsKdGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih5KX07QS5wcm90b3R5cGUuX2dldFRpY2tJbnRlcnZhbFZhbHVlcz1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fc2NhbGUudGlja0ludGVydmFsKHkuaW50ZXJ2YWwseS5zdGVwKX07QS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeT10aGlzO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF0ucmVkdWNlKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIHguY29uY2F0KHkuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyhDKSl9LFtdKX07QS5wcm90b3R5cGUuX2NsZWFuVGllcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHk9MDt5PHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnMubGVuZ3RoO3krKyl0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyQmFzZWxpbmVzW3ldLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXt5PXRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCksQz15Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4gRy52YWx1ZU9mKCl9KTstMT09PUMuaW5kZXhPZih4WzBdLnZhbHVlT2YoKSkmJnkudW5zaGlmdCh4WzBdKTstMT09PUMuaW5kZXhPZih4WzFdLnZhbHVlT2YoKSkmJnkucHVzaCh4WzFdKTtyZXR1cm4geX07QS5wcm90b3R5cGUuX3JlbmRlclRpZXJMYWJlbHM9ZnVuY3Rpb24oeSx4LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbih4KSxCPVtdOyJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXSYmCjE9PT14LnN0ZXA/RC5tYXAoZnVuY3Rpb24oTyxTKXtTKzE+PUQubGVuZ3RofHxCLnB1c2gobmV3IERhdGUoKERbUysxXS52YWx1ZU9mKCktRFtTXS52YWx1ZU9mKCkpLzIrRFtTXS52YWx1ZU9mKCkpKX0pOkI9RDt5PXkuc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCLGZ1bmN0aW9uKE8pe3JldHVybiBTdHJpbmcoTy52YWx1ZU9mKCkpfSk7dmFyIEg9eS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApO0guYXBwZW5kKCJ0ZXh0Iik7dmFyIEs9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/MDp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt2YXIgTD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9yLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMrMSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpOiJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdPwp0aGlzLmhlaWdodCgpLXIuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpLXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpOnRoaXMuaGVpZ2h0KCktci5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7SD15Lm1lcmdlKEgpO3ZhciBKPUguc2VsZWN0QWxsKCJ0ZXh0Iik7MDxKLnNpemUoKSYmSi5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitLKyIsIitMKyIpIik7eS5leGl0KCkucmVtb3ZlKCk7SC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKE8pe3JldHVybiJ0cmFuc2xhdGUoIitHLl9zY2FsZS5zY2FsZShPKSsiLDApIn0pO0M9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ118fDE9PT14LnN0ZXA/Im1pZGRsZSI6InN0YXJ0IjtILnNlbGVjdEFsbCgidGV4dCIpLnRleHQoeC5mb3JtYXR0ZXIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQyl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWNrTWFya3M9CmZ1bmN0aW9uKHkseCl7eT10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeF0uc2VsZWN0QWxsKCIuIitxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHkpO3ZhciBDPXkuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHEuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHkpLEc9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCksRD10aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLHgpLnJlZHVjZShmdW5jdGlvbihCLEgpe3JldHVybiBCK0h9LDApOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhHLnkxPUQsRy55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3hdKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKToKdGhpcy5fdGllckhlaWdodHNbeF0pKSk7Qy5hdHRycyhHKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbeF0/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbeF0pKTooRy55MT10aGlzLmhlaWdodCgpLUQsRy55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t4XSkpKTtyLnNlbGVjdChDLm5vZGVzKClbMF0pLmF0dHJzKEcpO3Iuc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuYXR0cnMoRyk7ci5zZWxlY3QoQy5ub2RlcygpWzBdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTtyLnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmNsYXNzZWQocS5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO3kuZXhpdCgpLnJlbW92ZSgpfTsKQS5wcm90b3R5cGUuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcz1mdW5jdGlvbih5KXt5PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgeD15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxDPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO0MueTI9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6dGhpcy5oZWlnaHQoKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt4LmF0dHJzKEMpO3kuZXhpdCgpLnJlbW92ZSgpfTtBLnByb3RvdHlwZS5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcz1mdW5jdGlvbigpe3JldHVybiAxPnRoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg/W106dGhpcy5fZ2V0VGlja0ludGVydmFsVmFsdWVzKHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4LQoxXVswXSl9O0EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHk9dGhpczt0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4PXRoaXMuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4KCk7dmFyIHg9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdO3RoaXMuX2NsZWFuVGllcnMoKTt4LmZvckVhY2goZnVuY3Rpb24oSCxLKXtyZXR1cm4geS5fcmVuZGVyVGllckxhYmVscyh5Ll90aWVyTGFiZWxDb250YWluZXJzW0tdLEgsSyl9KTtmb3IodmFyIEM9eC5tYXAoZnVuY3Rpb24oSCl7cmV0dXJuIHkuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKEgpfSksRz0wLEQ9MDtEPE1hdGgubWF4KHgubGVuZ3RoLDEpOysrRCl7dmFyIEI9dGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCk7Qi55MSs9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/RzotRztCLnkyPUIueTE7CnRoaXMuX3RpZXJCYXNlbGluZXNbRF0uYXR0cnMoQikuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iik7Rys9dGhpcy5fdGllckhlaWdodHNbRF19Rz1bXTtEPXRoaXMuX3NjYWxlLmRvbWFpbigpO0Q9dGhpcy5fc2NhbGUuc2NhbGUoRFsxXSktdGhpcy5fc2NhbGUuc2NhbGUoRFswXSk7MS41KnRoaXMuX2dldEludGVydmFsTGVuZ3RoKHhbMF0pPj1EJiYoRz10aGlzLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzKCkpO3RoaXMuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcyhHKTt0aGlzLl9oaWRlT3ZlcmZsb3dpbmdUaWVycygpO2ZvcihEPTA7RDx4Lmxlbmd0aDsrK0QpdGhpcy5fcmVuZGVyVGlja01hcmtzKENbRF0sRCksdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKEQpO3RoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKTtyZXR1cm4gdGhpc307QS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpZXJzPQpmdW5jdGlvbigpe3ZhciB5PXRoaXMseD10aGlzLmhlaWdodCgpLEM9MDt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLmF0dHIoInZpc2liaWxpdHkiLGZ1bmN0aW9uKEcsRCl7Qys9eS5fdGllckhlaWdodHNbRF07cmV0dXJuIEM8PXg/ImluaGVyaXQiOiJoaWRkZW4ifSl9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHM9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geChIKXtyZXR1cm4gTWF0aC5mbG9vcihHLmxlZnQpPD1NYXRoLmNlaWwoSC5sZWZ0KSYmTWF0aC5mbG9vcihHLnRvcCk8PU1hdGguY2VpbChILnRvcCkmJk1hdGguZmxvb3IoSC5yaWdodCk8PU1hdGguY2VpbChHLmxlZnQrQy53aWR0aCgpKSYmTWF0aC5mbG9vcihILmJvdHRvbSk8PU1hdGguY2VpbChHLnRvcCtDLmhlaWdodCgpKX12YXIgQz10aGlzLEc9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrCnEuQXhpcy5USUNLX01BUktfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBIPXIuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09SHx8ImluaGVyaXQiPT09SH0pLm5vZGVzKCkubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBILmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSksQjt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW3ldLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBIPXIuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09SHx8ImluaGVyaXQiPT09SH0pLmVhY2goZnVuY3Rpb24oSCxLKXtIPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIEw9ci5zZWxlY3QodGhpcyksSj1EW0tdLE89RFtLKzFdO0s9bnVsbCE9QiYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEgsQik7Sj1udWxsIT1KJiZuLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSCwKSik7Tz1udWxsIT1PJiZuLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSCxPKTsheChIKXx8S3x8Snx8Tz9MLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik6KEI9SCxMLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpKX0pfTtBLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt3LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gQX0ocS5BeGlzKTtoLlRJTUVfQVhJU19USUVSX0NMQVNTPSJ0aW1lLWF4aXMtdGllciI7aC5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVg9KHU9e30sdVtmLlRpbWVJbnRlcnZhbC5zZWNvbmRdPTAsdVtmLlRpbWVJbnRlcnZhbC5taW51dGVdPTEsdVtmLlRpbWVJbnRlcnZhbC5ob3VyXT0yLHVbZi5UaW1lSW50ZXJ2YWwuZGF5XT0zLHVbZi5UaW1lSW50ZXJ2YWwud2Vla109NCx1W2YuVGltZUludGVydmFsLm1vbnRoXT01LHVbZi5UaW1lSW50ZXJ2YWwueWVhcl09CjYsdSk7aC5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlM9W1t7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6NSxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjE1LApmb3JtYXR0ZXI6cC50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MzAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSwKW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LApzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDozLGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEyLGZvcm1hdHRlcjpwLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVhICVlIil9LAp7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWUiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDozLGZvcm1hdHRlcjpwLnRpbWUoIiViIil9LAp7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDo2LGZvcm1hdHRlcjpwLnRpbWUoIiViIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIleSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSwKW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MTAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoyMDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MUUzLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XV07aC5fTE9OR19EQVRFPW5ldyBEYXRlKDk5OTksOCwyOSwxMiw1OSw5OTk5KTtmLlRpbWU9aDt2YXIgdX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9CnAucHJvdG90eXBlLG5ldyBtKX0scj1oKDEyKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT1sLmNhbGwodGhpcyl8fHRoaXM7bS5fZGV0YWNoQ2FsbGJhY2s9ZnVuY3Rpb24obil7cmV0dXJuIG0ucmVtb3ZlKG4pfTtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7bT1yLmNvZXJjZUV4dGVybmFsRDMobSk7bC5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxtKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBxLmFuY2hvcihuLmVsZW1lbnQoKSl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5yZW5kZXIoKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiaGFzKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuX2Fkb3B0QW5kQW5jaG9yPQpmdW5jdGlvbihtKXttLnBhcmVudCh0aGlzKTttLm9uRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKTt0aGlzLl9pc0FuY2hvcmVkJiZtLmFuY2hvcih0aGlzLmVsZW1lbnQoKSl9O3AucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihtKXt0aGlzLmhhcyhtKSYmKG0ub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9yZW1vdmUobSksbS5kZXRhY2goKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbigpe307cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiX2ZvckVhY2goKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0uZGVzdHJveSgpfSl9O3AucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT0KZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmludmFsaWRhdGVDYWNoZSgpfSl9O3JldHVybiBwfShoKDQpLkNvbXBvbmVudCk7Zi5Db21wb25lbnRDb250YWluZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoQSl7bi5hZGQoQSk7bS5hZGQoQSk7cigpfWZ1bmN0aW9uIHIoKXtxfHwocT0hMCx3LnJlbmRlcigpKX12YXIgbD1oKDApO2Q9aCgxMCk7dmFyIHA9aCgzOSksbT1uZXcgbC5TZXQsbj1uZXcgbC5TZXQscT0hMSx1PSExO2YuUG9saWN5PWQubWFrZUVudW0oWyJpbW1lZGlhdGUiLCJhbmltYXRpb25GcmFtZSIsInRpbWVvdXQiXSk7dmFyIHc9bmV3IHAuQW5pbWF0aW9uRnJhbWU7Zi5yZW5kZXJQb2xpY3k9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdztzd2l0Y2goQSl7Y2FzZSBmLlBvbGljeS5pbW1lZGlhdGU6dz1uZXcgcC5JbW1lZGlhdGU7YnJlYWs7Y2FzZSBmLlBvbGljeS5hbmltYXRpb25GcmFtZTp3PW5ldyBwLkFuaW1hdGlvbkZyYW1lOwpicmVhaztjYXNlIGYuUG9saWN5LnRpbWVvdXQ6dz1uZXcgcC5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6bC5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIitBKX19O2YucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbihBKXt1JiZsLldpbmRvdy53YXJuKCJSZWdpc3RlcmVkIHRvIHJlbmRlciB3aGlsZSBvdGhlciBjb21wb25lbnRzIGFyZSBmbHVzaGluZzogcmVxdWVzdCBtYXkgYmUgaWdub3JlZCIpO20uYWRkKEEpO3IoKX07Zi5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcj1rO2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oQSl7ayhBKX07Zi5mbHVzaD1mdW5jdGlvbigpe2lmKHEpe24uZm9yRWFjaChmdW5jdGlvbih5KXtyZXR1cm4geS5jb21wdXRlTGF5b3V0KCl9KTttLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkucmVuZGVyKCl9KTt1PSEwO3ZhciBBPW5ldyBsLlNldDttLmZvckVhY2goZnVuY3Rpb24oeSl7dHJ5e3kucmVuZGVySW1tZWRpYXRlbHkoKX1jYXRjaCh4KXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHg7Cn0sMCksQS5hZGQoeSl9fSk7bj1uZXcgbC5TZXQ7bT1BO3U9cT0hMX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKTtmLmNpcmNsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ2lyY2xlKS5zaXplKE1hdGguUEkqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3F1YXJlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3cobCwyKSl9fTtmLmNyb3NzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xDcm9zcykuc2l6ZSg1LzkqTWF0aC5wb3cobCwyKSl9fTtmLmRpYW1vbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbERpYW1vbmQpLnNpemUoTWF0aC50YW4oTWF0aC5QSS82KSpNYXRoLnBvdyhsLDIpLwoyKX19O2YudHJpYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFRyaWFuZ2xlKS5zaXplKE1hdGguc3FydCgzKSpNYXRoLnBvdyhsLzIsMikpfX07Zi5zdGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KGwvMiwyKSl9fTt2YXIgcj0zKigxL01hdGguc3FydCgxMikvMisxKTtmLnd5ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sV3llKS5zaXplKHIqTWF0aC5wb3cobC8yLjQsMikpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJihuW3ddPQpxW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCgyNSksbD1oKDApLHA9aCgxMiksbT1oKDM3KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fZGV0ZWN0aW9uUmFkaXVzPTM7dS5fcmVzaXphYmxlPSExO3UuX21vdmFibGU9ITE7dS5faGFzQ29ybmVycz0hMDt1LmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpO3UuX2RyYWdJbnRlcmFjdGlvbj1uZXcgci5EcmFnO3UuX3NldFVwQ2FsbGJhY2tzKCk7dS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHUpO3UuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3UuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7cmV0dXJuIHV9ayhxLG4pO3EucHJvdG90eXBlLl9zZXRVcENhbGxiYWNrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoSCwKSyl7MD09PUImJkgueD09PUsueCYmSC55PT09Sy55JiZ5LmJveFZpc2libGUoITEpO3kuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5LmJvdW5kcygpKX1mdW5jdGlvbiB3KEgsSyl7c3dpdGNoKEIpe2Nhc2UgMDpHLng9Sy54O0cueT1LLnk7YnJlYWs7Y2FzZSAxOnguYm90dG9tP0cueT1LLnk6eC50b3AmJihDLnk9Sy55KTt4LnJpZ2h0P0cueD1LLng6eC5sZWZ0JiYoQy54PUsueCk7YnJlYWs7Y2FzZSAyOkg9Sy54LUQueDt2YXIgTD1LLnktRC55O0MueCs9SDtDLnkrPUw7Ry54Kz1IO0cueSs9TDtEPUt9eS5fc2V0Qm91bmRzKHt0b3BMZWZ0OkMsYm90dG9tUmlnaHQ6R30pO3kuX3hCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueFNjYWxlKCkmJnkuX3NldFhFeHRlbnQoW3kueFNjYWxlKCkuaW52ZXJ0KEMueCkseS54U2NhbGUoKS5pbnZlcnQoRy54KV0pO3kuX3lCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueVNjYWxlKCkmJgp5Ll9zZXRZRXh0ZW50KFt5LnlTY2FsZSgpLmludmVydChDLnkpLHkueVNjYWxlKCkuaW52ZXJ0KEcueSldKTt5LnJlbmRlcigpO3kuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5LmJvdW5kcygpKX1mdW5jdGlvbiBBKEgpe3g9eS5fZ2V0UmVzaXppbmdFZGdlcyhIKTt2YXIgSz15LmJvdW5kcygpO0s9Sy50b3BMZWZ0Lng8PUgueCYmSC54PD1LLmJvdHRvbVJpZ2h0LngmJksudG9wTGVmdC55PD1ILnkmJkgueTw9Sy5ib3R0b21SaWdodC55O3kuYm94VmlzaWJsZSgpJiYoeC50b3B8fHguYm90dG9tfHx4LmxlZnR8fHgucmlnaHQpP0I9MTp5LmJveFZpc2libGUoKSYmeS5tb3ZhYmxlKCkmJks/Qj0yOihCPTAseS5fc2V0Qm91bmRzKHt0b3BMZWZ0OkgsYm90dG9tUmlnaHQ6SH0pLHkuX3hCb3VuZHNNb2RlPT09bS5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXkueFNjYWxlKCkmJnkuX3NldFhFeHRlbnQoW3kueFNjYWxlKCkuaW52ZXJ0KEgueCkseS54U2NhbGUoKS5pbnZlcnQoSC54KV0pLAp5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiZ5Ll9zZXRZRXh0ZW50KFt5LnlTY2FsZSgpLmludmVydChILnkpLHkueVNjYWxlKCkuaW52ZXJ0KEgueSldKSx5LnJlbmRlcigpKTt5LmJveFZpc2libGUoITApO0s9eS5ib3VuZHMoKTtDPXt4OksudG9wTGVmdC54LHk6Sy50b3BMZWZ0Lnl9O0c9e3g6Sy5ib3R0b21SaWdodC54LHk6Sy5ib3R0b21SaWdodC55fTtEPUg7eS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoSyl9dmFyIHk9dGhpcyx4LEMsRyxELEI9MDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh3KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHUpO3RoaXMuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoQSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodyk7CnkuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHUpO3kuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4gdy5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX12YXIgdz10aGlzO24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2RldGVjdGlvbkVkZ2VUPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlQj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUw9dSgpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VSPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTtpZih0aGlzLl9oYXNDb3JuZXJzKXt2YXIgQT1mdW5jdGlvbigpe3JldHVybiB3Ll9ib3guYXBwZW5kKCJjaXJjbGUiKS5zdHlsZXMoe29wYWNpdHk6MCwKZmlsbDoicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZUZpbGwifSl9O3RoaXMuX2RldGVjdGlvbkNvcm5lclRMPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10bCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lclRSPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10ciIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJMPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1ibCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJSPUEoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1iciIsITApfX07cS5wcm90b3R5cGUuX2dldFJlc2l6aW5nRWRnZXM9ZnVuY3Rpb24odSl7dmFyIHc9e3RvcDohMSxib3R0b206ITEsbGVmdDohMSxyaWdodDohMX07aWYoIXRoaXMucmVzaXphYmxlKCkpcmV0dXJuIHc7dmFyIEE9dGhpcy5ib3VuZHMoKSx5PUEudG9wTGVmdC55LHg9QS5ib3R0b21SaWdodC55LEM9QS50b3BMZWZ0Lng7QT1BLmJvdHRvbVJpZ2h0Lng7dmFyIEc9dGhpcy5fZGV0ZWN0aW9uUmFkaXVzOwpDLUc8PXUueCYmdS54PD1BK0cmJih3LnRvcD15LUc8PXUueSYmdS55PD15K0csdy5ib3R0b209eC1HPD11LnkmJnUueTw9eCtHKTt5LUc8PXUueSYmdS55PD14K0cmJih3LmxlZnQ9Qy1HPD11LngmJnUueDw9QytHLHcucmlnaHQ9QS1HPD11LngmJnUueDw9QStHKTtyZXR1cm4gd307cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuYm94VmlzaWJsZSgpKXt2YXIgdT10aGlzLmJvdW5kcygpLHc9dS50b3BMZWZ0LnksQT11LmJvdHRvbVJpZ2h0LnkseT11LnRvcExlZnQueDt1PXUuYm90dG9tUmlnaHQueDt0aGlzLl9kZXRlY3Rpb25FZGdlVC5hdHRycyh7eDE6eSx5MTp3LHgyOnUseTI6dywic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VCLmF0dHJzKHt4MTp5LHkxOkEseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqCnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VMLmF0dHJzKHt4MTp5LHkxOncseDI6eSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZVIuYXR0cnMoe3gxOnUseTE6dyx4Mjp1LHkyOkEsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9oYXNDb3JuZXJzJiYodGhpcy5fZGV0ZWN0aW9uQ29ybmVyVEwuYXR0cnMoe2N4OnksY3k6dyxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lclRSLmF0dHJzKHtjeDp1LGN5Oncscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTC5hdHRycyh7Y3g6eSxjeTpBLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQlIuYXR0cnMoe2N4OnUsY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pKX1yZXR1cm4gdGhpc307CnEucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9O3EucHJvdG90eXBlLnJlc2l6YWJsZT1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9yZXNpemFibGU7dGhpcy5fcmVzaXphYmxlPXU7dGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odSl7dSYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKSl9O3EucHJvdG90eXBlLm1vdmFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW92YWJsZX07cS5wcm90b3R5cGUuX3NldE1vdmFibGVDbGFzcz1mdW5jdGlvbigpe3RoaXMubW92YWJsZSgpJiZ0aGlzLmVuYWJsZWQoKT8KdGhpcy5hZGRDbGFzcygibW92YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIm1vdmFibGUiKX07cS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih1KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih1KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKHUpfTtxLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5kcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTsKcS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHUpO3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModGhpcy5yZXNpemFibGUoKSk7dGhpcy5fc2V0TW92YWJsZUNsYXNzKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdT10aGlzO24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih3KXtyZXR1cm4gdS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodyl9KTt0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24odyl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHcpfSk7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHcpe3JldHVybiB1Ll9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh3KX0pOwp0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKTtuLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHUpe3U9cC5jb2VyY2VFeHRlcm5hbEQzKHUpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTtuLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHUpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fcmVzZXRTdGF0ZT1mdW5jdGlvbigpe3RoaXMuYm91bmRzKHt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDowLHk6MH19KX07cmV0dXJuIHF9KGgoNDMpLlNlbGVjdGlvbkJveExheWVyKTtmLkRyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3JldHVybiBwLmNhbGwodGhpcywicGF0aCIsImxpbmUiKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obil7bi5zdHlsZSgiZmlsbCIsIm5vbmUiKX07bS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBwLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywwKX07cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLkxpbmVTVkdEcmF3ZXI9ZDt2YXIgbD1bIm9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSIsInN0cm9rZS13aWR0aCIsInN0cm9rZSJdO2YubWFrZUxpbmVDYW52YXNEcmF3U3RlcD0KZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKG0sbixxKXtxPXIucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7ci5yZW5kZXJMaW5lKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0iIik7dmFyIHE9cC5jYWxsKHRoaXMsInJlY3QiLCIiKXx8dGhpcztxLl9yb290Q2xhc3NOYW1lPW47cS5fcm9vdC5jbGFzc2VkKHEuX3Jvb3RDbGFzc05hbWUsITApO3JldHVybiBxfWsobSxwKTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuUmVjdGFuZ2xlU1ZHRHJhd2VyPQpkO3ZhciBsPVsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdO2YuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocCxtLG4pe3Auc2F2ZSgpO20uZm9yRWFjaChmdW5jdGlvbihxLHUpe251bGwhPXEmJihxPXIucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKG4sbCxxLHUpLHAuYmVnaW5QYXRoKCkscC5yZWN0KHEueCxxLnkscS53aWR0aCxxLmhlaWdodCksci5yZW5kZXJQYXRoV2l0aFN0eWxlKHAscSkpfSk7cC5yZXN0b3JlKCl9O2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXtyZXR1cm4gcC5jYWxsKHRoaXMsbixmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwKXx8dGhpc31rKG0scCk7cmV0dXJuIG19KHIuQ2FudmFzRHJhd2VyKTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtsLlNIT1dfV0FSTklOR1MmJmNvbnNvbGUud2FybihwKX1mdW5jdGlvbiByKHAsbSl7Zm9yKHZhciBuPVtdLHE9MjtxPGFyZ3VtZW50cy5sZW5ndGg7cSsrKW5bcS0KMl09YXJndW1lbnRzW3FdO3JldHVybiAwPT09bT8ocChuKSwtMSk6d2luZG93LnNldFRpbWVvdXQocCxtLG4pfXZhciBsPWgoMjMpO2Yud2Fybj1rO2Yuc2V0VGltZW91dD1yO2YuZGVib3VuY2U9ZnVuY3Rpb24ocCxtLG4pe2Z1bmN0aW9uIHEoKXttLmFwcGx5KG4sdyl9dmFyIHU9bnVsbCx3PVtdO3JldHVybiBmdW5jdGlvbigpe3c9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtjbGVhclRpbWVvdXQodSk7dT1yKHEscCl9fTtmLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PW4mJihuPSIiKTtrKCJNZXRob2QgIitwKyIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uICIrbSsiLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlbGVhc2Ugbm90ZXMuICIrbil9fSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMucnVsZXI9bnVsbCE9ay5jcmVhdGVSdWxlcj9rLmNyZWF0ZVJ1bGVyKCk6a31oLnByb3RvdHlwZS5tZWFzdXJlPQpmdW5jdGlvbihrKXt2b2lkIDA9PT1rJiYoaz1oLkhFSUdIVF9URVhUKTtyZXR1cm4gdGhpcy5ydWxlcihrKX07cmV0dXJuIGh9KCk7ZC5IRUlHSFRfVEVYVD0iYmRwcWwiO2YuQWJzdHJhY3RNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMzIpKTtrKGgoNzQpKTtrKGgoNzUpKTtrKGgoNDEpKTtrKGgoNDIpKTtrKGgoNzYpKTtrKGgoNzcpKTtrKGgoNzgpKTtrKGgoNzkpKTtrKGgoNDMpKTtrKGgoODApKTtrKGgoODEpKTtrKGgoODIpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHIobCxwKXt2b2lkIDA9PT1sJiYobD1bXSk7dm9pZCAwPT09cCYmKHA9e30pO3RoaXMuX3VwZGF0ZUlkPTA7dGhpcy5fZGF0YT1sO3RoaXMuX21ldGFkYXRhPXA7dGhpcy5fY2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0fXIucHJvdG90eXBlLm9uVXBkYXRlPQpmdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuYWRkKGwpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShsKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9kYXRhO3RoaXMuX2RhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5tZXRhZGF0YT1mdW5jdGlvbihsKXtpZihudWxsPT1sKXJldHVybiB0aGlzLl9tZXRhZGF0YTt0aGlzLl9tZXRhZGF0YT1sO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfTtyLnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZCsrO3RoaXMuX2NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpfTtyZXR1cm4gcn0oKTsKZi5EYXRhc2V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApLHI9aCgzMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7ci5mbHVzaCgpfTtyZXR1cm4gbH0oKTtmLkltbWVkaWF0ZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2suRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKHIuZmx1c2gpfTtyZXR1cm4gbH0oKTtmLkFuaW1hdGlvbkZyYW1lPWQ7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl90aW1lb3V0TXNlYz1rLkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHIuZmx1c2gsdGhpcy5fdGltZW91dE1zZWMpfTtyZXR1cm4gbH0oKTtmLlRpbWVvdXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLAptKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX2tleVByZXNzQ2FsbGJhY2tzPXt9O24uX2tleVJlbGVhc2VDYWxsYmFja3M9e307bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bi5fZG93bmVkS2V5cz1uZXcgbC5TZXQ7bi5fa2V5RG93bkNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUtleURvd25FdmVudChxLHUpfTtuLl9rZXlVcENhbGxiYWNrPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9oYW5kbGVLZXlVcEV2ZW50KHEpfTtyZXR1cm4gbn1rKG0scCk7Cm0ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXI9ci5LZXkuZ2V0RGlzcGF0Y2hlcigpO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfTttLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub2ZmTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9bnVsbDsKdGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVLZXlEb3duRXZlbnQ9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5sYXN0TW91c2VQb3NpdGlvbigpKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh1KSYmIXEucmVwZWF0JiYodGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLmNhbGxDYWxsYmFja3MobiksdGhpcy5fZG93bmVkS2V5cy5hZGQobikpfTttLnByb3RvdHlwZS5faGFuZGxlS2V5VXBFdmVudD1mdW5jdGlvbihuKXt0aGlzLl9kb3duZWRLZXlzLmhhcyhuKSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pOwp0aGlzLl9kb3duZWRLZXlzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25LZXlQcmVzcz1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dfHwodGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl09bmV3IGwuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5kZWxldGUocSk7MD09PXRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25LZXlSZWxlYXNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl09bmV3IGwuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uYWRkKHEpO3JldHVybiB0aGlzfTsKbS5wcm90b3R5cGUub2ZmS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuS2V5PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXt2b2lkIDA9PT1tJiYobT1bXSk7dmFyIG49bC5jYWxsKHRoaXMpfHx0aGlzO24uX2NvbXBvbmVudHM9CltdO24uYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpO20uZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5hcHBlbmQocSl9KTtyZXR1cm4gbn1rKHAsbCk7cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24obSl7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChtKX07cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKG0pe3JldHVybiAwPD10aGlzLl9jb21wb25lbnRzLmluZGV4T2YobSl9O3AucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG0sbil7dmFyIHE9dGhpcy5fY29tcG9uZW50cy5tYXAoZnVuY3Rpb24odSl7cmV0dXJuIHUucmVxdWVzdGVkU3BhY2UobSxuKX0pO3JldHVybnttaW5XaWR0aDpyLk1hdGgubWF4KHEsZnVuY3Rpb24odSl7cmV0dXJuIHUubWluV2lkdGh9LDApLG1pbkhlaWdodDpyLk1hdGgubWF4KHEsZnVuY3Rpb24odSl7cmV0dXJuIHUubWluSGVpZ2h0fSwwKX19O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxuLHEpe3ZhciB1PQp0aGlzO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLG0sbixxKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuY29tcHV0ZUxheW91dCh7eDowLHk6MH0sdS53aWR0aCgpLHUuaGVpZ2h0KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG0sbil7cmV0dXJue3dpZHRoOm0saGVpZ2h0Om59fTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24obSl7cmV0dXJuIG0uZml4ZWRXaWR0aCgpfSl9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24obSl7cmV0dXJuIG0uZml4ZWRIZWlnaHQoKX0pfTtwLnByb3RvdHlwZS5jb21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuc2xpY2UoKX07cC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKG0pe251bGw9PQptfHx0aGlzLmhhcyhtKXx8KG0uZGV0YWNoKCksdGhpcy5fY29tcG9uZW50cy5wdXNoKG0pLHRoaXMuX2Fkb3B0QW5kQW5jaG9yKG0pLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pOzA8PW0mJnRoaXMuX2NvbXBvbmVudHMuc3BsaWNlKG0sMSl9O3JldHVybiBwfShoKDI5KS5Db21wb25lbnRDb250YWluZXIpO2YuR3JvdXA9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtoKDApO2Q9aCg0KTt2YXIgcjsoZnVuY3Rpb24obCl7bFtsLlZBTFVFPTBdPQoiVkFMVUUiO2xbbC5QSVhFTD0xXT0iUElYRUwifSkocnx8KHI9e30pKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dmFyIG49bC5jYWxsKHRoaXMpfHx0aGlzO24uX21vZGU9ci5WQUxVRTtpZihtIT09cC5PUklFTlRBVElPTl9WRVJUSUNBTCYmbSE9PXAuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEd1aWRlTGluZUxheWVyIik7bi5fb3JpZW50YXRpb249bTtuLl9vdmVyZmxvd0hpZGRlbj0hMDtuLmFkZENsYXNzKCJndWlkZS1saW5lLWxheWVyIik7bi5faXNWZXJ0aWNhbCgpP24uYWRkQ2xhc3MoInZlcnRpY2FsIik6bi5hZGRDbGFzcygiaG9yaXpvbnRhbCIpO24uX3NjYWxlVXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtuLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7bi5yZW5kZXIoKX07cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2wucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9ndWlkZUxpbmU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiZ3VpZGUtbGluZSIsITApfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuX2lzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249PT1wLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obSxuLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLG0sbixxKTtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5zY2FsZSgpLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pOnRoaXMuc2NhbGUoKS5yYW5nZShbdGhpcy5oZWlnaHQoKSwKMF0pKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLl9ndWlkZUxpbmUuYXR0cnMoe3gxOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTowLHkxOnRoaXMuX2lzVmVydGljYWwoKT8wOnRoaXMucGl4ZWxQb3NpdGlvbigpLHgyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTp0aGlzLndpZHRoKCkseTI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy5waXhlbFBvc2l0aW9uKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9tb2RlPT09ci5WQUxVRSYmbnVsbCE9dGhpcy52YWx1ZSgpP3RoaXMuX3BpeGVsUG9zaXRpb249CnRoaXMuc2NhbGUoKS5zY2FsZSh0aGlzLnZhbHVlKCkpOnRoaXMuX21vZGU9PT1yLlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9O3AucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbihtKXt0aGlzLl9waXhlbFBvc2l0aW9uPW07bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpO3RoaXMucmVuZGVyKCl9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX3NjYWxlO3ZhciBuPXRoaXMuX3NjYWxlO251bGwhPW4mJm4ub2ZmVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spO3RoaXMuX3NjYWxlPW07dGhpcy5fc2NhbGUub25VcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayk7CnRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT1tO3RoaXMuX21vZGU9ci5WQUxVRTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucGl4ZWxQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXhlbFBvc2l0aW9ufTtwLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuc2NhbGUoKSYmdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKX07cmV0dXJuIHB9KGQuQ29tcG9uZW50KTtkLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMPSJ2ZXJ0aWNhbCI7ZC5PUklFTlRBVElPTl9IT1JJWk9OVEFMPSJob3Jpem9udGFsIjsKZi5HdWlkZUxpbmVMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgwKTtkPWgoNCk7dmFyIGw7KGZ1bmN0aW9uKHApe3BbcC5WQUxVRT0wXT0iVkFMVUUiO3BbcC5QSVhFTD0xXT0iUElYRUwifSkobD1mLlByb3BlcnR5TW9kZXx8KGYuUHJvcGVydHlNb2RlPXt9KSk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2JveFZpc2libGU9ITE7bi5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDowLHk6MH19O24uX3hCb3VuZHNNb2RlPWwuUElYRUw7bi5feUJvdW5kc01vZGU9CmwuUElYRUw7bi5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpO24uX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7bi5yZW5kZXIoKX07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF07bi5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3AucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3Rpb24tYm94IiwhMCkucmVtb3ZlKCk7dGhpcy5fYm94QXJlYT10aGlzLl9ib3guYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic2VsZWN0aW9uLWFyZWEiLCEwKX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXtyZXR1cm57d2lkdGg6bixoZWlnaHQ6cX19O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9nZXRCb3VuZHMoKTsKdGhpcy5fc2V0Qm91bmRzKG4pO3RoaXMuX3lCb3VuZHNNb2RlPXRoaXMuX3hCb3VuZHNNb2RlPWwuUElYRUw7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihuKXt0aGlzLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6TWF0aC5taW4obi50b3BMZWZ0Lngsbi5ib3R0b21SaWdodC54KSx5Ok1hdGgubWluKG4udG9wTGVmdC55LG4uYm90dG9tUmlnaHQueSl9LGJvdHRvbVJpZ2h0Ont4Ok1hdGgubWF4KG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1heChuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfX19O20ucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSwKdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5taW4odGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfSxib3R0b21SaWdodDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWwuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5tYXgodGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWF4KHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLAp0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9fX07bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuX2JveFZpc2libGUpe3ZhciBuPXRoaXMuYm91bmRzKCkscT1uLnRvcExlZnQueSx1PW4uYm90dG9tUmlnaHQueSx3PW4udG9wTGVmdC54O249bi5ib3R0b21SaWdodC54O2lmKCEoci5NYXRoLmlzVmFsaWROdW1iZXIocSkmJnIuTWF0aC5pc1ZhbGlkTnVtYmVyKHUpJiZyLk1hdGguaXNWYWxpZE51bWJlcih3KSYmci5NYXRoLmlzVmFsaWROdW1iZXIobikpKXRocm93IEVycm9yKCJib3VuZHMgaGF2ZSBub3QgYmVlbiBwcm9wZXJseSBzZXQiKTt0aGlzLl9ib3hBcmVhLmF0dHJzKHt4OncseTpxLHdpZHRoOm4tdyxoZWlnaHQ6dS1xfSk7dGhpcy5jb250ZW50KCkubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2JveC5ub2RlKCkpfWVsc2UgdGhpcy5fYm94LnJlbW92ZSgpOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuYm94VmlzaWJsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9ib3hWaXNpYmxlO3RoaXMuX2JveFZpc2libGU9bjt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O20ucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl94U2NhbGU7bnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl94U2NhbGU9bjt0aGlzLl94Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PQpuKXJldHVybiB0aGlzLl95U2NhbGU7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl95U2NhbGU9bjt0aGlzLl95Qm91bmRzTW9kZT1sLlZBTFVFO3RoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRYRXh0ZW50KCl9O20ucHJvdG90eXBlLl9nZXRYRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlPT09bC5WQUxVRT90aGlzLl94RXh0ZW50Om51bGw9PXRoaXMuX3hTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueCksdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueCldfTttLnByb3RvdHlwZS5fc2V0WEV4dGVudD0KZnVuY3Rpb24obil7dGhpcy5feEV4dGVudD1ufTttLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFlFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feUJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3lFeHRlbnQ6bnVsbD09dGhpcy5feVNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSx0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55KV19O20ucHJvdG90eXBlLl9zZXRZRXh0ZW50PWZ1bmN0aW9uKG4pe3RoaXMuX3lFeHRlbnQ9bn07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3AucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMueFNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTtudWxsIT10aGlzLl95U2NhbGUmJgp0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9O3JldHVybiBtfShkLkNvbXBvbmVudCk7Zi5TZWxlY3Rpb25Cb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3JldHVybiByLmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9ayhsLHIpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoInN0cm9rZSIsIm5vbmUiKX07cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLkFyY1NWR0RyYXdlcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHJbbV09bFttXSk7ci5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gci5jYWxsKHRoaXMsInBhdGgiLCJhcmMgb3V0bGluZSIpfHx0aGlzfWsobCxyKTtsLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihwKXtwLnN0eWxlKCJmaWxsIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjT3V0bGluZVNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9CnB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTgpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3JldHVybiBwLmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31rKG0scCk7bS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24obil7bi5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTttLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gbX0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJlYVNWR0RyYXdlcj1kO3ZhciBsPVsiZmlsbCIsIm9wYWNpdHkiLCJmaWxsLW9wYWNpdHkiXTtmLm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocCl7cmV0dXJuIGZ1bmN0aW9uKG0sCm4scSl7cT1yLnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3IucmVuZGVyQXJlYShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7cmV0dXJuIHIuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9ayhsLHIpO3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5TZWdtZW50U1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKG4scSx1LHcsQSl7cmV0dXJuIDA8PXUrQSYmdS1BPD1uJiYwPD13K0EmJnctQTw9cX1mdW5jdGlvbiByKG4scSx1KXtpZihudWxsPT1uKXJldHVybiExOwpmb3IodmFyIHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEE9dVt3XTtpZihuW0FdIT1xW0FdKXJldHVybiExfXJldHVybiEwfXZhciBsPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxwPWgoODYpLG09aCgxOCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7cmV0dXJuIG4uY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9bChxLG4pO3JldHVybiBxfShoKDkpLlNWR0RyYXdlcik7Zi5TeW1ib2xTVkdEcmF3ZXI9ZDtmLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihuLHEsdSl7dmFyIHc9dGhpcztyZXR1cm4gZnVuY3Rpb24oQSx5LHgpe3ZhciBDPUEuY2FudmFzLEc9Qy5jbGllbnRXaWR0aDsKQz1DLmNsaWVudEhlaWdodDtmb3IodmFyIEQ9bmV3IHAuQ2FudmFzQnVmZmVyKDAsMCksQj1xKCksSD11KCksSz1udWxsLEw9bnVsbCxKPW51bGwsTz0wO088eS5sZW5ndGg7TysrKXt2YXIgUz15W09dO2lmKG51bGwhPVMpe3ZhciBOPW0ucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHgsWyJ4IiwieSJdLFMsTyksUj1IKFMsTyxuKTtpZihrKEcsQyxOLngsTi55LFIpKXt2YXIgWD1yKEssTixtLkNvbnRleHRTdHlsZUF0dHJzKTtTPUIoUyxPLHcuX2RhdGFzZXQpO1gmJko9PVImJkw9PVN8fChLPW0uZ2V0U3Ryb2tlV2lkdGgoTiksSz1SK0srMSwoSz5ELnNjcmVlbldpZHRofHxLPkQuc2NyZWVuSGVpZ2h0KSYmRC5yZXNpemUoSyxLLCEwKSxELmNsZWFyKCksSz1ELmN0eCxLLmJlZ2luUGF0aCgpLFMoUikuY29udGV4dChLKShudWxsKSxLLmNsb3NlUGF0aCgpLG0ucmVuZGVyUGF0aFdpdGhTdHlsZShLLE4pLEw9UyxKPVIsSz1OKTtELmJsaXRDZW50ZXIoQSxOLngsTi55KX19fX19fSwKZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoRCl7cmV0dXJuIEQgaW5zdGFuY2VvZiB5P0Q6RCBpbnN0YW5jZW9mIERhdGU/cChELnZhbHVlT2YoKSk6RCBpbnN0YW5jZW9mIEEuU2NhbGU/cihEKTpEIGluc3RhbmNlb2Ygdy5EYXRhc2V0P2woRCk6dShEKT9uKEQpOkFycmF5LmlzQXJyYXkoRCk/bShEKTpwKEQpfWZ1bmN0aW9uIHIoRCl7RD17ZG9tYWluOkQuZG9tYWluKCkscmFuZ2U6RC5yYW5nZSgpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKSxyZWY6cChEKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gbChEKXtEPXtyZWY6cChEKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCl9O3JldHVybiBuKEQpfWZ1bmN0aW9uIHAoRCl7cmV0dXJuIG5ldyBDKEQpfWZ1bmN0aW9uIG0oRCl7cmV0dXJuIG5ldyB4KEQubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBrKEIpfSkpfWZ1bmN0aW9uIG4oRCl7dmFyIEI9e30sSDtmb3IoSCBpbiBEKUQuaGFzT3duUHJvcGVydHkoSCkmJihCW0hdPWsoRFtIXSkpO3JldHVybiBuZXcgRyhCKX0KdmFyIHE9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSCgpe3RoaXMuY29uc3RydWN0b3I9RH1mb3IodmFyIEsgaW4gQilCLmhhc093blByb3BlcnR5KEspJiYoRFtLXT1CW0tdKTtELnByb3RvdHlwZT1udWxsPT09Qj9PYmplY3QuY3JlYXRlKEIpOihILnByb3RvdHlwZT1CLnByb3RvdHlwZSxuZXcgSCl9LHU9aCgxMjgpLHc9aCgzOCksQT1oKDE3KTtmLnNpZ249aztmLnNpZ25TY2FsZT1yO2Yuc2lnbkRhdGFzZXQ9bDtmLnNpZ25SZWY9cDtmLnNpZ25BcnJheT1tO2Yuc2lnbk9iaj1uO3ZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRCgpe31ELnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbihCKXtyZXR1cm4gQiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChCKTohMH07cmV0dXJuIER9KCk7Zi5TaWduYXR1cmU9eTt2YXIgeD1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEgpe3ZhciBLPUQuY2FsbCh0aGlzKXx8CnRoaXM7Sy5hcnJheT1IO3JldHVybiBLfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihIKXtpZihILmFycmF5Lmxlbmd0aCE9PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgSz0wO0s8dGhpcy5hcnJheS5sZW5ndGg7SysrKWlmKHRoaXMuYXJyYXlbS10uaXNEaWZmZXJlbnQoSC5hcnJheVtLXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLkFycmF5U2lnbmF0dXJlPXg7dmFyIEM9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihIKXt2YXIgSz1ELmNhbGwodGhpcyl8fHRoaXM7Sy5yZWY9SDtyZXR1cm4gS31xKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oSCl7cmV0dXJuIHRoaXMucmVmIT09SC5yZWZ9O3JldHVybiBCfSh5KTtmLlJlZmVyZW5jZVNpZ25hdHVyZT1DO3ZhciBHPWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSCl7dmFyIEs9RC5jYWxsKHRoaXMpfHx0aGlzO0sub2JqPQpIO3JldHVybiBLfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihIKXt2YXIgSz1PYmplY3Qua2V5cyh0aGlzLm9iaiksTD1PYmplY3Qua2V5cyhILm9iaik7aWYoSy5sZW5ndGghPT1MLmxlbmd0aClyZXR1cm4hMDtmb3IoTD0wO0w8Sy5sZW5ndGg7TCsrKXt2YXIgSj1LW0xdO2lmKCFILm9iai5oYXNPd25Qcm9wZXJ0eShKKXx8dGhpcy5vYmpbSl0uaXNEaWZmZXJlbnQoSC5vYmpbSl0pKXJldHVybiEwfXJldHVybiExfTtyZXR1cm4gQn0oeSk7Zi5PYmplY3RTaWduYXR1cmU9R30sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSwKcj1oKDEpLGw9aCgzKSxwPWgoMCksbT1oKDE0KSxuPWgoNDYpLHE9aCg2KSx1PWgoMzMpLHc9aCgxOSk7ZD1oKDUzKTt2YXIgQT1oKDIpO2g9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJhcmVhLXBsb3QiKTtDLnkwKDApO0MuYXR0cigiZmlsbC1vcGFjaXR5IiwuMjUpO0MuYXR0cigiZmlsbCIsKG5ldyBsLkNvbG9yKS5yYW5nZSgpWzBdKTtDLl9saW5lRHJhd2Vycz1uZXcgcC5NYXA7cmV0dXJuIEN9ayh4LHkpO3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxHKXtpZihudWxsPT1DKXJldHVybiB5LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rz95LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp5LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEcpO251bGwhPUcmJihDPXRoaXMueTAoKS5hY2Nlc3NvcixudWxsIT1DJiZ0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRyksdGhpcy5fdXBkYXRlWVNjYWxlKCkpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUueTA9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fWTBfS0VZKTt2YXIgRz10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRyYmRy5zY2FsZSk7dGhpcy5fdXBkYXRlWVNjYWxlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3kucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVZU2NhbGUoKX07eC5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9saW5lRHJhd2Vycy5zZXQoQyxuZXcgbS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdS5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsdS5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9CkEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy54KCkpLEg9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkoKSk7cmV0dXJuIEcuX2QzTGluZUZhY3RvcnkoQyxCLEgpfSkpfSkpO3kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxDKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihDKXt5LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxDKTtDPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChDKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9DLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpDLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEMpO3RoaXMuX2xpbmVEcmF3ZXJzLmdldChDKS5yZW1vdmUoKX07eC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD0KZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzKCksRD10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEg9QS5QbG90LmFwcGx5RHJhd1N0ZXBzKEcsQik7Qy5fbGluZURyYXdlcnMuZ2V0KEIpLmRyYXcoRC5nZXQoQiksSCl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlTGluZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih3LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih3LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtDLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4gbmV3IHEuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uQXJlYVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBtLkNhbnZhc0RyYXdlcihELG4ubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy54KCkpLEg9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkoKSksCks9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnkwKCkpO3JldHVybiBHLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEIsSCxLLEcuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQixIKSxDKX0pKX0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0cuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iody5BbmltYXRvci5NQUlOKX0pOwpyZXR1cm4gQ307eC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciBDPXRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpO0M9cC5BcnJheS51bmlxKHAuQXJyYXkuZmxhdHRlbihDKSk7dmFyIEc9MT09PUMubGVuZ3RoP0NbMF06bnVsbDtDPShDPXRoaXMueSgpKSYmQy5zY2FsZTtudWxsIT1DJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihDLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPUcmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltHXX0sQy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfTt4LnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249CmZ1bmN0aW9uKCl7cmV0dXJuIEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKX07eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtDLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO3JldHVybiBDfTt4LnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7dm9pZCAwPT09QyYmKEM9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gci5zZWxlY3RBbGwoKTt2YXIgRD15LnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcyxDKS5ub2RlcygpO0MubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBHLl9saW5lRHJhd2Vycy5nZXQoQil9KS5maWx0ZXIoZnVuY3Rpb24oQil7cmV0dXJuIG51bGwhPQpCfSkuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gRC5wdXNoLmFwcGx5KEQsQi5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSk7cmV0dXJuIHIuc2VsZWN0QWxsKEQpfTt4LnByb3RvdHlwZS5fY29uc3RydWN0QXJlYVByb2plY3Rvcj1mdW5jdGlvbihDLEcsRCl7dmFyIEI9dGhpcyxIPXRoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihLLEwsSil7cmV0dXJuIEIuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQyxHLEQsSCxKKShLKX19O3gucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIGZ1bmN0aW9uKEQsQixIKXt2YXIgSz1DKEQsQixIKTtEPUcoRCxCLEgpO3JldHVybiBwLk1hdGguaXNWYWxpZE51bWJlcihLKSYmcC5NYXRoLmlzVmFsaWROdW1iZXIoRCl9fTt4LnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvcj0KZnVuY3Rpb24oQyxHLEQsQixIKXt2YXIgSz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gci5hcmVhKCkueChmdW5jdGlvbihMLEope3JldHVybiBDKEwsSixIKX0pLnkxKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEcoTCxKLEgpfSkueTAoZnVuY3Rpb24oTCxKKXtyZXR1cm4gRChMLEosSCl9KS5jdXJ2ZShLKS5kZWZpbmVkKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEIoTCxKLEgpfSl9O3JldHVybiB4fShkLkxpbmUpO2guX1kwX0tFWT0ieTAiO2YuQXJlYT1ofSxmdW5jdGlvbihkLGYpeyhmdW5jdGlvbihoKXtoLk1BSU49Im1haW4iO2guUkVTRVQ9InJlc2V0In0pKGYuQW5pbWF0b3J8fChmLkFuaW1hdG9yPXt9KSl9LGZ1bmN0aW9uKGQsZil7dmFyIGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dmFyIHI9dGhpczt0aGlzLnRyYW5zbGF0ZT10aGlzLnNjYWxlPTA7dGhpcy5jYWNoZWREb21haW49W251bGwsbnVsbF07dGhpcy5sYXN0U2VlbkRvbWFpbj1bbnVsbCxudWxsXTt0aGlzLnVwZGF0ZURvbWFpbj0KZnVuY3Rpb24obCl7ci5sYXN0U2VlbkRvbWFpbj1sLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIHA9bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIuY2FjaGVkRG9tYWluWzFdKS1sLnNjYWxlVHJhbnNmb3JtYXRpb24oci5jYWNoZWREb21haW5bMF0pLG09bC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIubGFzdFNlZW5Eb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbihyLmxhc3RTZWVuRG9tYWluWzBdKTtyLnNjYWxlPXAvbXx8MTtyLnRyYW5zbGF0ZT1sLnNjYWxlVHJhbnNmb3JtYXRpb24oci5jYWNoZWREb21haW5bMF0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbihyLmxhc3RTZWVuRG9tYWluWzBdKSpyLnNjYWxlfHwwfX1rLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2NhbGU9MTt0aGlzLnRyYW5zbGF0ZT0wO3RoaXMuY2FjaGVkRG9tYWluPXRoaXMubGFzdFNlZW5Eb21haW59O2sucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbihyKXt0aGlzLmNhY2hlZERvbWFpbj0Kci5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfTtyZXR1cm4ga30oKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhyLGwpe3ZhciBwPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz1yO3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1sO3RoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgaDt0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IGg7dGhpcy5yZW5kZXJEZWZlcnJlZD1mdW5jdGlvbigpe3AuYXBwbHlUcmFuc2Zvcm0oKTtjbGVhclRpbWVvdXQocC50aW1lb3V0VG9rZW4pO3AudGltZW91dFRva2VuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtwLnJlbmRlckNhbGxiYWNrKCl9LGsuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19ay5wcm90b3R5cGUuc2V0RG9tYWlucz1mdW5jdGlvbihyLGwpe3ImJnRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4ocik7bCYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNldERvbWFpbihsKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2sucHJvdG90eXBlLnVwZGF0ZURvbWFpbnM9CmZ1bmN0aW9uKHIsbCl7ciYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbihyKTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7dGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCk7dGhpcy5hcHBseVRyYW5zZm9ybSgpfTtrLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9O3JldHVybiBrfSgpO2QuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMDtmLkRlZmVycmVkUmVuZGVyZXI9ZH0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxHKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBHKUcuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUdbQl0pO0MucHJvdG90eXBlPW51bGw9PT1HP09iamVjdC5jcmVhdGUoRyk6KEQucHJvdG90eXBlPUcucHJvdG90eXBlLG5ldyBEKX0scj1oKDEpLGw9aCg3KSxwPWgoMTQpLG09aCg2KSxuPWgoMzMpLHE9aCgzKSx1PWgoMTEpLHc9aCgwKTtkPWgoMTApO3ZhciBBPWgoMTkpLHk9aCgyKTtoPWgoMTYpO3ZhciB4PXtsaW5lYXI6ci5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6ci5jdXJ2ZUxpbmVhckNsb3NlZCxzdGVwOnIuY3VydmVTdGVwLHN0ZXBCZWZvcmU6ci5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOnIuY3VydmVTdGVwQWZ0ZXIsYmFzaXM6ci5jdXJ2ZUJhc2lzLGJhc2lzT3BlbjpyLmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOnIuY3VydmVCYXNpc0Nsb3NlZCwKYnVuZGxlOnIuY3VydmVCdW5kbGUsY2FyZGluYWw6ci5jdXJ2ZUNhcmRpbmFsLGNhcmRpbmFsT3BlbjpyLmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOnIuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpyLmN1cnZlTW9ub3RvbmVYfTtmLkN1cnZlTmFtZT1kLm1ha2VFbnVtKCJsaW5lYXIgbGluZWFyQ2xvc2VkIHN0ZXAgc3RlcEJlZm9yZSBzdGVwQWZ0ZXIgYmFzaXMgYmFzaXNPcGVuIGJhc2lzQ2xvc2VkIGJ1bmRsZSBjYXJkaW5hbCBjYXJkaW5hbE9wZW4gY2FyZGluYWxDbG9zZWQgbW9ub3RvbmUiLnNwbGl0KCIgIikpO2g9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9jdXJ2ZT0ibGluZWFyIjtELl9hdXRvcmFuZ2VTbW9vdGg9ITE7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITA7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITE7RC5hZGRDbGFzcygibGluZS1wbG90Iik7CnZhciBCPW5ldyBsLkVhc2luZztCLnN0ZXBEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuZWFzaW5nTW9kZSgiZXhwSW5PdXQiKTtCLm1heFRvdGFsRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtELmFuaW1hdG9yKEEuQW5pbWF0b3IuTUFJTixCKTtELmF0dHIoInN0cm9rZSIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtELmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS54PWZ1bmN0aW9uKEQsQixIKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS54LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueC5jYWxsKHRoaXMsRCxCLEgpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUueT1mdW5jdGlvbihELEIsSCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnkuY2FsbCh0aGlzLEQsQiwKSCk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxEKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGh9O0cucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpOyJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYKdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9O0cucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2N1cnZlO3RoaXMuX2N1cnZlPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkfTtHLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDt0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9CmZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDt0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7cmV0dXJuIG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEgpe3JldHVybiBuZXcgcC5DYW52YXNEcmF3ZXIoSCxuLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZDNMaW5lRmFjdG9yeShEKX0pKX0pfTtHLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oRCl7dmFyIEI9Qy5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxEKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RofHx0aGlzLmF1dG9yYW5nZU1vZGUoKSE9PQpEfHwieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIEI7RD10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7dmFyIEg9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/RC5sZWZ0LmNvbmNhdChELnJpZ2h0KS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsueX0pOkQudG9wLmNvbmNhdChELmJvdHRvbSkubWFwKGZ1bmN0aW9uKEspe3JldHVybiBLLnh9KTtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIHIuZXh0ZW50KHIubWVyZ2UoW0ssSF0pKX0pfTtHLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciBEPXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07CnZhciBCPXRoaXMueSgpLnNjYWxlLEg9dGhpcy54KCkuc2NhbGUsSz17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxMPUguc2NhbGUoSC5kb21haW4oKVswXSksSj1ILnNjYWxlKEguZG9tYWluKClbMV0pLE89Qi5zY2FsZShCLmRvbWFpbigpWzBdKSxTPUIuc2NhbGUoQi5kb21haW4oKVsxXSk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTil7Zm9yKHZhciBSPU4uZGF0YSgpLFgsYWEsZmEsb2EsWixjYSxqYSxiYT0xO2JhPFIubGVuZ3RoO2JhKyspb2E9Y2F8fEguc2NhbGUoRC54KCkuYWNjZXNzb3IoUltiYS0xXSxiYS0xLE4pKSxaPWphfHxCLnNjYWxlKEQueSgpLmFjY2Vzc29yKFJbYmEtMV0sYmEtMSxOKSksY2E9SC5zY2FsZShELngoKS5hY2Nlc3NvcihSW2JhXSxiYSxOKSksamE9Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihSW2JhXSxiYSxOKSksb2E8TD09PUw8PWNhJiYoWD1MLW9hLGFhPWNhLW9hLGZhPWphLVosWD1YKmZhL2FhLEsubGVmdC5wdXNoKHt4OkwsCnk6Qi5pbnZlcnQoWitYKX0pKSxvYTxKPT09Sjw9Y2EmJihYPUotb2EsYWE9Y2Etb2EsZmE9amEtWixYPVgqZmEvYWEsSy5yaWdodC5wdXNoKHt4OkoseTpCLmludmVydChaK1gpfSkpLFo8Uz09PVM8PWphJiYoYWE9Y2Etb2EsWD1TLVosZmE9amEtWixYPVgqYWEvZmEsSy50b3AucHVzaCh7eDpILmludmVydChvYStYKSx5OlN9KSksWjxPPT09Tzw9amEmJihhYT1jYS1vYSxYPU8tWixmYT1qYS1aLFg9WCphYS9mYSxLLmJvdHRvbS5wdXNoKHt4OkguaW52ZXJ0KG9hK1gpLHk6T30pKX0pO3JldHVybiBLfTtHLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgRD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxCPU1hdGgubWF4KERbMF0sRFsxXSk7RD1NYXRoLm1pbihEWzBdLERbMV0pO0I9MD5CJiZCfHwwPEQmJkR8fDA7dmFyIEg9dGhpcy55KCkuc2NhbGUuc2NhbGUoQik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEh9fTtHLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7dmFyIEQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtCLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtELnB1c2goe2F0dHJUb1Byb2plY3RvcjpCLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEEuQW5pbWF0b3IuUkVTRVQpfSl9RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5NQUlOKX0pO3JldHVybiBEfTtHLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCJkIiE9PQpCKXt2YXIgSD1EW0JdO0RbQl09ZnVuY3Rpb24oSyxMLEope3JldHVybiAwPEsubGVuZ3RoP0goS1swXSxMLEopOm51bGx9fX0pO3JldHVybiBEfTtHLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe0Q9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkoRCk7cmV0dXJuIG51bGwhPUQ/W0RdOltdfTtHLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24oRCl7dmFyIEI9SW5maW5pdHksSD1JbmZpbml0eSxLLEw9dGhpcy5ib3VuZHMoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihKKXtpZih3Lk1hdGgud2l0aGluKEoucG9zaXRpb24sTCkpe3ZhciBPPU1hdGguYWJzKEQueC1KLnBvc2l0aW9uLngpLFM9TWF0aC5hYnMoRC55LUoucG9zaXRpb24ueSk7aWYoTzxCfHxPPT09QiYmUzxIKUs9SixCPU8sSD1TfX0pO3JldHVybiBLfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwpELmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKEQsQil7dmFyIEg9dGhpcztyZXR1cm4gZnVuY3Rpb24oSyxMLEope3JldHVybiBILl9kM0xpbmVGYWN0b3J5KEosRCxCKShLKX19O0cucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKEQsQixIKXtmdW5jdGlvbiBLKEwsSixPKXt2YXIgUz1CKEwsSixPKTtMPUgoTCxKLE8pO3JldHVybiB3Lk1hdGguaXNWYWxpZE51bWJlcihTKSYmdy5NYXRoLmlzVmFsaWROdW1iZXIoTCl9dm9pZCAwPT09QiYmKEI9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpO3ZvaWQgMD09PUgmJihIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gci5saW5lKCkueChmdW5jdGlvbihMLEope3JldHVybiBCKEwsCkosRCl9KS55KGZ1bmN0aW9uKEwsSil7cmV0dXJuIEgoTCxKLEQpfSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoZnVuY3Rpb24oTCxKKXtyZXR1cm4gSyhMLEosRCl9KX07Ry5wcm90b3R5cGUuX2dldEN1cnZlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBEPXRoaXMuY3VydmUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBEPyhEPXhbRF0sbnVsbD09RD94LmxpbmVhcjpEKTpEfTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1uZXcgdy5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSCl7dmFyIEs9SC5kYXRhKCk7aWYoRC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWR8fEQuX2Rvd25zYW1wbGluZ0VuYWJsZWQpe3ZhciBMPUsubWFwKGZ1bmN0aW9uKEosTyl7cmV0dXJuIE99KTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCYmKEw9RC5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhILEwpKTtELl9kb3duc2FtcGxpbmdFbmFibGVkJiYKKEw9RC5fZmlsdGVyRG93bnNhbXBsaW5nKEgsTCkpO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKEw9RC5fZmlsdGVyRGVuc2VMaW5lcyhILEwpKTtCLnNldChILFtMLm1hcChmdW5jdGlvbihKKXtyZXR1cm4gS1tKXX0pXSl9ZWxzZSBCLnNldChILFtLXSl9KTtyZXR1cm4gQn07Ry5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBIKGZhLG9hKXtyZXR1cm4gdy5NYXRoLmluUmFuZ2UoZmEsMCxLLndpZHRoKCkpJiZ3Lk1hdGguaW5SYW5nZShvYSwwLEsuaGVpZ2h0KCkpfWZvcih2YXIgSz10aGlzLEw9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxPPUQuZGF0YSgpLFM9W10sTj0wO048Qi5sZW5ndGg7TisrKXt2YXIgUj1MKE9bQltOXV0sQltOXSxEKSxYPUooT1tCW05dXSxCW05dLEQpO1I9SChSLFgpO2lmKCFSJiZudWxsIT1CW04tCjFdJiZudWxsIT1PW0JbTi0xXV0pe1g9TChPW0JbTi0xXV0sQltOLTFdLEQpO3ZhciBhYT1KKE9bQltOLTFdXSxCW04tMV0sRCk7Uj1SfHxIKFgsYWEpfVJ8fG51bGw9PUJbTisxXXx8bnVsbD09T1tCW04rMV1dfHwoWD1MKE9bQltOKzFdXSxCW04rMV0sRCksYWE9SihPW0JbTisxXV0sQltOKzFdLEQpLFI9Unx8SChYLGFhKSk7UiYmUy5wdXNoKEJbTl0pfXJldHVybiBTfTtHLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nPWZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSChqYSxiYSl7dmFyIGthPUwoS1tCW2phXV0sQltqYV0sRCksVz1KKEtbQltqYV1dLEJbamFdLEQpLEVhPUwoS1tCW2phKzFdXSxCW2phKzFdLEQpO2phPUooS1tCW2phKzFdXSxCW2phKzFdLEQpO3JldHVybiBJbmZpbml0eT09PWJhP01hdGguZmxvb3Ioa2EpPT09TWF0aC5mbG9vcihFYSk6TWF0aC5mbG9vcihqYSk9PT1NYXRoLmZsb29yKFcrKEVhLWthKSpiYSl9aWYoMD09PUIubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgSz0KRC5kYXRhKCksTD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxKPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE89W0JbMF1dLFM9MDtTPEIubGVuZ3RoLTE7KXt2YXIgTj1CW1NdLFI9TChLW0JbU11dLEJbU10sRCksWD1KKEtbQltTXV0sQltTXSxEKSxhYT1MKEtbQltTKzFdXSxCW1MrMV0sRCksZmE9SihLW0JbUysxXV0sQltTKzFdLEQpO2ZhPU1hdGguZmxvb3IoUik9PT1NYXRoLmZsb29yKGFhKT9JbmZpbml0eTooZmEtWCkvKGFhLVIpO2FhPUJbU107WD1JbmZpbml0eT09PWZhP1g6UjtSPWFhO2Zvcih2YXIgb2E9WCxaPSEwO1M8Qi5sZW5ndGgtMSYmKFp8fEgoUyxmYSkpOyl7UysrO1o9ITE7dmFyIGNhPUluZmluaXR5PT09ZmE/SihLW0JbU11dLEJbU10sRCk6TChLW0JbU11dLEJbU10sRCk7Y2E+b2EmJihvYT1jYSxSPUJbU10pO2NhPFgmJihYPWNhLGFhPUJbU10pfWZhPUJbU107YWEhPT1OJiZPLnB1c2goYWEpO1IhPT1hYSYmUiE9PU4mJk8ucHVzaChSKTsKZmEhPT1OJiZmYSE9PWFhJiZmYSE9PVImJk8ucHVzaChmYSl9cmV0dXJuIE99O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBIPUQuZGF0YSgpLEs9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihKKXtyZXR1cm4gSyhIW0pdLEosRCl9LGZ1bmN0aW9uKEope3JldHVybiBMKEhbSl0sSixEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixILEspe3ZhciBMPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBKPW51bGwsTz0wO088PUIubGVuZ3RoOysrTyl7dmFyIFM9QltPXTtpZihudWxsIT1EW1NdKXt2YXIgTj1NYXRoLmZsb29yKEgoUykpLFI9SyhTKTtudWxsPT1KP0o9bmV3IHcuQnVja2V0KFMsTixSKTpKLmlzSW5CdWNrZXQoTik/Si5hZGRUb0J1Y2tldChSLApTKTooTC5wdXNoLmFwcGx5KEwsSi5nZXRVbmlxdWVJbmRpY2VzKCkpLEo9bmV3IHcuQnVja2V0KFMsTixSKSl9fW51bGwhPUomJkwucHVzaC5hcHBseShMLEouZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gTH07cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxyPWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT1yLnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT1yLnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx3PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHg9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4gdy5fZDNTY2FsZShHKStBLzJ9KTt5PXIuYmlzZWN0KEMseSk7eD1yLmJpc2VjdChDLHgpO3JldHVybiB1LnNsaWNlKHkseCl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHc9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih3KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx3KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHcpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHc9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4gdy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh4KXt0cnl7dmFyIEM9eC5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gcih4KXtpZigibnVtYmVyIj09PXR5cGVvZiB4KXJldHVybnttaW46eCxtYXg6eH07aWYoeCBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB4JiYibWF4ImluIHgpcmV0dXJuIHg7dGhyb3cgRXJyb3IoImlucHV0ICciK3grIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHgsQyl7eD14LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQoeCl8fDB9ZnVuY3Rpb24gcCh4KXtpZihudWxsPT14fHwibm9uZSI9PT14KXJldHVybiBudWxsO3g9eC5tYXRjaChBKTtpZihudWxsPT14fHwyPngubGVuZ3RoKXJldHVybiBudWxsO3g9eFsxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9eC5sZW5ndGg/bnVsbDp4fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24oeCxDKXtmb3IoO251bGwhPUMmJkMhPT14OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXh9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih4KXtyZXR1cm4geCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh4KSk6eCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh4PXguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6eC5sZWZ0LHk6eC50b3Asd2lkdGg6eC53aWR0aCwKaGVpZ2h0OnguaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24oeCl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHgpOnNldFRpbWVvdXQoeCxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24oeCl7eD14IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/eC5ub2RlKCk6eDt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgpO3JldHVybiBsKHgsIndpZHRoIikrbCh4LCJwYWRkaW5nLWxlZnQiKStsKHgsInBhZGRpbmctcmlnaHQiKStsKHgsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh4LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHgpe3g9eCBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp4Lm5vZGUoKTp4O3g9d2luZG93LmdldENvbXB1dGVkU3R5bGUoeCk7cmV0dXJuIGwoeCwiaGVpZ2h0IikrbCh4LCJwYWRkaW5nLXRvcCIpK2woeCwicGFkZGluZy1ib3R0b20iKStsKHgsImJvcmRlci10b3Atd2lkdGgiKStsKHgsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHc9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHgpe3g9cS5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXgpe3ZhciBDPQp4WzJdO3JldHVyblsreFsxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHgpe3g9dS5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT14Pyt4WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24oeCl7dmFyIEM9dy5leGVjKHguYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh4PUNbMV0sQz1DWzJdLFsreCxudWxsPT1DPyt4OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHgsQyl7cmV0dXJuIG4uZmxvb3IoeC5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwoeC5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih4LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh4LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24oeCxDKXtyZXR1cm57bGVmdDp4LmxlZnQtQyx0b3A6eC50b3AtQyxyaWdodDp4LnJpZ2h0KwpDLGJvdHRvbTp4LmJvdHRvbStDLHdpZHRoOngud2lkdGgrMipDLGhlaWdodDp4LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24oeCxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwoeC5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh4LnRvcCkmJm4uZmxvb3IoeC5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih4LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24oeCxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3g9cih4KTtDPXIoQyk7cmV0dXJuIEcueCtHLndpZHRoPj14Lm1pbi1EJiZHLng8PXgubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHgpe2Zvcih2YXIgQz1bXTt4JiZ4IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh4KSx4PXgucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih4KXt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgsbnVsbCk7eD14LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8eC5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAoeCl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUsdyl7cmV0dXJuW3VbMF0qd1swXSt1WzJdKndbMV0sdVsxXSp3WzBdK3VbM10qd1sxXSx1WzBdKndbMl0rdVsyXSp3WzNdLHVbMV0qd1syXSt1WzNdKndbM10sdVswXSp3WzRdK3VbMl0qd1s1XSt1WzRdLHVbMV0qd1s0XSt1WzNdKndbNV0rdVs1XV19ZnVuY3Rpb24gcih1LHcpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKndbMF0rdVsyXSp3WzFdK3VbNF0sdVsxXSp3WzBdK3VbM10qd1sxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB3PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXcpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3c9MS93O3JldHVyblt3KnVbM10sdyotdVsxXSx3Ki11WzJdLHcqdVswXSx3KigtdVszXSp1WzRdK3VbMl0qdVs1XSksdyoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx3LEEpe3JldHVybiBuLm1pbih3LEEpPD11JiZ1PD1uLm1heCh3LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUsdyxBKXtyZXR1cm4gbi5taW4obi5tYXgodyx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx3LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2Ygdz93Om51bGw7dz1udWxsPT15P3c6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp3fTtmLm1pbj1mdW5jdGlvbih1LHcsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB3P3c6bnVsbDt3PW51bGw9PXk/dzpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6d307Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHcsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt3PW4ubWF4KG4uY2VpbCgody11KS9BKSwwKTtmb3IodmFyIHk9W10seD0wO3g8dzsrK3gpeVt4XT11K0EqeDtyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx3KXtyZXR1cm4gbi5wb3cody55LXUueSwyKStuLnBvdyh3LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUsdyl7cmV0dXJuIHcudG9wTGVmdC54PD11LngmJncuYm90dG9tUmlnaHQueD49dS54JiZ3LnRvcExlZnQueTw9dS55JiZ3LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUsdyxBLHkseCxDKXtyZXR1cm4gdTw9MCt4JiYwPD11K0EmJnc8PTArQyYmMDw9dyt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgdz1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB4PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0oeCk7aWYobnVsbCE9Qyl7dmFyIEc9eC5jbGllbnRXaWR0aC8yLEQ9eC5jbGllbnRIZWlnaHQvMjt3PXIodyxbRyxEXSk7dz1rKHcsbChDKSk7dz1yKHcsWy1HLC1EXSl9Qz14LnNjcm9sbExlZnQ7Rz14LnNjcm9sbFRvcDtpZihudWxsPT09QXx8eD09PUEpQy09eC5vZmZzZXRMZWZ0K3guY2xpZW50TGVmdCwKRy09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AsQT14Lm9mZnNldFBhcmVudDt3PXIodyxbQyxHXSl9cmV0dXJuIHd9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUsdyl7cmV0dXJuW3dbMF0sd1sxXSx3WzJdLHdbM10sd1s0XSt1WzBdLHdbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9cjtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx3KXtyZXR1cm57eDp1WzBdKncueCt1WzJdKncueSt1WzRdLHk6dVsxXSp3LngrdVszXSp3LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgcighMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgcighMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT1yLnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx3PTA7dzx1LmVudHJpZXMubGVuZ3RoO3crKyl7dmFyIEE9dS5lbnRyaWVzW3ddO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0sdz11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+d3x8SW5maW5pdHk9PT13JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT1yO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGsscil7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHIscCxtLGwpfSxyKTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwociwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHIuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwscik7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHIucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhyKXtmb3IodmFyIGwgaW4gcilmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT1yW2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09ci5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0oci5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXIucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9OwpyLnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07ci5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTtyLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgdz1sLnNwbGl0KCJcbiIpO3JldHVybiB3LnJlZHVjZShmdW5jdGlvbihBLHkseCl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHghPT13Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307ci5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHcpe3JldHVybiBxLndyYXBOZXh0VG9rZW4odyx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3IucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx3KXtyZXR1cm4gdyE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTtyLnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx3PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46dysiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46dytuKyIuLi4ifX07ci5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3IucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTtyLnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gcn0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHIgaW4gaylmLmhhc093blByb3BlcnR5KHIpfHwoZltyXT1rW3JdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHIpe2Zvcih2YXIgbCBpbiByKWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXJbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsoeCxDKXtyZXR1cm4geC5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiByKHgsQyl7Zm9yKHZhciBHIGluIEMpeC5hdHRyKEcsQ1tHXSk7cmV0dXJuIHh9ZnVuY3Rpb24gbCh4LEMsRyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSDtmb3IoSCBpbiBEKUIuc3R5bGUoSCxEW0hdLEcpfSl9ZnVuY3Rpb24gcCh4LEMsRyl7Zm9yKHZhciBEIGluIEMpeC5zdHlsZShELENbRF0sRyk7cmV0dXJuIHh9ZnVuY3Rpb24gbSh4LEMpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih4LEMpe2Zvcih2YXIgRyBpbiBDKXgucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4geH1mdW5jdGlvbiBxKHgsQyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih4KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHgsQyl7Zm9yKHZhciBHIGluIEMpeC5hdHRyKEcsQ1tHXSk7cmV0dXJuIHh9ZnVuY3Rpb24gdyh4LEMsRyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih4KSxIO2ZvcihIIGluIEQpQi5zdHlsZShILERbSF0sRyl9KX1mdW5jdGlvbiBBKHgsQyxHKXtmb3IodmFyIEQgaW4gQyl4LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4geH12YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB4P2s6cikodGhpcyx4KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB4P2w6cCkodGhpcyx4LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9tOm4pKHRoaXMseCl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9xOnUpKHRoaXMseCl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/dzpBKSh0aGlzLHgsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHI9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24odyxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXJbcF0sbnVsbD09cD9yLmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7fXIucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTtyLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiByfSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24gdygpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KToody5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHcpfSxyPWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUodyxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7dz1xLmNhbGwodGhpcyx3LEEpfHx0aGlzO3cuX3RpY2tMYWJlbEFuZ2xlPTA7dy5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3cuYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4gd31rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB3PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJncubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB3fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx4PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT94Kz1DOnkrPUN9dz10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh3LEEpO3JldHVybnttaW5XaWR0aDp3LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp3LnVzZWRIZWlnaHQreH19O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx3KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odyxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx3LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih3KXt2YXIgQTt2b2lkIDA9PT13JiYodz10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9dy5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp3LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp3LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24odyl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHcpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih3LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB4PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6eD17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp4PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXIuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT93Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEg9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6dyxLPXt4QWxpZ246eFt5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTD1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO0w9RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK0wrIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixMKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSCxLLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24odyxBKXt2YXIgeT10aGlzLHg9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT93OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oeCk7eD1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXctdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXctdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9eC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt3PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9yLnN1bTptLk1hdGgubWF4O3g9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6ci5zdW07dz13KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXgoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0Esd10sdz1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp3LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHc9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx4PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3g9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoeCk7dmFyIEc9eC5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh4KTt4LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD13LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXcuaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt4PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIreCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24odyxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHcsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KToody5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHcpfSwKcj1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHcsQSl7dz1xLmNhbGwodGhpcyx3LEEpfHx0aGlzO3cuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3cuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3cuZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4gd31rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHcpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdzpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt3KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB3PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9dy5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4gdy5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHcuZm9ybWF0dGVyKCkoeCkubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdzpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt3KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLl9zY2FsZSxBPXcuZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx4PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB3LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD14fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB3PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih3PnRoaXMud2lkdGgoKXx8dzx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB3PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHg9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxIPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0teDtIPXg7YnJlYWs7Y2FzZSAiY2VudGVyIjpIPXkreDticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEg9Rz14fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9eDtEPS14O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3g7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj14fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStIO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSDticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihLKXtyZXR1cm4gdy5mb3JtYXR0ZXIoKShLKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp3PXcudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT13JiYiY2VudGVyIiE9PXcmJiJyaWdodCIhPT13KXRocm93IEVycm9yKHcrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXcmJiJjZW50ZXIiIT09dyYmImJvdHRvbSIhPT13KXRocm93IEVycm9yKHcrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdz10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx3KXx8ci5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdyl8fHIuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdz10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHg9ci5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0KeHx8InZpc2libGUiPT09eH0pLEE9dy5ub2RlcygpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3cuZWFjaChmdW5jdGlvbih4LEMpe3g9ci5zZWxlY3QodGhpcyk7MCE9PUMleSYmeC5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHcsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgeD0wO3g8QS5sZW5ndGgtdzt4Kz13KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3hdLEFbeCt3XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciByPWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3gmJih4PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3gmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdyhDKXtBKEMpJiYoeD0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyByLkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgeD0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQodyk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQodyk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB3PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHc7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHctdSkvMik7cmV0dXJuIEF9fXZhciByPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXIocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgdyBpbiBxKXEuaGFzT3duUHJvcGVydHkodykmJgooblt3XT1xW3ddKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHI9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB3PW4uY2FsbCh0aGlzKXx8dGhpczt3Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3cuX3NjYWxlPXU7dy5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdy5yZWRyYXcoKX07dy5fc2NhbGUub25VcGRhdGUody5fcmVkcmF3Q2FsbGJhY2spO3cuX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt3Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7dy5fZXhwYW5kcz0hMTt3LmFkZENsYXNzKCJsZWdlbmQiKTt3LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHd9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHc9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3dbMF1dO2Zvcih2YXIgQT0od1sxXS13WzBdKS8odS0xKSx5PVtdLHg9MDt4PHU7eCsrKXkucHVzaCh3WzBdK0EqeCk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHIuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyByLk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHIuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHIuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMsdz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHg9bS5NYXRoLm1heChBLDApO0E9dyt3K3RoaXMuX3RleHRQYWRkaW5nK3grdGhpcy5fdGV4dFBhZGRpbmc7eD15Knd9ZWxzZSB4PXcrdyt3LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KncrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6eH19O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih3WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgseD10aGlzLl9mb3JtYXR0ZXIod1sxXSk7dz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHgpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEg9MCxLPTAsTD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSj17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sTz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBTPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIE49TWF0aC5tYXgoeSx3KTt2YXIgUj0odGhpcy53aWR0aCgpLU4tMip0aGlzLl90ZXh0UGFkZGluZykvMjt3PU1hdGgubWF4KHRoaXMud2lkdGgoKS1SLTIqRy1OLDApOwpDPTE7dmFyIFg9ZnVuY3Rpb24oZmEsb2Epe3JldHVybiB1LmhlaWdodCgpLShvYSsxKX07Si55QWxpZ249InRvcCI7Qj0wO0wueUFsaWduPSJib3R0b20iO0s9MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIGFhPWZ1bmN0aW9uKCl7cmV0dXJuIEcrTitHfTtKLnhBbGlnbj0icmlnaHQiO0Q9LShSK3crRyk7TC54QWxpZ249InJpZ2h0IjtIPS0oUit3K0cpfWVsc2UgYWE9ZnVuY3Rpb24oKXtyZXR1cm4gUn0sSi54QWxpZ249ImxlZnQiLEQ9Uit3K0csTC54QWxpZ249ImxlZnQiLEg9Uit3K0c7Ty53aWR0aD13O08uaGVpZ2h0PVMqQ31lbHNlIFI9TWF0aC5tYXgoRywodGhpcy5oZWlnaHQoKS1DKS8yKSxTPU1hdGgubWF4KE1hdGguZmxvb3IodGhpcy53aWR0aCgpLTQqRy15LXcpLDApLHc9MSxDPU1hdGgubWF4KHRoaXMuaGVpZ2h0KCktMipSLDApLGFhPWZ1bmN0aW9uKGZhLG9hKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrb2F9LFg9ZnVuY3Rpb24oKXtyZXR1cm4gUn0sCkoueEFsaWduPSJyaWdodCIsRD0tRyxMLnhBbGlnbj0ibGVmdCIsSD1HLE8ueT1SLE8ud2lkdGg9Uyp3LE8uaGVpZ2h0PUM7Ty54PWFhKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeCx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxKLHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoQSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxMLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0grIiwgIitLKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoTyk7QT10aGlzLl9nZW5lcmF0ZVRpY2tzKFMpO0E9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKEEpOwp4PUEuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPUEubWVyZ2UoeCk7QS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihmYSl7cmV0dXJuIHUuX3NjYWxlLnNjYWxlKGZhKX0sd2lkdGg6dyxoZWlnaHQ6Qyx4OmFhLHk6WCwic2hhcGUtcmVuZGVyaW5nIjoiY3Jpc3BFZGdlcyJ9KTtsLkFERF9USVRMRV9FTEVNRU5UUyYmeC5hcHBlbmQoInRpdGxlIikudGV4dChmdW5jdGlvbihmYSl7cmV0dXJuIHUuX2Zvcm1hdHRlcihmYSl9KTtyZXR1cm4gdGhpc307cmV0dXJuIHF9KGgoNCkuQ29tcG9uZW50KTtkLl9ERUZBVUxUX05VTV9TV0FUQ0hFUz0xMTtkLkxFR0VORF9MQUJFTF9DTEFTUz0ibGVnZW5kLWxhYmVsIjtmLkludGVycG9sYXRlZENvbG9yTGVnZW5kPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJgoobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCg1KTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT0iIik7dm9pZCAwPT09biYmKG49MCk7dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuYWRkQ2xhc3MoImxhYmVsIik7cS50ZXh0KG0pO3EuYW5nbGUobik7cS54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKTtxLl9wYWRkaW5nPTA7cmV0dXJuIHF9ayhwLGwpO3AucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxuPSgwPT09dGhpcy5hbmdsZSgpP20ud2lkdGg6bS5oZWlnaHQpKzIqdGhpcy5wYWRkaW5nKCk7bT0oMD09PXRoaXMuYW5nbGUoKT9tLmhlaWdodDptLndpZHRoKSsyKnRoaXMucGFkZGluZygpO3JldHVybnttaW5XaWR0aDpuLAptaW5IZWlnaHQ6bX19O3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2wucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIik7dmFyIG09bmV3IHIuU3ZnQ29udGV4dCh0aGlzLl90ZXh0Q29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHIuQ2FjaGVNZWFzdXJlcihtKTt0aGlzLl93cmFwcGVyPW5ldyByLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyByLldyaXRlcih0aGlzLl9tZWFzdXJlcixtLHRoaXMuX3dyYXBwZXIpO3RoaXMudGV4dCh0aGlzLl90ZXh0KX07cC5wcm90b3R5cGUudGV4dD1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl90ZXh0O2lmKCJzdHJpbmciIT09dHlwZW9mIG0pdGhyb3cgRXJyb3IoIkxhYmVsLnRleHQoKSBvbmx5IHRha2VzIHN0cmluZ3MgYXMgaW5wdXQiKTt0aGlzLl90ZXh0PW07dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuYW5nbGU9CmZ1bmN0aW9uKG0pe2lmKG51bGw9PW0pcmV0dXJuIHRoaXMuX2FuZ2xlO20lPTM2MDsxODA8bT9tLT0zNjA6LTE4MD5tJiYobSs9MzYwKTtpZigtOTA9PT1tfHwwPT09bXx8OTA9PT1tKXRoaXMuX2FuZ2xlPW07ZWxzZSB0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgYW5nbGUgZm9yIExhYmVsIik7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucGFkZGluZz1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9wYWRkaW5nO209K207aWYoMD5tKXRocm93IEVycm9yKG0rIiBpcyBub3QgYSB2YWxpZCBwYWRkaW5nIHZhbHVlLiBDYW5ub3QgYmUgbGVzcyB0aGFuIDAuIik7dGhpcy5fcGFkZGluZz1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9CmZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj1NYXRoLm1heChNYXRoLm1pbigodGhpcy5oZWlnaHQoKS1tLmhlaWdodCkvMix0aGlzLnBhZGRpbmcoKSksMCk7bT1NYXRoLm1heChNYXRoLm1pbigodGhpcy53aWR0aCgpLW0ud2lkdGgpLzIsdGhpcy5wYWRkaW5nKCkpLDApO3RoaXMuX3RleHRDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO209dGhpcy53aWR0aCgpLTIqbTtuPXRoaXMuaGVpZ2h0KCktMipuO3ZhciBxPXt4QWxpZ246dGhpcy54QWxpZ25tZW50KCkseUFsaWduOnRoaXMueUFsaWdubWVudCgpLHRleHRSb3RhdGlvbjp0aGlzLmFuZ2xlKCl9O3RoaXMuX3dyaXRlci53cml0ZSh0aGlzLl90ZXh0LG0sbixxKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBwfShoKDQpLkNvbXBvbmVudCk7Zi5MYWJlbD1kO2g9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe209bC5jYWxsKHRoaXMsbSxuKXx8dGhpczttLmFkZENsYXNzKHAuVElUTEVfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7aC5USVRMRV9MQUJFTF9DTEFTUz0idGl0bGUtbGFiZWwiO2YuVGl0bGVMYWJlbD1oO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtLG4pe209bC5jYWxsKHRoaXMsbSxuKXx8dGhpczttLmFkZENsYXNzKHAuQVhJU19MQUJFTF9DTEFTUyk7cmV0dXJuIG19ayhwLGwpO3JldHVybiBwfShkKTtkLkFYSVNfTEFCRUxfQ0xBU1M9ImF4aXMtbGFiZWwiO2YuQXhpc0xhYmVsPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8CmZ1bmN0aW9uKEEseSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9QX1mb3IodmFyIEMgaW4geSl5Lmhhc093blByb3BlcnR5KEMpJiYoQVtDXT15W0NdKTtBLnByb3RvdHlwZT1udWxsPT09eT9PYmplY3QuY3JlYXRlKHkpOih4LnByb3RvdHlwZT15LnByb3RvdHlwZSxuZXcgeCl9LHI9aCgxKSxsPWgoNSkscD1oKDIzKSxtPWgoOCksbj1oKDMxKSxxPWgoMCk7ZD1oKDQpO3ZhciB1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQSh5LHgsQyl7dm9pZCAwPT09eSYmKHk9W10pO3ZvaWQgMD09PXgmJih4PTApO3ZvaWQgMD09PUMmJihDPUluZmluaXR5KTt0aGlzLmNvbHVtbnM9eTt0aGlzLmJvdHRvbVBhZGRpbmc9eDt0aGlzLm1heFdpZHRoPUN9QS5wcm90b3R5cGUuYWRkQ29sdW1uPWZ1bmN0aW9uKHkpe3ZhciB4PXkud2lkdGgsQz10aGlzLmdldFdpZHRoQXZhaWxhYmxlKCk7eS53aWR0aD1NYXRoLm1pbihDLHgpO3RoaXMuY29sdW1ucy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRCb3VuZHM9CmZ1bmN0aW9uKHkpe2Zvcih2YXIgeD10aGlzLmNvbHVtbnNbeV0sQz0wLEc9MDtHPHk7RysrKUMrPXRoaXMuY29sdW1uc1tHXS53aWR0aDtyZXR1cm57dG9wTGVmdDp7eDpDLHk6MH0sYm90dG9tUmlnaHQ6e3g6Qyt4LndpZHRoLHk6eC5oZWlnaHR9fX07QS5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHEuTWF0aC5tYXgodGhpcy5jb2x1bW5zLm1hcChmdW5jdGlvbih5KXtyZXR1cm4geS5oZWlnaHR9KSwwKSt0aGlzLmJvdHRvbVBhZGRpbmd9O0EucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24oeSx4KXtyZXR1cm4geSt4LndpZHRofSwwKSx0aGlzLm1heFdpZHRoKX07QS5wcm90b3R5cGUuZ2V0V2lkdGhBdmFpbGFibGU9ZnVuY3Rpb24oKXt2YXIgeT10aGlzLmdldFdpZHRoKCk7cmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGgteSwwKX07cmV0dXJuIEF9KCksdz1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSwKeCxDLEcpe3ZvaWQgMD09PXkmJih5PUluZmluaXR5KTt2b2lkIDA9PT14JiYoeD1JbmZpbml0eSk7dm9pZCAwPT09QyYmKEM9MCk7dm9pZCAwPT09RyYmKEc9W10pO3RoaXMubWF4V2lkdGg9eTt0aGlzLm1heEhlaWdodD14O3RoaXMucGFkZGluZz1DO3RoaXMucm93cz1HfUEucHJvdG90eXBlLmFkZFJvdz1mdW5jdGlvbih5KXt5Lm1heFdpZHRoPXRoaXMubWF4V2lkdGgtMip0aGlzLnBhZGRpbmc7dGhpcy5yb3dzLnB1c2goeSl9O0EucHJvdG90eXBlLmdldENvbHVtbkJvdW5kcz1mdW5jdGlvbih5LHgpe3ZhciBDPXRoaXMuZ2V0Um93Qm91bmRzKHkpO3k9dGhpcy5yb3dzW3ldLmdldEJvdW5kcyh4KTt5LnRvcExlZnQueCs9Qy50b3BMZWZ0Lng7eS5ib3R0b21SaWdodC54Kz1DLnRvcExlZnQueDt5LnRvcExlZnQueSs9Qy50b3BMZWZ0Lnk7eS5ib3R0b21SaWdodC55Kz1DLnRvcExlZnQueTtyZXR1cm4geX07QS5wcm90b3R5cGUuZ2V0Um93Qm91bmRzPWZ1bmN0aW9uKHkpe2Zvcih2YXIgeD0KdGhpcy5wYWRkaW5nLEM9dGhpcy5wYWRkaW5nLEc9MDtHPHk7RysrKUMrPXRoaXMucm93c1tHXS5nZXRIZWlnaHQoKTtyZXR1cm57dG9wTGVmdDp7eCx5OkN9LGJvdHRvbVJpZ2h0Ont4OngrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHgpe3JldHVybiB5K3guZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHgpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09eCl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9eDtDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEgpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3guYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7eD1uZXcgbC5TdmdDb250ZXh0KHgubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeCk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIseCx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PQp4KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih4KXtpZihudWxsPT14KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih4KXtudWxsIT14JiYodGhpcy5fY29tcGFyYXRvcj0KeCx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbCE9eD8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9eCx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih4LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHcoeCxDLHRoaXMuX3BhZGRpbmcpO3g9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oSywKTCl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKEspLEcuX2Zvcm1hdHRlcihMKSl9KTt2YXIgSD1uZXcgdTtCLmFkZFJvdyhIKTtILmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt4LmZvckVhY2goZnVuY3Rpb24oSyl7SC5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihIPW5ldyB1LEguYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEgpKTt2YXIgTD1ILmdldFdpZHRoQXZhaWxhYmxlKCksSj1HLl9mb3JtYXR0ZXIoSyksTz1HLl9tZWFzdXJlci5tZWFzdXJlKEopLndpZHRoOzA+TC1ELU8mJjE8SC5jb2x1bW5zLmxlbmd0aCYmKEg9bmV3IHUsSC5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSCkpO0guYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Syx0eXBlOiJzeW1ib2wifX0pO0w9SC5nZXRXaWR0aEF2YWlsYWJsZSgpO0w9TWF0aC5taW4oTCwKTyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7Sj1HLl93cmFwcGVyLndyYXAoSixHLl9tZWFzdXJlcixMKS5ub0xpbmVzKkQ7SC5hZGRDb2x1bW4oe3dpZHRoOkwsaGVpZ2h0OkosZGF0YTp7bmFtZTpLLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQyl7eD10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx4XSx4KSxDKTtyZXR1cm57bWluSGVpZ2h0OnguZ2V0SGVpZ2h0KCksbWluV2lkdGg6eC5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih4KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixIKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBLPUcuZ2V0Um93Qm91bmRzKEgpO3JldHVybiBxLk1hdGgud2l0aGluKHgsSyk/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihMLEosTyl7dmFyIFM9Ry5nZXRDb2x1bW5Cb3VuZHMoSCxPKTtpZihxLk1hdGgud2l0aGluKHgsUykpe0w9Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSF07Tz1yLnNlbGVjdChMKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoTy8yKV07dmFyIE49ci5zZWxlY3QoTykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO1M9cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHIuc2VsZWN0KEwpKTtOPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhOKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveChyLnNlbGVjdChMKSksZGF0dW06Si5kYXRhLm5hbWUscG9zaXRpb246e3g6U1swXStOWzBdLHk6U1sxXStOWzFdfSxzZWxlY3Rpb246ci5zZWxlY3QoTyksCmNvbXBvbmVudDpDfV19cmV0dXJuIEx9LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB4PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh4LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixIKXtCPXguZ2V0Um93Qm91bmRzKEgpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSCl7Zm9yKHZhciBLPQpbXSxMPTA7TDxCLmNvbHVtbnMubGVuZ3RoO0wrPTIpSy5wdXNoKFtCLmNvbHVtbnNbTF0sQi5jb2x1bW5zW0wrMV1dKTtCPXIuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKEspO0s9Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO0suYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiBELnN5bWJvbCgpKEouZGF0YS5uYW1lLEgpKC42KkouaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSil7Sj1KWzBdO3JldHVybiJ0cmFuc2xhdGUoIisoeC5nZXRDb2x1bW5Cb3VuZHMoSCx4LnJvd3NbSF0uY29sdW1ucy5pbmRleE9mKEopKS50b3BMZWZ0LngrSi53aWR0aC8yKSsiLCAiK0ouaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSil7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSlswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEope3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShKWzBdLmRhdGEubmFtZSxIKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihKKXtyZXR1cm4idHJhbnNsYXRlKCIreC5nZXRDb2x1bW5Cb3VuZHMoSCx4LnJvd3NbSF0uY29sdW1ucy5pbmRleE9mKEpbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihKKXt2YXIgTz1yLnNlbGVjdCh0aGlzKTtKPUpbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihKLmRhdGEubmFtZSksSi53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sTy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXg7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3PXcuZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT13KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHcucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXcpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2Ygci5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHcpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEsdyx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB3PXRoaXMuX3Jvd3MsQT1yLnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt3PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMsdyxmdW5jdGlvbihOKXtyZXR1cm4gbnVsbD09Tnx8Ti5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTil7cmV0dXJuIG51bGw9PU58fE4uZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIDA9PT1OPy41Ok59KSx4PXcubWFwKGZ1bmN0aW9uKE4pe3JldHVybiAwPT09Tj8uNTpOfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeCwKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt4PTA7Zm9yKHZhciBCLEgsSzs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0g9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTil7cmV0dXJuIE59KTtLPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihOKXtyZXR1cm4gTn0pO3ZhciBMPU8sSj1TO3ZhciBPPW4tci5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgUz1xLXIuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0g/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTj8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Sz8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTj8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx3KSk6Qz13O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksTyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxTKTt4Kys7Sj0wPFMmJlMhPT1KO2lmKCEoMDxPJiZPIT09THx8SikpYnJlYWs7aWYoNTx4KWJyZWFrfU89bi1yLnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO1M9cS1yLnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLE8pO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHcsUyk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SCx3YW50c0hlaWdodDpLfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgdz0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx4PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3dbQl09TWF0aC5tYXgod1tCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBIPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEg7Qj1ELm1pbkhlaWdodD5xW0ddO3hbR109eFtHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6dywKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6eH19O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnIuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnIuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHc9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj1yLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9ci5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cykseD1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixIKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHhbSF0seVtHXSk7RCs9eFtIXSt3Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt3Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj1yLnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHc9MDt3PHE7dysrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1bd10mJih0aGlzLl9yb3dzW3VdW3ddPW51bGwpfWZvcih3PTA7dzxxO3crKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3ddJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t3XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih3LEEpe3JldHVybiBudWxsIT13P3c6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHkseCl7cmV0dXJuIHkmJnh9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9ci5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHEqCncvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh3KXtyZXR1cm4gdy5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHcpe3JldHVybiB1KHcubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3ZhciBwPXIuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHIpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7ci5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiByLnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHIucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocixsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJihyW21dPWxbbV0pO3IucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbihyKXtmdW5jdGlvbiBsKCl7dmFyIHA9ci5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCxyKTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7ci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXtyLnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gci5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiByLnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3ZhciBwPXIuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwscik7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0scj1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9ci5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHIuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSxyPWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj1yLmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgdz1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0seD15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt4XT15LHcucHVzaCh4KSl9MDx3Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEsdyx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gci5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD1yO3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD1yKmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayxyLGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHIsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXIqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD1yKyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGsscixsKXt2b2lkIDA9PT1yJiYocj0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxyLGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayxyLGwpe3ZvaWQgMD09PXImJihyPTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3Ioci10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHIsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9cjt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9cipwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayxyLHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHI9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCxyLGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHIsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx3KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXIuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMsdz10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh3LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHcsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx3KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0sdyl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx3KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1yLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ci5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUsdyl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHcpdy5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09d1t5XSk7dS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQS5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEEpfSxyPWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoQSx5KXt2YXIgeD11LmNhbGwodGhpcyl8fHRoaXM7eC5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eC5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB4Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3guX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB4Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3guX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHguX2hhbmRsZVBpbmNoKEMsRyl9O3guX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHguX2hhbmRsZVRvdWNoRW5kKEMpfTsKeC5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4geC5faGFuZGxlVG91Y2hFbmQoQyl9O3guX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt4Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3guX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7eC5feFNjYWxlcz1uZXcgbS5TZXQ7eC5feVNjYWxlcz1uZXcgbS5TZXQ7eC5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7eC5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt4Ll90b3VjaElkcz1yLm1hcCgpO3guX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3guX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3guX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7eC5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ4LmFkZFhTY2FsZShBKTtudWxsIT15JiZ4LmFkZFlTY2FsZSh5KTtyZXR1cm4geH1rKHcsdSk7dy5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3cucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3cucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih4LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHgsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07dy5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHkseCl7dmFyIEM9dGhpczt2b2lkIDA9PT14JiYoeD0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt4JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBIPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhIWzFdK0hbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBIPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhIWzFdK0hbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3cucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3cucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07dy5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHg9MDt4PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt4Kyspe3ZhciBDPUFbeF07dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp3LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgeD10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXcuX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3guX3RvdWNoSWRzLmhhcyhMLnRvU3RyaW5nKCkpJiZ4Ll90b3VjaElkcy5zZXQoTC50b1N0cmluZygpLHguX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtMXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD13Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxIPUEubWFwKGZ1bmN0aW9uKEwsCkope3JldHVybnt4OihMLngtQ1tKXS54KS9CLHk6KEwueS1DW0pdLnkpL0J9fSk7Rz13LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIEs9Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTCxKKXtyZXR1cm57eDpIW0pdLngqSytMLngseTpIW0pdLnkqSytMLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3cuY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt3Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt3LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24oeCl7eS5fdG91Y2hJZHMucmVtb3ZlKHgudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3cucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3cuX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt3LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHkseCl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx4LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3cucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07dy5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHgsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3gueDp5LngpLUMueCx5OihudWxsPT15P3gueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07dy5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt3LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt3LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07dy5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt3LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3cucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt3LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt3LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx4PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx4KTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07dy5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07dy5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307dy5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHd9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0scj1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUsdyl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx3KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXIuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1yLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciByPVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXJbbF09YXJndW1lbnRzW2xdO3ZhciBwPXIuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHJbci5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10sdz0wO3c8YXJndW1lbnRzLmxlbmd0aDt3KyspdVt3XT1hcmd1bWVudHNbd107aWYobilyZXR1cm4gbTt3PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQodyk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXcsbT1yLmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB3IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh3KSYmKG5bd109cVt3XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSxyPWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgdz10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB4PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHgoRyxELEIpK3cuX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB4KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt3Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMsdz10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHcuc2NhbGUoU3RyaW5nKHkpKS13LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyByLkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB3PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAsdyhudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSxyPWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHc9aCg0NSksQT1oKDYpLHk9aCgzNSkseD1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSCl7cmV0dXJuIFN0cmluZyhIKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixIKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSCk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB3LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBIPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihLKXtLPUIuX3N0cm9rZURyYXdlcnMuZ2V0KEspO251bGwhPUsmJkgucHVzaC5hcHBseShILEsuZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiByLnNlbGVjdEFsbChIKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSCl7SC5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtILnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgSz1yLnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChILmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSC5pbmRleCkpO0guc3Ryb2tlU2VsZWN0aW9uPUs7cmV0dXJuIEh9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsSD10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSH0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxIPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxLPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKEwsSixPKXtyZXR1cm4gci5hcmMoKS5pbm5lclJhZGl1cyhIKEwsSixPKSkub3V0ZXJSYWRpdXMoSyhMLEosTykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSl0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tKXSkoTCxKKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sSD10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0g9ci5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKEssTCl7cmV0dXJuIEQoSyxMLEIpfSkoSCk7dGhpcy5fc3RhcnRBbmdsZXM9SC5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsuc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SC5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEsuZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsSD1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBLPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIEw7aWYoMDw9SCYmMDw9SylpZigwPD1EJiYwPD1CKXt2YXIgSj1EO3ZhciBPPUw9MDt2YXIgUz1LfWVsc2UgMD5EJiYwPkI/KEo9MCxMPS1CLE89MCxTPUgpOjA8PUQmJjA+Qj8oSj1ELEw9LUIsTz0wLFM9SCk6MD5EJiYwPD1CJiYoTz1MPUo9MSxTPU1hdGgubWF4KEgsSykpO2Vsc2UgMDw9SCYmMD5LPzA8PUQmJjA8PUI/KEo9TWF0aC5tYXgoRCxCKSxTPU89TD0xKTowPkQmJgowPkI/KEo9MCxMPTEsTz0tSyxTPUgpOjA8PUQmJjA+Qj8oSj1ELEw9MSxPPS1LLFM9MSk6MD5EJiYwPD1CJiYoSj1CLE89TD0xLFM9SCk6MD5IJiYwPD1LPzA8PUQmJjA8PUI/KEo9MSxMPTAsTz0tSCxTPUspOjA+RCYmMD5CPyhKPTEsTD1NYXRoLm1heCgtRCwtQiksUz1PPTEpOjA8PUQmJjA+Qj8oSj0xLEw9LUIsTz0tSCxTPTEpOjA+RCYmMDw9QiYmKEo9MSxMPS1ELE89MSxTPUspOjA+SCYmMD5LJiYoMDw9RCYmMDw9Qj8oSj1CLEw9MCxPPS1ILFM9MCk6MD5EJiYwPkI/KEo9MCxMPS1ELE89LUssUz0wKTowPD1EJiYwPkI/KEw9Sj0xLE89TWF0aC5tYXgoRCwtQiksUz0xKTowPkQmJjA8PUImJihKPUIsTD0tRCxPPTEsUz0wKSk7cmV0dXJue3g6MD09TytTPzA6Ty8oTytTKSp0aGlzLndpZHRoKCkseTowPT1KK0w/MDpKLyhKK0wpKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxIPXRoaXMuZGF0YXNldHMoKVswXSxLPUQuZ2V0KEgpLmZpbHRlcihmdW5jdGlvbihMLEope3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKEwsSixIKSl9KTtELnNldChILEspO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixIKXt2YXIgSz14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKEsoRCxCLEgpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBMPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSCk7RD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixIKTtMPShMK0QpLzI7RD1yLnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSixPKXtKPUsoSixPLEgpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShKKT9KOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShILmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TCpNYXRoLnNpbihCKSx5Oi1MKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgSD10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLEs9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3ZhciBKPQp4LlBsb3QuYXBwbHlEcmF3U3RlcHMoSCxMKTtCLl9zdHJva2VEcmF3ZXJzLmdldChMKS5kcmF3KEsuZ2V0KEwpLEopfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksSD1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEg9MipNYXRoLlBJLUgpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEgmJnRoaXMuX2VuZEFuZ2xlc1tEXT5IKXt2YXIgSz1EO2JyZWFrfWlmKHZvaWQgMCE9PUspe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBMPUQuZGF0YSgpW0tdO0g9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKEwsCkssRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTCxLLEQpO2lmKEI+SCYmQjxEKXJldHVybiBLfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxIPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLEs9bmV3IGwuU3ZnQ29udGV4dChILm5vZGUoKSksTD1uZXcgbC5DYWNoZU1lYXN1cmVyKEspLEo9bmV3IGwuV3JpdGVyKEwsSyksTz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChPKS5mb3JFYWNoKGZ1bmN0aW9uKFMsTil7dmFyIFI9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKFMsTixPKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihSKSl7Uj1ELl9sYWJlbEZvcm1hdHRlcihSLFMsTixPKTt2YXIgWD1MLm1lYXN1cmUoUiksYWE9KEQuX2VuZEFuZ2xlc1tOXStELl9zdGFydEFuZ2xlc1tOXSkvCjIsZmE9RC5vdXRlclJhZGl1cygpLmFjY2Vzc29yKFMsTixPKTtELm91dGVyUmFkaXVzKCkuc2NhbGUmJihmYT1ELm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoZmEpKTt2YXIgb2E9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKFMsTixPKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihvYT1ELmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUob2EpKTtvYT0oZmErb2EpLzI7ZmE9TWF0aC5zaW4oYWEpKm9hLVgud2lkdGgvMjtvYT0tTWF0aC5jb3MoYWEpKm9hLVguaGVpZ2h0LzI7dmFyIFo9W3t4OmZhLHk6b2F9LHt4OmZhLHk6b2ErWC5oZWlnaHR9LHt4OmZhK1gud2lkdGgseTpvYX0se3g6ZmErWC53aWR0aCx5Om9hK1guaGVpZ2h0fV07KGFhPVouZXZlcnkoZnVuY3Rpb24oY2Epe3JldHVybiBNYXRoLmFicyhjYS54KTw9RC53aWR0aCgpLzImJk1hdGguYWJzKGNhLnkpPD1ELmhlaWdodCgpLzJ9KSkmJihhYT1aLm1hcChmdW5jdGlvbihjYSl7cmV0dXJuIEQuX3NsaWNlSW5kZXhGb3JQb2ludChjYSl9KS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIGNhPT09Ck59KSk7Uz1CLmZpbGwoUyxOLE8pO1M9MS42KnEuQ29sb3IuY29udHJhc3QoIndoaXRlIixTKTxxLkNvbG9yLmNvbnRyYXN0KCJibGFjayIsUyk7ZmE9SC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitmYSsiLCIrb2ErIikiKTtmYS5jbGFzc2VkKFM/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApO2ZhLnN0eWxlKCJ2aXNpYmlsaXR5IixhYT8iaW5oZXJpdCI6ImhpZGRlbiIpO0oud3JpdGUoUixYLndpZHRoLFguaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxmYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30oeC5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHkseCl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSxyPWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx3PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh4LHkpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp4LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbeC5fWDJfS0VZXSxIPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9R1t4Ll9ZMl9LRVldLEw9dGhpcy54KCkuc2NhbGUsSj10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKE8sUyxOKXtyZXR1cm4gTWF0aC5hYnMoQihPLFMsTiktRChPLFMsTikpfSxHLng9ZnVuY3Rpb24oTyxTLE4pe3JldHVybiBNYXRoLm1pbihCKE8sUyxOKSxEKE8sUyxOKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChMKX0sRy54PWZ1bmN0aW9uKE8sUyxOKXtyZXR1cm4gRChPLFMsTiktLjUqRy53aWR0aChPLFMsTil9KTtudWxsIT1LPyhHLmhlaWdodD1mdW5jdGlvbihPLApTLE4pe3JldHVybiBNYXRoLmFicyhLKE8sUyxOKS1IKE8sUyxOKSl9LEcueT1mdW5jdGlvbihPLFMsTil7cmV0dXJuIE1hdGgubWF4KEsoTyxTLE4pLEgoTyxTLE4pKS1HLmhlaWdodChPLFMsTil9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSil9LEcueT1mdW5jdGlvbihPLFMsTil7cmV0dXJuIEgoTyxTLE4pLS41KkcuaGVpZ2h0KE8sUyxOKX0pO2RlbGV0ZSBHW3guX1gyX0tFWV07ZGVsZXRlIEdbeC5fWTJfS0VZXTtyZXR1cm4gR307eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt4LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07eC5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHguX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9YMl9LRVkpfTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHguX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9ZMl9LRVkpfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sSD1ELmluZGV4LEs9RC5kYXRhc2V0O0Q9Ry54KEIsCkgsSyk7dmFyIEw9Ry55KEIsSCxLKSxKPUcud2lkdGgoQixILEspO0I9Ry5oZWlnaHQoQixILEspO3JldHVybiBEPD1DLngmJkMueDw9RCtKJiZMPD1DLnkmJkMueTw9TCtCfSl9O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3gucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt4LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEg9Qi54KEMsRyxEKSxLPUIueShDLEcsRCksTD1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpIK0wvMix5OksrQy8yfX07eC5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD1yLnNldCh3LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gSy5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsSil7cmV0dXJuIEcoTCxKLEspLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuK0t9KSxCPXcuTWF0aC5taW4oRCwwKTtEPXcuTWF0aC5tYXgoRCwwKTt2YXIgSD1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUgpL01hdGguYWJzKEQtQil9O3gucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHcuTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEgsSyl7cmV0dXJuIHcuTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChILEssRCkpJiYKdy5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEgsSyxEKSkmJncuTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSCxLLEQpKSYmdy5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSCxLLEQpKT9IOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJncuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLEw9bmV3IGwuU3ZnQ29udGV4dChLLm5vZGUoKSksSj1uZXcgbC5DYWNoZU1lYXN1cmVyKEwpLE89bmV3IGwuV3JpdGVyKEosTCk7TD10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBTPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTj1NYXRoLm1pbi5hcHBseShudWxsLEwpLFI9TWF0aC5tYXguYXBwbHkobnVsbCxMKSxYPU1hdGgubWluLmFwcGx5KG51bGwsUyksYWE9TWF0aC5tYXguYXBwbHkobnVsbCxTKTtDLmdldChHKS5mb3JFYWNoKGZ1bmN0aW9uKGZhLG9hKXtpZihudWxsIT1mYSl7dmFyIFo9IiIrQi5sYWJlbCgpKGZhLG9hLEcpLGNhPUoubWVhc3VyZShaKSxqYT1ILngoZmEsb2EsRyksYmE9SC55KGZhLG9hLEcpLGthPUgud2lkdGgoZmEsb2EsRyksVz1ILmhlaWdodChmYSxvYSxHKTsKY2EuaGVpZ2h0PD1XJiZjYS53aWR0aDw9a2EmJihXPShXLWNhLmhlaWdodCkvMixqYSs9KGthLWNhLndpZHRoKS8yLGJhKz1XLGthPXttaW46amEsbWF4OmphK2NhLndpZHRofSxXPXttaW46YmEsbWF4OmJhK2NhLmhlaWdodH0sa2EubWluPE58fGthLm1heD5SfHxXLm1pbjxYfHxXLm1heD5hYXx8Qi5fb3ZlcmxheUxhYmVsKGthLFcsb2EsRCxDKXx8KGZhPUguZmlsbChmYSxvYSxHKSxmYT0xLjYqdy5Db2xvci5jb250cmFzdCgid2hpdGUiLGZhKTx3LkNvbG9yLmNvbnRyYXN0KCJibGFjayIsZmEpLGphPUsuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIramErIiwiK2JhKyIpIiksamEuY2xhc3NlZChmYT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCksTy53cml0ZShaLGNhLndpZHRoLGNhLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0samEubm9kZSgpKSkpfX0pfTt4LnByb3RvdHlwZS5fb3ZlcmxheUxhYmVsPWZ1bmN0aW9uKEMsCkcsRCxCLEgpe2Zvcih2YXIgSz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxMPXRoaXMuZGF0YXNldHMoKSxKPUI7SjxMLmxlbmd0aDtKKyspZm9yKHZhciBPPUxbSl0sUz1ILmdldChPKSxOPUo9PT1CP0QrMTowO048Uy5sZW5ndGg7TisrKWlmKHcuRE9NLmludGVyc2VjdHNCQm94KEMsRyx0aGlzLl9lbnRpdHlCQm94KFNbTl0sTixPLEspKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIHh9KGgoMTYpLlhZUGxvdCk7ZC5fWDJfS0VZPSJ4MiI7ZC5fWTJfS0VZPSJ5MiI7Zi5SZWN0YW5nbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih5LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXl9Zm9yKHZhciBHIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109eFtHXSk7eS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQy5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEMpfSxyPWgoMzEpLApsPWgoNikscD1oKDQ4KSxtPWgoNyksbj1oKDE0KSxxPWgoMyksdT1oKDApLHc9aCgxOSksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24geCgpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJzY2F0dGVyLXBsb3QiKTt2YXIgRz1uZXcgbS5FYXNpbmc7Ry5zdGFydERlbGF5KDUpO0cuc3RlcER1cmF0aW9uKDI1MCk7Ry5tYXhUb3RhbER1cmF0aW9uKEEuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qy5hbmltYXRvcih3LkFuaW1hdG9yLk1BSU4sRyk7Qy5hdHRyKCJvcGFjaXR5IiwuNik7Qy5hdHRyKCJmaWxsIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0Muc2l6ZSg2KTt2YXIgRD1yLmNpcmNsZSgpO0Muc3ltYm9sKGZ1bmN0aW9uKCl7cmV0dXJuIER9KTtyZXR1cm4gQ31rKHgseSk7eC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4geS5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMuY2FsbCh0aGlzLApDKS5tYXAoZnVuY3Rpb24oRCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSkoRC5kYXR1bSxELmluZGV4LEQuZGF0YXNldCk7RC5kaWFtZXRlcj1CO3JldHVybiBEfSl9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpcztyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU3ltYm9sU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG4uQ2FudmFzRHJhd2VyKEQscC5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXAoQyxmdW5jdGlvbigpe3JldHVybiBBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcuc3ltYm9sKCkpfSxmdW5jdGlvbigpe3JldHVybiBBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcuc2l6ZSgpKX0pKX0pfTt4LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKEMsRyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fU0laRV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9TSVpFX0tFWSwKQyxHKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fU1lNQk9MX0tFWSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoeC5fU1lNQk9MX0tFWSx7YWNjZXNzb3I6Q30pO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc3ltYm9sKCkpO0cuZD1mdW5jdGlvbihCLEgsSyl7cmV0dXJuIEQoQixILEspKDApKG51bGwpfTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXkucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7Qy54PUc7Qy55PUQ7Qy50cmFuc2Zvcm09ZnVuY3Rpb24oQixILEspe3JldHVybiJ0cmFuc2xhdGUoIitHKEIsSCxLKSsiLCIrRChCLEgsSykrIikifTtDLmQ9dGhpcy5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yKCk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3I9ZnVuY3Rpb24oKXt2YXIgQz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc3ltYm9sKCkpLEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSk7cmV0dXJuIGZ1bmN0aW9uKEQsQiwKSCl7cmV0dXJuIEMoRCxCLEgpKEcoRCxCLEgpKShudWxsKX19O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJue3g6Qy5wb3NpdGlvbi54LUMuZGlhbWV0ZXIvMix5OkMucG9zaXRpb24ueS1DLmRpYW1ldGVyLzIsd2lkdGg6Qy5kaWFtZXRlcixoZWlnaHQ6Qy5kaWFtZXRlcn19O3gucHJvdG90eXBlLl9lbnRpdHlWaXNpYmxlT25QbG90PWZ1bmN0aW9uKEMsRyl7dmFyIEQ9e21pbjpHLnRvcExlZnQueCxtYXg6Ry5ib3R0b21SaWdodC54fTtHPXttaW46Ry50b3BMZWZ0LnksbWF4OkcuYm90dG9tUmlnaHQueX07Qz10aGlzLl9lbnRpdHlCb3VuZHMoQyk7cmV0dXJuIHUuRE9NLmludGVyc2VjdHNCQm94KEQsRyxDKX07eC5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihDKXt2YXIgRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSk7CnJldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEgpe3ZhciBLPUguZGF0dW0sTD1ILmluZGV4LEo9SC5kYXRhc2V0O0g9RyhLLEwsSik7dmFyIE89RChLLEwsSik7Sz1CKEssTCxKKTtyZXR1cm4gSC1LLzI8PUMueCYmQy54PD1IK0svMiYmTy1LLzI8PUMueSYmQy55PD1PK0svMn0pfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9TSVpFX0tFWT0ic2l6ZSI7ZC5fU1lNQk9MX0tFWT0ic3ltYm9sIjtmLlNjYXR0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih1LHcpe2Z1bmN0aW9uIEEoKXt0aGlzLmNvbnN0cnVjdG9yPXV9Zm9yKHZhciB5IGluIHcpdy5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09d1t5XSk7dS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQS5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEEpfSxyPWgoNyksbD1oKDYpLHA9aCg0NyksbT1oKDMpLG49aCgzNSkscT1oKDIpOwpkPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoKXt2YXIgQT11LmNhbGwodGhpcyl8fHRoaXM7QS5hZGRDbGFzcygic2VnbWVudC1wbG90Iik7QS5hdHRyKCJzdHJva2UiLChuZXcgbS5Db2xvcikucmFuZ2UoKVswXSk7QS5hdHRyKCJzdHJva2Utd2lkdGgiLCIycHgiKTtyZXR1cm4gQX1rKHcsdSk7dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgcC5TZWdtZW50U1ZHRHJhd2VyfSxmdW5jdGlvbigpe24ud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gU2VnbWVudCBQbG90ISIpO3JldHVybiBudWxsfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyByLk51bGx9XX07dy5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PQpmdW5jdGlvbihBKXtyZXR1cm4ieDIiPT09QT91LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4Iik6InkyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQSl9O3cucHJvdG90eXBlLng9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT1BKXJldHVybiB1LnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09eT91LnByb3RvdHlwZS54LmNhbGwodGhpcyxBKToodS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSx5KSxBPShBPXRoaXMueDIoKSkmJkEuYWNjZXNzb3IsbnVsbCE9QSYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxBLHkpKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueDI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWDJfS0VZKX07dy5wcm90b3R5cGUueT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PQpBKXJldHVybiB1LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09eT91LnByb3RvdHlwZS55LmNhbGwodGhpcyxBKToodS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSx5KSxBPShBPXRoaXMueTIoKSkmJkEuYWNjZXNzb3IsbnVsbCE9QSYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxBLHkpKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUueTI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQody5fWTJfS0VZKX07dy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBBPXUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtBLngxPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpO0EueDI9bnVsbD09dGhpcy54MigpP3EuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpOnEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKTtBLnkxPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwpBLnkyPW51bGw9PXRoaXMueTIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSk7cmV0dXJuIEF9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQSl7QT10aGlzLmVudGl0eU5lYXJlc3QoQSk7cmV0dXJuIG51bGwhPUE/W0FdOltdfTt3LnByb3RvdHlwZS5lbnRpdGllc0luPWZ1bmN0aW9uKEEseSl7aWYobnVsbD09eSl7dmFyIHg9e21pbjpBLnRvcExlZnQueCxtYXg6QS5ib3R0b21SaWdodC54fTtBPXttaW46QS50b3BMZWZ0LnksbWF4OkEuYm90dG9tUmlnaHQueX19ZWxzZSB4PUEsQT15O3JldHVybiB0aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyh4LEEpfTt3LnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24oQSx5KXt2YXIgeD10aGlzLEM9W10sRz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihEKXt4Ll9saW5lSW50ZXJzZWN0c0JveChELApBLHksRykmJkMucHVzaChEKX0pO3JldHVybiBDfTt3LnByb3RvdHlwZS5fbGluZUludGVyc2VjdHNCb3g9ZnVuY3Rpb24oQSx5LHgsQyl7dmFyIEc9dGhpcyxEPUMueDEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCksQj1DLngyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEg9Qy55MShBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KTtBPUMueTIoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7aWYoeS5taW48PUQmJkQ8PXkubWF4JiZ4Lm1pbjw9SCYmSDw9eC5tYXh8fHkubWluPD1CJiZCPD15Lm1heCYmeC5taW48PUEmJkE8PXgubWF4KXJldHVybiEwO3ZhciBLPXt4OkQseTpIfSxMPXt4OkIseTpBfSxKPVt7eDp5Lm1pbix5OngubWlufSx7eDp5Lm1pbix5OngubWF4fSx7eDp5Lm1heCx5OngubWF4fSx7eDp5Lm1heCx5OngubWlufV07cmV0dXJuIDA8Si5maWx0ZXIoZnVuY3Rpb24oTyxTKXtyZXR1cm4gMCE9PVM/Ry5fbGluZUludGVyc2VjdHNTZWdtZW50KEssTCxPLEpbUy0KMV0pJiZHLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQoTyxKW1MtMV0sSyxMKTohMX0pLmxlbmd0aH07dy5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbihBLHkseCxDKXtmdW5jdGlvbiBHKEQsQixIKXtyZXR1cm4oQi54LUQueCkqKEgueS1CLnkpLShCLnktRC55KSooSC54LUIueCl9cmV0dXJuIDA+RyhBLHkseCkqRyhBLHksQyl9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuU2VnbWVudD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24gdygpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYocVtBXT11W0FdKTtxLnByb3RvdHlwZT1udWxsPT09dT9PYmplY3QuY3JlYXRlKHUpOih3LnByb3RvdHlwZT11LnByb3RvdHlwZSxuZXcgdyl9LHI9aCgxKSxsPWgoNykscD1oKDIwKSxtPQpoKDApO2Q9aCg1MCk7dmFyIG49aCgyKTtoPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoKXt2YXIgdz1xLmNhbGwodGhpcyl8fHRoaXM7dy5fc3RhY2tpbmdSZXN1bHQ9cC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB3LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHcueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB3LnkoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4gdy5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oQSx5LHgsQyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2soQSx5LHgsQyl9KTt3Ll9zdGFja2VkRXh0ZW50PXAubWVtVGh1bmsody5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gdy54KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHcuX2ZpbHRlckZvclByb3BlcnR5KCJ5Iil9LGZ1bmN0aW9uKEEseSx4KXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KEEseSx4KX0pO3cuX2Jhc2VsaW5lVmFsdWU9MDt3Ll9zdGFja2luZ09yZGVyPQoiYm90dG9tdXAiO3cuYWRkQ2xhc3MoInN0YWNrZWQtYXJlYS1wbG90Iik7dy5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO3cuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVyblt3Ll9iYXNlbGluZVZhbHVlXX07dy5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCghMSk7cmV0dXJuIHd9ayh1LHEpO3UucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKHcpe3JldHVybiBudWxsPT13P3EucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyk6dz8obS5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTpxLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsdyl9O3UucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgbC5OdWxsfTt1LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTt1LnByb3RvdHlwZS54PWZ1bmN0aW9uKHcsQSl7aWYobnVsbD09dylyZXR1cm4gcS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUE/cS5wcm90b3R5cGUueC5jYWxsKHRoaXMsdyk6cS5wcm90b3R5cGUueC5jYWxsKHRoaXMsdyxBKTt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUueT1mdW5jdGlvbih3LEEpe2lmKG51bGw9PXcpcmV0dXJuIHEucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnkuY2FsbCh0aGlzLHcpOnEucHJvdG90eXBlLnkuY2FsbCh0aGlzLHcsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odyl7aWYobnVsbD09dylyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPQp3O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHEucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKX07dS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbigpe3ZhciB3PXRoaXMueSgpLnNjYWxlLnNjYWxlKHRoaXMuX2Jhc2VsaW5lVmFsdWUpO3c9e3gxOjAseTE6dyx4Mjp0aGlzLndpZHRoKCkseTI6d307dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSx3KX07dS5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciB3PXRoaXMueSgpO3c9dyYmdy5zY2FsZTtudWxsIT13JiYody5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfTsKdS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3EucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHcpe3JldHVybiJ5Ij09PXc/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06cS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx3KX07dS5wcm90b3R5cGUuX2NoZWNrU2FtZURvbWFpbj1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdz10aGlzLmRhdGFzZXRzKCksQT10aGlzLngoKS5hY2Nlc3Nvcix5PXcubWFwKGZ1bmN0aW9uKEMpe3JldHVybiByLnNldChDLmRhdGEoKS5tYXAoZnVuY3Rpb24oRyxEKXtyZXR1cm4gQShHLEQsQykudG9TdHJpbmcoKX0pKS52YWx1ZXMoKX0pLHg9dS5fZG9tYWluS2V5cyh3LEEpO3kuc29tZShmdW5jdGlvbihDKXtyZXR1cm4gQy5sZW5ndGghPT0KeC5sZW5ndGh9KSYmbS5XaW5kb3cud2FybigidGhlIGRvbWFpbnMgYWNyb3NzIHRoZSBkYXRhc2V0cyBhcmUgbm90IHRoZSBzYW1lLiBQbG90IG1heSBwcm9kdWNlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIil9fTt1Ll9kb21haW5LZXlzPWZ1bmN0aW9uKHcsQSl7dmFyIHk9ci5zZXQoKTt3LmZvckVhY2goZnVuY3Rpb24oeCl7eC5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihDLEcpe3kuYWRkKEEoQyxHLHgpKX0pfSk7cmV0dXJuIHkudmFsdWVzKCl9O3UucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB3KEQsQixIKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoQyhELEIsSCkpfXZhciBBPXRoaXMseT1xLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcykseD10aGlzLnkoKS5hY2Nlc3NvcixDPXRoaXMueCgpLmFjY2Vzc29yLEc9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTt5LmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihuLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwKZnVuY3Rpb24oRCxCLEgpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZSgreChELEIsSCkrRy5nZXQoSCkuZ2V0KHcoRCxCLEgpKS5vZmZzZXQpfSxmdW5jdGlvbihELEIsSCl7cmV0dXJuIEEueSgpLnNjYWxlLnNjYWxlKEcuZ2V0KEgpLmdldCh3KEQsQixIKSkub2Zmc2V0KX0pO3JldHVybiB5fTt1LnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih3LEEseSl7dmFyIHg9cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLHcsQSx5KSxDPXRoaXMueCgpLmFjY2Vzc29yKHcsQSx5KTt3PXRoaXMueSgpLmFjY2Vzc29yKHcsQSx5KTt5PXRoaXMueSgpLnNjYWxlLnNjYWxlKCt3K3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KHkpLmdldChtLlN0YWNraW5nLm5vcm1hbGl6ZUtleShDKSkub2Zmc2V0KTtyZXR1cm57eDp4LngseX19O3JldHVybiB1fShkLkFyZWEpO2YuU3RhY2tlZEFyZWE9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih1LAp3KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB3KXcuaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXdbeV0pO3UucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEEucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBBKX0scj1oKDUpLGw9aCg4KSxwPWgoMjApLG09aCgwKSxuPWgoMjcpLHE9aCgyKTtkPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHcoQSl7dm9pZCAwPT09QSYmKEE9InZlcnRpY2FsIik7dmFyIHk9dS5jYWxsKHRoaXMsQSl8fHRoaXM7eS5fZXh0cmVtYUZvcm1hdHRlcj1sLmlkZW50aXR5KCk7eS5fc3RhY2tpbmdSZXN1bHQ9cC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB5LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHkucG9zaXRpb24oKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5sZW5ndGgoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oeCwKQyxHLEQpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKHgsQyxHLEQpfSk7eS5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHkuX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHkucG9zaXRpb24oKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geS5fZmlsdGVyRm9yUHJvcGVydHkoeS5faXNWZXJ0aWNhbD8ieSI6IngiKX0sZnVuY3Rpb24oeCxDLEcpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrZWRFeHRlbnQoeCxDLEcpfSk7eS5hZGRDbGFzcygic3RhY2tlZC1iYXItcGxvdCIpO3kuX3N0YWNraW5nT3JkZXI9ImJvdHRvbXVwIjtyZXR1cm4geX1rKHcsdSk7dy5wcm90b3R5cGUuc3RhY2tpbmdPcmRlcj1mdW5jdGlvbihBKXtpZihudWxsPT1BKXJldHVybiB0aGlzLl9zdGFja2luZ09yZGVyO3RoaXMuX3N0YWNraW5nT3JkZXI9QTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuZXh0cmVtYUZvcm1hdHRlcj1mdW5jdGlvbihBKXtpZigwPT09CmFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX2V4dHJlbWFGb3JtYXR0ZXI7dGhpcy5fZXh0cmVtYUZvcm1hdHRlcj1BO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3UucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2xhYmVsQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5CYXIuX0xBQkVMX0FSRUFfQ0xBU1MsITApO3ZhciBBPW5ldyByLlN2Z0NvbnRleHQodGhpcy5fbGFiZWxBcmVhLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHIuQ2FjaGVNZWFzdXJlcihBKTt0aGlzLl93cml0ZXI9bmV3IHIuV3JpdGVyKHRoaXMuX21lYXN1cmVyLEEpfTt3LnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTCxKKXt2YXIgTz14Ll9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpLFM9eC53aWR0aCgpLE49eC5oZWlnaHQoKTtMLmZvckVhY2goZnVuY3Rpb24oUil7aWYoUi5leHRlbnQhPT0KQyl7dmFyIFg9eC5leHRyZW1hRm9ybWF0dGVyKCkoUi5leHRlbnQpLGFhPXguX21lYXN1cmVyLm1lYXN1cmUoWCksZmE9Ui5zdGFja2VkRGF0dW0sb2E9ZmEub3JpZ2luYWxEYXR1bSxaPWZhLm9yaWdpbmFsSW5kZXg7ZmE9ZmEub3JpZ2luYWxEYXRhc2V0O3guX2lzRGF0dW1PblNjcmVlbihPLFMsTixvYSxaLGZhKSYmKG9hPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKG9hLFosZmEpLFo9RC5zY2FsZShSLmV4dGVudCksUj14Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShSLmF4aXNWYWx1ZSksb2EpK29hLzIsUj1KKHguX2lzVmVydGljYWw/e3g6Uix5Olp9Ont4OloseTpSfSxhYSxvYSksWD15KFgse3RvcExlZnQ6Uixib3R0b21SaWdodDp7eDpSLngrYWEud2lkdGgseTpSLnkrYWEuaGVpZ2h0fX0sb2EpLEsucHVzaChYKSl9fSl9ZnVuY3Rpb24geShMLEosTyl7dmFyIFM9Si50b3BMZWZ0LE49Uy54LFI9Uy55O1M9Si5ib3R0b21SaWdodC54LQpKLnRvcExlZnQueDtKPUouYm90dG9tUmlnaHQueS1KLnRvcExlZnQueTtPPXguX2lzVmVydGljYWw/Uz5POko+TztPfHwoTj14Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCAiK1IrIikiKSxOLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCkseC5fd3JpdGVyLndyaXRlKEwsUyxKLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxOLm5vZGUoKSkpO3JldHVybiBPfXZhciB4PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksSD1CLm1pbmltdW1FeHRlbnRzLEs9W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihMLEope3ZhciBPPXguX2lzVmVydGljYWw/Si53aWR0aDpKLmhlaWdodDtKPXguX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtyZXR1cm57eDp4Ll9pc1ZlcnRpY2FsP0wueC1PLzI6TC54K3cuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6eC5faXNWZXJ0aWNhbD9MLnktSjpMLnktTy8yfX0pO0EoSCxmdW5jdGlvbihMLEope3ZhciBPPXguX2lzVmVydGljYWw/Si53aWR0aDpKLmhlaWdodDtKPXguX2lzVmVydGljYWw/Si5oZWlnaHQ6Si53aWR0aDtyZXR1cm57eDp4Ll9pc1ZlcnRpY2FsP0wueC1PLzI6TC54LUoseTp4Ll9pc1ZlcnRpY2FsP0wueSt3Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpMLnktTy8yfX0pO0suc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoUywKTixSKXtyZXR1cm4gMD4rTChTLE4sUik/QyhTLE4sUik6eChTLE4sUil9ZnVuY3Rpb24geShTLE4sUil7cmV0dXJuIE1hdGguYWJzKHgoUyxOLFIpLUMoUyxOLFIpKX1mdW5jdGlvbiB4KFMsTixSKXtyZXR1cm4gSy5zY2FsZSgrTChTLE4sUikrTy5nZXQoUikuZ2V0KEcoUyxOLFIpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoUyxOLFIpe3JldHVybiBLLnNjYWxlKE8uZ2V0KFIpLmdldChHKFMsTixSKSkub2Zmc2V0KX1mdW5jdGlvbiBHKFMsTixSKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSihTLE4sUikpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxIPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixLPXRoaXMubGVuZ3RoKCkuc2NhbGUsTD10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEo9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLE89dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltIXT1mdW5jdGlvbihTLE4sUil7cmV0dXJuIEQuX2lzVmVydGljYWw/QShTLE4sUik6QShTLE4sUikteShTLE4sUil9O3JldHVybiBCfTt3LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt3LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gd30obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHI9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnIuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx3PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHkseCl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHgpO2lmKHcoQSx5LHgpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHkseCl7dmFyIEM9dyhBLHkseCk7QT1uLnkoKS5hY2Nlc3NvcihBLHkseCk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHkseCl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHgpKyIgIik7aWYodyhBLHkseCkpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHgpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx3PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih4LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHgsQyxuKTsoeD1xLnRvdGFsKCkuYWNjZXNzb3IoeCxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+dyYmKHc9QSk7eCYmKEc8dSYmKHU9RyksRz53JiYodz1HKSk7aWYoIXkmJngpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7dys9Q319KTt0aGlzLl9leHRlbnQ9W3Usd119O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgdz11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt3XTt5PW4ueCh5LHcscSk7dmFyIHg9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbd118fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t3XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIseCkuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249ci5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj1yLnNjYWxlT3JkaW5hbChyLnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXIuc2NhbGVPcmRpbmFsKHIuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49ci5zY2FsZU9yZGluYWwoci5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49ci5zY2FsZU9yZGluYWwoci5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT1yLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIiksdz0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmdzx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSksdysrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3cpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnIuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9ci5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9ci5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9ci5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj1yLmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSksdz1xLXU7cmV0dXJuIHIuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHcpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHI9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9ci5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0scj1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT1yLnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuIEgtS30pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx3PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx3LC10aGlzLl9waXZvdCkseT1xKHUsdyx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx3KTt2YXIgeD1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4odyx0aGlzLl9waXZvdCk7eD1yLnNjYWxlTGluZWFyKCkuZG9tYWluKFt4LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3MoeCxDKSk7QT1BLmNvbmNhdCh4KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXIuc2NhbGVMaW5lYXIoKS5kb21haW4oW3Usd10pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgdz10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSkseD1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9ci5yYW5nZSh4LHksLU1hdGguY2VpbCgoeC15KS9BKSk7eT1yLnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHcuX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHc9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXcpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHIpe2lmKDA+PXIpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvcikqcjtwPTA9PT1wJXI/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvcikrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3Eqcn0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwlcj9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbD1yLmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT1yLnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT1yLnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiByLnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHIudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHIudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHIudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiByLnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHIudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gci50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHI9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiByLnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9cjt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHIpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQpyKTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD1yKTt0aGlzLmV4aXRJbmRleD1yfTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbihyLGwpe3JldHVybiAwPT1sfHxyIT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHJbbV09bFttXSk7ci5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQpyJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwscik7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49ci5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciByPWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gci5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSxyPWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHIuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHc9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkodyxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXIuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHc9MDt3PHAubGVuZ3RoO3crKyl7dmFyIHE9cFt3XSx1PXIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3IuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCksdz0wO3c8cC5sZW5ndGg7dysrKXE9cFt3XSx1PXIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB3fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdChyLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WChyLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHIuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXIucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTtyLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3IucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3IucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHJ9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgcj0wO3I8aC5sZW5ndGg7cisrKWZvcih2YXIgbD1oW3JdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXJbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspclsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHIpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGsscik7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGsscil9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTtyWzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTtyWzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayxyKXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXJbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT1yWzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09clswXTtxPHAmJihsPW4scD1xLG09clsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciByPWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgdz1yLm1hcCgpLEE9CnIubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9bmV3IGwuTWFwO3guZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHgpKSxIPStxKEcsRCx4KSxLPTA8PUg/dzpBO2lmKEsuaGFzKEIpKXt2YXIgTD1LLmdldChCKTtLLnNldChCLEwrSCl9ZWxzZSBMPTAsSy5zZXQoQixIKTtDLnNldChCLHtvZmZzZXQ6TCx2YWx1ZTpILGF4aXNWYWx1ZTpuKEcsRCx4KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Ongsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh4LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24odyxBKXt2YXIgeT1sLk1hdGgubWF4KFt3Lm9mZnNldCt3LnZhbHVlLHcub2Zmc2V0XSwKdy5vZmZzZXQpLHg9bC5NYXRoLm1pbihbdy5vZmZzZXQrdy52YWx1ZSx3Lm9mZnNldF0sdy5vZmZzZXQpLEM9dy5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp3fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnd9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+eCYmcS5zZXQoQSx7ZXh0ZW50OngsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnd9KTpxLnNldChBLHtleHRlbnQ6eCxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06d30pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHgsQyl7aWYobnVsbD09cXx8cSh4LEMseSkpeD1BLmdldChrKG4oeCxDLHkpKSksCnUucHVzaCh4LnZhbHVlK3gub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHc9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih3LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHIobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXJ9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgcj1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiByLmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gci5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiByLmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHc9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4gdy5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHcuYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4gdy5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHcuYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHI9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHcpe3JldHVybi0tdyp3KigobisxKSp3K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24gdyhBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt3Lm92ZXJzaG9vdD11O3JldHVybiB3fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT1yKSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3d9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHI9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHc9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiByfSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEkscj1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24gdyh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt3LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3cucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB3fSgxLC4zKSxsPWZ1bmN0aW9uIHcocSx1KXtmdW5jdGlvbiBBKHgpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHg9K3gpKSpNYXRoLnNpbigoeCt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHgpe3JldHVybiB3KHgsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24oeCl7cmV0dXJuIHcocSx4KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHcpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHgtQykvdyk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh4K0MpL3cpKS8yfXZhciB4PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSoody89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx3KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMykscj1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUodyl7cmV0dXJuIDEtTWF0aC5wb3coMS13LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24gdyhBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt3LmV4cG9uZW50PXU7cmV0dXJuIHd9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHIpe3JldHVybiAxLQpNYXRoLmNvcyhyKmspfTtmLmM9ZnVuY3Rpb24ocil7cmV0dXJuIE1hdGguc2luKHIqayl9O2YuYT1mdW5jdGlvbihyKXtyZXR1cm4oMS1NYXRoLmNvcyhoKnIpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXIobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciByPWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHIsbCl7dm9pZCAwPT09ciYmKHI9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXI7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciByPQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9ci5zdHlsZS5mb250JiYoay5mb250PXIuc3R5bGUuZm9udCk7bnVsbCE9ci5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9ci5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT1yLnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9ci5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbihyLGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTtyLmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbihyKXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMscik7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbihyKXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9ci5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3IuY2xhc3NMaXN0LmFkZChtKX0pOnIuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24ocil7aWYoci5nZXRCQm94KXRyeXt2YXIgbD1yLmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhyLGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXI7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHc9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt3LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnModyk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHIpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXJ9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24ocil7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHIsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24ocil7aWYoInRleHQiPT09ci50YWdOYW1lKXt2YXIgbD1yLnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9ci5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHIpO3JldHVybntjb250YWluZXJFbGVtZW50OnIscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnJ9fXZhciBwPXIucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9ci5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXIucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZChyKSx7Y29udGFpbmVyRWxlbWVudDpyLHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnIsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSxyPWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHIuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSkscj1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgci5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUsdyxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx3LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGsscil7aWYobnVsbD09Cmt8fG51bGw9PXIpcmV0dXJuIGs9PT1yO2lmKGsubGVuZ3RoIT09ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXJbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayxyKXtpZihudWxsPT1rfHxudWxsPT1yKXJldHVybiBrPT09cjt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyhyKS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHJbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGsscil7cmV0dXJuIGs9PT1yfTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgcj1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKylyW2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTtyLmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayxyKXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXI/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQocikuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGsscil7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIikscikuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgcj10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQoci5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGsscil7aWYoIWspcmV0dXJuW3JdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3Qocik/W2srcl06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHIpP1trLHJdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHIpP2w9PT1yP1trK3JdOltrLHJdOltrK3JdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYoclttXT1sW21dKTtyLnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gbCgpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwscik7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gci5wcm90b3R5cGUud3JhcC5jYWxsKHcscCxtLEQscSl9dmFyIHc9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx4PTA7eDxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55OysreCl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSkscj17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSxyLHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB3PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT13P206bix5PXc/bjptLHg9cS50ZXh0U2hlYXIsQz14Kk1hdGguUEkvMTgwO3c9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz13Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp3KTt4PXEudGV4dFJvdGF0aW9uK3g7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp4fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEsdyxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx3KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbd10sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3Jbd10sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocil7Zm9yKHZhciBsIGluIHIpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09cltsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciBzZjsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB3IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHcpO2lmKG51bGwhPW4pe3ZhciB1PXcuY2xpZW50V2lkdGgvMjtjb25zdCBBPXcuY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49dy5zY3JvbGxMZWZ0O3U9dy5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHc9PT1xKW4tPXcub2Zmc2V0TGVmdCt3LmNsaWVudExlZnQsdS09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AscT13Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHIgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3IuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgcihtKSxuW3IuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1yLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHNmfHwoc2Y9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgcj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7ci50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMociwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6cixheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6cixheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHIsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpyLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMociwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbihyKXtyLlNURVA9InN0ZXAiO3IuUkVMQVRJVkU9InJlbGF0aXZlIjtyLldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbihyKXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIityKyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIityKyJ+ZSIpOmQzLmZvcm1hdCgiLiIrcisifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24ocixsKXtyPXIuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09ci5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHI9Xy5zb3J0QnkociksbD1kMy5xdWFudGlsZShyLC4wNSkscj1kMy5xdWFudGlsZShyLC45NSkpOihsPWQzLm1pbihyKSxyPWQzLm1heChyKSk7bGV0IHAsbT1yLWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSpyOmwtcCxyK3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbihyKXtyZXR1cm4gbD0+Cmxbcl19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPShyLGwscCk9PntpZihudWxsIT1yLnJlbGF0aXZlKXJldHVybiByLnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCtyLndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9cj0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcihyLzI0KTtyLT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3Iocik7cj02MCooci1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHIpO3I9NjAqKHItbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcihyKSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24ocil7c3dpdGNoKHIpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrcik7fX19KShzZnx8KHNmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciB0ZzsKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihmLGgsayl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShmKTt0aGlzLnlTY2FsZShoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1rO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChmKXt0aGlzLm9uU3RhcnQ9CmZ9aW50ZXJhY3Rpb25FbmQoZil7dGhpcy5vbkVuZD1mfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZj0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoaD0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6aH0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoaCxrKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO3RoaXMuYm94VmlzaWJsZSghMCk7Zj0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGgsayk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmgsYm90dG9tUmlnaHQ6a30pO2lmKGYpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7Zj0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGYpe2lmKG51bGw9PQpmKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+Zil0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWY7cmV0dXJuIHRoaXN9ZWFzZShmKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGYpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWYoMCkmJjE9PT1mKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1mO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZj10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksaD10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksaz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCkscj10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmYhPT1oJiZrIT09ciYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZixoLGsscil9dW56b29tKCl7dmFyIGY9dGhpcy54U2NhbGUoKTtmLl9kb21haW5NaW49bnVsbDtmLl9kb21haW5NYXg9bnVsbDtmPWYuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGYpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGYpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFmKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpfWludGVycG9sYXRlWm9vbShmLGgsayxyKXtsZXQgbD10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxwPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLG09dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCksbj10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxxPXRoaXMuZWFzZUZuLHU9KHkseCxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeSx4KShxKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB3PURhdGUubm93KCksQT0oKT0+e3ZhciB5PURhdGUubm93KCktdzt5PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx5L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB4PXUobCxmLHkpLEM9dShwLGgseSksRz11KG0sayx5KSxEPXUobixyLHkpO3RoaXMueFNjYWxlKCkuZG9tYWluKFt4LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRyxEXSk7MT55P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoQSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTtBKCl9fWIuRHJhZ1pvb21MYXllcj1kfSkodGd8fCh0Zz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Bhblpvb21EcmFnTGF5ZXIuanMKdmFyIHVnOwooZnVuY3Rpb24oYil7bGV0IGQ7KGZ1bmN0aW9uKGgpe2hbaC5OT05FPTBdPSJOT05FIjtoW2guRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciO2hbaC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKGR8fChkPXt9KSk7Y2xhc3MgZiBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3Vwe2NvbnN0cnVjdG9yKGgsayxyKXtzdXBlcigpO3RoaXMuc3RhdGU9ZC5OT05FO3RoaXMucGFuU3RhcnRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IFBsb3R0YWJsZS5VdGlscy5DYWxsYmFja1NldDt0aGlzLnBhblpvb209bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUGFuWm9vbShoLGspO3RoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT5mLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pO3RoaXMuZHJhZ1pvb21MYXllcj1uZXcgdGcuRHJhZ1pvb21MYXllcihoLAprLHIpO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihwPT4hZi5pc1BhbktleShwKSYmMD09PXAuYnV0dG9uKTt0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpO2NvbnN0IGw9dGhpcy5vbldoZWVsLmJpbmQodGhpcyk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1QbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbChsKTt0aGlzLnBhblpvb20uYXR0YWNoVG8odGhpcyl9KTt0aGlzLm9uRGV0YWNoKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20oKTt0aGlzLl9tb3VzZURpc3BhdGNoZXImJih0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwobCksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiYKdGhpcy5zZXRTdGF0ZShkLlBBTk5JTkcpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuUEFOTklORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09ZC5OT05FJiZ0aGlzLnNldFN0YXRlKGQuRFJBR19aT09NSU5HKX0pO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCk9Pnt0aGlzLnN0YXRlPT1kLkRSQUdfWk9PTUlORyYmdGhpcy5zZXRTdGF0ZShkLk5PTkUpfSl9b25XaGVlbChoLGspe2lmKCF0aGlzLmNhblNjcm9sbFpvb20oaykmJihoPXRoaXMuZWxlbWVudCgpLGguc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpKXt2YXIgcj1oLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiaGVscCIsITApO3IuYXBwZW5kKCJzcGFuIikudGV4dCgiQWx0ICsgU2Nyb2xsIHRvIFpvb20iKTsKci5vbigiYW5pbWF0aW9uZW5kIiwoKT0+dm9pZCByLnJlbW92ZSgpKX19c3RhdGljIGlzUGFuS2V5KGgpe3JldHVybiEhaC5hbHRLZXl8fCEhaC5zaGlmdEtleX1jYW5TY3JvbGxab29tKGgpe3JldHVybiBoLmFsdEtleX1zZXRTdGF0ZShoKXtpZih0aGlzLnN0YXRlIT1oKXt2YXIgaz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9aDt0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGspKTt0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGgpKTtrPT1kLlBBTk5JTkcmJnRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpO2g9PWQuUEFOTklORyYmdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKX19c3RhdGVDbGFzc05hbWUoaCl7c3dpdGNoKGgpe2Nhc2UgZC5QQU5OSU5HOnJldHVybiJwYW5uaW5nIjtjYXNlIGQuRFJBR19aT09NSU5HOnJldHVybiJkcmFnLXpvb21pbmciO2RlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQoaCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChoKX1vblBhbkVuZChoKXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZChoKX1vblNjcm9sbFpvb20oaCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZChoKX1vbkRyYWdab29tU3RhcnQoaCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoaCl9b25EcmFnWm9vbUVuZChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQoaCl9fQpiLlBhblpvb21EcmFnTGF5ZXI9Zn0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgSWg7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayxyLGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT1yO3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoSWh8fChJaD17fSkpOwoKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmdyYXBobGliPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7CnZhciBmPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsaWI9cmVxdWlyZSgiLi9saWIiKTttb2R1bGUuZXhwb3J0cz17R3JhcGg6bGliLkdyYXBoLGpzb246cmVxdWlyZSgiLi9saWIvanNvbiIpLGFsZzpyZXF1aXJlKCIuL2xpYi9hbGciKSx2ZXJzaW9uOmxpYi52ZXJzaW9ufX0seyIuL2xpYiI6MTcsIi4vbGliL2FsZyI6OCwiLi9saWIvanNvbiI6MTh9XSwKMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y29tcG9uZW50cztmdW5jdGlvbiBjb21wb25lbnRzKGcpe3ZhciB2aXNpdGVkPXt9LGNtcHRzPVtdLGNtcHQ7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtjbXB0LnB1c2godik7Xy5lYWNoKGcuc3VjY2Vzc29ycyh2KSxkZnMpO18uZWFjaChnLnByZWRlY2Vzc29ycyh2KSxkZnMpfV8uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Y21wdD1bXTtkZnModik7aWYoY21wdC5sZW5ndGgpY21wdHMucHVzaChjbXB0KX0pO3JldHVybiBjbXB0c319LHsiLi4vbG9kYXNoIjoxOX1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRmcztmdW5jdGlvbiBkZnMoZyx2cyxvcmRlcil7aWYoIV8uaXNBcnJheSh2cykpdnM9Clt2c107dmFyIG5hdmlnYXRpb249KGcuaXNEaXJlY3RlZCgpP2cuc3VjY2Vzc29yczpnLm5laWdoYm9ycykuYmluZChnKTt2YXIgYWNjPVtdLHZpc2l0ZWQ9e307Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKCFnLmhhc05vZGUodikpdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIrdik7ZG9EZnMoZyx2LG9yZGVyPT09InBvc3QiLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2MpfSk7cmV0dXJuIGFjY31mdW5jdGlvbiBkb0RmcyhnLHYscG9zdG9yZGVyLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2Mpe2lmKCFfLmhhcyh2aXNpdGVkLHYpKXt2aXNpdGVkW3ZdPXRydWU7aWYoIXBvc3RvcmRlcilhY2MucHVzaCh2KTtfLmVhY2gobmF2aWdhdGlvbih2KSxmdW5jdGlvbih3KXtkb0RmcyhnLHcscG9zdG9yZGVyLHZpc2l0ZWQsbmF2aWdhdGlvbixhY2MpfSk7aWYocG9zdG9yZGVyKWFjYy5wdXNoKHYpfX19LHsiLi4vbG9kYXNoIjoxOX1dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgZGlqa3N0cmE9cmVxdWlyZSgiLi9kaWprc3RyYSIpLF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmFBbGw7ZnVuY3Rpb24gZGlqa3N0cmFBbGwoZyx3ZWlnaHRGdW5jLGVkZ2VGdW5jKXtyZXR1cm4gXy50cmFuc2Zvcm0oZy5ub2RlcygpLGZ1bmN0aW9uKGFjYyx2KXthY2Nbdl09ZGlqa3N0cmEoZyx2LHdlaWdodEZ1bmMsZWRnZUZ1bmMpfSx7fSl9fSx7Ii4uL2xvZGFzaCI6MTksIi4vZGlqa3N0cmEiOjV9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1kaWprc3RyYTt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGRpamtzdHJhKGcsc291cmNlLHdlaWdodEZuLGVkZ2VGbil7cmV0dXJuIHJ1bkRpamtzdHJhKGcsClN0cmluZyhzb3VyY2UpLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GVU5DLGVkZ2VGbnx8ZnVuY3Rpb24odil7cmV0dXJuIGcub3V0RWRnZXModil9KX1mdW5jdGlvbiBydW5EaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHYsdkVudHJ5O3ZhciB1cGRhdGVOZWlnaGJvcnM9ZnVuY3Rpb24oZWRnZSl7dmFyIHc9ZWRnZS52IT09dj9lZGdlLnY6ZWRnZS53LHdFbnRyeT1yZXN1bHRzW3ddLHdlaWdodD13ZWlnaHRGbihlZGdlKSxkaXN0YW5jZT12RW50cnkuZGlzdGFuY2Urd2VpZ2h0O2lmKHdlaWdodDwwKXRocm93IG5ldyBFcnJvcigiZGlqa3N0cmEgZG9lcyBub3QgYWxsb3cgbmVnYXRpdmUgZWRnZSB3ZWlnaHRzLiAiKyJCYWQgZWRnZTogIitlZGdlKyIgV2VpZ2h0OiAiK3dlaWdodCk7aWYoZGlzdGFuY2U8d0VudHJ5LmRpc3RhbmNlKXt3RW50cnkuZGlzdGFuY2U9ZGlzdGFuY2U7d0VudHJ5LnByZWRlY2Vzc29yPQp2O3BxLmRlY3JlYXNlKHcsZGlzdGFuY2UpfX07Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7dmFyIGRpc3RhbmNlPXY9PT1zb3VyY2U/MDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7cmVzdWx0c1t2XT17ZGlzdGFuY2U6ZGlzdGFuY2V9O3BxLmFkZCh2LGRpc3RhbmNlKX0pO3doaWxlKHBxLnNpemUoKT4wKXt2PXBxLnJlbW92ZU1pbigpO3ZFbnRyeT1yZXN1bHRzW3ZdO2lmKHZFbnRyeS5kaXN0YW5jZT09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSlicmVhaztlZGdlRm4odikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpfXJldHVybiByZXN1bHRzfX0seyIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIjoxNSwiLi4vbG9kYXNoIjoxOX1dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHRhcmphbj1yZXF1aXJlKCIuL3RhcmphbiIpO21vZHVsZS5leHBvcnRzPWZpbmRDeWNsZXM7ZnVuY3Rpb24gZmluZEN5Y2xlcyhnKXtyZXR1cm4gXy5maWx0ZXIodGFyamFuKGcpLApmdW5jdGlvbihjbXB0KXtyZXR1cm4gY21wdC5sZW5ndGg+MXx8Y21wdC5sZW5ndGg9PT0xJiZnLmhhc0VkZ2UoY21wdFswXSxjbXB0WzBdKX0pfX0seyIuLi9sb2Rhc2giOjE5LCIuL3RhcmphbiI6MTN9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1mbG95ZFdhcnNoYWxsO3ZhciBERUZBVUxUX1dFSUdIVF9GVU5DPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZmxveWRXYXJzaGFsbChnLHdlaWdodEZuLGVkZ2VGbil7cmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRmxveWRXYXJzaGFsbChnLHdlaWdodEZuLGVkZ2VGbil7dmFyIHJlc3VsdHM9e30sbm9kZXM9Zy5ub2RlcygpO25vZGVzLmZvckVhY2goZnVuY3Rpb24odil7cmVzdWx0c1t2XT0Ke307cmVzdWx0c1t2XVt2XT17ZGlzdGFuY2U6MH07bm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtpZih2IT09dylyZXN1bHRzW3ZdW3ddPXtkaXN0YW5jZTpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl9fSk7ZWRnZUZuKHYpLmZvckVhY2goZnVuY3Rpb24oZWRnZSl7dmFyIHc9ZWRnZS52PT09dj9lZGdlLnc6ZWRnZS52LGQ9d2VpZ2h0Rm4oZWRnZSk7cmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6ZCxwcmVkZWNlc3Nvcjp2fX0pfSk7bm9kZXMuZm9yRWFjaChmdW5jdGlvbihrKXt2YXIgcm93Sz1yZXN1bHRzW2tdO25vZGVzLmZvckVhY2goZnVuY3Rpb24oaSl7dmFyIHJvd0k9cmVzdWx0c1tpXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGope3ZhciBpaz1yb3dJW2tdO3ZhciBraj1yb3dLW2pdO3ZhciBpaj1yb3dJW2pdO3ZhciBhbHREaXN0YW5jZT1pay5kaXN0YW5jZStrai5kaXN0YW5jZTtpZihhbHREaXN0YW5jZTxpai5kaXN0YW5jZSl7aWouZGlzdGFuY2U9YWx0RGlzdGFuY2U7aWoucHJlZGVjZXNzb3I9CmtqLnByZWRlY2Vzc29yfX0pfSl9KTtyZXR1cm4gcmVzdWx0c319LHsiLi4vbG9kYXNoIjoxOX1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtjb21wb25lbnRzOnJlcXVpcmUoIi4vY29tcG9uZW50cyIpLGRpamtzdHJhOnJlcXVpcmUoIi4vZGlqa3N0cmEiKSxkaWprc3RyYUFsbDpyZXF1aXJlKCIuL2RpamtzdHJhLWFsbCIpLGZpbmRDeWNsZXM6cmVxdWlyZSgiLi9maW5kLWN5Y2xlcyIpLGZsb3lkV2Fyc2hhbGw6cmVxdWlyZSgiLi9mbG95ZC13YXJzaGFsbCIpLGlzQWN5Y2xpYzpyZXF1aXJlKCIuL2lzLWFjeWNsaWMiKSxwb3N0b3JkZXI6cmVxdWlyZSgiLi9wb3N0b3JkZXIiKSxwcmVvcmRlcjpyZXF1aXJlKCIuL3ByZW9yZGVyIikscHJpbTpyZXF1aXJlKCIuL3ByaW0iKSx0YXJqYW46cmVxdWlyZSgiLi90YXJqYW4iKSx0b3Bzb3J0OnJlcXVpcmUoIi4vdG9wc29ydCIpfX0seyIuL2NvbXBvbmVudHMiOjIsIi4vZGlqa3N0cmEiOjUsCiIuL2RpamtzdHJhLWFsbCI6NCwiLi9maW5kLWN5Y2xlcyI6NiwiLi9mbG95ZC13YXJzaGFsbCI6NywiLi9pcy1hY3ljbGljIjo5LCIuL3Bvc3RvcmRlciI6MTAsIi4vcHJlb3JkZXIiOjExLCIuL3ByaW0iOjEyLCIuL3RhcmphbiI6MTMsIi4vdG9wc29ydCI6MTR9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgdG9wc29ydD1yZXF1aXJlKCIuL3RvcHNvcnQiKTttb2R1bGUuZXhwb3J0cz1pc0FjeWNsaWM7ZnVuY3Rpb24gaXNBY3ljbGljKGcpe3RyeXt0b3Bzb3J0KGcpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiB0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uKXJldHVybiBmYWxzZTt0aHJvdyBlO31yZXR1cm4gdHJ1ZX19LHsiLi90b3Bzb3J0IjoxNH1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cG9zdG9yZGVyO2Z1bmN0aW9uIHBvc3RvcmRlcihnLHZzKXtyZXR1cm4gZGZzKGcsCnZzLCJwb3N0Iil9fSx7Ii4vZGZzIjozfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBkZnM9cmVxdWlyZSgiLi9kZnMiKTttb2R1bGUuZXhwb3J0cz1wcmVvcmRlcjtmdW5jdGlvbiBwcmVvcmRlcihnLHZzKXtyZXR1cm4gZGZzKGcsdnMsInByZSIpfX0seyIuL2RmcyI6M31dLDEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaCIpLFByaW9yaXR5UXVldWU9cmVxdWlyZSgiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSIpO21vZHVsZS5leHBvcnRzPXByaW07ZnVuY3Rpb24gcHJpbShnLHdlaWdodEZ1bmMpe3ZhciByZXN1bHQ9bmV3IEdyYXBoLHBhcmVudHM9e30scHE9bmV3IFByaW9yaXR5UXVldWUsdjtmdW5jdGlvbiB1cGRhdGVOZWlnaGJvcnMoZWRnZSl7dmFyIHc9ZWRnZS52PT09dj9lZGdlLnc6ZWRnZS52LHByaT1wcS5wcmlvcml0eSh3KTtpZihwcmkhPT0KdW5kZWZpbmVkKXt2YXIgZWRnZVdlaWdodD13ZWlnaHRGdW5jKGVkZ2UpO2lmKGVkZ2VXZWlnaHQ8cHJpKXtwYXJlbnRzW3ddPXY7cHEuZGVjcmVhc2UodyxlZGdlV2VpZ2h0KX19fWlmKGcubm9kZUNvdW50KCk9PT0wKXJldHVybiByZXN1bHQ7Xy5lYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtwcS5hZGQodixOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3Jlc3VsdC5zZXROb2RlKHYpfSk7cHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLDApO3ZhciBpbml0PWZhbHNlO3doaWxlKHBxLnNpemUoKT4wKXt2PXBxLnJlbW92ZU1pbigpO2lmKF8uaGFzKHBhcmVudHMsdikpcmVzdWx0LnNldEVkZ2UodixwYXJlbnRzW3ZdKTtlbHNlIGlmKGluaXQpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiAiK2cpO2Vsc2UgaW5pdD10cnVlO2cubm9kZUVkZ2VzKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0fX0seyIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIjoxNSwKIi4uL2dyYXBoIjoxNiwiLi4vbG9kYXNoIjoxOX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz10YXJqYW47ZnVuY3Rpb24gdGFyamFuKGcpe3ZhciBpbmRleD0wLHN0YWNrPVtdLHZpc2l0ZWQ9e30scmVzdWx0cz1bXTtmdW5jdGlvbiBkZnModil7dmFyIGVudHJ5PXZpc2l0ZWRbdl09e29uU3RhY2s6dHJ1ZSxsb3dsaW5rOmluZGV4LGluZGV4OmluZGV4Kyt9O3N0YWNrLnB1c2godik7Zy5zdWNjZXNzb3JzKHYpLmZvckVhY2goZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpe2Rmcyh3KTtlbnRyeS5sb3dsaW5rPU1hdGgubWluKGVudHJ5Lmxvd2xpbmssdmlzaXRlZFt3XS5sb3dsaW5rKX1lbHNlIGlmKHZpc2l0ZWRbd10ub25TdGFjayllbnRyeS5sb3dsaW5rPU1hdGgubWluKGVudHJ5Lmxvd2xpbmssdmlzaXRlZFt3XS5pbmRleCl9KTtpZihlbnRyeS5sb3dsaW5rPT09ZW50cnkuaW5kZXgpe3ZhciBjbXB0PQpbXSx3O2Rve3c9c3RhY2sucG9wKCk7dmlzaXRlZFt3XS5vblN0YWNrPWZhbHNlO2NtcHQucHVzaCh3KX13aGlsZSh2IT09dyk7cmVzdWx0cy5wdXNoKGNtcHQpfX1nLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KXtpZighXy5oYXModmlzaXRlZCx2KSlkZnModil9KTtyZXR1cm4gcmVzdWx0c319LHsiLi4vbG9kYXNoIjoxOX1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz10b3Bzb3J0O3RvcHNvcnQuQ3ljbGVFeGNlcHRpb249Q3ljbGVFeGNlcHRpb247ZnVuY3Rpb24gdG9wc29ydChnKXt2YXIgdmlzaXRlZD17fSxzdGFjaz17fSxyZXN1bHRzPVtdO2Z1bmN0aW9uIHZpc2l0KG5vZGUpe2lmKF8uaGFzKHN0YWNrLG5vZGUpKXRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbjtpZighXy5oYXModmlzaXRlZCxub2RlKSl7c3RhY2tbbm9kZV09dHJ1ZTt2aXNpdGVkW25vZGVdPXRydWU7Xy5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLAp2aXNpdCk7ZGVsZXRlIHN0YWNrW25vZGVdO3Jlc3VsdHMucHVzaChub2RlKX19Xy5lYWNoKGcuc2lua3MoKSx2aXNpdCk7aWYoXy5zaXplKHZpc2l0ZWQpIT09Zy5ub2RlQ291bnQoKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKXt9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9UHJpb3JpdHlRdWV1ZTtmdW5jdGlvbiBQcmlvcml0eVF1ZXVlKCl7dGhpcy5fYXJyPVtdO3RoaXMuX2tleUluZGljZXM9e319UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubGVuZ3RofTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHgua2V5fSl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmhhcz0KZnVuY3Rpb24oa2V5KXtyZXR1cm4gXy5oYXModGhpcy5fa2V5SW5kaWNlcyxrZXkpfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5wcmlvcml0eT1mdW5jdGlvbihrZXkpe3ZhciBpbmRleD10aGlzLl9rZXlJbmRpY2VzW2tleV07aWYoaW5kZXghPT11bmRlZmluZWQpcmV0dXJuIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2lmKHRoaXMuc2l6ZSgpPT09MCl0aHJvdyBuZXcgRXJyb3IoIlF1ZXVlIHVuZGVyZmxvdyIpO3JldHVybiB0aGlzLl9hcnJbMF0ua2V5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oa2V5LHByaW9yaXR5KXt2YXIga2V5SW5kaWNlcz10aGlzLl9rZXlJbmRpY2VzO2tleT1TdHJpbmcoa2V5KTtpZighXy5oYXMoa2V5SW5kaWNlcyxrZXkpKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgaW5kZXg9YXJyLmxlbmd0aDtrZXlJbmRpY2VzW2tleV09aW5kZXg7YXJyLnB1c2goe2tleTprZXksCnByaW9yaXR5OnByaW9yaXR5fSk7dGhpcy5fZGVjcmVhc2UoaW5kZXgpO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucmVtb3ZlTWluPWZ1bmN0aW9uKCl7dGhpcy5fc3dhcCgwLHRoaXMuX2Fyci5sZW5ndGgtMSk7dmFyIG1pbj10aGlzLl9hcnIucG9wKCk7ZGVsZXRlIHRoaXMuX2tleUluZGljZXNbbWluLmtleV07dGhpcy5faGVhcGlmeSgwKTtyZXR1cm4gbWluLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuZGVjcmVhc2U9ZnVuY3Rpb24oa2V5LHByaW9yaXR5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKHByaW9yaXR5PnRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkpdGhyb3cgbmV3IEVycm9yKCJOZXcgcHJpb3JpdHkgaXMgZ3JlYXRlciB0aGFuIGN1cnJlbnQgcHJpb3JpdHkuICIrIktleTogIitrZXkrIiBPbGQ6ICIrdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSsiIE5ldzogIitwcmlvcml0eSk7dGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eT0KcHJpb3JpdHk7dGhpcy5fZGVjcmVhc2UoaW5kZXgpfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5faGVhcGlmeT1mdW5jdGlvbihpKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgbD0yKmkscj1sKzEsbGFyZ2VzdD1pO2lmKGw8YXJyLmxlbmd0aCl7bGFyZ2VzdD1hcnJbbF0ucHJpb3JpdHk8YXJyW2xhcmdlc3RdLnByaW9yaXR5P2w6bGFyZ2VzdDtpZihyPGFyci5sZW5ndGgpbGFyZ2VzdD1hcnJbcl0ucHJpb3JpdHk8YXJyW2xhcmdlc3RdLnByaW9yaXR5P3I6bGFyZ2VzdDtpZihsYXJnZXN0IT09aSl7dGhpcy5fc3dhcChpLGxhcmdlc3QpO3RoaXMuX2hlYXBpZnkobGFyZ2VzdCl9fX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2RlY3JlYXNlPWZ1bmN0aW9uKGluZGV4KXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIgcHJpb3JpdHk9YXJyW2luZGV4XS5wcmlvcml0eTt2YXIgcGFyZW50O3doaWxlKGluZGV4IT09MCl7cGFyZW50PWluZGV4Pj4xO2lmKGFycltwYXJlbnRdLnByaW9yaXR5PHByaW9yaXR5KWJyZWFrOwp0aGlzLl9zd2FwKGluZGV4LHBhcmVudCk7aW5kZXg9cGFyZW50fX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX3N3YXA9ZnVuY3Rpb24oaSxqKXt2YXIgYXJyPXRoaXMuX2Fycjt2YXIga2V5SW5kaWNlcz10aGlzLl9rZXlJbmRpY2VzO3ZhciBvcmlnQXJyST1hcnJbaV07dmFyIG9yaWdBcnJKPWFycltqXTthcnJbaV09b3JpZ0Fycko7YXJyW2pdPW9yaWdBcnJJO2tleUluZGljZXNbb3JpZ0Fyckoua2V5XT1pO2tleUluZGljZXNbb3JpZ0Fyckkua2V5XT1qfX0seyIuLi9sb2Rhc2giOjE5fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9R3JhcGg7dmFyIERFRkFVTFRfRURHRV9OQU1FPSJceDAwIixHUkFQSF9OT0RFPSJceDAwIixFREdFX0tFWV9ERUxJTT0iXHUwMDAxIjtmdW5jdGlvbiBHcmFwaChvcHRzKXt0aGlzLl9pc0RpcmVjdGVkPV8uaGFzKG9wdHMsImRpcmVjdGVkIik/b3B0cy5kaXJlY3RlZDoKdHJ1ZTt0aGlzLl9pc011bHRpZ3JhcGg9Xy5oYXMob3B0cywibXVsdGlncmFwaCIpP29wdHMubXVsdGlncmFwaDpmYWxzZTt0aGlzLl9pc0NvbXBvdW5kPV8uaGFzKG9wdHMsImNvbXBvdW5kIik/b3B0cy5jb21wb3VuZDpmYWxzZTt0aGlzLl9sYWJlbD11bmRlZmluZWQ7dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49Xy5jb25zdGFudCh1bmRlZmluZWQpO3RoaXMuX25vZGVzPXt9O2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3BhcmVudD17fTt0aGlzLl9jaGlsZHJlbj17fTt0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXT17fX10aGlzLl9pbj17fTt0aGlzLl9wcmVkcz17fTt0aGlzLl9vdXQ9e307dGhpcy5fc3Vjcz17fTt0aGlzLl9lZGdlT2Jqcz17fTt0aGlzLl9lZGdlTGFiZWxzPXt9fUdyYXBoLnByb3RvdHlwZS5fbm9kZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQ9MDtHcmFwaC5wcm90b3R5cGUuaXNEaXJlY3RlZD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEaXJlY3RlZH07R3JhcGgucHJvdG90eXBlLmlzTXVsdGlncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc011bHRpZ3JhcGh9O0dyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ29tcG91bmR9O0dyYXBoLnByb3RvdHlwZS5zZXRHcmFwaD1mdW5jdGlvbihsYWJlbCl7dGhpcy5fbGFiZWw9bGFiZWw7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH07R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWw9ZnVuY3Rpb24obmV3RGVmYXVsdCl7aWYoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSluZXdEZWZhdWx0PV8uY29uc3RhbnQobmV3RGVmYXVsdCk7dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPW5ld0RlZmF1bHQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ub2RlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbm9kZUNvdW50fTsKR3JhcGgucHJvdG90eXBlLm5vZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIF8ua2V5cyh0aGlzLl9ub2Rlcyl9O0dyYXBoLnByb3RvdHlwZS5zb3VyY2VzPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBfLmlzRW1wdHkoc2VsZi5faW5bdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zaW5rcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX291dFt2XSl9KX07R3JhcGgucHJvdG90eXBlLnNldE5vZGVzPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgYXJncz1hcmd1bWVudHM7dmFyIHNlbGY9dGhpcztfLmVhY2godnMsZnVuY3Rpb24odil7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldE5vZGUodix2YWx1ZSk7ZWxzZSBzZWxmLnNldE5vZGUodil9KTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldE5vZGU9CmZ1bmN0aW9uKHYsdmFsdWUpe2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXtpZihhcmd1bWVudHMubGVuZ3RoPjEpdGhpcy5fbm9kZXNbdl09dmFsdWU7cmV0dXJuIHRoaXN9dGhpcy5fbm9kZXNbdl09YXJndW1lbnRzLmxlbmd0aD4xP3ZhbHVlOnRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbih2KTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnRbdl09R1JBUEhfTk9ERTt0aGlzLl9jaGlsZHJlblt2XT17fTt0aGlzLl9jaGlsZHJlbltHUkFQSF9OT0RFXVt2XT10cnVlfXRoaXMuX2luW3ZdPXt9O3RoaXMuX3ByZWRzW3ZdPXt9O3RoaXMuX291dFt2XT17fTt0aGlzLl9zdWNzW3ZdPXt9OysrdGhpcy5fbm9kZUNvdW50O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gdGhpcy5fbm9kZXNbdl19O0dyYXBoLnByb3RvdHlwZS5oYXNOb2RlPWZ1bmN0aW9uKHYpe3JldHVybiBfLmhhcyh0aGlzLl9ub2Rlcyx2KX07R3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGU9CmZ1bmN0aW9uKHYpe3ZhciBzZWxmPXRoaXM7aWYoXy5oYXModGhpcy5fbm9kZXMsdikpe3ZhciByZW1vdmVFZGdlPWZ1bmN0aW9uKGUpe3NlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSl9O2RlbGV0ZSB0aGlzLl9ub2Rlc1t2XTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTtkZWxldGUgdGhpcy5fcGFyZW50W3ZdO18uZWFjaCh0aGlzLmNoaWxkcmVuKHYpLGZ1bmN0aW9uKGNoaWxkKXtzZWxmLnNldFBhcmVudChjaGlsZCl9KTtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdl19Xy5lYWNoKF8ua2V5cyh0aGlzLl9pblt2XSkscmVtb3ZlRWRnZSk7ZGVsZXRlIHRoaXMuX2luW3ZdO2RlbGV0ZSB0aGlzLl9wcmVkc1t2XTtfLmVhY2goXy5rZXlzKHRoaXMuX291dFt2XSkscmVtb3ZlRWRnZSk7ZGVsZXRlIHRoaXMuX291dFt2XTtkZWxldGUgdGhpcy5fc3Vjc1t2XTstLXRoaXMuX25vZGVDb3VudH1yZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldFBhcmVudD0KZnVuY3Rpb24odixwYXJlbnQpe2lmKCF0aGlzLl9pc0NvbXBvdW5kKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGgiKTtpZihfLmlzVW5kZWZpbmVkKHBhcmVudCkpcGFyZW50PUdSQVBIX05PREU7ZWxzZXtwYXJlbnQrPSIiO2Zvcih2YXIgYW5jZXN0b3I9cGFyZW50OyFfLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTthbmNlc3Rvcj10aGlzLnBhcmVudChhbmNlc3RvcikpaWYoYW5jZXN0b3I9PT12KXRocm93IG5ldyBFcnJvcigiU2V0dGluZyAiK3BhcmVudCsiIGFzIHBhcmVudCBvZiAiK3YrIiB3b3VsZCBjcmVhdGUgYSBjeWNsZSIpO3RoaXMuc2V0Tm9kZShwYXJlbnQpfXRoaXMuc2V0Tm9kZSh2KTt0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTt0aGlzLl9wYXJlbnRbdl09cGFyZW50O3RoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl09dHJ1ZTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdD0KZnVuY3Rpb24odil7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl19O0dyYXBoLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24odil7aWYodGhpcy5faXNDb21wb3VuZCl7dmFyIHBhcmVudD10aGlzLl9wYXJlbnRbdl07aWYocGFyZW50IT09R1JBUEhfTk9ERSlyZXR1cm4gcGFyZW50fX07R3JhcGgucHJvdG90eXBlLmNoaWxkcmVuPWZ1bmN0aW9uKHYpe2lmKF8uaXNVbmRlZmluZWQodikpdj1HUkFQSF9OT0RFO2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBjaGlsZHJlbj10aGlzLl9jaGlsZHJlblt2XTtpZihjaGlsZHJlbilyZXR1cm4gXy5rZXlzKGNoaWxkcmVuKX1lbHNlIGlmKHY9PT1HUkFQSF9OT0RFKXJldHVybiB0aGlzLm5vZGVzKCk7ZWxzZSBpZih0aGlzLmhhc05vZGUodikpcmV0dXJuW119O0dyYXBoLnByb3RvdHlwZS5wcmVkZWNlc3NvcnM9ZnVuY3Rpb24odil7dmFyIHByZWRzVj10aGlzLl9wcmVkc1t2XTtpZihwcmVkc1YpcmV0dXJuIF8ua2V5cyhwcmVkc1YpfTsKR3JhcGgucHJvdG90eXBlLnN1Y2Nlc3NvcnM9ZnVuY3Rpb24odil7dmFyIHN1Y3NWPXRoaXMuX3N1Y3Nbdl07aWYoc3Vjc1YpcmV0dXJuIF8ua2V5cyhzdWNzVil9O0dyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odil7dmFyIHByZWRzPXRoaXMucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRzKXJldHVybiBfLnVuaW9uKHByZWRzLHRoaXMuc3VjY2Vzc29ycyh2KSl9O0dyYXBoLnByb3RvdHlwZS5pc0xlYWY9ZnVuY3Rpb24odil7dmFyIG5laWdoYm9ycztpZih0aGlzLmlzRGlyZWN0ZWQoKSluZWlnaGJvcnM9dGhpcy5zdWNjZXNzb3JzKHYpO2Vsc2UgbmVpZ2hib3JzPXRoaXMubmVpZ2hib3JzKHYpO3JldHVybiBuZWlnaGJvcnMubGVuZ3RoPT09MH07R3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzPWZ1bmN0aW9uKGZpbHRlcil7dmFyIGNvcHk9bmV3IHRoaXMuY29uc3RydWN0b3Ioe2RpcmVjdGVkOnRoaXMuX2lzRGlyZWN0ZWQsbXVsdGlncmFwaDp0aGlzLl9pc011bHRpZ3JhcGgsCmNvbXBvdW5kOnRoaXMuX2lzQ29tcG91bmR9KTtjb3B5LnNldEdyYXBoKHRoaXMuZ3JhcGgoKSk7dmFyIHNlbGY9dGhpcztfLmVhY2godGhpcy5fbm9kZXMsZnVuY3Rpb24odmFsdWUsdil7aWYoZmlsdGVyKHYpKWNvcHkuc2V0Tm9kZSh2LHZhbHVlKX0pO18uZWFjaCh0aGlzLl9lZGdlT2JqcyxmdW5jdGlvbihlKXtpZihjb3B5Lmhhc05vZGUoZS52KSYmY29weS5oYXNOb2RlKGUudykpY29weS5zZXRFZGdlKGUsc2VsZi5lZGdlKGUpKX0pO3ZhciBwYXJlbnRzPXt9O2Z1bmN0aW9uIGZpbmRQYXJlbnQodil7dmFyIHBhcmVudD1zZWxmLnBhcmVudCh2KTtpZihwYXJlbnQ9PT11bmRlZmluZWR8fGNvcHkuaGFzTm9kZShwYXJlbnQpKXtwYXJlbnRzW3ZdPXBhcmVudDtyZXR1cm4gcGFyZW50fWVsc2UgaWYocGFyZW50IGluIHBhcmVudHMpcmV0dXJuIHBhcmVudHNbcGFyZW50XTtlbHNlIHJldHVybiBmaW5kUGFyZW50KHBhcmVudCl9aWYodGhpcy5faXNDb21wb3VuZClfLmVhY2goY29weS5ub2RlcygpLApmdW5jdGlvbih2KXtjb3B5LnNldFBhcmVudCh2LGZpbmRQYXJlbnQodikpfSk7cmV0dXJuIGNvcHl9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VkZ2VDb3VudH07R3JhcGgucHJvdG90eXBlLmVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIF8udmFsdWVzKHRoaXMuX2VkZ2VPYmpzKX07R3JhcGgucHJvdG90eXBlLnNldFBhdGg9ZnVuY3Rpb24odnMsdmFsdWUpe3ZhciBzZWxmPXRoaXMsYXJncz1hcmd1bWVudHM7Xy5yZWR1Y2UodnMsZnVuY3Rpb24odix3KXtpZihhcmdzLmxlbmd0aD4xKXNlbGYuc2V0RWRnZSh2LHcsdmFsdWUpO2Vsc2Ugc2VsZi5zZXRFZGdlKHYsCncpO3JldHVybiB3fSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRFZGdlPWZ1bmN0aW9uKCl7dmFyIHYsdyxuYW1lLHZhbHVlLHZhbHVlU3BlY2lmaWVkPWZhbHNlLGFyZzA9YXJndW1lbnRzWzBdO2lmKHR5cGVvZiBhcmcwPT09Im9iamVjdCImJmFyZzAhPT1udWxsJiYidiJpbiBhcmcwKXt2PWFyZzAudjt3PWFyZzAudztuYW1lPWFyZzAubmFtZTtpZihhcmd1bWVudHMubGVuZ3RoPT09Mil7dmFsdWU9YXJndW1lbnRzWzFdO3ZhbHVlU3BlY2lmaWVkPXRydWV9fWVsc2V7dj1hcmcwO3c9YXJndW1lbnRzWzFdO25hbWU9YXJndW1lbnRzWzNdO2lmKGFyZ3VtZW50cy5sZW5ndGg+Mil7dmFsdWU9YXJndW1lbnRzWzJdO3ZhbHVlU3BlY2lmaWVkPXRydWV9fXY9IiIrdjt3PSIiK3c7aWYoIV8uaXNVbmRlZmluZWQobmFtZSkpbmFtZT0iIituYW1lO3ZhciBlPWVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtpZihfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLAplKSl7aWYodmFsdWVTcGVjaWZpZWQpdGhpcy5fZWRnZUxhYmVsc1tlXT12YWx1ZTtyZXR1cm4gdGhpc31pZighXy5pc1VuZGVmaW5lZChuYW1lKSYmIXRoaXMuX2lzTXVsdGlncmFwaCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoIFx4M2QgZmFsc2UiKTt0aGlzLnNldE5vZGUodik7dGhpcy5zZXROb2RlKHcpO3RoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWVTcGVjaWZpZWQ/dmFsdWU6dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHYsdyxuYW1lKTt2YXIgZWRnZU9iaj1lZGdlQXJnc1RvT2JqKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3Y9ZWRnZU9iai52O3c9ZWRnZU9iai53O09iamVjdC5mcmVlemUoZWRnZU9iaik7dGhpcy5fZWRnZU9ianNbZV09ZWRnZU9iajtpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9zdWNzW3ZdLHcpO3RoaXMuX2luW3ddW2VdPQplZGdlT2JqO3RoaXMuX291dFt2XVtlXT1lZGdlT2JqO3RoaXMuX2VkZ2VDb3VudCsrO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/ZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtyZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tlXX07R3JhcGgucHJvdG90eXBlLmhhc0VkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsZSl9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT8KZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKSxlZGdlPXRoaXMuX2VkZ2VPYmpzW2VdO2lmKGVkZ2Upe3Y9ZWRnZS52O3c9ZWRnZS53O2RlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdO2RlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLHYpO2RlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fc3Vjc1t2XSx3KTtkZWxldGUgdGhpcy5faW5bd11bZV07ZGVsZXRlIHRoaXMuX291dFt2XVtlXTt0aGlzLl9lZGdlQ291bnQtLX1yZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmluRWRnZXM9ZnVuY3Rpb24odix1KXt2YXIgaW5WPXRoaXMuX2luW3ZdO2lmKGluVil7dmFyIGVkZ2VzPV8udmFsdWVzKGluVik7aWYoIXUpcmV0dXJuIGVkZ2VzO3JldHVybiBfLmZpbHRlcihlZGdlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZWRnZS52PT09CnV9KX19O0dyYXBoLnByb3RvdHlwZS5vdXRFZGdlcz1mdW5jdGlvbih2LHcpe3ZhciBvdXRWPXRoaXMuX291dFt2XTtpZihvdXRWKXt2YXIgZWRnZXM9Xy52YWx1ZXMob3V0Vik7aWYoIXcpcmV0dXJuIGVkZ2VzO3JldHVybiBfLmZpbHRlcihlZGdlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZWRnZS53PT09d30pfX07R3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcz1mdW5jdGlvbih2LHcpe3ZhciBpbkVkZ2VzPXRoaXMuaW5FZGdlcyh2LHcpO2lmKGluRWRnZXMpcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModix3KSl9O2Z1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCxrKXtpZihtYXBba10pbWFwW2tdKys7ZWxzZSBtYXBba109MX1mdW5jdGlvbiBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KG1hcCxrKXtpZighLS1tYXBba10pZGVsZXRlIG1hcFtrXX1mdW5jdGlvbiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCx2Xyx3XyxuYW1lKXt2YXIgdj0iIit2Xzt2YXIgdz0KIiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gditFREdFX0tFWV9ERUxJTSt3K0VER0VfS0VZX0RFTElNKyhfLmlzVW5kZWZpbmVkKG5hbWUpP0RFRkFVTFRfRURHRV9OQU1FOm5hbWUpfWZ1bmN0aW9uIGVkZ2VBcmdzVG9PYmooaXNEaXJlY3RlZCx2Xyx3XyxuYW1lKXt2YXIgdj0iIit2Xzt2YXIgdz0iIit3XztpZighaXNEaXJlY3RlZCYmdj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBlZGdlT2JqPXt2OnYsdzp3fTtpZihuYW1lKWVkZ2VPYmoubmFtZT1uYW1lO3JldHVybiBlZGdlT2JqfWZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsZWRnZU9iail7cmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmoudixlZGdlT2JqLncsZWRnZU9iai5uYW1lKX19LHsiLi9sb2Rhc2giOjE5fV0sMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtHcmFwaDpyZXF1aXJlKCIuL2dyYXBoIiksCnZlcnNpb246cmVxdWlyZSgiLi92ZXJzaW9uIil9fSx7Ii4vZ3JhcGgiOjE2LCIuL3ZlcnNpb24iOjIwfV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaCIpO21vZHVsZS5leHBvcnRzPXt3cml0ZTp3cml0ZSxyZWFkOnJlYWR9O2Z1bmN0aW9uIHdyaXRlKGcpe3ZhciBqc29uPXtvcHRpb25zOntkaXJlY3RlZDpnLmlzRGlyZWN0ZWQoKSxtdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCksY29tcG91bmQ6Zy5pc0NvbXBvdW5kKCl9LG5vZGVzOndyaXRlTm9kZXMoZyksZWRnZXM6d3JpdGVFZGdlcyhnKX07aWYoIV8uaXNVbmRlZmluZWQoZy5ncmFwaCgpKSlqc29uLnZhbHVlPV8uY2xvbmUoZy5ncmFwaCgpKTtyZXR1cm4ganNvbn1mdW5jdGlvbiB3cml0ZU5vZGVzKGcpe3JldHVybiBfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGVWYWx1ZT1nLm5vZGUodikscGFyZW50PQpnLnBhcmVudCh2KSxub2RlPXt2OnZ9O2lmKCFfLmlzVW5kZWZpbmVkKG5vZGVWYWx1ZSkpbm9kZS52YWx1ZT1ub2RlVmFsdWU7aWYoIV8uaXNVbmRlZmluZWQocGFyZW50KSlub2RlLnBhcmVudD1wYXJlbnQ7cmV0dXJuIG5vZGV9KX1mdW5jdGlvbiB3cml0ZUVkZ2VzKGcpe3JldHVybiBfLm1hcChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWYWx1ZT1nLmVkZ2UoZSksZWRnZT17djplLnYsdzplLnd9O2lmKCFfLmlzVW5kZWZpbmVkKGUubmFtZSkpZWRnZS5uYW1lPWUubmFtZTtpZighXy5pc1VuZGVmaW5lZChlZGdlVmFsdWUpKWVkZ2UudmFsdWU9ZWRnZVZhbHVlO3JldHVybiBlZGdlfSl9ZnVuY3Rpb24gcmVhZChqc29uKXt2YXIgZz0obmV3IEdyYXBoKGpzb24ub3B0aW9ucykpLnNldEdyYXBoKGpzb24udmFsdWUpO18uZWFjaChqc29uLm5vZGVzLGZ1bmN0aW9uKGVudHJ5KXtnLnNldE5vZGUoZW50cnkudixlbnRyeS52YWx1ZSk7aWYoZW50cnkucGFyZW50KWcuc2V0UGFyZW50KGVudHJ5LnYsCmVudHJ5LnBhcmVudCl9KTtfLmVhY2goanNvbi5lZGdlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXRFZGdlKHt2OmVudHJ5LnYsdzplbnRyeS53LG5hbWU6ZW50cnkubmFtZX0sZW50cnkudmFsdWUpfSk7cmV0dXJuIGd9fSx7Ii4vZ3JhcGgiOjE2LCIuL2xvZGFzaCI6MTl9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9d2luZG93Ll87bW9kdWxlLmV4cG9ydHM9bG9kYXNofSx7ImxvZGFzaCI6dW5kZWZpbmVkfV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPSIyLjEuNSJ9LHt9XX0se30sWzFdKSgxKX0pOwooZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKW1vZHVsZS5leHBvcnRzPWYoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxmKTtlbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIilnPXdpbmRvdztlbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIilnPWdsb2JhbDtlbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpZz1zZWxmO2Vsc2UgZz10aGlzO2cuZGFncmU9ZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj0KbmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZjt9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e2dyYXBobGliOnJlcXVpcmUoIi4vbGliL2dyYXBobGliIiksbGF5b3V0OnJlcXVpcmUoIi4vbGliL2xheW91dCIpLGRlYnVnOnJlcXVpcmUoIi4vbGliL2RlYnVnIiksdXRpbDp7dGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikudGltZSxub3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLm5vdGltZX0sCnZlcnNpb246cmVxdWlyZSgiLi9saWIvdmVyc2lvbiIpfX0seyIuL2xpYi9kZWJ1ZyI6NiwiLi9saWIvZ3JhcGhsaWIiOjcsIi4vbGliL2xheW91dCI6OSwiLi9saWIvdXRpbCI6MjksIi4vbGliL3ZlcnNpb24iOjMwfV0sMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxncmVlZHlGQVM9cmVxdWlyZSgiLi9ncmVlZHktZmFzIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sdW5kbzp1bmRvfTtmdW5jdGlvbiBydW4oZyl7dmFyIGZhcz1nLmdyYXBoKCkuYWN5Y2xpY2VyPT09ImdyZWVkeSI/Z3JlZWR5RkFTKGcsd2VpZ2h0Rm4oZykpOmRmc0ZBUyhnKTtfLmZvckVhY2goZmFzLGZ1bmN0aW9uKGUpe3ZhciBsYWJlbD1nLmVkZ2UoZSk7Zy5yZW1vdmVFZGdlKGUpO2xhYmVsLmZvcndhcmROYW1lPWUubmFtZTtsYWJlbC5yZXZlcnNlZD10cnVlO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLF8udW5pcXVlSWQoInJldiIpKX0pO2Z1bmN0aW9uIHdlaWdodEZuKGcpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZy5lZGdlKGUpLndlaWdodH19Cn1mdW5jdGlvbiBkZnNGQVMoZyl7dmFyIGZhcz1bXSxzdGFjaz17fSx2aXNpdGVkPXt9O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7c3RhY2tbdl09dHJ1ZTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtpZihfLmhhcyhzdGFjayxlLncpKWZhcy5wdXNoKGUpO2Vsc2UgZGZzKGUudyl9KTtkZWxldGUgc3RhY2tbdl19Xy5mb3JFYWNoKGcubm9kZXMoKSxkZnMpO3JldHVybiBmYXN9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBsYWJlbD1nLmVkZ2UoZSk7aWYobGFiZWwucmV2ZXJzZWQpe2cucmVtb3ZlRWRnZShlKTt2YXIgZm9yd2FyZE5hbWU9bGFiZWwuZm9yd2FyZE5hbWU7ZGVsZXRlIGxhYmVsLnJldmVyc2VkO2RlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxmb3J3YXJkTmFtZSl9fSl9fSx7Ii4vZ3JlZWR5LWZhcyI6OCwKIi4vbG9kYXNoIjoxMH1dLDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1hZGRCb3JkZXJTZWdtZW50cztmdW5jdGlvbiBhZGRCb3JkZXJTZWdtZW50cyhnKXtmdW5jdGlvbiBkZnModil7dmFyIGNoaWxkcmVuPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodik7aWYoY2hpbGRyZW4ubGVuZ3RoKV8uZm9yRWFjaChjaGlsZHJlbixkZnMpO2lmKF8uaGFzKG5vZGUsIm1pblJhbmsiKSl7bm9kZS5ib3JkZXJMZWZ0PVtdO25vZGUuYm9yZGVyUmlnaHQ9W107Zm9yKHZhciByYW5rPW5vZGUubWluUmFuayxtYXhSYW5rPW5vZGUubWF4UmFuaysxO3Jhbms8bWF4UmFuazsrK3Jhbmspe2FkZEJvcmRlck5vZGUoZywiYm9yZGVyTGVmdCIsIl9ibCIsdixub2RlLHJhbmspO2FkZEJvcmRlck5vZGUoZywiYm9yZGVyUmlnaHQiLCJfYnIiLHYsbm9kZSxyYW5rKX19fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksCmRmcyl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByb3AscHJlZml4LHNnLHNnTm9kZSxyYW5rKXt2YXIgbGFiZWw9e3dpZHRoOjAsaGVpZ2h0OjAscmFuazpyYW5rLGJvcmRlclR5cGU6cHJvcH0scHJldj1zZ05vZGVbcHJvcF1bcmFuay0xXSxjdXJyPXV0aWwuYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbGFiZWwscHJlZml4KTtzZ05vZGVbcHJvcF1bcmFua109Y3VycjtnLnNldFBhcmVudChjdXJyLHNnKTtpZihwcmV2KWcuc2V0RWRnZShwcmV2LGN1cnIse3dlaWdodDoxfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9e2FkanVzdDphZGp1c3QsdW5kbzp1bmRvfTtmdW5jdGlvbiBhZGp1c3QoZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpc3dhcFdpZHRoSGVpZ2h0KGcpfQpmdW5jdGlvbiB1bmRvKGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJidCJ8fHJhbmtEaXI9PT0icmwiKXJldmVyc2VZKGcpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIil7c3dhcFhZKGcpO3N3YXBXaWR0aEhlaWdodChnKX19ZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0KGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c3dhcFdpZHRoSGVpZ2h0T25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3N3YXBXaWR0aEhlaWdodE9uZShnLmVkZ2UoZSkpfSl9ZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0T25lKGF0dHJzKXt2YXIgdz1hdHRycy53aWR0aDthdHRycy53aWR0aD1hdHRycy5oZWlnaHQ7YXR0cnMuaGVpZ2h0PXd9ZnVuY3Rpb24gcmV2ZXJzZVkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXZlcnNlWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxyZXZlcnNlWU9uZSk7aWYoXy5oYXMoZWRnZSwieSIpKXJldmVyc2VZT25lKGVkZ2UpfSl9ZnVuY3Rpb24gcmV2ZXJzZVlPbmUoYXR0cnMpe2F0dHJzLnk9LWF0dHJzLnl9ZnVuY3Rpb24gc3dhcFhZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c3dhcFhZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsc3dhcFhZT25lKTtpZihfLmhhcyhlZGdlLCJ4Iikpc3dhcFhZT25lKGVkZ2UpfSl9ZnVuY3Rpb24gc3dhcFhZT25lKGF0dHJzKXt2YXIgeD1hdHRycy54O2F0dHJzLng9YXR0cnMueTthdHRycy55PXh9fSx7Ii4vbG9kYXNoIjoxMH1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPUxpc3Q7ZnVuY3Rpb24gTGlzdCgpe3ZhciBzZW50aW5lbD0Ke307c2VudGluZWwuX25leHQ9c2VudGluZWwuX3ByZXY9c2VudGluZWw7dGhpcy5fc2VudGluZWw9c2VudGluZWx9TGlzdC5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe3ZhciBzZW50aW5lbD10aGlzLl9zZW50aW5lbCxlbnRyeT1zZW50aW5lbC5fcHJldjtpZihlbnRyeSE9PXNlbnRpbmVsKXt1bmxpbmsoZW50cnkpO3JldHVybiBlbnRyeX19O0xpc3QucHJvdG90eXBlLmVucXVldWU9ZnVuY3Rpb24oZW50cnkpe3ZhciBzZW50aW5lbD10aGlzLl9zZW50aW5lbDtpZihlbnRyeS5fcHJldiYmZW50cnkuX25leHQpdW5saW5rKGVudHJ5KTtlbnRyeS5fbmV4dD1zZW50aW5lbC5fbmV4dDtzZW50aW5lbC5fbmV4dC5fcHJldj1lbnRyeTtzZW50aW5lbC5fbmV4dD1lbnRyeTtlbnRyeS5fcHJldj1zZW50aW5lbH07TGlzdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgc3Rycz1bXSxzZW50aW5lbD10aGlzLl9zZW50aW5lbCxjdXJyPXNlbnRpbmVsLl9wcmV2O3doaWxlKGN1cnIhPT0Kc2VudGluZWwpe3N0cnMucHVzaChKU09OLnN0cmluZ2lmeShjdXJyLGZpbHRlck91dExpbmtzKSk7Y3Vycj1jdXJyLl9wcmV2fXJldHVybiJbIitzdHJzLmpvaW4oIiwgIikrIl0ifTtmdW5jdGlvbiB1bmxpbmsoZW50cnkpe2VudHJ5Ll9wcmV2Ll9uZXh0PWVudHJ5Ll9uZXh0O2VudHJ5Ll9uZXh0Ll9wcmV2PWVudHJ5Ll9wcmV2O2RlbGV0ZSBlbnRyeS5fbmV4dDtkZWxldGUgZW50cnkuX3ByZXZ9ZnVuY3Rpb24gZmlsdGVyT3V0TGlua3Moayx2KXtpZihrIT09Il9uZXh0IiYmayE9PSJfcHJldiIpcmV0dXJuIHZ9fSx7fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17ZGVidWdPcmRlcmluZzpkZWJ1Z09yZGVyaW5nfTtmdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpe3ZhciBsYXllck1hdHJpeD0KdXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBoPShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWUsbXVsdGlncmFwaDp0cnVlfSkpLnNldEdyYXBoKHt9KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2guc2V0Tm9kZSh2LHtsYWJlbDp2fSk7aC5zZXRQYXJlbnQodiwibGF5ZXIiK2cubm9kZSh2KS5yYW5rKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aC5zZXRFZGdlKGUudixlLncse30sZS5uYW1lKX0pO18uZm9yRWFjaChsYXllck1hdHJpeCxmdW5jdGlvbihsYXllcixpKXt2YXIgbGF5ZXJWPSJsYXllciIraTtoLnNldE5vZGUobGF5ZXJWLHtyYW5rOiJzYW1lIn0pO18ucmVkdWNlKGxheWVyLGZ1bmN0aW9uKHUsdil7aC5zZXRFZGdlKHUsdix7c3R5bGU6ImludmlzIn0pO3JldHVybiB2fSl9KTtyZXR1cm4gaH19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGdyYXBobGliOwppZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2dyYXBobGliPXJlcXVpcmUoImdyYXBobGliIil9Y2F0Y2goZSl7fWlmKCFncmFwaGxpYilncmFwaGxpYj13aW5kb3cuZ3JhcGhsaWI7bW9kdWxlLmV4cG9ydHM9Z3JhcGhsaWJ9LHsiZ3JhcGhsaWIiOnVuZGVmaW5lZH1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoLExpc3Q9cmVxdWlyZSgiLi9kYXRhL2xpc3QiKTttb2R1bGUuZXhwb3J0cz1ncmVlZHlGQVM7dmFyIERFRkFVTFRfV0VJR0hUX0ZOPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZ3JlZWR5RkFTKGcsd2VpZ2h0Rm4pe2lmKGcubm9kZUNvdW50KCk8PTEpcmV0dXJuW107dmFyIHN0YXRlPWJ1aWxkU3RhdGUoZyx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRk4pO3ZhciByZXN1bHRzPWRvR3JlZWR5RkFTKHN0YXRlLmdyYXBoLHN0YXRlLmJ1Y2tldHMsCnN0YXRlLnplcm9JZHgpO3JldHVybiBfLmZsYXR0ZW4oXy5tYXAocmVzdWx0cyxmdW5jdGlvbihlKXtyZXR1cm4gZy5vdXRFZGdlcyhlLnYsZS53KX0pLHRydWUpfWZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsYnVja2V0cyx6ZXJvSWR4KXt2YXIgcmVzdWx0cz1bXSxzb3VyY2VzPWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0sc2lua3M9YnVja2V0c1swXTt2YXIgZW50cnk7d2hpbGUoZy5ub2RlQ291bnQoKSl7d2hpbGUoZW50cnk9c2lua3MuZGVxdWV1ZSgpKXJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnkpO3doaWxlKGVudHJ5PXNvdXJjZXMuZGVxdWV1ZSgpKXJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnkpO2lmKGcubm9kZUNvdW50KCkpZm9yKHZhciBpPWJ1Y2tldHMubGVuZ3RoLTI7aT4wOy0taSl7ZW50cnk9YnVja2V0c1tpXS5kZXF1ZXVlKCk7aWYoZW50cnkpe3Jlc3VsdHM9cmVzdWx0cy5jb25jYXQocmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCwKZW50cnksdHJ1ZSkpO2JyZWFrfX19cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSxjb2xsZWN0UHJlZGVjZXNzb3JzKXt2YXIgcmVzdWx0cz1jb2xsZWN0UHJlZGVjZXNzb3JzP1tdOnVuZGVmaW5lZDtfLmZvckVhY2goZy5pbkVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHVFbnRyeT1nLm5vZGUoZWRnZS52KTtpZihjb2xsZWN0UHJlZGVjZXNzb3JzKXJlc3VsdHMucHVzaCh7djplZGdlLnYsdzplZGdlLnd9KTt1RW50cnkub3V0LT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx1RW50cnkpfSk7Xy5mb3JFYWNoKGcub3V0RWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdz1lZGdlLncsd0VudHJ5PWcubm9kZSh3KTt3RW50cnlbImluIl0tPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHdFbnRyeSl9KTsKZy5yZW1vdmVOb2RlKGVudHJ5LnYpO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIGJ1aWxkU3RhdGUoZyx3ZWlnaHRGbil7dmFyIGZhc0dyYXBoPW5ldyBHcmFwaCxtYXhJbj0wLG1heE91dD0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7ZmFzR3JhcGguc2V0Tm9kZSh2LHt2OnYsImluIjowLG91dDowfSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBwcmV2V2VpZ2h0PWZhc0dyYXBoLmVkZ2UoZS52LGUudyl8fDAsd2VpZ2h0PXdlaWdodEZuKGUpLGVkZ2VXZWlnaHQ9cHJldldlaWdodCt3ZWlnaHQ7ZmFzR3JhcGguc2V0RWRnZShlLnYsZS53LGVkZ2VXZWlnaHQpO21heE91dD1NYXRoLm1heChtYXhPdXQsZmFzR3JhcGgubm9kZShlLnYpLm91dCs9d2VpZ2h0KTttYXhJbj1NYXRoLm1heChtYXhJbixmYXNHcmFwaC5ub2RlKGUudylbImluIl0rPXdlaWdodCl9KTt2YXIgYnVja2V0cz1fLnJhbmdlKG1heE91dCttYXhJbiszKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IExpc3R9KTsKdmFyIHplcm9JZHg9bWF4SW4rMTtfLmZvckVhY2goZmFzR3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGZhc0dyYXBoLm5vZGUodikpfSk7cmV0dXJue2dyYXBoOmZhc0dyYXBoLGJ1Y2tldHM6YnVja2V0cyx6ZXJvSWR4Onplcm9JZHh9fWZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZW50cnkpe2lmKCFlbnRyeS5vdXQpYnVja2V0c1swXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGlmKCFlbnRyeVsiaW4iXSlidWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLmVucXVldWUoZW50cnkpO2Vsc2UgYnVja2V0c1tlbnRyeS5vdXQtZW50cnlbImluIl0remVyb0lkeF0uZW5xdWV1ZShlbnRyeSl9fSx7Ii4vZGF0YS9saXN0Ijo1LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTB9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGFjeWNsaWM9cmVxdWlyZSgiLi9hY3ljbGljIiksCm5vcm1hbGl6ZT1yZXF1aXJlKCIuL25vcm1hbGl6ZSIpLHJhbms9cmVxdWlyZSgiLi9yYW5rIiksbm9ybWFsaXplUmFua3M9cmVxdWlyZSgiLi91dGlsIikubm9ybWFsaXplUmFua3MscGFyZW50RHVtbXlDaGFpbnM9cmVxdWlyZSgiLi9wYXJlbnQtZHVtbXktY2hhaW5zIikscmVtb3ZlRW1wdHlSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5yZW1vdmVFbXB0eVJhbmtzLG5lc3RpbmdHcmFwaD1yZXF1aXJlKCIuL25lc3RpbmctZ3JhcGgiKSxhZGRCb3JkZXJTZWdtZW50cz1yZXF1aXJlKCIuL2FkZC1ib3JkZXItc2VnbWVudHMiKSxjb29yZGluYXRlU3lzdGVtPXJlcXVpcmUoIi4vY29vcmRpbmF0ZS1zeXN0ZW0iKSxvcmRlcj1yZXF1aXJlKCIuL29yZGVyIikscG9zaXRpb249cmVxdWlyZSgiLi9wb3NpdGlvbiIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWxheW91dDtmdW5jdGlvbiBsYXlvdXQoZyxvcHRzKXt2YXIgdGltZT0Kb3B0cyYmb3B0cy5kZWJ1Z1RpbWluZz91dGlsLnRpbWU6dXRpbC5ub3RpbWU7dGltZSgibGF5b3V0IixmdW5jdGlvbigpe3ZhciBsYXlvdXRHcmFwaD10aW1lKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyl9KTt0aW1lKCIgIHJ1bkxheW91dCIsZnVuY3Rpb24oKXtydW5MYXlvdXQobGF5b3V0R3JhcGgsdGltZSl9KTt0aW1lKCIgIHVwZGF0ZUlucHV0R3JhcGgiLGZ1bmN0aW9uKCl7dXBkYXRlSW5wdXRHcmFwaChnLGxheW91dEdyYXBoKX0pfSl9ZnVuY3Rpb24gcnVuTGF5b3V0KGcsdGltZSl7dGltZSgiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMiLGZ1bmN0aW9uKCl7bWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKX0pO3RpbWUoIiAgICByZW1vdmVTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMiLGZ1bmN0aW9uKCl7YWN5Y2xpYy5ydW4oZyl9KTt0aW1lKCIgICAgbmVzdGluZ0dyYXBoLnJ1biIsCmZ1bmN0aW9uKCl7bmVzdGluZ0dyYXBoLnJ1bihnKX0pO3RpbWUoIiAgICByYW5rIixmdW5jdGlvbigpe3JhbmsodXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZykpfSk7dGltZSgiICAgIGluamVjdEVkZ2VMYWJlbFByb3hpZXMiLGZ1bmN0aW9uKCl7aW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKX0pO3RpbWUoIiAgICByZW1vdmVFbXB0eVJhbmtzIixmdW5jdGlvbigpe3JlbW92ZUVtcHR5UmFua3MoZyl9KTt0aW1lKCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXAiLGZ1bmN0aW9uKCl7bmVzdGluZ0dyYXBoLmNsZWFudXAoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplUmFua3MiLGZ1bmN0aW9uKCl7bm9ybWFsaXplUmFua3MoZyl9KTt0aW1lKCIgICAgYXNzaWduUmFua01pbk1heCIsZnVuY3Rpb24oKXthc3NpZ25SYW5rTWluTWF4KGcpfSk7dGltZSgiICAgIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKX0pO3RpbWUoIiAgICBub3JtYWxpemUucnVuIiwKZnVuY3Rpb24oKXtub3JtYWxpemUucnVuKGcpfSk7dGltZSgiICAgIHBhcmVudER1bW15Q2hhaW5zIixmdW5jdGlvbigpe3BhcmVudER1bW15Q2hhaW5zKGcpfSk7dGltZSgiICAgIGFkZEJvcmRlclNlZ21lbnRzIixmdW5jdGlvbigpe2FkZEJvcmRlclNlZ21lbnRzKGcpfSk7dGltZSgiICAgIG9yZGVyIixmdW5jdGlvbigpe29yZGVyKGcpfSk7dGltZSgiICAgIGluc2VydFNlbGZFZGdlcyIsZnVuY3Rpb24oKXtpbnNlcnRTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWRqdXN0Q29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLmFkanVzdChnKX0pO3RpbWUoIiAgICBwb3NpdGlvbiIsZnVuY3Rpb24oKXtwb3NpdGlvbihnKX0pO3RpbWUoIiAgICBwb3NpdGlvblNlbGZFZGdlcyIsZnVuY3Rpb24oKXtwb3NpdGlvblNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICByZW1vdmVCb3JkZXJOb2RlcyIsZnVuY3Rpb24oKXtyZW1vdmVCb3JkZXJOb2RlcyhnKX0pO3RpbWUoIiAgICBub3JtYWxpemUudW5kbyIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnVuZG8oZyl9KTt0aW1lKCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHMiLGZ1bmN0aW9uKCl7Zml4dXBFZGdlTGFiZWxDb29yZHMoZyl9KTt0aW1lKCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS51bmRvKGcpfSk7dGltZSgiICAgIHRyYW5zbGF0ZUdyYXBoIixmdW5jdGlvbigpe3RyYW5zbGF0ZUdyYXBoKGcpfSk7dGltZSgiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzIixmdW5jdGlvbigpe2Fzc2lnbk5vZGVJbnRlcnNlY3RzKGcpfSk7dGltZSgiICAgIHJldmVyc2VQb2ludHMiLGZ1bmN0aW9uKCl7cmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYy51bmRvIixmdW5jdGlvbigpe2FjeWNsaWMudW5kbyhnKX0pfWZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCxsYXlvdXRHcmFwaCl7Xy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgaW5wdXRMYWJlbD0KaW5wdXRHcmFwaC5ub2RlKHYpLGxheW91dExhYmVsPWxheW91dEdyYXBoLm5vZGUodik7aWYoaW5wdXRMYWJlbCl7aW5wdXRMYWJlbC54PWxheW91dExhYmVsLng7aW5wdXRMYWJlbC55PWxheW91dExhYmVsLnk7aWYobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKXtpbnB1dExhYmVsLndpZHRoPWxheW91dExhYmVsLndpZHRoO2lucHV0TGFiZWwuaGVpZ2h0PWxheW91dExhYmVsLmhlaWdodH19fSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgaW5wdXRMYWJlbD1pbnB1dEdyYXBoLmVkZ2UoZSksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGguZWRnZShlKTtpbnB1dExhYmVsLnBvaW50cz1sYXlvdXRMYWJlbC5wb2ludHM7aWYoXy5oYXMobGF5b3V0TGFiZWwsIngiKSl7aW5wdXRMYWJlbC54PWxheW91dExhYmVsLng7aW5wdXRMYWJlbC55PWxheW91dExhYmVsLnl9fSk7aW5wdXRHcmFwaC5ncmFwaCgpLndpZHRoPWxheW91dEdyYXBoLmdyYXBoKCkud2lkdGg7CmlucHV0R3JhcGguZ3JhcGgoKS5oZWlnaHQ9bGF5b3V0R3JhcGguZ3JhcGgoKS5oZWlnaHR9dmFyIGdyYXBoTnVtQXR0cnM9WyJub2Rlc2VwIiwiZWRnZXNlcCIsInJhbmtzZXAiLCJtYXJnaW54IiwibWFyZ2lueSJdLGdyYXBoRGVmYXVsdHM9e3JhbmtzZXA6NTAsZWRnZXNlcDoyMCxub2Rlc2VwOjUwLHJhbmtkaXI6InRiIn0sZ3JhcGhBdHRycz1bImFjeWNsaWNlciIsInJhbmtlciIsInJhbmtkaXIiLCJhbGlnbiJdLG5vZGVOdW1BdHRycz1bIndpZHRoIiwiaGVpZ2h0Il0sbm9kZURlZmF1bHRzPXt3aWR0aDowLGhlaWdodDowfSxlZGdlTnVtQXR0cnM9WyJtaW5sZW4iLCJ3ZWlnaHQiLCJ3aWR0aCIsImhlaWdodCIsImxhYmVsb2Zmc2V0Il0sZWRnZURlZmF1bHRzPXttaW5sZW46MSx3ZWlnaHQ6MSx3aWR0aDowLGhlaWdodDowLGxhYmVsb2Zmc2V0OjEwLGxhYmVscG9zOiJyIn0sZWRnZUF0dHJzPVsibGFiZWxwb3MiXTtmdW5jdGlvbiBidWlsZExheW91dEdyYXBoKGlucHV0R3JhcGgpe3ZhciBnPQpuZXcgR3JhcGgoe211bHRpZ3JhcGg6dHJ1ZSxjb21wb3VuZDp0cnVlfSksZ3JhcGg9Y2Fub25pY2FsaXplKGlucHV0R3JhcGguZ3JhcGgoKSk7Zy5zZXRHcmFwaChfLm1lcmdlKHt9LGdyYXBoRGVmYXVsdHMsc2VsZWN0TnVtYmVyQXR0cnMoZ3JhcGgsZ3JhcGhOdW1BdHRycyksXy5waWNrKGdyYXBoLGdyYXBoQXR0cnMpKSk7Xy5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ub2RlKHYpKTtnLnNldE5vZGUodixfLmRlZmF1bHRzKHNlbGVjdE51bWJlckF0dHJzKG5vZGUsbm9kZU51bUF0dHJzKSxub2RlRGVmYXVsdHMpKTtnLnNldFBhcmVudCh2LGlucHV0R3JhcGgucGFyZW50KHYpKX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Y2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7Zy5zZXRFZGdlKGUsXy5tZXJnZSh7fSxlZGdlRGVmYXVsdHMsc2VsZWN0TnVtYmVyQXR0cnMoZWRnZSwKZWRnZU51bUF0dHJzKSxfLnBpY2soZWRnZSxlZGdlQXR0cnMpKSl9KTtyZXR1cm4gZ31mdW5jdGlvbiBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpe3ZhciBncmFwaD1nLmdyYXBoKCk7Z3JhcGgucmFua3NlcC89MjtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtlZGdlLm1pbmxlbio9MjtpZihlZGdlLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkhPT0iYyIpaWYoZ3JhcGgucmFua2Rpcj09PSJUQiJ8fGdyYXBoLnJhbmtkaXI9PT0iQlQiKWVkZ2Uud2lkdGgrPWVkZ2UubGFiZWxvZmZzZXQ7ZWxzZSBlZGdlLmhlaWdodCs9ZWRnZS5sYWJlbG9mZnNldH0pfWZ1bmN0aW9uIGluamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS53aWR0aCYmZWRnZS5oZWlnaHQpe3ZhciB2PWcubm9kZShlLnYpLHc9Zy5ub2RlKGUudyksbGFiZWw9e3Jhbms6KHcucmFuay0Kdi5yYW5rKS8yK3YucmFuayxlOmV9O3V0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UtcHJveHkiLGxhYmVsLCJfZXAiKX19KX1mdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpe3ZhciBtYXhSYW5rPTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5ib3JkZXJUb3Ape25vZGUubWluUmFuaz1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7bm9kZS5tYXhSYW5rPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSkucmFuazttYXhSYW5rPV8ubWF4KG1heFJhbmssbm9kZS5tYXhSYW5rKX19KTtnLmdyYXBoKCkubWF4UmFuaz1tYXhSYW5rfWZ1bmN0aW9uIHJlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJlZGdlLXByb3h5Iil7Zy5lZGdlKG5vZGUuZSkubGFiZWxSYW5rPW5vZGUucmFuaztnLnJlbW92ZU5vZGUodil9fSl9CmZ1bmN0aW9uIHRyYW5zbGF0ZUdyYXBoKGcpe3ZhciBtaW5YPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhYPTAsbWluWT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WT0wLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLG1hcmdpblg9Z3JhcGhMYWJlbC5tYXJnaW54fHwwLG1hcmdpblk9Z3JhcGhMYWJlbC5tYXJnaW55fHwwO2Z1bmN0aW9uIGdldEV4dHJlbWVzKGF0dHJzKXt2YXIgeD1hdHRycy54LHk9YXR0cnMueSx3PWF0dHJzLndpZHRoLGg9YXR0cnMuaGVpZ2h0O21pblg9TWF0aC5taW4obWluWCx4LXcvMik7bWF4WD1NYXRoLm1heChtYXhYLHgrdy8yKTttaW5ZPU1hdGgubWluKG1pblkseS1oLzIpO21heFk9TWF0aC5tYXgobWF4WSx5K2gvMil9Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtnZXRFeHRyZW1lcyhnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKWdldEV4dHJlbWVzKGVkZ2UpfSk7Cm1pblgtPW1hcmdpblg7bWluWS09bWFyZ2luWTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLngtPW1pblg7bm9kZS55LT1taW5ZfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLGZ1bmN0aW9uKHApe3AueC09bWluWDtwLnktPW1pbll9KTtpZihfLmhhcyhlZGdlLCJ4IikpZWRnZS54LT1taW5YO2lmKF8uaGFzKGVkZ2UsInkiKSllZGdlLnktPW1pbll9KTtncmFwaExhYmVsLndpZHRoPW1heFgtbWluWCttYXJnaW5YO2dyYXBoTGFiZWwuaGVpZ2h0PW1heFktbWluWSttYXJnaW5ZfWZ1bmN0aW9uIGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLG5vZGVWPWcubm9kZShlLnYpLG5vZGVXPWcubm9kZShlLncpLHAxLHAyO2lmKCFlZGdlLnBvaW50cyl7ZWRnZS5wb2ludHM9CltdO3AxPW5vZGVXO3AyPW5vZGVWfWVsc2V7cDE9ZWRnZS5wb2ludHNbMF07cDI9ZWRnZS5wb2ludHNbZWRnZS5wb2ludHMubGVuZ3RoLTFdfWVkZ2UucG9pbnRzLnVuc2hpZnQodXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVWLHAxKSk7ZWRnZS5wb2ludHMucHVzaCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVcscDIpKX0pfWZ1bmN0aW9uIGZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSl7aWYoZWRnZS5sYWJlbHBvcz09PSJsInx8ZWRnZS5sYWJlbHBvcz09PSJyIillZGdlLndpZHRoLT1lZGdlLmxhYmVsb2Zmc2V0O3N3aXRjaChlZGdlLmxhYmVscG9zKXtjYXNlICJsIjplZGdlLngtPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2UgInIiOmVkZ2UueCs9ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWt9fX0pfWZ1bmN0aW9uIHJldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLnJldmVyc2VkKWVkZ2UucG9pbnRzLnJldmVyc2UoKX0pfWZ1bmN0aW9uIHJlbW92ZUJvcmRlck5vZGVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoZy5jaGlsZHJlbih2KS5sZW5ndGgpe3ZhciBub2RlPWcubm9kZSh2KSx0PWcubm9kZShub2RlLmJvcmRlclRvcCksYj1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLGw9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlckxlZnQpKSxyPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJSaWdodCkpO25vZGUud2lkdGg9TWF0aC5hYnMoci54LWwueCk7bm9kZS5oZWlnaHQ9TWF0aC5hYnMoYi55LXQueSk7bm9kZS54PWwueCtub2RlLndpZHRoLzI7bm9kZS55PXQueStub2RlLmhlaWdodC8yfX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoZy5ub2RlKHYpLmR1bW15PT09ImJvcmRlciIpZy5yZW1vdmVOb2RlKHYpfSl9ZnVuY3Rpb24gcmVtb3ZlU2VsZkVkZ2VzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe2lmKGUudj09PWUudyl7dmFyIG5vZGU9Zy5ub2RlKGUudik7aWYoIW5vZGUuc2VsZkVkZ2VzKW5vZGUuc2VsZkVkZ2VzPVtdO25vZGUuc2VsZkVkZ2VzLnB1c2goe2U6ZSxsYWJlbDpnLmVkZ2UoZSl9KTtnLnJlbW92ZUVkZ2UoZSl9fSl9ZnVuY3Rpb24gaW5zZXJ0U2VsZkVkZ2VzKGcpe3ZhciBsYXllcnM9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24obGF5ZXIpe3ZhciBvcmRlclNoaWZ0PTA7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUub3JkZXI9aStvcmRlclNoaWZ0O18uZm9yRWFjaChub2RlLnNlbGZFZGdlcyxmdW5jdGlvbihzZWxmRWRnZSl7dXRpbC5hZGREdW1teU5vZGUoZywic2VsZmVkZ2UiLHt3aWR0aDpzZWxmRWRnZS5sYWJlbC53aWR0aCxoZWlnaHQ6c2VsZkVkZ2UubGFiZWwuaGVpZ2h0LHJhbms6bm9kZS5yYW5rLG9yZGVyOmkrICsrb3JkZXJTaGlmdCwKZTpzZWxmRWRnZS5lLGxhYmVsOnNlbGZFZGdlLmxhYmVsfSwiX3NlIil9KTtkZWxldGUgbm9kZS5zZWxmRWRnZXN9KX0pfWZ1bmN0aW9uIHBvc2l0aW9uU2VsZkVkZ2VzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0ic2VsZmVkZ2UiKXt2YXIgc2VsZk5vZGU9Zy5ub2RlKG5vZGUuZS52KSx4PXNlbGZOb2RlLngrc2VsZk5vZGUud2lkdGgvMix5PXNlbGZOb2RlLnksZHg9bm9kZS54LXgsZHk9c2VsZk5vZGUuaGVpZ2h0LzI7Zy5zZXRFZGdlKG5vZGUuZSxub2RlLmxhYmVsKTtnLnJlbW92ZU5vZGUodik7bm9kZS5sYWJlbC5wb2ludHM9W3t4OngrMipkeC8zLHk6eS1keX0se3g6eCs1KmR4LzYseTp5LWR5fSx7eDp4K2R4LHk6eX0se3g6eCs1KmR4LzYseTp5K2R5fSx7eDp4KzIqZHgvMyx5OnkrZHl9XTtub2RlLmxhYmVsLng9bm9kZS54O25vZGUubGFiZWwueT1ub2RlLnl9fSl9ZnVuY3Rpb24gc2VsZWN0TnVtYmVyQXR0cnMob2JqLAphdHRycyl7cmV0dXJuIF8ubWFwVmFsdWVzKF8ucGljayhvYmosYXR0cnMpLE51bWJlcil9ZnVuY3Rpb24gY2Fub25pY2FsaXplKGF0dHJzKXt2YXIgbmV3QXR0cnM9e307Xy5mb3JFYWNoKGF0dHJzLGZ1bmN0aW9uKHYsayl7bmV3QXR0cnNbay50b0xvd2VyQ2FzZSgpXT12fSk7cmV0dXJuIG5ld0F0dHJzfX0seyIuL2FjeWNsaWMiOjIsIi4vYWRkLWJvcmRlci1zZWdtZW50cyI6MywiLi9jb29yZGluYXRlLXN5c3RlbSI6NCwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwLCIuL25lc3RpbmctZ3JhcGgiOjExLCIuL25vcm1hbGl6ZSI6MTIsIi4vb3JkZXIiOjE3LCIuL3BhcmVudC1kdW1teS1jaGFpbnMiOjIyLCIuL3Bvc2l0aW9uIjoyNCwiLi9yYW5rIjoyNiwiLi91dGlsIjoyOX1dLDEwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbG9kYXNoO2lmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7bG9kYXNoPXJlcXVpcmUoImxvZGFzaCIpfWNhdGNoKGUpe31pZighbG9kYXNoKWxvZGFzaD0Kd2luZG93Ll87bW9kdWxlLmV4cG9ydHM9bG9kYXNofSx7ImxvZGFzaCI6dW5kZWZpbmVkfV0sMTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bixjbGVhbnVwOmNsZWFudXB9O2Z1bmN0aW9uIHJ1bihnKXt2YXIgcm9vdD11dGlsLmFkZER1bW15Tm9kZShnLCJyb290Iix7fSwiX3Jvb3QiKTt2YXIgZGVwdGhzPXRyZWVEZXB0aHMoZyk7dmFyIGhlaWdodD1fLm1heChfLnZhbHVlcyhkZXB0aHMpKS0xO3ZhciBub2RlU2VwPTIqaGVpZ2h0KzE7Zy5ncmFwaCgpLm5lc3RpbmdSb290PXJvb3Q7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtnLmVkZ2UoZSkubWlubGVuKj1ub2RlU2VwfSk7dmFyIHdlaWdodD1zdW1XZWlnaHRzKGcpKzE7Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLAp3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCl9KTtnLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I9bm9kZVNlcH1mdW5jdGlvbiBkZnMoZyxyb290LG5vZGVTZXAsd2VpZ2h0LGhlaWdodCxkZXB0aHMsdil7dmFyIGNoaWxkcmVuPWcuY2hpbGRyZW4odik7aWYoIWNoaWxkcmVuLmxlbmd0aCl7aWYodiE9PXJvb3QpZy5zZXRFZGdlKHJvb3Qsdix7d2VpZ2h0OjAsbWlubGVuOm5vZGVTZXB9KTtyZXR1cm59dmFyIHRvcD11dGlsLmFkZEJvcmRlck5vZGUoZywiX2J0IiksYm90dG9tPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYmIiKSxsYWJlbD1nLm5vZGUodik7Zy5zZXRQYXJlbnQodG9wLHYpO2xhYmVsLmJvcmRlclRvcD10b3A7Zy5zZXRQYXJlbnQoYm90dG9tLHYpO2xhYmVsLmJvcmRlckJvdHRvbT1ib3R0b207Xy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpO3ZhciBjaGlsZE5vZGU9Zy5ub2RlKGNoaWxkKSwKY2hpbGRUb3A9Y2hpbGROb2RlLmJvcmRlclRvcD9jaGlsZE5vZGUuYm9yZGVyVG9wOmNoaWxkLGNoaWxkQm90dG9tPWNoaWxkTm9kZS5ib3JkZXJCb3R0b20/Y2hpbGROb2RlLmJvcmRlckJvdHRvbTpjaGlsZCx0aGlzV2VpZ2h0PWNoaWxkTm9kZS5ib3JkZXJUb3A/d2VpZ2h0OjIqd2VpZ2h0LG1pbmxlbj1jaGlsZFRvcCE9PWNoaWxkQm90dG9tPzE6aGVpZ2h0LWRlcHRoc1t2XSsxO2cuc2V0RWRnZSh0b3AsY2hpbGRUb3Ase3dlaWdodDp0aGlzV2VpZ2h0LG1pbmxlbjptaW5sZW4sbmVzdGluZ0VkZ2U6dHJ1ZX0pO2cuc2V0RWRnZShjaGlsZEJvdHRvbSxib3R0b20se3dlaWdodDp0aGlzV2VpZ2h0LG1pbmxlbjptaW5sZW4sbmVzdGluZ0VkZ2U6dHJ1ZX0pfSk7aWYoIWcucGFyZW50KHYpKWcuc2V0RWRnZShyb290LHRvcCx7d2VpZ2h0OjAsbWlubGVuOmhlaWdodCtkZXB0aHNbdl19KX1mdW5jdGlvbiB0cmVlRGVwdGhzKGcpe3ZhciBkZXB0aHM9e307ZnVuY3Rpb24gZGZzKHYsZGVwdGgpe3ZhciBjaGlsZHJlbj0KZy5jaGlsZHJlbih2KTtpZihjaGlsZHJlbiYmY2hpbGRyZW4ubGVuZ3RoKV8uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGNoaWxkLGRlcHRoKzEpfSk7ZGVwdGhzW3ZdPWRlcHRofV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24odil7ZGZzKHYsMSl9KTtyZXR1cm4gZGVwdGhzfWZ1bmN0aW9uIHN1bVdlaWdodHMoZyl7cmV0dXJuIF8ucmVkdWNlKGcuZWRnZXMoKSxmdW5jdGlvbihhY2MsZSl7cmV0dXJuIGFjYytnLmVkZ2UoZSkud2VpZ2h0fSwwKX1mdW5jdGlvbiBjbGVhbnVwKGcpe3ZhciBncmFwaExhYmVsPWcuZ3JhcGgoKTtnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7ZGVsZXRlIGdyYXBoTGFiZWwubmVzdGluZ1Jvb3Q7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5uZXN0aW5nRWRnZSlnLnJlbW92ZUVkZ2UoZSl9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sCjEyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sdW5kbzp1bmRvfTtmdW5jdGlvbiBydW4oZyl7Zy5ncmFwaCgpLmR1bW15Q2hhaW5zPVtdO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZWRnZSl7bm9ybWFsaXplRWRnZShnLGVkZ2UpfSl9ZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLGUpe3ZhciB2PWUudix2UmFuaz1nLm5vZGUodikucmFuayx3PWUudyx3UmFuaz1nLm5vZGUodykucmFuayxuYW1lPWUubmFtZSxlZGdlTGFiZWw9Zy5lZGdlKGUpLGxhYmVsUmFuaz1lZGdlTGFiZWwubGFiZWxSYW5rO2lmKHdSYW5rPT09dlJhbmsrMSlyZXR1cm47Zy5yZW1vdmVFZGdlKGUpO3ZhciBkdW1teSxhdHRycyxpO2ZvcihpPTAsKyt2UmFuazt2UmFuazx3UmFuazsrK2ksKyt2UmFuayl7ZWRnZUxhYmVsLnBvaW50cz1bXTthdHRycz17d2lkdGg6MCwKaGVpZ2h0OjAsZWRnZUxhYmVsOmVkZ2VMYWJlbCxlZGdlT2JqOmUscmFuazp2UmFua307ZHVtbXk9dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZSIsYXR0cnMsIl9kIik7aWYodlJhbms9PT1sYWJlbFJhbmspe2F0dHJzLndpZHRoPWVkZ2VMYWJlbC53aWR0aDthdHRycy5oZWlnaHQ9ZWRnZUxhYmVsLmhlaWdodDthdHRycy5kdW1teT0iZWRnZS1sYWJlbCI7YXR0cnMubGFiZWxwb3M9ZWRnZUxhYmVsLmxhYmVscG9zfWcuc2V0RWRnZSh2LGR1bW15LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSk7aWYoaT09PTApZy5ncmFwaCgpLmR1bW15Q2hhaW5zLnB1c2goZHVtbXkpO3Y9ZHVtbXl9Zy5zZXRFZGdlKHYsdyx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksb3JpZ0xhYmVsPW5vZGUuZWRnZUxhYmVsLHc7Zy5zZXRFZGdlKG5vZGUuZWRnZU9iaiwKb3JpZ0xhYmVsKTt3aGlsZShub2RlLmR1bW15KXt3PWcuc3VjY2Vzc29ycyh2KVswXTtnLnJlbW92ZU5vZGUodik7b3JpZ0xhYmVsLnBvaW50cy5wdXNoKHt4Om5vZGUueCx5Om5vZGUueX0pO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1sYWJlbCIpe29yaWdMYWJlbC54PW5vZGUueDtvcmlnTGFiZWwueT1ub2RlLnk7b3JpZ0xhYmVsLndpZHRoPW5vZGUud2lkdGg7b3JpZ0xhYmVsLmhlaWdodD1ub2RlLmhlaWdodH12PXc7bm9kZT1nLm5vZGUodil9fSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDEzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1hZGRTdWJncmFwaENvbnN0cmFpbnRzO2Z1bmN0aW9uIGFkZFN1YmdyYXBoQ29uc3RyYWludHMoZyxjZyx2cyl7dmFyIHByZXY9e30scm9vdFByZXY7Xy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBjaGlsZD1nLnBhcmVudCh2KSxwYXJlbnQsCnByZXZDaGlsZDt3aGlsZShjaGlsZCl7cGFyZW50PWcucGFyZW50KGNoaWxkKTtpZihwYXJlbnQpe3ByZXZDaGlsZD1wcmV2W3BhcmVudF07cHJldltwYXJlbnRdPWNoaWxkfWVsc2V7cHJldkNoaWxkPXJvb3RQcmV2O3Jvb3RQcmV2PWNoaWxkfWlmKHByZXZDaGlsZCYmcHJldkNoaWxkIT09Y2hpbGQpe2NnLnNldEVkZ2UocHJldkNoaWxkLGNoaWxkKTtyZXR1cm59Y2hpbGQ9cGFyZW50fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWJhcnljZW50ZXI7ZnVuY3Rpb24gYmFyeWNlbnRlcihnLG1vdmFibGUpe3JldHVybiBfLm1hcChtb3ZhYmxlLGZ1bmN0aW9uKHYpe3ZhciBpblY9Zy5pbkVkZ2VzKHYpO2lmKCFpblYubGVuZ3RoKXJldHVybnt2OnZ9O2Vsc2V7dmFyIHJlc3VsdD1fLnJlZHVjZShpblYsZnVuY3Rpb24oYWNjLGUpe3ZhciBlZGdlPWcuZWRnZShlKSwKbm9kZVU9Zy5ub2RlKGUudik7cmV0dXJue3N1bTphY2Muc3VtK2VkZ2Uud2VpZ2h0Km5vZGVVLm9yZGVyLHdlaWdodDphY2Mud2VpZ2h0K2VkZ2Uud2VpZ2h0fX0se3N1bTowLHdlaWdodDowfSk7cmV0dXJue3Y6dixiYXJ5Y2VudGVyOnJlc3VsdC5zdW0vcmVzdWx0LndlaWdodCx3ZWlnaHQ6cmVzdWx0LndlaWdodH19fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1idWlsZExheWVyR3JhcGg7ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBoKGcscmFuayxyZWxhdGlvbnNoaXApe3ZhciByb290PWNyZWF0ZVJvb3ROb2RlKGcpLHJlc3VsdD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlfSkpLnNldEdyYXBoKHtyb290OnJvb3R9KS5zZXREZWZhdWx0Tm9kZUxhYmVsKGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodil9KTsKXy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscGFyZW50PWcucGFyZW50KHYpO2lmKG5vZGUucmFuaz09PXJhbmt8fG5vZGUubWluUmFuazw9cmFuayYmcmFuazw9bm9kZS5tYXhSYW5rKXtyZXN1bHQuc2V0Tm9kZSh2KTtyZXN1bHQuc2V0UGFyZW50KHYscGFyZW50fHxyb290KTtfLmZvckVhY2goZ1tyZWxhdGlvbnNoaXBdKHYpLGZ1bmN0aW9uKGUpe3ZhciB1PWUudj09PXY/ZS53OmUudixlZGdlPXJlc3VsdC5lZGdlKHUsdiksd2VpZ2h0PSFfLmlzVW5kZWZpbmVkKGVkZ2UpP2VkZ2Uud2VpZ2h0OjA7cmVzdWx0LnNldEVkZ2UodSx2LHt3ZWlnaHQ6Zy5lZGdlKGUpLndlaWdodCt3ZWlnaHR9KX0pO2lmKF8uaGFzKG5vZGUsIm1pblJhbmsiKSlyZXN1bHQuc2V0Tm9kZSh2LHtib3JkZXJMZWZ0Om5vZGUuYm9yZGVyTGVmdFtyYW5rXSxib3JkZXJSaWdodDpub2RlLmJvcmRlclJpZ2h0W3JhbmtdfSl9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjcmVhdGVSb290Tm9kZShnKXt2YXIgdjsKd2hpbGUoZy5oYXNOb2RlKHY9Xy51bmlxdWVJZCgiX3Jvb3QiKSkpO3JldHVybiB2fX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMH1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1jcm9zc0NvdW50O2Z1bmN0aW9uIGNyb3NzQ291bnQoZyxsYXllcmluZyl7dmFyIGNjPTA7Zm9yKHZhciBpPTE7aTxsYXllcmluZy5sZW5ndGg7KytpKWNjKz10d29MYXllckNyb3NzQ291bnQoZyxsYXllcmluZ1tpLTFdLGxheWVyaW5nW2ldKTtyZXR1cm4gY2N9ZnVuY3Rpb24gdHdvTGF5ZXJDcm9zc0NvdW50KGcsbm9ydGhMYXllcixzb3V0aExheWVyKXt2YXIgc291dGhQb3M9Xy56aXBPYmplY3Qoc291dGhMYXllcixfLm1hcChzb3V0aExheWVyLGZ1bmN0aW9uKHYsaSl7cmV0dXJuIGl9KSk7dmFyIHNvdXRoRW50cmllcz1fLmZsYXR0ZW4oXy5tYXAobm9ydGhMYXllcixmdW5jdGlvbih2KXtyZXR1cm4gXy5jaGFpbihnLm91dEVkZ2VzKHYpKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3Bvczpzb3V0aFBvc1tlLnddLAp3ZWlnaHQ6Zy5lZGdlKGUpLndlaWdodH19KS5zb3J0QnkoInBvcyIpLnZhbHVlKCl9KSx0cnVlKTt2YXIgZmlyc3RJbmRleD0xO3doaWxlKGZpcnN0SW5kZXg8c291dGhMYXllci5sZW5ndGgpZmlyc3RJbmRleDw8PTE7dmFyIHRyZWVTaXplPTIqZmlyc3RJbmRleC0xO2ZpcnN0SW5kZXgtPTE7dmFyIHRyZWU9Xy5tYXAobmV3IEFycmF5KHRyZWVTaXplKSxmdW5jdGlvbigpe3JldHVybiAwfSk7dmFyIGNjPTA7Xy5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KXt2YXIgaW5kZXg9ZW50cnkucG9zK2ZpcnN0SW5kZXg7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodDt2YXIgd2VpZ2h0U3VtPTA7d2hpbGUoaW5kZXg+MCl7aWYoaW5kZXglMil3ZWlnaHRTdW0rPXRyZWVbaW5kZXgrMV07aW5kZXg9aW5kZXgtMT4+MTt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0fWNjKz1lbnRyeS53ZWlnaHQqd2VpZ2h0U3VtfSkpO3JldHVybiBjY319LHsiLi4vbG9kYXNoIjoxMH1dLAoxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksaW5pdE9yZGVyPXJlcXVpcmUoIi4vaW5pdC1vcmRlciIpLGNyb3NzQ291bnQ9cmVxdWlyZSgiLi9jcm9zcy1jb3VudCIpLHNvcnRTdWJncmFwaD1yZXF1aXJlKCIuL3NvcnQtc3ViZ3JhcGgiKSxidWlsZExheWVyR3JhcGg9cmVxdWlyZSgiLi9idWlsZC1sYXllci1ncmFwaCIpLGFkZFN1YmdyYXBoQ29uc3RyYWludHM9cmVxdWlyZSgiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHMiKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPW9yZGVyO2Z1bmN0aW9uIG9yZGVyKGcpe3ZhciBtYXhSYW5rPXV0aWwubWF4UmFuayhnKSxkb3duTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLF8ucmFuZ2UoMSxtYXhSYW5rKzEpLCJpbkVkZ2VzIiksdXBMYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsCl8ucmFuZ2UobWF4UmFuay0xLC0xLC0xKSwib3V0RWRnZXMiKTt2YXIgbGF5ZXJpbmc9aW5pdE9yZGVyKGcpO2Fzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpO3ZhciBiZXN0Q0M9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGJlc3Q7Zm9yKHZhciBpPTAsbGFzdEJlc3Q9MDtsYXN0QmVzdDw0OysraSwrK2xhc3RCZXN0KXtzd2VlcExheWVyR3JhcGhzKGklMj9kb3duTGF5ZXJHcmFwaHM6dXBMYXllckdyYXBocyxpJTQ+PTIpO2xheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgY2M9Y3Jvc3NDb3VudChnLGxheWVyaW5nKTtpZihjYzxiZXN0Q0Mpe2xhc3RCZXN0PTA7YmVzdD1fLmNsb25lRGVlcChsYXllcmluZyk7YmVzdENDPWNjfX1hc3NpZ25PcmRlcihnLGJlc3QpfWZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaHMoZyxyYW5rcyxyZWxhdGlvbnNoaXApe3JldHVybiBfLm1hcChyYW5rcyxmdW5jdGlvbihyYW5rKXtyZXR1cm4gYnVpbGRMYXllckdyYXBoKGcscmFuayxyZWxhdGlvbnNoaXApfSl9CmZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsYmlhc1JpZ2h0KXt2YXIgY2c9bmV3IEdyYXBoO18uZm9yRWFjaChsYXllckdyYXBocyxmdW5jdGlvbihsZyl7dmFyIHJvb3Q9bGcuZ3JhcGgoKS5yb290O3ZhciBzb3J0ZWQ9c29ydFN1YmdyYXBoKGxnLHJvb3QsY2csYmlhc1JpZ2h0KTtfLmZvckVhY2goc29ydGVkLnZzLGZ1bmN0aW9uKHYsaSl7bGcubm9kZSh2KS5vcmRlcj1pfSk7YWRkU3ViZ3JhcGhDb25zdHJhaW50cyhsZyxjZyxzb3J0ZWQudnMpfSl9ZnVuY3Rpb24gYXNzaWduT3JkZXIoZyxsYXllcmluZyl7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXtnLm5vZGUodikub3JkZXI9aX0pfSl9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9hZGQtc3ViZ3JhcGgtY29uc3RyYWludHMiOjEzLCIuL2J1aWxkLWxheWVyLWdyYXBoIjoxNSwiLi9jcm9zcy1jb3VudCI6MTYsCiIuL2luaXQtb3JkZXIiOjE4LCIuL3NvcnQtc3ViZ3JhcGgiOjIwfV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWluaXRPcmRlcjtmdW5jdGlvbiBpbml0T3JkZXIoZyl7dmFyIHZpc2l0ZWQ9e30sc2ltcGxlTm9kZXM9Xy5maWx0ZXIoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLmNoaWxkcmVuKHYpLmxlbmd0aH0pLG1heFJhbms9Xy5tYXgoXy5tYXAoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpLGxheWVycz1fLm1hcChfLnJhbmdlKG1heFJhbmsrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7dmFyIG5vZGU9Zy5ub2RlKHYpO2xheWVyc1tub2RlLnJhbmtdLnB1c2godik7Xy5mb3JFYWNoKGcuc3VjY2Vzc29ycyh2KSxkZnMpfXZhciBvcmRlcmVkVnM9Cl8uc29ydEJ5KHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pO18uZm9yRWFjaChvcmRlcmVkVnMsZGZzKTtyZXR1cm4gbGF5ZXJzfX0seyIuLi9sb2Rhc2giOjEwfV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXJlc29sdmVDb25mbGljdHM7ZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0cyhlbnRyaWVzLGNnKXt2YXIgbWFwcGVkRW50cmllcz17fTtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSxpKXt2YXIgdG1wPW1hcHBlZEVudHJpZXNbZW50cnkudl09e2luZGVncmVlOjAsImluIjpbXSxvdXQ6W10sdnM6W2VudHJ5LnZdLGk6aX07aWYoIV8uaXNVbmRlZmluZWQoZW50cnkuYmFyeWNlbnRlcikpe3RtcC5iYXJ5Y2VudGVyPWVudHJ5LmJhcnljZW50ZXI7dG1wLndlaWdodD1lbnRyeS53ZWlnaHR9fSk7Xy5mb3JFYWNoKGNnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVudHJ5Vj0KbWFwcGVkRW50cmllc1tlLnZdLGVudHJ5Vz1tYXBwZWRFbnRyaWVzW2Uud107aWYoIV8uaXNVbmRlZmluZWQoZW50cnlWKSYmIV8uaXNVbmRlZmluZWQoZW50cnlXKSl7ZW50cnlXLmluZGVncmVlKys7ZW50cnlWLm91dC5wdXNoKG1hcHBlZEVudHJpZXNbZS53XSl9fSk7dmFyIHNvdXJjZVNldD1fLmZpbHRlcihtYXBwZWRFbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4hZW50cnkuaW5kZWdyZWV9KTtyZXR1cm4gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCl9ZnVuY3Rpb24gZG9SZXNvbHZlQ29uZmxpY3RzKHNvdXJjZVNldCl7dmFyIGVudHJpZXM9W107ZnVuY3Rpb24gaGFuZGxlSW4odkVudHJ5KXtyZXR1cm4gZnVuY3Rpb24odUVudHJ5KXtpZih1RW50cnkubWVyZ2VkKXJldHVybjtpZihfLmlzVW5kZWZpbmVkKHVFbnRyeS5iYXJ5Y2VudGVyKXx8Xy5pc1VuZGVmaW5lZCh2RW50cnkuYmFyeWNlbnRlcil8fHVFbnRyeS5iYXJ5Y2VudGVyPj12RW50cnkuYmFyeWNlbnRlciltZXJnZUVudHJpZXModkVudHJ5LAp1RW50cnkpfX1mdW5jdGlvbiBoYW5kbGVPdXQodkVudHJ5KXtyZXR1cm4gZnVuY3Rpb24od0VudHJ5KXt3RW50cnlbImluIl0ucHVzaCh2RW50cnkpO2lmKC0td0VudHJ5LmluZGVncmVlPT09MClzb3VyY2VTZXQucHVzaCh3RW50cnkpfX13aGlsZShzb3VyY2VTZXQubGVuZ3RoKXt2YXIgZW50cnk9c291cmNlU2V0LnBvcCgpO2VudHJpZXMucHVzaChlbnRyeSk7Xy5mb3JFYWNoKGVudHJ5WyJpbiJdLnJldmVyc2UoKSxoYW5kbGVJbihlbnRyeSkpO18uZm9yRWFjaChlbnRyeS5vdXQsaGFuZGxlT3V0KGVudHJ5KSl9cmV0dXJuIF8uY2hhaW4oZW50cmllcykuZmlsdGVyKGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4hZW50cnkubWVyZ2VkfSkubWFwKGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5waWNrKGVudHJ5LFsidnMiLCJpIiwiYmFyeWNlbnRlciIsIndlaWdodCJdKX0pLnZhbHVlKCl9ZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCxzb3VyY2Upe3ZhciBzdW09MCx3ZWlnaHQ9MDsKaWYodGFyZ2V0LndlaWdodCl7c3VtKz10YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0O3dlaWdodCs9dGFyZ2V0LndlaWdodH1pZihzb3VyY2Uud2VpZ2h0KXtzdW0rPXNvdXJjZS5iYXJ5Y2VudGVyKnNvdXJjZS53ZWlnaHQ7d2VpZ2h0Kz1zb3VyY2Uud2VpZ2h0fXRhcmdldC52cz1zb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7dGFyZ2V0LmJhcnljZW50ZXI9c3VtL3dlaWdodDt0YXJnZXQud2VpZ2h0PXdlaWdodDt0YXJnZXQuaT1NYXRoLm1pbihzb3VyY2UuaSx0YXJnZXQuaSk7c291cmNlLm1lcmdlZD10cnVlfX0seyIuLi9sb2Rhc2giOjEwfV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGJhcnljZW50ZXI9cmVxdWlyZSgiLi9iYXJ5Y2VudGVyIikscmVzb2x2ZUNvbmZsaWN0cz1yZXF1aXJlKCIuL3Jlc29sdmUtY29uZmxpY3RzIiksc29ydD1yZXF1aXJlKCIuL3NvcnQiKTttb2R1bGUuZXhwb3J0cz0Kc29ydFN1YmdyYXBoO2Z1bmN0aW9uIHNvcnRTdWJncmFwaChnLHYsY2csYmlhc1JpZ2h0KXt2YXIgbW92YWJsZT1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpLGJsPW5vZGU/bm9kZS5ib3JkZXJMZWZ0OnVuZGVmaW5lZCxicj1ub2RlP25vZGUuYm9yZGVyUmlnaHQ6dW5kZWZpbmVkLHN1YmdyYXBocz17fTtpZihibCltb3ZhYmxlPV8uZmlsdGVyKG1vdmFibGUsZnVuY3Rpb24odyl7cmV0dXJuIHchPT1ibCYmdyE9PWJyfSk7dmFyIGJhcnljZW50ZXJzPWJhcnljZW50ZXIoZyxtb3ZhYmxlKTtfLmZvckVhY2goYmFyeWNlbnRlcnMsZnVuY3Rpb24oZW50cnkpe2lmKGcuY2hpbGRyZW4oZW50cnkudikubGVuZ3RoKXt2YXIgc3ViZ3JhcGhSZXN1bHQ9c29ydFN1YmdyYXBoKGcsZW50cnkudixjZyxiaWFzUmlnaHQpO3N1YmdyYXBoc1tlbnRyeS52XT1zdWJncmFwaFJlc3VsdDtpZihfLmhhcyhzdWJncmFwaFJlc3VsdCwiYmFyeWNlbnRlciIpKW1lcmdlQmFyeWNlbnRlcnMoZW50cnksCnN1YmdyYXBoUmVzdWx0KX19KTt2YXIgZW50cmllcz1yZXNvbHZlQ29uZmxpY3RzKGJhcnljZW50ZXJzLGNnKTtleHBhbmRTdWJncmFwaHMoZW50cmllcyxzdWJncmFwaHMpO3ZhciByZXN1bHQ9c29ydChlbnRyaWVzLGJpYXNSaWdodCk7aWYoYmwpe3Jlc3VsdC52cz1fLmZsYXR0ZW4oW2JsLHJlc3VsdC52cyxicl0sdHJ1ZSk7aWYoZy5wcmVkZWNlc3NvcnMoYmwpLmxlbmd0aCl7dmFyIGJsUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYmwpWzBdKSxiclByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJyKVswXSk7aWYoIV8uaGFzKHJlc3VsdCwiYmFyeWNlbnRlciIpKXtyZXN1bHQuYmFyeWNlbnRlcj0wO3Jlc3VsdC53ZWlnaHQ9MH1yZXN1bHQuYmFyeWNlbnRlcj0ocmVzdWx0LmJhcnljZW50ZXIqcmVzdWx0LndlaWdodCtibFByZWQub3JkZXIrYnJQcmVkLm9yZGVyKS8ocmVzdWx0LndlaWdodCsyKTtyZXN1bHQud2VpZ2h0Kz0yfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLApzdWJncmFwaHMpe18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtlbnRyeS52cz1fLmZsYXR0ZW4oZW50cnkudnMubWFwKGZ1bmN0aW9uKHYpe2lmKHN1YmdyYXBoc1t2XSlyZXR1cm4gc3ViZ3JhcGhzW3ZdLnZzO3JldHVybiB2fSksdHJ1ZSl9KX1mdW5jdGlvbiBtZXJnZUJhcnljZW50ZXJzKHRhcmdldCxvdGhlcil7aWYoIV8uaXNVbmRlZmluZWQodGFyZ2V0LmJhcnljZW50ZXIpKXt0YXJnZXQuYmFyeWNlbnRlcj0odGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodCtvdGhlci5iYXJ5Y2VudGVyKm90aGVyLndlaWdodCkvKHRhcmdldC53ZWlnaHQrb3RoZXIud2VpZ2h0KTt0YXJnZXQud2VpZ2h0Kz1vdGhlci53ZWlnaHR9ZWxzZXt0YXJnZXQuYmFyeWNlbnRlcj1vdGhlci5iYXJ5Y2VudGVyO3RhcmdldC53ZWlnaHQ9b3RoZXIud2VpZ2h0fX19LHsiLi4vbG9kYXNoIjoxMCwiLi9iYXJ5Y2VudGVyIjoxNCwiLi9yZXNvbHZlLWNvbmZsaWN0cyI6MTksIi4vc29ydCI6MjF9XSwKMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXNvcnQ7ZnVuY3Rpb24gc29ydChlbnRyaWVzLGJpYXNSaWdodCl7dmFyIHBhcnRzPXV0aWwucGFydGl0aW9uKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLmhhcyhlbnRyeSwiYmFyeWNlbnRlciIpfSk7dmFyIHNvcnRhYmxlPXBhcnRzLmxocyx1bnNvcnRhYmxlPV8uc29ydEJ5KHBhcnRzLnJocyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuLWVudHJ5Lml9KSx2cz1bXSxzdW09MCx3ZWlnaHQ9MCx2c0luZGV4PTA7c29ydGFibGUuc29ydChjb21wYXJlV2l0aEJpYXMoISFiaWFzUmlnaHQpKTt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCk7Xy5mb3JFYWNoKHNvcnRhYmxlLGZ1bmN0aW9uKGVudHJ5KXt2c0luZGV4Kz1lbnRyeS52cy5sZW5ndGg7dnMucHVzaChlbnRyeS52cyk7CnN1bSs9ZW50cnkuYmFyeWNlbnRlciplbnRyeS53ZWlnaHQ7d2VpZ2h0Kz1lbnRyeS53ZWlnaHQ7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpfSk7dmFyIHJlc3VsdD17dnM6Xy5mbGF0dGVuKHZzLHRydWUpfTtpZih3ZWlnaHQpe3Jlc3VsdC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7cmVzdWx0LndlaWdodD13ZWlnaHR9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLGluZGV4KXt2YXIgbGFzdDt3aGlsZSh1bnNvcnRhYmxlLmxlbmd0aCYmKGxhc3Q9Xy5sYXN0KHVuc29ydGFibGUpKS5pPD1pbmRleCl7dW5zb3J0YWJsZS5wb3AoKTt2cy5wdXNoKGxhc3QudnMpO2luZGV4Kyt9cmV0dXJuIGluZGV4fWZ1bmN0aW9uIGNvbXBhcmVXaXRoQmlhcyhiaWFzKXtyZXR1cm4gZnVuY3Rpb24oZW50cnlWLGVudHJ5Vyl7aWYoZW50cnlWLmJhcnljZW50ZXI8ZW50cnlXLmJhcnljZW50ZXIpcmV0dXJuLTE7ZWxzZSBpZihlbnRyeVYuYmFyeWNlbnRlcj4KZW50cnlXLmJhcnljZW50ZXIpcmV0dXJuIDE7cmV0dXJuIWJpYXM/ZW50cnlWLmktZW50cnlXLmk6ZW50cnlXLmktZW50cnlWLml9fX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDIyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXBhcmVudER1bW15Q2hhaW5zO2Z1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpe3ZhciBwb3N0b3JkZXJOdW1zPXBvc3RvcmRlcihnKTtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxlZGdlT2JqPW5vZGUuZWRnZU9iaixwYXRoRGF0YT1maW5kUGF0aChnLHBvc3RvcmRlck51bXMsZWRnZU9iai52LGVkZ2VPYmoudykscGF0aD1wYXRoRGF0YS5wYXRoLGxjYT1wYXRoRGF0YS5sY2EscGF0aElkeD0wLHBhdGhWPXBhdGhbcGF0aElkeF0sYXNjZW5kaW5nPXRydWU7d2hpbGUodiE9PWVkZ2VPYmoudyl7bm9kZT0KZy5ub2RlKHYpO2lmKGFzY2VuZGluZyl7d2hpbGUoKHBhdGhWPXBhdGhbcGF0aElkeF0pIT09bGNhJiZnLm5vZGUocGF0aFYpLm1heFJhbms8bm9kZS5yYW5rKXBhdGhJZHgrKztpZihwYXRoVj09PWxjYSlhc2NlbmRpbmc9ZmFsc2V9aWYoIWFzY2VuZGluZyl7d2hpbGUocGF0aElkeDxwYXRoLmxlbmd0aC0xJiZnLm5vZGUocGF0aFY9cGF0aFtwYXRoSWR4KzFdKS5taW5SYW5rPD1ub2RlLnJhbmspcGF0aElkeCsrO3BhdGhWPXBhdGhbcGF0aElkeF19Zy5zZXRQYXJlbnQodixwYXRoVik7dj1nLnN1Y2Nlc3NvcnModilbMF19fSl9ZnVuY3Rpb24gZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLHYsdyl7dmFyIHZQYXRoPVtdLHdQYXRoPVtdLGxvdz1NYXRoLm1pbihwb3N0b3JkZXJOdW1zW3ZdLmxvdyxwb3N0b3JkZXJOdW1zW3ddLmxvdyksbGltPU1hdGgubWF4KHBvc3RvcmRlck51bXNbdl0ubGltLHBvc3RvcmRlck51bXNbd10ubGltKSxwYXJlbnQsbGNhO3BhcmVudD12O2Rve3BhcmVudD0KZy5wYXJlbnQocGFyZW50KTt2UGF0aC5wdXNoKHBhcmVudCl9d2hpbGUocGFyZW50JiYocG9zdG9yZGVyTnVtc1twYXJlbnRdLmxvdz5sb3d8fGxpbT5wb3N0b3JkZXJOdW1zW3BhcmVudF0ubGltKSk7bGNhPXBhcmVudDtwYXJlbnQ9dzt3aGlsZSgocGFyZW50PWcucGFyZW50KHBhcmVudCkpIT09bGNhKXdQYXRoLnB1c2gocGFyZW50KTtyZXR1cm57cGF0aDp2UGF0aC5jb25jYXQod1BhdGgucmV2ZXJzZSgpKSxsY2E6bGNhfX1mdW5jdGlvbiBwb3N0b3JkZXIoZyl7dmFyIHJlc3VsdD17fSxsaW09MDtmdW5jdGlvbiBkZnModil7dmFyIGxvdz1saW07Xy5mb3JFYWNoKGcuY2hpbGRyZW4odiksZGZzKTtyZXN1bHRbdl09e2xvdzpsb3csbGltOmxpbSsrfX1fLmZvckVhY2goZy5jaGlsZHJlbigpLGRmcyk7cmV0dXJuIHJlc3VsdH19LHsiLi9sb2Rhc2giOjEwfV0sMjM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPQpyZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtwb3NpdGlvblg6cG9zaXRpb25YLGZpbmRUeXBlMUNvbmZsaWN0czpmaW5kVHlwZTFDb25mbGljdHMsZmluZFR5cGUyQ29uZmxpY3RzOmZpbmRUeXBlMkNvbmZsaWN0cyxhZGRDb25mbGljdDphZGRDb25mbGljdCxoYXNDb25mbGljdDpoYXNDb25mbGljdCx2ZXJ0aWNhbEFsaWdubWVudDp2ZXJ0aWNhbEFsaWdubWVudCxob3Jpem9udGFsQ29tcGFjdGlvbjpob3Jpem9udGFsQ29tcGFjdGlvbixhbGlnbkNvb3JkaW5hdGVzOmFsaWduQ29vcmRpbmF0ZXMsZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQ6ZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsYmFsYW5jZTpiYWxhbmNlfTtmdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiB2aXNpdExheWVyKHByZXZMYXllcixsYXllcil7dmFyIGswPTAsc2NhblBvcz0KMCxwcmV2TGF5ZXJMZW5ndGg9cHJldkxheWVyLmxlbmd0aCxsYXN0Tm9kZT1fLmxhc3QobGF5ZXIpO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciB3PWZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KSxrMT13P2cubm9kZSh3KS5vcmRlcjpwcmV2TGF5ZXJMZW5ndGg7aWYod3x8dj09PWxhc3ROb2RlKXtfLmZvckVhY2gobGF5ZXIuc2xpY2Uoc2NhblBvcyxpKzEpLGZ1bmN0aW9uKHNjYW5Ob2RlKXtfLmZvckVhY2goZy5wcmVkZWNlc3NvcnMoc2Nhbk5vZGUpLGZ1bmN0aW9uKHUpe3ZhciB1TGFiZWw9Zy5ub2RlKHUpLHVQb3M9dUxhYmVsLm9yZGVyO2lmKCh1UG9zPGswfHxrMTx1UG9zKSYmISh1TGFiZWwuZHVtbXkmJmcubm9kZShzY2FuTm9kZSkuZHVtbXkpKWFkZENvbmZsaWN0KGNvbmZsaWN0cyx1LHNjYW5Ob2RlKX0pfSk7c2NhblBvcz1pKzE7azA9azF9fSk7cmV0dXJuIGxheWVyfV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9CmZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHNjYW4oc291dGgsc291dGhQb3Msc291dGhFbmQscHJldk5vcnRoQm9yZGVyLG5leHROb3J0aEJvcmRlcil7dmFyIHY7Xy5mb3JFYWNoKF8ucmFuZ2Uoc291dGhQb3Msc291dGhFbmQpLGZ1bmN0aW9uKGkpe3Y9c291dGhbaV07aWYoZy5ub2RlKHYpLmR1bW15KV8uZm9yRWFjaChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXt2YXIgdU5vZGU9Zy5ub2RlKHUpO2lmKHVOb2RlLmR1bW15JiYodU5vZGUub3JkZXI8cHJldk5vcnRoQm9yZGVyfHx1Tm9kZS5vcmRlcj5uZXh0Tm9ydGhCb3JkZXIpKWFkZENvbmZsaWN0KGNvbmZsaWN0cyx1LHYpfSl9KX1mdW5jdGlvbiB2aXNpdExheWVyKG5vcnRoLHNvdXRoKXt2YXIgcHJldk5vcnRoUG9zPS0xLG5leHROb3J0aFBvcyxzb3V0aFBvcz0wO18uZm9yRWFjaChzb3V0aCxmdW5jdGlvbih2LHNvdXRoTG9va2FoZWFkKXtpZihnLm5vZGUodikuZHVtbXk9PT0KImJvcmRlciIpe3ZhciBwcmVkZWNlc3NvcnM9Zy5wcmVkZWNlc3NvcnModik7aWYocHJlZGVjZXNzb3JzLmxlbmd0aCl7bmV4dE5vcnRoUG9zPWcubm9kZShwcmVkZWNlc3NvcnNbMF0pLm9yZGVyO3NjYW4oc291dGgsc291dGhQb3Msc291dGhMb29rYWhlYWQscHJldk5vcnRoUG9zLG5leHROb3J0aFBvcyk7c291dGhQb3M9c291dGhMb29rYWhlYWQ7cHJldk5vcnRoUG9zPW5leHROb3J0aFBvc319c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aC5sZW5ndGgsbmV4dE5vcnRoUG9zLG5vcnRoLmxlbmd0aCl9KTtyZXR1cm4gc291dGh9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c31mdW5jdGlvbiBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdil7aWYoZy5ub2RlKHYpLmR1bW15KXJldHVybiBfLmZpbmQoZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7cmV0dXJuIGcubm9kZSh1KS5kdW1teX0pfWZ1bmN0aW9uIGFkZENvbmZsaWN0KGNvbmZsaWN0cywKdix3KXtpZih2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9dmFyIGNvbmZsaWN0c1Y9Y29uZmxpY3RzW3ZdO2lmKCFjb25mbGljdHNWKWNvbmZsaWN0c1t2XT1jb25mbGljdHNWPXt9O2NvbmZsaWN0c1Zbd109dHJ1ZX1mdW5jdGlvbiBoYXNDb25mbGljdChjb25mbGljdHMsdix3KXtpZih2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIF8uaGFzKGNvbmZsaWN0c1t2XSx3KX1mdW5jdGlvbiB2ZXJ0aWNhbEFsaWdubWVudChnLGxheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKXt2YXIgcm9vdD17fSxhbGlnbj17fSxwb3M9e307Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixvcmRlcil7cm9vdFt2XT12O2FsaWduW3ZdPXY7cG9zW3ZdPW9yZGVyfSl9KTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBwcmV2SWR4PS0xO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXt2YXIgd3M9bmVpZ2hib3JGbih2KTsKaWYod3MubGVuZ3RoKXt3cz1fLnNvcnRCeSh3cyxmdW5jdGlvbih3KXtyZXR1cm4gcG9zW3ddfSk7dmFyIG1wPSh3cy5sZW5ndGgtMSkvMjtmb3IodmFyIGk9TWF0aC5mbG9vcihtcCksaWw9TWF0aC5jZWlsKG1wKTtpPD1pbDsrK2kpe3ZhciB3PXdzW2ldO2lmKGFsaWduW3ZdPT09diYmcHJldklkeDxwb3Nbd10mJiFoYXNDb25mbGljdChjb25mbGljdHMsdix3KSl7YWxpZ25bd109djthbGlnblt2XT1yb290W3ZdPXJvb3Rbd107cHJldklkeD1wb3Nbd119fX19KX0pO3JldHVybntyb290OnJvb3QsYWxpZ246YWxpZ259fWZ1bmN0aW9uIGhvcml6b250YWxDb21wYWN0aW9uKGcsbGF5ZXJpbmcscm9vdCxhbGlnbixyZXZlcnNlU2VwKXt2YXIgeHM9e30sYmxvY2tHPWJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCksYm9yZGVyVHlwZT1yZXZlcnNlU2VwPyJib3JkZXJMZWZ0IjoiYm9yZGVyUmlnaHQiO2Z1bmN0aW9uIGl0ZXJhdGUoc2V0WHNGdW5jLG5leHROb2Rlc0Z1bmMpe3ZhciBzdGFjaz0KYmxvY2tHLm5vZGVzKCk7dmFyIGVsZW09c3RhY2sucG9wKCk7dmFyIHZpc2l0ZWQ9e307d2hpbGUoZWxlbSl7aWYodmlzaXRlZFtlbGVtXSlzZXRYc0Z1bmMoZWxlbSk7ZWxzZXt2aXNpdGVkW2VsZW1dPXRydWU7c3RhY2sucHVzaChlbGVtKTtzdGFjaz1zdGFjay5jb25jYXQobmV4dE5vZGVzRnVuYyhlbGVtKSl9ZWxlbT1zdGFjay5wb3AoKX19ZnVuY3Rpb24gcGFzczEoZWxlbSl7eHNbZWxlbV09YmxvY2tHLmluRWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5tYXgoYWNjLHhzW2Uudl0rYmxvY2tHLmVkZ2UoZSkpfSwwKX1mdW5jdGlvbiBwYXNzMihlbGVtKXt2YXIgbWluPWJsb2NrRy5vdXRFZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1pbihhY2MseHNbZS53XS1ibG9ja0cuZWRnZShlKSl9LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7dmFyIG5vZGU9Zy5ub2RlKGVsZW0pO2lmKG1pbiE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmCm5vZGUuYm9yZGVyVHlwZSE9PWJvcmRlclR5cGUpeHNbZWxlbV09TWF0aC5tYXgoeHNbZWxlbV0sbWluKX1pdGVyYXRlKHBhc3MxLF8uYmluZChibG9ja0cucHJlZGVjZXNzb3JzLGJsb2NrRykpO2l0ZXJhdGUocGFzczIsXy5iaW5kKGJsb2NrRy5zdWNjZXNzb3JzLGJsb2NrRykpO18uZm9yRWFjaChhbGlnbixmdW5jdGlvbih2KXt4c1t2XT14c1tyb290W3ZdXX0pO3JldHVybiB4c31mdW5jdGlvbiBidWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApe3ZhciBibG9ja0dyYXBoPW5ldyBHcmFwaCxncmFwaExhYmVsPWcuZ3JhcGgoKSxzZXBGbj1zZXAoZ3JhcGhMYWJlbC5ub2Rlc2VwLGdyYXBoTGFiZWwuZWRnZXNlcCxyZXZlcnNlU2VwKTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciB1O18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXt2YXIgdlJvb3Q9cm9vdFt2XTtibG9ja0dyYXBoLnNldE5vZGUodlJvb3QpO2lmKHUpe3ZhciB1Um9vdD0Kcm9vdFt1XSxwcmV2TWF4PWJsb2NrR3JhcGguZWRnZSh1Um9vdCx2Um9vdCk7YmxvY2tHcmFwaC5zZXRFZGdlKHVSb290LHZSb290LE1hdGgubWF4KHNlcEZuKGcsdix1KSxwcmV2TWF4fHwwKSl9dT12fSl9KTtyZXR1cm4gYmxvY2tHcmFwaH1mdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyl7cmV0dXJuIF8ubWluQnkoXy52YWx1ZXMoeHNzKSxmdW5jdGlvbih4cyl7dmFyIG1heD1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7dmFyIG1pbj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7Xy5mb3JJbih4cyxmdW5jdGlvbih4LHYpe3ZhciBoYWxmV2lkdGg9d2lkdGgoZyx2KS8yO21heD1NYXRoLm1heCh4K2hhbGZXaWR0aCxtYXgpO21pbj1NYXRoLm1pbih4LWhhbGZXaWR0aCxtaW4pfSk7cmV0dXJuIG1heC1taW59KX1mdW5jdGlvbiBhbGlnbkNvb3JkaW5hdGVzKHhzcyxhbGlnblRvKXt2YXIgYWxpZ25Ub1ZhbHM9Xy52YWx1ZXMoYWxpZ25UbyksYWxpZ25Ub01pbj0KXy5taW4oYWxpZ25Ub1ZhbHMpLGFsaWduVG9NYXg9Xy5tYXgoYWxpZ25Ub1ZhbHMpO18uZm9yRWFjaChbInUiLCJkIl0sZnVuY3Rpb24odmVydCl7Xy5mb3JFYWNoKFsibCIsInIiXSxmdW5jdGlvbihob3Jpeil7dmFyIGFsaWdubWVudD12ZXJ0K2hvcml6LHhzPXhzc1thbGlnbm1lbnRdLGRlbHRhO2lmKHhzPT09YWxpZ25UbylyZXR1cm47dmFyIHhzVmFscz1fLnZhbHVlcyh4cyk7ZGVsdGE9aG9yaXo9PT0ibCI/YWxpZ25Ub01pbi1fLm1pbih4c1ZhbHMpOmFsaWduVG9NYXgtXy5tYXgoeHNWYWxzKTtpZihkZWx0YSl4c3NbYWxpZ25tZW50XT1fLm1hcFZhbHVlcyh4cyxmdW5jdGlvbih4KXtyZXR1cm4geCtkZWx0YX0pfSl9KX1mdW5jdGlvbiBiYWxhbmNlKHhzcyxhbGlnbil7cmV0dXJuIF8ubWFwVmFsdWVzKHhzcy51bCxmdW5jdGlvbihpZ25vcmUsdil7aWYoYWxpZ24pcmV0dXJuIHhzc1thbGlnbi50b0xvd2VyQ2FzZSgpXVt2XTtlbHNle3ZhciB4cz1fLnNvcnRCeShfLm1hcCh4c3MsCnYpKTtyZXR1cm4oeHNbMV0reHNbMl0pLzJ9fSl9ZnVuY3Rpb24gcG9zaXRpb25YKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyksY29uZmxpY3RzPV8ubWVyZ2UoZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpLGZpbmRUeXBlMkNvbmZsaWN0cyhnLGxheWVyaW5nKSk7dmFyIHhzcz17fSxhZGp1c3RlZExheWVyaW5nO18uZm9yRWFjaChbInUiLCJkIl0sZnVuY3Rpb24odmVydCl7YWRqdXN0ZWRMYXllcmluZz12ZXJ0PT09InUiP2xheWVyaW5nOl8udmFsdWVzKGxheWVyaW5nKS5yZXZlcnNlKCk7Xy5mb3JFYWNoKFsibCIsInIiXSxmdW5jdGlvbihob3Jpeil7aWYoaG9yaXo9PT0iciIpYWRqdXN0ZWRMYXllcmluZz1fLm1hcChhZGp1c3RlZExheWVyaW5nLGZ1bmN0aW9uKGlubmVyKXtyZXR1cm4gXy52YWx1ZXMoaW5uZXIpLnJldmVyc2UoKX0pO3ZhciBuZWlnaGJvckZuPV8uYmluZCh2ZXJ0PT09InUiP2cucHJlZGVjZXNzb3JzOmcuc3VjY2Vzc29ycywKZyk7dmFyIGFsaWduPXZlcnRpY2FsQWxpZ25tZW50KGcsYWRqdXN0ZWRMYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbik7dmFyIHhzPWhvcml6b250YWxDb21wYWN0aW9uKGcsYWRqdXN0ZWRMYXllcmluZyxhbGlnbi5yb290LGFsaWduLmFsaWduLGhvcml6PT09InIiKTtpZihob3Jpej09PSJyIil4cz1fLm1hcFZhbHVlcyh4cyxmdW5jdGlvbih4KXtyZXR1cm4teH0pO3hzc1t2ZXJ0K2hvcml6XT14c30pfSk7dmFyIHNtYWxsZXN0V2lkdGg9ZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3MpO2FsaWduQ29vcmRpbmF0ZXMoeHNzLHNtYWxsZXN0V2lkdGgpO3JldHVybiBiYWxhbmNlKHhzcyxnLmdyYXBoKCkuYWxpZ24pfWZ1bmN0aW9uIHNlcChub2RlU2VwLGVkZ2VTZXAscmV2ZXJzZVNlcCl7cmV0dXJuIGZ1bmN0aW9uKGcsdix3KXt2YXIgdkxhYmVsPWcubm9kZSh2KSx3TGFiZWw9Zy5ub2RlKHcpLHN1bT0wLGRlbHRhO3N1bSs9dkxhYmVsLndpZHRoLzI7aWYoXy5oYXModkxhYmVsLAoibGFiZWxwb3MiKSlzd2l0Y2godkxhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPS12TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT12TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7c3VtKz0odkxhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPSh3TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9d0xhYmVsLndpZHRoLzI7aWYoXy5oYXMod0xhYmVsLCJsYWJlbHBvcyIpKXN3aXRjaCh3TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9d0xhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9LXdMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtyZXR1cm4gc3VtfX1mdW5jdGlvbiB3aWR0aChnLHYpe3JldHVybiBnLm5vZGUodikud2lkdGh9Cn0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIikscG9zaXRpb25YPXJlcXVpcmUoIi4vYmsiKS5wb3NpdGlvblg7bW9kdWxlLmV4cG9ydHM9cG9zaXRpb247ZnVuY3Rpb24gcG9zaXRpb24oZyl7Zz11dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKTtwb3NpdGlvblkoZyk7Xy5mb3JFYWNoKHBvc2l0aW9uWChnKSxmdW5jdGlvbih4LHYpe2cubm9kZSh2KS54PXh9KX1mdW5jdGlvbiBwb3NpdGlvblkoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxyYW5rU2VwPWcuZ3JhcGgoKS5yYW5rc2VwLHByZXZZPTA7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgbWF4SGVpZ2h0PV8ubWF4KF8ubWFwKGxheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikuaGVpZ2h0fSkpOwpfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnk9cHJldlkrbWF4SGVpZ2h0LzJ9KTtwcmV2WSs9bWF4SGVpZ2h0K3JhbmtTZXB9KX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYmsiOjIzfV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2s7bW9kdWxlLmV4cG9ydHM9ZmVhc2libGVUcmVlO2Z1bmN0aW9uIGZlYXNpYmxlVHJlZShnKXt2YXIgdD1uZXcgR3JhcGgoe2RpcmVjdGVkOmZhbHNlfSk7dmFyIHN0YXJ0PWcubm9kZXMoKVswXSxzaXplPWcubm9kZUNvdW50KCk7dC5zZXROb2RlKHN0YXJ0LHt9KTt2YXIgZWRnZSxkZWx0YTt3aGlsZSh0aWdodFRyZWUodCxnKTxzaXplKXtlZGdlPWZpbmRNaW5TbGFja0VkZ2UodCxnKTtkZWx0YT10Lmhhc05vZGUoZWRnZS52KT8Kc2xhY2soZyxlZGdlKTotc2xhY2soZyxlZGdlKTtzaGlmdFJhbmtzKHQsZyxkZWx0YSl9cmV0dXJuIHR9ZnVuY3Rpb24gdGlnaHRUcmVlKHQsZyl7ZnVuY3Rpb24gZGZzKHYpe18uZm9yRWFjaChnLm5vZGVFZGdlcyh2KSxmdW5jdGlvbihlKXt2YXIgZWRnZVY9ZS52LHc9dj09PWVkZ2VWP2UudzplZGdlVjtpZighdC5oYXNOb2RlKHcpJiYhc2xhY2soZyxlKSl7dC5zZXROb2RlKHcse30pO3Quc2V0RWRnZSh2LHcse30pO2Rmcyh3KX19KX1fLmZvckVhY2godC5ub2RlcygpLGRmcyk7cmV0dXJuIHQubm9kZUNvdW50KCl9ZnVuY3Rpb24gZmluZE1pblNsYWNrRWRnZSh0LGcpe3JldHVybiBfLm1pbkJ5KGcuZWRnZXMoKSxmdW5jdGlvbihlKXtpZih0Lmhhc05vZGUoZS52KSE9PXQuaGFzTm9kZShlLncpKXJldHVybiBzbGFjayhnLGUpfSl9ZnVuY3Rpb24gc2hpZnRSYW5rcyh0LGcsZGVsdGEpe18uZm9yRWFjaCh0Lm5vZGVzKCksZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9Cn0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOH1dLDI2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgcmFua1V0aWw9cmVxdWlyZSgiLi91dGlsIiksbG9uZ2VzdFBhdGg9cmFua1V0aWwubG9uZ2VzdFBhdGgsZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLG5ldHdvcmtTaW1wbGV4PXJlcXVpcmUoIi4vbmV0d29yay1zaW1wbGV4Iik7bW9kdWxlLmV4cG9ydHM9cmFuaztmdW5jdGlvbiByYW5rKGcpe3N3aXRjaChnLmdyYXBoKCkucmFua2VyKXtjYXNlICJuZXR3b3JrLXNpbXBsZXgiOm5ldHdvcmtTaW1wbGV4UmFua2VyKGcpO2JyZWFrO2Nhc2UgInRpZ2h0LXRyZWUiOnRpZ2h0VHJlZVJhbmtlcihnKTticmVhaztjYXNlICJsb25nZXN0LXBhdGgiOmxvbmdlc3RQYXRoUmFua2VyKGcpO2JyZWFrO2RlZmF1bHQ6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyl9fXZhciBsb25nZXN0UGF0aFJhbmtlcj1sb25nZXN0UGF0aDsKZnVuY3Rpb24gdGlnaHRUcmVlUmFua2VyKGcpe2xvbmdlc3RQYXRoKGcpO2ZlYXNpYmxlVHJlZShnKX1mdW5jdGlvbiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKXtuZXR3b3JrU2ltcGxleChnKX19LHsiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi9uZXR3b3JrLXNpbXBsZXgiOjI3LCIuL3V0aWwiOjI4fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjayxpbml0UmFuaz1yZXF1aXJlKCIuL3V0aWwiKS5sb25nZXN0UGF0aCxwcmVvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wcmVvcmRlcixwb3N0b3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucG9zdG9yZGVyLHNpbXBsaWZ5PXJlcXVpcmUoIi4uL3V0aWwiKS5zaW1wbGlmeTttb2R1bGUuZXhwb3J0cz1uZXR3b3JrU2ltcGxleDsKbmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcz1pbml0TG93TGltVmFsdWVzO25ldHdvcmtTaW1wbGV4LmluaXRDdXRWYWx1ZXM9aW5pdEN1dFZhbHVlcztuZXR3b3JrU2ltcGxleC5jYWxjQ3V0VmFsdWU9Y2FsY0N1dFZhbHVlO25ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZT1sZWF2ZUVkZ2U7bmV0d29ya1NpbXBsZXguZW50ZXJFZGdlPWVudGVyRWRnZTtuZXR3b3JrU2ltcGxleC5leGNoYW5nZUVkZ2VzPWV4Y2hhbmdlRWRnZXM7ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXgoZyl7Zz1zaW1wbGlmeShnKTtpbml0UmFuayhnKTt2YXIgdD1mZWFzaWJsZVRyZWUoZyk7aW5pdExvd0xpbVZhbHVlcyh0KTtpbml0Q3V0VmFsdWVzKHQsZyk7dmFyIGUsZjt3aGlsZShlPWxlYXZlRWRnZSh0KSl7Zj1lbnRlckVkZ2UodCxnLGUpO2V4Y2hhbmdlRWRnZXModCxnLGUsZil9fWZ1bmN0aW9uIGluaXRDdXRWYWx1ZXModCxnKXt2YXIgdnM9cG9zdG9yZGVyKHQsdC5ub2RlcygpKTt2cz12cy5zbGljZSgwLAp2cy5sZW5ndGgtMSk7Xy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2Fzc2lnbkN1dFZhbHVlKHQsZyx2KX0pfWZ1bmN0aW9uIGFzc2lnbkN1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudDt0LmVkZ2UoY2hpbGQscGFyZW50KS5jdXR2YWx1ZT1jYWxjQ3V0VmFsdWUodCxnLGNoaWxkKX1mdW5jdGlvbiBjYWxjQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50LGNoaWxkSXNUYWlsPXRydWUsZ3JhcGhFZGdlPWcuZWRnZShjaGlsZCxwYXJlbnQpLGN1dFZhbHVlPTA7aWYoIWdyYXBoRWRnZSl7Y2hpbGRJc1RhaWw9ZmFsc2U7Z3JhcGhFZGdlPWcuZWRnZShwYXJlbnQsY2hpbGQpfWN1dFZhbHVlPWdyYXBoRWRnZS53ZWlnaHQ7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKGNoaWxkKSxmdW5jdGlvbihlKXt2YXIgaXNPdXRFZGdlPWUudj09PWNoaWxkLG90aGVyPQppc091dEVkZ2U/ZS53OmUudjtpZihvdGhlciE9PXBhcmVudCl7dmFyIHBvaW50c1RvSGVhZD1pc091dEVkZ2U9PT1jaGlsZElzVGFpbCxvdGhlcldlaWdodD1nLmVkZ2UoZSkud2VpZ2h0O2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/b3RoZXJXZWlnaHQ6LW90aGVyV2VpZ2h0O2lmKGlzVHJlZUVkZ2UodCxjaGlsZCxvdGhlcikpe3ZhciBvdGhlckN1dFZhbHVlPXQuZWRnZShjaGlsZCxvdGhlcikuY3V0dmFsdWU7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD8tb3RoZXJDdXRWYWx1ZTpvdGhlckN1dFZhbHVlfX19KTtyZXR1cm4gY3V0VmFsdWV9ZnVuY3Rpb24gaW5pdExvd0xpbVZhbHVlcyh0cmVlLHJvb3Qpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Milyb290PXRyZWUubm9kZXMoKVswXTtkZnNBc3NpZ25Mb3dMaW0odHJlZSx7fSwxLHJvb3QpfWZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLHZpc2l0ZWQsbmV4dExpbSx2LHBhcmVudCl7dmFyIGxvdz1uZXh0TGltLGxhYmVsPXRyZWUubm9kZSh2KTsKdmlzaXRlZFt2XT10cnVlO18uZm9yRWFjaCh0cmVlLm5laWdoYm9ycyh2KSxmdW5jdGlvbih3KXtpZighXy5oYXModmlzaXRlZCx3KSluZXh0TGltPWRmc0Fzc2lnbkxvd0xpbSh0cmVlLHZpc2l0ZWQsbmV4dExpbSx3LHYpfSk7bGFiZWwubG93PWxvdztsYWJlbC5saW09bmV4dExpbSsrO2lmKHBhcmVudClsYWJlbC5wYXJlbnQ9cGFyZW50O2Vsc2UgZGVsZXRlIGxhYmVsLnBhcmVudDtyZXR1cm4gbmV4dExpbX1mdW5jdGlvbiBsZWF2ZUVkZ2UodHJlZSl7cmV0dXJuIF8uZmluZCh0cmVlLmVkZ2VzKCksZnVuY3Rpb24oZSl7cmV0dXJuIHRyZWUuZWRnZShlKS5jdXR2YWx1ZTwwfSl9ZnVuY3Rpb24gZW50ZXJFZGdlKHQsZyxlZGdlKXt2YXIgdj1lZGdlLnYsdz1lZGdlLnc7aWYoIWcuaGFzRWRnZSh2LHcpKXt2PWVkZ2Uudzt3PWVkZ2Uudn12YXIgdkxhYmVsPXQubm9kZSh2KSx3TGFiZWw9dC5ub2RlKHcpLHRhaWxMYWJlbD12TGFiZWwsZmxpcD1mYWxzZTtpZih2TGFiZWwubGltPndMYWJlbC5saW0pe3RhaWxMYWJlbD0Kd0xhYmVsO2ZsaXA9dHJ1ZX12YXIgY2FuZGlkYXRlcz1fLmZpbHRlcihnLmVkZ2VzKCksZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGZsaXA9PT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS52KSx0YWlsTGFiZWwpJiZmbGlwIT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudyksdGFpbExhYmVsKX0pO3JldHVybiBfLm1pbkJ5KGNhbmRpZGF0ZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIHNsYWNrKGcsZWRnZSl9KX1mdW5jdGlvbiBleGNoYW5nZUVkZ2VzKHQsZyxlLGYpe3ZhciB2PWUudix3PWUudzt0LnJlbW92ZUVkZ2Uodix3KTt0LnNldEVkZ2UoZi52LGYudyx7fSk7aW5pdExvd0xpbVZhbHVlcyh0KTtpbml0Q3V0VmFsdWVzKHQsZyk7dXBkYXRlUmFua3ModCxnKX1mdW5jdGlvbiB1cGRhdGVSYW5rcyh0LGcpe3ZhciByb290PV8uZmluZCh0Lm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcubm9kZSh2KS5wYXJlbnR9KSx2cz1wcmVvcmRlcih0LHJvb3QpO3ZzPXZzLnNsaWNlKDEpOwpfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIHBhcmVudD10Lm5vZGUodikucGFyZW50LGVkZ2U9Zy5lZGdlKHYscGFyZW50KSxmbGlwcGVkPWZhbHNlO2lmKCFlZGdlKXtlZGdlPWcuZWRnZShwYXJlbnQsdik7ZmxpcHBlZD10cnVlfWcubm9kZSh2KS5yYW5rPWcubm9kZShwYXJlbnQpLnJhbmsrKGZsaXBwZWQ/ZWRnZS5taW5sZW46LWVkZ2UubWlubGVuKX0pfWZ1bmN0aW9uIGlzVHJlZUVkZ2UodHJlZSx1LHYpe3JldHVybiB0cmVlLmhhc0VkZ2UodSx2KX1mdW5jdGlvbiBpc0Rlc2NlbmRhbnQodHJlZSx2TGFiZWwscm9vdExhYmVsKXtyZXR1cm4gcm9vdExhYmVsLmxvdzw9dkxhYmVsLmxpbSYmdkxhYmVsLmxpbTw9cm9vdExhYmVsLmxpbX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL3V0aWwiOjI4fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpOwptb2R1bGUuZXhwb3J0cz17bG9uZ2VzdFBhdGg6bG9uZ2VzdFBhdGgsc2xhY2s6c2xhY2t9O2Z1bmN0aW9uIGxvbmdlc3RQYXRoKGcpe3ZhciB2aXNpdGVkPXt9O2Z1bmN0aW9uIGRmcyh2KXt2YXIgbGFiZWw9Zy5ub2RlKHYpO2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuIGxhYmVsLnJhbms7dmlzaXRlZFt2XT10cnVlO3ZhciByYW5rPV8ubWluQnkoXy5tYXAoZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtyZXR1cm4gZGZzKGUudyktZy5lZGdlKGUpLm1pbmxlbn0pKTtpZihyYW5rPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfHxyYW5rPT09dW5kZWZpbmVkfHxyYW5rPT09bnVsbClyYW5rPTA7cmV0dXJuIGxhYmVsLnJhbms9cmFua31fLmZvckVhY2goZy5zb3VyY2VzKCksZGZzKX1mdW5jdGlvbiBzbGFjayhnLGUpe3JldHVybiBnLm5vZGUoZS53KS5yYW5rLWcubm9kZShlLnYpLnJhbmstZy5lZGdlKGUpLm1pbmxlbn19LHsiLi4vbG9kYXNoIjoxMH1dLDI5OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2FkZER1bW15Tm9kZTphZGREdW1teU5vZGUsc2ltcGxpZnk6c2ltcGxpZnksYXNOb25Db21wb3VuZEdyYXBoOmFzTm9uQ29tcG91bmRHcmFwaCxzdWNjZXNzb3JXZWlnaHRzOnN1Y2Nlc3NvcldlaWdodHMscHJlZGVjZXNzb3JXZWlnaHRzOnByZWRlY2Vzc29yV2VpZ2h0cyxpbnRlcnNlY3RSZWN0OmludGVyc2VjdFJlY3QsYnVpbGRMYXllck1hdHJpeDpidWlsZExheWVyTWF0cml4LG5vcm1hbGl6ZVJhbmtzOm5vcm1hbGl6ZVJhbmtzLHJlbW92ZUVtcHR5UmFua3M6cmVtb3ZlRW1wdHlSYW5rcyxhZGRCb3JkZXJOb2RlOmFkZEJvcmRlck5vZGUsbWF4UmFuazptYXhSYW5rLHBhcnRpdGlvbjpwYXJ0aXRpb24sdGltZTp0aW1lLG5vdGltZTpub3RpbWV9O2Z1bmN0aW9uIGFkZER1bW15Tm9kZShnLHR5cGUsYXR0cnMsbmFtZSl7dmFyIHY7CmRvIHY9Xy51bmlxdWVJZChuYW1lKTt3aGlsZShnLmhhc05vZGUodikpO2F0dHJzLmR1bW15PXR5cGU7Zy5zZXROb2RlKHYsYXR0cnMpO3JldHVybiB2fWZ1bmN0aW9uIHNpbXBsaWZ5KGcpe3ZhciBzaW1wbGlmaWVkPShuZXcgR3JhcGgpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgc2ltcGxlTGFiZWw9c2ltcGxpZmllZC5lZGdlKGUudixlLncpfHx7d2VpZ2h0OjAsbWlubGVuOjF9LGxhYmVsPWcuZWRnZShlKTtzaW1wbGlmaWVkLnNldEVkZ2UoZS52LGUudyx7d2VpZ2h0OnNpbXBsZUxhYmVsLndlaWdodCtsYWJlbC53ZWlnaHQsbWlubGVuOk1hdGgubWF4KHNpbXBsZUxhYmVsLm1pbmxlbixsYWJlbC5taW5sZW4pfSl9KTtyZXR1cm4gc2ltcGxpZmllZH1mdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZyl7dmFyIHNpbXBsaWZpZWQ9CihuZXcgR3JhcGgoe211bHRpZ3JhcGg6Zy5pc011bHRpZ3JhcGgoKX0pKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aWYoIWcuY2hpbGRyZW4odikubGVuZ3RoKXNpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3NpbXBsaWZpZWQuc2V0RWRnZShlLGcuZWRnZShlKSl9KTtyZXR1cm4gc2ltcGxpZmllZH1mdW5jdGlvbiBzdWNjZXNzb3JXZWlnaHRzKGcpe3ZhciB3ZWlnaHRNYXA9Xy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBzdWNzPXt9O18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3N1Y3NbZS53XT0oc3Vjc1tlLnddfHwwKStnLmVkZ2UoZSkud2VpZ2h0fSk7cmV0dXJuIHN1Y3N9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpe3ZhciB3ZWlnaHRNYXA9Xy5tYXAoZy5ub2RlcygpLApmdW5jdGlvbih2KXt2YXIgcHJlZHM9e307Xy5mb3JFYWNoKGcuaW5FZGdlcyh2KSxmdW5jdGlvbihlKXtwcmVkc1tlLnZdPShwcmVkc1tlLnZdfHwwKStnLmVkZ2UoZSkud2VpZ2h0fSk7cmV0dXJuIHByZWRzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIGludGVyc2VjdFJlY3QocmVjdCxwb2ludCl7dmFyIHg9cmVjdC54O3ZhciB5PXJlY3QueTt2YXIgZHg9cG9pbnQueC14O3ZhciBkeT1wb2ludC55LXk7dmFyIHc9cmVjdC53aWR0aC8yO3ZhciBoPXJlY3QuaGVpZ2h0LzI7aWYoIWR4JiYhZHkpdGhyb3cgbmV3IEVycm9yKCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGUiKTt2YXIgc3gsc3k7aWYoTWF0aC5hYnMoZHkpKnc+TWF0aC5hYnMoZHgpKmgpe2lmKGR5PDApaD0taDtzeD1oKmR4L2R5O3N5PWh9ZWxzZXtpZihkeDwwKXc9LXc7c3g9dztzeT13KmR5L2R4fXJldHVybnt4OngrCnN4LHk6eStzeX19ZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKXt2YXIgbGF5ZXJpbmc9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKGcpKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxyYW5rPW5vZGUucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlsYXllcmluZ1tyYW5rXVtub2RlLm9yZGVyXT12fSk7cmV0dXJuIGxheWVyaW5nfWZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpe3ZhciBtaW49Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKF8uaGFzKG5vZGUsInJhbmsiKSlub2RlLnJhbmstPW1pbn0pfWZ1bmN0aW9uIHJlbW92ZUVtcHR5UmFua3MoZyl7dmFyIG9mZnNldD1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7CnZhciBsYXllcnM9W107Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuay1vZmZzZXQ7aWYoIWxheWVyc1tyYW5rXSlsYXllcnNbcmFua109W107bGF5ZXJzW3JhbmtdLnB1c2godil9KTt2YXIgZGVsdGE9MCxub2RlUmFua0ZhY3Rvcj1nLmdyYXBoKCkubm9kZVJhbmtGYWN0b3I7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbih2cyxpKXtpZihfLmlzVW5kZWZpbmVkKHZzKSYmaSVub2RlUmFua0ZhY3RvciE9PTApLS1kZWx0YTtlbHNlIGlmKGRlbHRhKV8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0pfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcmVmaXgscmFuayxvcmRlcil7dmFyIG5vZGU9e3dpZHRoOjAsaGVpZ2h0OjB9O2lmKGFyZ3VtZW50cy5sZW5ndGg+PTQpe25vZGUucmFuaz1yYW5rO25vZGUub3JkZXI9b3JkZXJ9cmV0dXJuIGFkZER1bW15Tm9kZShnLCJib3JkZXIiLG5vZGUscHJlZml4KX0KZnVuY3Rpb24gbWF4UmFuayhnKXtyZXR1cm4gXy5tYXgoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKXJldHVybiByYW5rfSkpfWZ1bmN0aW9uIHBhcnRpdGlvbihjb2xsZWN0aW9uLGZuKXt2YXIgcmVzdWx0PXtsaHM6W10scmhzOltdfTtfLmZvckVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7aWYoZm4odmFsdWUpKXJlc3VsdC5saHMucHVzaCh2YWx1ZSk7ZWxzZSByZXN1bHQucmhzLnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0aW1lKG5hbWUsZm4pe3ZhciBzdGFydD1fLm5vdygpO3RyeXtyZXR1cm4gZm4oKX1maW5hbGx5e2NvbnNvbGUubG9nKG5hbWUrIiB0aW1lOiAiKyhfLm5vdygpLXN0YXJ0KSsibXMiKX19ZnVuY3Rpb24gbm90aW1lKG5hbWUsZm4pe3JldHVybiBmbigpfX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTB9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPSIwLjguMiJ9LHt9XX0se30sWzFdKSgxKX0pOwovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2Fubm90YXRpb24uanMKdmFyIHRmOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhxKXtyZXR1cm4oZC5yZW5kZXIuQW5ub3RhdGlvblR5cGVbcV18fCIiKS50b0xvd2VyQ2FzZSgpfHxudWxsfWZ1bmN0aW9uIHIocSx1KXt1LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWT9mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQocSwidXNlIikuYXR0cigiY2xhc3MiLCJzdW1tYXJ5IikuYXR0cigieGxpbms6aHJlZiIsIiNzdW1tYXJ5LWljb24iKS5hdHRyKCJjdXJzb3IiLCJwb2ludGVyIik6KHE9Zi5ub2RlLmJ1aWxkU2hhcGUocSx1LGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKSxmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQocSwidGl0bGUiKS50ZXh0KHUubm9kZS5uYW1lKSl9ZnVuY3Rpb24gbChxLHUpe2xldCB3PXUubm9kZS5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHAocSx3W3cubGVuZ3RoLTFdLHUsbnVsbCl9ZnVuY3Rpb24gcChxLHUsCncsQSl7bGV0IHk9Zi5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMO0EmJih5Kz0iICIrQSk7cT1xLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIix5KS5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLHcuaXNJbj8iZW5kIjoic3RhcnQiKS50ZXh0KHUpO3JldHVybiBiLmdyYXBoLnNjZW5lLm5vZGUuZW5mb3JjZUxhYmVsV2lkdGgocSwtMSl9ZnVuY3Rpb24gbShxLHUsdyxBKXtxLm9uKCJtb3VzZW92ZXIiLHk9PntBLmZpcmUoImFubm90YXRpb24taGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp1Lm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3V0Iix5PT57QS5maXJlKCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0Iix7bmFtZTp5Lm5vZGUubmFtZSxob3N0TmFtZTp1Lm5vZGUubmFtZX0pfSkub24oImNsaWNrIix5PT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7QS5maXJlKCJhbm5vdGF0aW9uLXNlbGVjdCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pOwppZih3LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmdy5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkNPTlNUQU5UKXEub24oImNvbnRleHRtZW51IixmLmNvbnRleHRtZW51LmdldE1lbnUoQSxmLm5vZGUuZ2V0Q29udGV4dE1lbnUody5ub2RlLEEpKSl9ZnVuY3Rpb24gbihxLHUsdyxBKXtsZXQgeT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHUpO3cucmVuZGVyTm9kZUluZm8mJncuYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmZi5ub2RlLnN0eWxpemUocSx3LnJlbmRlck5vZGVJbmZvLEEsZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpO3cuYW5ub3RhdGlvblR5cGU9PT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiYody53aWR0aCs9MTApO3Euc2VsZWN0KCJ0ZXh0LiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsCnkrdy5keCsody5pc0luPy0xOjEpKih3LndpZHRoLzIrdy5sYWJlbE9mZnNldCkpLmF0dHIoInkiLHUueSt3LmR5KTtxLnNlbGVjdCgidXNlLnN1bW1hcnkiKS50cmFuc2l0aW9uKCkuYXR0cigieCIseSt3LmR4LTMpLmF0dHIoInkiLHUueSt3LmR5LTYpO2YucG9zaXRpb25FbGxpcHNlKHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIGVsbGlwc2UiKSx5K3cuZHgsdS55K3cuZHksdy53aWR0aCx3LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgcmVjdCIpLHkrdy5keCx1Lnkrdy5keSx3LndpZHRoLHcuaGVpZ2h0KTtmLnBvc2l0aW9uUmVjdChxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiB1c2UiKSx5K3cuZHgsdS55K3cuZHksdy53aWR0aCx3LmhlaWdodCk7cS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkFubm90YXRpb24uRURHRSkudHJhbnNpdGlvbigpLmF0dHIoImQiLHg9Pgp7eD14LnBvaW50cy5tYXAoQz0+KHt4OkMuZHgreSx5OkMuZHkrdS55fSkpO3JldHVybiBmLmVkZ2UuaW50ZXJwb2xhdGUoeCl9KX1oLmJ1aWxkR3JvdXA9ZnVuY3Rpb24ocSx1LHcsQSl7cT1xLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKHUubGlzdCx5PT55Lm5vZGUubmFtZSk7cS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIseT0+eS5ub2RlLm5hbWUpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EuYWRkQW5ub3RhdGlvbkdyb3VwKHksdyx4KTtsZXQgQz1mLkNsYXNzLkFubm90YXRpb24uRURHRSxHPXkucmVuZGVyTWV0YWVkZ2VJbmZvJiZ5LnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTtHJiYhRy5udW1SZWd1bGFyRWRnZXMmJihDKz0iICIrZi5DbGFzcy5Bbm5vdGF0aW9uLkNPTlRST0xfRURHRSk7RyYmRy5udW1SZWZFZGdlcyYmKEMrPSIgIitmLkNsYXNzLkVkZ2UuUkVGX0xJTkUpOwpmLmVkZ2UuYXBwZW5kRWRnZSh4LHksQSxDKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVM/KGwoeCx5KSxyKHgseSkpOnAoeCx5Lm5vZGUubmFtZSx5LGYuQ2xhc3MuQW5ub3RhdGlvbi5FTExJUFNJUyl9KS5tZXJnZShxKS5hdHRyKCJjbGFzcyIseT0+Zi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKyIgIitrKHkuYW5ub3RhdGlvblR5cGUpKyIgIitmLm5vZGUubm9kZUNsYXNzKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB4PWQzLnNlbGVjdCh0aGlzKTtuKHgsdyx5LEEpO3kuYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUyYmbSh4LHcseSxBKX0pO3EuZXhpdCgpLmVhY2goZnVuY3Rpb24oeSl7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO0EucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHksdyx4KX0pLnJlbW92ZSgpO3JldHVybiBxfX0pKGYuYW5ub3RhdGlvbnx8KGYuYW5ub3RhdGlvbj17fSkpfSkoZC5zY2VuZXx8CihkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb2xvcnMuanMKKGZ1bmN0aW9uKGIpe2IuQ09MT1JTPVt7bmFtZToiR29vZ2xlIEJsdWUiLGNvbG9yOiIjNDE4NGYzIixhY3RpdmU6IiMzYTUzYzUiLGRpc2FibGVkOiIjY2FkOGZjIn0se25hbWU6Ikdvb2dsZSBSZWQiLGNvbG9yOiIjZGI0NDM3IixhY3RpdmU6IiM4ZjJhMGMiLGRpc2FibGVkOiIjZThjNmMxIn0se25hbWU6Ikdvb2dsZSBZZWxsb3ciLGNvbG9yOiIjZjRiNDAwIixhY3RpdmU6IiNkYjkyMDAiLGRpc2FibGVkOiIjZjdlOGIwIn0se25hbWU6Ikdvb2dsZSBHcmVlbiIsY29sb3I6IiMwZjlkNTgiLGFjdGl2ZToiIzQ4ODA0NiIsZGlzYWJsZWQ6IiNjMmUxY2MifSx7bmFtZToiUHVycGxlIixjb2xvcjoiI2FhNDZiYiIsYWN0aXZlOiIjNWMxMzk4IixkaXNhYmxlZDoiI2Q3YmNlNiJ9LHtuYW1lOiJUZWFsIixjb2xvcjoiIzAwYWJjMCIsYWN0aXZlOiIjNDc4MjhlIixkaXNhYmxlZDoiI2MyZWFmMiJ9LHtuYW1lOiJEZWVwIE9yYW5nZSIsY29sb3I6IiNmZjZmNDIiLGFjdGl2ZToiI2NhNGEwNiIsCmRpc2FibGVkOiIjZjJjYmJhIn0se25hbWU6IkxpbWUiLGNvbG9yOiIjOWQ5YzIzIixhY3RpdmU6IiM3Zjc3MWQiLGRpc2FibGVkOiIjZjFmNGMyIn0se25hbWU6IkluZGlnbyIsY29sb3I6IiM1YjZhYmYiLGFjdGl2ZToiIzNlNDdhOSIsZGlzYWJsZWQ6IiNjNWM4ZTgifSx7bmFtZToiUGluayIsY29sb3I6IiNlZjYxOTEiLGFjdGl2ZToiI2NhMWM2MCIsZGlzYWJsZWQ6IiNlOWI5Y2UifSx7bmFtZToiRGVlcCBUZWFsIixjb2xvcjoiIzAwNzg2YSIsYWN0aXZlOiIjMmI0ZjQzIixkaXNhYmxlZDoiI2JlZGVkYSJ9LHtuYW1lOiJEZWVwIFBpbmsiLGNvbG9yOiIjYzExNzVhIixhY3RpdmU6IiM3NTA4NGYiLGRpc2FibGVkOiIjZGU4Y2FlIn0se25hbWU6IkdyYXkiLGNvbG9yOiIjOUU5RTlFIixhY3RpdmU6IiM0MjQyNDIiLGRpc2FibGVkOiJGNUY1RjUifV0ucmVkdWNlKChkLGYpPT57ZFtmLm5hbWVdPWY7cmV0dXJuIGR9LHt9KTtiLk9QX0dST1VQX0NPTE9SUz1be2NvbG9yOiJHb29nbGUgUmVkIiwKZ3JvdXBzOiJnZW5fbGVnYWN5X29wcyBsZWdhY3lfb3BzIGxlZ2FjeV9mbG9nc19pbnB1dCBsZWdhY3lfaW1hZ2VfaW5wdXQgbGVnYWN5X2lucHV0X2V4YW1wbGVfaW5wdXQgbGVnYWN5X3NlcXVlbmNlX2lucHV0IGxlZ2FjeV9zZXRpX2lucHV0X2lucHV0Ii5zcGxpdCgiICIpfSx7Y29sb3I6IkRlZXAgT3JhbmdlIixncm91cHM6WyJjb25zdGFudF9vcHMiXX0se2NvbG9yOiJJbmRpZ28iLGdyb3VwczpbInN0YXRlX29wcyJdfSx7Y29sb3I6IlB1cnBsZSIsZ3JvdXBzOlsibm5fb3BzIiwibm4iXX0se2NvbG9yOiJHb29nbGUgR3JlZW4iLGdyb3VwczpbIm1hdGhfb3BzIl19LHtjb2xvcjoiTGltZSIsZ3JvdXBzOlsiYXJyYXlfb3BzIl19LHtjb2xvcjoiVGVhbCIsZ3JvdXBzOlsiY29udHJvbF9mbG93X29wcyIsImRhdGFfZmxvd19vcHMiXX0se2NvbG9yOiJQaW5rIixncm91cHM6WyJzdW1tYXJ5X29wcyJdfSx7Y29sb3I6IkRlZXAgUGluayIsZ3JvdXBzOlsiaW9fb3BzIl19XS5yZWR1Y2UoKGQsCmYpPT57Zi5ncm91cHMuZm9yRWFjaChmdW5jdGlvbihoKXtkW2hdPWYuY29sb3J9KTtyZXR1cm4gZH0se30pfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb21tb24uanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi5PUF9HUkFQSD0ib3BfZ3JhcGgiO2YuQ09OQ0VQVFVBTF9HUkFQSD0iY29uY2VwdHVhbF9ncmFwaCI7Zi5QUk9GSUxFPSJwcm9maWxlIn0pKGQuU2VsZWN0aW9uVHlwZXx8KGQuU2VsZWN0aW9uVHlwZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29udGV4dG1lbnUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocil7bGV0IGw9MCxwPTA7Zm9yKDtyJiYwPD1yLm9mZnNldExlZnQmJjA8PXIub2Zmc2V0VG9wOylsKz1yLm9mZnNldExlZnQtci5zY3JvbGxMZWZ0LHArPXIub2Zmc2V0VG9wLXIuc2Nyb2xsVG9wLHI9ci5vZmZzZXRQYXJlbnQ7cmV0dXJue2xlZnQ6bCx0b3A6cH19aC5nZXRNZW51PWZ1bmN0aW9uKHIsbCl7Y29uc3QgcD1yLmdldENvbnRleHRNZW51KCksbT1kMy5zZWxlY3Qoci5nZXRDb250ZXh0TWVudSgpKTtyZXR1cm4gZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KHkpe3kmJnkuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMocCl8fChtLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix1LHtjYXB0dXJlOiEwfSkpfWxldCB3PWQzLmV2ZW50O2NvbnN0IEE9ayhyKTttLnN0eWxlKCJkaXNwbGF5IiwiYmxvY2siKS5zdHlsZSgibGVmdCIsCncuY2xpZW50WC1BLmxlZnQrMSsicHgiKS5zdHlsZSgidG9wIix3LmNsaWVudFktQS50b3ArMSsicHgiKTt3LnByZXZlbnREZWZhdWx0KCk7dy5zdG9wUHJvcGFnYXRpb24oKTtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pO20uaHRtbCgiIik7bS5hcHBlbmQoInVsIikuc2VsZWN0QWxsKCJsaSIpLmRhdGEobCkuZW50ZXIoKS5hcHBlbmQoImxpIikub24oImNsaWNrIix5PT57eS5hY3Rpb24odGhpcyxuLHEpO3UoKX0pLmh0bWwoZnVuY3Rpb24oeSl7cmV0dXJuIHkudGl0bGUobil9KX19fSkoZi5jb250ZXh0bWVudXx8KGYuY29udGV4dG1lbnU9e30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9lZGdlLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHkpe3JldHVybiB5LnYrZC5FREdFX0tFWV9ERUxJTSt5Lnd9ZnVuY3Rpb24gcih5LHgpe3g9eC5nZXROb2RlQnlOYW1lKHkudik7aWYobnVsbD09eC5vdXRwdXRTaGFwZXN8fF8uaXNFbXB0eSh4Lm91dHB1dFNoYXBlcykpcmV0dXJuIG51bGw7eT14Lm91dHB1dFNoYXBlc1t5Lm91dHB1dFRlbnNvcktleV07cmV0dXJuIG51bGw9PXk/bnVsbDowPT09eS5sZW5ndGg/InNjYWxhciI6eS5tYXAoQz0+LTE9PT1DPyI/IjpDKS5qb2luKCJcdTAwZDciKX1mdW5jdGlvbiBsKHkseCl7cmV0dXJuIHguZWRnZUxhYmVsRnVuY3Rpb24/eC5lZGdlTGFiZWxGdW5jdGlvbih5LHgpOjE8eS5iYXNlRWRnZUxpc3QubGVuZ3RoP3kuYmFzZUVkZ2VMaXN0Lmxlbmd0aCsiIHRlbnNvcnMiOnIoeS5iYXNlRWRnZUxpc3RbMF0seCl9ZnVuY3Rpb24gcCh5LHgsQyl7Y29uc3QgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLAoicGF0aCIpO2ZvcihsZXQgRD0xO0Q8eS5sZW5ndGg7RCsrKWlmKEcuc2V0QXR0cmlidXRlKCJkIixDKHkuc2xpY2UoMCxEKSkpLEcuZ2V0VG90YWxMZW5ndGgoKT54KXJldHVybiBELTE7cmV0dXJuIHkubGVuZ3RoLTF9ZnVuY3Rpb24gbSh5LHgsQyl7dmFyIEc9ZDMubGluZSgpLngoSz0+Sy54KS55KEs9PksueSksRD1kMy5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInBhdGgiKSkuYXR0cigiZCIsRyh5KSksQj0reC5hdHRyKCJtYXJrZXJXaWR0aCIpLEg9eC5hdHRyKCJ2aWV3Qm94Iikuc3BsaXQoIiAiKS5tYXAoTnVtYmVyKTtIPUhbMl0tSFswXTt4PSt4LmF0dHIoInJlZlgiKTtEPUQubm9kZSgpO2lmKEMpcmV0dXJuIEIqPTEteC9ILEM9RC5nZXRQb2ludEF0TGVuZ3RoKEIpLEc9cCh5LEIsRykseVtHLTFdPXt4OkMueCx5OkMueX0seS5zbGljZShHLTEpO0M9MS14L0g7Qj1ELmdldFRvdGFsTGVuZ3RoKCktQipDO0M9CkQuZ2V0UG9pbnRBdExlbmd0aChCKTtHPXAoeSxCLEcpO3lbR109e3g6Qy54LHk6Qy55fTtyZXR1cm4geS5zbGljZSgwLEcrMSl9ZnVuY3Rpb24gbih5LHgsQyxHKXtHPUd8fGYuQ2xhc3MuRWRnZS5MSU5FO3gubGFiZWwmJngubGFiZWwuc3RydWN0dXJhbCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU1RSVUNUVVJBTCk7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmeC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuUkVGRVJFTkNFX0VER0UpO0MuaGFuZGxlRWRnZVNlbGVjdGVkJiYoRys9IiAiK2YuQ2xhc3MuRWRnZS5TRUxFQ1RBQkxFKTtsZXQgRD0icGF0aF8iK2soeCk7aWYoQy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24pdmFyIEI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24oeCxHKTtlbHNlIEI9MSxudWxsIT14LmxhYmVsJiZudWxsIT14LmxhYmVsLm1ldGFlZGdlJiYoQj14LmxhYmVsLm1ldGFlZGdlLnRvdGFsU2l6ZSksCkI9Qy5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlKEIpO0c9eS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsRCkuYXR0cigiY2xhc3MiLEcpLnN0eWxlKCJzdHJva2Utd2lkdGgiLEIrInB4Iik7eC5sYWJlbCYmeC5sYWJlbC5tZXRhZWRnZSYmKHgubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXM/KEI9YHJlZmVyZW5jZS1hcnJvd2hlYWQtJHtBKEIpfWAsRy5zdHlsZSgibWFya2VyLXN0YXJ0IixgdXJsKCMke0J9KWApLHgubGFiZWwuc3RhcnRNYXJrZXJJZD1CKTooQj1gZGF0YWZsb3ctYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Qn0pYCkseC5sYWJlbC5lbmRNYXJrZXJJZD1CKSk7bnVsbCE9eC5sYWJlbCYmbnVsbCE9eC5sYWJlbC5tZXRhZWRnZSYmKHg9bCh4LmxhYmVsLm1ldGFlZGdlLEMucmVuZGVySGllcmFyY2h5KSxudWxsIT14JiZ5LmFwcGVuZCgidGV4dCIpLmFwcGVuZCgidGV4dFBhdGgiKS5hdHRyKCJ4bGluazpocmVmIiwKIiMiK0QpLmF0dHIoInN0YXJ0T2Zmc2V0IiwiNTAlIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJkb21pbmFudC1iYXNlbGluZSIsImNlbnRyYWwiKS50ZXh0KHgpKX1mdW5jdGlvbiBxKHkseCxDLEcsRCl7Rz1DLmxhYmVsO2xldCBCPUcuYWRqb2luaW5nTWV0YWVkZ2UsSD1HLnBvaW50czt5PXkuc2hhZG93Um9vdDtDLmxhYmVsLnN0YXJ0TWFya2VySWQmJihIPW0oSCxkMy5zZWxlY3QoeS5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwhMCkpO0MubGFiZWwuZW5kTWFya2VySWQmJihIPW0oSCxkMy5zZWxlY3QoeS5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKTtpZighQilyZXR1cm4gZDMuaW50ZXJwb2xhdGUoRCxoLmludGVycG9sYXRlKEgpKTtsZXQgSz1CLmVkZ2VHcm91cC5ub2RlKCkuZmlyc3RDaGlsZCxMPUcubWV0YWVkZ2UuaW5ib3VuZDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgSj1LLmdldFBvaW50QXRMZW5ndGgoTD8KSy5nZXRUb3RhbExlbmd0aCgpOjApLm1hdHJpeFRyYW5zZm9ybShLLmdldENUTSgpKS5tYXRyaXhUcmFuc2Zvcm0oeC5nZXRDVE0oKS5pbnZlcnNlKCkpLE89TD8wOkgubGVuZ3RoLTE7SFtPXS54PUoueDtIW09dLnk9Si55O3JldHVybiBoLmludGVycG9sYXRlKEgpfX1mdW5jdGlvbiB1KHkseCl7ZDMuc2VsZWN0KHgpLnNlbGVjdCgicGF0aC4iK2YuQ2xhc3MuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIixmdW5jdGlvbihDLEcsRCl7cmV0dXJuIHEoeSx0aGlzLEMsRyxEKX0pfWZ1bmN0aW9uIHcoeSx4KXt5LmNsYXNzZWQoImZhZGVkIix4LmxhYmVsLmlzRmFkZWRPdXQpO3g9eC5sYWJlbC5tZXRhZWRnZTt5LnNlbGVjdCgicGF0aC4iK2YuQ2xhc3MuRWRnZS5MSU5FKS5jbGFzc2VkKCJjb250cm9sLWRlcCIseCYmIXgubnVtUmVndWxhckVkZ2VzKX1oLk1JTl9FREdFX1dJRFRIPS43NTtoLk1BWF9FREdFX1dJRFRIPTEyO2guRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFPQpkMy5zY2FsZVBvdygpLmV4cG9uZW50KC4zKS5kb21haW4oWzEsNUU2XSkucmFuZ2UoW2guTUlOX0VER0VfV0lEVEgsaC5NQVhfRURHRV9XSURUSF0pLmNsYW1wKCEwKTtsZXQgQT1kMy5zY2FsZVF1YW50aXplKCkuZG9tYWluKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5yYW5nZShbInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4bGFyZ2UiXSk7aC5nZXRFZGdlS2V5PWs7aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHkseCxDKXtsZXQgRz1bXTtHPV8ucmVkdWNlKHguZWRnZXMoKSwoRCxCKT0+e2xldCBIPXguZWRnZShCKTtELnB1c2goe3Y6Qi52LHc6Qi53LGxhYmVsOkh9KTtyZXR1cm4gRH0sRyk7eT1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoeSwiZyIsZi5DbGFzcy5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoRyxrKTt5LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGYuQ2xhc3MuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIiwKaykuZWFjaChmdW5jdGlvbihEKXtsZXQgQj1kMy5zZWxlY3QodGhpcyk7RC5sYWJlbC5lZGdlR3JvdXA9QjtDLl9lZGdlR3JvdXBJbmRleFtrKEQpXT1CO2lmKEMuaGFuZGxlRWRnZVNlbGVjdGVkKUIub24oImNsaWNrIixIPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Qy5maXJlKCJlZGdlLXNlbGVjdCIse2VkZ2VEYXRhOkgsZWRnZUdyb3VwOkJ9KX0pO24oQixELEMpfSkubWVyZ2UoeSkuZWFjaChmdW5jdGlvbigpe3UoQyx0aGlzKX0pLmVhY2goZnVuY3Rpb24oRCl7dyhkMy5zZWxlY3QodGhpcyksRCxDKX0pO3kuZXhpdCgpLmVhY2goRD0+e2RlbGV0ZSBDLl9lZGdlR3JvdXBJbmRleFtrKEQpXX0pLnJlbW92ZSgpO3JldHVybiB5fTtoLmdldExhYmVsRm9yQmFzZUVkZ2U9cjtoLmdldExhYmVsRm9yRWRnZT1sO2guYXBwZW5kRWRnZT1uO2guaW50ZXJwb2xhdGU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlQmFzaXMpLngoeT0+eS54KS55KHk9PnkueSl9KShmLmVkZ2V8fChmLmVkZ2U9Cnt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZXh0ZXJucy5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ncmFwaC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoSixPLFMsTixSKXtyZXR1cm4oUz9TKyIvIjoiIikrKEorKCJ1bmRlZmluZWQiIT09dHlwZW9mIE4mJiJ1bmRlZmluZWQiIT09dHlwZW9mIFI/IlsiK04rIi0iK1IrIl0iOiIjIikrTyl9ZnVuY3Rpb24gaChKKXtpZighSilyZXR1cm4gbnVsbDtmb3IobGV0IE89MDtPPEoubGVuZ3RoO08rKyl7bGV0IHtrZXk6Uyx2YWx1ZTpOfT1KW09dO2lmKCJfb3V0cHV0X3NoYXBlcyI9PT1TKXtpZighTi5saXN0LnNoYXBlKWJyZWFrO2xldCBSPU4ubGlzdC5zaGFwZS5tYXAoWD0+WC51bmtub3duX3Jhbms/bnVsbDpudWxsPT1YLmRpbXx8MT09PVguZGltLmxlbmd0aCYmbnVsbD09WC5kaW1bMF0uc2l6ZT9bXTpYLmRpbS5tYXAoYWE9PmFhLnNpemUpKTtKLnNwbGljZShPLDEpO3JldHVybiBSfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBrKEope2lmKCFKKXJldHVybiBudWxsO2ZvcihsZXQgTz0wO088Si5sZW5ndGg7TysrKWlmKCJfWGxhQ2x1c3RlciI9PT0KSltPXS5rZXkpcmV0dXJuIEpbT10udmFsdWUuc3x8bnVsbDtyZXR1cm4gbnVsbH1mdW5jdGlvbiByKEope2xldCBPPVtdO18uZWFjaChKLFM9PntsZXQgTj0iXiI9PT1TWzBdO04mJihTPVMuc3Vic3RyaW5nKDEpKTtsZXQgUj1TLFg9IjAiLGFhPVMubWF0Y2goLyguKik6KFx3KzpcZCspJC8pO2lmKGFhKVI9YWFbMV0sWD1hYVsyXTtlbHNlIGlmKGFhPVMubWF0Y2goLyguKik6KFxkKykkLykpUj1hYVsxXSxYPWFhWzJdOzAhPT1PLmxlbmd0aCYmUj09PU9bTy5sZW5ndGgtMV0ubmFtZXx8Ty5wdXNoKHtuYW1lOlIsb3V0cHV0VGVuc29yS2V5OlgsaXNDb250cm9sRGVwZW5kZW5jeTpOfSl9KTtyZXR1cm4gT31mdW5jdGlvbiBsKEosTyxTLE4sUixYKXtPIT09Uy5uYW1lJiZKLmVkZ2VzLnB1c2goe3Y6Tyx3OlMubmFtZSxvdXRwdXRUZW5zb3JLZXk6Ti5vdXRwdXRUZW5zb3JLZXksaXNDb250cm9sRGVwZW5kZW5jeTpOLmlzQ29udHJvbERlcGVuZGVuY3ksaXNSZWZlcmVuY2VFZGdlOiEwPT09ClIucmVmRWRnZXNbUy5vcCsiICIrWF19KX1mdW5jdGlvbiBwKEosTyxTKXtTPVN8fHt9O2xldCBOPW5ldyBncmFwaGxpYi5HcmFwaChTKTtOLnNldEdyYXBoKHtuYW1lOkoscmFua2RpcjpTLnJhbmtkaXJ8fCJCVCIsdHlwZTpPfSk7cmV0dXJuIE59ZnVuY3Rpb24gbShKKXtyZXR1cm4gZnVuY3Rpb24oTyl7Zm9yKGxldCBTPTA7UzxKLmxlbmd0aDtTKyspe2xldCBOPW5ldyBSZWdFeHAoSltTXSk7aWYoInN0cmluZyI9PT10eXBlb2YgTy5vcCYmTy5vcC5tYXRjaChOKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gbihKKXtsZXQgTz1KLnNwbGl0KGQuTkFNRVNQQUNFX0RFTElNKTtyZXR1cm4gSitkLk5BTUVTUEFDRV9ERUxJTSsiKCIrT1tPLmxlbmd0aC0xXSsiKSJ9ZnVuY3Rpb24gcShKLE8pe2xldCBTPXt9LE49e307Si5zb3J0KCk7Zm9yKGxldCBSPTA7UjxKLmxlbmd0aC0xOysrUil7bGV0IFg9SltSXTtfLmVhY2godyhYKS5zbGljZSgwLC0xKSxhYT0+e05bYWFdPSEwfSk7Zm9yKGxldCBhYT0KUisxO2FhPEoubGVuZ3RoOysrYWEpe2xldCBmYT1KW2FhXTtpZihfLnN0YXJ0c1dpdGgoZmEsWCkpe2lmKGZhLmxlbmd0aD5YLmxlbmd0aCYmZmEuY2hhckF0KFgubGVuZ3RoKT09PWQuTkFNRVNQQUNFX0RFTElNKXtTW1hdPW4oWCk7YnJlYWt9fWVsc2UgYnJlYWt9fV8uZWFjaChPLFI9PntSIGluIE4mJihTW1JdPW4oUikpfSk7cmV0dXJuIFN9ZnVuY3Rpb24gdShKKXtsZXQgTz1KLm5vZGVzKCkubWFwKGZ1bmN0aW9uKFMpe3JldHVybiBKLm5laWdoYm9ycyhTKS5sZW5ndGh9KTtPLnNvcnQoKTtyZXR1cm4gT31mdW5jdGlvbiB3KEosTyl7bGV0IFM9W10sTj1KLmluZGV4T2YoZC5OQU1FU1BBQ0VfREVMSU0pO2Zvcig7MDw9TjspUy5wdXNoKEouc3Vic3RyaW5nKDAsTikpLE49Si5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNLE4rMSk7TyYmKE89T1tKXSkmJlMucHVzaChPKTtTLnB1c2goSik7cmV0dXJuIFN9ZC5OQU1FU1BBQ0VfREVMSU09Ii8iO2QuUk9PVF9OQU1FPSJfX3Jvb3RfXyI7CmQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0iX19mdW5jdGlvbl9saWJyYXJ5X18iO2QuTEFSR0VfQVRUUlNfS0VZPSJfdG9vX2xhcmdlX2F0dHJzIjtkLkxJTUlUX0FUVFJfU0laRT0xMDI0O2QuRURHRV9LRVlfREVMSU09Ii0tIjtsZXQgQTsoZnVuY3Rpb24oSil7SltKLkZVTEw9MF09IkZVTEwiO0pbSi5FTUJFRERFRD0xXT0iRU1CRURERUQiO0pbSi5NRVRBPTJdPSJNRVRBIjtKW0ouU0VSSUVTPTNdPSJTRVJJRVMiO0pbSi5DT1JFPTRdPSJDT1JFIjtKW0ouU0hBRE9XPTVdPSJTSEFET1ciO0pbSi5CUklER0U9Nl09IkJSSURHRSI7SltKLkVER0U9N109IkVER0UifSkoQT1kLkdyYXBoVHlwZXx8KGQuR3JhcGhUeXBlPXt9KSk7bGV0IHk7KGZ1bmN0aW9uKEope0pbSi5NRVRBPTBdPSJNRVRBIjtKW0ouT1A9MV09Ik9QIjtKW0ouU0VSSUVTPTJdPSJTRVJJRVMiO0pbSi5CUklER0U9M109IkJSSURHRSI7SltKLkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KSh5PWQuTm9kZVR5cGV8fAooZC5Ob2RlVHlwZT17fSkpO2xldCB4OyhmdW5jdGlvbihKKXtKW0ouSU5DTFVERT0wXT0iSU5DTFVERSI7SltKLkVYQ0xVREU9MV09IkVYQ0xVREUiO0pbSi5VTlNQRUNJRklFRD0yXT0iVU5TUEVDSUZJRUQifSkoeD1kLkluY2x1c2lvblR5cGV8fChkLkluY2x1c2lvblR5cGU9e30pKTsoZnVuY3Rpb24oSil7SltKLkdST1VQPTBdPSJHUk9VUCI7SltKLlVOR1JPVVA9MV09IlVOR1JPVVAifSkoZC5TZXJpZXNHcm91cGluZ1R5cGV8fChkLlNlcmllc0dyb3VwaW5nVHlwZT17fSkpO2NsYXNzIEN7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9O3RoaXMuZWRnZXM9W119fWQuU2xpbUdyYXBoPUM7Y2xhc3MgR3tjb25zdHJ1Y3RvcihKKXt0aGlzLnR5cGU9eS5FTExJUFNJUzt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLnN0YXRzPXRoaXMucGFyZW50Tm9kZT1udWxsO3RoaXMuc2V0TnVtTW9yZU5vZGVzKEopO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2RlcyhKKXt0aGlzLm51bU1vcmVOb2Rlcz0KSjt0aGlzLm5hbWU9Ii4uLiAiK0orIiBtb3JlIn19ZC5FbGxpcHNpc05vZGVJbXBsPUc7Y2xhc3MgRHtjb25zdHJ1Y3RvcihKKXt0aGlzLm9wPUoub3A7dGhpcy5uYW1lPUoubmFtZTt0aGlzLmRldmljZT1KLmRldmljZTt0aGlzLmF0dHI9Si5hdHRyO3RoaXMuaW5wdXRzPXIoSi5pbnB1dCk7dGhpcy5vdXRwdXRTaGFwZXM9aChKLmF0dHIpO3RoaXMueGxhQ2x1c3Rlcj1rKEouYXR0cik7dGhpcy5jb21wYXRpYmxlPSExO3RoaXMudHlwZT15Lk9QO3RoaXMuaXNHcm91cE5vZGU9ITE7dGhpcy5jYXJkaW5hbGl0eT0xO3RoaXMuaW5FbWJlZGRpbmdzPVtdO3RoaXMub3V0RW1iZWRkaW5ncz1bXTt0aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1kLk9wTm9kZUltcGw9RDtkLmNyZWF0ZU1ldGFub2RlPWZ1bmN0aW9uKEosTz17fSl7cmV0dXJuIG5ldyBIKEosTyl9O2Quam9pblN0YXRzSW5mb1dpdGhHcmFwaD1mdW5jdGlvbihKLApPLFMpe18uZWFjaChKLm5vZGVzLE49PntOLnN0YXRzPW51bGx9KTtfLmVhY2goTy5kZXZfc3RhdHMsTj0+e1MmJiFTW04uZGV2aWNlXXx8Xy5lYWNoKE4ubm9kZV9zdGF0cyxSPT57bGV0IFg9Ui5ub2RlX25hbWUgaW4gSi5ub2Rlcz9SLm5vZGVfbmFtZTpuKFIubm9kZV9uYW1lKTtpZihYIGluIEoubm9kZXMpe3ZhciBhYT0wO1IubWVtb3J5JiZfLmVhY2goUi5tZW1vcnksb2E9PntvYS50b3RhbF9ieXRlcyYmKDA8b2EudG90YWxfYnl0ZXM/YWErPU51bWJlcihvYS50b3RhbF9ieXRlcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciAiK1gpKX0pO3ZhciBmYT1udWxsO1Iub3V0cHV0JiYoZmE9Xy5tYXAoUi5vdXRwdXQsb2E9Pl8ubWFwKG9hLnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sWj0+TnVtYmVyKFouc2l6ZSkpKSk7Si5ub2Rlc1tYXS5kZXZpY2U9Ti5kZXZpY2U7bnVsbD09Si5ub2Rlc1tYXS5zdGF0cyYmKEoubm9kZXNbWF0uc3RhdHM9Cm5ldyBCKGZhKSk7Si5ub2Rlc1tYXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oYWEpO1IuYWxsX2VuZF9yZWxfbWljcm9zJiYoMDxSLmFsbF9lbmRfcmVsX21pY3Jvcz9KLm5vZGVzW1hdLnN0YXRzLmFkZEV4ZWN1dGlvblRpbWUoUi5hbGxfc3RhcnRfbWljcm9zLFIuYWxsX3N0YXJ0X21pY3JvcytSLmFsbF9lbmRfcmVsX21pY3Jvcyk6Y29uc29sZS5sb2coImlnbm9yaW5nIG5lZ2F0aXZlIHJ1bnRpbWUgZm9yICIrWCkpfX0pfSl9O2NsYXNzIEJ7Y29uc3RydWN0b3IoSil7dGhpcy50b3RhbEJ5dGVzPTA7dGhpcy5vdXRwdXRTaXplPUp9YWRkRXhlY3V0aW9uVGltZShKLE8pe3RoaXMuc3RhcnRUaW1lPW51bGwhPXRoaXMuc3RhcnRUaW1lP01hdGgubWluKHRoaXMuc3RhcnRUaW1lLEopOko7dGhpcy5lbmRUaW1lPW51bGwhPXRoaXMuZW5kVGltZT9NYXRoLm1heCh0aGlzLmVuZFRpbWUsTyk6T31hZGRCeXRlc0FsbG9jYXRpb24oSil7dGhpcy50b3RhbEJ5dGVzPW51bGwhPXRoaXMudG90YWxCeXRlcz8KTWF0aC5tYXgodGhpcy50b3RhbEJ5dGVzLEopOkp9Y29tYmluZShKKXtudWxsIT1KLnRvdGFsQnl0ZXMmJih0aGlzLnRvdGFsQnl0ZXMrPUoudG90YWxCeXRlcyk7bnVsbCE9Si5nZXRUb3RhbE1pY3JvcygpJiZ0aGlzLmFkZEV4ZWN1dGlvblRpbWUoSi5zdGFydFRpbWUsSi5lbmRUaW1lKX1nZXRUb3RhbE1pY3Jvcygpe3JldHVybiBudWxsPT10aGlzLnN0YXJ0VGltZXx8bnVsbD09dGhpcy5lbmRUaW1lP251bGw6dGhpcy5lbmRUaW1lLXRoaXMuc3RhcnRUaW1lfX1kLk5vZGVTdGF0cz1CO2NsYXNzIEh7Y29uc3RydWN0b3IoSixPPXt9KXt0aGlzLm5hbWU9Sjt0aGlzLnR5cGU9eS5NRVRBO3RoaXMuZGVwdGg9MTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9MDt0aGlzLm1ldGFncmFwaD1wKEosQS5NRVRBLE8pO3RoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLm9wSGlzdG9ncmFtPXt9O3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT0Ke307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMucGFyZW50Tm9kZT10aGlzLnRlbXBsYXRlSWQ9bnVsbDt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLmFzc29jaWF0ZWRGdW5jdGlvbj0iIn1nZXRGaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5tZXRhZ3JhcGgubm9kZXMoKVswXSl9Z2V0Um9vdE9wKCl7bGV0IEo9dGhpcy5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5uYW1lKyIvKCIrSltKLmxlbmd0aC0xXSsiKSIpfWxlYXZlcygpe2xldCBKPVtdLE89W3RoaXNdLFM7Zm9yKDtPLmxlbmd0aDspe2xldCBOPU8uc2hpZnQoKTtOLmlzR3JvdXBOb2RlPyhTPU4ubWV0YWdyYXBoLF8uZWFjaChTLm5vZGVzKCksUj0+Ty5wdXNoKFMubm9kZShSKSkpKTpKLnB1c2goTi5uYW1lKX1yZXR1cm4gSn19CmQuTWV0YW5vZGVJbXBsPUg7ZC5jcmVhdGVNZXRhZWRnZT1mdW5jdGlvbihKLE8pe3JldHVybiBuZXcgSyhKLE8pfTtjbGFzcyBLe2NvbnN0cnVjdG9yKEosTyl7dGhpcy52PUo7dGhpcy53PU87dGhpcy5iYXNlRWRnZUxpc3Q9W107dGhpcy5pbmJvdW5kPW51bGw7dGhpcy50b3RhbFNpemU9dGhpcy5udW1SZWZFZGdlcz10aGlzLm51bUNvbnRyb2xFZGdlcz10aGlzLm51bVJlZ3VsYXJFZGdlcz0wfWFkZEJhc2VFZGdlKEosTyl7dGhpcy5iYXNlRWRnZUxpc3QucHVzaChKKTtKLmlzQ29udHJvbERlcGVuZGVuY3k/dGhpcy5udW1Db250cm9sRWRnZXMrPTE6dGhpcy5udW1SZWd1bGFyRWRnZXMrPTE7Si5pc1JlZmVyZW5jZUVkZ2UmJih0aGlzLm51bVJlZkVkZ2VzKz0xKTt0aGlzLnRvdGFsU2l6ZSs9Sy5jb21wdXRlU2l6ZU9mRWRnZShKLE8pO08ubWF4TWV0YUVkZ2VTaXplPU1hdGgubWF4KE8ubWF4TWV0YUVkZ2VTaXplLHRoaXMudG90YWxTaXplKX1zdGF0aWMgY29tcHV0ZVNpemVPZkVkZ2UoSiwKTyl7bGV0IFM9Ty5ub2RlKEoudik7aWYoIVMub3V0cHV0U2hhcGVzKXJldHVybiAxO08uaGFzU2hhcGVJbmZvPSEwO0o9T2JqZWN0LmtleXMoUy5vdXRwdXRTaGFwZXMpLm1hcChOPT5TLm91dHB1dFNoYXBlc1tOXSkubWFwKE49Pm51bGw9PU4/MTpOLnJlZHVjZSgoUixYKT0+ey0xPT09WCYmKFg9MSk7cmV0dXJuIFIqWH0sMSkpO3JldHVybiBfLnN1bShKKX19ZC5NZXRhZWRnZUltcGw9SztkLmNyZWF0ZVNlcmllc05vZGU9ZnVuY3Rpb24oSixPLFMsTixSLFgpe3JldHVybiBuZXcgTChKLE8sUyxOLFIsWCl9O2QuZ2V0U2VyaWVzTm9kZU5hbWU9ZjtjbGFzcyBMe2NvbnN0cnVjdG9yKEosTyxTLE4sUixYKXt0aGlzLm5hbWU9Unx8ZihKLE8sUyk7dGhpcy50eXBlPXkuU0VSSUVTO3RoaXMuaGFzTG9vcD0hMTt0aGlzLnByZWZpeD1KO3RoaXMuc3VmZml4PU87dGhpcy5jbHVzdGVySWQ9Tjt0aGlzLmlkcz1bXTt0aGlzLnBhcmVudD1TO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0KMDt0aGlzLm1ldGFncmFwaD1wKFIsQS5TRVJJRVMsWCk7dGhpcy5wYXJlbnROb2RlPXRoaXMuYnJpZGdlZ3JhcGg9bnVsbDt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09e307dGhpcy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtPXtjb21wYXRpYmxlOjAsaW5jb21wYXRpYmxlOjB9O3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfX1kLkRlZmF1bHRCdWlsZFBhcmFtcz17ZW5hYmxlRW1iZWRkaW5nOiEwLGluRW1iZWRkaW5nVHlwZXM6WyJDb25zdCJdLG91dEVtYmVkZGluZ1R5cGVzOlsiXlthLXpBLVpdK1N1bW1hcnkkIl0scmVmRWRnZXM6eyJBc3NpZ24gMCI6ITAsIkFzc2lnbkFkZCAwIjohMCwiQXNzaWduU3ViIDAiOiEwLCJhc3NpZ24gMCI6ITAsImFzc2lnbl9hZGQgMCI6ITAsImFzc2lnbl9zdWIgMCI6ITAsImNvdW50X3VwX3RvIDAiOiEwLCJTY2F0dGVyQWRkIDAiOiEwLCJTY2F0dGVyU3ViIDAiOiEwLAoiU2NhdHRlclVwZGF0ZSAwIjohMCwic2NhdHRlcl9hZGQgMCI6ITAsInNjYXR0ZXJfc3ViIDAiOiEwLCJzY2F0dGVyX3VwZGF0ZSAwIjohMH19O2QuYnVpbGQ9ZnVuY3Rpb24oSixPLFMpe2xldCBOPXt9LFI9e30sWD17fSxhYT1tKE8uaW5FbWJlZGRpbmdUeXBlcyksZmE9bShPLm91dEVtYmVkZGluZ1R5cGVzKSxvYT1bXSxaPUoubm9kZSxjYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBqYT1BcnJheShaLmxlbmd0aCksYmE9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoYWEodmEpKXJldHVybiBvYS5wdXNoKHZhLm5hbWUpLE5bdmEubmFtZV09dmE7aWYoZmEodmEpKXJldHVybiBvYS5wdXNoKHZhLm5hbWUpLFJbdmEubmFtZV09dmEsXy5lYWNoKHZhLmlucHV0cyx5YT0+e3lhPXlhLm5hbWU7WFt5YV09WFt5YV18fFtdO1hbeWFdLnB1c2godmEpfSksdmE7amFbYmFdPQp2YTtjYVtiYV09dmEubmFtZTtiYSsrO3JldHVybiB2YX07Xy5lYWNoKFosa2EpO2NvbnN0IFc9RWE9Pntjb25zdCB2YT1kLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrRWEuc2lnbmF0dXJlLm5hbWU7a2Eoe25hbWU6dmEsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiIiLGF0dHI6W119KTtpZihFYS5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgeGE9MDt2YXIgeWE9U2E9PntrYSh7bmFtZTp2YStkLk5BTUVTUEFDRV9ERUxJTStTYS5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTpTYS50eXBlfX1dfSkuZnVuY3Rpb25JbnB1dEluZGV4PXhhO3hhKyt9O0VhLnNpZ25hdHVyZS5pbnB1dF9hcmcubmFtZT95YShFYS5zaWduYXR1cmUuaW5wdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLmlucHV0X2FyZyx5YSl9bGV0IEFhPTA7Y29uc3QgRmE9e307RWEuc2lnbmF0dXJlLm91dHB1dF9hcmcmJih5YT14YT0+e0ZhW3ZhKwpkLk5BTUVTUEFDRV9ERUxJTSt4YS5uYW1lXT1BYTtBYSsrfSxFYS5zaWduYXR1cmUub3V0cHV0X2FyZy5uYW1lP3lhKEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnKTpfLmVhY2goRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcseWEpKTtfLmVhY2goRWEubm9kZV9kZWYseGE9Pnt4YS5uYW1lPXZhKyIvIit4YS5uYW1lOyJzdHJpbmciPT09dHlwZW9mIHhhLmlucHV0JiYoeGEuaW5wdXQ9W3hhLmlucHV0XSk7Y29uc3QgU2E9a2EoeGEpO18uaXNOdW1iZXIoRmFbeGEubmFtZV0pJiYoU2EuZnVuY3Rpb25PdXRwdXRJbmRleD1GYVt4YS5uYW1lXSk7Xy5lYWNoKFNhLmlucHV0cyxYYT0+e1hhLm5hbWU9dmErZC5OQU1FU1BBQ0VfREVMSU0rWGEubmFtZX0pfSl9O0oubGlicmFyeSYmSi5saWJyYXJ5LmZ1bmN0aW9uJiZfLmVhY2goSi5saWJyYXJ5LmZ1bmN0aW9uLFcpO2phLnNwbGljZShiYSk7Y2Euc3BsaWNlKGJhKTtyZXR1cm4gamF9LFMpLnRoZW4oamE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsCjcwLCgpPT57bGV0IGJhPXEoY2Esb2EpLGthPW5ldyBDO18uZWFjaChqYSxXPT57bGV0IEVhPWJhW1cubmFtZV18fFcubmFtZTtrYS5ub2Rlc1tFYV09VztXLm5hbWUgaW4gWCYmKFcub3V0RW1iZWRkaW5ncz1YW1cubmFtZV0sXy5lYWNoKFcub3V0RW1iZWRkaW5ncyx2YT0+e3ZhLm5hbWU9YmFbdmEubmFtZV18fHZhLm5hbWV9KSk7Vy5uYW1lPUVhfSk7Xy5lYWNoKGphLFc9PntfLmVhY2goVy5pbnB1dHMsKEVhLHZhKT0+e2xldCB5YT1FYS5uYW1lO2lmKHlhIGluIE4pe0VhPU5beWFdO1cuaW5FbWJlZGRpbmdzLnB1c2goRWEpO2Zvcih2YXIgQWEgb2YgRWEuaW5wdXRzKWwoa2EsYmFbQWEubmFtZV18fEFhLm5hbWUsVyxBYSxPLHZhKX1lbHNlIGlmKHlhIGluIFIpe0FhPVJbeWFdO2ZvcihsZXQgRmEgb2YgQWEuaW5wdXRzKWwoa2EsYmFbRmEubmFtZV18fEZhLm5hbWUsVyxFYSxPLHZhKX1lbHNlIGwoa2EsYmFbeWFdfHx5YSxXLEVhLE8sdmEpfSl9KTtfLmVhY2goTixXPT57Vy5uYW1lPQpiYVtXLm5hbWVdfHxXLm5hbWV9KTtyZXR1cm4ga2F9LFMpKX07ZC5jcmVhdGVHcmFwaD1wO2QuZ2V0U3RyaWN0TmFtZT1uO2QuaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlPWZ1bmN0aW9uKEosTyl7Sj11KEopO089dShPKTtmb3IobGV0IFM9MDtTPEoubGVuZ3RoO1MrKylpZihKW1NdIT09T1tTXSlyZXR1cm4hMTtyZXR1cm4hMH07ZC5nZXRIaWVyYXJjaGljYWxQYXRoPXc7ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWIuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFPyJBZGQgdG8gbWFpbiBncmFwaCI6IlJlbW92ZSBmcm9tIG1haW4gZ3JhcGgifTtkLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZz1mdW5jdGlvbihKKXtyZXR1cm4gSj09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQPyJVbmdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIjoiR3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMifTtkLnRvZ2dsZU5vZGVTZXJpZXNHcm91cD0KZnVuY3Rpb24oSixPKXtKW09dPU8gaW4gSiYmSltPXSE9PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQP2IuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOmIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB9fSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vaGllcmFyY2h5LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodyxBLHkseCl7QT15P3cuaW5FZGdlcyhBLm5hbWUpOncub3V0RWRnZXMoQS5uYW1lKTtfLmVhY2goQSxDPT57Qz13LmVkZ2UoQyk7KEMubnVtUmVndWxhckVkZ2VzP3gucmVndWxhcjp4LmNvbnRyb2wpLnB1c2goQyl9KX1mdW5jdGlvbiBrKHcsQSl7Y29uc3QgeT17fTtfLmVhY2goQS5ub2Rlcyx4PT57bGV0IEM9ZC5nZXRIaWVyYXJjaGljYWxQYXRoKHgubmFtZSksRz13LnJvb3Q7Ry5kZXB0aD1NYXRoLm1heChDLmxlbmd0aCxHLmRlcHRoKTt5W3gub3BdfHwoeVt4Lm9wXT1bXSk7eVt4Lm9wXS5wdXNoKHgpO2ZvcihsZXQgQj0wO0I8Qy5sZW5ndGg7QisrKXtHLmRlcHRoPU1hdGgubWF4KEcuZGVwdGgsQy5sZW5ndGgtQik7Ry5jYXJkaW5hbGl0eSs9eC5jYXJkaW5hbGl0eTtHLm9wSGlzdG9ncmFtW3gub3BdPShHLm9wSGlzdG9ncmFtW3gub3BdfHwwKSsxO251bGwhPXguZGV2aWNlJiYoRy5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdPQooRy5kZXZpY2VIaXN0b2dyYW1beC5kZXZpY2VdfHwwKSsxKTtudWxsIT14LnhsYUNsdXN0ZXImJihHLnhsYUNsdXN0ZXJIaXN0b2dyYW1beC54bGFDbHVzdGVyXT0oRy54bGFDbHVzdGVySGlzdG9ncmFtW3gueGxhQ2x1c3Rlcl18fDApKzEpO3guY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2goeC5pbkVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8CjApKzF9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEcuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtpZihCPT09Qy5sZW5ndGgtMSlicmVhazt2YXIgRD1DW0JdO2xldCBIPXcubm9kZShEKTtIfHwoSD1kLmNyZWF0ZU1ldGFub2RlKEQsdy5ncmFwaE9wdGlvbnMpLEgucGFyZW50Tm9kZT1HLHcuc2V0Tm9kZShELEgpLEcubWV0YWdyYXBoLnNldE5vZGUoRCxIKSwwPT09RC5pbmRleE9mKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkmJkcubmFtZT09PWIuZ3JhcGguUk9PVF9OQU1FJiYoRD1ELnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSx5W0RdfHwKKHlbRF09W10pLHcubGlicmFyeUZ1bmN0aW9uc1tEXT17bm9kZTpILHVzYWdlczp5W0RdfSxILmFzc29jaWF0ZWRGdW5jdGlvbj1EKSk7Rz1IfXcuc2V0Tm9kZSh4Lm5hbWUseCk7eC5wYXJlbnROb2RlPUc7Ry5tZXRhZ3JhcGguc2V0Tm9kZSh4Lm5hbWUseCk7Xy5lYWNoKHguaW5FbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3cuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KTtfLmVhY2goeC5vdXRFbWJlZGRpbmdzLGZ1bmN0aW9uKEIpe3cuc2V0Tm9kZShCLm5hbWUsQik7Qi5wYXJlbnROb2RlPXh9KX0pfWZ1bmN0aW9uIHIodyxBKXtsZXQgeT13LmdldE5vZGVNYXAoKSx4PVtdLEM9W10sRz0oRCxCKT0+e2xldCBIPTA7Zm9yKDtEOylCW0grK109RC5uYW1lLEQ9RC5wYXJlbnROb2RlO3JldHVybiBILTF9O18uZWFjaChBLmVkZ2VzLEQ9Pnt2YXIgQj1HKEEubm9kZXNbRC52XSx4KSxIPUcoQS5ub2Rlc1tELnddLEMpO2lmKC0xIT09QiYmLTEhPT1IKXtmb3IoO3hbQl09PT1DW0hdOylpZihCLS0sCkgtLSwwPkJ8fDA+SCl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO3ZhciBLPXlbeFtCKzFdXTtCPXhbQl07SD1DW0hdO3ZhciBMPUsubWV0YWdyYXBoLmVkZ2UoQixIKTtMfHwoTD1kLmNyZWF0ZU1ldGFlZGdlKEIsSCksSy5tZXRhZ3JhcGguc2V0RWRnZShCLEgsTCkpO0suaGFzTm9uQ29udHJvbEVkZ2VzfHxELmlzQ29udHJvbERlcGVuZGVuY3l8fChLLmhhc05vbkNvbnRyb2xFZGdlcz0hMCk7TC5hZGRCYXNlRWRnZShELHcpfX0pfWZ1bmN0aW9uIGwodyxBLHkseCxDLEcpe2xldCBEPXcubWV0YWdyYXBoO18uZWFjaChELm5vZGVzKCksQj0+e0I9RC5ub2RlKEIpO0IudHlwZT09PWIuZ3JhcGguTm9kZVR5cGUuTUVUQSYmbChCLEEseSx4LEMsRyl9KTt3PXAoRCk7dz0oRz9uOm0pKHcsRCxBLmdyYXBoT3B0aW9ucyk7Xy5lYWNoKHcsZnVuY3Rpb24oQixIKXtsZXQgSz1CLm1ldGFncmFwaC5ub2RlcygpO18uZWFjaChLLEw9Pgp7TD1ELm5vZGUoTCk7TC5vd25pbmdTZXJpZXN8fChMLm93bmluZ1Nlcmllcz1IKX0pO0subGVuZ3RoPHgmJiEoQi5uYW1lIGluIEMpJiYoQ1tCLm5hbWVdPWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApO0IubmFtZSBpbiBDJiZDW0IubmFtZV09PT1iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfHwoQS5zZXROb2RlKEgsQiksRC5zZXROb2RlKEgsQiksXy5lYWNoKEssTD0+e2xldCBKPUQubm9kZShMKTtCLm1ldGFncmFwaC5zZXROb2RlKEwsSik7Qi5wYXJlbnROb2RlPUoucGFyZW50Tm9kZTtCLmNhcmRpbmFsaXR5Kys7bnVsbCE9Si5kZXZpY2UmJihCLmRldmljZUhpc3RvZ3JhbVtKLmRldmljZV09KEIuZGV2aWNlSGlzdG9ncmFtW0ouZGV2aWNlXXx8MCkrMSk7bnVsbCE9Si54bGFDbHVzdGVyJiYoQi54bGFDbHVzdGVySGlzdG9ncmFtW0oueGxhQ2x1c3Rlcl09KEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtKLnhsYUNsdXN0ZXJdfHwwKSsxKTtKLmNvbXBhdGlibGU/CkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaChKLmluRW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7Xy5lYWNoKEoub3V0RW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0IuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPQooQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO0oucGFyZW50Tm9kZT1CO3lbTF09SDtELnJlbW92ZU5vZGUoTCl9KSl9KX1mdW5jdGlvbiBwKHcpe3JldHVybiBfLnJlZHVjZSh3Lm5vZGVzKCksKEEseSk9Pnt5PXcubm9kZSh5KTtpZih5LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpcmV0dXJuIEE7bGV0IHg9eS5vcDt4JiYoQVt4XT1BW3hdfHxbXSxBW3hdLnB1c2goeS5uYW1lKSk7cmV0dXJuIEF9LHt9KX1mdW5jdGlvbiBtKHcsQSx5KXtsZXQgeD17fTtfLmVhY2godyxmdW5jdGlvbihDLEcpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fTtfLmVhY2goQyxmdW5jdGlvbihCKXt2YXIgSD0iKiI9PT1CLmNoYXJBdChCLmxlbmd0aC0xKSxLPUIuc3BsaXQoIi8iKSxMPUtbSy5sZW5ndGgtMV07Sz1LLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpO3ZhciBKPUwubWF0Y2goL14oXEQqKV8oXGQrKSQvKTtsZXQgTz0iIjtKPyhMPUpbMV0sSj1KWzJdKToKKEw9SD9MLnN1YnN0cigwLEwubGVuZ3RoLTEpOkwsSj0wLE89SD8iKiI6IiIpO0g9ZC5nZXRTZXJpZXNOb2RlTmFtZShMLE8sSyk7RFtIXT1EW0hdfHxbXTtCPWQuY3JlYXRlU2VyaWVzTm9kZShMLE8sSywrSixCLHkpO0RbSF0ucHVzaChCKX0pO18uZWFjaChELGZ1bmN0aW9uKEIpe2lmKCEoMj5CLmxlbmd0aCkpe0Iuc29ydChmdW5jdGlvbihLLEwpe3JldHVybitLLmNsdXN0ZXJJZC0rTC5jbHVzdGVySWR9KTt2YXIgSD1bQlswXV07Zm9yKGxldCBLPTE7SzxCLmxlbmd0aDtLKyspe2xldCBMPUJbS107TC5jbHVzdGVySWQ9PT1IW0gubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0gucHVzaChMKToocShILHgsK0csQSx5KSxIPVtMXSl9cShILHgsK0csQSx5KX19KX19KTtyZXR1cm4geH1mdW5jdGlvbiBuKHcsQSx5KXtsZXQgeD17fTtfLmVhY2godyxmdW5jdGlvbihDLEcpe2lmKCEoMT49Qy5sZW5ndGgpKXt2YXIgRD17fSxCPXt9O18uZWFjaChDLGZ1bmN0aW9uKEspe2xldCBMPSIqIj09PQpLLmNoYXJBdChLLmxlbmd0aC0xKTt2YXIgSj1LLnNwbGl0KCIvIik7bGV0IE89SltKLmxlbmd0aC0xXTtKPUouc2xpY2UoMCxKLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgUz0vKFxkKykvZzt2YXIgTjtsZXQgUixYLGFhLGZhPTA7Zm9yKDtOPVMuZXhlYyhPKTspKytmYSxSPU8uc2xpY2UoMCxOLmluZGV4KSxYPU5bMF0sTj1PLnNsaWNlKE4uaW5kZXgrTlswXS5sZW5ndGgpLGFhPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUixOLEopLERbYWFdPURbYWFdLERbYWFdfHwoRFthYV09ZC5jcmVhdGVTZXJpZXNOb2RlKFIsTixKLCtYLEsseSkpLERbYWFdLmlkcy5wdXNoKFgpLEJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxYXSk7MT5mYSYmKFI9TD9PLnN1YnN0cigwLE8ubGVuZ3RoLTEpOk8sWD0wLE49TD8iKiI6IiIsYWE9ZC5nZXRTZXJpZXNOb2RlTmFtZShSLE4sSiksRFthYV09RFthYV0sRFthYV18fChEW2FhXT1kLmNyZWF0ZVNlcmllc05vZGUoUixOLEosK1gsSyx5KSksRFthYV0uaWRzLnB1c2goWCksCkJbS109QltLXXx8W10sQltLXS5wdXNoKFthYSxYXSkpfSk7dmFyIEg9e307Xy5lYWNoKEIsZnVuY3Rpb24oSyxMKXtLLnNvcnQoZnVuY3Rpb24oUyxOKXtyZXR1cm4gRFtOWzBdXS5pZHMubGVuZ3RoLURbU1swXV0uaWRzLmxlbmd0aH0pO3ZhciBKPUtbMF1bMF07Sz1LWzBdWzFdO0hbSl09SFtKXXx8W107Y29uc3QgTz1MLnNwbGl0KCIvIik7TD1kLmNyZWF0ZVNlcmllc05vZGUoRFtKXS5wcmVmaXgsRFtKXS5zdWZmaXgsTy5zbGljZSgwLE8ubGVuZ3RoLTEpLmpvaW4oIi8iKSwrSyxMLHkpO0hbSl0ucHVzaChMKX0pO18uZWFjaChILGZ1bmN0aW9uKEspe2lmKCEoMj5LLmxlbmd0aCkpe0suc29ydChmdW5jdGlvbihKLE8pe3JldHVybitKLmNsdXN0ZXJJZC0rTy5jbHVzdGVySWR9KTt2YXIgTD1bS1swXV07Zm9yKGxldCBKPTE7SjxLLmxlbmd0aDtKKyspe2xldCBPPUtbSl07Ty5jbHVzdGVySWQ9PT1MW0wubGVuZ3RoLTFdLmNsdXN0ZXJJZCsxP0wucHVzaChPKToocShMLHgsK0csQSwKeSksTD1bT10pfXEoTCx4LCtHLEEseSl9fSl9fSk7cmV0dXJuIHh9ZnVuY3Rpb24gcSh3LEEseSx4LEMpe2lmKDE8dy5sZW5ndGgpe2xldCBHPWQuZ2V0U2VyaWVzTm9kZU5hbWUod1swXS5wcmVmaXgsd1swXS5zdWZmaXgsd1swXS5wYXJlbnQsd1swXS5jbHVzdGVySWQsd1t3Lmxlbmd0aC0xXS5jbHVzdGVySWQpLEQ9ZC5jcmVhdGVTZXJpZXNOb2RlKHdbMF0ucHJlZml4LHdbMF0uc3VmZml4LHdbMF0ucGFyZW50LHksRyxDKTtfLmVhY2godyxmdW5jdGlvbihCKXtELmlkcy5wdXNoKEIuY2x1c3RlcklkKTtELm1ldGFncmFwaC5zZXROb2RlKEIubmFtZSx4Lm5vZGUoQi5uYW1lKSl9KTtBW0ddPUR9fWNsYXNzIHV7Y29uc3RydWN0b3Iodyl7dGhpcy5oYXNTaGFwZUluZm89ITE7dGhpcy5tYXhNZXRhRWRnZVNpemU9MTt0aGlzLmdyYXBoT3B0aW9ucz13fHx7fTt0aGlzLmdyYXBoT3B0aW9ucy5jb21wb3VuZD0hMDt0aGlzLnJvb3Q9ZC5jcmVhdGVNZXRhbm9kZShkLlJPT1RfTkFNRSx0aGlzLmdyYXBoT3B0aW9ucyk7CnRoaXMubGlicmFyeUZ1bmN0aW9ucz17fTt0aGlzLnhsYUNsdXN0ZXJzPXRoaXMuZGV2aWNlcz10aGlzLnRlbXBsYXRlcz1udWxsO3RoaXMuaW5kZXg9e307dGhpcy5pbmRleFtkLlJPT1RfTkFNRV09dGhpcy5yb290O3RoaXMub3JkZXJpbmdzPXt9fWdldE5vZGVNYXAoKXtyZXR1cm4gdGhpcy5pbmRleH1ub2RlKHcpe3JldHVybiB0aGlzLmluZGV4W3ddfXNldE5vZGUodyxBKXt0aGlzLmluZGV4W3ddPUF9Z2V0QnJpZGdlZ3JhcGgodyl7dmFyIEE9dGhpcy5pbmRleFt3XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSBpbiBoaWVyYXJjaHk6ICIrdyk7aWYoISgibWV0YWdyYXBoImluIEEpKXJldHVybiBudWxsO2lmKEEuYnJpZGdlZ3JhcGgpcmV0dXJuIEEuYnJpZGdlZ3JhcGg7bGV0IHk9QS5icmlkZ2VncmFwaD1kLmNyZWF0ZUdyYXBoKCJCUklER0VHUkFQSCIsZC5HcmFwaFR5cGUuQlJJREdFLHRoaXMuZ3JhcGhPcHRpb25zKTtpZighKEEucGFyZW50Tm9kZSYmCiJtZXRhZ3JhcGgiaW4gQS5wYXJlbnROb2RlKSlyZXR1cm4geTt2YXIgeD1BLnBhcmVudE5vZGU7QT14Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtfLmVhY2goW0EseF0sQz0+e0MuZWRnZXMoKS5maWx0ZXIoRz0+Ry52PT09d3x8Ry53PT09dykuZm9yRWFjaChHPT57bGV0IEQ9Ry53PT09dyxCPUMuZWRnZShHKTtfLmVhY2goQi5iYXNlRWRnZUxpc3QsSD0+e2xldCBbSyxMXT1EP1tILncsRy52XTpbSC52LEcud107dmFyIEo9dGhpcy5nZXRDaGlsZE5hbWUodyxLKTtKPXt2OkQ/TDpKLHc6RD9KOkx9O2xldCBPPXkuZWRnZShKKTtPfHwoTz1kLmNyZWF0ZU1ldGFlZGdlKEoudixKLncpLE8uaW5ib3VuZD1ELHkuc2V0RWRnZShKLnYsSi53LE8pKTtPLmFkZEJhc2VFZGdlKEgsdGhpcyl9KX0pfSk7cmV0dXJuIHl9Z2V0Q2hpbGROYW1lKHcsQSl7bGV0IHk9dGhpcy5pbmRleFtBXTtmb3IoO3k7KXtpZih5LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5uYW1lPT09CncpcmV0dXJuIHkubmFtZTt5PXkucGFyZW50Tm9kZX10aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgaW1tZWRpYXRlIGNoaWxkIGZvciBkZXNjZW5kYW50OiAiK0EpO31nZXRQcmVkZWNlc3NvcnModyl7bGV0IEE9dGhpcy5pbmRleFt3XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdyk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCEwKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5pbkVtYmVkZGluZ3MseD0+e18uZWFjaChBLmlucHV0cyxDPT57aWYoQy5uYW1lPT09eC5uYW1lKXtsZXQgRz1uZXcgZC5NZXRhZWRnZUltcGwoeC5uYW1lLHcpO0cuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6Qy5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTpDLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp4Lm5hbWUsd30sdGhpcyk7eS5yZWd1bGFyLnB1c2goRyl9fSl9KTtyZXR1cm4geX1nZXRTdWNjZXNzb3JzKHcpe2xldCBBPQp0aGlzLmluZGV4W3ddO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit3KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITEpO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLm91dEVtYmVkZGluZ3MseD0+e18uZWFjaCh4LmlucHV0cyxDPT57aWYoQy5uYW1lPT09dyl7bGV0IEc9bmV3IGQuTWV0YWVkZ2VJbXBsKHcseC5uYW1lKTtHLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6dyx3OngubmFtZX0sdGhpcyk7eS5yZWd1bGFyLnB1c2goRyl9fSl9KTtyZXR1cm4geX1nZXRPbmVXYXlFZGdlcyh3LEEpe2xldCB5PXtjb250cm9sOltdLHJlZ3VsYXI6W119O2lmKCF3LnBhcmVudE5vZGV8fCF3LnBhcmVudE5vZGUuaXNHcm91cE5vZGUpcmV0dXJuIHk7dmFyIHg9dy5wYXJlbnROb2RlO2xldCBDPQp4Lm1ldGFncmFwaDt4PXRoaXMuZ2V0QnJpZGdlZ3JhcGgoeC5uYW1lKTtoKEMsdyxBLHkpO2goeCx3LEEseSk7cmV0dXJuIHl9Z2V0VG9wb2xvZ2ljYWxPcmRlcmluZyh3KXt2YXIgQT10aGlzLmluZGV4W3ddO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit3KTtpZighQS5pc0dyb3VwTm9kZSlyZXR1cm4gbnVsbDtpZih3IGluIHRoaXMub3JkZXJpbmdzKXJldHVybiB0aGlzLm9yZGVyaW5nc1t3XTtsZXQgeT17fSx4PXt9LEM9QS5tZXRhZ3JhcGg7Xy5lYWNoKEMuZWRnZXMoKSxEPT57Qy5lZGdlKEQpLm51bVJlZ3VsYXJFZGdlcyYmKEQudiBpbiB5fHwoeVtELnZdPVtdKSx5W0Qudl0ucHVzaChELncpLHhbRC53XT0hMCl9KTtsZXQgRz1fLmRpZmZlcmVuY2UoXy5rZXlzKHkpLF8ua2V5cyh4KSk7dz10aGlzLm9yZGVyaW5nc1t3XT17fTtmb3IoQT0wO0cubGVuZ3RoOyl7bGV0IEQ9Ry5zaGlmdCgpO3dbRF09QSsrO18uZWFjaCh5W0RdLEI9PgpHLnB1c2goQikpO2RlbGV0ZSB5W0RdfXJldHVybiB3fWdldFRlbXBsYXRlSW5kZXgoKXtsZXQgdz1kMy5rZXlzKHRoaXMudGVtcGxhdGVzKSxBPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih3KS5yYW5nZShkMy5yYW5nZSgwLHcubGVuZ3RoKSk7cmV0dXJuIHk9PkEoeSl9fWYuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcz17dmVyaWZ5VGVtcGxhdGU6ITAsc2VyaWVzTm9kZU1pblNpemU6NSxzZXJpZXNNYXA6e30scmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2YuYnVpbGQ9ZnVuY3Rpb24odyxBLHkpe2xldCB4PW5ldyB1KHtyYW5rZGlyOkEucmFua0RpcmVjdGlvbn0pLEM9e307cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBub2RlcyIsMjAsKCk9PntsZXQgRz17fSxEPXt9O18uZWFjaCh3Lm5vZGVzLEI9PntCLmRldmljZSYmKEdbQi5kZXZpY2VdPSEwKTtCLnhsYUNsdXN0ZXImJihEW0IueGxhQ2x1c3Rlcl09ITApfSk7CnguZGV2aWNlcz1fLmtleXMoRyk7eC54bGFDbHVzdGVycz1fLmtleXMoRCk7ayh4LHcpfSx5KS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJEZXRlY3Qgc2VyaWVzIiwyMCwoKT0+ezA8QS5zZXJpZXNOb2RlTWluU2l6ZSYmbCh4LnJvb3QseCxDLEEuc2VyaWVzTm9kZU1pblNpemUsQS5zZXJpZXNNYXAsQS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0seSkpLnRoZW4oKCk9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkFkZGluZyBlZGdlcyIsMzAsKCk9PntyKHgsdyxDKX0seSkpLnRoZW4oKCk9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIkZpbmRpbmcgc2ltaWxhciBzdWJncmFwaHMiLDMwLCgpPT57eC50ZW1wbGF0ZXM9ZC50ZW1wbGF0ZS5kZXRlY3QoeCxBLnZlcmlmeVRlbXBsYXRlKX0seSkpLnRoZW4oKCk9PngpfTtmLmpvaW5BbmRBZ2dyZWdhdGVTdGF0cz1mdW5jdGlvbih3KXtsZXQgQT17fSx5PXt9O18uZWFjaCh3LnJvb3QubGVhdmVzKCksCng9Pnt4PXcubm9kZSh4KTtudWxsIT14LmRldmljZSYmKEFbeC5kZXZpY2VdPSEwKTtudWxsIT14LnhsYUNsdXN0ZXImJih5W3gueGxhQ2x1c3Rlcl09ITApfSk7dy5kZXZpY2VzPV8ua2V5cyhBKTt3LnhsYUNsdXN0ZXJzPV8ua2V5cyh5KTtfLmVhY2gody5nZXROb2RlTWFwKCkseD0+e3guaXNHcm91cE5vZGUmJih4LnN0YXRzPW5ldyBkLk5vZGVTdGF0cyhudWxsKSx4LmRldmljZUhpc3RvZ3JhbT17fSl9KTtfLmVhY2gody5yb290LmxlYXZlcygpLHg9PntsZXQgQz14PXcubm9kZSh4KTtmb3IoO251bGwhPUMucGFyZW50Tm9kZTspe2lmKG51bGwhPXguZGV2aWNlKXt2YXIgRz1DLnBhcmVudE5vZGUuZGV2aWNlSGlzdG9ncmFtO0dbeC5kZXZpY2VdPShHW3guZGV2aWNlXXx8MCkrMX1udWxsIT14LnhsYUNsdXN0ZXImJihHPUMucGFyZW50Tm9kZS54bGFDbHVzdGVySGlzdG9ncmFtLEdbeC54bGFDbHVzdGVyXT0oR1t4LnhsYUNsdXN0ZXJdfHwwKSsxKTtudWxsIT14LnN0YXRzJiZDLnBhcmVudE5vZGUuc3RhdHMuY29tYmluZSh4LnN0YXRzKTsKQz1DLnBhcmVudE5vZGV9fSl9O2YuZ2V0SW5jb21wYXRpYmxlT3BzPWZ1bmN0aW9uKHcsQSl7bGV0IHk9W10seD17fTtfLmVhY2gody5yb290LmxlYXZlcygpLEM9PntDPXcubm9kZShDKTtpZihDLnR5cGU9PWQuTm9kZVR5cGUuT1Ape2lmKCFDLmNvbXBhdGlibGUpaWYoQy5vd25pbmdTZXJpZXMpaWYoQSYmQS5zZXJpZXNNYXBbQy5vd25pbmdTZXJpZXNdPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl5LnB1c2goQyk7ZWxzZXtpZigheFtDLm93bmluZ1Nlcmllc10pe2xldCBHPXcubm9kZShDLm93bmluZ1Nlcmllcyk7RyYmKHhbQy5vd25pbmdTZXJpZXNdPUcseS5wdXNoKEcpKX19ZWxzZSB5LnB1c2goQyk7Xy5lYWNoKEMuaW5FbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pO18uZWFjaChDLm91dEVtYmVkZGluZ3MsRz0+e0cuY29tcGF0aWJsZXx8eS5wdXNoKEcpfSl9fSk7cmV0dXJuIHl9fSkoZC5oaWVyYXJjaHl8fChkLmhpZXJhcmNoeT0Ke30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2xheW91dC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHgpe3gubm9kZS5pc0dyb3VwTm9kZSYmcih4KTt4Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQT9wKHgpOngubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJm0oeCl9ZnVuY3Rpb24gayh4KXt4LmluYm94V2lkdGg9MDx4LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/Zi5QQVJBTVMuYW5ub3RhdGlvbnMuaW5ib3hXaWR0aDowO3gub3V0Ym94V2lkdGg9MDx4Lm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLm91dGJveFdpZHRoOjA7eC5jb3JlQm94LndpZHRoPXgud2lkdGg7eC5jb3JlQm94LmhlaWdodD14LmhlaWdodDt4LndpZHRoPU1hdGgubWF4KHguY29yZUJveC53aWR0aCt4LmluYm94V2lkdGgreC5vdXRib3hXaWR0aCwzKnguZGlzcGxheU5hbWUubGVuZ3RoKX1mdW5jdGlvbiByKHgpe2xldCBDPXguY29yZUdyYXBoLm5vZGVzKCkubWFwKEc9Pgp4LmNvcmVHcmFwaC5ub2RlKEcpKS5jb25jYXQoeC5pc29sYXRlZEluRXh0cmFjdCx4Lmlzb2xhdGVkT3V0RXh0cmFjdCx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0KTtfLmVhY2goQyxHPT57c3dpdGNoKEcubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpfLmV4dGVuZChHLGYuUEFSQU1TLm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6Ry5leHBhbmRlZD9oKEcpOihfLmV4dGVuZChHLGYuUEFSQU1TLm5vZGVTaXplLm1ldGEpLEcuaGVpZ2h0PWYuUEFSQU1TLm5vZGVTaXplLm1ldGEuaGVpZ2h0KEcubm9kZS5jYXJkaW5hbGl0eSkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6Ry5leHBhbmRlZD8oXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuZXhwYW5kZWQpLGgoRykpOl8uZXh0ZW5kKEcsRy5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8KZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLnZlcnRpY2FsOmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy5ob3Jpem9udGFsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK0cubm9kZS50eXBlKTt9Ry5leHBhbmRlZHx8ayhHKTtuKEcpfSl9ZnVuY3Rpb24gbCh4LEMpe18uZXh0ZW5kKHguZ3JhcGgoKSx7bm9kZXNlcDpDLm5vZGVTZXAscmFua3NlcDpDLnJhbmtTZXAsZWRnZXNlcDpDLmVkZ2VTZXB9KTtsZXQgRz1bXSxEPVtdO18uZWFjaCh4Lm5vZGVzKCksSj0+e3gubm9kZShKKS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLkJSSURHRT9HLnB1c2goSik6RC5wdXNoKEopfSk7aWYoIUQubGVuZ3RoKXJldHVybnt3aWR0aDowLGhlaWdodDowfTtkYWdyZS5sYXlvdXQoeCk7bGV0IEI9SW5maW5pdHksSD1JbmZpbml0eSxLPS1JbmZpbml0eSxMPS1JbmZpbml0eTtfLmVhY2goRCxKPT57Sj14Lm5vZGUoSik7dmFyIE89LjUqSi53aWR0aCxTPUoueC0KTztPPUoueCtPO0I9UzxCP1M6QjtLPU8+Sz9POks7Tz0uNSpKLmhlaWdodDtTPUoueS1PO0o9Si55K087SD1TPEg/UzpIO0w9Sj5MP0o6TH0pO18uZWFjaCh4LmVkZ2VzKCksSj0+e0o9eC5lZGdlKEopO2lmKCFKLnN0cnVjdHVyYWwpe3ZhciBPPXgubm9kZShKLm1ldGFlZGdlLnYpLFM9eC5ub2RlKEoubWV0YWVkZ2Uudyk7aWYoMz09PUoucG9pbnRzLmxlbmd0aCYmQShKLnBvaW50cykpe2lmKG51bGwhPU8pe3ZhciBOPU8uZXhwYW5kZWQ/Ty54OnUoTyk7Si5wb2ludHNbMF0ueD1OfW51bGwhPVMmJihOPVMuZXhwYW5kZWQ/Uy54OnUoUyksSi5wb2ludHNbMl0ueD1OKTtKLnBvaW50cz1bSi5wb2ludHNbMF0sSi5wb2ludHNbMV1dfU49Si5wb2ludHNbSi5wb2ludHMubGVuZ3RoLTJdO251bGwhPVMmJihKLnBvaW50c1tKLnBvaW50cy5sZW5ndGgtMV09eShOLFMpKTtTPUoucG9pbnRzWzFdO251bGwhPU8mJihKLnBvaW50c1swXT15KFMsTykpO18uZWFjaChKLnBvaW50cyxSPT57Qj1SLng8CkI/Ui54OkI7Sz1SLng+Sz9SLng6SztIPVIueTxIP1IueTpIO0w9Ui55Pkw/Ui55Okx9KX19KTtfLmVhY2goeC5ub2RlcygpLEo9PntKPXgubm9kZShKKTtKLngtPUI7Si55LT1IfSk7Xy5lYWNoKHguZWRnZXMoKSxKPT57Xy5lYWNoKHguZWRnZShKKS5wb2ludHMsTz0+e08ueC09QjtPLnktPUh9KX0pO3JldHVybnt3aWR0aDpLLUIsaGVpZ2h0OkwtSH19ZnVuY3Rpb24gcCh4KXtsZXQgQz1mLlBBUkFNUy5zdWJzY2VuZS5tZXRhO18uZXh0ZW5kKHgsQyk7Xy5leHRlbmQoeC5jb3JlQm94LGwoeC5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGgubWV0YSkpO3ZhciBHPXguaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoP18ubWF4KHguaXNvbGF0ZWRJbkV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmluRXh0cmFjdEJveC53aWR0aD1udWxsIT1HP0c6MDt4LmluRXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5pc29sYXRlZEluRXh0cmFjdCwoQixILEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDoKMDtILng9MDtILnk9QitLK0guaGVpZ2h0LzI7cmV0dXJuIEIrSytILmhlaWdodH0sMCk7Rz14Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/Xy5tYXgoeC5pc29sYXRlZE91dEV4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4Lm91dEV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7eC5vdXRFeHRyYWN0Qm94LmhlaWdodD1fLnJlZHVjZSh4Lmlzb2xhdGVkT3V0RXh0cmFjdCwoQixILEspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0gueD0wO0gueT1CK0srSC5oZWlnaHQvMjtyZXR1cm4gQitLK0guaGVpZ2h0fSwwKTtHPXgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoP18ubWF4KHgubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsQj0+Qi53aWR0aCkud2lkdGg6bnVsbDt4LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGg9bnVsbCE9Rz9HOjA7eC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodD1fLnJlZHVjZSh4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LChCLEgsCkspPT57Sz0wPEs/Qy5leHRyYWN0WU9mZnNldDowO0gueD0wO0gueT1CK0srSC5oZWlnaHQvMjtyZXR1cm4gQitLK0guaGVpZ2h0fSwwKTtHPTA7MDx4Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCYmRysrOzA8eC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoJiZHKys7MDx4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aCYmRysrOzA8eC5jb3JlR3JhcGgubm9kZUNvdW50KCkmJkcrKztsZXQgRD1mLlBBUkFNUy5zdWJzY2VuZS5tZXRhLmV4dHJhY3RYT2Zmc2V0O0c9MT49Rz8wOkcqRDt4LmNvcmVCb3gud2lkdGgrPU1hdGgubWF4KGYuTUlOX0FVWF9XSURUSCx4LmluRXh0cmFjdEJveC53aWR0aCt4Lm91dEV4dHJhY3RCb3gud2lkdGgpK0creC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoK0c7eC5jb3JlQm94LmhlaWdodD1DLmxhYmVsSGVpZ2h0K01hdGgubWF4KHguaW5FeHRyYWN0Qm94LmhlaWdodCx4LmNvcmVCb3guaGVpZ2h0LHgubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQsCngub3V0RXh0cmFjdEJveC5oZWlnaHQpO3gud2lkdGg9eC5jb3JlQm94LndpZHRoK0MucGFkZGluZ0xlZnQrQy5wYWRkaW5nUmlnaHQ7eC5oZWlnaHQ9eC5wYWRkaW5nVG9wK3guY29yZUJveC5oZWlnaHQreC5wYWRkaW5nQm90dG9tfWZ1bmN0aW9uIG0oeCl7bGV0IEM9eC5jb3JlR3JhcGgsRz1mLlBBUkFNUy5zdWJzY2VuZS5zZXJpZXM7Xy5leHRlbmQoeCxHKTtfLmV4dGVuZCh4LmNvcmVCb3gsbCh4LmNvcmVHcmFwaCxmLlBBUkFNUy5ncmFwaC5zZXJpZXMpKTtfLmVhY2goQy5ub2RlcygpLEQ9PntDLm5vZGUoRCkuZXhjbHVkZWQ9ITF9KTt4LndpZHRoPXguY29yZUJveC53aWR0aCtHLnBhZGRpbmdMZWZ0K0cucGFkZGluZ1JpZ2h0O3guaGVpZ2h0PXguY29yZUJveC5oZWlnaHQrRy5wYWRkaW5nVG9wK0cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBuKHgpe2lmKCF4LmV4cGFuZGVkKXt2YXIgQz14LmluQW5ub3RhdGlvbnMubGlzdCxHPXgub3V0QW5ub3RhdGlvbnMubGlzdDtfLmVhY2goQywKTz0+cShPKSk7Xy5lYWNoKEcsTz0+cShPKSk7dmFyIEQ9Zi5QQVJBTVMuYW5ub3RhdGlvbnMsQj1fLnJlZHVjZShDLChPLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PS0oeC5jb3JlQm94LndpZHRoK1Mud2lkdGgpLzItRC54T2Zmc2V0O1MuZHk9TytOK1MuaGVpZ2h0LzI7cmV0dXJuIE8rTitTLmhlaWdodH0sMCk7Xy5lYWNoKEMsTz0+e08uZHktPUIvMjtPLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgSD1fLnJlZHVjZShHLChPLFMsTik9PntOPTA8Tj9ELnlPZmZzZXQ6MDtTLmR4PSh4LmNvcmVCb3gud2lkdGgrUy53aWR0aCkvMitELnhPZmZzZXQ7Uy5keT1PK04rUy5oZWlnaHQvMjtyZXR1cm4gTytOK1MuaGVpZ2h0fSwwKTtfLmVhY2goRyxPPT57Ty5keS09SC8yO08ubGFiZWxPZmZzZXQ9RC5sYWJlbE9mZnNldH0pO3ZhciBLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsQi8yKTtLPTA+Sz8wOks7dmFyIEw9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsCkMubGVuZ3RoLTFdKS5yYW5nZShbLUssS10pO18uZWFjaChDLChPLFMpPT57Ty5wb2ludHM9W3tkeDpPLmR4K08ud2lkdGgvMixkeTpPLmR5fSx7ZHg6LXguY29yZUJveC53aWR0aC8yLGR5OjE8Qy5sZW5ndGg/TChTKTowfV19KTtLPU1hdGgubWluKHguaGVpZ2h0LzIteC5yYWRpdXMsSC8yKTtLPTA+Sz8wOks7dmFyIEo9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsRy5sZW5ndGgtMV0pLnJhbmdlKFstSyxLXSk7Xy5lYWNoKEcsKE8sUyk9PntPLnBvaW50cz1be2R4OnguY29yZUJveC53aWR0aC8yLGR5OjE8Ry5sZW5ndGg/SihTKTowfSx7ZHg6Ty5keC1PLndpZHRoLzIsZHk6Ty5keX1dfSk7eC5oZWlnaHQ9TWF0aC5tYXgoeC5oZWlnaHQsQixIKX19ZnVuY3Rpb24gcSh4KXtzd2l0Y2goeC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVDpfLmV4dGVuZCh4LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU0hPUlRDVVQ6aWYoeC5ub2RlLnR5cGU9PT0KZC5Ob2RlVHlwZS5PUClfLmV4dGVuZCh4LGYuUEFSQU1TLnNob3J0Y3V0U2l6ZS5vcCk7ZWxzZSBpZih4Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlfLmV4dGVuZCh4LGYuUEFSQU1TLnNob3J0Y3V0U2l6ZS5tZXRhKTtlbHNlIGlmKHgubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpXy5leHRlbmQoeCxmLlBBUkFNUy5zaG9ydGN1dFNpemUuc2VyaWVzKTtlbHNlIHRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit4Lm5vZGUudHlwZSk7YnJlYWs7Y2FzZSBkLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZOl8uZXh0ZW5kKHgsZi5QQVJBTVMuY29uc3RhbnQuc2l6ZSl9fWZ1bmN0aW9uIHUoeCl7cmV0dXJuIHguZXhwYW5kZWQ/eC54OngueC14LndpZHRoLzIrKHguaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD94LmluYm94V2lkdGg6MCkreC5jb3JlQm94LndpZHRoLzJ9ZnVuY3Rpb24gdyh4LEMpe3JldHVybiAxODAqTWF0aC5hdGFuKChDLnkteC55KS8oQy54LQp4LngpKS9NYXRoLlBJfWZ1bmN0aW9uIEEoeCl7bGV0IEM9dyh4WzBdLHhbMV0pO2ZvcihsZXQgRz0xO0c8eC5sZW5ndGgtMTtHKyspe2xldCBEPXcoeFtHXSx4W0crMV0pO2lmKDE8TWF0aC5hYnMoRC1DKSlyZXR1cm4hMTtDPUR9cmV0dXJuITB9ZnVuY3Rpb24geSh4LEMpe2xldCBHPUMuZXhwYW5kZWQ/Qy54OnUoQyksRD1DLnk7dmFyIEI9eC54LUc7eD14LnktRDtsZXQgSD1DLmV4cGFuZGVkP0Mud2lkdGg6Qy5jb3JlQm94LndpZHRoLEs9Qy5leHBhbmRlZD9DLmhlaWdodDpDLmNvcmVCb3guaGVpZ2h0O01hdGguYWJzKHgpKkgvMj5NYXRoLmFicyhCKSpLLzI/KDA+eCYmKEs9LUspLEM9MD09PXg/MDpLLzIqQi94LEI9Sy8yKTooMD5CJiYoSD0tSCksQz1ILzIsQj0wPT09Qj8wOkgvMip4L0IpO3JldHVybnt4OkcrQyx5OkQrQn19Zi5QQVJBTVM9e2FuaW1hdGlvbjp7ZHVyYXRpb246MjUwfSxncmFwaDp7bWV0YTp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxzZXJpZXM6e25vZGVTZXA6NSwKcmFua1NlcDoyNSxlZGdlU2VwOjV9LHBhZGRpbmc6e3BhZGRpbmdUb3A6NDAscGFkZGluZ0xlZnQ6MjB9fSxzdWJzY2VuZTp7bWV0YTp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoyMCxleHRyYWN0WE9mZnNldDoxNSxleHRyYWN0WU9mZnNldDoyMH0sc2VyaWVzOntwYWRkaW5nVG9wOjEwLHBhZGRpbmdCb3R0b206MTAscGFkZGluZ0xlZnQ6MTAscGFkZGluZ1JpZ2h0OjEwLGxhYmVsSGVpZ2h0OjEwfX0sbm9kZVNpemU6e21ldGE6e3JhZGl1czo1LHdpZHRoOjYwLG1heExhYmVsV2lkdGg6NTIsaGVpZ2h0OmQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFsxLDIwMF0pLnJhbmdlKFsxNSw2MF0pLmNsYW1wKCEwKSxleHBhbmRCdXR0b25SYWRpdXM6M30sb3A6e3dpZHRoOjE1LGhlaWdodDo2LHJhZGl1czozLGxhYmVsT2Zmc2V0Oi04LG1heExhYmVsV2lkdGg6MzB9LHNlcmllczp7ZXhwYW5kZWQ6e3JhZGl1czoxMCwKbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjEyMH0sY29uc3RhbnQ6e3NpemU6e3dpZHRoOjQsaGVpZ2h0OjR9fSxzZXJpZXM6e21heFN0YWNrQ291bnQ6MyxwYXJhbGxlbFN0YWNrT2Zmc2V0UmF0aW86LjIsdG93ZXJTdGFja09mZnNldFJhdGlvOi41fSxtaW5pbWFwOntzaXplOjE1MH19O2YuTUlOX0FVWF9XSURUSD0KMTQwO2YubGF5b3V0U2NlbmU9aDtmLmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGU9dX0pKGQubGF5b3V0fHwoZC5sYXlvdXQ9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2xvYWRlci5qcwp2YXIgSmg9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHIpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXtyKHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi5mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoPWZ1bmN0aW9uKGgsayxyLGw9bmV3IGQub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyLHA9ZC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtcyl7Y29uc3QgbT1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwyMCwiR3JhcGgiKSxuPWQudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihoLDUwLCJOYW1lc3BhY2UgaGllcmFyY2h5Iik7cmV0dXJuIGQucGFyc2VyLmZldGNoQW5kUGFyc2VHcmFwaERhdGEoayxyLGQudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcihoLDMwLCJEYXRhIikpLnRoZW4oZnVuY3Rpb24ocSl7aWYoIXEubm9kZSl0aHJvdyBFcnJvcigiVGhlIGdyYXBoIGlzIGVtcHR5LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBUZW5zb3JGbG93IGNvdWxkIG5vdCB0cmFjZSBhbnkgZ3JhcGguIFBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTk2MSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKcmV0dXJuIGQuYnVpbGQocSxkLkRlZmF1bHRCdWlsZFBhcmFtcyxtKX0sKCk9Pnt0aHJvdyBFcnJvcigiTWFsZm9ybWVkIEdyYXBoRGVmLiBUaGlzIGNhbiBzb21ldGltZXMgYmUgY2F1c2VkIGJ5IGEgYmFkIG5ldHdvcmsgY29ubmVjdGlvbiBvciBkaWZmaWN1bHR5IHJlY29uY2lsaW5nIG11bHRpcGxlIEdyYXBoRGVmczsgZm9yIHRoZSBsYXR0ZXIgY2FzZSwgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy8xOTI5LiIpO30pLnRoZW4ocT0+SmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2Qub3AuY2hlY2tPcHNGb3JDb21wYXRpYmlsaXR5KHEsbCk7Y29uc3QgdT15aWVsZCBkLmhpZXJhcmNoeS5idWlsZChxLHAsbik7cmV0dXJue2dyYXBoOnEsZ3JhcGhIaWVyYXJjaHk6dX19KSkuY2F0Y2gocT0+e2gucmVwb3J0RXJyb3IoYEdyYXBoIHZpc3VhbGl6YXRpb24gZmFpbGVkLlxuXG4ke3F9YCxxKTt0aHJvdyBxOwp9KX19KShkLmxvYWRlcnx8KGQubG9hZGVyPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ub2RlLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKFosY2EsamEpe2lmKGNhLm5vZGUuaXNHcm91cE5vZGUpe2lmKGNhLmV4cGFuZGVkKXJldHVybiBmLmJ1aWxkR3JvdXAoWixjYSxqYSxmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuU3Vic2NlbmUuR1JPVVApLnJlbW92ZSgpfXJldHVybiBudWxsfWZ1bmN0aW9uIHIoWixjYSl7bGV0IGphPWNhLngtY2Eud2lkdGgvMitjYS5wYWRkaW5nTGVmdDtjYT1jYS55LWNhLmhlaWdodC8yK2NhLnBhZGRpbmdUb3A7Wj1mLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuU3Vic2NlbmUuR1JPVVApO2YudHJhbnNsYXRlKFosamEsY2EpfWZ1bmN0aW9uIGwoWixjYSxqYSl7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZyIsZi5DbGFzcy5Ob2RlLkJVVFRPTl9DT05UQUlORVIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJjaXJjbGUiLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ0lSQ0xFKTsKZi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInBhdGgiLGYuQ2xhc3MuTm9kZS5FWFBBTkRfQlVUVE9OKS5hdHRyKCJkIiwiTTAsLTIuMiBWMi4yIE0tMi4yLDAgSDIuMiIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuQ09MTEFQU0VfQlVUVE9OKS5hdHRyKCJkIiwiTS0yLjIsMCBIMi4yIik7Wi5vbigiY2xpY2siLGJhPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7amEuZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTpiYS5ub2RlLm5hbWV9KX0pO2YucG9zaXRpb25CdXR0b24oWixjYSl9ZnVuY3Rpb24gcChaLGNhLGphLGJhKXtpZihiYSlaLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2Vsc2V7dmFyIGthPWYuY29udGV4dG1lbnUuZ2V0TWVudShqYSxtKGNhLm5vZGUsamEpKTtaLm9uKCJkYmxjbGljayIsVz0+e2phLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Vy5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW92ZXIiLApXPT57amEuaXNOb2RlRXhwYW5kZWQoVyl8fGphLmZpcmUoIm5vZGUtaGlnaGxpZ2h0Iix7bmFtZTpXLm5vZGUubmFtZX0pfSkub24oIm1vdXNlb3V0IixXPT57amEuaXNOb2RlRXhwYW5kZWQoVyl8fGphLmZpcmUoIm5vZGUtdW5oaWdobGlnaHQiLHtuYW1lOlcubm9kZS5uYW1lfSl9KS5vbigiY2xpY2siLFc9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtqYS5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6Vy5ub2RlLm5hbWV9KX0pLm9uKCJjb250ZXh0bWVudSIsKFcsRWEpPT57amEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlcubm9kZS5uYW1lfSk7a2EuY2FsbChXLEVhKX0pfX1mdW5jdGlvbiBtKFosY2Epe2xldCBqYT1be3RpdGxlOigpPT5kLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nKFouaW5jbHVkZSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtZXh0cmFjdCIse25hbWU6Wi5uYW1lfSl9fV07Y2Eubm9kZUNvbnRleHRNZW51SXRlbXMmJihqYT1qYS5jb25jYXQoY2Eubm9kZUNvbnRleHRNZW51SXRlbXMpKTsKbihaKSYmamEucHVzaCh7dGl0bGU6KCk9PncoWiksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnEoWil9KX19KTtyZXR1cm4gamF9ZnVuY3Rpb24gbihaKXtyZXR1cm4gbnVsbCE9PXEoWil9ZnVuY3Rpb24gcShaKXtyZXR1cm4gWj9aLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9aLm5hbWU6Wi50eXBlPT09ZC5Ob2RlVHlwZS5PUD9aLm93bmluZ1NlcmllczpudWxsOm51bGx9ZnVuY3Rpb24gdShaKXtsZXQgY2E9bnVsbDtpZighWilyZXR1cm4gbnVsbDtaLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9jYT1aOloucGFyZW50Tm9kZSYmWi5wYXJlbnROb2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmKGNhPVoucGFyZW50Tm9kZSk7cmV0dXJuIGNhfWZ1bmN0aW9uIHcoWil7cmV0dXJuIGIuZ3JhcGguZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nKG51bGwhPT11KFopP2IuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLkdST1VQOgpiLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKX1mdW5jdGlvbiBBKFosY2EsamEpe3ZhciBiYT1jYS5kaXNwbGF5TmFtZTtsZXQga2E9Y2Eubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiYhY2EuZXhwYW5kZWQ7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKTtsZXQgVz1aLm5vZGUoKTtXLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoVyk7Wi5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKTtrYSYmKGJhLmxlbmd0aD5qYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoJiYoYmE9YmEuc3Vic3RyKDAsamEubWF4TWV0YW5vZGVMYWJlbExlbmd0aC0yKSsiLi4uIiksamE9eChqYSksWi5hdHRyKCJmb250LXNpemUiLGphKGJhLmxlbmd0aCkrInB4IikpO2JhPVoudGV4dChiYSk7eShiYSxjYS5ub2RlLnR5cGUsY2EpO3JldHVybiBafWZ1bmN0aW9uIHkoWixjYSxqYSl7bGV0IGJhPVoubm9kZSgpO3ZhciBrYT0KYmEuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7bGV0IFc9YmEudGV4dENvbnRlbnQsRWE9bnVsbDtzd2l0Y2goY2Epe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmphJiYhamEuZXhwYW5kZWQmJihFYT1kLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5tYXhMYWJlbFdpZHRoKTticmVhaztjYXNlIGQuTm9kZVR5cGUuT1A6RWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm9wLm1heExhYmVsV2lkdGg7YnJlYWs7Y2FzZSAtMTpFYT1kLmxheW91dC5QQVJBTVMuYW5ub3RhdGlvbnMubWF4TGFiZWxXaWR0aH1pZighKG51bGw9PT1FYXx8a2E8PUVhKSl7Zm9yKGthPTE7YmEuZ2V0U3ViU3RyaW5nTGVuZ3RoKDAsa2EpPEVhOylrYSsrO2NhPWJhLnRleHRDb250ZW50LnN1YnN0cigwLGthKTtkbyBjYT1jYS5zdWJzdHIoMCxjYS5sZW5ndGgtMSksYmEudGV4dENvbnRlbnQ9Y2ErIi4uLiIsa2E9YmEuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7d2hpbGUoa2E+RWEmJjA8Y2EubGVuZ3RoKTtyZXR1cm4gWi5hcHBlbmQoInRpdGxlIikudGV4dChXKX19CmZ1bmN0aW9uIHgoWil7ZmF8fChmYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250LFoubWF4TWV0YW5vZGVMYWJlbExlbmd0aF0pLnJhbmdlKFtaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSxaLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZV0pLmNsYW1wKCEwKSk7cmV0dXJuIGZhfWZ1bmN0aW9uIEMoWixjYSxqYSxiYSl7Zi5zZWxlY3RDaGlsZChaLCJ0ZXh0IixmLkNsYXNzLk5vZGUuTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixjYSkuYXR0cigieSIsamErYmEpfWZ1bmN0aW9uIEcoWixjYSxqYSl7Wj1mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZyIsamEpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDpjYT1jYS5ub2RlO2lmKF8uaXNOdW1iZXIoY2EuZnVuY3Rpb25JbnB1dEluZGV4KXx8Xy5pc051bWJlcihjYS5mdW5jdGlvbk91dHB1dEluZGV4KSl7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJwb2x5Z29uIixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVha31mLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiZWxsaXBzZSIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpqYT0iYW5ub3RhdGlvbiI7Y2EuY29yZUdyYXBoJiYoamE9Y2Eubm9kZS5oYXNOb25Db250cm9sRWRnZXM/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCIpO2xldCBiYT1bZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVF07Y2EuaXNGYWRlZE91dCYmYmEucHVzaCgiZmFkZWQtZWxsaXBzZSIpO2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJ1c2UiLGJhKS5hdHRyKCJ4bGluazpocmVmIiwiI29wLXNlcmllcy0iK2phKyItc3RhbXAiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGNhLnJhZGl1cykuYXR0cigicnkiLGNhLnJhZGl1cyk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwKInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixjYS5yYWRpdXMpLmF0dHIoInJ5IixjYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fXJldHVybiBafWZ1bmN0aW9uIEQoWil7c3dpdGNoKFoubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6cmV0dXJuIGYuQ2xhc3MuT1BOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOnJldHVybiBmLkNsYXNzLk1FVEFOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6cmV0dXJuIGYuQ2xhc3MuU0VSSUVTTk9ERTtjYXNlIGQuTm9kZVR5cGUuQlJJREdFOnJldHVybiBmLkNsYXNzLkJSSURHRU5PREU7Y2FzZSBkLk5vZGVUeXBlLkVMTElQU0lTOnJldHVybiBmLkNsYXNzLkVMTElQU0lTTk9ERX10aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIisKWi5ub2RlLnR5cGUpO31mdW5jdGlvbiBCKFosY2Epe3ZhciBqYT1mLnNlbGVjdENoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5TSEFQRSk7bGV0IGJhPWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUoY2EpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5PUDp7Y29uc3Qga2E9Y2Eubm9kZTtfLmlzTnVtYmVyKGthLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoa2EuZnVuY3Rpb25PdXRwdXRJbmRleCk/KGphPWYuc2VsZWN0Q2hpbGQoamEsInBvbHlnb24iKSxmLnBvc2l0aW9uVHJpYW5nbGUoamEsY2EueCxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTooamE9Zi5zZWxlY3RDaGlsZChqYSwiZWxsaXBzZSIpLGYucG9zaXRpb25FbGxpcHNlKGphLGJhLGNhLnksY2EuY29yZUJveC53aWR0aCxjYS5jb3JlQm94LmhlaWdodCkpO0MoWixiYSxjYS55LGNhLmxhYmVsT2Zmc2V0KTticmVha31jYXNlIGQuTm9kZVR5cGUuTUVUQTpqYT0KamEuc2VsZWN0QWxsKCJyZWN0Iik7Y2EuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGphLGNhLngsY2EueSxjYS53aWR0aCxjYS5oZWlnaHQpLHIoWixjYSksQyhaLGJhLGNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoamEsYmEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKFosYmEsY2EueSwwKSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpqYT1mLnNlbGVjdENoaWxkKGphLCJ1c2UiKTtjYS5leHBhbmRlZD8oZi5wb3NpdGlvblJlY3QoamEsY2EueCxjYS55LGNhLndpZHRoLGNhLmhlaWdodCkscihaLGNhKSxDKFosYmEsY2EueSwtY2EuaGVpZ2h0LzIrY2EubGFiZWxIZWlnaHQvMikpOihmLnBvc2l0aW9uUmVjdChqYSxiYSxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpLEMoWixiYSxjYS55LGNhLmxhYmVsT2Zmc2V0KSk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpaPQpmLnNlbGVjdENoaWxkKGphLCJyZWN0Iik7Zi5wb3NpdGlvblJlY3QoWixjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fX1mdW5jdGlvbiBIKFosY2EsamEpe2xldCBiYT1iLmdyYXBoLnV0aWwuZXNjYXBlUXVlcnlTZWxlY3RvcihaKTtpZighamEpcmV0dXJuYHVybCgjJHtiYX0pYDtqYT1kMy5zZWxlY3QoamEpO2xldCBrYT1qYS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpO2thLmVtcHR5KCkmJihrYT1qYS5hcHBlbmQoImRlZnMiKS5hdHRyKCJpZCIsIl9ncmFwaC1ncmFkaWVudHMiKSk7bGV0IFc9a2Euc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2JhKTtpZihXLmVtcHR5KCkpe1c9a2EuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIixaKTtXLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2xldCBFYT0wO18uZWFjaChjYSx2YT0+e2xldCB5YT0KdmEuY29sb3I7Vy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEVhKS5hdHRyKCJzdG9wLWNvbG9yIix5YSk7Vy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEVhK3ZhLnByb3BvcnRpb24pLmF0dHIoInN0b3AtY29sb3IiLHlhKTtFYSs9dmEucHJvcG9ydGlvbn0pfXJldHVybmB1cmwoIyR7YmF9KWB9ZnVuY3Rpb24gSyhaLGNhLGphLGJhLGthKXtsZXQgVz1kLnJlbmRlci5NZXRhbm9kZUNvbG9ycztzd2l0Y2goY2Epe2Nhc2Ugb2EuU1RSVUNUVVJFOnJldHVybiBqYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/KGNhPWphLm5vZGUudGVtcGxhdGVJZCxudWxsPT09Y2E/Vy5VTktOT1dOOlcuU1RSVUNUVVJFX1BBTEVUVEUoWihjYSksYmEpKTpqYS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz9iYT9XLkVYUEFOREVEX0NPTE9SOiJ3aGl0ZSI6amEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/amEuc3RydWN0dXJhbD8iI2YwZSI6amEubm9kZS5pbmJvdW5kPwoiIzBlZiI6IiNmZTAiOl8uaXNOdW1iZXIoamEubm9kZS5mdW5jdGlvbklucHV0SW5kZXgpPyIjNzk1NTQ4IjpfLmlzTnVtYmVyKGphLm5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCk/IiMwMDk2ODgiOiJ3aGl0ZSI7Y2FzZSBvYS5ERVZJQ0U6cmV0dXJuIG51bGw9PWphLmRldmljZUNvbG9ycz9XLlVOS05PV046YmE/Vy5FWFBBTkRFRF9DT0xPUjpIKCJkZXZpY2UtIitqYS5ub2RlLm5hbWUsamEuZGV2aWNlQ29sb3JzLGthKTtjYXNlIG9hLlhMQV9DTFVTVEVSOnJldHVybiBudWxsPT1qYS54bGFDbHVzdGVyQ29sb3JzP1cuVU5LTk9XTjpiYT9XLkVYUEFOREVEX0NPTE9SOkgoInhsYS0iK2phLm5vZGUubmFtZSxqYS54bGFDbHVzdGVyQ29sb3JzLGthKTtjYXNlIG9hLkNPTVBVVEVfVElNRTpyZXR1cm4gYmE/Vy5FWFBBTkRFRF9DT0xPUjpqYS5jb21wdXRlVGltZUNvbG9yfHxXLlVOS05PV047Y2FzZSBvYS5NRU1PUlk6cmV0dXJuIGJhP1cuRVhQQU5ERURfQ09MT1I6amEubWVtb3J5Q29sb3J8fApXLlVOS05PV047Y2FzZSBvYS5PUF9DT01QQVRJQklMSVRZOnJldHVybiBudWxsPT1qYS5jb21wYXRpYmlsaXR5Q29sb3JzP1cuVU5LTk9XTjpiYT9XLkVYUEFOREVEX0NPTE9SOkgoIm9wLWNvbXBhdC0iK2phLm5vZGUubmFtZSxqYS5jb21wYXRpYmlsaXR5Q29sb3JzLGthKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmtub3duIGNhc2UgdG8gY29sb3Igbm9kZXMgYnkiKTt9fWZ1bmN0aW9uIEwoWixjYSxqYSxiYSl7YmE9YmF8fGYuQ2xhc3MuTm9kZS5TSEFQRTtsZXQga2E9amEuaXNOb2RlU2VsZWN0ZWQoY2Eubm9kZS5uYW1lKSxXPWNhLmlzSW5FeHRyYWN0fHxjYS5pc091dEV4dHJhY3R8fGNhLmlzTGlicmFyeUZ1bmN0aW9uLEVhPWNhLmV4cGFuZGVkJiZiYSE9PWYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFLHZhPWNhLmlzRmFkZWRPdXQ7Wi5jbGFzc2VkKCJoaWdobGlnaHRlZCIsamEuaXNOb2RlSGlnaGxpZ2h0ZWQoY2Eubm9kZS5uYW1lKSk7Wi5jbGFzc2VkKCJzZWxlY3RlZCIsa2EpOwpaLmNsYXNzZWQoImV4dHJhY3QiLFcpO1ouY2xhc3NlZCgiZXhwYW5kZWQiLEVhKTtaLmNsYXNzZWQoImZhZGVkIix2YSk7Wj1aLnNlbGVjdCgiLiIrYmErIiAuIitmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTtjYT1LKGphLnRlbXBsYXRlSW5kZXgsb2FbamEuY29sb3JCeS50b1VwcGVyQ2FzZSgpXSxjYSxFYSxqYS5nZXRHcmFwaFN2Z1Jvb3QoKSk7Wi5zdHlsZSgiZmlsbCIsY2EpO1ouc3R5bGUoInN0cm9rZSIsa2E/bnVsbDpKKGNhKSl9ZnVuY3Rpb24gSihaKXtyZXR1cm4idXJsIj09PVouc3Vic3RyaW5nKDAsMyk/ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuR1JBRElFTlRfT1VUTElORTpkMy5yZ2IoWikuZGFya2VyKCkudG9TdHJpbmcoKX1mdW5jdGlvbiBPKFosY2Epe2xldCBqYT1bXTtaPWNhLmdldE5vZGVCeU5hbWUoWik7aWYoWiBpbnN0YW5jZW9mIGIuZ3JhcGguT3BOb2RlSW1wbClyZXR1cm5bWl0uY29uY2F0KFouaW5FbWJlZGRpbmdzKTtaPVoubWV0YWdyYXBoLm5vZGVzKCk7Cl8uZWFjaChaLGZ1bmN0aW9uKGJhKXtqYT1qYS5jb25jYXQoTyhiYSxjYSkpfSk7cmV0dXJuIGphfWZ1bmN0aW9uIFMoWixjYSxqYSxiYSl7aWYoYmFbamEubmFtZV0pcmV0dXJuIGJhO2JhW2phLm5hbWVdPSEwO3ZhciBrYT1qYS5pbnB1dHM7bGV0IFc9YWEoY2EsamEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtXLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1jYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWNhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9YWEoY2EsQWEpLHhhPUVhW0ZhLm5hbWVdO3hhP3hhLm9wTm9kZXMucHVzaChBYSk6RWFbRmEubmFtZV09e3Zpc2libGVQYXJlbnQ6RmEsb3BOb2RlczpbQWFdfX19KTsKbGV0IHZhPXt9LHlhPVtXXTt2YVtXLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6MCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfTtqYT1XO2ZvcihrYT0xO2phLm5hbWUhPT1iLmdyYXBoLlJPT1RfTkFNRTtrYSsrKWphPWphLnBhcmVudE5vZGUsdmFbamEubmFtZV09e3RyYWNlZDohMSxpbmRleDprYSxjb25uZWN0aW9uRW5kcG9pbnRzOltdfSx5YVtrYV09amE7Xy5mb3JPd24oRWEsZnVuY3Rpb24oQWEpe2xldCBGYT1BYS52aXNpYmxlUGFyZW50O18uZWFjaChBYS5vcE5vZGVzLGZ1bmN0aW9uKHhhKXtiYT1TKFosY2EseGEsYmEpfSk7RmEubmFtZSE9PVcubmFtZSYmTihaLEZhLHZhLHlhKX0pO3JldHVybiBiYX1mdW5jdGlvbiBOKFosY2EsamEsYmEpe3ZhciBrYT1jYSxXPWNhO2ZvcihjYT1bXTshamFba2EubmFtZV07KVcubmFtZSE9PWthLm5hbWUmJmNhLnB1c2goW1csa2FdKSxXPWthLGthPWthLnBhcmVudE5vZGU7amE9amFba2EubmFtZV0uaW5kZXg7bGV0IEVhPWJhW01hdGgubWF4KGphLQoxLDApXS5uYW1lO1c9a2E9Vy5uYW1lO2NvbnN0IHZhPWQzLnNlbGVjdChaKTt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7V30tLSR7RWF9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApO18uZWFjaChjYSxmdW5jdGlvbih5YSl7dmEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3lhWzBdLm5hbWV9LS0ke0VhfWArYH5+JHt5YVsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSk7Zm9yKFo9MTtaPGphO1orKyl2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7a2F9fn4ke2JhW1pdLm5hbWV9YCtgfn5JTi0tJHtiYVtaLTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfWZ1bmN0aW9uIFIoWixjYSl7bGV0IGphPXt9O18uZWFjaChjYSxmdW5jdGlvbihiYSl7YmE9Wi5nZXROb2RlQnlOYW1lKGJhKTtiYT1hYShaLGJhKTtqYVtiYS5uYW1lXT1iYX0pO3JldHVybiBqYX1mdW5jdGlvbiBYKFosCmNhKXtfLmZvck93bihjYSxmdW5jdGlvbihqYSl7Zm9yKDtqYS5uYW1lIT09Yi5ncmFwaC5ST09UX05BTUU7KXtjb25zdCBiYT1kMy5zZWxlY3QoWikuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7amEubmFtZX0iXWApOyFiYS5ub2RlcygpLmxlbmd0aHx8YmEuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGJhLmNsYXNzZWQoInNlbGVjdGVkIil8fGJhLmNsYXNzZWQoIm9wIil8fGJhLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApO2phPWphLnBhcmVudE5vZGV9fSl9ZnVuY3Rpb24gYWEoWixjYSl7bGV0IGphPSExLGJhPWNhO2Zvcig7IWphOylpZihjYT1iYSxiYT1jYS5wYXJlbnROb2RlLHZvaWQgMD09PWJhKWphPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShiYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxiYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihqYT0hMCl9cmV0dXJuIGNhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGNhLGphKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoY2EsYmE9PmJhLm5vZGUubmFtZSsiOiIrYmEubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixiYT0+YmEubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGJhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2phLmFkZE5vZGVHcm91cChiYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGJhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoYmEpKS5lYWNoKGZ1bmN0aW9uKGJhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBXPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChXLGJhLmluQW5ub3RhdGlvbnMsYmEsamEpO1c9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoVyxiYS5vdXRBbm5vdGF0aW9ucyxiYSxqYSk7Vz1HKGthLGJhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7YmEubm9kZS5pc0dyb3VwTm9kZSYmbChXLGJhLGphKTtwKFcsYmEsamEpO2soa2EsYmEsamEpO1c9QShrYSxiYSxqYSk7cChXLGJhLGphLGJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TChrYSxiYSxqYSk7QihrYSxiYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGJhKXtqYS5yZW1vdmVOb2RlR3JvdXAoYmEubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8YmEuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFc9PntqYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoVyxiYSl9KTswPGJhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChXPT57amEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFcsYmEpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9dztoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGZhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgb2E7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkob2E9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1LO2guc3R5bGl6ZT1MO2guZ2V0U3Ryb2tlRm9yRmlsbD1KO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGNhLGphLGJhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoY2EmJmJhJiZqYSl7amE9TyhqYSxjYSk7dmFyIFc9e307Xy5lYWNoKGphLGZ1bmN0aW9uKEVhKXtXPVMoWixjYSxFYSxXKX0pO2phPU9iamVjdC5rZXlzKFcpO2phPVIoY2EsamEpO1goWixqYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9YWF9KShmLm5vZGV8fChmLm5vZGU9e30pKX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwKKGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vb3AuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtpc05vdFRwdU9wKGspe3JldHVybi0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJjcHU6Iil8fC0xIT1rLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJncHU6Iik/ITA6LTE9PWsudG9Mb3dlckNhc2UoKS5zZWFyY2goInRwdSIpfW9wVmFsaWQoayl7cmV0dXJuIDA9PWsubmFtZS5zZWFyY2goZC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8IWsub3B8fGsuZGV2aWNlJiZ0aGlzLmlzTm90VHB1T3Aoay5kZXZpY2UpfHxrLmRldmljZSYmLTEhPWsuZGV2aWNlLnNlYXJjaCgiVFBVX1NZU1RFTSIpPyEwOl8uaW5jbHVkZXMoaC5XSElURUxJU1Qsay5vcCl9fWguV0hJVEVMSVNUPSJBYnMgQWNvcyBBY29zaCBBZGQgQWRkTiBBZGp1c3RDb250cmFzdHYyIEFkanVzdEh1ZSBBZGp1c3RTYXR1cmF0aW9uIEFsbCBBbmdsZSBBbnkgQXBwcm94aW1hdGVFcXVhbCBBcmdNYXggQXJnTWluIEFzaW4gQXNpbmggQXNzZXJ0IEFzc2lnbkFkZFZhcmlhYmxlT3AgQXNzaWduU3ViVmFyaWFibGVPcCBBc3NpZ25WYXJpYWJsZU9wIEF0YW4gQXRhbjIgQXRhbmggQXZnUG9vbCBBdmdQb29sM0QgQXZnUG9vbDNER3JhZCBBdmdQb29sR3JhZCBCYXRjaE1hdE11bCBCYXRjaFRvU3BhY2UgQmF0Y2hUb1NwYWNlTkQgQmlhc0FkZCBCaWFzQWRkR3JhZCBCaWFzQWRkVjEgQml0Y2FzdCBCaXR3aXNlQW5kIEJpdHdpc2VPciBCaXR3aXNlWG9yIEJyb2FkY2FzdEFyZ3MgQnJvYWRjYXN0R3JhZGllbnRBcmdzIEJ1Y2tldGl6ZSBDYXN0IENlaWwgQ2hlY2tOdW1lcmljcyBDaG9sZXNreSBDbGlwQnlWYWx1ZSBDb21wbGV4IENvbXBsZXhBYnMgQ29uY2F0IENvbmNhdE9mZnNldCBDb25jYXRWMiBDb25qIENvbmp1Z2F0ZVRyYW5zcG9zZSBDb25zdCBDb250cm9sVHJpZ2dlciBDb252MkQgQ29udjJEQmFja3Byb3BGaWx0ZXIgQ29udjJEQmFja3Byb3BJbnB1dCBDb252M0QgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiBDb252M0RCYWNrcHJvcElucHV0VjIgQ29zIENvc2ggQ3Jvc3MgQ3Jvc3NSZXBsaWNhU3VtIEN1bXByb2QgQ3Vtc3VtIERlcHRoVG9TcGFjZSBEZXB0aHdpc2VDb252MmROYXRpdmUgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCBEaWFnIERpYWdQYXJ0IERpZ2FtbWEgRGl2IER5bmFtaWNTdGl0Y2ggRWx1IEVsdUdyYWQgRW1wdHkgRXF1YWwgRXJmIEVyZmMgRXhwIEV4cGFuZERpbXMgRXhwbTEgRXh0cmFjdEltYWdlUGF0Y2hlcyBGRlQgRkZUMkQgRkZUM0QgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3MgRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCBGYWtlUXVhbnRXaXRoTWluTWF4VmFycyBGYWtlUXVhbnRXaXRoTWluTWF4VmFyc0dyYWRpZW50IEZpbGwgRmxvb3IgRmxvb3JEaXYgRmxvb3JNb2QgRnVzZWRCYXRjaE5vcm0gRnVzZWRCYXRjaE5vcm1HcmFkIEZ1c2VkQmF0Y2hOb3JtR3JhZFYyIEZ1c2VkQmF0Y2hOb3JtVjIgR2F0aGVyIEdhdGhlck5kIEdhdGhlclYyIEdldEl0ZW0gR3JlYXRlciBHcmVhdGVyRXF1YWwgSFNWVG9SR0IgSUZGVCBJRkZUMkQgSUZGVDNEIElSRkZUIElSRkZUMkQgSVJGRlQzRCBJZGVudGl0eSBJZGVudGl0eU4gSWYgSW1hZyBJbmZlZWREZXF1ZXVlIEluZmVlZERlcXVldWVUdXBsZSBJbnBsYWNlQWRkIElucGxhY2VVcGRhdGUgSW52IEludmVydCBJbnZlcnRQZXJtdXRhdGlvbiBJc0Zpbml0ZSBJc0luZiBJc05hbiBMMkxvc3MgTFJOIExSTkdyYWQgTGVmdFNoaWZ0IExlc3MgTGVzc0VxdWFsIExnYW1tYSBMaW5TcGFjZSBMaXN0RGlmZiBMb2cgTG9nMXAgTG9nU29mdG1heCBMb2dpY2FsQW5kIExvZ2ljYWxOb3QgTG9naWNhbE9yIE1hdE11bCBNYXRyaXhCYW5kUGFydCBNYXRyaXhEaWFnIE1hdHJpeERpYWdQYXJ0IE1hdHJpeFNldERpYWcgTWF0cml4VHJpYW5ndWxhclNvbHZlIE1heCBNYXhQb29sIE1heFBvb2wzRCBNYXhQb29sM0RHcmFkIE1heFBvb2wzREdyYWRHcmFkIE1heFBvb2xHcmFkIE1heFBvb2xHcmFkR3JhZCBNYXhQb29sR3JhZEdyYWRWMiBNYXhQb29sR3JhZFYyIE1heFBvb2xWMiBNYXhpbXVtIE1lYW4gTWluIE1pbmltdW0gTWlycm9yUGFkIE1vZCBNdWwgTXVsdGlub21pYWwgTmVnIE5vT3AgTm9uTWF4U3VwcHJlc3Npb25WNCBOb3RFcXVhbCBPbmVIb3QgT25lc0xpa2UgT3V0ZmVlZEVucXVldWUgT3V0ZmVlZEVucXVldWVUdXBsZSBQYWNrIFBhZCBQYWRWMiBQYXJhbGxlbER5bmFtaWNTdGl0Y2ggUGxhY2Vob2xkZXJXaXRoRGVmYXVsdCBQb3cgUHJldmVudEdyYWRpZW50IFByb2QgUXIgUXVhbnRpemVBbmREZXF1YW50aXplVjIgUXVhbnRpemVBbmREZXF1YW50aXplVjMgUkZGVCBSRkZUMkQgUkZGVDNEIFJHQlRvSFNWIFJhbmRvbVNodWZmbGUgUmFuZG9tU3RhbmRhcmROb3JtYWwgUmFuZG9tVW5pZm9ybSBSYW5kb21Vbmlmb3JtSW50IFJhbmdlIFJhbmsgUmVhZFZhcmlhYmxlT3AgUmVhbCBSZWFsRGl2IFJlY2lwcm9jYWwgUmVjaXByb2NhbEdyYWQgUmVjdlRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFJlbHUgUmVsdTYgUmVsdTZHcmFkIFJlbHVHcmFkIFJlc2hhcGUgUmVzaXplQmlsaW5lYXIgUmVzaXplQmlsaW5lYXJHcmFkIFJlc291cmNlQXBwbHlBZGFNYXggUmVzb3VyY2VBcHBseUFkYWRlbHRhIFJlc291cmNlQXBwbHlBZGFncmFkIFJlc291cmNlQXBwbHlBZGFncmFkREEgUmVzb3VyY2VBcHBseUFkYW0gUmVzb3VyY2VBcHBseUFkZFNpZ24gUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCBSZXNvdXJjZUFwcGx5RnRybCBSZXNvdXJjZUFwcGx5RnRybFYyIFJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseU1vbWVudHVtIFJlc291cmNlQXBwbHlQb3dlclNpZ24gUmVzb3VyY2VBcHBseVByb3hpbWFsQWRhZ3JhZCBSZXNvdXJjZUFwcGx5UHJveGltYWxHcmFkaWVudERlc2NlbnQgUmVzb3VyY2VBcHBseVJNU1Byb3AgUmVzb3VyY2VHYXRoZXIgUmVzb3VyY2VTY2F0dGVyQWRkIFJlc291cmNlU2NhdHRlckRpdiBSZXNvdXJjZVNjYXR0ZXJNYXggUmVzb3VyY2VTY2F0dGVyTWluIFJlc291cmNlU2NhdHRlck11bCBSZXNvdXJjZVNjYXR0ZXJOZEFkZCBSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSBSZXNvdXJjZVNjYXR0ZXJTdWIgUmVzb3VyY2VTY2F0dGVyVXBkYXRlIFJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIFJldmVyc2UgUmV2ZXJzZVNlcXVlbmNlIFJldmVyc2VWMiBSaWdodFNoaWZ0IFJpbnQgUm91bmQgUnNxcnQgUnNxcnRHcmFkIFNjYXR0ZXJOZCBTZWxlY3QgU2VsdSBTZWx1R3JhZCBTZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIFNoYXBlIFNoYXBlTiBTaWdtb2lkIFNpZ21vaWRHcmFkIFNpZ24gU2luIFNpbmggU2l6ZSBTbGljZSBTbmFwc2hvdCBTb2Z0bWF4IFNvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzIFNvZnRwbHVzIFNvZnRwbHVzR3JhZCBTb2Z0c2lnbiBTb2Z0c2lnbkdyYWQgU3BhY2VUb0JhdGNoIFNwYWNlVG9CYXRjaE5EIFNwYWNlVG9EZXB0aCBTcGFyc2VNYXRNdWwgU3BhcnNlU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU3BhcnNlVG9EZW5zZSBTcGxpdCBTcGxpdFYgU3FydCBTcXJ0R3JhZCBTcXVhcmUgU3F1YXJlZERpZmZlcmVuY2UgU3F1ZWV6ZSBTdGFja0Nsb3NlVjIgU3RhY2tQb3BWMiBTdGFja1B1c2hWMiBTdGFja1YyIFN0YXRlbGVzc0lmIFN0YXRlbGVzc1JhbmRvbU5vcm1hbCBTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtIFN0YXRlbGVzc1RydW5jYXRlZE5vcm1hbCBTdGF0ZWxlc3NXaGlsZSBTdG9wR3JhZGllbnQgU3RyaWRlZFNsaWNlIFN0cmlkZWRTbGljZUdyYWQgU3ViIFN1bSBTeW1ib2xpY0dyYWRpZW50IFRQVUVtYmVkZGluZ0FjdGl2YXRpb25zIFRhbiBUYW5oIFRhbmhHcmFkIFRlbnNvckFycmF5Q2xvc2VWMyBUZW5zb3JBcnJheUNvbmNhdFYzIFRlbnNvckFycmF5R2F0aGVyVjMgVGVuc29yQXJyYXlHcmFkVjMgVGVuc29yQXJyYXlSZWFkVjMgVGVuc29yQXJyYXlTY2F0dGVyVjMgVGVuc29yQXJyYXlTaXplVjMgVGVuc29yQXJyYXlTcGxpdFYzIFRlbnNvckFycmF5VjMgVGVuc29yQXJyYXlXcml0ZVYzIFRpbGUgVG9wS1YyIFRyYW5zcG9zZSBUcnVuY2F0ZURpdiBUcnVuY2F0ZU1vZCBUcnVuY2F0ZWROb3JtYWwgVW5wYWNrIFVuc29ydGVkU2VnbWVudE1heCBVbnNvcnRlZFNlZ21lbnRNaW4gVW5zb3J0ZWRTZWdtZW50UHJvZCBVbnNvcnRlZFNlZ21lbnRTdW0gVmFySXNJbml0aWFsaXplZE9wIFZhcmlhYmxlU2hhcGUgV2hpbGUgWGxhRHluYW1pY1VwZGF0ZVNsaWNlIFhsYUhvc3RDb21wdXRlIFhsYUlmIFhsYVJlY3YgWGxhUmVkdWNlV2luZG93IFhsYVNlbmQgWGxhU29ydCBYbGFXaGlsZSBaZXJvc0xpa2UgRW50ZXIgRXhpdCBMb29wQ29uZCBNZXJnZSBOZXh0SXRlcmF0aW9uIFN3aXRjaCBfQXJnIF9QYXJhbGxlbENvbmNhdFVwZGF0ZSBfUmV0dmFsIF9UUFVDb21waWxlIF9UUFVFeGVjdXRlIFRQVUNvbXBpbGF0aW9uUmVzdWx0IFRQVVJlcGxpY2F0ZWRJbnB1dCBUUFVSZXBsaWNhdGVkT3V0cHV0IFRQVVJlcGxpY2F0ZU1ldGFkYXRhIE1lcmdlVjJDaGVja3BvaW50cyBSZXN0b3JlVjIgU2F2ZVYyIEFib3J0IEFzc2VydCBBc3NpZ24gUGxhY2Vob2xkZXIgUGxhY2Vob2xkZXJWMiBTaGFyZGVkRmlsZW5hbWUgU3RyaW5nSm9pbiBWYXJpYWJsZSBWYXJpYWJsZVYyIFZhckhhbmRsZU9wIEF1ZGlvU3VtbWFyeSBBdWRpb1N1bW1hcnlWMiBEZWJ1Z051bWVyaWNTdW1tYXJ5IEhpc3RvZ3JhbVN1bW1hcnkgSW1hZ2VTdW1tYXJ5IE1lcmdlU3VtbWFyeSBTY2FsYXJTdW1tYXJ5IFN0YXRzQWdncmVnYXRvclN1bW1hcnkiLnNwbGl0KCIgIik7CmYuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyPWg7Zi5jaGVja09wc0ZvckNvbXBhdGliaWxpdHk9ZnVuY3Rpb24oayxyKXtpZihudWxsPT09cil0aHJvdyBFcnJvcigiQ29tcGF0aWJpbGl0eSBwcm92aWRlciByZXF1aXJlZCwgYnV0IGdvdDogIityKTtfLmVhY2goay5ub2RlcyxsPT57bC5jb21wYXRpYmxlPXIub3BWYWxpZChsKTtfLmVhY2gobC5pbkVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT1yLm9wVmFsaWQocCl9KTtfLmVhY2gobC5vdXRFbWJlZGRpbmdzLHA9PntwLmNvbXBhdGlibGU9ci5vcFZhbGlkKHApfSl9KX19KShkLm9wfHwoZC5vcD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcGFyc2VyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgodSl7aWYoInRydWUiPT09dSlyZXR1cm4hMDtpZigiZmFsc2UiPT09dSlyZXR1cm4hMTtpZignIic9PT11WzBdKXJldHVybiB1LnN1YnN0cmluZygxLHUubGVuZ3RoLTEpO2xldCB3PXBhcnNlRmxvYXQodSk7cmV0dXJuIGlzTmFOKHcpP3U6d31mdW5jdGlvbiBrKHUpe3JldHVybiBuZXcgUHJvbWlzZSgodyxBKT0+e2ZldGNoKHUpLnRoZW4oeT0+e3kub2s/eS5hcnJheUJ1ZmZlcigpLnRoZW4odyxBKTp5LnRleHQoKS50aGVuKEEsQSl9KX0pfWZ1bmN0aW9uIHIodSx3LEE9MUU2LHk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHgsQyl7ZnVuY3Rpb24gRyhELEIsSCl7dmFyIEs9SD49dS5ieXRlTGVuZ3RoO0I9Qi5zcGxpdCh5KTtCWzBdPUQrQlswXTtjb25zdCBMPUs/IiI6Qi5wb3AoKTtmb3IobGV0IEogb2YgQil0cnl7dyhKKX1jYXRjaChPKXtDKE8pO3JldHVybn1LP3goITApOgooRD1uZXcgQmxvYihbdS5zbGljZShILEgrQSldKSxLPW5ldyBGaWxlUmVhZGVyLEsub25sb2FkPWZ1bmN0aW9uKEope0coTCxKLnRhcmdldC5yZXN1bHQsSCtBKX0sSy5yZWFkQXNUZXh0KEQpKX1HKCIiLCIiLDApfSl9ZnVuY3Rpb24gbCh1KXtyZXR1cm4gbSh1LG4pfWZ1bmN0aW9uIHAodSl7cmV0dXJuIG0odSxxKS50aGVuKHc9Pncuc3RlcF9zdGF0cyl9ZnVuY3Rpb24gbSh1LHcpe2Z1bmN0aW9uIEEoQil7bGV0IEg9Qi5pbmRleE9mKCI6IiksSz1CLnN1YnN0cmluZygwLEgpLnRyaW0oKTtCPWgoQi5zdWJzdHJpbmcoSCsyKS50cmltKCkpO3JldHVybntuYW1lOkssdmFsdWU6Qn19ZnVuY3Rpb24geShCLEgsSyxMKXtsZXQgSj1CW0hdO251bGw9PUo/QltIXT1MLmpvaW4oIi4iKWluIHc/W0tdOks6QXJyYXkuaXNBcnJheShKKT9KLnB1c2goSyk6QltIXT1bSixLXX1sZXQgeD17fSxDPVtdLEc9W10sRD14O3JldHVybiByKHUsZnVuY3Rpb24oQil7aWYoQilzd2l0Y2goQj1CLnRyaW0oKSwKQltCLmxlbmd0aC0xXSl7Y2FzZSAieyI6Qj1CLnN1YnN0cmluZygwLEIubGVuZ3RoLTIpLnRyaW0oKTtsZXQgSD17fTtDLnB1c2goRCk7Ry5wdXNoKEIpO3koRCxCLEgsRyk7RD1IO2JyZWFrO2Nhc2UgIn0iOkQ9Qy5wb3AoKTtHLnBvcCgpO2JyZWFrO2RlZmF1bHQ6Qj1BKEIpLHkoRCxCLm5hbWUsQi52YWx1ZSxHLmNvbmNhdChCLm5hbWUpKX19KS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KX1mLmZldGNoUGJUeHQ9aztmLmZldGNoQW5kUGFyc2VNZXRhZGF0YT1mdW5jdGlvbih1LHcpe3JldHVybiBiLmdyYXBoLnV0aWwucnVuVGFzaygoKT0+bnVsbD09dT9Qcm9taXNlLnJlc29sdmUobnVsbCk6ayh1KSx3KS50aGVuKEE9PmIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJQYXJzaW5nIG1ldGFkYXRhLnBidHh0Iiw2MCwoKT0+bnVsbCE9QT9wKEEpOlByb21pc2UucmVzb2x2ZShudWxsKSx3KSl9O2YuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YT1mdW5jdGlvbih1LHcsQSl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJSZWFkaW5nIGdyYXBoIHBidHh0IiwKNDAsKCk9Pnc/bmV3IFByb21pc2UoZnVuY3Rpb24oeSx4KXtsZXQgQz1uZXcgRmlsZVJlYWRlcjtDLm9ubG9hZD0oKT0+eShDLnJlc3VsdCk7Qy5vbmVycm9yPSgpPT54KEMuZXJyb3IpO0MucmVhZEFzQXJyYXlCdWZmZXIodyl9KTprKHUpLEEpLnRoZW4oeT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgpPT5sKHkpLEEpKX07Zi5zdHJlYW1QYXJzZT1yO2NvbnN0IG49eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLAoibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUuaW5wdXRfYXJnIjohMCwKImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0scT17InN0ZXBfc3RhdHMuZGV2X3N0YXRzIjohMCwKInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dCI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMubWVtb3J5IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSI6ITB9O2YucGFyc2VHcmFwaFBiVHh0PWw7Zi5wYXJzZVN0YXRzUGJUeHQ9cH0pKGQucGFyc2VyfHwoZC5wYXJzZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3Byb3RvLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3JlbmRlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKE4sUixYLGFhLGZhKXtSPW5ldyBIKFIsWCxhYSxmYSwhMCk7Ti5pbkFubm90YXRpb25zLnB1c2goUil9ZnVuY3Rpb24gayhOLFIsWCxhYSxmYSl7Uj1uZXcgSChSLFgsYWEsZmEsITEpO04ub3V0QW5ub3RhdGlvbnMucHVzaChSKX1mdW5jdGlvbiByKE4sUil7Xy5lYWNoKE4ubm9kZXMoKSxYPT57WD1OLm5vZGUoWCk7WC5leHBhbmRlZD0xPFI7aWYoMDxSKXN3aXRjaChYLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk1FVEE6Y2FzZSBkLk5vZGVUeXBlLlNFUklFUzpsKFgsUi0xKX19KX1mdW5jdGlvbiBsKE4sUil7Ti5jb3JlR3JhcGgmJnIoTi5jb3JlR3JhcGgsUil9ZnVuY3Rpb24gcChOLFIsWCl7bGV0IGFhPU4ubm9kZShSKSxmYT1OLm5vZGUoWCksb2E9Ti5lZGdlKFIsWCk7aWYoYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREUmJmZhLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5JTkNMVURFfHwKYWEubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREV8fGZhLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFKWsoYWEsZmEubm9kZSxmYSxvYSxLLlNIT1JUQ1VUKSxoKGZhLGFhLm5vZGUsYWEsb2EsSy5TSE9SVENVVCksTi5yZW1vdmVFZGdlKFIsWCl9ZnVuY3Rpb24gbShOLFIsWCl7bGV0IGFhPU4uY29yZUdyYXBoLGZhPWFhLm5vZGUoUik7ZmEuaXNPdXRFeHRyYWN0PSEwO18uZWFjaChhYS5wcmVkZWNlc3NvcnMoUiksb2E9PntwKGFhLG9hLFIpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxYKSYmXy5lYWNoKGFhLnN1Y2Nlc3NvcnMoUiksb2E9PntwKGFhLFIsb2EpfSk7MD09PWFhLm5laWdoYm9ycyhSKS5sZW5ndGgmJihmYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTi5pc29sYXRlZE91dEV4dHJhY3QucHVzaChmYSksYWEucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gbihOLFIsWCl7bGV0IGFhPU4uY29yZUdyYXBoLApmYT1hYS5ub2RlKFIpO2ZhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChhYS5zdWNjZXNzb3JzKFIpLG9hPT57cChhYSxSLG9hKX0pOyhHLmRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZXx8WCkmJl8uZWFjaChhYS5wcmVkZWNlc3NvcnMoUiksb2E9PntwKGFhLG9hLFIpfSk7MD09PWFhLm5laWdoYm9ycyhSKS5sZW5ndGgmJihmYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGZhKSxhYS5yZW1vdmVOb2RlKFIpKX1mdW5jdGlvbiBxKE4sUil7aWYoTi50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFg9MDtYPFIubGVuZ3RoO1grKyl7aWYoTi5vcD09PVJbWF0pcmV0dXJuITB9ZWxzZSBpZihOLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihOPU4uZ2V0Um9vdE9wKCkpKWZvcihYPTA7WDxSLmxlbmd0aDtYKyspaWYoTi5vcD09PVJbWF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShOKXtsZXQgUj1OLmNvcmVHcmFwaDsKXy5lYWNoKFIubm9kZXMoKSxYPT57Ui5ub2RlKFgpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxYLnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KE4uY29yZUdyYXBoLm91dEVkZ2VzKFgpLmxlbmd0aD5OLmNvcmVHcmFwaC5pbkVkZ2VzKFgpLmxlbmd0aD9tKE4sWCwhMCk6bihOLFgsITApKX0pfWZ1bmN0aW9uIHcoTil7bGV0IFI9Ti5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSxYPT57bGV0IGFhPVIubm9kZShYKTthYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnEoYWEubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTixYKX0pfWZ1bmN0aW9uIEEoTil7bGV0IFI9Ti5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSxYPT57bGV0IGFhPVIubm9kZShYKTthYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQmJnEoYWEubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmCm4oTixYKX0pfWZ1bmN0aW9uIHkoTil7bGV0IFI9Ti5jb3JlR3JhcGgsWD17fSxhYT17fSxmYT0wO18uZWFjaChSLm5vZGVzKCksa2E9PntpZihSLm5vZGUoa2EpLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIFc9Xy5yZWR1Y2UoUi5wcmVkZWNlc3NvcnMoa2EpLCh2YSx5YSk9Pnt5YT1SLmVkZ2UoeWEsa2EpLm1ldGFlZGdlO3JldHVybiB2YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1XJiYwPFIucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgmJihXPVIucHJlZGVjZXNzb3JzKGthKS5sZW5ndGgpO3ZhciBFYT1fLnJlZHVjZShSLnN1Y2Nlc3NvcnMoa2EpLCh2YSx5YSk9Pnt5YT1SLmVkZ2Uoa2EseWEpLm1ldGFlZGdlO3JldHVybiB2YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1FYSYmMDxSLnN1Y2Nlc3NvcnMoa2EpLmxlbmd0aCYmKEVhPVIuc3VjY2Vzc29ycyhrYSkubGVuZ3RoKTtYW2thXT1XO2FhW2thXT1FYTsKZmErK319KTtpZighKGZhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBvYT1HLm1pbkRlZ3JlZUZvckV4dHJhY3Rpb24tMSxaPU1hdGgucm91bmQoLjc1KmZhKSxjYT1NYXRoLnJvdW5kKC4yNSpmYSksamE9T2JqZWN0LmtleXMoWCkuc29ydCgoa2EsVyk9Plhba2FdLVhbV10pLGJhPVhbamFbWl1dO2JhPWJhK2JhLVhbamFbY2FdXTtiYT1NYXRoLm1heChiYSxvYSk7Zm9yKGxldCBrYT1mYS0xO1hbamFba2FdXT5iYTtrYS0tKW4oTixqYVtrYV0pO2phPU9iamVjdC5rZXlzKGFhKS5zb3J0KChrYSxXKT0+YWFba2FdLWFhW1ddKTtaPWFhW2phW1pdXTtjYT1aKzQqKFotYWFbamFbY2FdXSk7Y2E9TWF0aC5tYXgoY2Esb2EpO2ZvcihvYT1mYS0xO2FhW2phW29hXV0+Y2E7b2EtLSkoWj1SLm5vZGUoamFbb2FdKSkmJiFaLmlzSW5FeHRyYWN0JiZtKE4samFbb2FdKX19ZnVuY3Rpb24geChOKXtsZXQgUj1OLmNvcmVHcmFwaCxYPXt9O18uZWFjaChSLmVkZ2VzKCksYWE9PntSLmVkZ2UoYWEpLm1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlc3x8CigoWFthYS52XT1YW2FhLnZdfHxbXSkucHVzaChhYSksKFhbYWEud109WFthYS53XXx8W10pLnB1c2goYWEpKX0pO18uZWFjaChYLGFhPT57YWEubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKGFhLGZhPT5wKFIsZmEudixmYS53KSl9KX1mdW5jdGlvbiBDKE4pe3UoTik7Ry5vdXRFeHRyYWN0VHlwZXMmJncoTik7Ry5pbkV4dHJhY3RUeXBlcyYmQShOKTt5KE4pO0cubWF4Q29udHJvbERlZ3JlZSYmeChOKTtsZXQgUj1OLmNvcmVHcmFwaDtfLmVhY2goUi5ub2RlcygpLFg9PntsZXQgYWE9Ui5ub2RlKFgpO3ZhciBmYT1SLm5laWdoYm9ycyhYKS5sZW5ndGg7aWYoYWEubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09ZmEpe2ZhPTA8YWEub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7bGV0IG9hPTA8YWEuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDthYS5pc0luRXh0cmFjdD8oTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9CmQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShYKSk6YWEuaXNPdXRFeHRyYWN0PyhOLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFgpKTpHLmV4dHJhY3RJc29sYXRlZE5vZGVzV2l0aEFubm90YXRpb25zT25PbmVTaWRlJiYoZmEmJiFvYT8oYWEuaXNJbkV4dHJhY3Q9ITAsTi5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGFhKSxhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFgpKTpvYSYmIWZhJiYoYWEuaXNPdXRFeHRyYWN0PSEwLE4uaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goYWEpLGFhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSxSLnJlbW92ZU5vZGUoWCkpKX19KX1mLk9wTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiIjZmZmZmZmIixERUZBVUxUX1NUUk9LRToiI2IyYjJiMiIsQ09NUEFUSUJMRToiIzBmOWQ1OCIsCklOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2Q5ZDlkOSIsREVGQVVMVF9TVFJPS0U6IiNhNmE2YTYiLFNBVFVSQVRJT046LjYsTElHSFRORVNTOi44NSxFWFBBTkRFRF9DT0xPUjoiI2YwZjBmMCIsSFVFUzpbMjIwLDEwMCwxODAsNDAsMjAsMzQwLDI2MCwzMDAsMTQwLDYwXSxTVFJVQ1RVUkVfUEFMRVRURShOLFIpe3ZhciBYPWYuTWV0YW5vZGVDb2xvcnMuSFVFUztOPVhbTiVYLmxlbmd0aF07WD1NYXRoLnNpbihOKk1hdGguUEkvMzYwKTtyZXR1cm4gZDMuaHNsKE4sLjAxKihSPzMwOjkwLTYwKlgpLC4wMSooUj85NTo4MCkpLnRvU3RyaW5nKCl9LERFVklDRV9QQUxFVFRFKE4pe3JldHVybiBmLk1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKE4pfSxYTEFfQ0xVU1RFUl9QQUxFVFRFKE4pe3JldHVybiBmLk1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKE4pfSxVTktOT1dOOiIjZWVlIixHUkFESUVOVF9PVVRMSU5FOiIjODg4In07CmYuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIifTtjb25zdCBHPXtlbmFibGVFeHRyYWN0aW9uOiEwLG1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb246MTUsbWluRGVncmVlRm9yRXh0cmFjdGlvbjo1LG1heENvbnRyb2xEZWdyZWU6NCxtYXhCcmlkZ2VQYXRoRGVncmVlOjQsb3V0RXh0cmFjdFR5cGVzOlsiTm9PcCJdLGluRXh0cmFjdFR5cGVzOltdLGRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZTohMCxleHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZTohMCxlbmFibGVCcmlkZ2VncmFwaDohMCxtaW5NYXhDb2xvcnM6WyIjZmZmNWYwIiwiI2ZiNmE0YSJdLG1heEFubm90YXRpb25zOjV9LEQ9bmV3IFJlZ0V4cCgiXig/OiIrYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKyIpPyhcXHcrKV9bYS16MC05XXs4fSg/Ol9cXGQrKT8kIik7Y2xhc3MgQntjb25zdHJ1Y3RvcihOLApSKXt0aGlzLmhpZXJhcmNoeT1OO3RoaXMuZGlzcGxheWluZ1N0YXRzPVI7dGhpcy5pbmRleD17fTt0aGlzLnJlbmRlcmVkT3BOYW1lcz1bXTt0aGlzLmNvbXB1dGVTY2FsZXMoKTt0aGlzLmhhc1N1YmhpZXJhcmNoeT17fTt0aGlzLnJvb3Q9bmV3IFMoTi5yb290LE4uZ3JhcGhPcHRpb25zKTt0aGlzLmluZGV4W04ucm9vdC5uYW1lXT10aGlzLnJvb3Q7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChOLnJvb3QubmFtZSk7dGhpcy5idWlsZFN1YmhpZXJhcmNoeShOLnJvb3QubmFtZSk7dGhpcy5yb290LmV4cGFuZGVkPSEwO3RoaXMudHJhY2VJbnB1dHM9ITF9Y29tcHV0ZVNjYWxlcygpe3RoaXMuZGV2aWNlQ29sb3JNYXA9ZDMuc2NhbGVPcmRpbmFsKCkuZG9tYWluKHRoaXMuaGllcmFyY2h5LmRldmljZXMpLnJhbmdlKF8ubWFwKGQzLnJhbmdlKHRoaXMuaGllcmFyY2h5LmRldmljZXMubGVuZ3RoKSxmLk1ldGFub2RlQ29sb3JzLkRFVklDRV9QQUxFVFRFKSk7dGhpcy54bGFDbHVzdGVyQ29sb3JNYXA9CmQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSxmLk1ldGFub2RlQ29sb3JzLlhMQV9DTFVTVEVSX1BBTEVUVEUpKTtsZXQgTj10aGlzLmhpZXJhcmNoeS5yb290Lm1ldGFncmFwaDt2YXIgUj1kMy5tYXgoTi5ub2RlcygpLFg9PntYPU4ubm9kZShYKTtpZihudWxsIT1YLnN0YXRzKXJldHVybiBYLnN0YXRzLnRvdGFsQnl0ZXN9KTt0aGlzLm1lbW9yeVVzYWdlU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUl0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTtSPWQzLm1heChOLm5vZGVzKCksWD0+e1g9Ti5ub2RlKFgpO2lmKG51bGwhPVguc3RhdHMpcmV0dXJuIFguc3RhdHMuZ2V0VG90YWxNaWNyb3MoKX0pO3RoaXMuY29tcHV0ZVRpbWVTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxSXSkucmFuZ2UoRy5taW5NYXhDb2xvcnMpOwp0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSx0aGlzLmhpZXJhcmNoeS5tYXhNZXRhRWRnZVNpemVdKS5yYW5nZShbZC5zY2VuZS5lZGdlLk1JTl9FREdFX1dJRFRILGQuc2NlbmUuZWRnZS5NQVhfRURHRV9XSURUSF0pfWdldFJlbmRlck5vZGVCeU5hbWUoTil7cmV0dXJuIHRoaXMuaW5kZXhbTl19Z2V0Tm9kZUJ5TmFtZShOKXtyZXR1cm4gdGhpcy5oaWVyYXJjaHkubm9kZShOKX1jb2xvckhpc3RvZ3JhbShOLFIpe2lmKDA8T2JqZWN0LmtleXMoTikubGVuZ3RoKXtjb25zdCBYPV8uc3VtKE9iamVjdC5rZXlzKE4pLm1hcChhYT0+TlthYV0pKTtyZXR1cm4gT2JqZWN0LmtleXMoTikubWFwKGFhPT4oe2NvbG9yOlIoYWEpLHByb3BvcnRpb246TlthYV0vWH0pKX1jb25zb2xlLmluZm8oIm5vIHBhaXJzIGZvdW5kISIpOwpyZXR1cm4gbnVsbH1nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoTil7aWYoIU4pcmV0dXJuIG51bGw7aWYoTiBpbiB0aGlzLmluZGV4KXJldHVybiB0aGlzLmluZGV4W05dO3ZhciBSPXRoaXMuaGllcmFyY2h5Lm5vZGUoTik7aWYoIVIpcmV0dXJuIG51bGw7bGV0IFg9Ui5pc0dyb3VwTm9kZT9uZXcgUyhSLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IEooUik7dGhpcy5pbmRleFtOXT1YO3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTik7Ui5zdGF0cyYmKFgubWVtb3J5Q29sb3I9dGhpcy5tZW1vcnlVc2FnZVNjYWxlKFIuc3RhdHMudG90YWxCeXRlcyksWC5jb21wdXRlVGltZUNvbG9yPXRoaXMuY29tcHV0ZVRpbWVTY2FsZShSLnN0YXRzLmdldFRvdGFsTWljcm9zKCkpKTtYLmlzRmFkZWRPdXQ9dGhpcy5kaXNwbGF5aW5nU3RhdHMmJiFiLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoUi5zdGF0cyk7dmFyIGFhPW51bGwsZmE9bnVsbCxvYT1udWxsOwppZihSLmlzR3JvdXBOb2RlKXthYT1SLmRldmljZUhpc3RvZ3JhbTtmYT1SLnhsYUNsdXN0ZXJIaXN0b2dyYW07dmFyIFo9Ui5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7Uj1SLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO2lmKDAhPVp8fDAhPVIpb2E9Wi8oWitSKX1lbHNlKFo9WC5ub2RlLmRldmljZSkmJihhYT17W1pdOjF9KSwoWj1YLm5vZGUueGxhQ2x1c3RlcikmJihmYT17W1pdOjF9KSxYLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuT1AmJihvYT1YLm5vZGUuY29tcGF0aWJsZT8xOjApO2FhJiYoWC5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLmRldmljZUNvbG9yTWFwKSk7ZmEmJihYLnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShmYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPW9hJiYoWC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUsCnByb3BvcnRpb246b2F9LHtjb2xvcjpiLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFLHByb3BvcnRpb246MS1vYX1dKTtyZXR1cm4gdGhpcy5pbmRleFtOXX1nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKE4pe3ZhciBSPWQuZ2V0SGllcmFyY2hpY2FsUGF0aChOKTtsZXQgWD0wLGFhPW51bGw7Zm9yKDtYPFIubGVuZ3RoJiYoTj1SW1hdLGFhPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShOKSxhYS5leHBhbmRlZCk7WCsrKTtyZXR1cm4gWD09Ui5sZW5ndGgtMiYmKFI9UltYKzFdLGFhLmluQW5ub3RhdGlvbnMubm9kZU5hbWVzW1JdfHxhYS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbUl0pP1I6Tn1zZXREZXB0aChOKXtsKHRoaXMucm9vdCwrTil9aXNOb2RlQXV4aWxpYXJ5KE4pe2xldCBSPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShOLm5vZGUucGFyZW50Tm9kZS5uYW1lKSxYPV8uZmluZChSLmlzb2xhdGVkSW5FeHRyYWN0LGFhPT5hYS5ub2RlLm5hbWU9PT0KTi5ub2RlLm5hbWUpO2lmKFgpcmV0dXJuITA7WD1fLmZpbmQoUi5pc29sYXRlZE91dEV4dHJhY3QsYWE9PmFhLm5vZGUubmFtZT09PU4ubm9kZS5uYW1lKTtyZXR1cm4hIVh9Z2V0TmFtZXNPZlJlbmRlcmVkT3BzKCl7cmV0dXJuIHRoaXMucmVuZGVyZWRPcE5hbWVzfWNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoTixSLFgsYWEpe3ZhciBmYT1YLm5hbWUucmVwbGFjZShSLGFhKTtsZXQgb2E9Ti5tZXRhZ3JhcGgubm9kZShmYSk7aWYob2EpcmV0dXJuIG9hO29hPW5ldyBkLk9wTm9kZUltcGwoe25hbWU6ZmEsaW5wdXQ6W10sZGV2aWNlOlguZGV2aWNlLG9wOlgub3AsYXR0cjpfLmNsb25lRGVlcChYLmF0dHIpfSk7b2EuY2FyZGluYWxpdHk9WC5jYXJkaW5hbGl0eTtvYS5pbmNsdWRlPVguaW5jbHVkZTtvYS5vdXRwdXRTaGFwZXM9Xy5jbG9uZURlZXAoWC5vdXRwdXRTaGFwZXMpO29hLnhsYUNsdXN0ZXI9WC54bGFDbHVzdGVyO29hLmZ1bmN0aW9uSW5wdXRJbmRleD1YLmZ1bmN0aW9uSW5wdXRJbmRleDsKb2EuZnVuY3Rpb25PdXRwdXRJbmRleD1YLmZ1bmN0aW9uT3V0cHV0SW5kZXg7b2EuaW5wdXRzPVguaW5wdXRzLm1hcChaPT57Y29uc3QgY2E9Xy5jbG9uZShaKTtjYS5uYW1lPVoubmFtZS5yZXBsYWNlKFIsYWEpO3JldHVybiBjYX0pO29hLnBhcmVudE5vZGU9TjtOLm1ldGFncmFwaC5zZXROb2RlKG9hLm5hbWUsb2EpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUob2EubmFtZSxvYSk7ZmE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKE4sUixaLGFhKTtvYS5pbkVtYmVkZGluZ3M9WC5pbkVtYmVkZGluZ3MubWFwKGZhKTtvYS5vdXRFbWJlZGRpbmdzPVgub3V0RW1iZWRkaW5ncy5tYXAoZmEpO3JldHVybiBvYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKE4sUixYLGFhLGZhKXtjb25zdCBvYT17fTtOPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLFIsWCxhYSxmYSxvYSk7Xy5pc0VtcHR5KG9hKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhSLApvYSk7cmV0dXJuIE59Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihOLFIsWCxhYSxmYSxvYSl7Y29uc3QgWj1iLmdyYXBoLmNyZWF0ZU1ldGFub2RlKFgubmFtZS5yZXBsYWNlKGFhLGZhKSk7Wi5kZXB0aD1YLmRlcHRoO1ouY2FyZGluYWxpdHk9WC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9WC50ZW1wbGF0ZUlkO1oub3BIaXN0b2dyYW09Xy5jbG9uZShYLm9wSGlzdG9ncmFtKTtaLmRldmljZUhpc3RvZ3JhbT1fLmNsb25lKFguZGV2aWNlSGlzdG9ncmFtKTtaLnhsYUNsdXN0ZXJIaXN0b2dyYW09Xy5jbG9uZShYLnhsYUNsdXN0ZXJIaXN0b2dyYW0pO1ouaGFzTm9uQ29udHJvbEVkZ2VzPVguaGFzTm9uQ29udHJvbEVkZ2VzO1ouaW5jbHVkZT1YLmluY2x1ZGU7Wi5ub2RlQXR0cmlidXRlcz1fLmNsb25lKFgubm9kZUF0dHJpYnV0ZXMpO1ouYXNzb2NpYXRlZEZ1bmN0aW9uPVguYXNzb2NpYXRlZEZ1bmN0aW9uO18uZWFjaChYLm1ldGFncmFwaC5ub2RlcygpLGNhPT4Ke2NhPVgubWV0YWdyYXBoLm5vZGUoY2EpO3N3aXRjaChjYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpjYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTixSLGNhLGFhLGZhLG9hKTtjYS5wYXJlbnROb2RlPVo7Wi5tZXRhZ3JhcGguc2V0Tm9kZShjYS5uYW1lLGNhKTt0aGlzLmhpZXJhcmNoeS5zZXROb2RlKGNhLm5hbWUsY2EpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpjYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixhYSxjYSxmYSk7Xy5pc051bWJlcihjYS5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoUixjYSk7Xy5pc051bWJlcihjYS5mdW5jdGlvbk91dHB1dEluZGV4KSYmKG9hW2NhLmZ1bmN0aW9uT3V0cHV0SW5kZXhdPWNhKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihjYS5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSk7CnRoaXMuY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhYLFosYWEsZmEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTixSLFgsYWEpe18uZWFjaChOLm1ldGFncmFwaC5lZGdlcygpLGZhPT57ZmE9Ti5tZXRhZ3JhcGguZWRnZShmYSk7Y29uc3Qgb2E9ZmEudi5yZXBsYWNlKFgsYWEpLFo9ZmEudy5yZXBsYWNlKFgsYWEpLGNhPW5ldyBkLk1ldGFlZGdlSW1wbChvYSxaKTtjYS5pbmJvdW5kPWZhLmluYm91bmQ7Y2EubnVtUmVndWxhckVkZ2VzPWZhLm51bVJlZ3VsYXJFZGdlcztjYS5udW1Db250cm9sRWRnZXM9ZmEubnVtQ29udHJvbEVkZ2VzO2NhLm51bVJlZkVkZ2VzPWZhLm51bVJlZkVkZ2VzO2NhLnRvdGFsU2l6ZT1mYS50b3RhbFNpemU7ZmEuYmFzZUVkZ2VMaXN0JiYoY2EuYmFzZUVkZ2VMaXN0PWZhLmJhc2VFZGdlTGlzdC5tYXAoamE9Pntjb25zdCBiYT1fLmNsb25lKGphKTtiYS52PWphLnYucmVwbGFjZShYLGFhKTtiYS53PWphLncucmVwbGFjZShYLGFhKTsKcmV0dXJuIGJhfSkpO1IubWV0YWdyYXBoLm5vZGUoWik/Ui5tZXRhZ3JhcGguc2V0RWRnZShvYSxaLGNhKTpSLm1ldGFncmFwaC5zZXRFZGdlKFosb2EsY2EpfSl9cGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhOLFIpe2xldCBYPU1hdGgubWluKFIuZnVuY3Rpb25JbnB1dEluZGV4LE4uaW5wdXRzLmxlbmd0aC0xKTtmb3IodmFyIGFhPV8uY2xvbmUoTi5pbnB1dHNbWF0pO2FhLmlzQ29udHJvbERlcGVuZGVuY3k7KVgrKyxhYT1OLmlucHV0c1tYXTtSLmlucHV0cy5wdXNoKGFhKTthYT10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTi5uYW1lKTtsZXQgZmEsb2E9MDtfLmVhY2goYWEucmVndWxhcixaPT57b2ErPVoubnVtUmVndWxhckVkZ2VzO2lmKG9hPlgpcmV0dXJuIGZhPVosITF9KTtfLmVhY2goZmEuYmFzZUVkZ2VMaXN0LFo9PntaLnc9PT1OLm5hbWUmJihaLnc9Ui5uYW1lKTtaLnY9PT1OLm5hbWUmJihaLnY9Ui5uYW1lKX0pfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKE4sClIpe2NvbnN0IFg9dGhpcy5oaWVyYXJjaHkuZ2V0U3VjY2Vzc29ycyhOLm5hbWUpO18uZWFjaChYLnJlZ3VsYXIsYWE9PntfLmVhY2goYWEuYmFzZUVkZ2VMaXN0LGZhPT57Y29uc3Qgb2E9dGhpcy5oaWVyYXJjaHkubm9kZShmYS53KTtfLmVhY2gob2EuaW5wdXRzLFo9PntaLm5hbWU9PT1OLm5hbWUmJihaLm5hbWU9UltaLm91dHB1dFRlbnNvcktleV0ubmFtZSxaLm91dHB1dFRlbnNvcktleT1mYS5vdXRwdXRUZW5zb3JLZXkpfSl9KTtfLmVhY2goYWEuYmFzZUVkZ2VMaXN0LGZhPT57ZmEudj1SW2ZhLm91dHB1dFRlbnNvcktleV0ubmFtZTtmYS5vdXRwdXRUZW5zb3JLZXk9IjAifSl9KX1idWlsZFN1YmhpZXJhcmNoeShOKXtpZighKE4gaW4gdGhpcy5oYXNTdWJoaWVyYXJjaHkpKXt0aGlzLmhhc1N1YmhpZXJhcmNoeVtOXT0hMDt2YXIgUj10aGlzLmluZGV4W05dO2lmKFIubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBfHxSLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKXt2YXIgWD0KUi5ub2RlLm1ldGFncmFwaCxhYT1SLmNvcmVHcmFwaCxmYT1bXSxvYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goWC5ub2RlcygpLHlhPT57Y29uc3QgQWE9WC5ub2RlKHlhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXlhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHlhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShYLEFhLEZhLm5vZGUsRmEubm9kZS5uYW1lLEFhLm5hbWUpLGZhLnB1c2goQWEpLG9hLnB1c2goeWEpKX0pLF8uZWFjaChvYSwoeWEsQWEpPT57QWE9ZmFbQWFdO3lhLnBhcmVudE5vZGU9QWEucGFyZW50Tm9kZTtYLnNldE5vZGUoQWEubmFtZSx5YSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShBYS5uYW1lLHlhKX0pKTtfLmVhY2goWC5ub2RlcygpLHlhPT57bGV0IEFhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhKSwKRmE9QWEubm9kZTthYS5zZXROb2RlKHlhLEFhKTtGYS5pc0dyb3VwTm9kZXx8KF8uZWFjaChGYS5pbkVtYmVkZGluZ3MseGE9PntsZXQgU2E9bmV3IE8obnVsbCksWGE9bmV3IEooeGEpO2goQWEseGEsWGEsU2EsSy5DT05TVEFOVCk7dGhpcy5pbmRleFt4YS5uYW1lXT1YYX0pLF8uZWFjaChGYS5vdXRFbWJlZGRpbmdzLHhhPT57bGV0IFNhPW5ldyBPKG51bGwpLFhhPW5ldyBKKHhhKTtrKEFhLHhhLFhhLFNhLEsuU1VNTUFSWSk7dGhpcy5pbmRleFt4YS5uYW1lXT1YYX0pKX0pO18uZWFjaChYLmVkZ2VzKCkseWE9Pnt2YXIgQWE9WC5lZGdlKHlhKTtBYT1uZXcgTyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3lhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeWEud10uaXNGYWRlZE91dDthYS5zZXRFZGdlKHlhLnYseWEudyxBYSl9KTtHLmVuYWJsZUV4dHJhY3Rpb24mJlIubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZDKFIpO18uaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8CnRoaXMuYnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhYKTtOPT09Yi5ncmFwaC5ST09UX05BTUUmJl8uZm9yT3duKHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMseWE9Pnt5YT15YS5ub2RlO2NvbnN0IEFhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhLm5hbWUpO1IubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QucHVzaChBYSk7QWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFO2FhLnJlbW92ZU5vZGUoeWEubmFtZSl9KTt2YXIgWj1SLm5vZGUucGFyZW50Tm9kZTtpZihaKXt2YXIgY2E9dGhpcy5pbmRleFtaLm5hbWVdLGphPSh5YSwuLi5BYSk9PkFhLmNvbmNhdChbeWE/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksYmE9dGhpcy5oaWVyYXJjaHkuZ2V0QnJpZGdlZ3JhcGgoTiksa2E9e30sVz17fSxFYT17fTtfLmVhY2goYmEuZWRnZXMoKSx5YT0+e2xldCBBYT0hIVgubm9kZSh5YS53KSxGYT1BYT95YS52OnlhLnc7YmEuZWRnZSh5YSkubnVtUmVndWxhckVkZ2VzPwpBYT9XW0ZhXT0oV1tGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChiYS5lZGdlcygpLHlhPT57dmFyIEFhPWJhLmVkZ2UoeWEpO2xldCBGYT0hIVgubm9kZSh5YS53KSxbeGEsU2FdPUZhP1t5YS53LHlhLnZdOlt5YS52LHlhLnddO3ZhciBYYT10aGlzLmluZGV4W3hhXSx1Yj10aGlzLmluZGV4W1NhXSxCYj11Yj91Yi5ub2RlOnZhW1NhXSxxYj0hQWEubnVtUmVndWxhckVkZ2VzJiZFYVtTYV0+Ry5tYXhDb250cm9sRGVncmVlLFssemJdPUZhP1tSLmluQW5ub3RhdGlvbnMsWGEuaW5Bbm5vdGF0aW9uc106W1Iub3V0QW5ub3RhdGlvbnMsWGEub3V0QW5ub3RhdGlvbnNdO2xldCB2Yj0oRmE/VzprYSlbU2FdPkcubWF4QnJpZGdlUGF0aERlZ3JlZTt5YT1udWxsO3ZhciBHYj0hMTtHLmVuYWJsZUJyaWRnZWdyYXBoJiYhdmImJiFxYiYmWGEuaXNJbkNvcmUoKSYmKEdiPQpPYj0+Y2EuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6T2IsdzpOfTp7djpOLHc6T2J9KSwoeWE9R2IoU2EpKXx8KHlhPUdiKGphKEZhLFNhLFoubmFtZSkpKSxHYj0hIXlhKTtYYT0hMTtpZih5YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eWE7Zm9yKHFiPWNhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTtYYT1YYS5tZXRhZWRnZTtYYT1xYltYYS52XT5xYltYYS53XX1HYiYmIVhhPyhCYj1qYShGYSxOKSx1Yj1qYShGYSxTYSxOKSx6Yj1hYS5ub2RlKHViKSx6Ynx8KEdiPWFhLm5vZGUoQmIpLEdifHwoR2I9bmV3IEooe25hbWU6QmIsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVELAppbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFtCYl09R2IsYWEuc2V0Tm9kZShCYixHYikpLHpiPW5ldyBKKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsYWEuc2V0Tm9kZSh1Yix6YiksYWEuc2V0UGFyZW50KHViLEJiKSxHYi5ub2RlLmNhcmRpbmFsaXR5KyspLEFhPW5ldyBPKEFhKSxBYS5hZGpvaW5pbmdNZXRhZWRnZT15YSxGYT9hYS5zZXRFZGdlKHViLHhhLEFhKTphYS5zZXRFZGdlKHhhLHViLEFhKSk6emIucHVzaChuZXcgSChCYix1YixuZXcgTyhBYSksSy5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seWE9PntsZXQgQWE9amEoeWEsTiksRmE9YWEubm9kZShBYSk7RmEmJl8uZWFjaChhYS5ub2RlcygpLAp4YT0+e2lmKGFhLm5vZGUoeGEpLm5vZGUudHlwZSE9PWQuTm9kZVR5cGUuQlJJREdFJiYoeWE/IWFhLnByZWRlY2Vzc29ycyh4YSkubGVuZ3RoOiFhYS5zdWNjZXNzb3JzKHhhKS5sZW5ndGgpKXt2YXIgU2E9amEoeWEsTiwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1hYS5ub2RlKFNhKTtYYXx8KFhhPW5ldyBKKHtuYW1lOlNhLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnlhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxhYS5zZXROb2RlKFNhLFhhKSxGYS5ub2RlLmNhcmRpbmFsaXR5KyssYWEuc2V0UGFyZW50KFNhLEFhKSk7WGE9bmV3IE8obnVsbCk7WGEuc3RydWN0dXJhbD0hMDtYYS53ZWlnaHQtLTt5YT9hYS5zZXRFZGdlKFNhLHhhLFhhKTphYS5zZXRFZGdlKHhhLApTYSxYYSl9fSl9KX19fX1idWlsZFN1YmhpZXJhcmNoaWVzRm9yTmVlZGVkRnVuY3Rpb25zKE4pe18uZWFjaChOLmVkZ2VzKCksUj0+e1I9Ti5lZGdlKFIpO1I9bmV3IE8oUik7Xy5mb3JFYWNoKFIubWV0YWVkZ2UuYmFzZUVkZ2VMaXN0LFg9Pnt2YXIgYWE9WC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGZhPWFhLmxlbmd0aDswPD1mYTtmYS0tKXtYPWFhLnNsaWNlKDAsZmEpO2NvbnN0IG9hPXRoaXMuaGllcmFyY2h5Lm5vZGUoWC5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSk7aWYob2Epe2lmKG9hLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZ0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW29hLm9wXSlmb3IoYWE9MTthYTxYLmxlbmd0aDthYSsrKShmYT1YLnNsaWNlKDAsYWEpLmpvaW4oYi5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKSYmdGhpcy5idWlsZFN1YmhpZXJhcmNoeShmYSk7YnJlYWt9fX0pfSl9fWYuUmVuZGVyR3JhcGhJbmZvPUI7CmNsYXNzIEh7Y29uc3RydWN0b3IoTixSLFgsYWEsZmEpe3RoaXMubm9kZT1OO3RoaXMucmVuZGVyTm9kZUluZm89Ujt0aGlzLnJlbmRlck1ldGFlZGdlSW5mbz1YO3RoaXMuYW5ub3RhdGlvblR5cGU9YWE7dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmR5PXRoaXMuZHg9MDtYJiZYLm1ldGFlZGdlJiYodGhpcy52PVgubWV0YWVkZ2Uudix0aGlzLnc9WC5tZXRhZWRnZS53KTt0aGlzLmlzSW49ZmE7dGhpcy5wb2ludHM9W119fWYuQW5ub3RhdGlvbj1IO2xldCBLOyhmdW5jdGlvbihOKXtOW04uU0hPUlRDVVQ9MF09IlNIT1JUQ1VUIjtOW04uQ09OU1RBTlQ9MV09IkNPTlNUQU5UIjtOW04uU1VNTUFSWT0yXT0iU1VNTUFSWSI7TltOLkVMTElQU0lTPTNdPSJFTExJUFNJUyJ9KShLPWYuQW5ub3RhdGlvblR5cGV8fChmLkFubm90YXRpb25UeXBlPXt9KSk7Y2xhc3MgTHtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdD1bXTt0aGlzLm5vZGVOYW1lcz17fX1wdXNoKE4pe2lmKCEoTi5ub2RlLm5hbWUgaW4KdGhpcy5ub2RlTmFtZXMpKWlmKHRoaXMubm9kZU5hbWVzW04ubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPEcubWF4QW5ub3RhdGlvbnMpdGhpcy5saXN0LnB1c2goTik7ZWxzZXt2YXIgUj10aGlzLmxpc3RbdGhpcy5saXN0Lmxlbmd0aC0xXTtSLmFubm90YXRpb25UeXBlPT09Sy5FTExJUFNJUz8oTj1SLm5vZGUsTi5zZXROdW1Nb3JlTm9kZXMoKytOLm51bU1vcmVOb2RlcykpOihSPW5ldyBiLmdyYXBoLkVsbGlwc2lzTm9kZUltcGwoMSksdGhpcy5saXN0LnB1c2gobmV3IEgoUixuZXcgSihSKSxudWxsLEsuRUxMSVBTSVMsTi5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1MO2NsYXNzIEp7Y29uc3RydWN0b3IoTil7dGhpcy5ub2RlPU47dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IEw7dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTDt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9CjA7dGhpcy5zdHJ1Y3R1cmFsPXRoaXMuZXhjbHVkZWQ9ITE7dGhpcy5wYWRkaW5nQm90dG9tPXRoaXMucGFkZGluZ1JpZ2h0PXRoaXMucGFkZGluZ0xlZnQ9dGhpcy5wYWRkaW5nVG9wPXRoaXMubGFiZWxIZWlnaHQ9dGhpcy5yYWRpdXM9dGhpcy5sYWJlbE9mZnNldD0wO3RoaXMuaXNPdXRFeHRyYWN0PXRoaXMuaXNJbkV4dHJhY3Q9ITE7dGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzRmFkZWRPdXQ9ITE7dGhpcy5kaXNwbGF5TmFtZT1OLm5hbWUuc3Vic3RyaW5nKE4ubmFtZS5sYXN0SW5kZXhPZihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkrMSk7Ti50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZOLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChOPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TlsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT0KdGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkpKX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1mLlJlbmRlck5vZGVJbmZvPUo7Y2xhc3MgT3tjb25zdHJ1Y3RvcihOKXt0aGlzLm1ldGFlZGdlPU47dGhpcy5hZGpvaW5pbmdNZXRhZWRnZT1udWxsO3RoaXMuc3RydWN0dXJhbD0hMTt0aGlzLndlaWdodD0xO3RoaXMuaXNGYWRlZE91dD0hMX19Zi5SZW5kZXJNZXRhZWRnZUluZm89TztjbGFzcyBTIGV4dGVuZHMgSntjb25zdHJ1Y3RvcihOLFIpe3N1cGVyKE4pO049Ti5tZXRhZ3JhcGguZ3JhcGgoKTtSLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTi5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUik7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD0Ke3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXTt0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXTt0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mLlJlbmRlckdyb3VwTm9kZUluZm89UztmLm1ha2VJbkV4dHJhY3Q9bjtmLm1hcEluZGV4VG9IdWU9ZnVuY3Rpb24oTil7cmV0dXJuIDErNTc5LjI1NjE2Nzk3MjUqTiUzNTh9O2YuZXhwYW5kVW50aWxOb2RlSXNTaG93bj1mdW5jdGlvbihOLFIpe3ZhciBYPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpO1I9Ui5zcGxpdCgiLyIpO3ZhciBhYT1SW1IubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1hYS5sZW5ndGgmJihSW1IubGVuZ3RoLTFdPWFhWzFdKTthYT1SWzBdO2xldCBmYT1OLmdldFJlbmRlck5vZGVCeU5hbWUoYWEpO2ZvcihsZXQgb2E9MTtvYTxSLmxlbmd0aCYmZmEubm9kZS50eXBlIT09CmIuZ3JhcGguTm9kZVR5cGUuT1A7b2ErKylOLmJ1aWxkU3ViaGllcmFyY2h5KGFhKSxmYS5leHBhbmRlZD0hMCxYLnNldE5vZGVFeHBhbmRlZChmYSksYWErPSIvIitSW29hXSxmYT1OLmdldFJlbmRlck5vZGVCeU5hbWUoYWEpO3JldHVybiBmYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUsdyxBKXt2YXIgeT1rKHEsdSx3KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYodyBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx3Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHdbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHcpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHcpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHcgaW5zdGFuY2VvZiBBcnJheSl7bGV0IHg9ITA7Zm9yKGxldCBDPTA7Qzx3Lmxlbmd0aDtDKyspeD14JiZ5LmNsYXNzTGlzdC5jb250YWlucyh3W0NdKTsKaWYoeClyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXd8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHcpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiByKHEsdSl7bGV0IHc9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAsdyk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB4PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0oeD9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx3KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHg/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHcpKTt4JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx3KSl9ZnVuY3Rpb24gbChxLAp1LHcpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit3KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHcsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgeD0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih4PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIreCsiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx3Lmxlbmd0aDt1KyspMDx3W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3dbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUsdyxBLHk9NjAseD0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEg9QlswXSxLPUJbMV0sTD1CWzVdLEo9RFsxXSxPPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09eCYmKHg9MTApO251bGw9PUMmJihDPTApO251bGwhPXcmJncubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIseC89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBTPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChTKTt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtOLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBSPTAsWD0iMCUiO2ZvcihsZXQgZmE9MDtmYTxCLmxlbmd0aDtmYSsrKWlmKEJbZmFdKXtSKz1CW2ZhXTt2YXIgYWE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTthYS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbZmFdLmJhY2tncm91bmRfY29sb3IpO04uYXBwZW5kQ2hpbGQoYWEpO1g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwic3RvcCIpO2FhPTEwMCpSL0orIiUiO1guc2V0QXR0cmlidXRlKCJvZmZzZXQiLGFhKTtYLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1tmYV0uYmFja2dyb3VuZF9jb2xvcik7Ck4uYXBwZW5kQ2hpbGQoWCk7WD1hYX1TLmFwcGVuZENoaWxkKE4pO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwicmVjdCIpO1Muc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK0ErIikiKTtTLnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyh5KSk7Uy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKHgpKTtTLnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMpKTtELmFwcGVuZENoaWxkKFMpO1M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGl0bGUiKTtTLnRleHRDb250ZW50PW0odSxKLEIsTyk7RC5hcHBlbmRDaGlsZChTKTt1PSExO2lmKG51bGwhPXcmJihTPXcueC15LzIseD13LnkteC13LmhlaWdodC8yLTIsMD53LmxhYmVsT2Zmc2V0JiYoeCs9dy5sYWJlbE9mZnNldCksRC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK1MrIiwgIit4KyIpIiksKEJbMl18fEJbM118fEJbNF0pJiYodz13Lm5vZGUuYXR0cikmJgp3Lmxlbmd0aCkpZm9yKEI9MDtCPHcubGVuZ3RoO0IrKylpZigiVCI9PT13W0JdLmtleSl7dT0odz13W0JdLnZhbHVlLnR5cGUpJiYvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdCh3KTticmVha313PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsInRleHQiKTtpZihOdW1iZXIuaXNGaW5pdGUoTy5taW4pJiZOdW1iZXIuaXNGaW5pdGUoTy5tYXgpKXtpZihCPXAoTy5taW4sdSksTz1wKE8ubWF4LHUpLHcudGV4dENvbnRlbnQ9MTxKP0IrIiB+ICIrTzpCLDA8SHx8MDxLfHwwPEwpdy50ZXh0Q29udGVudCs9IiAoIixKPVtdLDA8SCYmSi5wdXNoKGBOYU5cdTAwZDcke0h9YCksMDxLJiZKLnB1c2goYC1cdTIyMWVcdTAwZDcke0t9YCksMDxMJiZKLnB1c2goYCtcdTIyMWVcdTAwZDcke0x9YCksdy50ZXh0Q29udGVudCs9Si5qb2luKCI7ICIpKyIpIn1lbHNlIHcudGV4dENvbnRlbnQ9IihObyBmaW5pdGUgZWxlbWVudHMpIjt3LmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsLXN0YXRzIik7Cm51bGw9PUcmJihHPXkvMik7dy5zZXRBdHRyaWJ1dGUoIngiLFN0cmluZyhHKSk7dy5zZXRBdHRyaWJ1dGUoInkiLFN0cmluZyhDLTIpKTtELmFwcGVuZENoaWxkKHcpO1BvbHltZXIuZG9tKHEucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoRCl9fWYuU1ZHX05BTUVTUEFDRT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuQ2xhc3M9e05vZGU6e0NPTlRBSU5FUjoibm9kZXMiLEdST1VQOiJub2RlIixTSEFQRToibm9kZXNoYXBlIixDT0xPUl9UQVJHRVQ6Im5vZGVjb2xvcnRhcmdldCIsTEFCRUw6Im5vZGVsYWJlbCIsQlVUVE9OX0NPTlRBSU5FUjoiYnV0dG9uY29udGFpbmVyIixCVVRUT05fQ0lSQ0xFOiJidXR0b25jaXJjbGUiLEVYUEFORF9CVVRUT046ImV4cGFuZGJ1dHRvbiIsQ09MTEFQU0VfQlVUVE9OOiJjb2xsYXBzZWJ1dHRvbiJ9LEVkZ2U6e0NPTlRBSU5FUjoiZWRnZXMiLEdST1VQOiJlZGdlIixMSU5FOiJlZGdlbGluZSIsUkVGRVJFTkNFX0VER0U6InJlZmVyZW5jZWVkZ2UiLApSRUZfTElORToicmVmbGluZSIsU0VMRUNUQUJMRToic2VsZWN0YWJsZWVkZ2UiLFNFTEVDVEVEOiJzZWxlY3RlZGVkZ2UiLFNUUlVDVFVSQUw6InN0cnVjdHVyYWwifSxBbm5vdGF0aW9uOntPVVRCT1g6Im91dC1hbm5vdGF0aW9ucyIsSU5CT1g6ImluLWFubm90YXRpb25zIixHUk9VUDoiYW5ub3RhdGlvbiIsTk9ERToiYW5ub3RhdGlvbi1ub2RlIixFREdFOiJhbm5vdGF0aW9uLWVkZ2UiLENPTlRST0xfRURHRToiYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UiLExBQkVMOiJhbm5vdGF0aW9uLWxhYmVsIixFTExJUFNJUzoiYW5ub3RhdGlvbi1lbGxpcHNpcyJ9LFNjZW5lOntHUk9VUDoic2NlbmUiLENPUkU6ImNvcmUiLEZVTkNUSU9OX0xJQlJBUlk6ImZ1bmN0aW9uLWxpYnJhcnkiLElORVhUUkFDVDoiaW4tZXh0cmFjdCIsT1VURVhUUkFDVDoib3V0LWV4dHJhY3QifSxTdWJzY2VuZTp7R1JPVVA6InN1YnNjZW5lIn0sT1BOT0RFOiJvcCIsTUVUQU5PREU6Im1ldGEiLFNFUklFU05PREU6InNlcmllcyIsCkJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2YuaGVhbHRoUGlsbEVudHJpZXM9W3tiYWNrZ3JvdW5kX2NvbG9yOiIjQ0MyRjJDIixsYWJlbDoiTmFOIn0se2JhY2tncm91bmRfY29sb3I6IiNGRjhEMDAiLGxhYmVsOiItXHUyMjFlIn0se2JhY2tncm91bmRfY29sb3I6IiNFQUVBRUEiLGxhYmVsOiItIn0se2JhY2tncm91bmRfY29sb3I6IiNBNUE1QTUiLGxhYmVsOiIwIn0se2JhY2tncm91bmRfY29sb3I6IiMyNjI2MjYiLGxhYmVsOiIrIn0se2JhY2tncm91bmRfY29sb3I6IiMwMDNFRDQiLGxhYmVsOiIrXHUyMjFlIn1dO2YuZml0PWZ1bmN0aW9uKHEsdSx3LEEpe3ZhciB5PXEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IHg9bnVsbDt0cnl7aWYoeD11LmdldEJCb3goKSwwPT09eC53aWR0aClyZXR1cm59Y2F0Y2goQyl7cmV0dXJufXU9ZC5sYXlvdXQuUEFSQU1TLmdyYXBoO3k9ZDMuem9vbUlkZW50aXR5LnNjYWxlKC45Kk1hdGgubWluKHkud2lkdGgvCngud2lkdGgseS5oZWlnaHQveC5oZWlnaHQsMikpLnRyYW5zbGF0ZSh1LnBhZGRpbmcucGFkZGluZ0xlZnQsdS5wYWRkaW5nLnBhZGRpbmdUb3ApO2QzLnNlbGVjdChxKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKHcudHJhbnNmb3JtLHkpLm9uKCJlbmQuZml0dGVkIiwoKT0+e3cub24oImVuZC5maXR0ZWQiLG51bGwpO0EoKX0pfTtmLnBhblRvTm9kZT1mdW5jdGlvbihxLHUsdyxBKXt3PWQzLnNlbGVjdCh1KS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7cX0iXWApLm5vZGUoKTtpZighdylyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHtxfSJgKSwhMTt2YXIgeT13LmdldEJCb3goKSx4PXcuZ2V0U2NyZWVuQ1RNKCk7cT11LmNyZWF0ZVNWR1BvaW50KCk7dz11LmNyZWF0ZVNWR1BvaW50KCk7cS54PXkueDtxLnk9eS55O3cueD15LngreS53aWR0aDt3Lnk9eS55K3kuaGVpZ2h0O3E9cS5tYXRyaXhUcmFuc2Zvcm0oeCk7dz0Kdy5tYXRyaXhUcmFuc2Zvcm0oeCk7eD0oRyxELEIsSCk9PiEoRz5CJiZEPEgpO3k9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBDPXkudG9wK3kuaGVpZ2h0LTE1MDtyZXR1cm4geChxLngsdy54LHkubGVmdCx5LmxlZnQreS53aWR0aC0zMjApfHx4KHEueSx3LnkseS50b3AsQyk/KHg9eS5sZWZ0K3kud2lkdGgvMi0ocS54K3cueCkvMixxPXkudG9wK3kuaGVpZ2h0LzItKHEueSt3LnkpLzIsdz1kMy56b29tVHJhbnNmb3JtKHUpLGQzLnNlbGVjdCh1KS50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKS5jYWxsKEEudHJhbnNsYXRlQnkseC93LmsscS93LmspLCEwKTohMX07Zi5zZWxlY3RPckNyZWF0ZUNoaWxkPWg7Zi5zZWxlY3RDaGlsZD1rO2YuYnVpbGRHcm91cD1mdW5jdGlvbihxLHUsdyxBKXtBPUF8fGYuQ2xhc3MuU2NlbmUuR1JPVVA7bGV0IHk9ayhxLCJnIixBKS5lbXB0eSgpO3E9aChxLCJnIixBKTtBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5DT1JFKTtsZXQgeD1fLnJlZHVjZSh1LmNvcmVHcmFwaC5ub2RlcygpLAooQyxHKT0+e0c9dS5jb3JlR3JhcGgubm9kZShHKTtHLmV4Y2x1ZGVkfHxDLnB1c2goRyk7cmV0dXJuIEN9LFtdKTt1Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZ4LnJldmVyc2UoKTtmLmVkZ2UuYnVpbGRHcm91cChBLHUuY29yZUdyYXBoLHcpO2Yubm9kZS5idWlsZEdyb3VwKEEseCx3KTswPHUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPyhBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZEluRXh0cmFjdCx3KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7MDx1Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLGYubm9kZS5idWlsZEdyb3VwKEEsdS5pc29sYXRlZE91dEV4dHJhY3QsdykpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5yZW1vdmUoKTswPHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPwooQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LHcpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkucmVtb3ZlKCk7cihxLHUpO3kmJnEuYXR0cigib3BhY2l0eSIsMCkudHJhbnNpdGlvbigpLmF0dHIoIm9wYWNpdHkiLDEpO3JldHVybiBxfTtmLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcj1mdW5jdGlvbihxLHUpe2QzLnNlbGVjdChxKS5vbigiY2xpY2siLCgpPT57dS5maXJlKCJncmFwaC1zZWxlY3QiKX0pfTtmLnRyYW5zbGF0ZT1sO2YucG9zaXRpb25SZWN0PWZ1bmN0aW9uKHEsdSx3LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigieCIsdS1BLzIpLmF0dHIoInkiLHcteS8yKS5hdHRyKCJ3aWR0aCIsQSkuYXR0cigiaGVpZ2h0Iix5KX07Zi5wb3NpdGlvblRyaWFuZ2xlPWZ1bmN0aW9uKHEsdSx3LEEseSl7eS89MjtBLz0yO3U9W1t1LHcteV0sW3UrQSwKdyt5XSxbdS1BLHcreV1dO3EudHJhbnNpdGlvbigpLmF0dHIoInBvaW50cyIsdS5tYXAoeD0+eC5qb2luKCIsIikpLmpvaW4oIiAiKSl9O2YucG9zaXRpb25CdXR0b249ZnVuY3Rpb24ocSx1KXtsZXQgdz1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHUpKyh1LmV4cGFuZGVkP3Uud2lkdGg6dS5jb3JlQm94LndpZHRoKS8yLTYsQT11LnktKHUuZXhwYW5kZWQ/dS5oZWlnaHQ6dS5jb3JlQm94LmhlaWdodCkvMis2O3Uubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5TRVJJRVN8fHUuZXhwYW5kZWR8fCh3Kz0xMCxBLT0yKTt1PSJ0cmFuc2xhdGUoIit3KyIsIitBKyIpIjtxLnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHUpO3Euc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6dyxjeTpBLHI6ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEuZXhwYW5kQnV0dG9uUmFkaXVzfSl9O2YucG9zaXRpb25FbGxpcHNlPQpmdW5jdGlvbihxLHUsdyxBLHkpe3EudHJhbnNpdGlvbigpLmF0dHIoImN4Iix1KS5hdHRyKCJjeSIsdykuYXR0cigicngiLEEvMikuYXR0cigicnkiLHkvMil9O2YuaHVtYW5pemVIZWFsdGhQaWxsU3RhdD1wO2YuYWRkSGVhbHRoUGlsbD1uO2YuYWRkSGVhbHRoUGlsbHM9ZnVuY3Rpb24ocSx1LHcpe2lmKHUpe3ZhciBBPTE7ZDMuc2VsZWN0KHEpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKGZ1bmN0aW9uKHkpe2NvbnN0IHg9dVt5Lm5vZGUubmFtZV07bih0aGlzLHg/eFt3XTpudWxsLHksQSsrKX0pfX19KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGVtcGxhdGUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChuKXtsZXQgcT1fLm1hcCh7ZGVwdGg6bi5kZXB0aCwifFZ8IjpuLm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwifEV8IjpuLm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aH0sZnVuY3Rpb24odSx3KXtyZXR1cm4gdysiXHgzZCIrdX0pLmpvaW4oIiAiKTtuPV8ubWFwKG4ub3BIaXN0b2dyYW0sZnVuY3Rpb24odSx3KXtyZXR1cm4gdysiXHgzZCIrdX0pLmpvaW4oIiwiKTtyZXR1cm4gcSsiIFtvcHNdICIrbn1mdW5jdGlvbiBrKG4pe2NvbnN0IHE9bi5nZXROb2RlTWFwKCk7bGV0IHU9T2JqZWN0LmtleXMocSkucmVkdWNlKCh3LEEpPT57Y29uc3QgeT1xW0FdO2lmKHkudHlwZSE9PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gdztBPUEuc3BsaXQoIi8iKS5sZW5ndGgtMTtsZXQgeD1oKHkpLEM9d1t4XXx8e25vZGVzOltdLGxldmVsOkF9O3dbeF09QztDLm5vZGVzLnB1c2goeSk7Qy5sZXZlbD5BJiYoQy5sZXZlbD0KQSk7cmV0dXJuIHd9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModSkubWFwKHc9Plt3LHVbd11dKS5maWx0ZXIoKFssd10pPT57dz13Lm5vZGVzO2lmKDE8dy5sZW5ndGgpcmV0dXJuITA7dz13WzBdO3JldHVybiB3LnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJncuYXNzb2NpYXRlZEZ1bmN0aW9ufSkuc29ydCgoWyx3XSk9Pncubm9kZXNbMF0uZGVwdGgpfWZ1bmN0aW9uIHIobixxKXtyZXR1cm4gXy5yZWR1Y2UobixmdW5jdGlvbih1LHcpe2xldCBBPXdbMF0seT1bXTt3WzFdLm5vZGVzLmZvckVhY2goZnVuY3Rpb24oeCl7Zm9yKGxldCBDPTA7Qzx5Lmxlbmd0aDtDKyspaWYoIXF8fHAoeVtDXS5tZXRhbm9kZS5tZXRhZ3JhcGgseC5tZXRhZ3JhcGgpKXt4LnRlbXBsYXRlSWQ9eVtDXS5tZXRhbm9kZS50ZW1wbGF0ZUlkO3lbQ10ubWVtYmVycy5wdXNoKHgubmFtZSk7cmV0dXJufXgudGVtcGxhdGVJZD1BKyJbIit5Lmxlbmd0aCsiXSI7eS5wdXNoKHttZXRhbm9kZTp4LG1lbWJlcnM6W3gubmFtZV19KX0pOwp5LmZvckVhY2goZnVuY3Rpb24oeCl7dVt4Lm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDp3WzFdLmxldmVsLG5vZGVzOngubWVtYmVyc319KTtyZXR1cm4gdX0se30pfWZ1bmN0aW9uIGwobixxLHUpe3JldHVybiBfLnNvcnRCeShuLFt3PT5xLm5vZGUodykub3Asdz0+cS5ub2RlKHcpLnRlbXBsYXRlSWQsdz0+cS5uZWlnaGJvcnModykubGVuZ3RoLHc9PnEucHJlZGVjZXNzb3JzKHcpLmxlbmd0aCx3PT5xLnN1Y2Nlc3NvcnModykubGVuZ3RoLHc9Pncuc3Vic3RyKHUubGVuZ3RoKV0pfWZ1bmN0aW9uIHAobixxKXtmdW5jdGlvbiB1KEgsSyl7bGV0IEw9SC5zdWJzdHIody5sZW5ndGgpLEo9Sy5zdWJzdHIoQS5sZW5ndGgpO2lmKHlbTF1eeFtKXSlyZXR1cm4gY29uc29sZS53YXJuKCJkaWZmZXJlbnQgdmlzaXQgcGF0dGVybiIsIlsiK3crIl0iLEwsIlsiK0ErIl0iLEopLCEwO3lbTF18fCh5W0xdPXhbSl09ITAsQy5wdXNoKHtuMTpILG4yOkt9KSk7cmV0dXJuITF9aWYoIWIuZ3JhcGguaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKG4sCnEpKXJldHVybiExO2xldCB3PW4uZ3JhcGgoKS5uYW1lLEE9cS5ncmFwaCgpLm5hbWUseT17fSx4PXt9LEM9W107dmFyIEc9bi5zb3VyY2VzKCksRD1xLnNvdXJjZXMoKTtpZihHLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgiKSwhMTtHPWwoRyxuLHcpO0Q9bChELHEsQSk7Zm9yKHZhciBCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExO2Zvcig7MDxDLmxlbmd0aDspe0Q9Qy5wb3AoKTtpZighbShuLm5vZGUoRC5uMSkscS5ub2RlKEQubjIpKSlyZXR1cm4hMTtHPW4uc3VjY2Vzc29ycyhELm4xKTtEPXEuc3VjY2Vzc29ycyhELm4yKTtpZihHLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixHLEQpLCExO0c9bChHLG4sdyk7RD1sKEQscSxBKTtmb3IoQj0wO0I8Ry5sZW5ndGg7QisrKWlmKHUoR1tCXSxEW0JdKSlyZXR1cm4hMX1yZXR1cm4hMH0KZnVuY3Rpb24gbShuLHEpe2lmKG4udHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gbi50ZW1wbGF0ZUlkJiZxLnRlbXBsYXRlSWQmJm4udGVtcGxhdGVJZD09PXEudGVtcGxhdGVJZDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLk9QJiZxLnR5cGU9PT1kLk5vZGVUeXBlLk9QKXJldHVybiBuLm9wPT09cS5vcDtpZihuLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyYmcS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe2xldCB1PW4ubWV0YWdyYXBoLm5vZGVDb3VudCgpO3JldHVybiB1PT09cS5tZXRhZ3JhcGgubm9kZUNvdW50KCkmJigwPT09dXx8bi5tZXRhZ3JhcGgubm9kZShuLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcD09PXEubWV0YWdyYXBoLm5vZGUocS5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3ApfXJldHVybiExfWYuZGV0ZWN0PWZ1bmN0aW9uKG4scSl7bj1rKG4pO2xldCB1PXIobixxKTtyZXR1cm4gT2JqZWN0LmtleXModSkuc29ydCh3PT51W3ddLmxldmVsKS5yZWR1Y2UoKHcsCkEpPT57d1tBXT11W0FdO3JldHVybiB3fSx7fSl9fSkoZC50ZW1wbGF0ZXx8KGQudGVtcGxhdGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3V0aWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Zi50aW1lPWZ1bmN0aW9uKGgsayl7bGV0IHI9RGF0ZS5ub3coKTtrPWsoKTtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXIsIm1zIik7cmV0dXJuIGt9O2YuZ2V0VHJhY2tlcj1mdW5jdGlvbihoKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihrKXtoLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpoLnByb2dyZXNzLnZhbHVlLG1zZzprfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUrayxtc2c6aC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oayxyKXtjb25zb2xlLmVycm9yKHIuc3RhY2spO2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmssZXJyb3I6ITB9KX19fTtmLmdldFN1YnRhc2tUcmFja2VyPWZ1bmN0aW9uKGgsayxyKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihsKXtoLnNldE1lc3NhZ2UocisKIjogIitsKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obCl7aC51cGRhdGVQcm9ncmVzcyhsKmsvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24obCxwKXtoLnJlcG9ydEVycm9yKHIrIjogIitsLHApfX19O2YucnVuVGFzaz1mdW5jdGlvbihoLGspe2suc2V0TWVzc2FnZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIpO3RyeXtsZXQgcj1iLmdyYXBoLnV0aWwudGltZSgiUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsaCk7ay51cGRhdGVQcm9ncmVzcyg0MCk7cmV0dXJuIHJ9Y2F0Y2gocil7ay5yZXBvcnRFcnJvcigiRmFpbGVkIFJlYWRpbmcgbWV0YWRhdGEgcGJ0eHQiLHIpfX07Zi5ydW5Bc3luY1Rhc2s9ZnVuY3Rpb24oaCxrLHIsbCl7cmV0dXJuIG5ldyBQcm9taXNlKHA9PntsLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgbT1iLmdyYXBoLnV0aWwudGltZShoLHIpO2wudXBkYXRlUHJvZ3Jlc3Moayk7cChtKX1jYXRjaChtKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIisKaCxtKX19LDIwKX0pfTtmLnJ1bkFzeW5jUHJvbWlzZVRhc2s9ZnVuY3Rpb24oaCxrLHIsbCl7cmV0dXJuIG5ldyBQcm9taXNlKChwLG0pPT57ZnVuY3Rpb24gbihxKXtsLnJlcG9ydEVycm9yKCJGYWlsZWQgIitoLHEpO20ocSl9bC5zZXRNZXNzYWdlKGgpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHE9RGF0ZS5ub3coKTtyKCkudGhlbihmdW5jdGlvbih1KXtjb25zb2xlLmxvZyhoLCI6IixEYXRlLm5vdygpLXEsIm1zIik7bC51cGRhdGVQcm9ncmVzcyhrKTtwKHUpfSkuY2F0Y2gobil9Y2F0Y2gocSl7bihxKX19LDIwKX0pfTtmLmVzY2FwZVF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX07Zi5NRU1PUllfVU5JVFM9W3tzeW1ib2w6IkIifSx7c3ltYm9sOiJLQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiTUIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IkdCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJUQiIsCm51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlBCIixudW1Vbml0czoxMDI0fV07Zi5USU1FX1VOSVRTPVt7c3ltYm9sOiJcdTAwYjVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07Zi5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGU9ZnVuY3Rpb24oaCxrLHI9MCl7cmV0dXJuIHIrMTxrLmxlbmd0aCYmaD49a1tyKzFdLm51bVVuaXRzP2IuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoaC9rW3IrMV0ubnVtVW5pdHMsayxyKzEpOk51bWJlcihoLnRvUHJlY2lzaW9uKDMpKSsiICIra1tyXS5zeW1ib2x9O2YuaGFzRGlzcGxheWFibGVOb2RlU3RhdHM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgmJigwPGgudG90YWxCeXRlc3x8MDxoLmdldFRvdGFsTWljcm9zKCl8fGgub3V0cHV0U2l6ZSk/CiEwOiExfTtmLnJlbW92ZUNvbW1vblByZWZpeD1mdW5jdGlvbihoKXtpZigyPmgubGVuZ3RoKXJldHVybiBoO2xldCBrPTAscj0wLGw9Xy5taW4oXy5tYXAoaCxwPT5wLmxlbmd0aCkpO2Zvcig7Oyl7aysrO2xldCBwPV8ubWFwKGgsbT0+bS5zdWJzdHJpbmcoMCxrKSk7aWYocC5ldmVyeSgobSxuKT0+MD09PW4/ITA6bT09PXBbbi0xXSkpe2lmKGs+PWwpcmV0dXJuIGg7cj1rfWVsc2UgYnJlYWt9cmV0dXJuIF8ubWFwKGgscD0+cC5zdWJzdHJpbmcocikpfTtmLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZT1mdW5jdGlvbihoKXtoPStuZXcgRGF0ZS0rbmV3IERhdGUoaC8xRTMpO3JldHVybiAzRTQ+aD8ianVzdCBub3ciOjZFND5oP01hdGguZmxvb3IoaC8xRTMpKyIgc2Vjb25kcyBhZ28iOjEyRTQ+aD8iYSBtaW51dGUgYWdvIjozNkU1Pmg/TWF0aC5mbG9vcihoLzZFNCkrIiBtaW51dGVzIGFnbyI6MT09TWF0aC5mbG9vcihoLzM2RTUpPyJhbiBob3VyIGFnbyI6ODY0RTU+aD9NYXRoLmZsb29yKGgvCjM2RTUpKyIgaG91cnMgYWdvIjoxNzI4RTU+aD8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKGgvODY0RTUpKyIgZGF5cyBhZ28ifX0pKGQudXRpbHx8KGQudXRpbD17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbWluaW1hcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7Y29uc3RydWN0b3IoaCxrLHIsbCxwLG0pe3RoaXMuc3ZnPWg7dGhpcy5sYWJlbFBhZGRpbmc9bTt0aGlzLnpvb21HPWs7dGhpcy5tYWluWm9vbT1yO3RoaXMubWF4V2FuZEg9cDtoPWQzLnNlbGVjdChsLnNoYWRvd1Jvb3QpO2xldCBuPWguc2VsZWN0KCJzdmciKSxxPW4uc2VsZWN0KCJyZWN0Iik7dGhpcy52aWV3cG9pbnRDb29yZD17eDowLHk6MH07az1kMy5kcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwoKT0+e3RoaXMudmlld3BvaW50Q29vcmQueD1kMy5ldmVudC54O3RoaXMudmlld3BvaW50Q29vcmQueT1kMy5ldmVudC55O3RoaXMudXBkYXRlVmlld3BvaW50KCl9KTtxLmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoayk7bi5vbigiY2xpY2siLCgpPT57aWYoIWQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciB1PU51bWJlcihxLmF0dHIoIndpZHRoIikpLHc9TnVtYmVyKHEuYXR0cigiaGVpZ2h0IikpLApBPWQzLm1vdXNlKG4ubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9QVswXS11LzI7dGhpcy52aWV3cG9pbnRDb29yZC55PUFbMV0tdy8yO3RoaXMudXBkYXRlVmlld3BvaW50KCl9fSk7dGhpcy52aWV3cG9pbnQ9cS5ub2RlKCk7dGhpcy5taW5pbWFwU3ZnPW4ubm9kZSgpO3RoaXMubWluaW1hcD1sO3RoaXMuY2FudmFzPWguc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCk7dGhpcy5jYW52YXNCdWZmZXI9aC5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCk7dGhpcy5kb3dubG9hZENhbnZhcz1oLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpO2QzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTt0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe2QzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCkuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpO2xldCBoPQotdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGs9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtkMy5zZWxlY3QodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnRyYW5zbGF0ZShoLGspLnNjYWxlKHRoaXMuc2NhbGVNYWluKSl9dXBkYXRlKCl7bGV0IGg9bnVsbDt0cnl7aWYoaD10aGlzLnpvb21HLmdldEJCb3goKSwwPT09aC53aWR0aClyZXR1cm59Y2F0Y2godSl7cmV0dXJufXZhciBrPWQzLnNlbGVjdCgiI2dyYXBoZG93bmxvYWQiKTt0aGlzLmRvd25sb2FkPWsubm9kZSgpO2sub24oImNsaWNrIiwoKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodGhpcy5kb3dubG9hZC5ocmVmKTt2YXIgdT10aGlzLmRvd25sb2FkQ2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7Y29uc3Qgdz11LnNsaWNlKDAsdS5pbmRleE9mKCIsIikpO2lmKHcuZW5kc1dpdGgoIjtiYXNlNjQiKSl7dmFyIEE9CmF0b2IodS5zbGljZSh1LmluZGV4T2YoIiwiKSsxKSk7dT0obmV3IFVpbnQ4QXJyYXkoQS5sZW5ndGgpKS5tYXAoKHkseCk9PkEuY2hhckNvZGVBdCh4KSk7dGhpcy5kb3dubG9hZC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3VdLHt0eXBlOiJpbWFnZS9wbmcifSkpfWVsc2UgY29uc29sZS53YXJuKGBub24tYmFzZTY0IGRhdGEgVVJMICgke3d9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCksdGhpcy5kb3dubG9hZC5ocmVmPXV9KTtrPWQzLnNlbGVjdCh0aGlzLnN2Zyk7dmFyIHI9IiIsbD10aGlzLnN2ZztsPShsLmdldFJvb3ROb2RlP2wuZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IodmFyIHA9MDtwPGwubGVuZ3RoO3ArKyl0cnl7dmFyIG09bFtwXS5jc3NSdWxlc3x8bFtwXS5ydWxlcztpZihudWxsIT1tKWZvcihsZXQgdT0wO3U8bS5sZW5ndGg7dSsrKXIrPW1bdV0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csCiIiKSsiXG4ifWNhdGNoKHUpe2lmKCJTZWN1cml0eUVycm9yIiE9PXUubmFtZSl0aHJvdyB1O31tPWsuYXBwZW5kKCJzdHlsZSIpO20udGV4dChyKTtyPWQzLnNlbGVjdCh0aGlzLnpvb21HKTtsPXIuYXR0cigidHJhbnNmb3JtIik7ci5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpO2guaGVpZ2h0Kz1oLnk7aC53aWR0aCs9aC54O2guaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nO2gud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmc7ay5hdHRyKCJ3aWR0aCIsaC53aWR0aCkuYXR0cigiaGVpZ2h0IixoLmhlaWdodCk7dGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heChoLndpZHRoLGguaGVpZ2h0KTt0aGlzLm1pbmltYXBTaXplPXt3aWR0aDpoLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDpoLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH07ZDMuc2VsZWN0KHRoaXMubWluaW1hcFN2ZykuYXR0cih0aGlzLm1pbmltYXBTaXplKTtkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7CnA9ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpO3Auc3R5bGUoIndpZHRoIixoLndpZHRoKTtwLnN0eWxlKCJoZWlnaHQiLGguaGVpZ2h0KTtwLmF0dHIoIndpZHRoIiwzKmgud2lkdGgpO3AuYXR0cigiaGVpZ2h0IiwzKmguaGVpZ2h0KTtudWxsIT10aGlzLnRyYW5zbGF0ZSYmbnVsbCE9dGhpcy56b29tJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuem9vbSgpKTtsZXQgbj0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTttLnJlbW92ZSgpO2suYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCk7ci5hdHRyKCJ0cmFuc2Zvcm0iLGwpO2xldCBxPW5ldyBJbWFnZTtxLm9ubG9hZD0oKT0+e3ZhciB1PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwKdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpO2QzLnNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7W3RoaXMuY2FudmFzLHRoaXMuY2FudmFzQnVmZmVyXT1bdGhpcy5jYW52YXNCdWZmZXIsdGhpcy5jYW52YXNdfSk7dT10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7dS5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpO3UuZHJhd0ltYWdlKHEsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfTtxLm9uZXJyb3I9KCk9PntxLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtuXSx7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKX07cS5zcmM9CiJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChuKX16b29tKGgpe2lmKG51bGwhPXRoaXMuc2NhbGVNaW5pbWFwKXtoJiYodGhpcy50cmFuc2xhdGU9W2gueCxoLnldLHRoaXMuc2NhbGVNYWluPWguayk7dmFyIGs9dGhpcy5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1kMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47dGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtoPWsud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47az1rLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtyLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KS5hdHRyKCJ3aWR0aCIsCmgpLmF0dHIoImhlaWdodCIsayk7cj10aGlzLm1pbmltYXBTaXplLndpZHRoO3ZhciBsPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LHA9dGhpcy52aWV3cG9pbnRDb29yZC54LG09dGhpcy52aWV3cG9pbnRDb29yZC55Oy44PihNYXRoLm1pbihNYXRoLm1heCgwLHAraCksciktTWF0aC5taW4oTWF0aC5tYXgoMCxwKSxyKSkqKE1hdGgubWluKE1hdGgubWF4KDAsbStrKSxsKS1NYXRoLm1pbihNYXRoLm1heCgwLG0pLGwpKS8ocipsKT90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX19ZC5NaW5pbWFwPWZ9KShiLnNjZW5lfHwoYi5zY2VuZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHI9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgscixwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgS2g7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGsscil7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3J9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUFYX0dUIik7cmV0dXJuIGtbOV0+cn19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTxyfX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUlOX0dUIik7cmV0dXJuIGtbOF0+cn19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1JTl9MVCIpO3JldHVybiBrWzhdPHJ9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGsscik9PntkKHIsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+cn19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayxyKT0+e2QociwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTxyfX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHIpPT57ZChyLCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+cn19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayxyKT0+e2QociwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTxyfX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayxyKT0+e2QociwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+cn19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGsscik9PntkKHIsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHJ9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHIgaW4gaClpZihoLmhhc093blByb3BlcnR5KHIpJiZoW3JdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gcjtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGsscixsKXtpZihmKHIpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsocixsKX19KShLaHx8KEtoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGVuc29yLXdpZGdldC90ZW5zb3Jfd2lkZ2V0X2JpbmFyeS5qcwpmdW5jdGlvbiBMaChiKXtyZXR1cm4gbnVsbCE9PWIubWF0Y2goL15pbnRbMC05XSskLyl8fG51bGwhPT1iLm1hdGNoKC9edWludFswLTldKyQvKX1mdW5jdGlvbiBNaChiKXtyZXR1cm4gbnVsbCE9PWIubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PWIubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gWWkoYil7cmV0dXJuImJvb2wiPT09Yi50b0xvd2VyQ2FzZSgpfHwiYm9vbGVhbiI9PT1iLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gWmkoYil7cmV0dXJuInN0ciI9PT1iLnRvTG93ZXJDYXNlKCl8fCJzdHJpbmciPT09Yi50b0xvd2VyQ2FzZSgpfQpjbGFzcyAkaXtjb25zdHJ1Y3RvcihiKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yi5hcHBlbmRDaGlsZCh0aGlzLmRyb3Bkb3duKX1zaG93KGIsZCxmKXtmLmZvckVhY2goaz0+e2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0iKTtyLnRleHRDb250ZW50PWsuY2FwdGlvbjt0aGlzLmRyb3Bkb3duLmFwcGVuZENoaWxkKHIpO2suZGlzYWJsZWQ/ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tZGlzYWJsZWQiKToKKHIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGw9PntsLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09ay5vbkNsaWNrKWsub25DbGljayhsKTt0aGlzLmhpZGUoKX0pLHIuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsbD0+e2lmKG51bGwhPT1rLm9uSG92ZXIpay5vbkhvdmVyKGwpO3IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpfSksci5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoKT0+e3IuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO2lmKG51bGwhPT1rLm9uSG92ZXIpe3ZhciBsPVtdO2ZvcihsZXQgcD0wO3A8ci5jaGlsZHJlbi5sZW5ndGg7KytwKXtjb25zdCBtPXIuY2hpbGRyZW5bcF07bS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmwucHVzaChtKX1sLmZvckVhY2gocD0+CnIucmVtb3ZlQ2hpbGQocCkpfX0pKX0pO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0iYmxvY2siO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPWIrInB4Ijt0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQ9ZCsicHgiO2Y9dGhpcy5kcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBoPWYubGVmdC1kO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShiLShmLnRvcC1iKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oZC1oKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj0oKT0+e3RoaXMuaGlkZSgpfTtzZXRUaW1lb3V0KCgpPT53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuYmx1ckhpZGVGdW5jdGlvbiksNTApfWhpZGUoKXtmb3IodGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLmRyb3Bkb3duLmZpcnN0Q2hpbGQ7KXRoaXMuZHJvcGRvd24ucmVtb3ZlQ2hpbGQodGhpcy5kcm9wZG93bi5maXJzdENoaWxkKTsKdGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmJsdXJIaWRlRnVuY3Rpb24pfXNob3duKCl7cmV0dXJuIHRoaXMuaXNTaG93bn19CmNsYXNzIGFqe2NvbnN0cnVjdG9yKGIsZCl7dGhpcy5jb25maWc9Yjt0aGlzLnBhcmVudEVsZW1lbnQ9ZDt0aGlzLmJhc2VGbGF0TWVudT1uZXcgJGkodGhpcy5wYXJlbnRFbGVtZW50KTt0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zPXt9O3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goKGYsaCk9PntudWxsIT1mLm9wdGlvbnMmJih0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW2hdPWYuZGVmYXVsdFNlbGVjdGlvbil9KX1zaG93KGIsZCl7Y29uc3QgZj1bXTt0aGlzLmNvbmZpZy5pdGVtcy5mb3JFYWNoKChoLGspPT57Y29uc3Qgcj17Y2FwdGlvbjpoLmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9aC5vcHRpb25zKXtjb25zdCBsPXRoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnNba107ci5vbkhvdmVyPXA9Pnt2YXIgbT1wLnRhcmdldDtjb25zdCBuPVtdO2gub3B0aW9ucy5mb3JFYWNoKChxLHUpPT57bi5wdXNoKHtjYXB0aW9uOnU9PT1sPwpxKyIgKFx1MjcxMykiOnEsb25DbGljazooKT0+e2whPT11JiYodGhpcy5jdXJyZW50Q2hvaWNlU2VsZWN0aW9uc1trXT11LGguY2FsbGJhY2sodSkpfSxvbkhvdmVyOm51bGx9KX0pO3A9bmV3ICRpKG0pO209bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtwLnNob3cobS50b3AsbS5yaWdodCxuKX19ZWxzZSByLm9uQ2xpY2s9aC5jYWxsYmFjaztudWxsPT1oLmlzRW5hYmxlZHx8aC5pc0VuYWJsZWQoKXx8KHIuZGlzYWJsZWQ9ITApO2YucHVzaChyKX0pO3RoaXMuYmFzZUZsYXRNZW51LnNob3coYixkLGYpfWhpZGUoKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9c2hvd24oKXtyZXR1cm4gdGhpcy5iYXNlRmxhdE1lbnUuc2hvd24oKX19ZnVuY3Rpb24gYmooYil7bGV0IGQ9MTtiLmZvckVhY2goZj0+e2QqPWZ9KTtyZXR1cm4gZH1mdW5jdGlvbiBjaihiKXtyZXR1cm4gMD09PWIubGVuZ3RoPyJzY2FsYXIiOmBbJHtifV1gfQpmdW5jdGlvbiBkaihiKXtjb25zdCBkPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfTt2YXIgZj1iLmxlbmd0aDtpZigxPT09ZilkLnZpZXdpbmdEaW1zPVswXTtlbHNlIGlmKDE8Zil7aWYoMjxmKWZvcihsZXQgaD0wO2g8Zi0yOysraClkLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5wdXNoKHtkaW06aCxpbmRleDowPT09YltoXT9udWxsOjB9KTtmb3IoZj1iLmxlbmd0aC0yO2Y8Yi5sZW5ndGg7KytmKWQudmlld2luZ0RpbXMucHVzaChmKX1yZXR1cm4gZH0KZnVuY3Rpb24gZWooYixkKXtpZihiLnZpZXdpbmdEaW1zWzBdIT09ZC52aWV3aW5nRGltc1swXXx8Yi52aWV3aW5nRGltc1sxXSE9PWQudmlld2luZ0RpbXNbMV0pcmV0dXJuITE7ZD1iLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZj0+Zi5kaW0pO2Quc29ydCgpO2I9Yi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGY9PmYuZGltKTtiLnNvcnQoKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZCk9PT1KU09OLnN0cmluZ2lmeShiKX12YXIgZmo7KGZ1bmN0aW9uKGIpe2JbYi5VUD0xXT0iVVAiO2JbYi5ET1dOPTJdPSJET1dOIjtiW2IuTEVGVD0zXT0iTEVGVCI7YltiLlJJR0hUPTRdPSJSSUdIVCJ9KShmanx8KGZqPXt9KSk7CmNsYXNzIGdqe2NvbnN0cnVjdG9yKGIsZCxmLGgsayxyKXt0aGlzLnNoYXBlPWI7dGhpcy5zbGljZURpbXM9W107dGhpcy5zbGljZUluZGljZXM9W107aWYoMD09PWJqKHRoaXMuc2hhcGUpKXRocm93IEVycm9yKCJUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0ZW5zb3Igd2l0aCB6ZXJvIGVsZW1lbnRzLiIpO2ZvcihiPTA7YjxkLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5sZW5ndGg7KytiKXt0aGlzLnNsaWNlRGltcy5wdXNoKGQuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW2JdLmRpbSk7Y29uc3QgbD1kLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tiXS5pbmRleDtpZihudWxsPT09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGR1ZSB0byAiK2B1bmRldGVybWluZWQgc2xpY2luZyBpbmRleCBhdCBkaW1lbnNpb24gJHtifWApO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2gobCl9dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoOwppZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoYEV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICR7dGhpcy5yYW5rfSwgYCtgYnV0IGdvdCBsZW5ndGggJHt0aGlzLnNsaWNlRGltcy5sZW5ndGh9YCk7dGhpcy52aWV3RGltcz1bXTtmb3IoZD0wO2Q8dGhpcy5yYW5rOysrZCktMT09PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoZCkmJnRoaXMudmlld0RpbXMucHVzaChkKTtpZigyPHRoaXMudmlld0RpbXMubGVuZ3RoKXRocm93IEVycm9yKCJPbmx5IHNlbGVjdGlvbnMgaW4gMUQgYW5kIDJEIGFyZSBzdXBwb3J0ZWQuIik7dGhpcy5yb3dTdGFydD1udWxsPT1mPzA6Zjt0aGlzLmNvbFN0YXJ0PW51bGw9PWg/MDpoO3RoaXMucm93Q291bnQ9bnVsbD09az8xOms7dGhpcy5jb2xDb3VudD1udWxsPT1yPzE6cn1nZXRFbGVtZW50U3RhdHVzKGIpe2lmKGIubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKGBFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICR7dGhpcy5yYW5rfSwgYCsKYGJ1dCBnb3QgJHtiLmxlbmd0aH0gKFske2J9XSlgKTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoOysrZClpZigtMSE9PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoZCkmJmJbZF0hPT10aGlzLnNsaWNlSW5kaWNlc1t0aGlzLnNsaWNlRGltcy5pbmRleE9mKGQpXSlyZXR1cm4gbnVsbDtkPW51bGw7Y29uc3QgZj10aGlzLnJvd1N0YXJ0K3RoaXMucm93Q291bnQ7dmFyIGg9dGhpcy5jb2xTdGFydCt0aGlzLmNvbENvdW50O2lmKDA9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCkwPT09Yi5sZW5ndGgmJihkPXt0b3BFZGdlOiEwLGJvdHRvbUVkZ2U6ITAsbGVmdEVkZ2U6ITAscmlnaHRFZGdlOiEwfSk7ZWxzZSBpZigxPT09dGhpcy52aWV3RGltcy5sZW5ndGgpaD10aGlzLnZpZXdEaW1zWzBdLGJbaF0+PXRoaXMucm93U3RhcnQmJmJbaF08ZiYmKGQ9e3RvcEVkZ2U6YltoXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpiW2hdPT09Zi0xLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pO2Vsc2UgaWYoMj09PQp0aGlzLnZpZXdEaW1zLmxlbmd0aCl7Y29uc3Qgaz10aGlzLnZpZXdEaW1zWzBdLHI9dGhpcy52aWV3RGltc1sxXTtiW2tdPj10aGlzLnJvd1N0YXJ0JiZiW2tdPGYmJmJbcl0+PXRoaXMuY29sU3RhcnQmJmJbcl08aCYmKGQ9e3RvcEVkZ2U6YltrXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpiW2tdPT09Zi0xLGxlZnRFZGdlOmJbcl09PT10aGlzLmNvbFN0YXJ0LHJpZ2h0RWRnZTpiW3JdPT09aC0xfSl9ZWxzZSB0aHJvdyBFcnJvcihgVW5leHBlY3RlZCBsZW5ndGggb2Ygdmlld0RpbXM6ICR7dGhpcy52aWV3RGltc31gKTtyZXR1cm4gZH1tb3ZlKGIsZCl7bGV0IGY9bnVsbDtpZigwPT09dGhpcy5yYW5rfHwxPT09dGhpcy5yYW5rJiYoYj09PWZqLkxFRlR8fGI9PT1mai5SSUdIVCkpcmV0dXJuIG51bGw7aWYobnVsbD09PWQudmVydGljYWxSYW5nZXx8bnVsbD09PWQudmVydGljYWxSYW5nZVsxXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIG1vdmUgZHVlIHRvIHVuZGV0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKYj09PWZqLlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1kLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8ZC52ZXJ0aWNhbFJhbmdlWzBdJiYoZj1mai5VUCkpOmI9PT1mai5ET1dOP251bGwhPWQudmlld2luZ0RpbXMmJm51bGwhPWQudmlld2luZ0RpbXNbMF0mJnRoaXMucm93U3RhcnQ8dGhpcy5zaGFwZVtkLnZpZXdpbmdEaW1zWzBdXS0xJiYodGhpcy5yb3dTdGFydCsrLG51bGwhPWQudmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydD49ZC52ZXJ0aWNhbFJhbmdlWzFdJiYoZj1mai5ET1dOKSk6Yj09PWZqLkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPWQuaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PGQuaG9yaXpvbnRhbFJhbmdlWzBdJiYoZj1mai5MRUZUKSk6Yj09PWZqLlJJR0hUJiZudWxsIT1kLnZpZXdpbmdEaW1zJiZudWxsIT1kLnZpZXdpbmdEaW1zWzFdJiZ0aGlzLmNvbFN0YXJ0PHRoaXMuc2hhcGVbZC52aWV3aW5nRGltc1sxXV0tCjEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9ZC5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PWQuaG9yaXpvbnRhbFJhbmdlWzFdJiYoZj1mai5SSUdIVCkpO3RoaXMuY29sQ291bnQ9dGhpcy5yb3dDb3VudD0xO3JldHVybiBmfWdldFJvd1N0YXJ0KCl7cmV0dXJuIHRoaXMucm93U3RhcnR9Z2V0Um93Q291bnQoKXtyZXR1cm4gdGhpcy5yb3dDb3VudH1nZXRDb2xTdGFydCgpe3JldHVybiB0aGlzLmNvbFN0YXJ0fWdldENvbENvdW50KCl7cmV0dXJuIHRoaXMuY29sQ291bnR9fQpjbGFzcyBoantjb25zdHJ1Y3RvcihiLGQsZj0oKT0+e30pe3RoaXMucm9vdERpdj1iO3RoaXMuc2hhcGU9ZDt0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2U9Zjt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuYnJhY2tldERpdnM9W251bGwsbnVsbF07dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDM+dGhpcy5yYW5rKXRocm93IEVycm9yKCJEaW1lbnNpb24gY29udHJvbCBpcyBub3QgYXBwbGljYWJsZSB0byB0ZW5zb3Igc2hhcGVzIGxlc3MgdGhhbiAiK2AzRDogcmVjZWl2ZWQgJHt0aGlzLnJhbmt9RCB0ZW5zb3Igc2hhcGU6IGArYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSl9LmApO3RoaXMuY3JlYXRlQ29tcG9uZW50cygpO3RoaXMuc2xpY2luZ1NwZWM9ZGooZCl9Y3JlYXRlQ29tcG9uZW50cygpe2Zvcig7dGhpcy5yb290RGl2LmZpcnN0Q2hpbGQ7KXRoaXMucm9vdERpdi5yZW1vdmVDaGlsZCh0aGlzLnJvb3REaXYuZmlyc3RDaGlsZCk7CnRoaXMuZGltQ29udHJvbHM9W107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5icmFja2V0RGl2c1swXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzBdLnRleHRDb250ZW50PSJTbGljaW5nOiBbIjt0aGlzLmJyYWNrZXREaXZzWzBdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMF0pO2ZvcihsZXQgZD0wO2Q8dGhpcy5yYW5rOysrZCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO2IudGl0bGU9YERpbWVuc2lvbiAke2R9OiBzaXplPSR7dGhpcy5zaGFwZVtkXX1gO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChiKTt0aGlzLmRpbUNvbnRyb2xzLnB1c2goYik7CnRoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7Yi5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoYik7dGhpcy5kaW1JbnB1dHMucHVzaChiKTtkPHRoaXMucmFuay0xJiYoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksYi50ZXh0Q29udGVudD0iLCIsdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKGIpLHRoaXMuY29tbWFzLnB1c2goYikpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpO2Iuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKGIpO3RoaXMuZHJvcGRvd25zLnB1c2goYil9dGhpcy5icmFja2V0RGl2c1sxXT0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKCk9Pnt0aGlzLmNsZWFyQWxsRHJvcGRvd25zKCl9KX1yZW5kZXIoYil7bnVsbCE9YiYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7Y29uc3QgZD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZj0+Zi5kaW0pO2I9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGY9PgpmLmluZGV4KTtmb3IobGV0IGY9MDtmPHRoaXMucmFuazsrK2Ype2NvbnN0IGg9dGhpcy5kaW1Db250cm9sc1tmXSxrPXRoaXMuZGltSW5wdXRzW2ZdLHI9dGhpcy5kcm9wZG93bnNbZl07aWYoIm5vbmUiIT09ay5zdHlsZS5kaXNwbGF5KWNvbnRpbnVlO2NvbnN0IGw9dGhpcy5zaGFwZVtmXTtpZigtMSE9PWQuaW5kZXhPZihmKSl7Y29uc3QgcD1iW2QuaW5kZXhPZihmKV07aC50ZXh0Q29udGVudD1TdHJpbmcocCk7ay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO2sudHlwZT0ibnVtYmVyIjtrLm1pbj0iMCI7ay5tYXg9U3RyaW5nKGwtMSk7ay52YWx1ZT1TdHJpbmcocCk7dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbZl18fChoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2suc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLGsuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwKKCk9PntpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiU2xpY2luZyBjb250cm9sIGNoYW5nZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc3BlYy4iKTtjb25zdCBtPXBhcnNlSW50KGsudmFsdWUsMTApOyFpc0Zpbml0ZShtKXx8MD5tfHxtPj1sfHxNYXRoLmZsb29yKGwpIT1sP2sudmFsdWU9U3RyaW5nKHRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW2QuaW5kZXhPZihmKV0uaW5kZXgpOih0aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tkLmluZGV4T2YoZildLmluZGV4PW0saC50ZXh0Q29udGVudD1TdHJpbmcobSksdGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlKHRoaXMuc2xpY2luZ1NwZWMpKX0pLGsuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsKCk9PntrLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2guc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLHRoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2ZdPQohMCl9ZWxzZXtpZih0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdPT09Zil7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtoLnRleHRDb250ZW50PWBcdTIxOTUgJHt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF19OmArYCR7dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdfWB9ZWxzZXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtoLnRleHRDb250ZW50PWBcdTIxOTQgJHt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXX06YCtgJHt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXX1gfWguY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTt0aGlzLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtmXXx8KGguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAooKT0+e2NvbnN0IHA9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKHIscC5ib3R0b20scC5sZWZ0LGYpfSksdGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbZl09ITApfX19cmVuZGVyRHJvcGRvd25NZW51SXRlbXMoYixkLGYsaCl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtjb25zdCBrPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChyPT5yLmRpbSk7Zm9yKGxldCByPTA7cjx0aGlzLnJhbms7KytyKXtpZigtMT09PWsuaW5kZXhPZihyKSljb250aW51ZTtpZihoPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSYmcjw9dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXXx8Cmg9PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0mJnI+PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pY29udGludWU7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2wudGV4dENvbnRlbnQ9YFN3YXAgd2l0aCBkaW1lbnNpb24gJHtyfWA7Yi5hcHBlbmRDaGlsZChsKTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT57bC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIik7dGhpcy5kaW1Db250cm9sc1tyXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoKT0+e2wuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpOwp0aGlzLmRpbUNvbnRyb2xzW3JdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTtjb25zdCBwPXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1oO2wuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIkRpbWVuc2lvbiBzd2FwcGluZyBmYWlsZWQgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjIik7Y29uc3QgbT1rLmluZGV4T2Yocik7dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1twPzA6MV09cjt0aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1ttXT17ZGltOmgsaW5kZXg6MH07dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9bnVsbDtpZih0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2UpdGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlKHRoaXMuc2xpY2luZ1NwZWMpfSl9Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwKKCk9PntiLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoYi5maXJzdENoaWxkKXtiLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi5zdHlsZS50b3A9YCR7ZH1weGA7Yi5zdHlsZS5sZWZ0PWAke2Z9cHhgO2Iuc3R5bGUuZGlzcGxheT0iYmxvY2siO2NvbnN0IHI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXIubGVmdC1mO2Iuc3R5bGUudG9wPShkLShyLnRvcC1kKSkudG9GaXhlZCgxKSsicHgiO2Iuc3R5bGUubGVmdD0oZi1sKS50b0ZpeGVkKDEpKyJweCJ9fXNldFNsaWNpbmdTcGVjKGIpe3RoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiKSk7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIkNhbm5vdCBzZXQgc2xpY2luZyBzcGVjIHRvIG51bGwuIik7dGhpcy5yZW5kZXIodGhpcy5zbGljaW5nU3BlYyl9Y2xlYXJBbGxEcm9wZG93bnMoKXt0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGI9PntpZihudWxsIT1iKXtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpOwpiLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfX1mdW5jdGlvbiBRayhiKXtyZXR1cm4gMjA+PWIubGVuZ3RoP2I6Yi5zbGljZSgwLDEwKSsiLi4uIitiLnNsaWNlKGIubGVuZ3RoLTcsYi5sZW5ndGgpfWZ1bmN0aW9uIFJrKGIsZCl7aWYoaXNOYU4oYikpcmV0dXJuIk5hTiI7aWYoLUluZmluaXR5PT09YilyZXR1cm4iLVx1MjIxZSI7aWYoSW5maW5pdHk9PT1iKXJldHVybiIrXHUyMjFlIjtpZihudWxsPT1mKXt2YXIgZj1NYXRoLmFicyhiKTtmPTFFMz5mJiYuMDE8PWZ8fDA9PT1mPyJmaXhlZCI6ImV4cG9uZW50aWFsIn1yZXR1cm4gbnVsbD09Znx8ImZpeGVkIj09PWY/ZD9gJHtifWA6Yi50b0ZpeGVkKDIpOmIudG9FeHBvbmVudGlhbCgyKX1mdW5jdGlvbiBTayhiLGQ9ITApe3JldHVybiBiP2Q/IlQiOiJUcnVlIjpkPyJGIjoiRmFsc2UifWZ1bmN0aW9uIFRrKGIsZD00KXtyZXR1cm4gbnVsbD09PWR8fGIubGVuZ3RoPD1kP2I6Yi5zbGljZSgwLGQtMSkrIlx1MjAyNiJ9CmNsYXNzIFVre2NvbnN0cnVjdG9yKGIpe3RoaXMuY29uZmlnPWI7aWYoIWlzRmluaXRlKGIubWluKSl0aHJvdyBFcnJvcihgbWluIHZhbHVlICgke2IubWlufSkgaXMgbm90IGZpbml0ZWApO2lmKCFpc0Zpbml0ZShiLm1heCkpdGhyb3cgRXJyb3IoYG1heCB2YWx1ZSAoJHtiLm1heH0pIGlzIG5vdCBmaW5pdGVgKTtpZihiLm1heDxiLm1pbil0aHJvdyBFcnJvcihgbWF4ICgke2IubWF4fSkgaXMgPCBtaW4gKCR7Yi5taW59KWApO31yZW5kZXIoYixkKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBmPWIuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1mKXt2YXIgaD1iLndpZHRoLzEwMCxrPWIuaGVpZ2h0LHI9LjYqaztmb3IobGV0IGw9MDsxMDA+bDsrK2wpe2NvbnN0IHA9aCpsLG09LjIqayxbbixxLHVdPXRoaXMuZ2V0UkdCKGwvMTAwKih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKSt0aGlzLmNvbmZpZy5taW4pO2YuYmVnaW5QYXRoKCk7Zi5maWxsU3R5bGU9CmByZ2JhKCR7bn0sICR7cX0sICR7dX0sIDEpYDtmLmZpbGxSZWN0KHAsbSxoLHIpO2Yuc3Ryb2tlKCl9bnVsbCE9ZCYmZD49dGhpcy5jb25maWcubWluJiZkPD10aGlzLmNvbmZpZy5tYXgmJihiPShkLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pKmIud2lkdGgsZi5iZWdpblBhdGgoKSxmLmZpbGxTdHlsZT0icmdiYSgwLCAwLCAwLCAxKSIsZi5tb3ZlVG8oYiwuMiprKSxmLmxpbmVUbyhiLTQsMCksZi5saW5lVG8oYis0LDApLGYuZmlsbCgpLGYuYmVnaW5QYXRoKCksZi5tb3ZlVG8oYiwuOCprKSxmLmxpbmVUbyhiLTQsayksZi5saW5lVG8oYis0LGspLGYuZmlsbCgpKX19fX0KY2xhc3MgVmsgZXh0ZW5kcyBVa3tnZXRSR0IoYil7aWYoaXNOYU4oYikpcmV0dXJuWzI1NSwwLDBdO2lmKCFpc0Zpbml0ZShiKSlyZXR1cm4gMDxiP1swLDAsMjU1XTpbMjU1LDEyNy41LDBdO2I9dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihiLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pO2I9TWF0aC5tYXgoTWF0aC5taW4oYiwxKSwwKTtyZXR1cm5bMjU1KmIsMjU1KmIsMjU1KmJdfX0KY2xhc3MgV2sgZXh0ZW5kcyBVa3tnZXRSR0IoYil7aWYoaXNOYU4oYikpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoYikpcmV0dXJuIDA+Yj9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07bGV0IGQ9MCxmPTAsaD0wO2I9dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihiLXRoaXMuY29uZmlnLm1pbikvKHRoaXMuY29uZmlnLm1heC10aGlzLmNvbmZpZy5taW4pO2I9TWF0aC5tYXgoTWF0aC5taW4oYiwxKSwwKTsuMzU+PWI/KGY9Yi8uMzUsaD0xKTouMzU8YiYmLjY1Pj1iPyhkPShiLS4zNSkvKC42NS0uMzUpLGY9MSxoPSguNjUtYikvKC42NS0uMzUpKTouNjU8YiYmKGQ9MSxmPSgxLWIpLy4zNSk7cmV0dXJuWzI1NSpkLDI1NSpmLDI1NSpoXX19CkpoPWZ1bmN0aW9uKGIsZCxmLGgpe2Z1bmN0aW9uIGsocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBmP3I6bmV3IGYoZnVuY3Rpb24obCl7bChyKX0pfXJldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihyLGwpe2Z1bmN0aW9uIHAocSl7dHJ5e24oaC5uZXh0KHEpKX1jYXRjaCh1KXtsKHUpfX1mdW5jdGlvbiBtKHEpe3RyeXtuKGhbInRocm93Il0ocSkpfWNhdGNoKHUpe2wodSl9fWZ1bmN0aW9uIG4ocSl7cS5kb25lP3IocS52YWx1ZSk6ayhxLnZhbHVlKS50aGVuKHAsbSl9bigoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9O3ZhciBYazsoZnVuY3Rpb24oYil7YltiLlRFWFQ9MV09IlRFWFQiO2JbYi5JTUFHRT0yXT0iSU1BR0UifSkoWGt8fChYaz17fSkpO2NvbnN0IFlrPXtHcmF5c2NhbGU6VmssSmV0OldrfTsKY2xhc3MgWmt7Y29uc3RydWN0b3IoYixkLGYpe3RoaXMucm9vdEVsZW1lbnQ9Yjt0aGlzLnRlbnNvclZpZXc9ZDt0aGlzLmJhc2VSdWxlclRpY2s9dGhpcy50b3BSdWxlcj10aGlzLnZhbHVlU2VjdGlvbj10aGlzLnNsaWNpbmdTcGVjUm9vdD10aGlzLm1lbnVUaHVtYj10aGlzLmluZm9TdWJzZWN0aW9uPXRoaXMuaGVhZGVyU2VjdGlvbj1udWxsO3RoaXMudG9wUnVsZXJUaWNrcz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdO3RoaXMudmFsdWVSb3dzPVtdO3RoaXMudmFsdWVEaXZzPVtdO3RoaXMuc2xpY2luZ0NvbnRyb2w9dGhpcy52YWx1ZVRvb2x0aXA9bnVsbDt0aGlzLmNvbHNDdXRvZmY9dGhpcy5yb3dzQ3V0b2ZmPSExO3RoaXMubWVudT10aGlzLm1lbnVDb25maWc9dGhpcy5zZWxlY3Rpb249bnVsbDt0aGlzLmNvbG9yTWFwTmFtZT0iR3JheXNjYWxlIjt0aGlzLmNvbG9yTWFwPW51bGw7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITE7dGhpcy5pbWFnZUNlbGxTaXplPTE2O3RoaXMubWluSW1hZ2VDZWxsU2l6ZT0KNDt0aGlzLm1heEltYWdlQ2VsbFNpemU9NDA7dGhpcy56b29tU3RlcFJhdGlvPTEuMjt0aGlzLm51bWVyaWNTdW1tYXJ5PW51bGw7dGhpcy5vcHRpb25zPWZ8fHt9O3RoaXMuc2xpY2luZ1NwZWM9ZGoodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7dGhpcy52YWx1ZVJlbmRlck1vZGU9WGsuVEVYVH1yZW5kZXIoKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3RoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fE1oKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8WWkodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxaaSh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpKXRocm93IEVycm9yKGBSZW5kZXJpbmcgZHR5cGUgJHt0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZX0gaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7CnlpZWxkIHRoaXMucmVuZGVyVmFsdWVzKCl9KX1yZW5kZXJIZWFkZXIoKXtudWxsPT10aGlzLmhlYWRlclNlY3Rpb24mJih0aGlzLmhlYWRlclNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5oZWFkZXJTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtaGVhZGVyIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMuY3JlYXRlTWVudSgpKTt0aGlzLnJlbmRlckluZm8oKX1yZW5kZXJJbmZvKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9cmVuZGVyTmFtZSgpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgbmFtZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO2lmKG51bGwhPXRoaXMub3B0aW9ucy5uYW1lJiYwIT09dGhpcy5vcHRpb25zLm5hbWUubGVuZ3RoKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdGVuc29yLW5hbWUiKTtiLnRleHRDb250ZW50PVFrKHRoaXMub3B0aW9ucy5uYW1lKTsKYi50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKGIpfX1yZW5kZXJEVHlwZSgpe2lmKG51bGw9PXRoaXMuaW5mb1N1YnNlY3Rpb24pdGhyb3cgRXJyb3IoIlJlbmRlcmluZyB0ZW5zb3IgZHR5cGUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtjb25zdCBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZSIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtkLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwiKTtkLnRleHRDb250ZW50PSJkdHlwZToiO2IuYXBwZW5kQ2hpbGQoZCk7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ZC50ZXh0Q29udGVudD10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTtiLmFwcGVuZENoaWxkKGQpO3RoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoYil9cmVuZGVyU2hhcGUoKXtpZihudWxsPT0KdGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlIik7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIik7ZC50ZXh0Q29udGVudD0ic2hhcGU6IjtiLmFwcGVuZENoaWxkKGQpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIik7ZC50ZXh0Q29udGVudD1jaih0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Yi5hcHBlbmRDaGlsZChkKTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKGIpfWNyZWF0ZU1lbnUoKXt0aGlzLm1lbnVDb25maWc9e2l0ZW1zOltdfTsKaWYoTWgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fFlpKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpiPT57MD09PWI/KHRoaXMudmFsdWVSZW5kZXJNb2RlPVhrLlRFWFQsdGhpcy5yZW5kZXJWYWx1ZXMoKSk6KHRoaXMudmFsdWVSZW5kZXJNb2RlPVhrLklNQUdFLHRoaXMudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZD0+e3RoaXMubnVtZXJpY1N1bW1hcnk9ZDt0aGlzLnJlbmRlclZhbHVlcygpfSkpfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJTZWxlY3QgY29sb3IgbWFwLi4uIixvcHRpb25zOk9iamVjdC5rZXlzKFlrKSxkZWZhdWx0U2VsZWN0aW9uOjAsY2FsbGJhY2s6Yj0+Cnt0aGlzLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhZaylbYl07dGhpcy5yZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOigpPT50aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFfSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246Ilpvb20gaW4gKEltYWdlIG1vZGUpIixjYWxsYmFjazooKT0+e3RoaXMuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6KCk9PnRoaXMudmFsdWVSZW5kZXJNb2RlPT09WGsuSU1BR0V9KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazooKT0+e3RoaXMuem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOigpPT50aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFfSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyBhaih0aGlzLm1lbnVDb25maWcsCnRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5yZW5kZXJNZW51VGh1bWIoKSl9em9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpe3RoaXMuaW1hZ2VDZWxsU2l6ZSp0aGlzLnpvb21TdGVwUmF0aW88PXRoaXMubWF4SW1hZ2VDZWxsU2l6ZSYmKHRoaXMuaW1hZ2VDZWxsU2l6ZSo9dGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfXpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9cmVuZGVyTWVudVRodW1iKCl7aWYobnVsbD09dGhpcy5oZWFkZXJTZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgbWVudSB0aHVtYiBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaGVhZGVyIHNlY3Rpb24uIik7dGhpcy5tZW51VGh1bWI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57aWYobnVsbCE9PXRoaXMubWVudSlpZih0aGlzLm1lbnUuc2hvd24oKSl0aGlzLm1lbnUuaGlkZSgpO2Vsc2V7Y29uc3QgYj10aGlzLm1lbnVUaHVtYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLm1lbnUuc2hvdyhiLmJvdHRvbSxiLmxlZnQpfX0pfXJlbmRlclZhbHVlcygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Mjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLAp0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2xpY2luZ1NwZWNSb290KSk7bnVsbD09dGhpcy52YWx1ZVNlY3Rpb24mJih0aGlzLnZhbHVlU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXNlY3Rpb24iKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVTZWN0aW9uKSx0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYj0+SmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBkPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/ZD1iLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P2Q9Yi5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihkPWIuc2hpZnRLZXkpOwpkJiZ0aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFPyhiLnN0b3BQcm9wYWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKSwwPGIuZGVsdGFZP3RoaXMuem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKTp0aGlzLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKSk6bnVsbCE9dGhpcy5zZWxlY3Rpb24mJihiLnN0b3BQcm9wYWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKSx0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKSx5aWVsZCB0aGlzLnNjcm9sbFVwT3JEb3duKDA8Yi5kZWx0YVk/ZmouRE9XTjpmai5VUCkpfSkpLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYj0+e3ZhciBkPVszOCw0MCwzNywzOV07aWYobnVsbCE9dGhpcy5zZWxlY3Rpb24mJi0xIT09ZC5pbmRleE9mKGIua2V5Q29kZSkpe2Iuc3RvcFByb3BhZ2F0aW9uKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpOwpsZXQgZj1kPW51bGw7Mzg9PT1iLmtleUNvZGU/Zj1mai5VUDo0MD09PWIua2V5Q29kZT9mPWZqLkRPV046Mzc9PT1iLmtleUNvZGU/Zj1mai5MRUZUOjM5PT09Yi5rZXlDb2RlJiYoZj1mai5SSUdIVCk7bnVsbCE9PWYmJihkPXRoaXMuc2VsZWN0aW9uLm1vdmUoZix0aGlzLnNsaWNpbmdTcGVjKSk7bnVsbD09PWQ/dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTpkPT09ZmouVVB8fGQ9PT1mai5ET1dOP3RoaXMuc2Nyb2xsVXBPckRvd24oZCk6KGQ9PT1mai5MRUZUfHxkPT09ZmouUklHSFQpJiZ0aGlzLnNjcm9sbExlZnRPclJpZ2h0KGQpfX0pKTt0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCk7dGhpcy5jcmVhdGVUb3BSdWxlcigpO3RoaXMuY3JlYXRlTGVmdFJ1bGVyKCk7dGhpcy5jcmVhdGVWYWx1ZURpdnMoKTt5aWVsZCB0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpOzI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgaGoodGhpcy5zbGljaW5nU3BlY1Jvb3QsdGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUsCmI9PkpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtlaih0aGlzLnNsaWNpbmdTcGVjLGIpPyh0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYikpLHlpZWxkIHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCkpOih0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYikpLHlpZWxkIHRoaXMucmVuZGVyKCkpfSkpLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKX0pfWNsZWFyVmFsdWVTZWN0aW9uKCl7aWYobnVsbCE9PXRoaXMudmFsdWVTZWN0aW9uKXtmb3IoO3RoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQ7KXRoaXMudmFsdWVTZWN0aW9uLnJlbW92ZUNoaWxkKHRoaXMudmFsdWVTZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMudG9wUnVsZXI9bnVsbDt0aGlzLnZhbHVlUm93cz1bXX19Y3JlYXRlVG9wUnVsZXIoKXtpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7Cm51bGw9PXRoaXMudG9wUnVsZXImJih0aGlzLnRvcFJ1bGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudG9wUnVsZXIuY2xhc3NMaXN0LmFkZCgidGVuZXNvci13aWRnZXQtdG9wLXJ1bGVyIiksdGhpcy50b3BSdWxlci5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAiLHRoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMudG9wUnVsZXIpLHRoaXMudG9wUnVsZXJUaWNrcz1bXSx0aGlzLnRvcFJ1bGVyLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixmPT5KaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bnVsbCE9dGhpcy5zZWxlY3Rpb24mJihmLnN0b3BQcm9wYWdhdGlvbigpLGYucHJldmVudERlZmF1bHQoKSx0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKSx5aWVsZCB0aGlzLnNjcm9sbExlZnRPclJpZ2h0KDA8Zi5kZWx0YVk/ZmouUklHSFQ6ZmouTEVGVCkpfSkpKTtmb3IoO3RoaXMudG9wUnVsZXIuZmlyc3RDaGlsZDspdGhpcy50b3BSdWxlci5yZW1vdmVDaGlsZCh0aGlzLnRvcFJ1bGVyLmZpcnN0Q2hpbGQpOwp0aGlzLmJhc2VSdWxlclRpY2s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5iYXNlUnVsZXJUaWNrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTt0aGlzLnRvcFJ1bGVyLmFwcGVuZENoaWxkKHRoaXMuYmFzZVJ1bGVyVGljayk7Mjw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9WzAsbnVsbF0pO2xldCBiO2I9MT49dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07Y29uc3QgZD10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O3RoaXMuY29sc0N1dG9mZj0hMTtmb3IobGV0IGY9MDtmPGI7KytmKXtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpO3RoaXMudmFsdWVSZW5kZXJNb2RlPT09ClhrLklNQUdFJiYoaC5zdHlsZS53aWR0aD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgKTt0aGlzLnRvcFJ1bGVyLmFwcGVuZENoaWxkKGgpO3RoaXMudG9wUnVsZXJUaWNrcy5wdXNoKGgpO2lmKGguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ+PWQpe2lmKDI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKGBNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPWYrMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKGBNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPQpifX1jcmVhdGVMZWZ0UnVsZXIoKXtpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgbGVmdCBydWxlciBkdWUgdG8gbWlzc2luZyB2YWx1ZSBzZWN0aW9uLiIpO3RoaXMudmFsdWVSb3dzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107MTw9dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPVswLG51bGxdKTtsZXQgYjtiPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Y29uc3QgZD10aGlzLnJvb3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtmb3IobGV0IGY9MDtmPGI7KytmKXtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1yb3ciKTt0aGlzLnZhbHVlUmVuZGVyTW9kZT09PQpYay5JTUFHRSYmKGguc3R5bGUuaGVpZ2h0PWAke3RoaXMuaW1hZ2VDZWxsU2l6ZX1weGAsaC5zdHlsZS5saW5lSGVpZ2h0PWAke3RoaXMuaW1hZ2VDZWxsU2l6ZX1weGApO3RoaXMudmFsdWVTZWN0aW9uLmFwcGVuZENoaWxkKGgpO3RoaXMudmFsdWVSb3dzLnB1c2goaCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2siKTt0aGlzLnZhbHVlUmVuZGVyTW9kZT09PVhrLklNQUdFJiYoay5zdHlsZS5oZWlnaHQ9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCxrLnN0eWxlLmxpbmVIZWlnaHQ9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCk7aC5hcHBlbmRDaGlsZChrKTt0aGlzLmxlZnRSdWxlclRpY2tzLnB1c2goayk7aWYoay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20+PWQpe2lmKDE8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7CnRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1mKzE7dGhpcy5yb3dzQ3V0b2ZmPSEwfWJyZWFrfX1pZighdGhpcy5yb3dzQ3V0b2ZmJiYxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1ifX1jcmVhdGVWYWx1ZURpdnMoKXtpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2NvbnN0IGI9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxkPXRoaXMudmFsdWVSb3dzLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7KytmKXt0aGlzLnZhbHVlRGl2c1tmXT1bXTtmb3IobGV0IGg9MDtoPGI7KytoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwprLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1Yay5JTUFHRSYmKGsuc3R5bGUud2lkdGg9YCR7dGhpcy5pbWFnZUNlbGxTaXplfXB4YCxrLnN0eWxlLmhlaWdodD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgLGsuc3R5bGUubGluZUhlaWdodD1gJHt0aGlzLmltYWdlQ2VsbFNpemV9cHhgKTt0aGlzLnZhbHVlUm93c1tmXS5hcHBlbmRDaGlsZChrKTt0aGlzLnZhbHVlRGl2c1tmXS5wdXNoKGspO2suYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5zZWxlY3Rpb249bmV3IGdqKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlLHRoaXMuc2xpY2luZ1NwZWMsbnVsbD09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlfHxudWxsPT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0/MDp0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rZixudWxsPT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8Cm51bGw9PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPzA6dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0raCwxLDEpO3RoaXMucmVuZGVyU2VsZWN0aW9uKCl9KTtrLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLCgpPT57Y29uc3Qgcj1rLmdldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiKTtpZihudWxsIT09cil7dmFyIGw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwPWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbT1wLmJvdHRvbS1wLnRvcCxuPXAucmlnaHQtcC5sZWZ0LHE9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKGYsaCk7dGhpcy5kcmF3VmFsdWVUb29sdGlwKHEscixwLnRvcC1sLnRvcCsuOCptLHAubGVmdC1sLmxlZnQrLjc1Km4pfX0pO2suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKCk9Pnt0aGlzLmhpZGVWYWx1ZVRvb2x0aXAoKX0pfX19cmVuZGVyVG9wUnVsZXIoKXtpZigyPD10aGlzLnJhbmspe2NvbnN0IGI9CnRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO2ZvcihsZXQgZD0wO2Q8dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK2Qpe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAke3RoaXMucmFua31EIHRlbnNvci5gKTtjb25zdCBmPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK2Q7dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbZF0udGV4dENvbnRlbnQ9ZjxiP2Ake2Z9YDoiIil9fX1yZW5kZXJMZWZ0UnVsZXIoKXtpZigxPD10aGlzLnJhbmspe2NvbnN0IGI9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07Zm9yKGxldCBkPTA7ZDx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK2Qpe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApOwpjb25zdCBmPXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStkO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy5sZWZ0UnVsZXJUaWNrc1tkXS50ZXh0Q29udGVudD1mPGI/YCR7Zn1gOiIiKX19fXJlbmRlclZhbHVlRGl2cygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Y29uc3QgYj10aGlzLnZhbHVlRGl2cy5sZW5ndGgsZD10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGg7bGV0IGY9eWllbGQgdGhpcy50ZW5zb3JWaWV3LnZpZXcodGhpcy5zbGljaW5nU3BlYyk7MD09PXRoaXMucmFuaz9mPVtbZl1dOjE9PT10aGlzLnJhbmsmJihmPWYubWFwKHA9PltwXSkpO2NvbnN0IGg9dGhpcy5nZXRWYWx1ZUNsYXNzKCksaz10aGlzLnZhbHVlUmVuZGVyTW9kZTtpZihrPT09WGsuSU1BR0Upe2lmKG51bGw9PXRoaXMubnVtZXJpY1N1bW1hcnkpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG51bWVyaWMgc3VtbWFyeSIpOwp2YXIgcj10aGlzLm51bWVyaWNTdW1tYXJ5Lm1pbmltdW0sbD10aGlzLm51bWVyaWNTdW1tYXJ5Lm1heGltdW07aWYobnVsbD09cnx8bnVsbD09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHJlbmRlciBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0ZW5zb3IgZHVlIHRvIG1pc3NpbmcgbWluaW11bSBvciBtYXhpbXVtIHZhbHVlcyBpbiBudW1lcmljIHN1bW1hcnkiKTtyPXttaW46cixtYXg6bH07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBZaz9uZXcgWWtbdGhpcy5jb2xvck1hcE5hbWVdKHIpOm5ldyBWayhyKX1mb3Iocj0wO3I8YjsrK3IpZm9yKGw9MDtsPGQ7KytsKXtjb25zdCBwPXRoaXMudmFsdWVEaXZzW3JdW2xdO2lmKHI8Zi5sZW5ndGgmJmw8ZltyXS5sZW5ndGgpe2NvbnN0IG09ZltyXVtsXTtpZihrPT09WGsuSU1BR0Upe2NvbnN0IFtuLHEsdV09dGhpcy5jb2xvck1hcC5nZXRSR0IobSk7cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YHJnYigke259LCAke3F9LCAke3V9KWB9ZWxzZSJudW1lcmljIj09PQpoP3AudGV4dENvbnRlbnQ9UmsobSxMaCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PWg/cC50ZXh0Q29udGVudD1TayhtKToic3RyaW5nIj09PWgmJihwLnRleHRDb250ZW50PVRrKG0pKTtwLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcobSkpfWVsc2UgcC50ZXh0Q29udGVudD0iIixwLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKX10aGlzLnJlbmRlclNlbGVjdGlvbigpfSl9Z2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoYil7cmV0dXJuImJvb2xlYW4iPT09dGhpcy5nZXRWYWx1ZUNsYXNzKCk/U2soYiwhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT9gTGVuZ3RoLSR7Yi5sZW5ndGh9IHN0cmluZzogIiR7VGsoYiw1MDApfSJgOlN0cmluZyhiKX1yZW5kZXJTZWxlY3Rpb24oKXtpZihudWxsIT10aGlzLnNlbGVjdGlvbil7dmFyIGI9dGhpcy52YWx1ZURpdnMubGVuZ3RoLApkPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aDtmb3IobGV0IGg9MDtoPGI7KytoKWZvcihsZXQgaz0wO2s8ZDsrK2spe2NvbnN0IHI9dGhpcy52YWx1ZURpdnNbaF1ba107ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtyLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKTt2YXIgZj10aGlzLmNhbGN1bGF0ZUluZGljZXMoaCxrKTtmPXRoaXMuc2VsZWN0aW9uLmdldEVsZW1lbnRTdGF0dXMoZik7bnVsbCE9PWYmJihyLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpLApmLnRvcEVkZ2UmJnIuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLGYuYm90dG9tRWRnZSYmci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksZi5sZWZ0RWRnZSYmci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLGYucmlnaHRFZGdlJiZyLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19fWNhbGN1bGF0ZUluZGljZXMoYixkKXtjb25zdCBmPVtdLGg9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKHI9PnIuZGltKSxrPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChyPT5yLmluZGV4KTtmb3IobGV0IHI9MDtyPHRoaXMucmFuazsrK3IpaWYoLTEhPT1oLmluZGV4T2Yocikpe2NvbnN0IGw9a1toLmluZGV4T2YocildOwppZihudWxsPT09bCl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzOiAiK2BVbmRldGVybWluZWQgaW5kZXggYXQgZGltZW5zaW9uICR7cn1gKTtmLnB1c2gobCl9ZWxzZSBpZihyPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO2YucHVzaCh0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rYil9ZWxzZSBpZihyPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlfHxudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKZi5wdXNoKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK2QpfXJldHVybiBmfWRyYXdWYWx1ZVRvb2x0aXAoYixkLGYsaCl7bnVsbD09PXRoaXMudmFsdWVUb29sdGlwJiYodGhpcy52YWx1ZVRvb2x0aXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy52YWx1ZVRvb2x0aXAuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIiksdGhpcy5yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZhbHVlVG9vbHRpcCkpO2Zvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIik7ay50ZXh0Q29udGVudD1gSW5kaWNlczogJHtKU09OLnN0cmluZ2lmeShiKX1gOwp0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChrKTtiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2IuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIik7Yi50ZXh0Q29udGVudD1kO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKGIpO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLnRvcD1gJHtmfXB4YDt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS5sZWZ0PWAke2h9cHhgO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLnZhbHVlUmVuZGVyTW9kZT09WGsuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLGYuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoZiksdGhpcy5jb2xvck1hcC5yZW5kZXIoZixwYXJzZUZsb2F0KGQpKSl9aGlkZVZhbHVlVG9vbHRpcCgpe251bGwhPQp0aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnMoKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe251bGwhPXRoaXMuc2xpY2luZ0NvbnRyb2wmJnRoaXMuc2xpY2luZ0NvbnRyb2wuc2V0U2xpY2luZ1NwZWModGhpcy5zbGljaW5nU3BlYyk7dGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpO3RoaXMucmVuZGVyVG9wUnVsZXIoKTt0aGlzLnJlbmRlckxlZnRSdWxlcigpO3lpZWxkIHRoaXMucmVuZGVyVmFsdWVEaXZzKCl9KX1jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpe2lmKDI8PXRoaXMucmFuayl7dmFyIGI9dGhpcy50b3BSdWxlclRpY2tzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuc2hvd0luZGljZXNPblRpY2tzPWIucmlnaHQtYi5sZWZ0PjkqTWF0aC5jZWlsKE1hdGgubG9nKHRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dKS8KTWF0aC5MTjEwKX1lbHNlIDE9PT10aGlzLnJhbms/KGI9dGhpcy5sZWZ0UnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0xNjxiLmJvdHRvbS1iLnRvcCk6dGhpcy5zaG93SW5kaWNlc09uVGlja3M9ITF9c2Nyb2xsSG9yaXpvbnRhbGx5KGIpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoISgxPj10aGlzLnJhbmspKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7dmFyIGQ9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07aWYoMD5ifHxiPj1kKXRocm93IEVycm9yKGBJbmRleCBvdXQgb2YgYm91bmQ6ICR7Yn0gaXMgb3V0c2lkZSBbMCwgJHtkfV0pYCk7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF09CmI7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09Yit0aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoO2Q9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV0+ZCYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPWQpO3lpZWxkIHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCl9fSl9c2Nyb2xsVmVydGljYWxseShiKXtyZXR1cm4gSmgodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2lmKDAhPT10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoYE1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICR7dGhpcy5yYW5rfUQgdGVuc29yLmApO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpOwp2YXIgZD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTtpZigwPmJ8fGI+PWQpdGhyb3cgRXJyb3IoYEluZGV4IG91dCBvZiBib3VuZDogJHtifSBpcyBvdXRzaWRlIFswLCAke2R9XSlgKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Yjt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Yit0aGlzLnZhbHVlUm93cy5sZW5ndGg7ZD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+ZCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1kKTt5aWVsZCB0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpfX0pfXNjcm9sbFVwT3JEb3duKGIpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7aWYoMCE9PXRoaXMucmFuayYmdGhpcy5yb3dzQ3V0b2ZmKXtpZihudWxsPT09CnRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcihgTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgJHt0aGlzLnJhbmt9RCB0ZW5zb3IuYCk7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7dmFyIGQ9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2I9PT1mai5ET1dOP2Q8dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0tKHRoaXMudmFsdWVSb3dzLmxlbmd0aC0xKSYmKHlpZWxkIHRoaXMuc2Nyb2xsVmVydGljYWxseShkKzEpKTowPD1kLTEmJih5aWVsZCB0aGlzLnNjcm9sbFZlcnRpY2FsbHkoZC0xKSl9fSl9c2Nyb2xsTGVmdE9yUmlnaHQoYil7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtpZighKDE+PXRoaXMucmFuaykmJnRoaXMuY29sc0N1dG9mZil7aWYobnVsbD09PQp0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiSG9yaXpvbnRhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7dmFyIGQ9dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF07Yj09PWZqLlJJR0hUP2Q8dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tKHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGgtMSkmJih5aWVsZCB0aGlzLnNjcm9sbEhvcml6b250YWxseShkKzEpKTowPD1kLTEmJih5aWVsZCB0aGlzLnNjcm9sbEhvcml6b250YWxseShkLTEpKX19KX1uYXZpZ2F0ZVRvSW5kaWNlcygpe3JldHVybiBKaCh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTt9KX1nZXRWYWx1ZUNsYXNzKCl7Y29uc3QgYj10aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZTsKcmV0dXJuIExoKGIpfHxNaChiKT8ibnVtZXJpYyI6WWkoYik/ImJvb2xlYW4iOiJzdHJpbmcifX12YXIgJGs9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdGVuc29yV2lkZ2V0OmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gbmV3IFprKGIsZCxmKX0sVkVSU0lPTjoiMC4wLjAifSk7d2luZG93LnRlbnNvcl93aWRnZXQ9JGs7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnViYXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToibWVudWJhciJ9LGtleUJpbmRpbmdzOntsZWZ0OiJfb25MZWZ0S2V5IixyaWdodDoiX29uUmlnaHRLZXkifSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGdldCBfaXNSVEwoKXtyZXR1cm4icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbn0sX29uTGVmdEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9mb2N1c05leHQoKTp0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25SaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD8KdGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoYil9fTtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3I9W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlci5qcwpKaD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGsscil7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7cihxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9OwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3Rpb246T2JqZWN0LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxoaWVyYXJjaHlQYXJhbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5iLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zfSxvdXRHcmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRHcmFwaDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRTdGF0czp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSwKX2dyYXBoUnVuVGFnOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIiwiX3NlbGVjdGVkRmlsZUNoYW5nZWQoc2VsZWN0ZWRGaWxlLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX3NlbGVjdGlvbkNoYW5nZWQoKXt0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgpPT57dGhpcy5fbG9hZCh0aGlzLnNlbGVjdGlvbil9KX0sX2xvYWQ6ZnVuY3Rpb24oZil7Y29uc3QgaD1mLnJ1bixrPWYudGFnO2Y9Zi50eXBlO3N3aXRjaChmKXtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOnRoaXMuX3NldE91dFN0YXRzKG51bGwpO3ZhciByPW5ldyBVUkxTZWFyY2hQYXJhbXM7ci5zZXQoInJ1biIsaCk7ci5zZXQoImNvbmNlcHR1YWwiLFN0cmluZyhmPT09Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEgpKTsKayYmci5zZXQoInRhZyIsayk7Zj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixyKTtyZXR1cm4gdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmKS50aGVuKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjpoLHRhZzprfX0pO2Nhc2UgYi5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6eyh7dGFnczpmfT10aGlzLmRhdGFzZXRzLmZpbmQoKHtuYW1lOm19KT0+bT09PWgpKTtjb25zdCBsPWYuZmluZChtPT5tLnRhZz09PWspLm9wR3JhcGg/azpudWxsO2NvbnNvbGUuYXNzZXJ0KGYuZmluZChtPT5tLnRhZz09PWwpLGBSZXF1aXJlZCB0YWcgKCR7bH0pIGlzIG1pc3NpbmcuYCk7Zj10aGlzLl9ncmFwaFJ1blRhZyYmdGhpcy5fZ3JhcGhSdW5UYWcucnVuPT09aCYmdGhpcy5fZ3JhcGhSdW5UYWcudGFnPT09bD9Qcm9taXNlLnJlc29sdmUoKTp0aGlzLl9sb2FkKHtydW46aCx0YWc6bCx0eXBlOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0pOwpyPW5ldyBVUkxTZWFyY2hQYXJhbXM7ci5zZXQoInRhZyIsayk7ci5zZXQoInJ1biIsaCk7Y29uc3QgcD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL3J1bl9tZXRhZGF0YSIscik7cmV0dXJuIGYudGhlbigoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEocCkpfWRlZmF1bHQ6cmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKGBVbmtub3duIHNlbGVjdGlvbiB0eXBlOiAke2Z9YCkpfX0sX3JlYWRBbmRQYXJzZU1ldGFkYXRhOmZ1bmN0aW9uKGYpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7Yi5ncmFwaC5wYXJzZXIuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhKGYsYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykpLnRoZW4oaD0+e3RoaXMuX3NldE91dFN0YXRzKGgpfSl9LF9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoOmZ1bmN0aW9uKGYsaCl7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt0aGlzLnNldCgicHJvZ3Jlc3MiLAp7dmFsdWU6MCxtc2c6IiJ9KTtyZXR1cm4gYi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChiLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSxmLGgsdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXIsdGhpcy5oaWVyYXJjaHlQYXJhbXMpLnRoZW4oKHtncmFwaDprLGdyYXBoSGllcmFyY2h5OnJ9KT0+e3RoaXMuX3NldE91dEdyYXBoKGspO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KHIpfSl9KX0sX3NlbGVjdGVkRmlsZUNoYW5nZWQ6ZnVuY3Rpb24oZil7aWYoZil7Zj1mLnRhcmdldDt2YXIgaD1mLmZpbGVzWzBdO2gmJihmLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxoKSl9fX0pfSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIGVsOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayxyLGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6cixtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayxyLGw9MzApe3I9PT1rJiYocj0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0oci1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGsscixwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHIsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgdz1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgodyxuKTt3PXkvKEEtdykqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT93OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSxyPWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayxyKX0pKX19KShlbHx8KGVsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEg9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1IJiYoSD0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09SD9COkgrIi4iK0J9ZnVuY3Rpb24gcihCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixIKXtyZXR1cm4gQltIXX1mdW5jdGlvbiBtKEIsSCl7cmV0dXJuIEIuZmluZChLPT5fLmlzRXF1YWwoSy5uYW1lLEgpKX1mdW5jdGlvbiBuKEIsSCxLKXtyZXR1cm4gSC5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tLXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSCxLKXtCPW0oSC5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW0tdLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEgsSyl7cmV0dXJuIEs8Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSCxLKTpxKEIsSCxLLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHcoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixILEspe3JldHVybiBILmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tLXS5uYW1lXX1mdW5jdGlvbiB4KEIsSCxLKXtCPW0oSC5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tLXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSCxLKXtyZXR1cm4gSzxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSCxLKTp4KEIsSCxLLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixIKXtyZXR1cm4gQipCK0gqSH1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gSDxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0hdLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0gtQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz1yO2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gcihCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixILEspe3JldHVybiBkMy5leHRlbnQoSCxMPT51KEIsTCxLKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEgsSyl7aWYoSzxILmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTD0+TC5ocGFyYW1JbmZvLm5hbWU9PT1ILmhwYXJhbUluZm9zW0tdLm5hbWUpO2Vsc2V7Y29uc3QgTD1ILm1ldHJpY0luZm9zW0stSC5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSj0+Si5tZXRyaWNJbmZvLm5hbWU9PT1MKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSCl7cmV0dXJuIEg8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0hdKTprKEIubWV0cmljSW5mb3NbSC1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp3O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB3KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixILEspe3JldHVybiBkMy5leHRlbnQoSCxMPT5DKEIsTCxLKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEgpe3JldHVybiBHKHAoQixIKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEgpe3JldHVybiBHKG0oQixIKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixIKXtyZXR1cm4gQi5maW5kKEs9PksubmFtZT09PUgpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9eDtmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSCxLLEwpe3JldHVybiBNYXRoLnNxcnQoRChCLQpLLEgtTCkpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSCxLLEwsSixPKXtpZihCPEsmJkg8TClyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSCxLLEwpO2lmKEs8PUImJkI8SiYmSDxMKXJldHVybiBMLUg7aWYoSjw9QiYmSDxMKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixILEosTCk7aWYoQjxLJiZMPD1IJiZIPE8pcmV0dXJuIEstQjtpZihLPD1CJiZCPEomJkw8PUgmJkg8TylyZXR1cm4gMDtpZihKPD1CJiZMPD1IJiZIPE8pcmV0dXJuIEItSjtpZihCPEsmJk88PUgpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEgsSyxPKTtpZihLPD1CJiZCPEomJk88PUgpcmV0dXJuIEgtTztpZihKPD1CJiZPPD1IKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixILEosTyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixIKXtyZXR1cm4gdm9pZCAwPT09SD8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitIKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixIKXtsZXQgSz0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1IJiYoSz1LKyIsIitCKyIsIitIKTtyZXR1cm4gSysiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixILEssTCxKLE8pe0IudmlzaXQoKFMsTixSLFgsYWEpPT57aWYodm9pZCAwPT09Uy5sZW5ndGgpe2RvIE49Qi54KCkoUy5kYXRhKSxSPUIueSgpKFMuZGF0YSksSDw9TiYmTjxMJiZLPD1SJiZSPEomJk8oUy5kYXRhKTt3aGlsZShTPVMubmV4dCk7cmV0dXJuITB9cmV0dXJuIE4+PUx8fFg8PUh8fFI+PUp8fGFhPD1LfSl9O2YucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzaz1mdW5jdGlvbihCLEgsSyxMLEope0IudmlzaXQoKE8sUyxOLFIsWCk9PntpZih2b2lkIDA9PT1PLmxlbmd0aCl7ZG8gUz0KQi54KCkoTy5kYXRhKSxOPUIueSgpKE8uZGF0YSksUz1mLmV1Y2xpZGVhbkRpc3QoSCxLLFMsTiksUzw9TCYmSihPLmRhdGEsUyk7d2hpbGUoTz1PLm5leHQpO3JldHVybiEwfXJldHVybiBmLnBvaW50VG9SZWN0YW5nbGVEaXN0KEgsSyxTLE4sUixYKT5MfSl9O2YuZmlsdGVyU2V0PWZ1bmN0aW9uKEIsSCl7Y29uc3QgSz1uZXcgU2V0O0IuZm9yRWFjaChMPT57SChMKSYmSy5hZGQoTCl9KTtyZXR1cm4gS307Zi5zZXRBcnJheU9ic2VydmFibHk9ZnVuY3Rpb24oQixIKXtjb25zdCBLPUIuZ2V0KCJzZXNzaW9uR3JvdXBzIixCKTtBcnJheS5pc0FycmF5KEspP0Iuc3BsaWNlLmFwcGx5KEIsWyJzZXNzaW9uR3JvdXBzIiwwLEsubGVuZ3RoXS5jb25jYXQoSCkpOkIuc2V0KCJzZXNzaW9uR3JvdXBzIixIKX07Zi5oYXNoT2ZTdHJpbmc9ZnVuY3Rpb24oQil7bGV0IEg9MDtmb3IobGV0IEs9MDtLPEIubGVuZ3RoOysrSylIPTMxKkgrQi5jaGFyQ29kZUF0KEspJjQyOTQ5NjcyOTU7cmV0dXJuIEgrCk1hdGgucG93KDIsMzEpfX0pKGQudXRpbHN8fChkLnV0aWxzPXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1jZWxsLWNsaWNrLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yPXtsaXN0ZW5lcnM6e2NsaWNrOiJfb25DbGljayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXI9ZnVuY3Rpb24oYil7Yi50YXJnZXQhPT10aGlzLl9jZWxsQ29udGVudCYmdGhpcy5maXJlKCJjZWxsLWNvbnRlbnQtZm9jdXMiLHtjZWxsOnRoaXN9KX0uYmluZCh0aGlzKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlciwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxfb25DbGljazpmdW5jdGlvbihiKXsidmFhZGluLWdyaWQtc29ydGVyIiE9PXRoaXMubG9jYWxOYW1lJiZ0aGlzLmZpcmUoImNlbGwtZm9jdXMiLHtjZWxsOnRoaXN9KTtpZih0aGlzLl9jZWxsQ2xpY2spe3ZhciBkPVBvbHltZXIuZG9tKGIpLmxvY2FsVGFyZ2V0OwpkLmdldERpc3RyaWJ1dGVkTm9kZXMmJihkPVBvbHltZXIuZG9tKGQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKVswXSk7dmFyIGY9UG9seW1lci5kb20oYikucGF0aDtmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYsMCxmLmluZGV4T2YoZCkrMSk7ZC5jb250YWlucyh0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQucm9vdC5hY3RpdmVFbGVtZW50fHxkb2N1bWVudC5hY3RpdmVFbGVtZW50KXx8Zi5zb21lKHRoaXMuX2lzRm9jdXNhYmxlKXx8dGhpcy5fY2VsbENsaWNrKGIpfX0sX2lzRm9jdXNhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPVBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGU7ZD0tMSE9PUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvckFsbCgiW3RhYmluZGV4XSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgb2JqZWN0LCBpZnJhbWUsIGxhYmVsLCBhW2hyZWZdLCBhcmVhW2hyZWZdIiksYik7cmV0dXJuIWIuZGlzYWJsZWQmJgpkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayxyKXtrLmZvY3VzZWQ9cj09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgcj10aGlzLl9jcmVhdGVSb3coKTtyLnRhcmdldD1mO3IuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7ci5jb2x1bW5zPWRba107aC5wdXNoKHIpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHIpe2suZm9jdXNlZD1yPT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc2VsZWN0aW9uLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNlbGVjdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtc0NoYW5nZWQoc2VsZWN0ZWRJdGVtcy4qKSJdLGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRTZWxlY3Rpb24ifSxfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRTZWxlY3Rpb246ZnVuY3Rpb24oYil7aWYoInNlbGVjdGVkIj09PWIuZGV0YWlsLnByb3Ape3ZhciBkPWIuZGV0YWlsLmluc3QuaXRlbTsodGhpcy5faXNTZWxlY3RlZChkKT90aGlzLmRlc2VsZWN0SXRlbTp0aGlzLnNlbGVjdEl0ZW0pLmJpbmQodGhpcykoZCk7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDoodGhpcy5faXNTZWxlY3RlZChkKT8iU2VsZWN0ZWQiOiJEZXNlbGVjdGVkIikrIiBSb3cgIisKKGIuZGV0YWlsLmluc3QuaW5kZXgrMSkrIiBvZiAiK3RoaXMuc2l6ZX0pO2Iuc3RvcFByb3BhZ2F0aW9uKCl9fSxfaXNTZWxlY3RlZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zJiYtMTx0aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihiKX0sc2VsZWN0SXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpO3RoaXMuX2lzU2VsZWN0ZWQoYil8fHRoaXMucHVzaCgic2VsZWN0ZWRJdGVtcyIsYil9LGRlc2VsZWN0SXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpO2I9dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik7LTE8YiYmdGhpcy5zcGxpY2UoInNlbGVjdGVkSXRlbXMiLGIsMSl9LF90b2dnbGVJdGVtOmZ1bmN0aW9uKGIpe2I9dGhpcy5fdGFrZUl0ZW0oYik7LTE9PT10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihiKT90aGlzLnNlbGVjdEl0ZW0oYik6dGhpcy5kZXNlbGVjdEl0ZW0oYil9LF90YWtlSXRlbTpmdW5jdGlvbihiKXtyZXR1cm4ibnVtYmVyIj09PQp0eXBlb2YgYiYmMDw9YiYmdGhpcy5pdGVtcyYmdGhpcy5pdGVtcy5sZW5ndGg+Yj90aGlzLml0ZW1zW2JdOmJ9LF9zZWxlY3RlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXshdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zfHwic2VsZWN0ZWRJdGVtcyIhPT1iLnBhdGgmJiJzZWxlY3RlZEl0ZW1zLnNwbGljZXMiIT09Yi5wYXRofHx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZC5pdGVtKX0uYmluZCh0aGlzKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHIpe3JldHVybiBrKyhyfHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayxyO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcihyPTA7cjxoLmxlbmd0aDtyKyspe3ZhciBsPWhbcl07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09ciYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnIraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCxyPTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnI8PWw7KXIrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3IpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGI9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYiYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1iLmxvY2FsTmFtZT9iLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkKXswPD1kLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYik6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGIpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGIsZCl7aWYoYiYmIWIudGVtcGxhdGl6ZXIpe3ZhciBmPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtmLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7Zi5faW5zdGFuY2VQcm9wcz1kfHxmLl9pbnN0YW5jZVByb3BzO2YudGVtcGxhdGU9YjtiLnRlbXBsYXRpemVyPWZ9cmV0dXJuIGJ9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChiKSwKZnVuY3Rpb24oZCl7cmV0dXJuIFBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihiKXsoYj10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGIpKSYmdGhpcy5kYXRhSG9zdCYmKGIuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBifSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTpifSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6Yn0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6Yn0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6Yn0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1ifHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTpifSksdGhpcy5fb2xkRnJvemVuPWIpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJmIudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYi50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmJ9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6Yn0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTpifSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTpifSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmJ9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgcj1iW2tdLnBhdGg7aWYociYmLTEhPT1yLmluZGV4T2YoIi4iKSl7dmFyIGw9ci5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrcisnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHIsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFtyLDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHIsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFtyLDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnItbSpyLzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFtyLAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayxyLGwpe2Z1bmN0aW9uIHAoeSx4LEMsRyl7Y29uc3QgRD15LUMsQj14LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgSD0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1IP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9SD9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0seC1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUgqRCxHLUgqQil9aWYoMj5yLmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXJbMF18fG0+PXJbci5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHIsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTxyLmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHc9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB4PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8eHx8IShudWxsPT09d3x8eDx3KXx8KHc9eCxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHIsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHI8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGsscixsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnI8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHIsbCl7cmV0dXJuW2suaW52ZXJ0KHIpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtYmFja2VuZC90Zi1ocGFyYW1zLWJhY2tlbmQuaHRtbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2NsYXNzIGZ7Y29uc3RydWN0b3IoaCxrLHI9ITApe3RoaXMuX2FwaVVybD1oO3RoaXMuX3JlcXVlc3RNYW5hZ2VyPWs7dGhpcy5fdXNlSHR0cEdldD1yfWdldEV4cGVyaW1lbnQoaCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJleHBlcmltZW50IixoKX1nZXREb3dubG9hZFVybChoLGsscil7cmV0dXJuIHRoaXMuX2FwaVVybCsiL2Rvd25sb2FkX2RhdGE/IituZXcgVVJMU2VhcmNoUGFyYW1zKHtmb3JtYXQ6aCxjb2x1bW5zVmlzaWJpbGl0eTpKU09OLnN0cmluZ2lmeShyKSxyZXF1ZXN0OkpTT04uc3RyaW5naWZ5KGspfSl9bGlzdFNlc3Npb25Hcm91cHMoaCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsaCl9bGlzdE1ldHJpY0V2YWxzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIixoKX1fc2VuZFJlcXVlc3QoaCxrKXtpZih0aGlzLl91c2VIdHRwR2V0KXJldHVybiBrPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShrKSksCnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5fYXBpVXJsKyIvIitoKyI/cmVxdWVzdFx4M2QiK2spO2NvbnN0IHI9bmV3IGRjLlJlcXVlc3RPcHRpb25zO3Iud2l0aENyZWRlbnRpYWxzPSEwO3IubWV0aG9kVHlwZT0iUE9TVCI7ci5jb250ZW50VHlwZT0idGV4dC9wbGFpbiI7ci5ib2R5PUpTT04uc3RyaW5naWZ5KGspO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0V2l0aE9wdGlvbnModGhpcy5fYXBpVXJsKyIvIitoLHIpfX1kLkJhY2tlbmQ9Zn0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvdGhyZWUuanMKKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPT10eXBlb2YgbW9kdWxlP2QoZXhwb3J0cyk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLGQpOihiPWJ8fHNlbGYsZChiLlRIUkVFPXt9KSl9KSh0aGlzLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gZihhLGMpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwfWZ1bmN0aW9uIGgoYSxjLGUsZyl7dGhpcy5feD1hfHwwO3RoaXMuX3k9Y3x8MDt0aGlzLl96PWV8fDA7dGhpcy5fdz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBrKGEsYyxlKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MDt0aGlzLno9ZXx8MH1mdW5jdGlvbiByKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdOzA8YXJndW1lbnRzLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX0KZnVuY3Rpb24gbChhLGMsZSxnLHQsdix6LEUsRixJKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpobCsrfSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLmltYWdlPXZvaWQgMCE9PWE/YTpsLkRFRkFVTFRfSU1BR0U7dGhpcy5taXBtYXBzPVtdO3RoaXMubWFwcGluZz12b2lkIDAhPT1jP2M6bC5ERUZBVUxUX01BUFBJTkc7dGhpcy53cmFwUz12b2lkIDAhPT1lP2U6MTAwMTt0aGlzLndyYXBUPXZvaWQgMCE9PWc/ZzoxMDAxO3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXQ/dDoxMDA2O3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PXY/djoxMDA4O3RoaXMuYW5pc290cm9weT12b2lkIDAhPT1GP0Y6MTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMzt0aGlzLnR5cGU9dm9pZCAwIT09RT9FOjEwMDk7dGhpcy5vZmZzZXQ9bmV3IGYoMCwwKTt0aGlzLnJlcGVhdD1uZXcgZigxLDEpO3RoaXMuY2VudGVyPW5ldyBmKDAsMCk7CnRoaXMucm90YXRpb249MDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITA7dGhpcy5tYXRyaXg9bmV3IHI7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITA7dGhpcy5wcmVtdWx0aXBseUFscGhhPSExO3RoaXMuZmxpcFk9ITA7dGhpcy51bnBhY2tBbGlnbm1lbnQ9NDt0aGlzLmVuY29kaW5nPXZvaWQgMCE9PUk/STozRTM7dGhpcy52ZXJzaW9uPTA7dGhpcy5vblVwZGF0ZT1udWxsfWZ1bmN0aW9uIHAoYSxjLGUsZyl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDA7dGhpcy53PXZvaWQgMCE9PWc/ZzoxfWZ1bmN0aW9uIG0oYSxjLGUpe3RoaXMud2lkdGg9YTt0aGlzLmhlaWdodD1jO3RoaXMuc2Npc3Nvcj1uZXcgcCgwLDAsYSxjKTt0aGlzLnNjaXNzb3JUZXN0PSExO3RoaXMudmlld3BvcnQ9bmV3IHAoMCwwLGEsYyk7ZT1lfHx7fTt0aGlzLnRleHR1cmU9bmV3IGwodm9pZCAwLHZvaWQgMCxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLAplLmFuaXNvdHJvcHksZS5lbmNvZGluZyk7dGhpcy50ZXh0dXJlLmltYWdlPXt9O3RoaXMudGV4dHVyZS5pbWFnZS53aWR0aD1hO3RoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9Yzt0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXZvaWQgMCE9PWUuZ2VuZXJhdGVNaXBtYXBzP2UuZ2VuZXJhdGVNaXBtYXBzOiExO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09ZS5taW5GaWx0ZXI/ZS5taW5GaWx0ZXI6MTAwNjt0aGlzLmRlcHRoQnVmZmVyPXZvaWQgMCE9PWUuZGVwdGhCdWZmZXI/ZS5kZXB0aEJ1ZmZlcjohMDt0aGlzLnN0ZW5jaWxCdWZmZXI9dm9pZCAwIT09ZS5zdGVuY2lsQnVmZmVyP2Uuc3RlbmNpbEJ1ZmZlcjohMDt0aGlzLmRlcHRoVGV4dHVyZT12b2lkIDAhPT1lLmRlcHRoVGV4dHVyZT9lLmRlcHRoVGV4dHVyZTpudWxsfWZ1bmN0aW9uIG4oYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKTt0aGlzLnNhbXBsZXM9NH1mdW5jdGlvbiBxKCl7dGhpcy5lbGVtZW50cz0KWzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdOzA8YXJndW1lbnRzLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX1mdW5jdGlvbiB1KGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX29yZGVyPWd8fHUuRGVmYXVsdE9yZGVyfWZ1bmN0aW9uIHcoKXt0aGlzLm1hc2s9MX1mdW5jdGlvbiBBKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aWwrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJPYmplY3QzRCI7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLmNoaWxkcmVuPVtdO3RoaXMudXA9QS5EZWZhdWx0VXAuY2xvbmUoKTt2YXIgYT1uZXcgayxjPW5ldyB1LGU9bmV3IGgsZz1uZXcgaygxLDEsMSk7Yy5fb25DaGFuZ2UoZnVuY3Rpb24oKXtlLnNldEZyb21FdWxlcihjLAohMSl9KTtlLl9vbkNoYW5nZShmdW5jdGlvbigpe2Muc2V0RnJvbVF1YXRlcm5pb24oZSx2b2lkIDAsITEpfSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9zaXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmF9LHJvdGF0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpjfSxxdWF0ZXJuaW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxzY2FsZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Z30sbW9kZWxWaWV3TWF0cml4Ont2YWx1ZTpuZXcgcX0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgcn19KTt0aGlzLm1hdHJpeD1uZXcgcTt0aGlzLm1hdHJpeFdvcmxkPW5ldyBxO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1BLkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMTt0aGlzLmxheWVycz1uZXcgdzt0aGlzLnZpc2libGU9ITA7CnRoaXMucmVjZWl2ZVNoYWRvdz10aGlzLmNhc3RTaGFkb3c9ITE7dGhpcy5mcnVzdHVtQ3VsbGVkPSEwO3RoaXMucmVuZGVyT3JkZXI9MDt0aGlzLnVzZXJEYXRhPXt9fWZ1bmN0aW9uIHkoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTY2VuZSI7dGhpcy5vdmVycmlkZU1hdGVyaWFsPXRoaXMuZm9nPXRoaXMuYmFja2dyb3VuZD1udWxsO3RoaXMuYXV0b1VwZGF0ZT0hMDsidW5kZWZpbmVkIiE9PXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfWZ1bmN0aW9uIHgoYSxjKXt0aGlzLm1pbj12b2lkIDAhPT1hP2E6bmV3IGsoSW5maW5pdHksSW5maW5pdHksSW5maW5pdHkpO3RoaXMubWF4PXZvaWQgMCE9PWM/YzpuZXcgaygtSW5maW5pdHksLUluZmluaXR5LC1JbmZpbml0eSl9ZnVuY3Rpb24gQyhhLGMsZSxnLHQpe3ZhciB2O3ZhciB6PTA7Zm9yKHY9YS5sZW5ndGgtCjM7ejw9djt6Kz0zKXtNZC5mcm9tQXJyYXkoYSx6KTt2YXIgRT1jLmRvdChNZCksRj1lLmRvdChNZCksST1nLmRvdChNZCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KEUsRixJKSxNYXRoLm1pbihFLEYsSSkpPnQueCpNYXRoLmFicyhNZC54KSt0LnkqTWF0aC5hYnMoTWQueSkrdC56Kk1hdGguYWJzKE1kLnopKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIEcoYSxjKXt0aGlzLmNlbnRlcj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5yYWRpdXM9dm9pZCAwIT09Yz9jOjB9ZnVuY3Rpb24gRChhLGMpe3RoaXMub3JpZ2luPXZvaWQgMCE9PWE/YTpuZXcgazt0aGlzLmRpcmVjdGlvbj12b2lkIDAhPT1jP2M6bmV3IGt9ZnVuY3Rpb24gQihhLGMsZSl7dGhpcy5hPXZvaWQgMCE9PWE/YTpuZXcgazt0aGlzLmI9dm9pZCAwIT09Yz9jOm5ldyBrO3RoaXMuYz12b2lkIDAhPT1lP2U6bmV3IGt9ZnVuY3Rpb24gSChhLGMsZSl7cmV0dXJuIHZvaWQgMD09PWMmJnZvaWQgMD09PWU/dGhpcy5zZXQoYSk6CnRoaXMuc2V0UkdCKGEsYyxlKX1mdW5jdGlvbiBLKGEsYyxlKXswPmUmJihlKz0xKTsxPGUmJi0tZTtyZXR1cm4gZTwxLzY/YSs2KihjLWEpKmU6LjU+ZT9jOmU8Mi8zP2ErNiooYy1hKSooMi8zLWUpOmF9ZnVuY3Rpb24gTChhKXtyZXR1cm4uMDQwNDU+YT8uMDc3Mzk5MzgwOCphOk1hdGgucG93KC45NDc4NjcyOTg2KmErLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBKKGEpe3JldHVybi4wMDMxMzA4PmE/MTIuOTIqYToxLjA1NSpNYXRoLnBvdyhhLC40MTY2NiktLjA1NX1mdW5jdGlvbiBPKGEsYyxlLGcsdCx2KXt0aGlzLmE9YTt0aGlzLmI9Yzt0aGlzLmM9ZTt0aGlzLm5vcm1hbD1nJiZnLmlzVmVjdG9yMz9nOm5ldyBrO3RoaXMudmVydGV4Tm9ybWFscz1BcnJheS5pc0FycmF5KGcpP2c6W107dGhpcy5jb2xvcj10JiZ0LmlzQ29sb3I/dDpuZXcgSDt0aGlzLnZlcnRleENvbG9ycz1BcnJheS5pc0FycmF5KHQpP3Q6W107dGhpcy5tYXRlcmlhbEluZGV4PXZvaWQgMCE9PXY/djowfQpmdW5jdGlvbiBTKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6amwrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJNYXRlcmlhbCI7dGhpcy5saWdodHM9dGhpcy5mb2c9ITA7dGhpcy5ibGVuZGluZz0xO3RoaXMuc2lkZT0wO3RoaXMudmVydGV4VGFuZ2VudHM9dGhpcy5mbGF0U2hhZGluZz0hMTt0aGlzLnZlcnRleENvbG9ycz0wO3RoaXMub3BhY2l0eT0xO3RoaXMudHJhbnNwYXJlbnQ9ITE7dGhpcy5ibGVuZFNyYz0yMDQ7dGhpcy5ibGVuZERzdD0yMDU7dGhpcy5ibGVuZEVxdWF0aW9uPTEwMDt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10aGlzLmJsZW5kRHN0QWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhPW51bGw7dGhpcy5kZXB0aEZ1bmM9Mzt0aGlzLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFRlc3Q9ITA7dGhpcy5zdGVuY2lsRnVuYz01MTk7dGhpcy5zdGVuY2lsUmVmPTA7dGhpcy5zdGVuY2lsTWFzaz0KMjU1O3RoaXMuc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbEZhaWw9NzY4MDt0aGlzLnN0ZW5jaWxXcml0ZT0hMTt0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGw7dGhpcy5jbGlwU2hhZG93cz10aGlzLmNsaXBJbnRlcnNlY3Rpb249ITE7dGhpcy5zaGFkb3dTaWRlPW51bGw7dGhpcy5jb2xvcldyaXRlPSEwO3RoaXMucHJlY2lzaW9uPW51bGw7dGhpcy5wb2x5Z29uT2Zmc2V0PSExO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wO3RoaXMuZGl0aGVyaW5nPSExO3RoaXMuYWxwaGFUZXN0PTA7dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITE7dGhpcy50b25lTWFwcGVkPXRoaXMudmlzaWJsZT0hMDt0aGlzLnVzZXJEYXRhPXt9O3RoaXMubmVlZHNVcGRhdGU9ITB9ZnVuY3Rpb24gTihhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5saWdodE1hcD0KdGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBSKGEsYyxlKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5uYW1lPSIiO3RoaXMuYXJyYXk9YTt0aGlzLml0ZW1TaXplPQpjO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5ub3JtYWxpemVkPSEwPT09ZTt0aGlzLmR5bmFtaWM9ITE7dGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9O3RoaXMudmVyc2lvbj0wfWZ1bmN0aW9uIFgoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBmYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gb2EoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gY2EoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gamEoYSxjLGUpe1IuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBiYShhLGMsZSl7Ui5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtSLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gVygpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTprbCs9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTih7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHQsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdix0LCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUodCx2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7dmcuY29weShFKTt2Zy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh2Zyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6dmcuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyx0LHYseixFLEYsSSxNKXtOZC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsRik7T2QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LEkpO1BkLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxNKTt0PWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZ0KXtOaC5zZXQoMCwwLDApO09oLnNldCgwLDAsMCk7ClBoLnNldCgwLDAsMCk7Zm9yKHZhciBQPTAsUT12Lmxlbmd0aDtQPFE7UCsrKXt2YXIgVT10W1BdLFY9dltQXTswIT09VSYmKGlqLmZyb21CdWZmZXJBdHRyaWJ1dGUoVixGKSxqai5mcm9tQnVmZmVyQXR0cmlidXRlKFYsSSksa2ouZnJvbUJ1ZmZlckF0dHJpYnV0ZShWLE0pLE5oLmFkZFNjYWxlZFZlY3Rvcihpai5zdWIoTmQpLFUpLE9oLmFkZFNjYWxlZFZlY3Rvcihqai5zdWIoT2QpLFUpLFBoLmFkZFNjYWxlZFZlY3Rvcihrai5zdWIoUGQpLFUpKX1OZC5hZGQoTmgpO09kLmFkZChPaCk7UGQuYWRkKFBoKX1pZihhPUFhKGEsYyxlLGcsTmQsT2QsUGQsdWYpKXomJihxZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscmUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEkpLHNlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixNKSxhLnV2PUIuZ2V0VVYodWYsTmQsT2QsUGQscWUscmUsc2UsbmV3IGYpKSxFJiYocWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHJlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSSksc2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLE0pLGEudXYyPUIuZ2V0VVYodWYsTmQsT2QsUGQscWUscmUsc2UsbmV3IGYpKSx6PW5ldyBPKEYsSSxNKSxCLmdldE5vcm1hbChOZCxPZCxQZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geGEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpsbCs9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHQsdil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6dCxkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcsdCx2KXtmdW5jdGlvbiB6KFYsZWEsZGEscmEscGEscWEsdWEsbmEsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9bmEvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ZdPShLYSpVYS1IYSkqcmEsamJbZWFdPUViKnBhLGpiW2RhXT1NYSxJLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ZdPTAsamJbZWFdPTAsamJbZGFdPTA8bmE/MTotMSxNLnB1c2goamIueCxqYi55LGpiLnopLFAucHVzaChLYS90YSksUC5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylWPVErS2ErdWEqKGJiKzEpLGVhPVErKEthKzEpK3VhKihiYisxKSxkYT1RKyhLYSsxKSt1YSpiYixGLnB1c2goUStLYSt1YSpiYixWLGRhKSxGLnB1c2goVixlYSxkYSksdGIrPTY7RS5hZGRHcm91cChVLHRiLFRhKTtVKz10YjtRKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czp0LApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3Q9TWF0aC5mbG9vcih0KXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sST1bXSxNPVtdLFA9W10sUT0wLFU9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsdCwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsdCwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsdCw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHQsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShJLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoTSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoUCwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHQ9YVtlXVtnXTtjW2VdW2ddPXQmJih0LmlzQ29sb3J8fHQuaXNNYXRyaXgzfHx0LmlzTWF0cml4NHx8dC5pc1ZlY3RvcjJ8fHQuaXNWZWN0b3IzfHx0LmlzVmVjdG9yNHx8dC5pc1RleHR1cmUpP3QuY2xvbmUoKTpBcnJheS5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSx0O2Zvcih0IGluIGcpY1t0XT1nW3RdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgdD1uZXcgdmIoOTAsCjEsYSxjKTt0LnVwLnNldCgwLC0xLDApO3QubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQodCk7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBJPW5ldyB2Yig5MCwxLGEsYyk7SS51cC5zZXQoMCwtMSwwKTtJLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChJKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBPYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihNLFApe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBRPU0uZ2V0UmVuZGVyVGFyZ2V0KCksVT10aGlzLnJlbmRlclRhcmdldCxWPVUudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7VS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtNLnNldFJlbmRlclRhcmdldChVLDApO00ucmVuZGVyKFAsdCk7TS5zZXRSZW5kZXJUYXJnZXQoVSwxKTtNLnJlbmRlcihQLHYpO00uc2V0UmVuZGVyVGFyZ2V0KFUsMik7TS5yZW5kZXIoUCx6KTtNLnNldFJlbmRlclRhcmdldChVLDMpO00ucmVuZGVyKFAsRSk7TS5zZXRSZW5kZXJUYXJnZXQoVSw0KTtNLnJlbmRlcihQLEYpO1UudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VjtNLnNldFJlbmRlclRhcmdldChVLDUpO00ucmVuZGVyKFAsSSk7TS5zZXRSZW5kZXJUYXJnZXQoUSl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKE0sUCxRLFUpe2Zvcih2YXIgVj1NLmdldFJlbmRlclRhcmdldCgpLGVhPXRoaXMucmVuZGVyVGFyZ2V0LGRhPTA7Nj5kYTtkYSsrKU0uc2V0UmVuZGVyVGFyZ2V0KGVhLGRhKSxNLmNsZWFyKFAsUSxVKTtNLnNldFJlbmRlclRhcmdldChWKX19ZnVuY3Rpb24gT2IoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHQsdix6LEUsRixJLE0sUCl7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEksZyx0LE0sUCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUk/SToxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gbGMoYSxjLGUsZyx0LHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXQ/dDpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gZWMoKXtmdW5jdGlvbiBhKHQsdil7ITEhPT1lJiYoZyh0LHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24odCl7Zz10fSxzZXRDb250ZXh0OmZ1bmN0aW9uKHQpe2M9dH19fWZ1bmN0aW9uIFFkKGEpe2Z1bmN0aW9uIGModCx2KXt2YXIgej10LmFycmF5LEU9dC5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTt0Lm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjp0LnZlcnNpb259fWZ1bmN0aW9uIGUodCx2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeix0KTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24odCl7dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodD10LmRhdGEpO3JldHVybiBnLmdldCh0KX0sCnJlbW92ZTpmdW5jdGlvbih0KXt0LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih0PXQuZGF0YSk7dmFyIHY9Zy5nZXQodCk7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZSh0KSl9LHVwZGF0ZTpmdW5jdGlvbih0LHYpe3QuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHQ9dC5kYXRhKTt2YXIgej1nLmdldCh0KTt2b2lkIDA9PT16P2cuc2V0KHQsYyh0LHYpKTp6LnZlcnNpb248dC52ZXJzaW9uJiYoZSh6LmJ1ZmZlcix0LHYpLHoudmVyc2lvbj10LnZlcnNpb24pfX19ZnVuY3Rpb24gdWQoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5jKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBOYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgdD1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsST1jL2csTT1bXSxQPVtdLFE9W10sVT1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBWPWEqSS12O2ZvcihjPTA7Yzx6O2MrKylQLnB1c2goYypGLXQsLVYsMCksUS5wdXNoKDAsMCwxKSxVLnB1c2goYy9lKSxVLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspdD1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsTS5wdXNoKGMreiphLHQsRSksTS5wdXNoKHQsdixFKTt0aGlzLnNldEluZGV4KE0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFAsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgYmEoUSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoVSwyKSl9ZnVuY3Rpb24gdmQoYSxjLGUsZyl7ZnVuY3Rpb24gdChQLFEpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihQLnIsUC5nLFAuYixRLGcpfXZhciB2PW5ldyBIKDApLHo9MCxFLEYsST1udWxsLE09MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFAsUSl7di5zZXQoUCk7ej12b2lkIDAhPT1RP1E6MTt0KHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihQKXt6PVA7dCh2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUCxRLFUsVil7UT1RLmJhY2tncm91bmQ7VT1hLnZyOyhVPVUuZ2V0U2Vzc2lvbiYmVS5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09VS5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFE9bnVsbCk7bnVsbD09PVE/KHQodix6KSxJPW51bGwsTT0wKTpRJiZRLmlzQ29sb3ImJgoodChRLDEpLFY9ITAsST1udWxsLE09MCk7KGEuYXV0b0NsZWFyfHxWKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihRJiYoUS5pc0N1YmVUZXh0dXJlfHxRLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHlhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihPYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6T2MuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6T2MuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGVhLGRhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1Y9US5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9RLnRleHR1cmU6UTtGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVY7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1RLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSSE9PVF8fE0hPT1WLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxJPVEsTT1WLnZlcnNpb247UC51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFEmJlEuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeWEobmV3IE5jKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE9jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpPYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6T2MuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1ROyEwPT09US5tYXRyaXhBdXRvVXBkYXRlJiZRLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShRLm1hdHJpeCk7aWYoSSE9PVF8fE0hPT1RLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxJPVEsTT1RLnZlcnNpb247UC51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgdDt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3Q9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXModCx2LHopO2UudXBkYXRlKHosdCl9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBJPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxJPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltJXSh0LHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHQsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE5iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgdCx2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxJPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLE09YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFA9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFE9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFU9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGVhPTA8RixkYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWVhJiZkYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10KXJldHVybiB0O3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHQ9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SSxtYXhDdWJlbWFwU2l6ZTpNLG1heEF0dHJpYnV0ZXM6UCxtYXhWZXJ0ZXhVbmlmb3JtczpRLG1heFZhcnlpbmdzOlUsbWF4RnJhZ21lbnRVbmlmb3JtczpWLHZlcnRleFRleHR1cmVzOmVhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpkYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHljKCl7ZnVuY3Rpb24gYSgpe0kudmFsdWUhPT1nJiYoSS52YWx1ZT1nLEkubmVlZHNVcGRhdGU9MDx0KTtlLm51bVBsYW5lcz10O2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhNLFAsUSxVKXt2YXIgVj1udWxsIT09TT9NLmxlbmd0aDowLGVhPW51bGw7aWYoMCE9PVYpe2VhPUkudmFsdWU7aWYoITAhPT1VfHxudWxsPT09ZWEpe1U9USs0KlY7UD1QLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUCk7aWYobnVsbD09PWVhfHxlYS5sZW5ndGg8VSllYT1uZXcgRmxvYXQzMkFycmF5KFUpO2ZvcihVPTA7VSE9PVY7KytVLFErPTQpRS5jb3B5KE1bVV0pLmFwcGx5TWF0cml4NChQLEYpLEUubm9ybWFsLnRvQXJyYXkoZWEsUSksZWFbUSszXT1FLmNvbnN0YW50fUkudmFsdWU9ZWE7SS5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1WO3JldHVybiBlYX12YXIgZT10aGlzLGc9bnVsbCx0PTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHIsST17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUk7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oTSxQLFEpe3ZhciBVPTAhPT1NLmxlbmd0aHx8UHx8MCE9PXR8fHY7dj1QO2c9YyhNLFEsMCk7dD1NLmxlbmd0aDtyZXR1cm4gVX07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihNLFAsUSxVLFYsZWEpe2lmKCF2fHxudWxsPT09TXx8MD09PU0ubGVuZ3RofHx6JiYhUSl6P2MobnVsbCk6YSgpO2Vsc2V7UT16PzA6dDt2YXIgZGE9NCpRLHJhPVYuY2xpcHBpbmdTdGF0ZXx8bnVsbDtJLnZhbHVlPXJhO3JhPWMoTSxVLGRhLGVhKTtmb3IoTT0wO00hPT1kYTsrK00pcmFbTV09Z1tNXTtWLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249UD90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1RfX19ZnVuY3Rpb24gZGQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gd2QoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBJIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSV0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoST16LmdldChFKSljLnJlbW92ZShJKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gdChFKXt2YXIgRj1bXSxJPUUuaW5kZXgsTT1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpJKXt2YXIgUD1JLmFycmF5O0k9SS52ZXJzaW9uO009MDtmb3IodmFyIFE9UC5sZW5ndGg7TTxRO00rPTMpe3ZhciBVPVBbTSswXSxWPVBbTSsxXSxlYT1QW00rMl07Ri5wdXNoKFUsVixWLGVhLGVhLFUpfX1lbHNlIGZvcihQPU0uYXJyYXksST1NLnZlcnNpb24sTT0wLFE9UC5sZW5ndGgvMy0xO008UTtNKz0zKVU9TSswLFY9TSsxLGVhPU0rMixGLnB1c2goVSxWLFYsZWEsZWEsVSk7Rj1uZXcgKDY1NTM1PEVhKEYpP2phOlopKEYsMSk7Ri52ZXJzaW9uPUk7Yy51cGRhdGUoRiwzNDk2Myk7KFA9ei5nZXQoRSkpJiZjLnJlbW92ZShQKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBJPXYuZ2V0KEYpO2lmKEkpcmV0dXJuIEk7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/ST1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEk9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSSk7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBJfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxJPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBNIGluIEkpYy51cGRhdGUoSVtNXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoTSBpbiBFKXtGPUVbTV07ST0wO2Zvcih2YXIgUD1GLmxlbmd0aDtJPFA7SSsrKWMudXBkYXRlKEZbSV0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBJPUUuaW5kZXg7bnVsbCE9PUkmJkYudmVyc2lvbjxJLnZlcnNpb24mJnQoRSl9ZWxzZSB0KEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHdnKGEsYyxlLGcpe3ZhciB0LHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7dD1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHQsRix2LEUqeik7ZS51cGRhdGUoRix0KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEkpe2lmKGcuaXNXZWJHTDIpe3ZhciBNPWE7dmFyIFA9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihNPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1NKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufU1bUF0odCxJLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEksdCxFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIG1sKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBubChhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBvbChhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHQsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1t0LmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgST0wO0k8RjtJKyspZ1tJXT1bSSwwXTtjW3QuaWRdPWd9dmFyIE09di5tb3JwaFRhcmdldHMmJnQubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnQubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoST0wO0k8RjtJKyspe3ZhciBQPWdbSV07MCE9PVBbMV0mJihNJiZ0LnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0kpLHYmJnQucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSSkpfWZvcihJPTA7STxGO0krKylQPWdbSV0sUFswXT1JLFBbMV09RVtJXTtnLnNvcnQobmwpOwpmb3IoST0wOzg+STtJKyspe2lmKFA9Z1tJXSlpZihFPVBbMF0sRj1QWzFdKXtNJiZ0LmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0ksTVtFXSk7diYmdC5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitJLHZbRV0pO2VbSV09Rjtjb250aW51ZX1lW0ldPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBwbChhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHQ9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09dCYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09dCk7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gZWQoYSxjLGUsZyx0LHYseixFLEYsSSl7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyx0LHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixJKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHRlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gdWUoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB2ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHQ9YyplLHY9bGpbdF07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheSh0KSxsalt0XT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSx0PTA7ZyE9PWM7KytnKXQrPWUsYVtnXS50b0FycmF5KHYsdCk7cmV0dXJuIHZ9ZnVuY3Rpb24gdWMoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBwYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gbWooYSxjKXt2YXIgZT1ualtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxualtjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBxbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBybChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSB1YyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxwYyhlLGMpKX1mdW5jdGlvbiBzbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHVjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLHBjKGUsYykpfWZ1bmN0aW9uIHRsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2UgdWMoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYykscGMoZSxjKSl9ZnVuY3Rpb24gdWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3VjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLHBjKGUsYykpOnVjKGUsZyl8fChvai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxvaikscGMoZSxnKSl9ZnVuY3Rpb24gdmwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3VjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLHBjKGUsYykpOnVjKGUsZyl8fChwai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxwaikscGMoZSxnKSl9CmZ1bmN0aW9uIHdsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz91YyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxwYyhlLGMpKTp1YyhlLGcpfHwocWouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscWopLHBjKGUsZykpfWZ1bmN0aW9uIHhsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHQ9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXQmJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsdCksZ1swXT10KTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8cmosdCl9ZnVuY3Rpb24geWwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUsdD1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09dCYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcix0KSxnWzBdPXQpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8emwsdCl9ZnVuY3Rpb24gQWwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUsdD1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXQmJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsdCksZ1swXT10KTtlLnNldFRleHR1cmUzRChjfHxCbCx0KX1mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSx0PWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT10JiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHQpLGdbMF09dCk7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8c2osdCl9ZnVuY3Rpb24gRGwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gRWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3VjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLHBjKGUsYykpfWZ1bmN0aW9uIEZsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTt1YyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxwYyhlLGMpKX1mdW5jdGlvbiBHbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7dWMoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLHBjKGUsYykpfWZ1bmN0aW9uIEhsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIHFsO2Nhc2UgMzU2NjQ6cmV0dXJuIHJsO2Nhc2UgMzU2NjU6cmV0dXJuIHNsO2Nhc2UgMzU2NjY6cmV0dXJuIHRsO2Nhc2UgMzU2NzQ6cmV0dXJuIHVsO2Nhc2UgMzU2NzU6cmV0dXJuIHZsO2Nhc2UgMzU2NzY6cmV0dXJuIHdsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4geGw7Y2FzZSAzNTY3OTpyZXR1cm4gQWw7Y2FzZSAzNTY4MDpyZXR1cm4gQ2w7Y2FzZSAzNjI4OTpyZXR1cm4geWw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIERsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gRWw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBGbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIEdsfX1mdW5jdGlvbiBJbChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gSmwoYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIEtsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gTGwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIE1sKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBObChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBPbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBQbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBRbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiBSbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiBTbChhLGMpe2M9dmUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIFRsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCx0PW1qKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcix0KTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8cmosdFthXSl9ZnVuY3Rpb24gVWwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHQ9bWooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHQpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fHNqLHRbYV0pfWZ1bmN0aW9uIFZsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIElsO2Nhc2UgMzU2NjQ6cmV0dXJuIE5sO2Nhc2UgMzU2NjU6cmV0dXJuIE9sO2Nhc2UgMzU2NjY6cmV0dXJuIFBsO2Nhc2UgMzU2NzQ6cmV0dXJuIFFsO2Nhc2UgMzU2NzU6cmV0dXJuIFJsO2Nhc2UgMzU2NzY6cmV0dXJuIFNsO2Nhc2UgMzU2Nzg6cmV0dXJuIFRsO2Nhc2UgMzU2ODA6cmV0dXJuIFVsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBKbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIEtsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIExsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gTWx9fWZ1bmN0aW9uIFdsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPUhsKGMudHlwZSl9ZnVuY3Rpb24gdGooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1WbChjLnR5cGUpfWZ1bmN0aW9uIHVqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiB2aihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBYbChhLGMsZSl7dmFyIGc9YS5uYW1lLHQ9Zy5sZW5ndGg7Zm9yKFFoLmxhc3RJbmRleD0wOzspe3ZhciB2PVFoLmV4ZWMoZyksej1RaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09dCl7dmooZSwKdm9pZCAwPT09Rj9uZXcgV2woRSxhLGMpOm5ldyB0aihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgdWooRSksdmooZSx2KSksZT12fX1mdW5jdGlvbiB4ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciB0PWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO1hsKHQsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyx0Lm5hbWUpLHRoaXMpfX1mdW5jdGlvbiB3aihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBZbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24geGooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24geWooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHQ9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT10PyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIit0K1lsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB4ZyhhLGMpe2M9eGooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIFpsKGEsYyl7Yz14aihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gJGwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBhbShhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih2Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gYm0oYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBjbShhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSx0PTA7dDxnO3QrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyx0KS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHZmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiB6aihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gQWooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIFJoKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gUmgoYyl9KX0KZnVuY3Rpb24gQmooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHQpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9dC5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIGRtKGEsYyxlLGcsdCx2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEk9dC52ZXJ0ZXhTaGFkZXIsTT10LmZyYWdtZW50U2hhZGVyLFA9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1A9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9QPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFA9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUT0iRU5WTUFQX1RZUEVfQ1VCRSIsVT0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVj0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlE9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlE9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlE9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlE9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpWPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpWPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vj0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBlYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxkYT16LmlzV2ViR0wyPyIiOmFtKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPWJtKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih2Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZGEscmFdLmZpbHRlcih2Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0Lm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIrZWEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVToiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitQOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHZmKS5qb2luKCJcbiIpLGM9W2RhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0Lm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIrZWEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUToiIix2LmVudk1hcD8iI2RlZmluZSAiK1U6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitWOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1A6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/JGwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz94ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz94ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz94ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3hnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9abCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih2Zikuam9pbigiXG4iKSk7ST1SaChJKTtJPXpqKEksdik7ST1BaihJLHYpO009UmgoTSk7TT16aihNLAp2KTtNPUFqKE0sdik7ST1CaihJKTtNPUJqKE0pO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFA9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUkubWF0Y2goUCkmJm51bGwhPT1NLm1hdGNoKFApJiYoej0hMCxJPUkucmVwbGFjZShQLCIiKSxNPU0ucmVwbGFjZShQLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7TT1jK007ST13aihFLDM1NjMzLEYrSSk7TT13aihFLDM1NjMyLE0pO0UuYXR0YWNoU2hhZGVyKHBhLEkpO0UuYXR0YWNoU2hhZGVyKHBhLE0pO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhJKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coTSkudHJpbSgpO1E9UD0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUD0hMSxVPXlqKEUsSSwidmVydGV4IiksVj15aihFLE0sImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFUsVik7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUT0hMTtRJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UCxtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSSk7RS5kZWxldGVTaGFkZXIoTSk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB4ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1jbShFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9dC5uYW1lO3RoaXMuaWQ9ZW0rKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1JO3RoaXMuZnJhZ21lbnRTaGFkZXI9TTtyZXR1cm4gdGhpc31mdW5jdGlvbiBmbShhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBJPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSTxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0krIi4iKSwwKTpJfWZ1bmN0aW9uIHQoRixJKXtpZihGKUYuaXNUZXh0dXJlP009Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksTT1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIE09M0UzOzNFMz09PU0mJkkmJihNPTMwMDcpO3JldHVybiBNfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEksTSxQLFEsVSxWKXt2YXIgZWE9eltGLnR5cGVdLGRhPVYuaXNTa2lubmVkTWVzaD9nKFYpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6ZWEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzp0KHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzp0KEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6dChGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnQoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6dChGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFQLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlAmJlAuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGRhLG1heEJvbmVzOmRhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6SS5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6SS5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpJLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkkucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6SS5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6SS5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6SS5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpJLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpRLG51bUNsaXBJbnRlcnNlY3Rpb246VSxkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZWLnJlY2VpdmVTaGFkb3cmJjA8TS5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEkpe3ZhciBNPVtdO0kuc2hhZGVySUQ/TS5wdXNoKEkuc2hhZGVySUQpOihNLnB1c2goRi5mcmFnbWVudFNoYWRlciksCk0ucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFAgaW4gRi5kZWZpbmVzKU0ucHVzaChQKSxNLnB1c2goRi5kZWZpbmVzW1BdKTtmb3IoUD0wO1A8RS5sZW5ndGg7UCsrKU0ucHVzaChJW0VbUF1dKTtNLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7TS5wdXNoKGEuZ2FtbWFPdXRwdXQpO00ucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gTS5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixJLE0sUCl7Zm9yKHZhciBRLFU9MCxWPXYubGVuZ3RoO1U8VjtVKyspe3ZhciBlYT12W1VdO2lmKGVhLmNvZGU9PT1QKXtRPWVhOysrUS51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVEmJihRPW5ldyBkbShhLGMsUCxGLEksTSxlKSx2LnB1c2goUSkpO3JldHVybiBRfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gZ20oKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBobShhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gaW0oYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiBDaigpe2Z1bmN0aW9uIGEoeixFLEYsSSxNLFApe3ZhciBRPWNbZV07dm9pZCAwPT09UT8oUT17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpJLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpNLGdyb3VwOlB9LGNbZV09USk6KFEuaWQ9ei5pZCxRLm9iamVjdD16LFEuZ2VvbWV0cnk9RSxRLm1hdGVyaWFsPUYsUS5wcm9ncmFtPUYucHJvZ3JhbXx8dixRLmdyb3VwT3JkZXI9SSxRLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUS56PU0sUS5ncm91cD1QKTsKZSsrO3JldHVybiBRfXZhciBjPVtdLGU9MCxnPVtdLHQ9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDp0LGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDt0Lmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEksTSxQKXt6PWEoeixFLEYsSSxNLFApOyghMD09PUYudHJhbnNwYXJlbnQ/dDpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEksTSxQKXt6PWEoeixFLEYsSSxNLFApOyghMD09PUYudHJhbnNwYXJlbnQ/dDpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KGhtKTsxPHQubGVuZ3RoJiZ0LnNvcnQoaW0pfX19ZnVuY3Rpb24gam0oKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHQ9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnQpe3ZhciB2PW5ldyBDajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj10LmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgQ2osdC5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24ga20oKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSCxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBILGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSCxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSCxncm91bmRDb2xvcjpuZXcgSH07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEgscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBsbShhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gbW0oKXtmb3IodmFyIGE9Cm5ldyBrbSxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGssdD1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgST0wLE09MCxQPTAsUT0wOzk+UTtRKyspYy5wcm9iZVtRXS5zZXQoMCwwLDApO3ZhciBVPUU9MCxWPTAsZWE9MCxkYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KGxtKTtRPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtRPHVhO1ErKyl7dmFyIG5hPXpbUV0sdGE9bmEuY29sb3IsQmE9bmEuaW50ZW5zaXR5LFRhPW5hLmRpc3RhbmNlLFVhPW5hLnNoYWRvdyYmbmEuc2hhZG93Lm1hcD9uYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihuYS5pc0FtYmllbnRMaWdodClJKz10YS5yKkJhLE0rPXRhLmcqQmEsUCs9dGEuYipCYTtlbHNlIGlmKG5hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG5hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYobmEuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQobmEpO0NhLmNvbG9yLmNvcHkobmEuY29sb3IpLm11bHRpcGx5U2NhbGFyKG5hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1uYS5jYXN0U2hhZG93KUJhPW5hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW5hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG5hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChuYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG5hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihuYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG5hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhuYS5hbmdsZSooMS1uYS5wZW51bWJyYSkpO0NhLmRlY2F5PW5hLmRlY2F5O2lmKENhLnNoYWRvdz1uYS5jYXN0U2hhZG93KUJhPW5hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ZdPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtWXT1uYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ZdPUNhO1YrK31lbHNlIGlmKG5hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChuYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksdC5jb3B5KG5hLm1hdHJpeFdvcmxkKSx0LnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHQpLENhLmhhbGZXaWR0aC5zZXQoLjUqbmEud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km5hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbZWFdPUNhLGVhKys7ZWxzZSBpZihuYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG5hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG5hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihuYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1uYS5kaXN0YW5jZTtDYS5kZWNheT1uYS5kZWNheTtpZihDYS5zaGFkb3c9bmEuY2FzdFNoYWRvdylCYT1uYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtVXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1VdPW5hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1VdPUNhO1UrK31lbHNlIG5hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQobmEpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obmEubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkobmEuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShuYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtkYV09Q2EsZGErKyl9Yy5hbWJpZW50WzBdPUk7Yy5hbWJpZW50WzFdPU07Yy5hbWJpZW50WzJdPVA7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1VfHx6LnNwb3RMZW5ndGghPT1WfHx6LnJlY3RBcmVhTGVuZ3RoIT09ZWF8fHouaGVtaUxlbmd0aCE9PWRhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVYsYy5yZWN0QXJlYS5sZW5ndGg9ZWEsYy5wb2ludC5sZW5ndGg9VSxjLmhlbWkubGVuZ3RoPWRhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9VSx6LnNwb3RMZW5ndGg9Vix6LnJlY3RBcmVhTGVuZ3RoPWVhLHouaGVtaUxlbmd0aD1kYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1ubSsrfSxzdGF0ZTpjfX1mdW5jdGlvbiBEaigpe3ZhciBhPW5ldyBtbSxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBvbSgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHQ9bmV3IERqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHQpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyh0PW5ldyBEaixjLmdldChlKS5zZXQoZyx0KSk6dD1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHR9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24geWQoYSl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHpkKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIEVqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1YudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1YudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1YudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxWLHJhLG51bGwpO2VhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtlYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7ZWEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGVhLHJhLG51bGwpfWZ1bmN0aW9uIHQodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9TTt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1QLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVFbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sUVtEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlVbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj10KHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXQodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGxjLEU9bmV3IGYsRj1uZXcgZixJPW5ldyBwLE09QXJyYXkoNCksUD1BcnJheSg0KSxRPXt9LFU9ezA6MSwxOjAsMjoyfSxWPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLAplYT1WLmNsb25lKCk7ZWEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBkYT1uZXcgdmE7ZGEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeWEoZGEsVik7Zm9yKGRhPTA7NCE9PWRhOysrZGEpe3ZhciBwYT0wIT09KGRhJjEpLHFhPTAhPT0oZGEmMiksdWE9bmV3IHlkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtNW2RhXT11YTtwYT1uZXcgemQoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1BbZGFdPXBhfXZhciBuYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1uYS5lbmFibGVkJiYoITEhPT1uYS5hdXRvVXBkYXRlfHwhMSE9PW5hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0kuc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChJKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1uYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBwbShhLGMsZSxnKXtmdW5jdGlvbiB0KGlhLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShpYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGlhLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShpYSwKMTAyNDAsOTcyOCk7Zm9yKGlhPTA7aWE8TGE7aWErKylhLnRleEltYWdlMkQoR2EraWEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoaWEsR2Epe3JhW2lhXT0xOzA9PT1wYVtpYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGlhKSxwYVtpYV09MSk7cWFbaWFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShpYSxHYSkscWFbaWFdPUdhKX1mdW5jdGlvbiB6KGlhKXshMCE9PXVhW2lhXSYmKGEuZW5hYmxlKGlhKSx1YVtpYV09ITApfWZ1bmN0aW9uIEUoaWEpeyExIT09dWFbaWFdJiYoYS5kaXNhYmxlKGlhKSx1YVtpYV09ITEpfWZ1bmN0aW9uIEYoaWEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1pYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWlhKXtpZihpYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGlhKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsaWEpfWVsc2Ugc3dpdGNoKGlhKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGlhKX1kYj1NYT1IYT1DYT1udWxsO1RhPWlhO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9aWE7dGI9bnVsbH19ZnVuY3Rpb24gSShpYSl7S2EhPT1pYSYmKGlhP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWlhKX1mdW5jdGlvbiBNKGlhKXswIT09aWE/KHooMjg4NCksaWEhPT1iYiYmKDE9PT1pYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09aWE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1pYX1mdW5jdGlvbiBQKGlhLEdhLExhKXtpZihpYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUShpYSl7dm9pZCAwPT09aWEmJihpYT0zMzk4NCtoYS0xKTt6YSE9PWlhJiYoYS5hY3RpdmVUZXh0dXJlKGlhKSx6YT1pYSl9dmFyIFU9bmV3IGZ1bmN0aW9uKCl7dmFyIGlhPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGlhfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtpYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGlhPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGlhfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7aWE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7bmI9TGE9R2E9bnVsbH19fSxlYT1uZXcgZnVuY3Rpb24oKXt2YXIgaWE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtpYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGlhfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2lhPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7aWE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxkYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZGEpLHBhPW5ldyBVaW50OEFycmF5KGRhKSxxYT1uZXcgVWludDhBcnJheShkYSksdWE9e30sbmE9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaGE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLAptYT0hMTtkYT0wO2RhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZGEuaW5kZXhPZigiV2ViR0wiKT8oZGE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZGEpWzFdKSxtYT0xPD1kYSk6LTEhPT1kYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGRhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhkYSlbMV0pLG1hPTI8PWRhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT10KDM1NTMsMzU1MywxKTtjYlszNDA2N109dCgzNDA2NywzNDA2OSw2KTtVLnNldENsZWFyKDAsMCwwLDEpO1Yuc2V0Q2xlYXIoMSk7ZWEuc2V0Q2xlYXIoMCk7eigyOTI5KTtWLnNldEZ1bmMoMyk7SSghMSk7TSgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlUsZGVwdGg6VixzdGVuY2lsOmVhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgaWE9MCxHYT1yYS5sZW5ndGg7aWE8R2E7aWErKylyYVtpYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihpYSl7dihpYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBpYT0wLEdhPXBhLmxlbmd0aDtpYSE9PUdhOysraWEpcGFbaWFdIT09cmFbaWFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaWEpLHBhW2lhXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1uYSYmKG5hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBpYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxpYS5sZW5ndGg7R2ErKyluYS5wdXNoKGlhW0dhXSk7CnJldHVybiBuYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihpYSl7cmV0dXJuIHRhIT09aWE/KGEudXNlUHJvZ3JhbShpYSksdGE9aWEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGlhLEdhKXsyPT09aWEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1pYS5zaWRlO0dhJiYoTGE9IUxhKTtJKExhKTsxPT09aWEuYmxlbmRpbmcmJiExPT09aWEudHJhbnNwYXJlbnQ/RigwKTpGKGlhLmJsZW5kaW5nLGlhLmJsZW5kRXF1YXRpb24saWEuYmxlbmRTcmMsaWEuYmxlbmREc3QsaWEuYmxlbmRFcXVhdGlvbkFscGhhLGlhLmJsZW5kU3JjQWxwaGEsaWEuYmxlbmREc3RBbHBoYSxpYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1Yuc2V0RnVuYyhpYS5kZXB0aEZ1bmMpO1Yuc2V0VGVzdChpYS5kZXB0aFRlc3QpO1Yuc2V0TWFzayhpYS5kZXB0aFdyaXRlKTtVLnNldE1hc2soaWEuY29sb3JXcml0ZSk7R2E9aWEuc3RlbmNpbFdyaXRlO2VhLnNldFRlc3QoR2EpO0dhJiYKKGVhLnNldEZ1bmMoaWEuc3RlbmNpbEZ1bmMsaWEuc3RlbmNpbFJlZixpYS5zdGVuY2lsTWFzayksZWEuc2V0T3AoaWEuc3RlbmNpbEZhaWwsaWEuc3RlbmNpbFpGYWlsLGlhLnN0ZW5jaWxaUGFzcykpO1AoaWEucG9seWdvbk9mZnNldCxpYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGlhLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpJLHNldEN1bGxGYWNlOk0sc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGlhKXtpYSE9PWpiJiYobWEmJmEubGluZVdpZHRoKGlhKSxqYj1pYSl9LHNldFBvbHlnb25PZmZzZXQ6UCxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihpYSl7aWE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlEsYmluZFRleHR1cmU6ZnVuY3Rpb24oaWEsR2Epe251bGw9PT16YSYmUSgpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWlhfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoaWEsR2F8fGNiW2lhXSksTGEudHlwZT1pYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChpYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGlhKX19LHNjaXNzb3I6ZnVuY3Rpb24oaWEpeyExPT09WWEuZXF1YWxzKGlhKSYmKGEuc2Npc3NvcihpYS54LGlhLnksaWEueixpYS53KSxZYS5jb3B5KGlhKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGlhKXshMT09PQpOYS5lcXVhbHMoaWEpJiYoYS52aWV3cG9ydChpYS54LGlhLnksaWEueixpYS53KSxOYS5jb3B5KGlhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBpYT0wO2lhPHBhLmxlbmd0aDtpYSsrKTE9PT1wYVtpYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpYSkscGFbaWFdPTApO3VhPXt9O3phPW5hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtVLnJlc2V0KCk7Vi5yZXNldCgpO2VhLnJlc2V0KCl9fX1mdW5jdGlvbiBxbShhLGMsZSxnLHQsdix6KXtmdW5jdGlvbiBFKGhhLG1hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhoYSxtYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihoYSxtYSx6YSxKYSl7dmFyIFlhPTE7aWYoaGEud2lkdGg+SmF8fGhhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChoYS53aWR0aCxoYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bWEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZoYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bWE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbWE9SmEoWWEqaGEud2lkdGgpLFlhPUphKFlhKmhhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG1hLFlhKSksemE9emE/RShtYSxZYSk6S2EsemEud2lkdGg9bWEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGhhLDAsMCxtYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitoYS53aWR0aCsieCIraGEuaGVpZ2h0KyIpIHRvICgiK21hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaGEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitoYS53aWR0aCsieCIraGEuaGVpZ2h0KyIpLiIpfXJldHVybiBoYX1mdW5jdGlvbiBJKGhhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGhhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGhhLmhlaWdodCl9ZnVuY3Rpb24gTShoYSl7cmV0dXJuIHQuaXNXZWJHTDI/ITE6MTAwMSE9PWhhLndyYXBTfHwxMDAxIT09aGEud3JhcFR8fDEwMDMhPT1oYS5taW5GaWx0ZXImJjEwMDYhPT1oYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUChoYSxtYSl7cmV0dXJuIGhhLmdlbmVyYXRlTWlwbWFwcyYmbWEmJjEwMDMhPT1oYS5taW5GaWx0ZXImJjEwMDYhPT1oYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUShoYSxtYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChoYSk7Zy5nZXQobWEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBVKGhhLG1hKXtpZighdC5pc1dlYkdMMilyZXR1cm4gaGE7dmFyIHphPWhhOzY0MDM9PT1oYSYmKDUxMjY9PT1tYSYmKHphPTMzMzI2KSw1MTMxPT09bWEmJih6YT0zMzMyNSksNTEyMT09PW1hJiYoemE9MzMzMjEpKTs2NDA3PT09aGEmJig1MTI2PT09bWEmJih6YT0zNDgzNyksNTEzMT09PW1hJiYoemE9MzQ4NDMpLDUxMjE9PT1tYSYmKHphPTMyODQ5KSk7NjQwOD09PWhhJiYoNTEyNj09PW1hJiYoemE9MzQ4MzYpLDUxMzE9PT1tYSYmKHphPTM0ODQyKSw1MTIxPT09bWEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVihoYSl7cmV0dXJuIDEwMDM9PT1oYXx8MTAwND09PWhhfHwxMDA1PT09aGE/OTcyODo5NzI5fWZ1bmN0aW9uIGVhKGhhKXtoYT1oYS50YXJnZXQ7aGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZWEpO3JhKGhhKTtoYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGhhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGRhKGhhKXtoYT1oYS50YXJnZXQ7aGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZGEpO3BhKGhhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGhhKXt2YXIgbWE9Zy5nZXQoaGEpO3ZvaWQgMCE9PW1hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG1hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShoYSkpfWZ1bmN0aW9uIHBhKGhhKXt2YXIgbWE9Zy5nZXQoaGEpLHphPWcuZ2V0KGhhLnRleHR1cmUpO2lmKGhhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaGEuZGVwdGhUZXh0dXJlJiZoYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG1hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG1hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobWEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG1hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbWEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihtYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGhhLnRleHR1cmUpO2cucmVtb3ZlKGhhKX19ZnVuY3Rpb24gcWEoaGEsbWEpe3ZhciB6YT1nLmdldChoYSk7aGEuaXNWaWRlb1RleHR1cmUmJmRiKGhhKTtpZigwPGhhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWhhLnZlcnNpb24pe3ZhciBKYT1oYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxoYSxtYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbWEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaGEsbWEpe2lmKDY9PT1oYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChoYSk7aWYoMDxoYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1oYS52ZXJzaW9uKXtCYSh6YSxoYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K21hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGhhLmZsaXBZKTt2YXIgSmE9aGEmJmhhLmlzQ29tcHJlc3NlZFRleHR1cmU7bWE9aGEuaW1hZ2VbMF0mJmhhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxtYT9tYT9oYS5pbWFnZVtOYV0uaW1hZ2U6aGEuaW1hZ2VbTmFdOkYoaGEuaW1hZ2VbTmFdLCExLCEwLHQubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxpYT1JKGNiKXx8dC5pc1dlYkdMMixHYT12LmNvbnZlcnQoaGEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaGEudHlwZSksbmI9VShHYSxMYSk7dGEoMzQwNjcsaGEsaWEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aGEuZm9ybWF0JiYxMDIyIT09aGEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWhhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG1hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVAoaGEsCmlhKSYmUSgzNDA2NyxoYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1oYS52ZXJzaW9uO2lmKGhhLm9uVXBkYXRlKWhhLm9uVXBkYXRlKGhhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCttYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG5hKGhhLG1hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbWEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaGEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShoYSxtYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShoYSwxMDI0Mix2LmNvbnZlcnQobWEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaGEsMTAyNDMsdi5jb252ZXJ0KG1hLndyYXBUKSksMzI4NzkhPT1oYSYmMzU4NjYhPT1oYXx8YS50ZXhQYXJhbWV0ZXJpKGhhLDMyODgyLHYuY29udmVydChtYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MCx2LmNvbnZlcnQobWEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGhhLAoxMDI0MSx2LmNvbnZlcnQobWEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaGEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MywzMzA3MSksMzI4NzkhPT1oYSYmMzU4NjYhPT1oYXx8YS50ZXhQYXJhbWV0ZXJpKGhhLDMyODgyLDMzMDcxKSwxMDAxPT09bWEud3JhcFMmJjEwMDE9PT1tYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MCxWKG1hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShoYSwxMDI0MSxWKG1hLm1pbkZpbHRlcikpLDEwMDMhPT1tYS5taW5GaWx0ZXImJjEwMDYhPT1tYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bWEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW1hLnR5cGUmJm51bGw9PT0odC5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bWEuYW5pc290cm9weXx8Zy5nZXQobWEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGhhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG1hLmFuaXNvdHJvcHksdC5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChtYSkuX19jdXJyZW50QW5pc290cm9weT1tYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShoYSxtYSl7dm9pZCAwPT09aGEuX193ZWJnbEluaXQmJihoYS5fX3dlYmdsSW5pdD0hMCxtYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixlYSksaGEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGhhLG1hLHphKXt2YXIgSmE9MzU1MzttYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTttYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaGEsbWEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxoYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxtYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxtYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbWEudW5wYWNrQWxpZ25tZW50KTt6YT1NKG1hKSYmITE9PT1JKG1hLmltYWdlKTt6YT1GKG1hLmltYWdlLHphLCExLHQubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1JKHphKXx8dC5pc1dlYkdMMixOYT12LmNvbnZlcnQobWEuZm9ybWF0KSxjYj12LmNvbnZlcnQobWEudHlwZSksaWE9VShOYSxjYik7dGEoSmEsbWEsWWEpO3ZhciBHYT1tYS5taXBtYXBzO2lmKG1hLmlzRGVwdGhUZXh0dXJlKXtpYT0KNjQwMjtpZigxMDE1PT09bWEudHlwZSl7aWYoIXQuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtpYT0zNjAxMn1lbHNlIHQuaXNXZWJHTDImJihpYT0zMzE4OSk7MTAyNj09PW1hLmZvcm1hdCYmNjQwMj09PWlhJiYxMDEyIT09bWEudHlwZSYmMTAxNCE9PW1hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxtYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG1hLnR5cGUpKTsxMDI3PT09bWEuZm9ybWF0JiYoaWE9MzQwNDEsMTAyMCE9PW1hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbWEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobWEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGlhLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobWEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsaWEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bWEuZ2VuZXJhdGVNaXBtYXBzPSExO2hhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGlhLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGhhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG1hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bWEuZm9ybWF0JiYxMDIyIT09bWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxpYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxpYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtoYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobWEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsaWEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaGEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobWEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGlhLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGhhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxpYSxOYSxjYixKYSk7bWEuZ2VuZXJhdGVNaXBtYXBzPSExO2hhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGlhLE5hLGNiLHphKSxoYS5fX21heE1pcExldmVsPTA7UChtYSxZYSkmJlEoMzU1MyxtYSx6YS53aWR0aCx6YS5oZWlnaHQpO2hhLl9fdmVyc2lvbj1tYS52ZXJzaW9uO2lmKG1hLm9uVXBkYXRlKW1hLm9uVXBkYXRlKG1hKX1mdW5jdGlvbiBVYShoYSxtYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChtYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG1hLnRleHR1cmUudHlwZSksY2I9VShZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbWEud2lkdGgsbWEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaGEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG1hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGhhLG1hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaGEpO2lmKG1hLmRlcHRoQnVmZmVyJiYhbWEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobWEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG1hLndpZHRoLG1hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxtYS53aWR0aCxtYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaGEpO2Vsc2UgaWYobWEuZGVwdGhCdWZmZXImJm1hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG1hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixtYS53aWR0aCxtYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm1hLndpZHRoLG1hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxoYSk7ZWxzZXtoYT12LmNvbnZlcnQobWEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobWEudGV4dHVyZS50eXBlKTtoYT1VKGhhLEphKTt6YT8oemE9TWEobWEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGhhLG1hLndpZHRoLG1hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxoYSxtYS53aWR0aCxtYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShoYSxtYSl7aWYobWEmJm1hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaGEpO2lmKCFtYS5kZXB0aFRleHR1cmV8fCFtYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobWEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbWEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bWEud2lkdGgmJm1hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1tYS5oZWlnaHR8fChtYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bWEud2lkdGgsbWEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1tYS5oZWlnaHQsbWEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShtYS5kZXB0aFRleHR1cmUsMCk7aGE9Zy5nZXQobWEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bWEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaGEsMCk7ZWxzZSBpZigxMDI3PT09bWEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaGEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShoYSl7dmFyIG1hPWcuZ2V0KGhhKSx6YT0hMD09PWhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGhhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobWEuX193ZWJnbEZyYW1lYnVmZmVyLGhhKX1lbHNlIGlmKHphKWZvcihtYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbWEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbWEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG1hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saGEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbWEuX193ZWJnbEZyYW1lYnVmZmVyKSxtYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShtYS5fX3dlYmdsRGVwdGhidWZmZXIsCmhhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShoYSl7cmV0dXJuIHQuaXNXZWJHTDImJmhhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbih0Lm1heFNhbXBsZXMsaGEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihoYSl7dmFyIG1hPXoucmVuZGVyLmZyYW1lO3RiLmdldChoYSkhPT1tYSYmKHRiLnNldChoYSxtYSksaGEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaGE9amI7aGE+PXQubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2hhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrdC5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGhhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaGEsbWEpe3ZhciB6YT1nLmdldChoYSk7MDxoYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1oYS52ZXJzaW9uP1RhKHphLGhhLG1hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K21hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGhhLG1hKXt2YXIgemE9Zy5nZXQoaGEpOzA8aGEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aGEudmVyc2lvbj9UYSh6YSxoYSxtYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCttYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW5hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaGEpe3ZhciBtYT1nLmdldChoYSksemE9Zy5nZXQoaGEudGV4dHVyZSk7CmhhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGRhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWhhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aGEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUkoaGEpfHx0LmlzV2ViR0wyO2lmKEphKWZvcihtYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbWEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihtYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHQuaXNXZWJHTDIpe21hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bWEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG1hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChoYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChoYS50ZXh0dXJlLnR5cGUpO1lhPVUoWWEsY2IpO2NiPU1hKGhhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxoYS53aWR0aCxoYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG1hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxtYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtoYS5kZXB0aEJ1ZmZlciYmKG1hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG1hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixoYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxoYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobWEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxoYSwzNjA2NCwzNDA2OStZYSk7UChoYS50ZXh0dXJlLE5hKSYmUSgzNDA2NyxoYS50ZXh0dXJlLGhhLndpZHRoLGhhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxoYS50ZXh0dXJlLE5hKSxVYShtYS5fX3dlYmdsRnJhbWVidWZmZXIsaGEsMzYwNjQsMzU1MyksUChoYS50ZXh0dXJlLE5hKSYmUSgzNTUzLGhhLnRleHR1cmUsaGEud2lkdGgsaGEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aGEuZGVwdGhCdWZmZXImJkRhKGhhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaGEpe3ZhciBtYT1oYS50ZXh0dXJlLHphPUkoaGEpfHwKdC5pc1dlYkdMMjtpZihQKG1hLHphKSl7emE9aGEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobWEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1EoemEsbWEsaGEud2lkdGgsaGEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihoYSl7aWYoaGEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHQuaXNXZWJHTDIpe3ZhciBtYT1nLmdldChoYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbWEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxtYS5fX3dlYmdsRnJhbWVidWZmZXIpO21hPWhhLndpZHRoO3ZhciB6YT1oYS5oZWlnaHQsSmE9MTYzODQ7aGEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtoYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbWEsemEsMCwwLG1hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihoYSxtYSl7aGEmJmhhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGhhPWhhLnRleHR1cmUpO3FhKGhhLG1hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaGEsbWEpe2hhJiZoYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxoYT1oYS50ZXh0dXJlKTtoYSYmaGEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShoYS5pbWFnZSkmJjY9PT1oYS5pbWFnZS5sZW5ndGg/dWEoaGEsbWEpOm5hKGhhLG1hKX19ZnVuY3Rpb24gRmooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciB0PWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXQpcmV0dXJuIHQuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHQ9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXQpe2lmKDMzNzc2PT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiB0LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXQpe2lmKDM1ODQwPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gdC5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09dCkpcmV0dXJuIHQuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYodD1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09dClyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn10PWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXQpe2lmKDEwMz09PWcpcmV0dXJuIHQuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiB0Lk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0Mjt0PWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXQpcmV0dXJuIHQuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB3ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB3ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24gR2ooYSxjLGUpe0hqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTtJai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9SGouZGlzdGFuY2VUbyhJaiksdD1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej10WzE0XS8odFsxMF0tMSk7ZT10WzE0XS8odFsxMF0rMSk7dmFyIEU9KHRbOV0rMSkvdFs1XSxGPSh0WzldLTEpL3RbNV0sST0odFs4XS0xKS90WzBdLE09KHZbOF0rMSkvdlswXTt0PXoqSTt2PXoqTTtNPWcvKC1JK00pO0k9TSotSTtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSSk7YS50cmFuc2xhdGVaKE0pO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorTTt6PWUrTTthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHQtSSx2KyhnLUkpLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIFNoKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUkmJiEwPT09SS5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUkuZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCplYTtFPUhhLnJlbmRlckhlaWdodCplYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO25hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiB0KCl7Zm9yKHZhciBIYT0wO0hhPFEubGVuZ3RoO0hhKyspe3ZhciBEYT1RW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShVKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxJPW51bGwsTT1udWxsLFA9bnVsbCxRPVtdLFU9bmV3IHEsVj1uZXcgcSxlYT0xLGRhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoTT1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgbmE9bmV3IHZiO25hLnZpZXdwb3J0PW5ldyBwO25hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB3ZihbdWEsbmFdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1RW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB3ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsUVtIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSX07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoST1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7ZWE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtkYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihQPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZGE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7SS5kZXB0aE5lYXI9SGEubmVhcjtJLmRlcHRoRmFyPUhhLmZhcjtJLmdldEZyYW1lRGF0YShNKTtpZigibG9jYWwtZmxvb3IiPT09ZGEpe3ZhciBNYT1JLnN0YWdlUGFyYW1ldGVycztNYT9VLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6VS5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1NLnBvc2U7TWE9bnVsbCE9PVA/UDpIYTtNYS5tYXRyaXguY29weShVKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVSkscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO25hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO25hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShNLmxlZnRWaWV3TWF0cml4KTtuYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KE0ucmlnaHRWaWV3TWF0cml4KTtWLmdldEludmVyc2UoVSk7ImxvY2FsLWZsb29yIj09PWRhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFYpLG5hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShWKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksbmEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtuYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG5hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoTS5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7bmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoTS5yaWdodFByb2plY3Rpb25NYXRyaXgpO0dqKHRhLHVhLG5hKTtIYT1JLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihuYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3QoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVX07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGVjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSS5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEpqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUl9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFEubGVuZ3RoO3VhKyspVVt1YV09PT1xYS5pbnB1dFNvdXJjZSYmUVt1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gdCgpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7ST1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEk9bnVsbCxNPSJsb2NhbC1mbG9vciIsUD1udWxsLFE9W10sVT1bXSxWPW5ldyB2YjtWLmxheWVycy5lbmFibGUoMSk7Vi52aWV3cG9ydD1uZXcgcDt2YXIgZWE9bmV3IHZiO2VhLmxheWVycy5lbmFibGUoMik7ZWEudmlld3BvcnQ9bmV3IHA7dmFyIGRhPW5ldyB3ZihbVixlYV0pO2RhLmxheWVycy5lbmFibGUoMSk7ZGEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVFbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHdlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxRW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtNPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdCksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKE0pLnRoZW4odiksClU9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7VT1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhVKTtmb3IodmFyIHVhPTA7dWE8US5sZW5ndGg7dWErKylRW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1VW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxuYT1kYS5jYW1lcmFzO3ooZGEsdWEpO2Zvcih2YXIgdGE9MDt0YTxuYS5sZW5ndGg7dGErKyl6KG5hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShkYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtHaihkYSxWLGVhKTtyZXR1cm4gZGF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBlYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7UD11YS5nZXRWaWV3ZXJQb3NlKEkpO2lmKG51bGwhPT1QKXt2YXIgbmE9UC52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8bmEubGVuZ3RoO0JhKyspe3ZhciBUYT1uYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWRhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZGEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8US5sZW5ndGg7QmErKyl7bmE9UVtCYV07aWYodGE9VVtCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxJKSxudWxsIT09dGEpe25hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm5hLm1hdHJpeC5kZWNvbXBvc2UobmEucG9zaXRpb24sbmEucm90YXRpb24sbmEuc2NhbGUpO25hLnZpc2libGU9ITA7Y29udGludWV9bmEudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gVGgoYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/ZmM6MX1mdW5jdGlvbiBnKCl7TWI9bmV3IGRkKFJhKTtnYz1uZXcgTmIoUmEsTWIsYSk7Z2MuaXNXZWJHTDJ8fChNYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxNYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLE1iLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTWIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTWIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO01iLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7ClBjPW5ldyBGaihSYSxNYixnYyk7eWI9bmV3IHBtKFJhLE1iLFBjLGdjKTt5Yi5zY2lzc29yKFRiLmNvcHkoeGUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChMYi5jb3B5KHllKS5tdWx0aXBseVNjYWxhcihmYykuZmxvb3IoKSk7QWQ9bmV3IG1sKFJhKTtoYz1uZXcgZ207UWM9bmV3IHFtKFJhLE1iLHliLGhjLGdjLFBjLEFkKTt5Zz1uZXcgUWQoUmEpO1VoPW5ldyB3ZChSYSx5ZyxBZCk7emU9bmV3IHBsKFVoLEFkKTtLaj1uZXcgb2woUmEpO1JkPW5ldyBmbShpYSxNYixnYyk7emc9bmV3IGptO0FlPW5ldyBvbTtCZD1uZXcgdmQoaWEseWIsemUsbWEpO0xqPW5ldyBzYShSYSxNYixBZCxnYyk7TWo9bmV3IHdnKFJhLE1iLEFkLGdjKTtBZC5wcm9ncmFtcz1SZC5wcm9ncmFtcztpYS5jYXBhYmlsaXRpZXM9Z2M7aWEuZXh0ZW5zaW9ucz1NYjtpYS5wcm9wZXJ0aWVzPWhjO2lhLnJlbmRlckxpc3RzPXpnO2lhLnN0YXRlPXliO2lhLmluZm89QWR9ZnVuY3Rpb24gdChUKXtULnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFQpe1Q9VC50YXJnZXQ7VC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFQpfWZ1bmN0aW9uIEUoVCl7RihUKTtoYy5yZW1vdmUoVCl9ZnVuY3Rpb24gRihUKXt2YXIgWT1oYy5nZXQoVCkucHJvZ3JhbTtULnByb2dyYW09dm9pZCAwO3ZvaWQgMCE9PVkmJlJkLnJlbGVhc2VQcm9ncmFtKFkpfWZ1bmN0aW9uIEkoVCxZKXtULnJlbmRlcihmdW5jdGlvbihsYSl7aWEucmVuZGVyQnVmZmVySW1tZWRpYXRlKGxhLFkpfSl9ZnVuY3Rpb24gTShULFksbGEpe2lmKGxhJiZsYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZ2MuaXNXZWJHTDImJm51bGw9PT1NYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bGEuYXR0cmlidXRlcztZPVkuZ2V0QXR0cmlidXRlcygpO1Q9VC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcih2YXIgT2EgaW4gWSl7dmFyIGFiPVlbT2FdO2lmKDA8PWFiKXt2YXIgUGE9SWFbT2FdO2lmKHZvaWQgMCE9PVBhKXt2YXIgZmI9UGEubm9ybWFsaXplZCxDYj1QYS5pdGVtU2l6ZSxvYj15Zy5nZXQoUGEpO2lmKHZvaWQgMCE9PW9iKXt2YXIgJGE9b2IuYnVmZmVyLFJjPW9iLnR5cGU7b2I9b2IuYnl0ZXNQZXJFbGVtZW50O2lmKFBhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe3ZhciB6Yz1QYS5kYXRhLEJlPXpjLnN0cmlkZTtQYT1QYS5vZmZzZXQ7emMmJnpjLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsemMubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bGEubWF4SW5zdGFuY2VkQ291bnQmJihsYS5tYXhJbnN0YW5jZWRDb3VudD16Yy5tZXNoUGVyQXR0cmlidXRlKgp6Yy5jb3VudCkpOnliLmVuYWJsZUF0dHJpYnV0ZShhYik7UmEuYmluZEJ1ZmZlcigzNDk2MiwkYSk7UmEudmVydGV4QXR0cmliUG9pbnRlcihhYixDYixSYyxmYixCZSpvYixQYSpvYil9ZWxzZSBQYS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8oeWIuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcihhYixQYS5tZXNoUGVyQXR0cmlidXRlKSx2b2lkIDA9PT1sYS5tYXhJbnN0YW5jZWRDb3VudCYmKGxhLm1heEluc3RhbmNlZENvdW50PVBhLm1lc2hQZXJBdHRyaWJ1dGUqUGEuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpLFJhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUmMsZmIsMCwwKX19ZWxzZSBpZih2b2lkIDAhPT1UJiYoZmI9VFtPYV0sdm9pZCAwIT09ZmIpKXN3aXRjaChmYi5sZW5ndGgpe2Nhc2UgMjpSYS52ZXJ0ZXhBdHRyaWIyZnYoYWIsZmIpO2JyZWFrO2Nhc2UgMzpSYS52ZXJ0ZXhBdHRyaWIzZnYoYWIsZmIpO2JyZWFrOwpjYXNlIDQ6UmEudmVydGV4QXR0cmliNGZ2KGFiLGZiKTticmVhaztkZWZhdWx0OlJhLnZlcnRleEF0dHJpYjFmdihhYixmYil9fX15Yi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpfX1mdW5jdGlvbiBQKFQsWSxsYSxJYSl7aWYoITEhPT1ULnZpc2libGUpe2lmKFQubGF5ZXJzLnRlc3QoWS5sYXllcnMpKWlmKFQuaXNHcm91cClsYT1ULnJlbmRlck9yZGVyO2Vsc2UgaWYoVC5pc0xPRCkhMD09PVQuYXV0b1VwZGF0ZSYmVC51cGRhdGUoWSk7ZWxzZSBpZihULmlzTGlnaHQpY2IucHVzaExpZ2h0KFQpLFQuY2FzdFNoYWRvdyYmY2IucHVzaFNoYWRvdyhUKTtlbHNlIGlmKFQuaXNTcHJpdGUpe2lmKCFULmZydXN0dW1DdWxsZWR8fFZoLmludGVyc2VjdHNTcHJpdGUoVCkpe0lhJiZDZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHhmKTt2YXIgT2E9emUudXBkYXRlKFQpLGFiPVQubWF0ZXJpYWw7YWIudmlzaWJsZSYmTmEucHVzaChULE9hLGFiLApsYSxDZC56LG51bGwpfX1lbHNlIGlmKFQuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QpSWEmJkNkLnNldEZyb21NYXRyaXhQb3NpdGlvbihULm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoeGYpLE5hLnB1c2goVCxudWxsLFQubWF0ZXJpYWwsbGEsQ2QueixudWxsKTtlbHNlIGlmKFQuaXNNZXNofHxULmlzTGluZXx8VC5pc1BvaW50cylpZihULmlzU2tpbm5lZE1lc2gmJlQuc2tlbGV0b24udXBkYXRlKCksIVQuZnJ1c3R1bUN1bGxlZHx8VmguaW50ZXJzZWN0c09iamVjdChUKSlpZihJYSYmQ2Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh4ZiksT2E9emUudXBkYXRlKFQpLGFiPVQubWF0ZXJpYWwsQXJyYXkuaXNBcnJheShhYikpZm9yKHZhciBQYT1PYS5ncm91cHMsZmI9MCxDYj1QYS5sZW5ndGg7ZmI8Q2I7ZmIrKyl7dmFyIG9iPVBhW2ZiXSwkYT1hYltvYi5tYXRlcmlhbEluZGV4XTskYSYmJGEudmlzaWJsZSYmTmEucHVzaChULE9hLCRhLApsYSxDZC56LG9iKX1lbHNlIGFiLnZpc2libGUmJk5hLnB1c2goVCxPYSxhYixsYSxDZC56LG51bGwpO1Q9VC5jaGlsZHJlbjtmYj0wO2ZvcihDYj1ULmxlbmd0aDtmYjxDYjtmYisrKVAoVFtmYl0sWSxsYSxJYSl9fWZ1bmN0aW9uIFEoVCxZLGxhLElhKXtmb3IodmFyIE9hPTAsYWI9VC5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVRbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihsYS5pc0FycmF5Q2FtZXJhKXtzYj1sYTtmb3IodmFyICRhPWxhLmNhbWVyYXMsUmM9MCx6Yz0kYS5sZW5ndGg7UmM8emM7UmMrKyl7dmFyIEJlPSRhW1JjXTtmYi5sYXllcnMudGVzdChCZS5sYXllcnMpJiYoeWIudmlld3BvcnQoTGIuY29weShCZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKEJlKSxVKGZiLFksQmUsQ2Isb2IsUGEpKX19ZWxzZSBzYj1udWxsLFUoZmIsWSxsYSxDYixvYixQYSl9fWZ1bmN0aW9uIFUoVCwKWSxsYSxJYSxPYSxhYil7VC5vbkJlZm9yZVJlbmRlcihpYSxZLGxhLElhLE9hLGFiKTtjYj1BZS5nZXQoWSxzYnx8bGEpO1QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMobGEubWF0cml4V29ybGRJbnZlcnNlLFQubWF0cml4V29ybGQpO1Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeChULm1vZGVsVmlld01hdHJpeCk7VC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD8oeWIuc2V0TWF0ZXJpYWwoT2EpLElhPWVhKGxhLFkuZm9nLE9hLFQpLGViPWM9bnVsbCxtYj0hMSxJKFQsSWEpKTppYS5yZW5kZXJCdWZmZXJEaXJlY3QobGEsWS5mb2csSWEsT2EsVCxhYik7Y2I9QWUuZ2V0KFksc2J8fGxhKX1mdW5jdGlvbiBWKFQsWSxsYSl7dmFyIElhPWhjLmdldChUKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjtsYT1SZC5nZXRQYXJhbWV0ZXJzKFQsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LFksQWMubnVtUGxhbmVzLEFjLm51bUludGVyc2VjdGlvbiwKbGEpO3ZhciBQYT1SZC5nZXRQcm9ncmFtQ29kZShULGxhKSxmYj1JYS5wcm9ncmFtLENiPSEwO2lmKHZvaWQgMD09PWZiKVQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseik7ZWxzZSBpZihmYi5jb2RlIT09UGEpRihUKTtlbHNle2lmKElhLmxpZ2h0c1N0YXRlVmVyc2lvbiE9PWFiKUlhLmxpZ2h0c1N0YXRlVmVyc2lvbj1hYjtlbHNlIGlmKHZvaWQgMCE9PWxhLnNoYWRlcklEKXJldHVybjtDYj0hMX1DYiYmKGxhLnNoYWRlcklEPyhQYT1PY1tsYS5zaGFkZXJJRF0sSWEuc2hhZGVyPXtuYW1lOlQudHlwZSx1bmlmb3Jtczp1YihQYS51bmlmb3JtcyksdmVydGV4U2hhZGVyOlBhLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpQYS5mcmFnbWVudFNoYWRlcn0pOklhLnNoYWRlcj17bmFtZTpULnR5cGUsdW5pZm9ybXM6VC51bmlmb3Jtcyx2ZXJ0ZXhTaGFkZXI6VC52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6VC5mcmFnbWVudFNoYWRlcn0sUGE9UmQuZ2V0UHJvZ3JhbUNvZGUoVCwKbGEpLGZiPVJkLmFjcXVpcmVQcm9ncmFtKFQsSWEuc2hhZGVyLGxhLFBhKSxJYS5wcm9ncmFtPWZiLFQucHJvZ3JhbT1mYik7bGE9ZmIuZ2V0QXR0cmlidXRlcygpO2lmKFQubW9ycGhUYXJnZXRzKWZvcihQYT1ULm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cz0wO1BhPGlhLm1heE1vcnBoVGFyZ2V0cztQYSsrKTA8PWxhWyJtb3JwaFRhcmdldCIrUGFdJiZULm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cysrO2lmKFQubW9ycGhOb3JtYWxzKWZvcihQYT1ULm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscz0wO1BhPGlhLm1heE1vcnBoTm9ybWFscztQYSsrKTA8PWxhWyJtb3JwaE5vcm1hbCIrUGFdJiZULm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscysrO2xhPUlhLnNoYWRlci51bmlmb3JtcztpZighVC5pc1NoYWRlck1hdGVyaWFsJiYhVC5pc1Jhd1NoYWRlck1hdGVyaWFsfHwhMD09PVQuY2xpcHBpbmcpSWEubnVtQ2xpcHBpbmdQbGFuZXM9QWMubnVtUGxhbmVzLElhLm51bUludGVyc2VjdGlvbj0KQWMubnVtSW50ZXJzZWN0aW9uLGxhLmNsaXBwaW5nUGxhbmVzPUFjLnVuaWZvcm07SWEuZm9nPVk7SWEubGlnaHRzU3RhdGVWZXJzaW9uPWFiO1QubGlnaHRzJiYobGEuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9T2Euc3RhdGUuYW1iaWVudCxsYS5saWdodFByb2JlLnZhbHVlPU9hLnN0YXRlLnByb2JlLGxhLmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmRpcmVjdGlvbmFsLGxhLnNwb3RMaWdodHMudmFsdWU9T2Euc3RhdGUuc3BvdCxsYS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5yZWN0QXJlYSxsYS5wb2ludExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5wb2ludCxsYS5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlPU9hLnN0YXRlLmhlbWksbGEuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsbGEuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgsbGEuc3BvdFNoYWRvd01hcC52YWx1ZT0KT2Euc3RhdGUuc3BvdFNoYWRvd01hcCxsYS5zcG90U2hhZG93TWF0cml4LnZhbHVlPU9hLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsbGEucG9pbnRTaGFkb3dNYXAudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXAsbGEucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO1Q9SWEucHJvZ3JhbS5nZXRVbmlmb3JtcygpO1Q9eGQuc2VxV2l0aFZhbHVlKFQuc2VxLGxhKTtJYS51bmlmb3Jtc0xpc3Q9VH1mdW5jdGlvbiBlYShULFksbGEsSWEpe1FjLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWhjLmdldChsYSksYWI9Y2Iuc3RhdGUubGlnaHRzO0FnJiYoV2h8fFQhPT1wYikmJkFjLnNldFN0YXRlKGxhLmNsaXBwaW5nUGxhbmVzLGxhLmNsaXBJbnRlcnNlY3Rpb24sbGEuY2xpcFNoYWRvd3MsVCxPYSxUPT09cGImJmxhLmlkPT09UWEpOyExPT09bGEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtP2xhLm5lZWRzVXBkYXRlPSEwOgpsYS5mb2cmJk9hLmZvZyE9PVk/bGEubmVlZHNVcGRhdGU9ITA6bGEubGlnaHRzJiZPYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYi5zdGF0ZS52ZXJzaW9uP2xhLm5lZWRzVXBkYXRlPSEwOnZvaWQgMD09PU9hLm51bUNsaXBwaW5nUGxhbmVzfHxPYS5udW1DbGlwcGluZ1BsYW5lcz09PUFjLm51bVBsYW5lcyYmT2EubnVtSW50ZXJzZWN0aW9uPT09QWMubnVtSW50ZXJzZWN0aW9ufHwobGEubmVlZHNVcGRhdGU9ITApKTtsYS5uZWVkc1VwZGF0ZSYmKFYobGEsWSxJYSksbGEubmVlZHNVcGRhdGU9ITEpO3ZhciBQYT0hMSxmYj1hYj0hMSxDYj1PYS5wcm9ncmFtLG9iPUNiLmdldFVuaWZvcm1zKCksJGE9T2Euc2hhZGVyLnVuaWZvcm1zO3liLnVzZVByb2dyYW0oQ2IucHJvZ3JhbSkmJihmYj1hYj1QYT0hMCk7bGEuaWQhPT1RYSYmKFFhPWxhLmlkLGFiPSEwKTtpZihQYXx8cGIhPT1UKXtvYi5zZXRWYWx1ZShSYSwicHJvamVjdGlvbk1hdHJpeCIsVC5wcm9qZWN0aW9uTWF0cml4KTtnYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiYKb2Iuc2V0VmFsdWUoUmEsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFQuZmFyKzEpL01hdGguTE4yKSk7cGIhPT1UJiYocGI9VCxmYj1hYj0hMCk7aWYobGEuaXNTaGFkZXJNYXRlcmlhbHx8bGEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bGEuZW52TWFwKVBhPW9iLm1hcC5jYW1lcmFQb3NpdGlvbix2b2lkIDAhPT1QYSYmUGEuc2V0VmFsdWUoUmEsQ2Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFQubWF0cml4V29ybGQpKTsobGEuaXNNZXNoUGhvbmdNYXRlcmlhbHx8bGEuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxsYS5pc01lc2hCYXNpY01hdGVyaWFsfHxsYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxsYS5pc1NoYWRlck1hdGVyaWFsfHxsYS5za2lubmluZykmJm9iLnNldFZhbHVlKFJhLCJ2aWV3TWF0cml4IixULm1hdHJpeFdvcmxkSW52ZXJzZSl9aWYobGEuc2tpbm5pbmcmJihvYi5zZXRPcHRpb25hbChSYSxJYSwiYmluZE1hdHJpeCIpLApvYi5zZXRPcHRpb25hbChSYSxJYSwiYmluZE1hdHJpeEludmVyc2UiKSxUPUlhLnNrZWxldG9uKSlpZihQYT1ULmJvbmVzLGdjLmZsb2F0VmVydGV4VGV4dHVyZXMpe2lmKHZvaWQgMD09PVQuYm9uZVRleHR1cmUpe1BhPU1hdGguc3FydCg0KlBhLmxlbmd0aCk7UGE9aGIuY2VpbFBvd2VyT2ZUd28oUGEpO1BhPU1hdGgubWF4KFBhLDQpO3ZhciBSYz1uZXcgRmxvYXQzMkFycmF5KFBhKlBhKjQpO1JjLnNldChULmJvbmVNYXRyaWNlcyk7dmFyIHpjPW5ldyBBYihSYyxQYSxQYSwxMDIzLDEwMTUpO3pjLm5lZWRzVXBkYXRlPSEwO1QuYm9uZU1hdHJpY2VzPVJjO1QuYm9uZVRleHR1cmU9emM7VC5ib25lVGV4dHVyZVNpemU9UGF9b2Iuc2V0VmFsdWUoUmEsImJvbmVUZXh0dXJlIixULmJvbmVUZXh0dXJlLFFjKTtvYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmVTaXplIixULmJvbmVUZXh0dXJlU2l6ZSl9ZWxzZSBvYi5zZXRPcHRpb25hbChSYSxULCJib25lTWF0cmljZXMiKTthYiYmKG9iLnNldFZhbHVlKFJhLAoidG9uZU1hcHBpbmdFeHBvc3VyZSIsaWEudG9uZU1hcHBpbmdFeHBvc3VyZSksb2Iuc2V0VmFsdWUoUmEsInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsaWEudG9uZU1hcHBpbmdXaGl0ZVBvaW50KSxsYS5saWdodHMmJnRiKCRhLGZiKSxZJiZsYS5mb2cmJm5hKCRhLFkpLGxhLmlzTWVzaEJhc2ljTWF0ZXJpYWw/ZGEoJGEsbGEpOmxhLmlzTWVzaExhbWJlcnRNYXRlcmlhbD8oZGEoJGEsbGEpLHRhKCRhLGxhKSk6bGEuaXNNZXNoUGhvbmdNYXRlcmlhbD8oZGEoJGEsbGEpLGxhLmlzTWVzaFRvb25NYXRlcmlhbD9UYSgkYSxsYSk6QmEoJGEsbGEpKTpsYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhkYSgkYSxsYSksbGEuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD9DYSgkYSxsYSk6VWEoJGEsbGEpKTpsYS5pc01lc2hNYXRjYXBNYXRlcmlhbD8oZGEoJGEsbGEpLEhhKCRhLGxhKSk6bGEuaXNNZXNoRGVwdGhNYXRlcmlhbD8oZGEoJGEsbGEpLERhKCRhLGxhKSk6bGEuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD8KKGRhKCRhLGxhKSxNYSgkYSxsYSkpOmxhLmlzTWVzaE5vcm1hbE1hdGVyaWFsPyhkYSgkYSxsYSksZGIoJGEsbGEpKTpsYS5pc0xpbmVCYXNpY01hdGVyaWFsPyhyYSgkYSxsYSksbGEuaXNMaW5lRGFzaGVkTWF0ZXJpYWwmJnBhKCRhLGxhKSk6bGEuaXNQb2ludHNNYXRlcmlhbD9xYSgkYSxsYSk6bGEuaXNTcHJpdGVNYXRlcmlhbD91YSgkYSxsYSk6bGEuaXNTaGFkb3dNYXRlcmlhbCYmKCRhLmNvbG9yLnZhbHVlLmNvcHkobGEuY29sb3IpLCRhLm9wYWNpdHkudmFsdWU9bGEub3BhY2l0eSksdm9pZCAwIT09JGEubHRjXzEmJigkYS5sdGNfMS52YWx1ZT1XYS5MVENfMSksdm9pZCAwIT09JGEubHRjXzImJigkYS5sdGNfMi52YWx1ZT1XYS5MVENfMikseGQudXBsb2FkKFJhLE9hLnVuaWZvcm1zTGlzdCwkYSxRYykpO2xhLmlzU2hhZGVyTWF0ZXJpYWwmJiEwPT09bGEudW5pZm9ybXNOZWVkVXBkYXRlJiYoeGQudXBsb2FkKFJhLE9hLnVuaWZvcm1zTGlzdCwkYSxRYyksbGEudW5pZm9ybXNOZWVkVXBkYXRlPQohMSk7bGEuaXNTcHJpdGVNYXRlcmlhbCYmb2Iuc2V0VmFsdWUoUmEsImNlbnRlciIsSWEuY2VudGVyKTtvYi5zZXRWYWx1ZShSYSwibW9kZWxWaWV3TWF0cml4IixJYS5tb2RlbFZpZXdNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJub3JtYWxNYXRyaXgiLElhLm5vcm1hbE1hdHJpeCk7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsTWF0cml4IixJYS5tYXRyaXhXb3JsZCk7cmV0dXJuIENifWZ1bmN0aW9uIGRhKFQsWSl7VC5vcGFjaXR5LnZhbHVlPVkub3BhY2l0eTtZLmNvbG9yJiZULmRpZmZ1c2UudmFsdWUuY29weShZLmNvbG9yKTtZLmVtaXNzaXZlJiZULmVtaXNzaXZlLnZhbHVlLmNvcHkoWS5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIoWS5lbWlzc2l2ZUludGVuc2l0eSk7WS5tYXAmJihULm1hcC52YWx1ZT1ZLm1hcCk7WS5hbHBoYU1hcCYmKFQuYWxwaGFNYXAudmFsdWU9WS5hbHBoYU1hcCk7WS5zcGVjdWxhck1hcCYmKFQuc3BlY3VsYXJNYXAudmFsdWU9WS5zcGVjdWxhck1hcCk7WS5lbnZNYXAmJgooVC5lbnZNYXAudmFsdWU9WS5lbnZNYXAsVC5mbGlwRW52TWFwLnZhbHVlPVkuZW52TWFwLmlzQ3ViZVRleHR1cmU/LTE6MSxULnJlZmxlY3Rpdml0eS52YWx1ZT1ZLnJlZmxlY3Rpdml0eSxULnJlZnJhY3Rpb25SYXRpby52YWx1ZT1ZLnJlZnJhY3Rpb25SYXRpbyxULm1heE1pcExldmVsLnZhbHVlPWhjLmdldChZLmVudk1hcCkuX19tYXhNaXBMZXZlbCk7WS5saWdodE1hcCYmKFQubGlnaHRNYXAudmFsdWU9WS5saWdodE1hcCxULmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPVkubGlnaHRNYXBJbnRlbnNpdHkpO1kuYW9NYXAmJihULmFvTWFwLnZhbHVlPVkuYW9NYXAsVC5hb01hcEludGVuc2l0eS52YWx1ZT1ZLmFvTWFwSW50ZW5zaXR5KTtpZihZLm1hcCl2YXIgbGE9WS5tYXA7ZWxzZSBZLnNwZWN1bGFyTWFwP2xhPVkuc3BlY3VsYXJNYXA6WS5kaXNwbGFjZW1lbnRNYXA/bGE9WS5kaXNwbGFjZW1lbnRNYXA6WS5ub3JtYWxNYXA/bGE9WS5ub3JtYWxNYXA6WS5idW1wTWFwP2xhPVkuYnVtcE1hcDoKWS5yb3VnaG5lc3NNYXA/bGE9WS5yb3VnaG5lc3NNYXA6WS5tZXRhbG5lc3NNYXA/bGE9WS5tZXRhbG5lc3NNYXA6WS5hbHBoYU1hcD9sYT1ZLmFscGhhTWFwOlkuZW1pc3NpdmVNYXAmJihsYT1ZLmVtaXNzaXZlTWFwKTt2b2lkIDAhPT1sYSYmKGxhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihsYT1sYS50ZXh0dXJlKSwhMD09PWxhLm1hdHJpeEF1dG9VcGRhdGUmJmxhLnVwZGF0ZU1hdHJpeCgpLFQudXZUcmFuc2Zvcm0udmFsdWUuY29weShsYS5tYXRyaXgpKX1mdW5jdGlvbiByYShULFkpe1QuZGlmZnVzZS52YWx1ZS5jb3B5KFkuY29sb3IpO1Qub3BhY2l0eS52YWx1ZT1ZLm9wYWNpdHl9ZnVuY3Rpb24gcGEoVCxZKXtULmRhc2hTaXplLnZhbHVlPVkuZGFzaFNpemU7VC50b3RhbFNpemUudmFsdWU9WS5kYXNoU2l6ZStZLmdhcFNpemU7VC5zY2FsZS52YWx1ZT1ZLnNjYWxlfWZ1bmN0aW9uIHFhKFQsWSl7VC5kaWZmdXNlLnZhbHVlLmNvcHkoWS5jb2xvcik7VC5vcGFjaXR5LnZhbHVlPQpZLm9wYWNpdHk7VC5zaXplLnZhbHVlPVkuc2l6ZSpmYztULnNjYWxlLnZhbHVlPS41KkJjO1QubWFwLnZhbHVlPVkubWFwO251bGwhPT1ZLm1hcCYmKCEwPT09WS5tYXAubWF0cml4QXV0b1VwZGF0ZSYmWS5tYXAudXBkYXRlTWF0cml4KCksVC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KFkubWFwLm1hdHJpeCkpfWZ1bmN0aW9uIHVhKFQsWSl7VC5kaWZmdXNlLnZhbHVlLmNvcHkoWS5jb2xvcik7VC5vcGFjaXR5LnZhbHVlPVkub3BhY2l0eTtULnJvdGF0aW9uLnZhbHVlPVkucm90YXRpb247VC5tYXAudmFsdWU9WS5tYXA7bnVsbCE9PVkubWFwJiYoITA9PT1ZLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZZLm1hcC51cGRhdGVNYXRyaXgoKSxULnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoWS5tYXAubWF0cml4KSl9ZnVuY3Rpb24gbmEoVCxZKXtULmZvZ0NvbG9yLnZhbHVlLmNvcHkoWS5jb2xvcik7WS5pc0ZvZz8oVC5mb2dOZWFyLnZhbHVlPVkubmVhcixULmZvZ0Zhci52YWx1ZT1ZLmZhcik6ClkuaXNGb2dFeHAyJiYoVC5mb2dEZW5zaXR5LnZhbHVlPVkuZGVuc2l0eSl9ZnVuY3Rpb24gdGEoVCxZKXtZLmVtaXNzaXZlTWFwJiYoVC5lbWlzc2l2ZU1hcC52YWx1ZT1ZLmVtaXNzaXZlTWFwKX1mdW5jdGlvbiBCYShULFkpe1Quc3BlY3VsYXIudmFsdWUuY29weShZLnNwZWN1bGFyKTtULnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChZLnNoaW5pbmVzcywxRS00KTtZLmVtaXNzaXZlTWFwJiYoVC5lbWlzc2l2ZU1hcC52YWx1ZT1ZLmVtaXNzaXZlTWFwKTtZLmJ1bXBNYXAmJihULmJ1bXBNYXAudmFsdWU9WS5idW1wTWFwLFQuYnVtcFNjYWxlLnZhbHVlPVkuYnVtcFNjYWxlLDE9PT1ZLnNpZGUmJihULmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtZLm5vcm1hbE1hcCYmKFQubm9ybWFsTWFwLnZhbHVlPVkubm9ybWFsTWFwLFQubm9ybWFsU2NhbGUudmFsdWUuY29weShZLm5vcm1hbFNjYWxlKSwxPT09WS5zaWRlJiZULm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtZLmRpc3BsYWNlbWVudE1hcCYmCihULmRpc3BsYWNlbWVudE1hcC52YWx1ZT1ZLmRpc3BsYWNlbWVudE1hcCxULmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPVkuZGlzcGxhY2VtZW50U2NhbGUsVC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPVkuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gVGEoVCxZKXtCYShULFkpO1kuZ3JhZGllbnRNYXAmJihULmdyYWRpZW50TWFwLnZhbHVlPVkuZ3JhZGllbnRNYXApfWZ1bmN0aW9uIFVhKFQsWSl7VC5yb3VnaG5lc3MudmFsdWU9WS5yb3VnaG5lc3M7VC5tZXRhbG5lc3MudmFsdWU9WS5tZXRhbG5lc3M7WS5yb3VnaG5lc3NNYXAmJihULnJvdWdobmVzc01hcC52YWx1ZT1ZLnJvdWdobmVzc01hcCk7WS5tZXRhbG5lc3NNYXAmJihULm1ldGFsbmVzc01hcC52YWx1ZT1ZLm1ldGFsbmVzc01hcCk7WS5lbWlzc2l2ZU1hcCYmKFQuZW1pc3NpdmVNYXAudmFsdWU9WS5lbWlzc2l2ZU1hcCk7WS5idW1wTWFwJiYoVC5idW1wTWFwLnZhbHVlPVkuYnVtcE1hcCxULmJ1bXBTY2FsZS52YWx1ZT0KWS5idW1wU2NhbGUsMT09PVkuc2lkZSYmKFQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO1kubm9ybWFsTWFwJiYoVC5ub3JtYWxNYXAudmFsdWU9WS5ub3JtYWxNYXAsVC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkubm9ybWFsU2NhbGUpLDE9PT1ZLnNpZGUmJlQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1ZLmRpc3BsYWNlbWVudEJpYXMpO1kuZW52TWFwJiYoVC5lbnZNYXBJbnRlbnNpdHkudmFsdWU9WS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIENhKFQsWSl7VWEoVCxZKTtULnJlZmxlY3Rpdml0eS52YWx1ZT1ZLnJlZmxlY3Rpdml0eTtULmNsZWFyY29hdC52YWx1ZT1ZLmNsZWFyY29hdDtULmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1ZLmNsZWFyY29hdFJvdWdobmVzczsKWS5zaGVlbiYmVC5zaGVlbi52YWx1ZS5jb3B5KFkuc2hlZW4pO1kuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVC5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLFQuY2xlYXJjb2F0Tm9ybWFsTWFwLnZhbHVlPVkuY2xlYXJjb2F0Tm9ybWFsTWFwLDE9PT1ZLnNpZGUmJlQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1QudHJhbnNwYXJlbmN5LnZhbHVlPVkudHJhbnNwYXJlbmN5fWZ1bmN0aW9uIEhhKFQsWSl7WS5tYXRjYXAmJihULm1hdGNhcC52YWx1ZT1ZLm1hdGNhcCk7WS5idW1wTWFwJiYoVC5idW1wTWFwLnZhbHVlPVkuYnVtcE1hcCxULmJ1bXBTY2FsZS52YWx1ZT1ZLmJ1bXBTY2FsZSwxPT09WS5zaWRlJiYoVC5idW1wU2NhbGUudmFsdWUqPS0xKSk7WS5ub3JtYWxNYXAmJihULm5vcm1hbE1hcC52YWx1ZT1ZLm5vcm1hbE1hcCxULm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoWS5ub3JtYWxTY2FsZSksMT09PVkuc2lkZSYmClQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1ZLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIERhKFQsWSl7WS5kaXNwbGFjZW1lbnRNYXAmJihULmRpc3BsYWNlbWVudE1hcC52YWx1ZT1ZLmRpc3BsYWNlbWVudE1hcCxULmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPVkuZGlzcGxhY2VtZW50U2NhbGUsVC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPVkuZGlzcGxhY2VtZW50Qmlhcyl9ZnVuY3Rpb24gTWEoVCxZKXtZLmRpc3BsYWNlbWVudE1hcCYmKFQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPVkuZGlzcGxhY2VtZW50TWFwLFQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9WS5kaXNwbGFjZW1lbnRTY2FsZSxULmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ClkuZGlzcGxhY2VtZW50Qmlhcyk7VC5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KFkucmVmZXJlbmNlUG9zaXRpb24pO1QubmVhckRpc3RhbmNlLnZhbHVlPVkubmVhckRpc3RhbmNlO1QuZmFyRGlzdGFuY2UudmFsdWU9WS5mYXJEaXN0YW5jZX1mdW5jdGlvbiBkYihULFkpe1kuYnVtcE1hcCYmKFQuYnVtcE1hcC52YWx1ZT1ZLmJ1bXBNYXAsVC5idW1wU2NhbGUudmFsdWU9WS5idW1wU2NhbGUsMT09PVkuc2lkZSYmKFQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO1kubm9ybWFsTWFwJiYoVC5ub3JtYWxNYXAudmFsdWU9WS5ub3JtYWxNYXAsVC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KFkubm9ybWFsU2NhbGUpLDE9PT1ZLnNpZGUmJlQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1kuZGlzcGxhY2VtZW50TWFwJiYoVC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9WS5kaXNwbGFjZW1lbnRNYXAsVC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1ZLmRpc3BsYWNlbWVudFNjYWxlLFQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT0KWS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihULFkpe1QuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGU9WTtULmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9WTtULmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPVk7VC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1ZO1Quc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1ZO1QucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9WTtULmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9WX1hPWF8fHt9O3ZhciBLYT12b2lkIDAhPT1hLmNhbnZhcz9hLmNhbnZhczpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGhhPXZvaWQgMCE9PQphLmFudGlhbGlhcz9hLmFudGlhbGlhczohMSxtYT12b2lkIDAhPT1hLnByZW11bHRpcGxpZWRBbHBoYT9hLnByZW11bHRpcGxpZWRBbHBoYTohMCx6YT12b2lkIDAhPT1hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcj9hLnByZXNlcnZlRHJhd2luZ0J1ZmZlcjohMSxKYT12b2lkIDAhPT1hLnBvd2VyUHJlZmVyZW5jZT9hLnBvd2VyUHJlZmVyZW5jZToiZGVmYXVsdCIsWWE9dm9pZCAwIT09YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0P2EuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDohMSxOYT1udWxsLGNiPW51bGw7dGhpcy5kb21FbGVtZW50PUthO3RoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfTt0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9CjI7dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz10aGlzLmdhbW1hT3V0cHV0PXRoaXMuZ2FtbWFJbnB1dD0hMTt0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludD10aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9dGhpcy50b25lTWFwcGluZz0xO3RoaXMubWF4TW9ycGhUYXJnZXRzPTg7dGhpcy5tYXhNb3JwaE5vcm1hbHM9NDt2YXIgaWE9dGhpcyxHYT0hMSxMYT1udWxsLG5iPTAsVmE9MCxpYj1udWxsLGtiPW51bGwsUWE9LTE7dmFyIGViPWM9bnVsbDt2YXIgbWI9ITE7dmFyIHBiPW51bGwsc2I9bnVsbCxMYj1uZXcgcCxUYj1uZXcgcCxxYz1udWxsLFNjPUthLndpZHRoLEJjPUthLmhlaWdodCxmYz0xLHllPW5ldyBwKDAsMCxTYyxCYykseGU9bmV3IHAoMCwwLFNjLEJjKSxYaD0hMSxWaD1uZXcgbGMsQWM9bmV3IHljLEFnPSExLFdoPSExLHhmPW5ldyBxLENkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aGEscHJlbXVsdGlwbGllZEFscGhhOm1hLApwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6emEscG93ZXJQcmVmZXJlbmNlOkphLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6WWEseHJDb21wYXRpYmxlOiEwfTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0Iix0LCExKTtLYS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsdiwhMSk7dmFyIFJhPWJifHxLYS5nZXRDb250ZXh0KCJ3ZWJnbCIsamIpfHxLYS5nZXRDb250ZXh0KCJleHBlcmltZW50YWwtd2ViZ2wiLGpiKTtpZihudWxsPT09UmEpe2lmKG51bGwhPT1LYS5nZXRDb250ZXh0KCJ3ZWJnbCIpKXRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpO3Rocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSwKcmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaChUKXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK1QubWVzc2FnZSksVDt9dmFyIE1iLGdjLHliLEFkLGhjLFFjLHlnLFVoLHplLFJkLHpnLEFlLEJkLEtqLExqLE1qLFBjO2coKTt2YXIgZmQ9InVuZGVmaW5lZCIhPT10eXBlb2YgbmF2aWdhdG9yJiYieHIiaW4gbmF2aWdhdG9yJiYic3VwcG9ydHNTZXNzaW9uImluIG5hdmlnYXRvci54cj9uZXcgSmooaWEsUmEpOm5ldyBTaChpYSk7dGhpcy52cj1mZDt2YXIgTmo9bmV3IEVqKGlhLHplLGdjLm1heFRleHR1cmVTaXplKTt0aGlzLnNoYWRvd01hcD1Oajt0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gUmF9O3RoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFQ9TWIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTsKVCYmVC5sb3NlQ29udGV4dCgpfTt0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXt2YXIgVD1NYi5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1QmJlQucmVzdG9yZUNvbnRleHQoKX07dGhpcy5nZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIGZjfTt0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXt2YXIgVD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzt2b2lkIDAhPT1UJiYoZmM9VCx0aGlzLnNldFNpemUoU2MsQmMsITEpKX07dGhpcy5nZXRTaXplPWZ1bmN0aW9uKFQpe3ZvaWQgMD09PVQmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRzaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCIpLFQ9bmV3IGYpO3JldHVybiBULnNldChTYyxCYyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihULFksbGEpe2ZkLmlzUHJlc2VudGluZygpP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik6CihTYz1ULEJjPVksS2Eud2lkdGg9TWF0aC5mbG9vcihUKmZjKSxLYS5oZWlnaHQ9TWF0aC5mbG9vcihZKmZjKSwhMSE9PWxhJiYoS2Euc3R5bGUud2lkdGg9VCsicHgiLEthLnN0eWxlLmhlaWdodD1ZKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVCxZKSl9O3RoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCl7dm9pZCAwPT09VCYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldGRyYXdpbmdCdWZmZXJTaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCIpLFQ9bmV3IGYpO3JldHVybiBULnNldChTYypmYyxCYypmYykuZmxvb3IoKX07dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbihULFksbGEpe1NjPVQ7QmM9WTtmYz1sYTtLYS53aWR0aD1NYXRoLmZsb29yKFQqbGEpO0thLmhlaWdodD1NYXRoLmZsb29yKFkqbGEpO3RoaXMuc2V0Vmlld3BvcnQoVCxZKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVCl7dm9pZCAwPT09ClQmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50Vmlld3BvcnQoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3I0IGFzIGFuIGFyZ3VtZW50IiksVD1uZXcgcCk7cmV0dXJuIFQuY29weShMYil9O3RoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuY29weSh5ZSl9O3RoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCxZKXsoMCkuaXNWZWN0b3I0P3llLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6eWUuc2V0KDAsMCxULFkpO3liLnZpZXdwb3J0KExiLmNvcHkoeWUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKX07dGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoeGUpfTt0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24oVCxZLGxhLElhKXtULmlzVmVjdG9yND94ZS5zZXQoVC54LFQueSxULnosVC53KTp4ZS5zZXQoVCxZLGxhLElhKTt5Yi5zY2lzc29yKFRiLmNvcHkoeGUpLm11bHRpcGx5U2NhbGFyKGZjKS5mbG9vcigpKX07CnRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gWGh9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVCl7eWIuc2V0U2Npc3NvclRlc3QoWGg9VCl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiBCZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe0JkLnNldENsZWFyQ29sb3IuYXBwbHkoQmQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIEJkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7QmQuc2V0Q2xlYXJBbHBoYS5hcHBseShCZCxhcmd1bWVudHMpfTt0aGlzLmNsZWFyPWZ1bmN0aW9uKFQsWSxsYSl7dmFyIElhPTA7aWYodm9pZCAwPT09VHx8VClJYXw9MTYzODQ7aWYodm9pZCAwPT09WXx8WSlJYXw9MjU2O2lmKHZvaWQgMD09PWxhfHxsYSlJYXw9MTAyNDtSYS5jbGVhcihJYSl9O3RoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsCiExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHQsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt6Zy5kaXNwb3NlKCk7QWUuZGlzcG9zZSgpO2hjLmRpc3Bvc2UoKTt6ZS5kaXNwb3NlKCk7ZmQuZGlzcG9zZSgpO0JnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9ZnVuY3Rpb24oVCxZKXt5Yi5pbml0QXR0cmlidXRlcygpO3ZhciBsYT1oYy5nZXQoVCk7VC5oYXNQb3NpdGlvbnMmJiFsYS5wb3NpdGlvbiYmKGxhLnBvc2l0aW9uPVJhLmNyZWF0ZUJ1ZmZlcigpKTtULmhhc05vcm1hbHMmJiFsYS5ub3JtYWwmJihsYS5ub3JtYWw9UmEuY3JlYXRlQnVmZmVyKCkpOwpULmhhc1V2cyYmIWxhLnV2JiYobGEudXY9UmEuY3JlYXRlQnVmZmVyKCkpO1QuaGFzQ29sb3JzJiYhbGEuY29sb3ImJihsYS5jb2xvcj1SYS5jcmVhdGVCdWZmZXIoKSk7WT1ZLmdldEF0dHJpYnV0ZXMoKTtULmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbGEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVC5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5wb3NpdGlvbiksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKTtULmhhc05vcm1hbHMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLGxhLm5vcm1hbCksUmEuYnVmZmVyRGF0YSgzNDk2MixULm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5ub3JtYWwpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoWS5ub3JtYWwsMyw1MTI2LCExLDAsMCkpO1QuaGFzVXZzJiYoUmEuYmluZEJ1ZmZlcigzNDk2MixsYS51diksUmEuYnVmZmVyRGF0YSgzNDk2MiwKVC51dkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS51diksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLnV2LDIsNTEyNiwhMSwwLDApKTtULmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbGEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVC5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoWS5jb2xvciksUmEudmVydGV4QXR0cmliUG9pbnRlcihZLmNvbG9yLDMsNTEyNiwhMSwwLDApKTt5Yi5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1JhLmRyYXdBcnJheXMoNCwwLFQuY291bnQpO1QuY291bnQ9MH07dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9ZnVuY3Rpb24oVCxZLGxhLElhLE9hLGFiKXt5Yi5zZXRNYXRlcmlhbChJYSxPYS5pc01lc2gmJjA+T2EubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSk7dmFyIFBhPWVhKFQsWSxJYSxPYSksZmI9ITE7aWYoYyE9PWxhLmlkfHxlYiE9PVBhLmlkfHxtYiE9PSghMD09PUlhLndpcmVmcmFtZSkpYz0KbGEuaWQsZWI9UGEuaWQsbWI9ITA9PT1JYS53aXJlZnJhbWUsZmI9ITA7T2EubW9ycGhUYXJnZXRJbmZsdWVuY2VzJiYoS2oudXBkYXRlKE9hLGxhLElhLFBhKSxmYj0hMCk7dmFyIENiPWxhLmluZGV4LG9iPWxhLmF0dHJpYnV0ZXMucG9zaXRpb247WT0xOyEwPT09SWEud2lyZWZyYW1lJiYoQ2I9VWguZ2V0V2lyZWZyYW1lQXR0cmlidXRlKGxhKSxZPTIpO1Q9TGo7aWYobnVsbCE9PUNiKXt2YXIgJGE9eWcuZ2V0KENiKTtUPU1qO1Quc2V0SW5kZXgoJGEpfWZiJiYoTShJYSxQYSxsYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5O251bGwhPT1DYj8kYT1DYi5jb3VudDp2b2lkIDAhPT1vYiYmKCRhPW9iLmNvdW50KTtvYj1sYS5kcmF3UmFuZ2Uuc3RhcnQqWTtQYT1udWxsIT09YWI/YWIuc3RhcnQqWTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK2xhLmRyYXdSYW5nZS5jb3VudCpZLFBhKwoobnVsbCE9PWFiP2FiLmNvdW50Klk6SW5maW5pdHkpKS0xLUNiKzEpO2lmKDAhPT1hYil7aWYoT2EuaXNNZXNoKWlmKCEwPT09SWEud2lyZWZyYW1lKXliLnNldExpbmVXaWR0aChJYS53aXJlZnJhbWVMaW5ld2lkdGgqZSgpKSxULnNldE1vZGUoMSk7ZWxzZSBzd2l0Y2goT2EuZHJhd01vZGUpe2Nhc2UgMDpULnNldE1vZGUoNCk7YnJlYWs7Y2FzZSAxOlQuc2V0TW9kZSg1KTticmVhaztjYXNlIDI6VC5zZXRNb2RlKDYpfWVsc2UgT2EuaXNMaW5lPyhJYT1JYS5saW5ld2lkdGgsdm9pZCAwPT09SWEmJihJYT0xKSx5Yi5zZXRMaW5lV2lkdGgoSWEqZSgpKSxPYS5pc0xpbmVTZWdtZW50cz9ULnNldE1vZGUoMSk6T2EuaXNMaW5lTG9vcD9ULnNldE1vZGUoMik6VC5zZXRNb2RlKDMpKTpPYS5pc1BvaW50cz9ULnNldE1vZGUoMCk6T2EuaXNTcHJpdGUmJlQuc2V0TW9kZSg0KTtsYSYmbGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT8wPGxhLm1heEluc3RhbmNlZENvdW50JiZULnJlbmRlckluc3RhbmNlcyhsYSwKQ2IsYWIpOlQucmVuZGVyKENiLGFiKX19O3RoaXMuY29tcGlsZT1mdW5jdGlvbihULFkpe2NiPUFlLmdldChULFkpO2NiLmluaXQoKTtULnRyYXZlcnNlKGZ1bmN0aW9uKGxhKXtsYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KGxhKSxsYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KGxhKSl9KTtjYi5zZXR1cExpZ2h0cyhZKTtULnRyYXZlcnNlKGZ1bmN0aW9uKGxhKXtpZihsYS5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KGxhLm1hdGVyaWFsKSlmb3IodmFyIElhPTA7SWE8bGEubWF0ZXJpYWwubGVuZ3RoO0lhKyspVihsYS5tYXRlcmlhbFtJYV0sVC5mb2csbGEpO2Vsc2UgVihsYS5tYXRlcmlhbCxULmZvZyxsYSl9KX07dmFyIFloPW51bGwsQmc9bmV3IGVjO0JnLnNldEFuaW1hdGlvbkxvb3AoZnVuY3Rpb24oVCl7ZmQuaXNQcmVzZW50aW5nKCl8fFloJiZZaChUKX0pOyJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdyYmQmcuc2V0Q29udGV4dCh3aW5kb3cpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD0KZnVuY3Rpb24oVCl7WWg9VDtmZC5zZXRBbmltYXRpb25Mb29wKFQpO0JnLnN0YXJ0KCl9O3RoaXMucmVuZGVyPWZ1bmN0aW9uKFQsWSxsYSxJYSl7aWYodm9pZCAwIT09bGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIHJlbmRlclRhcmdldCBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGluc3RlYWQuIik7dmFyIE9hPWxhfWlmKHZvaWQgMCE9PUlhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLiIpO3ZhciBhYj1JYX1ZJiZZLmlzQ2FtZXJhP0dhfHwoZWI9Yz1udWxsLG1iPSExLFFhPS0xLHBiPW51bGwsITA9PT1ULmF1dG9VcGRhdGUmJlQudXBkYXRlTWF0cml4V29ybGQoKSxudWxsPT09WS5wYXJlbnQmJlkudXBkYXRlTWF0cml4V29ybGQoKSxmZC5lbmFibGVkJiYKKFk9ZmQuZ2V0Q2FtZXJhKFkpKSxjYj1BZS5nZXQoVCxZKSxjYi5pbml0KCksVC5vbkJlZm9yZVJlbmRlcihpYSxULFksT2F8fGliKSx4Zi5tdWx0aXBseU1hdHJpY2VzKFkucHJvamVjdGlvbk1hdHJpeCxZLm1hdHJpeFdvcmxkSW52ZXJzZSksVmguc2V0RnJvbU1hdHJpeCh4ZiksV2g9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxBZz1BYy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsV2gsWSksTmE9emcuZ2V0KFQsWSksTmEuaW5pdCgpLFAoVCxZLDAsaWEuc29ydE9iamVjdHMpLCEwPT09aWEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSxBZyYmQWMuYmVnaW5TaGFkb3dzKCksTmoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSxULFkpLGNiLnNldHVwTGlnaHRzKFkpLEFnJiZBYy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSxCZC5yZW5kZXIoTmEsVCxZLGFiKSxsYT0KTmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFQub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VC5vdmVycmlkZU1hdGVyaWFsLGxhLmxlbmd0aCYmUShsYSxULFksT2EpLElhLmxlbmd0aCYmUShJYSxULFksT2EpKToobGEubGVuZ3RoJiZRKGxhLFQsWSksSWEubGVuZ3RoJiZRKElhLFQsWSkpLG51bGwhPT1pYiYmKFFjLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChpYiksUWMudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoaWIpKSx5Yi5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLHliLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCkseWIuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSx5Yi5zZXRQb2x5Z29uT2Zmc2V0KCExKSxmZC5lbmFibGVkJiZmZC5zdWJtaXRGcmFtZSgpLGNiPU5hPW51bGwpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKX07dGhpcy5zZXRGcmFtZWJ1ZmZlcj0KZnVuY3Rpb24oVCl7TGEhPT1UJiZSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsVCk7TGE9VH07dGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiBuYn07dGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBWYX07dGhpcy5nZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gaWJ9O3RoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKFQsWSxsYSl7aWI9VDtuYj1ZO1ZhPWxhO1QmJnZvaWQgMD09PWhjLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXImJlFjLnNldHVwUmVuZGVyVGFyZ2V0KFQpO3ZhciBJYT1MYSxPYT0hMTtUPyhJYT1oYy5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyLFQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/KElhPUlhW1l8fDBdLE9hPSEwKTpJYT1ULmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9oYy5nZXQoVCkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyOklhLExiLmNvcHkoVC52aWV3cG9ydCksClRiLmNvcHkoVC5zY2lzc29yKSxxYz1ULnNjaXNzb3JUZXN0KTooTGIuY29weSh5ZSkubXVsdGlwbHlTY2FsYXIoZmMpLmZsb29yKCksVGIuY29weSh4ZSkubXVsdGlwbHlTY2FsYXIoZmMpLmZsb29yKCkscWM9WGgpO2tiIT09SWEmJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsSWEpLGtiPUlhKTt5Yi52aWV3cG9ydChMYik7eWIuc2Npc3NvcihUYik7eWIuc2V0U2Npc3NvclRlc3QocWMpO09hJiYoVD1oYy5nZXQoVC50ZXh0dXJlKSxSYS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA2NCwzNDA2OSsoWXx8MCksVC5fX3dlYmdsVGV4dHVyZSxsYXx8MCkpfTt0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24oVCxZLGxhLElhLE9hLGFiLFBhKXtpZihUJiZULmlzV2ViR0xSZW5kZXJUYXJnZXQpe3ZhciBmYj1oYy5nZXQoVCkuX193ZWJnbEZyYW1lYnVmZmVyO1QuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUmJnZvaWQgMCE9PVBhJiYoZmI9ZmJbUGFdKTtpZihmYil7UGE9CiExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVQudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJlBjLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fFBjLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZ2MuaXNXZWJHTDJ8fE1iLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8TWIuZ2V0KCJXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQiKSl8fDEwMTY9PT0kYSYmKGdjLmlzV2ViR0wyP01iLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpOk1iLmdldCgiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IikpPwozNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PVkmJlk8PVQud2lkdGgtSWEmJjA8PWxhJiZsYTw9VC5oZWlnaHQtT2EmJlJhLnJlYWRQaXhlbHMoWSxsYSxJYSxPYSxQYy5jb252ZXJ0KG9iKSxQYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiZSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsa2IpfX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIil9Owp0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihULFksbGEpe3ZhciBJYT1ZLmltYWdlLndpZHRoLE9hPVkuaW1hZ2UuaGVpZ2h0LGFiPVBjLmNvbnZlcnQoWS5mb3JtYXQpO1FjLnNldFRleHR1cmUyRChZLDApO1JhLmNvcHlUZXhJbWFnZTJEKDM1NTMsbGF8fDAsYWIsVC54LFQueSxJYSxPYSwwKX07dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbihULFksbGEsSWEpe3ZhciBPYT1ZLmltYWdlLndpZHRoLGFiPVkuaW1hZ2UuaGVpZ2h0LFBhPVBjLmNvbnZlcnQobGEuZm9ybWF0KSxmYj1QYy5jb252ZXJ0KGxhLnR5cGUpO1FjLnNldFRleHR1cmUyRChsYSwwKTtZLmlzRGF0YVRleHR1cmU/UmEudGV4U3ViSW1hZ2UyRCgzNTUzLElhfHwwLFQueCxULnksT2EsYWIsUGEsZmIsWS5pbWFnZS5kYXRhKTpSYS50ZXhTdWJJbWFnZTJEKDM1NTMsSWF8fDAsVC54LFQueSxQYSxmYixZLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiYKX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24gQ2coYSxjKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSChhKTt0aGlzLmRlbnNpdHk9dm9pZCAwIT09Yz9jOjIuNUUtNH1mdW5jdGlvbiBEZyhhLGMsZSl7dGhpcy5uYW1lPSIiO3RoaXMuY29sb3I9bmV3IEgoYSk7dGhpcy5uZWFyPXZvaWQgMCE9PWM/YzoxO3RoaXMuZmFyPXZvaWQgMCE9PWU/ZToxRTN9ZnVuY3Rpb24gU2QoYSxjKXt0aGlzLmFycmF5PWE7dGhpcy5zdHJpZGU9Yzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMuZHluYW1pYz0hMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geWYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBEZChhKXtTLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEgoMTY3NzcyMTUpO3RoaXMubWFwPW51bGw7dGhpcy5yb3RhdGlvbj0wO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPSExO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gemYoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3ByaXRlIjtpZih2b2lkIDA9PT1DZSl7Q2U9bmV3IHZhO3ZhciBjPW5ldyBTZChuZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSw1KTtDZS5zZXRJbmRleChbMCwxLDIsMCwyLDNdKTtDZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeWYoYywzLDAsITEpKTtDZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeWYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUNlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBEZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwKLjUpfWZ1bmN0aW9uIEVnKGEsYyxlLGcsdCx2KXtEZS5zdWJWZWN0b3JzKGEsZSkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShnKTt2b2lkIDAhPT10PyhBZi54PXYqRGUueC10KkRlLnksQWYueT10KkRlLngrdipEZS55KTpBZi5jb3B5KERlKTthLmNvcHkoYyk7YS54Kz1BZi54O2EueSs9QWYueTthLmFwcGx5TWF0cml4NChPail9ZnVuY3Rpb24gQmYoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMT0QiO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse2xldmVsczp7ZW51bWVyYWJsZTohMCx2YWx1ZTpbXX19KTt0aGlzLmF1dG9VcGRhdGU9ITB9ZnVuY3Rpb24gQ2YoYSxjKXthJiZhLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eWEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0KImF0dGFjaGVkIjt0aGlzLmJpbmRNYXRyaXg9bmV3IHE7dGhpcy5iaW5kTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiBGZyhhLGMpe2E9YXx8W107dGhpcy5ib25lcz1hLnNsaWNlKDApO3RoaXMuYm9uZU1hdHJpY2VzPW5ldyBGbG9hdDMyQXJyYXkoMTYqdGhpcy5ib25lcy5sZW5ndGgpO2lmKHZvaWQgMD09PWMpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodGhpcy5ib25lcy5sZW5ndGg9PT1jLmxlbmd0aCl0aGlzLmJvbmVJbnZlcnNlcz1jLnNsaWNlKDApO2Vsc2UgZm9yKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguIiksdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBaaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9CiJMaW5lQmFzaWNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5saW5ld2lkdGg9MTt0aGlzLmxpbmVqb2luPXRoaXMubGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFhiKGEsYyxlKXsxPT09ZSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNlIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLiIpO0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmUiO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1hiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBHZyhhLGMpe1hiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0KIkxpbmVMb29wIn1mdW5jdGlvbiBDYyhhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2ludHNNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnNpemU9MTt0aGlzLnNpemVBdHRlbnVhdGlvbj0hMDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBFZShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50cyI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yz9jOm5ldyBDYyh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9ZnVuY3Rpb24gJGgoYSxjLGUsZyx0LHYseil7dmFyIEU9YWkuZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxhaS5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSwKYTx0Lm5lYXJ8fGE+dC5mYXJ8fHYucHVzaCh7ZGlzdGFuY2U6YSxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChFKSxwb2ludDplLGluZGV4OmMsZmFjZTpudWxsLG9iamVjdDp6fSkpfWZ1bmN0aW9uIGJpKGEsYyxlLGcsdCx2LHosRSxGKXtsLmNhbGwodGhpcyxhLGMsZSxnLHQsdix6LEUsRik7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjI7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dj92OjEwMDY7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09dD90OjEwMDY7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gRmUoYSxjLGUsZyx0LHYseixFLEYsSSxNLFApe2wuY2FsbCh0aGlzLG51bGwsdix6LEUsRixJLGcsdCxNLFApO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gRGYoYSxjLGUsZyx0LHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcsdCx2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPQohMH1mdW5jdGlvbiBFZihhLGMsZSxnLHQsdix6LEUsRixJKXtJPXZvaWQgMCE9PUk/SToxMDI2O2lmKDEwMjYhPT1JJiYxMDI3IT09SSl0aHJvdyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTt2b2lkIDA9PT1lJiYxMDI2PT09SSYmKGU9MTAxMik7dm9pZCAwPT09ZSYmMTAyNz09PUkmJihlPTEwMjApO2wuY2FsbCh0aGlzLG51bGwsZyx0LHYseixFLEksZSxGKTt0aGlzLmltYWdlPXt3aWR0aDphLGhlaWdodDpjfTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT16P3o6MTAwMzt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEdlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHQsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTsKaWYoYSYmYS5pc0dlb21ldHJ5KXt2YXIgRj1hLmZhY2VzO3ZhciBJPTA7Zm9yKGc9Ri5sZW5ndGg7STxnO0krKyl7dmFyIE09RltJXTtmb3IoZT0wOzM+ZTtlKyspe3ZhciBQPU1bRVtlXV07dmFyIFE9TVtFWyhlKzEpJTNdXTt2WzBdPU1hdGgubWluKFAsUSk7dlsxXT1NYXRoLm1heChQLFEpO1A9dlswXSsiLCIrdlsxXTt2b2lkIDA9PT16W1BdJiYoeltQXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KX19Zm9yKFAgaW4geilJPXpbUF0sRT1hLnZlcnRpY2VzW0kuaW5kZXgxXSxjLnB1c2goRS54LEUueSxFLnopLEU9YS52ZXJ0aWNlc1tJLmluZGV4Ml0sYy5wdXNoKEUueCxFLnksRS56KX1lbHNlIGlmKGEmJmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtNPWEuaW5kZXg7dmFyIFU9YS5ncm91cHM7MD09PVUubGVuZ3RoJiYoVT1be3N0YXJ0OjAsY291bnQ6TS5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7CmE9MDtmb3IodD1VLmxlbmd0aDthPHQ7KythKWZvcihJPVVbYV0sZT1JLnN0YXJ0LGc9SS5jb3VudCxJPWUsZz1lK2c7STxnO0krPTMpZm9yKGU9MDszPmU7ZSsrKVA9TS5nZXRYKEkrZSksUT1NLmdldFgoSSsoZSsxKSUzKSx2WzBdPU1hdGgubWluKFAsUSksdlsxXT1NYXRoLm1heChQLFEpLFA9dlswXSsiLCIrdlsxXSx2b2lkIDA9PT16W1BdJiYoeltQXT17aW5kZXgxOnZbMF0saW5kZXgyOnZbMV19KTtmb3IoUCBpbiB6KUk9eltQXSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixJLmluZGV4MSksYy5wdXNoKEUueCxFLnksRS56KSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixJLmluZGV4MiksYy5wdXNoKEUueCxFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixJPTAsZz1GLmNvdW50LzM7STxnO0krKylmb3IoZT0wOzM+ZTtlKyspej0zKkkrZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypJKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYsCnopLGMucHVzaChFLngsRS55LEUueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoYywzKSl9ZnVuY3Rpb24gRmYoYSxjLGUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQYXJhbWV0cmljR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17ZnVuYzphLHNsaWNlczpjLHN0YWNrczplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBIZShhLGMsZSl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHQ9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxJPW5ldyBrLE09bmV3IGssUD1uZXcgayxRLFU7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTsKdmFyIFY9YysxO2ZvcihRPTA7UTw9ZTtRKyspe3ZhciBlYT1RL2U7Zm9yKFU9MDtVPD1jO1UrKyl7dmFyIGRhPVUvYzthKGRhLGVhLEYpO3QucHVzaChGLngsRi55LEYueik7MDw9ZGEtMUUtNT8oYShkYS0xRS01LGVhLEkpLE0uc3ViVmVjdG9ycyhGLEkpKTooYShkYSsxRS01LGVhLEkpLE0uc3ViVmVjdG9ycyhJLEYpKTswPD1lYS0xRS01PyhhKGRhLGVhLTFFLTUsSSksUC5zdWJWZWN0b3JzKEYsSSkpOihhKGRhLGVhKzFFLTUsSSksUC5zdWJWZWN0b3JzKEksRikpO0UuY3Jvc3NWZWN0b3JzKE0sUCkubm9ybWFsaXplKCk7di5wdXNoKEUueCxFLnksRS56KTt6LnB1c2goZGEsZWEpfX1mb3IoUT0wO1E8ZTtRKyspZm9yKFU9MDtVPGM7VSsrKWE9USpWK1UrMSxFPShRKzEpKlYrVSsxLEY9KFErMSkqVitVLGcucHVzaChRKlYrVSxhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh0LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwKbmV3IGJhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKHosMikpfWZ1bmN0aW9uIEdmKGEsYyxlLGcpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBtYyhhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gbWMoYSxjLGUsZyl7ZnVuY3Rpb24gdChWLGVhLGRhLHJhKXtyYT1NYXRoLnBvdygyLHJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgbmE9Vi5jbG9uZSgpLmxlcnAoZGEscWEvcmEpLHRhPWVhLmNsb25lKCkubGVycChkYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/bmE6bmEuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTwKcmE7cWErKylmb3IodWE9MDt1YTwyKihyYS1xYSktMTt1YSsrKVY9TWF0aC5mbG9vcih1YS8yKSwwPT09dWElMj8oeihwYVtxYV1bVisxXSkseihwYVtxYSsxXVtWXSkseihwYVtxYV1bVl0pKTooeihwYVtxYV1bVisxXSkseihwYVtxYSsxXVtWKzFdKSx6KHBhW3FhKzFdW1ZdKSl9ZnVuY3Rpb24gdigpe2Zvcih2YXIgVj0wO1Y8VS5sZW5ndGg7Vis9Nil7dmFyIGVhPVVbViswXSxkYT1VW1YrMl0scmE9VVtWKzRdLHBhPU1hdGgubWluKGVhLGRhLHJhKTsuOTxNYXRoLm1heChlYSxkYSxyYSkmJi4xPnBhJiYoLjI+ZWEmJihVW1YrMF0rPTEpLC4yPmRhJiYoVVtWKzJdKz0xKSwuMj5yYSYmKFVbVis0XSs9MSkpfX1mdW5jdGlvbiB6KFYpe1EucHVzaChWLngsVi55LFYueil9ZnVuY3Rpb24gRShWLGVhKXtWKj0zO2VhLng9YVtWKzBdO2VhLnk9YVtWKzFdO2VhLno9YVtWKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFY9bmV3IGssZWE9bmV3IGssZGE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYsCnFhPW5ldyBmLHVhPW5ldyBmLG5hPTAsdGE9MDtuYTxRLmxlbmd0aDtuYSs9OSx0YSs9Nil7Vi5zZXQoUVtuYSswXSxRW25hKzFdLFFbbmErMl0pO2VhLnNldChRW25hKzNdLFFbbmErNF0sUVtuYSs1XSk7ZGEuc2V0KFFbbmErNl0sUVtuYSs3XSxRW25hKzhdKTtwYS5zZXQoVVt0YSswXSxVW3RhKzFdKTtxYS5zZXQoVVt0YSsyXSxVW3RhKzNdKTt1YS5zZXQoVVt0YSs0XSxVW3RhKzVdKTtyYS5jb3B5KFYpLmFkZChlYSkuYWRkKGRhKS5kaXZpZGVTY2FsYXIoMyk7dmFyIEJhPU0ocmEpO0kocGEsdGErMCxWLEJhKTtJKHFhLHRhKzIsZWEsQmEpO0kodWEsdGErNCxkYSxCYSl9fWZ1bmN0aW9uIEkoVixlYSxkYSxyYSl7MD5yYSYmMT09PVYueCYmKFVbZWFdPVYueC0xKTswPT09ZGEueCYmMD09PWRhLnomJihVW2VhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIE0oVil7cmV0dXJuIE1hdGguYXRhbjIoVi56LC1WLngpfWZ1bmN0aW9uIFAoVil7cmV0dXJuIE1hdGguYXRhbjIoLVYueSwKTWF0aC5zcXJ0KFYueCpWLngrVi56KlYueikpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17dmVydGljZXM6YSxpbmRpY2VzOmMscmFkaXVzOmUsZGV0YWlsOmd9O2U9ZXx8MTtnPWd8fDA7dmFyIFE9W10sVT1bXTsoZnVuY3Rpb24oVil7Zm9yKHZhciBlYT1uZXcgayxkYT1uZXcgayxyYT1uZXcgayxwYT0wO3BhPGMubGVuZ3RoO3BhKz0zKUUoY1twYSswXSxlYSksRShjW3BhKzFdLGRhKSxFKGNbcGErMl0scmEpLHQoZWEsZGEscmEsVil9KShnKTsoZnVuY3Rpb24oVil7Zm9yKHZhciBlYT1uZXcgayxkYT0wO2RhPFEubGVuZ3RoO2RhKz0zKWVhLng9UVtkYSswXSxlYS55PVFbZGErMV0sZWEuej1RW2RhKzJdLGVhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFYpLFFbZGErMF09ZWEueCxRW2RhKzFdPWVhLnksUVtkYSsyXT1lYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBWPW5ldyBrLGVhPTA7ZWE8ClEubGVuZ3RoO2VhKz0zKXtWLng9UVtlYSswXTtWLnk9UVtlYSsxXTtWLno9UVtlYSsyXTt2YXIgZGE9TShWKS8yL01hdGguUEkrLjUscmE9UChWKS9NYXRoLlBJKy41O1UucHVzaChkYSwxLXJhKX1GKCk7digpfSkoKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShRLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoUS5zbGljZSgpLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShVLDIpKTswPT09Zz90aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk6dGhpcy5ub3JtYWxpemVOb3JtYWxzKCl9ZnVuY3Rpb24gSGYoYSxjKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7bWMuY2FsbCh0aGlzLFsxLDEsMSwKLTEsLTEsMSwtMSwxLC0xLDEsLTEsLTFdLFsyLDEsMCwwLDMsMiwxLDMsMCwyLDMsMV0sYSxjKTt0aGlzLnR5cGU9IlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9fWZ1bmN0aW9uIElmKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik9jdGFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFRkKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFRkKGEsYyl7bWMuY2FsbCh0aGlzLFsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iSWNvc2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEplKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yO21jLmNhbGwodGhpcyxbLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSwwLDAsLTEsZSwwLDEsZSwwLC0xLC1lLDAsMSwtZSxlLDAsLTEsZSwwLDEsLWUsMCwtMSwtZSwwLDFdLFswLDExLDUsMCw1LDEsMCwxLDcsMCw3LDEwLDAsMTAsMTEsMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMpe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsZGV0YWlsOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMpe3ZhciBlPSgxK01hdGguc3FydCg1KSkvMixnPTEvZTttYy5jYWxsKHRoaXMsWy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWcsLWUsMCwtZyxlLDAsZywtZSwwLGcsZSwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LAoxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldLGEsYyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gTGYoYSxjLGUsZyx0LHYpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLHJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnR9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFVkKGEsYyxlLGcsdCk7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7CnRoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFVkKGEsYyxlLGcsdCl7ZnVuY3Rpb24gdihxYSl7UT1hLmdldFBvaW50QXQocWEvYyxRKTt2YXIgdWE9Ri5ub3JtYWxzW3FhXTtxYT1GLmJpbm9ybWFsc1txYV07Zm9yKFY9MDtWPD1nO1YrKyl7dmFyIG5hPVYvZypNYXRoLlBJKjIsdGE9TWF0aC5zaW4obmEpO25hPS1NYXRoLmNvcyhuYSk7TS54PW5hKnVhLngrdGEqcWEueDtNLnk9bmEqdWEueSt0YSpxYS55O00uej1uYSp1YS56K3RhKnFhLno7TS5ub3JtYWxpemUoKTtkYS5wdXNoKE0ueCxNLnksTS56KTtJLng9US54K2UqTS54O0kueT1RLnkrZSpNLnk7SS56PVEueitlKk0uejtlYS5wdXNoKEkueCxJLnksSS56KX19ZnVuY3Rpb24geigpe2ZvcihWPTE7Vjw9YztWKyspZm9yKFU9MTtVPD1nO1UrKyl7dmFyIHFhPShnKzEpKlYrKFUtMSksdWE9KGcrMSkqVitVLG5hPShnKzEpKihWLTEpK1U7cGEucHVzaCgoZysxKSooVi0xKSsoVS0xKSxxYSxuYSk7cGEucHVzaChxYSx1YSxuYSl9fQpmdW5jdGlvbiBFKCl7Zm9yKFU9MDtVPD1jO1UrKylmb3IoVj0wO1Y8PWc7VisrKVAueD1VL2MsUC55PVYvZyxyYS5wdXNoKFAueCxQLnkpfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUdWJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cGF0aDphLHR1YnVsYXJTZWdtZW50czpjLHJhZGl1czplLHJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnR9O2M9Y3x8NjQ7ZT1lfHwxO2c9Z3x8ODt0PXR8fCExO3ZhciBGPWEuY29tcHV0ZUZyZW5ldEZyYW1lcyhjLHQpO3RoaXMudGFuZ2VudHM9Ri50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBJPW5ldyBrLE09bmV3IGssUD1uZXcgZixRPW5ldyBrLFUsVixlYT1bXSxkYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVT0wO1U8YztVKyspdihVKTt2KCExPT09dD9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBiYShlYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKGRhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShyYSwyKSl9ZnVuY3Rpb24gTWYoYSxjLGUsZyx0LHYseil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6dCxxOnZ9O3ZvaWQgMCE9PXomJmNvbnNvbGUud2FybigiVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLiIpO3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBMZShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIExlKGEsYyxlLGcsdCx2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhLwpCYSp0YTtUYT1NYXRoLmNvcyhCYSk7Q2EueD1VYSooMitUYSkqLjUqTWF0aC5jb3ModGEpO0NhLnk9VWEqKDIrVGEpKkhhKi41O0NhLno9VWEqTWF0aC5zaW4oQmEpKi41fXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx0dWJlOmMsdHVidWxhclNlZ21lbnRzOmUscmFkaWFsU2VnbWVudHM6ZyxwOnQscTp2fTthPWF8fDE7Yz1jfHwuNDtlPU1hdGguZmxvb3IoZSl8fDY0O2c9TWF0aC5mbG9vcihnKXx8ODt0PXR8fDI7dj12fHwzO3ZhciBFPVtdLEY9W10sST1bXSxNPVtdLFAsUT1uZXcgayxVPW5ldyBrLFY9bmV3IGssZWE9bmV3IGssZGE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGs7Zm9yKFA9MDtQPD1lOysrUCl7dmFyIHFhPVAvZSp0Kk1hdGguUEkqMjt6KHFhLHQsdixhLFYpO3oocWErLjAxLHQsdixhLGVhKTtyYS5zdWJWZWN0b3JzKGVhLFYpO3BhLmFkZFZlY3RvcnMoZWEsVik7ZGEuY3Jvc3NWZWN0b3JzKHJhLApwYSk7cGEuY3Jvc3NWZWN0b3JzKGRhLHJhKTtkYS5ub3JtYWxpemUoKTtwYS5ub3JtYWxpemUoKTtmb3IocWE9MDtxYTw9ZzsrK3FhKXt2YXIgdWE9cWEvZypNYXRoLlBJKjIsbmE9LWMqTWF0aC5jb3ModWEpO3VhPWMqTWF0aC5zaW4odWEpO1EueD1WLngrKG5hKnBhLngrdWEqZGEueCk7US55PVYueSsobmEqcGEueSt1YSpkYS55KTtRLno9Vi56KyhuYSpwYS56K3VhKmRhLnopO0YucHVzaChRLngsUS55LFEueik7VS5zdWJWZWN0b3JzKFEsVikubm9ybWFsaXplKCk7SS5wdXNoKFUueCxVLnksVS56KTtNLnB1c2goUC9lKTtNLnB1c2gocWEvZyl9fWZvcihxYT0xO3FhPD1lO3FhKyspZm9yKFA9MTtQPD1nO1ArKylhPShnKzEpKnFhKyhQLTEpLGM9KGcrMSkqcWErUCx0PShnKzEpKihxYS0xKStQLEUucHVzaCgoZysxKSoocWEtMSkrKFAtMSksYSx0KSxFLnB1c2goYSxjLHQpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsCm5ldyBiYShJLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShNLDIpKX1mdW5jdGlvbiBOZihhLGMsZSxnLHQpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6YyxyYWRpYWxTZWdtZW50czplLHR1YnVsYXJTZWdtZW50czpnLGFyYzp0fTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgTWUoYSxjLGUsZyx0KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTWUoYSxjLGUsZyx0KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6dH07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8Njt0PXR8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxJPW5ldyBrLE09bmV3IGssClA9bmV3IGssUSxVO2ZvcihRPTA7UTw9ZTtRKyspZm9yKFU9MDtVPD1nO1UrKyl7dmFyIFY9VS9nKnQsZWE9US9lKk1hdGguUEkqMjtNLng9KGErYypNYXRoLmNvcyhlYSkpKk1hdGguY29zKFYpO00ueT0oYStjKk1hdGguY29zKGVhKSkqTWF0aC5zaW4oVik7TS56PWMqTWF0aC5zaW4oZWEpO3oucHVzaChNLngsTS55LE0ueik7SS54PWEqTWF0aC5jb3MoVik7SS55PWEqTWF0aC5zaW4oVik7UC5zdWJWZWN0b3JzKE0sSSkubm9ybWFsaXplKCk7RS5wdXNoKFAueCxQLnksUC56KTtGLnB1c2goVS9nKTtGLnB1c2goUS9lKX1mb3IoUT0xO1E8PWU7USsrKWZvcihVPTE7VTw9ZztVKyspYT0oZysxKSooUS0xKStVLTEsYz0oZysxKSooUS0xKStVLHQ9KGcrMSkqUStVLHYucHVzaCgoZysxKSpRK1UtMSxhLHQpLHYucHVzaChhLGMsdCk7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEoRSwKMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKEYsMikpfWZ1bmN0aW9uIFBqKGEsYyxlLGcsdCl7aWYodD09PTA8cm0oYSxjLGUsZykpZm9yKHQ9Yzt0PGU7dCs9Zyl2YXIgdj1Raih0LGFbdF0sYVt0KzFdLHYpO2Vsc2UgZm9yKHQ9ZS1nO3Q+PWM7dC09Zyl2PVFqKHQsYVt0XSxhW3QrMV0sdik7diYmVmQodix2Lm5leHQpJiYoT2Yodiksdj12Lm5leHQpO3JldHVybiB2fWZ1bmN0aW9uIFBmKGEsYyl7aWYoIWEpcmV0dXJuIGE7Y3x8KGM9YSk7ZG97dmFyIGU9ITE7aWYoYS5zdGVpbmVyfHwhVmQoYSxhLm5leHQpJiYwIT09WWIoYS5wcmV2LGEsYS5uZXh0KSlhPWEubmV4dDtlbHNle09mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUWYoYSxjLGUsZyx0LHYseil7aWYoYSl7IXomJnYmJnNtKGEsZyx0LHYpO2Zvcih2YXIgRT1hLEYsSTthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LApJPWEubmV4dCx2P3RtKGEsZyx0LHYpOnVtKGEpKWMucHVzaChGLmkvZSksYy5wdXNoKGEuaS9lKSxjLnB1c2goSS5pL2UpLE9mKGEpLEU9YT1JLm5leHQ7ZWxzZSBpZihhPUksYT09PUUpe3o/MT09PXo/KGE9dm0oYSxjLGUpLFFmKGEsYyxlLGcsdCx2LDIpKToyPT09eiYmd20oYSxjLGUsZyx0LHYpOlFmKFBmKGEpLGMsZSxnLHQsdiwxKTticmVha319fWZ1bmN0aW9uIHVtKGEpe3ZhciBjPWEucHJldixlPWEubmV4dDtpZigwPD1ZYihjLGEsZSkpcmV0dXJuITE7Zm9yKHZhciBnPWEubmV4dC5uZXh0O2chPT1hLnByZXY7KXtpZihOZShjLngsYy55LGEueCxhLnksZS54LGUueSxnLngsZy55KSYmMDw9WWIoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiB0bShhLGMsZSxnKXt2YXIgdD1hLnByZXYsdj1hLm5leHQ7aWYoMDw9WWIodCxhLHYpKXJldHVybiExO3ZhciB6PXQueD5hLng/dC54PnYueD90Lng6di54OmEueD52Lng/YS54OnYueCwKRT10Lnk+YS55P3QueT52Lnk/dC55OnYueTphLnk+di55P2EueTp2LnksRj1jaSh0Lng8YS54P3QueDx2Lng/dC54OnYueDphLng8di54P2EueDp2LngsdC55PGEueT90Lnk8di55P3QueTp2Lnk6YS55PHYueT9hLnk6di55LGMsZSxnKTtjPWNpKHosRSxjLGUsZyk7ZT1hLnByZXZaO2ZvcihnPWEubmV4dFo7ZSYmZS56Pj1GJiZnJiZnLno8PWM7KXtpZihlIT09YS5wcmV2JiZlIT09YS5uZXh0JiZOZSh0LngsdC55LGEueCxhLnksdi54LHYueSxlLngsZS55KSYmMDw9WWIoZS5wcmV2LGUsZS5uZXh0KSlyZXR1cm4hMTtlPWUucHJldlo7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTmUodC54LHQueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVliKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTmUodC54LHQueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVliKGUucHJldiwKZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2Wn1mb3IoO2cmJmcuejw9Yzspe2lmKGchPT1hLnByZXYmJmchPT1hLm5leHQmJk5lKHQueCx0LnksYS54LGEueSx2Lngsdi55LGcueCxnLnkpJiYwPD1ZYihnLnByZXYsZyxnLm5leHQpKXJldHVybiExO2c9Zy5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiB2bShhLGMsZSl7dmFyIGc9YTtkb3t2YXIgdD1nLnByZXYsdj1nLm5leHQubmV4dDshVmQodCx2KSYmUmoodCxnLGcubmV4dCx2KSYmUmYodCx2KSYmUmYodix0KSYmKGMucHVzaCh0LmkvZSksYy5wdXNoKGcuaS9lKSxjLnB1c2godi5pL2UpLE9mKGcpLE9mKGcubmV4dCksZz1hPXYpO2c9Zy5uZXh0fXdoaWxlKGchPT1hKTtyZXR1cm4gZ31mdW5jdGlvbiB3bShhLGMsZSxnLHQsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmeG0oeixFKSl7YT1Taih6LEUpO3o9UGYoeix6Lm5leHQpO2E9UGYoYSxhLm5leHQpO1FmKHosCmMsZSxnLHQsdik7UWYoYSxjLGUsZyx0LHYpO3JldHVybn1FPUUubmV4dH16PXoubmV4dH13aGlsZSh6IT09YSl9ZnVuY3Rpb24geW0oYSxjLGUsZyl7dmFyIHQ9W10sdjt2YXIgej0wO2Zvcih2PWMubGVuZ3RoO3o8djt6Kyspe3ZhciBFPWNbel0qZzt2YXIgRj16PHYtMT9jW3orMV0qZzphLmxlbmd0aDtFPVBqKGEsRSxGLGcsITEpO0U9PT1FLm5leHQmJihFLnN0ZWluZXI9ITApO3QucHVzaCh6bShFKSl9dC5zb3J0KEFtKTtmb3Ioej0wO3o8dC5sZW5ndGg7eisrKUJtKHRbel0sZSksZT1QZihlLGUubmV4dCk7cmV0dXJuIGV9ZnVuY3Rpb24gQW0oYSxjKXtyZXR1cm4gYS54LWMueH1mdW5jdGlvbiBCbShhLGMpe2lmKGM9Q20oYSxjKSlhPVNqKGMsYSksUGYoYSxhLm5leHQpfWZ1bmN0aW9uIENtKGEsYyl7dmFyIGU9YyxnPWEueCx0PWEueSx2PS1JbmZpbml0eTtkb3tpZih0PD1lLnkmJnQ+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54Kyh0LWUueSkqKGUubmV4dC54LQplLngpLyhlLm5leHQueS1lLnkpO2lmKHo8PWcmJno+dil7dj16O2lmKHo9PT1nKXtpZih0PT09ZS55KXJldHVybiBlO2lmKHQ9PT1lLm5leHQueSlyZXR1cm4gZS5uZXh0fXZhciBFPWUueDxlLm5leHQueD9lOmUubmV4dH19ZT1lLm5leHR9d2hpbGUoZSE9PWMpO2lmKCFFKXJldHVybiBudWxsO2lmKGc9PT12KXJldHVybiBFLnByZXY7Yz1FO3o9RS54O3ZhciBGPUUueSxJPUluZmluaXR5O2ZvcihlPUUubmV4dDtlIT09Yzspe2lmKGc+PWUueCYmZS54Pj16JiZnIT09ZS54JiZOZSh0PEY/Zzp2LHQseixGLHQ8Rj92OmcsdCxlLngsZS55KSl7dmFyIE09TWF0aC5hYnModC1lLnkpLyhnLWUueCk7KE08SXx8TT09PUkmJmUueD5FLngpJiZSZihlLGEpJiYoRT1lLEk9TSl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gc20oYSxjLGUsZyl7dmFyIHQ9YTtkbyBudWxsPT09dC56JiYodC56PWNpKHQueCx0LnksYyxlLGcpKSx0LnByZXZaPXQucHJldix0PXQubmV4dFo9dC5uZXh0O3doaWxlKHQhPT0KYSk7dC5wcmV2Wi5uZXh0Wj1udWxsO3QucHJldlo9bnVsbDtEbSh0KX1mdW5jdGlvbiBEbShhKXt2YXIgYyxlLGcsdCx2PTE7ZG97dmFyIHo9YTt2YXIgRT1hPW51bGw7Zm9yKGU9MDt6Oyl7ZSsrO3ZhciBGPXo7Zm9yKGM9Zz0wO2M8diYmKGcrKyxGPUYubmV4dFosRik7YysrKTtmb3IodD12OzA8Z3x8MDx0JiZGOykwIT09ZyYmKDA9PT10fHwhRnx8ei56PD1GLnopPyhjPXosej16Lm5leHRaLGctLSk6KGM9RixGPUYubmV4dFosdC0tKSxFP0UubmV4dFo9YzphPWMsYy5wcmV2Wj1FLEU9Yzt6PUZ9RS5uZXh0Wj1udWxsO3YqPTJ9d2hpbGUoMTxlKTtyZXR1cm4gYX1mdW5jdGlvbiBjaShhLGMsZSxnLHQpe2E9MzI3NjcqKGEtZSkqdDtjPTMyNzY3KihjLWcpKnQ7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfAphPDwxKSYxNDMxNjU1NzY1fCgoY3xjPDwxKSYxNDMxNjU1NzY1KTw8MX1mdW5jdGlvbiB6bShhKXt2YXIgYz1hLGU9YTtkb3tpZihjLng8ZS54fHxjLng9PT1lLngmJmMueTxlLnkpZT1jO2M9Yy5uZXh0fXdoaWxlKGMhPT1hKTtyZXR1cm4gZX1mdW5jdGlvbiBOZShhLGMsZSxnLHQsdix6LEUpe3JldHVybiAwPD0odC16KSooYy1FKS0oYS16KSoodi1FKSYmMDw9KGEteikqKGctRSktKGUteikqKGMtRSkmJjA8PShlLXopKih2LUUpLSh0LXopKihnLUUpfWZ1bmN0aW9uIHhtKGEsYyl7cmV0dXJuIGEubmV4dC5pIT09Yy5pJiZhLnByZXYuaSE9PWMuaSYmIUVtKGEsYykmJlJmKGEsYykmJlJmKGMsYSkmJkZtKGEsYyl9ZnVuY3Rpb24gWWIoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBWZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBSaihhLGMsZSxnKXtyZXR1cm4gVmQoYSxlKSYmVmQoYywKZyl8fFZkKGEsZykmJlZkKGUsYyk/ITA6MDxZYihhLGMsZSkhPT0wPFliKGEsYyxnKSYmMDxZYihlLGcsYSkhPT0wPFliKGUsZyxjKX1mdW5jdGlvbiBFbShhLGMpe3ZhciBlPWE7ZG97aWYoZS5pIT09YS5pJiZlLm5leHQuaSE9PWEuaSYmZS5pIT09Yy5pJiZlLm5leHQuaSE9PWMuaSYmUmooZSxlLm5leHQsYSxjKSlyZXR1cm4hMDtlPWUubmV4dH13aGlsZShlIT09YSk7cmV0dXJuITF9ZnVuY3Rpb24gUmYoYSxjKXtyZXR1cm4gMD5ZYihhLnByZXYsYSxhLm5leHQpPzA8PVliKGEsYyxhLm5leHQpJiYwPD1ZYihhLGEucHJldixjKTowPlliKGEsYyxhLnByZXYpfHwwPlliKGEsYS5uZXh0LGMpfWZ1bmN0aW9uIEZtKGEsYyl7dmFyIGU9YSxnPSExLHQ9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZ0PChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBTaihhLGMpe3ZhciBlPW5ldyBkaShhLmksYS54LGEueSksZz1uZXcgZGkoYy5pLGMueCxjLnkpLHQ9YS5uZXh0LHY9Yy5wcmV2O2EubmV4dD1jO2MucHJldj1hO2UubmV4dD10O3QucHJldj1lO2cubmV4dD1lO2UucHJldj1nO3YubmV4dD1nO2cucHJldj12O3JldHVybiBnfWZ1bmN0aW9uIFFqKGEsYyxlLGcpe2E9bmV3IGRpKGEsYyxlKTtnPyhhLm5leHQ9Zy5uZXh0LGEucHJldj1nLGcubmV4dC5wcmV2PWEsZy5uZXh0PWEpOihhLnByZXY9YSxhLm5leHQ9YSk7cmV0dXJuIGF9ZnVuY3Rpb24gT2YoYSl7YS5uZXh0LnByZXY9YS5wcmV2O2EucHJldi5uZXh0PWEubmV4dDthLnByZXZaJiYoYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBkaShhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PQpudWxsO3RoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBybShhLGMsZSxnKXtmb3IodmFyIHQ9MCx2PWUtZztjPGU7Yys9Zyl0Kz0oYVt2XS1hW2NdKSooYVtjKzFdK2FbdisxXSksdj1jO3JldHVybiB0fWZ1bmN0aW9uIFRqKGEpe3ZhciBjPWEubGVuZ3RoOzI8YyYmYVtjLTFdLmVxdWFscyhhWzBdKSYmYS5wb3AoKX1mdW5jdGlvbiBVaihhLGMpe2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWEucHVzaChjW2VdLngpLGEucHVzaChjW2VdLnkpfWZ1bmN0aW9uIFdkKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBUYyhhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBUYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSShRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7CnJldHVybiBlYi5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKG1iKS5hZGQoUWEpfWZ1bmN0aW9uIE0oUWEsZWIsbWIpe3ZhciBwYj1RYS54LWViLng7dmFyIHNiPVFhLnktZWIueTt2YXIgTGI9bWIueC1RYS54O3ZhciBUYj1tYi55LVFhLnkscWM9cGIqcGIrc2Iqc2I7aWYoTWF0aC5hYnMocGIqVGItc2IqTGIpPk51bWJlci5FUFNJTE9OKXt2YXIgU2M9TWF0aC5zcXJ0KHFjKSxCYz1NYXRoLnNxcnQoTGIqTGIrVGIqVGIpO3FjPWViLngtc2IvU2M7ZWI9ZWIueStwYi9TYztUYj0oKG1iLngtVGIvQmMtcWMpKlRiLShtYi55K0xiL0JjLWViKSpMYikvKHBiKlRiLXNiKkxiKTtMYj1xYytwYipUYi1RYS54O3BiPWViK3NiKlRiLVFhLnk7c2I9TGIqTGIrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKExiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9MYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/TGI8LU51bWJlci5FUFNJTE9OJiYKKFFhPSEwKTpNYXRoLnNpZ24oc2IpPT09TWF0aC5zaWduKFRiKSYmKFFhPSEwKSxRYT8oTGI9LXNiLHNiPU1hdGguc3FydChxYykpOihMYj1wYixwYj1zYixzYj1NYXRoLnNxcnQocWMvMikpO3JldHVybiBuZXcgZihMYi9zYixwYi9zYil9ZnVuY3Rpb24gUChRYSxlYil7Zm9yKGlhPVFhLmxlbmd0aDswPD0tLWlhOyl7dmFyIG1iPWlhO3ZhciBwYj1pYS0xOzA+cGImJihwYj1RYS5sZW5ndGgtMSk7dmFyIHNiLExiPXFhKzIqVWE7Zm9yKHNiPTA7c2I8TGI7c2IrKyl7dmFyIFRiPVlhKnNiLHFjPVlhKihzYisxKTtWKGViK21iK1RiLGViK3BiK1RiLGViK3BiK3FjLGViK21iK3FjKX19fWZ1bmN0aW9uIFEoUWEsZWIsbWIpe3JhLnB1c2goUWEpO3JhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFUoUWEsZWIsbWIpe2VhKFFhKTtlYShlYik7ZWEobWIpO1FhPXQubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHQsUWEtMyxRYS0yLFFhLTEpO2RhKFFhWzBdKTtkYShRYVsxXSk7CmRhKFFhWzJdKX1mdW5jdGlvbiBWKFFhLGViLG1iLHBiKXtlYShRYSk7ZWEoZWIpO2VhKHBiKTtlYShlYik7ZWEobWIpO2VhKHBiKTtRYT10Lmxlbmd0aC8zO1FhPUhhLmdlbmVyYXRlU2lkZVdhbGxVVihnLHQsUWEtNixRYS0zLFFhLTIsUWEtMSk7ZGEoUWFbMF0pO2RhKFFhWzFdKTtkYShRYVszXSk7ZGEoUWFbMV0pO2RhKFFhWzJdKTtkYShRYVszXSl9ZnVuY3Rpb24gZWEoUWEpe3QucHVzaChyYVszKlFhXSk7dC5wdXNoKHJhWzMqUWErMV0pO3QucHVzaChyYVszKlFhKzJdKX1mdW5jdGlvbiBkYShRYSl7di5wdXNoKFFhLngpO3YucHVzaChRYS55KX12YXIgcmE9W10scGE9dm9pZCAwIT09Yy5jdXJ2ZVNlZ21lbnRzP2MuY3VydmVTZWdtZW50czoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG5hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/CmMuYmV2ZWxUaGlja25lc3M6NixCYT12b2lkIDAhPT1jLmJldmVsU2l6ZT9jLmJldmVsU2l6ZTp0YS0yLFRhPXZvaWQgMCE9PWMuYmV2ZWxPZmZzZXQ/Yy5iZXZlbE9mZnNldDowLFVhPXZvaWQgMCE9PWMuYmV2ZWxTZWdtZW50cz9jLmJldmVsU2VnbWVudHM6MyxDYT1jLmV4dHJ1ZGVQYXRoLEhhPXZvaWQgMCE9PWMuVVZHZW5lcmF0b3I/Yy5VVkdlbmVyYXRvcjpHbTt2b2lkIDAhPT1jLmFtb3VudCYmKGNvbnNvbGUud2FybigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4iKSx1YT1jLmFtb3VudCk7dmFyIERhPSExO2lmKENhKXt2YXIgTWE9Q2EuZ2V0U3BhY2VkUG9pbnRzKHFhKTtEYT0hMDtuYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9bmF8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTsKRj1wYS5zaGFwZTt2YXIgRWI9cGEuaG9sZXM7aWYoIWdkLmlzQ2xvY2tXaXNlKEYpKXtGPUYucmV2ZXJzZSgpO3ZhciB4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7dmFyIGhhPUViW3hiXTtnZC5pc0Nsb2NrV2lzZShoYSkmJihFYlt4Yl09aGEucmV2ZXJzZSgpKX19dmFyIG1hPWdkLnRyaWFuZ3VsYXRlU2hhcGUoRixFYiksemE9Rjt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyloYT1FYlt4Yl0sRj1GLmNvbmNhdChoYSk7dmFyIEphLFlhPUYubGVuZ3RoLE5hLGNiPW1hLmxlbmd0aDtwYT1bXTt2YXIgaWE9MDt2YXIgR2E9emEubGVuZ3RoO3ZhciBMYT1HYS0xO2ZvcihKYT1pYSsxO2lhPEdhO2lhKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbaWFdPU0oemFbaWFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aGE9RWJbeGJdO3ZhciBWYT0KW107aWE9MDtHYT1oYS5sZW5ndGg7TGE9R2EtMTtmb3IoSmE9aWErMTtpYTxHYTtpYSsrLExhKyssSmErKylMYT09PUdhJiYoTGE9MCksSmE9PT1HYSYmKEphPTApLFZhW2lhXT1NKGhhW2lhXSxoYVtMYV0saGFbSmFdKTtDYS5wdXNoKFZhKTtuYj1uYi5jb25jYXQoVmEpfWZvcihMYT0wO0xhPFVhO0xhKyspe0dhPUxhL1VhO3ZhciBpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7aWE9MDtmb3IoR2E9emEubGVuZ3RoO2lhPEdhO2lhKyspe3ZhciBrYj1JKHphW2lhXSxwYVtpYV0sSmEpO1Eoa2IueCxrYi55LC1pYil9eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGhhPUViW3hiXSxWYT1DYVt4Yl0saWE9MCxHYT1oYS5sZW5ndGg7aWE8R2E7aWErKylrYj1JKGhhW2lhXSxWYVtpYV0sSmEpLFEoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGlhPTA7aWE8WWE7aWErKylrYj1uYT9JKEZbaWFdLG5iW2lhXSwKSmEpOkZbaWFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihrYi55KSxiYi5jb3B5KE1hWzBdKS5hZGQoS2EpLmFkZCh0YiksUShiYi54LGJiLnksYmIueikpOlEoa2IueCxrYi55LDApO2ZvcihHYT0xO0dhPD1xYTtHYSsrKWZvcihpYT0wO2lhPFlhO2lhKyspa2I9bmE/SShGW2lhXSxuYltpYV0sSmEpOkZbaWFdLERhPyhLYS5jb3B5KGRiLm5vcm1hbHNbR2FdKS5tdWx0aXBseVNjYWxhcihrYi54KSx0Yi5jb3B5KGRiLmJpbm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbR2FdKS5hZGQoS2EpLmFkZCh0YiksUShiYi54LGJiLnksYmIueikpOlEoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrClRhO2lhPTA7Zm9yKEdhPXphLmxlbmd0aDtpYTxHYTtpYSsrKWtiPUkoemFbaWFdLHBhW2lhXSxKYSksUShrYi54LGtiLnksdWEraWIpO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWZvcihoYT1FYlt4Yl0sVmE9Q2FbeGJdLGlhPTAsR2E9aGEubGVuZ3RoO2lhPEdhO2lhKyspa2I9SShoYVtpYV0sVmFbaWFdLEphKSxEYT9RKGtiLngsa2IueStNYVtxYS0xXS55LE1hW3FhLTFdLngraWIpOlEoa2IueCxrYi55LHVhK2liKX0oZnVuY3Rpb24oKXt2YXIgUWE9dC5sZW5ndGgvMztpZihuYSl7dmFyIGViPTAqWWE7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT1tYVtpYV0sVShOYVsyXStlYixOYVsxXStlYixOYVswXStlYik7ZWI9WWEqKHFhKzIqVWEpO2ZvcihpYT0wO2lhPGNiO2lhKyspTmE9bWFbaWFdLFUoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT1tYVtpYV0sVShOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGlhPTA7aWE8Y2I7aWErKylOYT0KbWFbaWFdLFUoTmFbMF0rWWEqcWEsTmFbMV0rWWEqcWEsTmFbMl0rWWEqcWEpfWcuYWRkR3JvdXAoUWEsdC5sZW5ndGgvMy1RYSwwKX0pKCk7KGZ1bmN0aW9uKCl7dmFyIFFhPXQubGVuZ3RoLzMsZWI9MDtQKHphLGViKTtlYis9emEubGVuZ3RoO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWhhPUViW3hiXSxQKGhhLGViKSxlYis9aGEubGVuZ3RoO2cuYWRkR3JvdXAoUWEsdC5sZW5ndGgvMy1RYSwxKX0pKCl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxvcHRpb25zOmN9O2E9QXJyYXkuaXNBcnJheShhKT9hOlthXTtmb3IodmFyIGc9dGhpcyx0PVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKHQsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX0KZnVuY3Rpb24gVmooYSxjLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBnPTAsdD1hLmxlbmd0aDtnPHQ7ZysrKWUuc2hhcGVzLnB1c2goYVtnXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYS51dWlkKTt2b2lkIDAhPT1jLmV4dHJ1ZGVQYXRoJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPWMuZXh0cnVkZVBhdGgudG9KU09OKCkpO3JldHVybiBlfWZ1bmN0aW9uIFNmKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRleHRHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt0ZXh0OmEscGFyYW1ldGVyczpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgT2UoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLApuZXcgeGE7YT1lLmdlbmVyYXRlU2hhcGVzKGEsYy5zaXplKTtjLmRlcHRoPXZvaWQgMCE9PWMuaGVpZ2h0P2MuaGVpZ2h0OjUwO3ZvaWQgMD09PWMuYmV2ZWxUaGlja25lc3MmJihjLmJldmVsVGhpY2tuZXNzPTEwKTt2b2lkIDA9PT1jLmJldmVsU2l6ZSYmKGMuYmV2ZWxTaXplPTgpO3ZvaWQgMD09PWMuYmV2ZWxFbmFibGVkJiYoYy5iZXZlbEVuYWJsZWQ9ITEpO1RjLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iVGV4dEJ1ZmZlckdlb21ldHJ5In1mdW5jdGlvbiBUZihhLGMsZSxnLHQsdix6KXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6dCx0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEVkKGEsYyxlLGcsdCx2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gRWQoYSxjLGUsZyx0LHYseil7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNwaGVyZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHdpZHRoU2VnbWVudHM6YyxoZWlnaHRTZWdtZW50czplLHBoaVN0YXJ0OmcscGhpTGVuZ3RoOnQsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9O2E9YXx8MTtjPU1hdGgubWF4KDMsTWF0aC5mbG9vcihjKXx8OCk7ZT1NYXRoLm1heCgyLE1hdGguZmxvb3IoZSl8fDYpO2c9dm9pZCAwIT09Zz9nOjA7dD12b2lkIDAhPT10P3Q6MipNYXRoLlBJO3Y9dm9pZCAwIT09dj92OjA7ej12b2lkIDAhPT16P3o6TWF0aC5QSTt2YXIgRT1NYXRoLm1pbih2K3osTWF0aC5QSSksRixJLE09MCxQPVtdLFE9bmV3IGssVT1uZXcgayxWPVtdLGVhPVtdLGRhPVtdLHJhPVtdO2ZvcihJPTA7STw9ZTtJKyspe3ZhciBwYT1bXSxxYT1JL2UsdWE9MDswPT1JJiYwPT12P3VhPS41L2M6ST09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTsKZm9yKEY9MDtGPD1jO0YrKyl7dmFyIG5hPUYvYztRLng9LWEqTWF0aC5jb3MoZytuYSp0KSpNYXRoLnNpbih2K3FhKnopO1EueT1hKk1hdGguY29zKHYrcWEqeik7US56PWEqTWF0aC5zaW4oZytuYSp0KSpNYXRoLnNpbih2K3FhKnopO2VhLnB1c2goUS54LFEueSxRLnopO1UuY29weShRKS5ub3JtYWxpemUoKTtkYS5wdXNoKFUueCxVLnksVS56KTtyYS5wdXNoKG5hK3VhLDEtcWEpO3BhLnB1c2goTSsrKX1QLnB1c2gocGEpfWZvcihJPTA7STxlO0krKylmb3IoRj0wO0Y8YztGKyspYT1QW0ldW0YrMV0sZz1QW0ldW0ZdLHQ9UFtJKzFdW0ZdLHo9UFtJKzFdW0YrMV0sKDAhPT1JfHwwPHYpJiZWLnB1c2goYSxnLHopLChJIT09ZS0xfHxFPE1hdGguUEkpJiZWLnB1c2goZyx0LHopO3RoaXMuc2V0SW5kZXgoVik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoZWEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYShkYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwKbmV3IGJhKHJhLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnLHQsdil7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czphLG91dGVyUmFkaXVzOmMsdGhldGFTZWdtZW50czplLHBoaVNlZ21lbnRzOmcsdGhldGFTdGFydDp0LHRoZXRhTGVuZ3RoOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBQZShhLGMsZSxnLHQsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFBlKGEsYyxlLGcsdCx2KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnQsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7dD12b2lkIDAhPT10P3Q6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsCmUpOjg7Zz12b2lkIDAhPT1nP01hdGgubWF4KDEsZyk6MTt2YXIgej1bXSxFPVtdLEY9W10sST1bXSxNPWEsUD0oYy1hKS9nLFE9bmV3IGssVT1uZXcgZixWLGVhO2ZvcihWPTA7Vjw9ZztWKyspe2ZvcihlYT0wO2VhPD1lO2VhKyspYT10K2VhL2UqdixRLng9TSpNYXRoLmNvcyhhKSxRLnk9TSpNYXRoLnNpbihhKSxFLnB1c2goUS54LFEueSxRLnopLEYucHVzaCgwLDAsMSksVS54PShRLngvYysxKS8yLFUueT0oUS55L2MrMSkvMixJLnB1c2goVS54LFUueSk7TSs9UH1mb3IoVj0wO1Y8ZztWKyspZm9yKGM9ViooZSsxKSxlYT0wO2VhPGU7ZWErKylhPWVhK2MsdD1hK2UrMSx2PWErZSsyLE09YSsxLHoucHVzaChhLHQsTSksei5wdXNoKHQsdixNKTt0aGlzLnNldEluZGV4KHopO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBiYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShJLDIpKX0KZnVuY3Rpb24gVmYoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUWUoYSxjLGUsZykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFFlKGEsYyxlLGcpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMYXRoZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3BvaW50czphLHNlZ21lbnRzOmMscGhpU3RhcnQ6ZSxwaGlMZW5ndGg6Z307Yz1NYXRoLmZsb29yKGMpfHwxMjtlPWV8fDA7Zz1nfHwyKk1hdGguUEk7Zz1oYi5jbGFtcChnLDAsMipNYXRoLlBJKTt2YXIgdD1bXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxJPW5ldyBmLE07Zm9yKE09MDtNPD1jO00rKyl7dmFyIFA9ZStNKkUqZzt2YXIgUT1NYXRoLnNpbihQKSxVPU1hdGguY29zKFApO2ZvcihQPTA7UDw9YS5sZW5ndGgtCjE7UCsrKUYueD1hW1BdLngqUSxGLnk9YVtQXS55LEYuej1hW1BdLngqVSx2LnB1c2goRi54LEYueSxGLnopLEkueD1NL2MsSS55PVAvKGEubGVuZ3RoLTEpLHoucHVzaChJLngsSS55KX1mb3IoTT0wO008YztNKyspZm9yKFA9MDtQPGEubGVuZ3RoLTE7UCsrKWU9UCtNKmEubGVuZ3RoLEU9ZSthLmxlbmd0aCxGPWUrYS5sZW5ndGgrMSxJPWUrMSx0LnB1c2goZSxFLEkpLHQucHVzaChFLEYsSSk7dGhpcy5zZXRJbmRleCh0KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYSh6LDIpKTt0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7aWYoZz09PTIqTWF0aC5QSSlmb3IoZz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5LHQ9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFA9TT0wO008YS5sZW5ndGg7TSsrLFArPTMpdC54PWdbUCswXSx0Lnk9Z1tQKzFdLHQuej1nW1ArMl0sdi54PQpnW2UrUCswXSx2Lnk9Z1tlK1ArMV0sdi56PWdbZStQKzJdLHouYWRkVmVjdG9ycyh0LHYpLm5vcm1hbGl6ZSgpLGdbUCswXT1nW2UrUCswXT16LngsZ1tQKzFdPWdbZStQKzFdPXoueSxnW1ArMl09Z1tlK1ArMl09ei56fWZ1bmN0aW9uIFhkKGEsYyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiOyJvYmplY3QiPT09dHlwZW9mIGMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuIiksYz1jLmN1cnZlU2VnbWVudHMpO3RoaXMucGFyYW1ldGVycz17c2hhcGVzOmEsY3VydmVTZWdtZW50czpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgWWQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWWQoYSxjKXtmdW5jdGlvbiBlKE0pe3ZhciBQLFE9dC5sZW5ndGgvMztNPU0uZXh0cmFjdFBvaW50cyhjKTt2YXIgVT1NLnNoYXBlLFY9TS5ob2xlczshMT09PWdkLmlzQ2xvY2tXaXNlKFUpJiYKKFU9VS5yZXZlcnNlKCkpO009MDtmb3IoUD1WLmxlbmd0aDtNPFA7TSsrKXt2YXIgZWE9VltNXTshMD09PWdkLmlzQ2xvY2tXaXNlKGVhKSYmKFZbTV09ZWEucmV2ZXJzZSgpKX12YXIgZGE9Z2QudHJpYW5ndWxhdGVTaGFwZShVLFYpO009MDtmb3IoUD1WLmxlbmd0aDtNPFA7TSsrKWVhPVZbTV0sVT1VLmNvbmNhdChlYSk7TT0wO2ZvcihQPVUubGVuZ3RoO008UDtNKyspZWE9VVtNXSx0LnB1c2goZWEueCxlYS55LDApLHYucHVzaCgwLDAsMSksei5wdXNoKGVhLngsZWEueSk7TT0wO2ZvcihQPWRhLmxlbmd0aDtNPFA7TSsrKVU9ZGFbTV0sZy5wdXNoKFVbMF0rUSxVWzFdK1EsVVsyXStRKSxGKz0zfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFwZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSx0PVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBJPQowO0k8YS5sZW5ndGg7SSsrKWUoYVtJXSksdGhpcy5hZGRHcm91cChFLEYsSSksRSs9RixGPTA7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh0LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgYmEodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmEoeiwyKSl9ZnVuY3Rpb24gV2ooYSxjKXtjLnNoYXBlcz1bXTtpZihBcnJheS5pc0FycmF5KGEpKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljLnNoYXBlcy5wdXNoKGFbZV0udXVpZCk7ZWxzZSBjLnNoYXBlcy5wdXNoKGEudXVpZCk7cmV0dXJuIGN9ZnVuY3Rpb24gUmUoYSxjKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0sdD17fSx2PVsiYSIsImIiLCJjIl07CmlmKGEuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHo9bmV3IHhhO3ouZnJvbUJ1ZmZlckdlb21ldHJ5KGEpfWVsc2Ugej1hLmNsb25lKCk7ei5tZXJnZVZlcnRpY2VzKCk7ei5jb21wdXRlRmFjZU5vcm1hbHMoKTthPXoudmVydGljZXM7ej16LmZhY2VzO2Zvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKylmb3IodmFyIEk9eltFXSxNPTA7Mz5NO00rKyl7dmFyIFA9SVt2W01dXTt2YXIgUT1JW3ZbKE0rMSklM11dO2dbMF09TWF0aC5taW4oUCxRKTtnWzFdPU1hdGgubWF4KFAsUSk7UD1nWzBdKyIsIitnWzFdO3ZvaWQgMD09PXRbUF0/dFtQXT17aW5kZXgxOmdbMF0saW5kZXgyOmdbMV0sZmFjZTE6RSxmYWNlMjp2b2lkIDB9OnRbUF0uZmFjZTI9RX1mb3IoUCBpbiB0KWlmKGc9dFtQXSx2b2lkIDA9PT1nLmZhY2UyfHx6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2LngsCnYueSx2LnopO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGUsMykpfWZ1bmN0aW9uIFpkKGEsYyxlLGcsdCx2LHosRSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEscmFkaXVzQm90dG9tOmMsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czp0LG9wZW5FbmRlZDp2LHRoZXRhU3RhcnQ6eix0aGV0YUxlbmd0aDpFfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgaGQoYSxjLGUsZyx0LHYseixFKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gaGQoYSxjLGUsZyx0LHYseixFKXtmdW5jdGlvbiBGKHBhKXt2YXIgcWEsdWE9bmV3IGYsbmE9bmV3IGssdGE9MCxCYT0hMD09PXBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVY7Zm9yKHFhPTE7cWE8PWc7cWErKylQLnB1c2goMCxkYSpUYSwwKSxRLnB1c2goMCxUYSwwKSxVLnB1c2goLjUsLjUpLApWKys7dmFyIENhPVY7Zm9yKHFhPTA7cWE8PWc7cWErKyl7dmFyIEhhPXFhL2cqRSt6LERhPU1hdGguY29zKEhhKTtIYT1NYXRoLnNpbihIYSk7bmEueD1CYSpIYTtuYS55PWRhKlRhO25hLno9QmEqRGE7UC5wdXNoKG5hLngsbmEueSxuYS56KTtRLnB1c2goMCxUYSwwKTt1YS54PS41KkRhKy41O3VhLnk9LjUqSGEqVGErLjU7VS5wdXNoKHVhLngsdWEueSk7VisrfWZvcihxYT0wO3FhPGc7cWErKyl1YT1VYStxYSxuYT1DYStxYSwhMD09PXBhP00ucHVzaChuYSxuYSsxLHVhKTpNLnB1c2gobmErMSxuYSx1YSksdGErPTM7SS5hZGRHcm91cChyYSx0YSwhMD09PXBhPzE6Mik7cmErPXRhfXZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDphLHJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6dCxvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07CnZhciBJPXRoaXM7YT12b2lkIDAhPT1hP2E6MTtjPXZvaWQgMCE9PWM/YzoxO2U9ZXx8MTtnPU1hdGguZmxvb3IoZyl8fDg7dD1NYXRoLmZsb29yKHQpfHwxO3Y9dm9pZCAwIT09dj92OiExO3o9dm9pZCAwIT09ej96OjA7RT12b2lkIDAhPT1FP0U6MipNYXRoLlBJO3ZhciBNPVtdLFA9W10sUT1bXSxVPVtdLFY9MCxlYT1bXSxkYT1lLzIscmE9MDsoZnVuY3Rpb24oKXt2YXIgcGEscWEsdWE9bmV3IGssbmE9bmV3IGssdGE9MCxCYT0oYy1hKS9lO2ZvcihxYT0wO3FhPD10O3FhKyspe3ZhciBUYT1bXSxVYT1xYS90LENhPVVhKihjLWEpK2E7Zm9yKHBhPTA7cGE8PWc7cGErKyl7dmFyIEhhPXBhL2csRGE9SGEqRSt6LE1hPU1hdGguc2luKERhKTtEYT1NYXRoLmNvcyhEYSk7bmEueD1DYSpNYTtuYS55PS1VYSplK2RhO25hLno9Q2EqRGE7UC5wdXNoKG5hLngsbmEueSxuYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1EucHVzaCh1YS54LHVhLnksdWEueik7VS5wdXNoKEhhLAoxLVVhKTtUYS5wdXNoKFYrKyl9ZWEucHVzaChUYSl9Zm9yKHBhPTA7cGE8ZztwYSsrKWZvcihxYT0wO3FhPHQ7cWErKyl1YT1lYVtxYSsxXVtwYV0sbmE9ZWFbcWErMV1bcGErMV0sQmE9ZWFbcWFdW3BhKzFdLE0ucHVzaChlYVtxYV1bcGFdLHVhLEJhKSxNLnB1c2godWEsbmEsQmEpLHRhKz02O0kuYWRkR3JvdXAocmEsdGEsMCk7cmErPXRhfSkoKTshMT09PXYmJigwPGEmJkYoITApLDA8YyYmRighMSkpO3RoaXMuc2V0SW5kZXgoTSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKFEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGJhKFUsMikpfWZ1bmN0aW9uIFdmKGEsYyxlLGcsdCx2LHope1pkLmNhbGwodGhpcywwLGEsYyxlLGcsdCx2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZywKb3BlbkVuZGVkOnQsdGhldGFTdGFydDp2LHRoZXRhTGVuZ3RoOnp9fWZ1bmN0aW9uIFhmKGEsYyxlLGcsdCx2LHope2hkLmNhbGwodGhpcywwLGEsYyxlLGcsdCx2LHopO3RoaXMudHlwZT0iQ29uZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6dCx0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gWWYoYSxjLGUsZyl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBTZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSxzZWdtZW50czpjLHRoZXRhU3RhcnQ6ZSx0aGV0YUxlbmd0aDpnfTthPWF8fDE7Yz12b2lkIDAhPT1jP01hdGgubWF4KDMsYyk6ODtlPXZvaWQgMCE9PWU/ZTowO2c9dm9pZCAwIT09Zz9nOjIqTWF0aC5QSTt2YXIgdD1bXSx2PVtdLHo9W10sRT1bXSxGLEk9bmV3IGssTT1uZXcgZjt2LnB1c2goMCwwLDApO3oucHVzaCgwLDAsMSk7RS5wdXNoKC41LC41KTt2YXIgUD0wO2ZvcihGPTM7UDw9YztQKyssRis9Myl7dmFyIFE9ZStQL2MqZztJLng9YSpNYXRoLmNvcyhRKTtJLnk9YSpNYXRoLnNpbihRKTt2LnB1c2goSS54LEkueSxJLnopO3oucHVzaCgwLDAsMSk7TS54PSh2W0ZdL2ErMSkvMjtNLnk9KHZbRisxXS9hKzEpLzI7RS5wdXNoKE0ueCxNLnkpfWZvcihGPTE7Rjw9YztGKyspdC5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgodCk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGJhKHosCjMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBiYShFLDIpKX1mdW5jdGlvbiAkZChhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgwKTt0aGlzLnRyYW5zcGFyZW50PSEwO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFRlKGEpe3FiLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn1mdW5jdGlvbiBVYyhhKXtTLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5tZXRhbG5lc3M9dGhpcy5yb3VnaG5lc3M9LjU7dGhpcy5saWdodE1hcD10aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEgoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xOwp0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLm1ldGFsbmVzc01hcD10aGlzLnJvdWdobmVzc01hcD1udWxsO3RoaXMuZW52TWFwSW50ZW5zaXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe1VjLmNhbGwodGhpcyk7CnRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMudHlwZT0iTWVzaFBoeXNpY2FsTWF0ZXJpYWwiO3RoaXMucmVmbGVjdGl2aXR5PS41O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0PTA7dGhpcy5zaGVlbj1udWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsO3RoaXMudHJhbnNwYXJlbmN5PTA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gRGMoYSl7Uy5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaFBob25nTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEgoMTY3NzcyMTUpO3RoaXMuc3BlY3VsYXI9bmV3IEgoMTExODQ4MSk7dGhpcy5zaGluaW5lc3M9MzA7dGhpcy5saWdodE1hcD10aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEgoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KMTt0aGlzLmJ1bXBNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gYmUoYSl7RGMuY2FsbCh0aGlzKTsKdGhpcy5kZWZpbmVzPXtUT09OOiIifTt0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiO3RoaXMuZ3JhZGllbnRNYXA9bnVsbDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtTLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiO3RoaXMuYnVtcE1hcD1udWxsO3RoaXMuYnVtcFNjYWxlPTE7dGhpcy5ub3JtYWxNYXA9bnVsbDt0aGlzLm5vcm1hbE1hcFR5cGU9MDt0aGlzLm5vcm1hbFNjYWxlPW5ldyBmKDEsMSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTE7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPTA7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe1MuY2FsbCh0aGlzKTt0aGlzLnR5cGU9CiJNZXNoTGFtYmVydE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBIKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbWlzc2l2ZT1uZXcgSCgwKTt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPXRoaXMuZW1pc3NpdmVNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCI7dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBlZShhKXtTLmNhbGwodGhpcyk7CnRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifTt0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSCgxNjc3NzIxNSk7dGhpcy5idW1wTWFwPXRoaXMubWFwPXRoaXMubWF0Y2FwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmFscGhhTWFwPW51bGw7dGhpcy5saWdodHM9dGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBmZShhKXtGYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfQpmdW5jdGlvbiByYyhhLGMsZSxnKXt0aGlzLnBhcmFtZXRlclBvc2l0aW9ucz1hO3RoaXMuX2NhY2hlZEluZGV4PTA7dGhpcy5yZXN1bHRCdWZmZXI9dm9pZCAwIT09Zz9nOm5ldyBjLmNvbnN0cnVjdG9yKGUpO3RoaXMuc2FtcGxlVmFsdWVzPWM7dGhpcy52YWx1ZVNpemU9ZX1mdW5jdGlvbiBIZyhhLGMsZSxnKXtyYy5jYWxsKHRoaXMsYSxjLGUsZyk7dGhpcy5fb2Zmc2V0TmV4dD10aGlzLl93ZWlnaHROZXh0PXRoaXMuX29mZnNldFByZXY9dGhpcy5fd2VpZ2h0UHJldj0tMH1mdW5jdGlvbiBaZihhLGMsZSxnKXtyYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gSWcoYSxjLGUsZyl7cmMuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFpiKGEsYyxlLGcpe2lmKHZvaWQgMD09PWEpdGhyb3cgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIisKYSk7dGhpcy5uYW1lPWE7dGhpcy50aW1lcz1WYi5jb252ZXJ0QXJyYXkoYyx0aGlzLlRpbWVCdWZmZXJUeXBlKTt0aGlzLnZhbHVlcz1WYi5jb252ZXJ0QXJyYXkoZSx0aGlzLlZhbHVlQnVmZmVyVHlwZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKGd8fHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfWZ1bmN0aW9uIEpnKGEsYyxlKXtaYi5jYWxsKHRoaXMsYSxjLGUpfWZ1bmN0aW9uIEtnKGEsYyxlLGcpe1piLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBVZShhLGMsZSxnKXtaYi5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gTGcoYSxjLGUsZyl7cmMuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uICRmKGEsYyxlLGcpe1piLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBNZyhhLGMsZSxnKXtaYi5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gVmUoYSxjLGUsZyl7WmIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHZjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz0KZTt0aGlzLmR1cmF0aW9uPXZvaWQgMCE9PWM/YzotMTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7MD50aGlzLmR1cmF0aW9uJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1mdW5jdGlvbiBIbShhKXtzd2l0Y2goYS50b0xvd2VyQ2FzZSgpKXtjYXNlICJzY2FsYXIiOmNhc2UgImRvdWJsZSI6Y2FzZSAiZmxvYXQiOmNhc2UgIm51bWJlciI6Y2FzZSAiaW50ZWdlciI6cmV0dXJuIFVlO2Nhc2UgInZlY3RvciI6Y2FzZSAidmVjdG9yMiI6Y2FzZSAidmVjdG9yMyI6Y2FzZSAidmVjdG9yNCI6cmV0dXJuIFZlO2Nhc2UgImNvbG9yIjpyZXR1cm4gS2c7Y2FzZSAicXVhdGVybmlvbiI6cmV0dXJuICRmO2Nhc2UgImJvb2wiOmNhc2UgImJvb2xlYW4iOnJldHVybiBKZztjYXNlICJzdHJpbmciOnJldHVybiBNZ310aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICIrYSk7fWZ1bmN0aW9uIEltKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTsKdmFyIGM9SG0oYS50eXBlKTtpZih2b2lkIDA9PT1hLnRpbWVzKXt2YXIgZT1bXSxnPVtdO1ZiLmZsYXR0ZW5KU09OKGEua2V5cyxlLGcsInZhbHVlIik7YS50aW1lcz1lO2EudmFsdWVzPWd9cmV0dXJuIHZvaWQgMCE9PWMucGFyc2U/Yy5wYXJzZShhKTpuZXcgYyhhLm5hbWUsYS50aW1lcyxhLnZhbHVlcyxhLmludGVycG9sYXRpb24pfWZ1bmN0aW9uIGVpKGEsYyxlKXt2YXIgZz10aGlzLHQ9ITEsdj0wLHo9MCxFPXZvaWQgMDt0aGlzLm9uU3RhcnQ9dm9pZCAwO3RoaXMub25Mb2FkPWE7dGhpcy5vblByb2dyZXNzPWM7dGhpcy5vbkVycm9yPWU7dGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24oRil7eisrO2lmKCExPT09dCYmdm9pZCAwIT09Zy5vblN0YXJ0KWcub25TdGFydChGLHYseik7dD0hMH07dGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHQ9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9Owp0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbihGKXtpZih2b2lkIDAhPT1nLm9uRXJyb3IpZy5vbkVycm9yKEYpfTt0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24oRil7cmV0dXJuIEU/RShGKTpGfTt0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKEYpe0U9RjtyZXR1cm4gdGhpc319ZnVuY3Rpb24gRGIoYSl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PWE/YTpYajt0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucGF0aD0iIn1mdW5jdGlvbiB3YyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gZmkoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGdpKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLl9wYXJzZXI9bnVsbH1mdW5jdGlvbiBOZyhhKXtEYi5jYWxsKHRoaXMsYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gV2UoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIE9nKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBQZyhhKXtEYi5jYWxsKHRoaXMsCmEpfWZ1bmN0aW9uIFphKCl7dGhpcy50eXBlPSJDdXJ2ZSI7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWZ1bmN0aW9uIHNjKGEsYyxlLGcsdCx2LHosRSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkVsbGlwc2VDdXJ2ZSI7dGhpcy5hWD1hfHwwO3RoaXMuYVk9Y3x8MDt0aGlzLnhSYWRpdXM9ZXx8MTt0aGlzLnlSYWRpdXM9Z3x8MTt0aGlzLmFTdGFydEFuZ2xlPXR8fDA7dGhpcy5hRW5kQW5nbGU9dnx8MipNYXRoLlBJO3RoaXMuYUNsb2Nrd2lzZT16fHwhMTt0aGlzLmFSb3RhdGlvbj1FfHwwfWZ1bmN0aW9uIFhlKGEsYyxlLGcsdCx2KXtzYy5jYWxsKHRoaXMsYSxjLGUsZSxnLHQsdik7dGhpcy50eXBlPSJBcmNDdXJ2ZSJ9ZnVuY3Rpb24gaGkoKXtmdW5jdGlvbiBhKHYseixFLEYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjt0PTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCx0PTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSSl7YSh6LEUsSSoKKEUtdiksSSooRi16KSl9LGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTpmdW5jdGlvbih2LHosRSxGLEksTSxQKXthKHosRSwoKHotdikvSS0oRS12KS8oSStNKSsoRS16KS9NKSpNLCgoRS16KS9NLShGLXopLyhNK1ApKyhGLUUpL1ApKk0pfSxjYWxjOmZ1bmN0aW9uKHYpe3ZhciB6PXYqdjtyZXR1cm4gYytlKnYrZyp6K3Qqeip2fX19ZnVuY3Rpb24gYmMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiO3RoaXMucG9pbnRzPWF8fFtdO3RoaXMuY2xvc2VkPWN8fCExO3RoaXMuY3VydmVUeXBlPWV8fCJjZW50cmlwZXRhbCI7dGhpcy50ZW5zaW9uPWd8fC41fWZ1bmN0aW9uIFlqKGEsYyxlLGcsdCl7Yz0uNSooZy1jKTt0PS41Kih0LWUpO3ZhciB2PWEqYTtyZXR1cm4oMiplLTIqZytjK3QpKmEqdisoLTMqZSszKmctMipjLXQpKnYrYyphK2V9ZnVuY3Rpb24gSm0oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gS20oYSxjKXtyZXR1cm4gMioKKDEtYSkqYSpjfWZ1bmN0aW9uIExtKGEsYyl7cmV0dXJuIGEqYSpjfWZ1bmN0aW9uIGFnKGEsYyxlLGcpe3JldHVybiBKbShhLGMpK0ttKGEsZSkrTG0oYSxnKX1mdW5jdGlvbiBNbShhLGMpe2E9MS1hO3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIE5tKGEsYyl7dmFyIGU9MS1hO3JldHVybiAzKmUqZSphKmN9ZnVuY3Rpb24gT20oYSxjKXtyZXR1cm4gMyooMS1hKSphKmEqY31mdW5jdGlvbiBQbShhLGMpe3JldHVybiBhKmEqYSpjfWZ1bmN0aW9uIGJnKGEsYyxlLGcsdCl7cmV0dXJuIE1tKGEsYykrTm0oYSxlKStPbShhLGcpK1BtKGEsdCl9ZnVuY3Rpb24gRWMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUiO3RoaXMudjA9YXx8bmV3IGY7dGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVmMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjsKdGhpcy52MD1hfHxuZXcgazt0aGlzLnYxPWN8fG5ldyBrO3RoaXMudjI9ZXx8bmV3IGs7dGhpcy52Mz1nfHxuZXcga31mdW5jdGlvbiBuYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUiO3RoaXMudjE9YXx8bmV3IGY7dGhpcy52Mj1jfHxuZXcgZn1mdW5jdGlvbiBGYyhhLGMpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaW5lQ3VydmUzIjt0aGlzLnYxPWF8fG5ldyBrO3RoaXMudjI9Y3x8bmV3IGt9ZnVuY3Rpb24gR2MoYSxjLGUpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjt0aGlzLnYxPWN8fG5ldyBmO3RoaXMudjI9ZXx8bmV3IGZ9ZnVuY3Rpb24gV2MoYSxjLGUpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEhjKGEpe1phLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iU3BsaW5lQ3VydmUiO3RoaXMucG9pbnRzPWF8fFtdfWZ1bmN0aW9uIGlkKCl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1cnZlUGF0aCI7dGhpcy5jdXJ2ZXM9W107dGhpcy5hdXRvQ2xvc2U9ITF9ZnVuY3Rpb24gSWMoYSl7aWQuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhdGgiO3RoaXMuY3VycmVudFBvaW50PW5ldyBmO2EmJnRoaXMuc2V0RnJvbVBvaW50cyhhKX1mdW5jdGlvbiBGZChhKXtJYy5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMudHlwZT0iU2hhcGUiO3RoaXMuaG9sZXM9W119ZnVuY3Rpb24gS2IoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJMaWdodCI7dGhpcy5jb2xvcj1uZXcgSChhKTt0aGlzLmludGVuc2l0eT12b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFFnKGEsYyxlKXtLYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PQp2b2lkIDA7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMuZ3JvdW5kQ29sb3I9bmV3IEgoYyl9ZnVuY3Rpb24gWGMoYSl7dGhpcy5jYW1lcmE9YTt0aGlzLmJpYXM9MDt0aGlzLnJhZGl1cz0xO3RoaXMubWFwU2l6ZT1uZXcgZig1MTIsNTEyKTt0aGlzLm1hcFBhc3M9dGhpcy5tYXA9bnVsbDt0aGlzLm1hdHJpeD1uZXcgcTt0aGlzLl9mcnVzdHVtPW5ldyBsYzt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoMSwxKTt0aGlzLl92aWV3cG9ydENvdW50PTE7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgwLDAsMSwxKV19ZnVuY3Rpb24gUmcoKXtYYy5jYWxsKHRoaXMsbmV3IHZiKDUwLDEsLjUsNTAwKSl9ZnVuY3Rpb24gU2coYSxjLGUsZyx0LHYpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24oeil7dGhpcy5pbnRlbnNpdHk9ei9NYXRoLlBJfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT9lOjA7dGhpcy5hbmdsZT12b2lkIDAhPT1nP2c6TWF0aC5QSS8zO3RoaXMucGVudW1icmE9dm9pZCAwIT09dD90OjA7dGhpcy5kZWNheT12b2lkIDAhPT12P3Y6MTt0aGlzLnNoYWRvdz1uZXcgUmd9ZnVuY3Rpb24gaWkoKXtYYy5jYWxsKHRoaXMsbmV3IHZiKDkwLDEsLjUsNTAwKSk7dGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBmKDQsMik7dGhpcy5fdmlld3BvcnRDb3VudD02O3RoaXMuX3ZpZXdwb3J0cz1bbmV3IHAoMiwxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLAowLDApLG5ldyBrKC0xLDAsMCksbmV3IGsoMCwwLDEpLG5ldyBrKDAsMCwtMSksbmV3IGsoMCwxLDApLG5ldyBrKDAsLTEsMCldO3RoaXMuX2N1YmVVcHM9W25ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKV19ZnVuY3Rpb24gVGcoYSxjLGUsZyl7S2IuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJQb2ludExpZ2h0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicG93ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX19KTt0aGlzLmRpc3RhbmNlPXZvaWQgMCE9PWU/ZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGlpfWZ1bmN0aW9uIGNnKGEsYyxlLGcsdCx2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjsKdGhpcy56b29tPTE7dGhpcy52aWV3PW51bGw7dGhpcy5sZWZ0PXZvaWQgMCE9PWE/YTotMTt0aGlzLnJpZ2h0PXZvaWQgMCE9PWM/YzoxO3RoaXMudG9wPXZvaWQgMCE9PWU/ZToxO3RoaXMuYm90dG9tPXZvaWQgMCE9PWc/ZzotMTt0aGlzLm5lYXI9dm9pZCAwIT09dD90Oi4xO3RoaXMuZmFyPXZvaWQgMCE9PXY/djoyRTM7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9ZnVuY3Rpb24gVWcoKXtYYy5jYWxsKHRoaXMsbmV3IGNnKC01LDUsNSwtNSwuNSw1MDApKX1mdW5jdGlvbiBWZyhhLGMpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodCI7dGhpcy5wb3NpdGlvbi5jb3B5KEEuRGVmYXVsdFVwKTt0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBVZ31mdW5jdGlvbiBXZyhhLGMpe0tiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfQpmdW5jdGlvbiBYZyhhLGMsZSxnKXtLYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiO3RoaXMud2lkdGg9dm9pZCAwIT09ZT9lOjEwO3RoaXMuaGVpZ2h0PXZvaWQgMCE9PWc/ZzoxMH1mdW5jdGlvbiBZZyhhKXtEYi5jYWxsKHRoaXMsYSk7dGhpcy50ZXh0dXJlcz17fX1mdW5jdGlvbiBaZygpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD12b2lkIDB9ZnVuY3Rpb24gJGcoYSxjLGUsZyl7Im51bWJlciI9PT10eXBlb2YgZSYmKGc9ZSxlPSExLGNvbnNvbGUuZXJyb3IoIlRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIG5vcm1hbGl6ZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LiIpKTtSLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gYWgoYSl7RGIuY2FsbCh0aGlzLGEpfQpmdW5jdGlvbiBiaChhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gamkoYSl7InVuZGVmaW5lZCI9PT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKTsidW5kZWZpbmVkIj09PXR5cGVvZiBmZXRjaCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLiIpO0RiLmNhbGwodGhpcyxhKTt0aGlzLm9wdGlvbnM9dm9pZCAwfWZ1bmN0aW9uIGtpKCl7dGhpcy50eXBlPSJTaGFwZVBhdGgiO3RoaXMuY29sb3I9bmV3IEg7dGhpcy5zdWJQYXRocz1bXTt0aGlzLmN1cnJlbnRQYXRoPW51bGx9ZnVuY3Rpb24gbGkoYSl7dGhpcy50eXBlPSJGb250Ijt0aGlzLmRhdGE9YX1mdW5jdGlvbiBRbShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247CmZvcih2YXIgZz0oZS5ib3VuZGluZ0JveC55TWF4LWUuYm91bmRpbmdCb3gueU1pbitlLnVuZGVybGluZVRoaWNrbmVzcykqYyx0PVtdLHY9MCx6PTAsRT0wO0U8YS5sZW5ndGg7RSsrKXt2YXIgRj1hW0VdOyJcbiI9PT1GPyh2PTAsei09Zyk6KEY9Um0oRixjLHYseixlKSx2Kz1GLm9mZnNldFgsdC5wdXNoKEYucGF0aCkpfXJldHVybiB0fWZ1bmN0aW9uIFJtKGEsYyxlLGcsdCl7dmFyIHY9dC5nbHlwaHNbYV18fHQuZ2x5cGhzWyI/Il07aWYodil7YT1uZXcga2k7aWYodi5vKXt0PXYuX2NhY2hlZE91dGxpbmV8fCh2Ll9jYWNoZWRPdXRsaW5lPXYuby5zcGxpdCgiICIpKTtmb3IodmFyIHo9MCxFPXQubGVuZ3RoO3o8RTspc3dpdGNoKHRbeisrXSl7Y2FzZSAibSI6dmFyIEY9dFt6KytdKmMrZTt2YXIgST10W3orK10qYytnO2EubW92ZVRvKEYsSSk7YnJlYWs7Y2FzZSAibCI6Rj10W3orK10qYytlO0k9dFt6KytdKmMrZzthLmxpbmVUbyhGLEkpO2JyZWFrO2Nhc2UgInEiOkY9dFt6KytdKgpjK2U7ST10W3orK10qYytnO3ZhciBNPXRbeisrXSpjK2U7dmFyIFA9dFt6KytdKmMrZzthLnF1YWRyYXRpY0N1cnZlVG8oTSxQLEYsSSk7YnJlYWs7Y2FzZSAiYiI6Rj10W3orK10qYytlO0k9dFt6KytdKmMrZztNPXRbeisrXSpjK2U7UD10W3orK10qYytnO3ZhciBRPXRbeisrXSpjK2U7dmFyIFU9dFt6KytdKmMrZzthLmJlemllckN1cnZlVG8oTSxQLFEsVSxGLEkpfX1yZXR1cm57b2Zmc2V0WDp2LmhhKmMscGF0aDphfX1jb25zb2xlLmVycm9yKCdUSFJFRS5Gb250OiBjaGFyYWN0ZXIgIicrYSsnIiBkb2VzIG5vdCBleGlzdHMgaW4gZm9udCBmYW1pbHkgJyt0LmZhbWlseU5hbWUrIi4iKX1mdW5jdGlvbiBtaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gY2goYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIGRoKCl7dGhpcy5jb2VmZmljaWVudHM9W107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBKYyhhLGMpe0tiLmNhbGwodGhpcywKdm9pZCAwLGMpO3RoaXMuc2g9dm9pZCAwIT09YT9hOm5ldyBkaH1mdW5jdGlvbiBuaShhLGMsZSl7SmMuY2FsbCh0aGlzLHZvaWQgMCxlKTthPShuZXcgSCkuc2V0KGEpO2U9KG5ldyBIKS5zZXQoYyk7Yz1uZXcgayhhLnIsYS5nLGEuYik7YT1uZXcgayhlLnIsZS5nLGUuYik7ZT1NYXRoLnNxcnQoTWF0aC5QSSk7dmFyIGc9ZSpNYXRoLnNxcnQoLjc1KTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5jb3B5KGMpLmFkZChhKS5tdWx0aXBseVNjYWxhcihlKTt0aGlzLnNoLmNvZWZmaWNpZW50c1sxXS5jb3B5KGMpLnN1YihhKS5tdWx0aXBseVNjYWxhcihnKX1mdW5jdGlvbiBvaShhLGMpe0pjLmNhbGwodGhpcyx2b2lkIDAsYyk7YT0obmV3IEgpLnNldChhKTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5zZXQoYS5yLGEuZyxhLmIpLm11bHRpcGx5U2NhbGFyKDIqTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBaaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xOwp0aGlzLmV5ZVNlcD0uMDY0O3RoaXMuY2FtZXJhTD1uZXcgdmI7dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoMSk7dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jYW1lcmFSPW5ldyB2Yjt0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSgyKTt0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLl9jYWNoZT17Zm9jdXM6bnVsbCxmb3Y6bnVsbCxhc3BlY3Q6bnVsbCxuZWFyOm51bGwsZmFyOm51bGwsem9vbTpudWxsLGV5ZVNlcDpudWxsfX1mdW5jdGlvbiBwaShhKXt0aGlzLmF1dG9TdGFydD12b2lkIDAhPT1hP2E6ITA7dGhpcy5lbGFwc2VkVGltZT10aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITF9ZnVuY3Rpb24gcWkoKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIjt0aGlzLmNvbnRleHQ9cmkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7CnRoaXMuZmlsdGVyPW51bGw7dGhpcy50aW1lRGVsdGE9MDt0aGlzLl9jbG9jaz1uZXcgcGl9ZnVuY3Rpb24gWWUoYSl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQXVkaW8iO3RoaXMubGlzdGVuZXI9YTt0aGlzLmNvbnRleHQ9YS5jb250ZXh0O3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KGEuZ2V0SW5wdXQoKSk7dGhpcy5hdXRvcGxheT0hMTt0aGlzLmJ1ZmZlcj1udWxsO3RoaXMuZGV0dW5lPTA7dGhpcy5sb29wPSExO3RoaXMub2Zmc2V0PXRoaXMuc3RhcnRUaW1lPTA7dGhpcy5kdXJhdGlvbj12b2lkIDA7dGhpcy5wbGF5YmFja1JhdGU9MTt0aGlzLmlzUGxheWluZz0hMTt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMDt0aGlzLnNvdXJjZVR5cGU9ImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gc2koYSl7WWUuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9CiJIUlRGIjt0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZnVuY3Rpb24gdGkoYSxjKXt0aGlzLmFuYWx5c2VyPWEuY29udGV4dC5jcmVhdGVBbmFseXNlcigpO3RoaXMuYW5hbHlzZXIuZmZ0U2l6ZT12b2lkIDAhPT1jP2M6MjA0ODt0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCk7YS5nZXRPdXRwdXQoKS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpfWZ1bmN0aW9uIHVpKGEsYyxlKXt0aGlzLmJpbmRpbmc9YTt0aGlzLnZhbHVlU2l6ZT1lO2E9RmxvYXQ2NEFycmF5O3N3aXRjaChjKXtjYXNlICJxdWF0ZXJuaW9uIjpjPXRoaXMuX3NsZXJwO2JyZWFrO2Nhc2UgInN0cmluZyI6Y2FzZSAiYm9vbCI6YT1BcnJheTtjPXRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD0KdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9ZnVuY3Rpb24gYWsoYSxjLGUpe2U9ZXx8Y2MucGFyc2VUcmFja05hbWUoYyk7dGhpcy5fdGFyZ2V0R3JvdXA9YTt0aGlzLl9iaW5kaW5ncz1hLnN1YnNjcmliZV8oYyxlKX1mdW5jdGlvbiBjYyhhLGMsZSl7dGhpcy5wYXRoPWM7dGhpcy5wYXJzZWRQYXRoPWV8fGNjLnBhcnNlVHJhY2tOYW1lKGMpO3RoaXMubm9kZT1jYy5maW5kTm9kZShhLHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSl8fGE7dGhpcy5yb290Tm9kZT1hfWZ1bmN0aW9uIGJrKCl7dGhpcy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpO3RoaXMuX29iamVjdHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm5DYWNoZWRPYmplY3RzXz0wO3ZhciBhPXt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9CltdO3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTt2YXIgZz10aGlzO3RoaXMuc3RhdHM9e29iamVjdHM6e2dldCB0b3RhbCgpe3JldHVybiBnLl9vYmplY3RzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHRoaXMudG90YWwtZy5uQ2FjaGVkT2JqZWN0c199fSxnZXQgYmluZGluZ3NQZXJPYmplY3QoKXtyZXR1cm4gZy5fYmluZGluZ3MubGVuZ3RofX19ZnVuY3Rpb24gY2soYSxjLGUpe3RoaXMuX21peGVyPWE7dGhpcy5fY2xpcD1jO3RoaXMuX2xvY2FsUm9vdD1lfHxudWxsO2E9Yy50cmFja3M7Yz1hLmxlbmd0aDtlPUFycmF5KGMpO2Zvcih2YXIgZz17ZW5kaW5nU3RhcnQ6MjQwMCxlbmRpbmdFbmQ6MjQwMH0sdD0wO3QhPT1jOysrdCl7dmFyIHY9YVt0XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3RdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPQpBcnJheShjKTt0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD10aGlzLl9ieUNsaXBDYWNoZUluZGV4PXRoaXMuX2NhY2hlSW5kZXg9bnVsbDt0aGlzLmxvb3A9MjIwMTt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7dGhpcy50aW1lPTA7dGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMud2VpZ2h0PXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnRpbWVTY2FsZT0xO3RoaXMucmVwZXRpdGlvbnM9SW5maW5pdHk7dGhpcy5wYXVzZWQ9ITE7dGhpcy5lbmFibGVkPSEwO3RoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITE7dGhpcy56ZXJvU2xvcGVBdEVuZD10aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITB9ZnVuY3Rpb24gdmkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gZWgoYSxjKXsic3RyaW5nIj09PQp0eXBlb2YgYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKSxhPWMpO3RoaXMudmFsdWU9YX1mdW5jdGlvbiB3aShhLGMsZSl7U2QuY2FsbCh0aGlzLGEsYyk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWV8fDF9ZnVuY3Rpb24gZGsoYSxjLGUsZyl7dGhpcy5yYXk9bmV3IEQoYSxjKTt0aGlzLm5lYXI9ZXx8MDt0aGlzLmZhcj1nfHxJbmZpbml0eTt0aGlzLmNhbWVyYT1udWxsO3RoaXMucGFyYW1zPXtNZXNoOnt9LExpbmU6e30sTE9EOnt9LFBvaW50czp7dGhyZXNob2xkOjF9LFNwcml0ZTp7fX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcy5wYXJhbXMse1BvaW50Q2xvdWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuIik7cmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBlayhhLApjKXtyZXR1cm4gYS5kaXN0YW5jZS1jLmRpc3RhbmNlfWZ1bmN0aW9uIHhpKGEsYyxlLGcpe2lmKCExIT09YS52aXNpYmxlJiYoYS5yYXljYXN0KGMsZSksITA9PT1nKSl7YT1hLmNoaWxkcmVuO2c9MDtmb3IodmFyIHQ9YS5sZW5ndGg7Zzx0O2crKyl4aShhW2ddLGMsZSwhMCl9fWZ1bmN0aW9uIGZrKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnBoaT12b2lkIDAhPT1jP2M6MDt0aGlzLnRoZXRhPXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIGdrKGEsYyxlKXt0aGlzLnJhZGl1cz12b2lkIDAhPT1hP2E6MTt0aGlzLnRoZXRhPXZvaWQgMCE9PWM/YzowO3RoaXMueT12b2lkIDAhPT1lP2U6MDtyZXR1cm4gdGhpc31mdW5jdGlvbiB5aShhLGMpe3RoaXMubWluPXZvaWQgMCE9PWE/YTpuZXcgZihJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09Yz9jOm5ldyBmKC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIHppKGEsYyl7dGhpcy5zdGFydD0Kdm9pZCAwIT09YT9hOm5ldyBrO3RoaXMuZW5kPXZvaWQgMCE9PWM/YzpuZXcga31mdW5jdGlvbiBkZyhhKXtBLmNhbGwodGhpcyk7dGhpcy5tYXRlcmlhbD1hO3RoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiBlZyhhLGMsZSxnKXt0aGlzLm9iamVjdD1hO3RoaXMuc2l6ZT12b2lkIDAhPT1jP2M6MTthPXZvaWQgMCE9PWU/ZToxNjcxMTY4MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPTMqZS5mYWNlcy5sZW5ndGg6ZSYmZS5pc0J1ZmZlckdlb21ldHJ5JiYoYz1lLmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50KTtlPW5ldyB2YTtjPW5ldyBiYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gWmUoYSxjKXtBLmNhbGwodGhpcyk7CnRoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1jO2E9bmV3IHZhO2M9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2Zvcih2YXIgZT0wLGc9MTszMj5lO2UrKyxnKyspe3ZhciB0PWUvMzIqTWF0aC5QSSoyLHY9Zy8zMipNYXRoLlBJKjI7Yy5wdXNoKE1hdGguY29zKHQpLE1hdGguc2luKHQpLDEsTWF0aC5jb3ModiksTWF0aC5zaW4odiksMSl9YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoYywzKSk7Yz1uZXcgRmIoe2ZvZzohMX0pO3RoaXMuY29uZT1uZXcgSWIoYSxjKTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gaGsoYSl7dmFyIGM9W107YSYmYS5pc0JvbmUmJmMucHVzaChhKTtmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYywKaGsoYS5jaGlsZHJlbltlXSkpO3JldHVybiBjfWZ1bmN0aW9uICRlKGEpe2Zvcih2YXIgYz1oayhhKSxlPW5ldyB2YSxnPVtdLHQ9W10sdj1uZXcgSCgwLDAsMSksej1uZXcgSCgwLDEsMCksRT0wO0U8Yy5sZW5ndGg7RSsrKXt2YXIgRj1jW0VdO0YucGFyZW50JiZGLnBhcmVudC5pc0JvbmUmJihnLnB1c2goMCwwLDApLGcucHVzaCgwLDAsMCksdC5wdXNoKHYucix2Lmcsdi5iKSx0LnB1c2goei5yLHouZyx6LmIpKX1lLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShnLDMpKTtlLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYSh0LDMpKTtnPW5ldyBGYih7dmVydGV4Q29sb3JzOjIsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsdHJhbnNwYXJlbnQ6ITB9KTtJYi5jYWxsKHRoaXMsZSxnKTt0aGlzLnJvb3Q9YTt0aGlzLmJvbmVzPWM7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9ZnVuY3Rpb24gYWYoYSxjLGUpe3RoaXMubGlnaHQ9CmE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMuY29sb3I9ZTthPW5ldyBFZChjLDQsMik7Yz1uZXcgTih7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3lhLmNhbGwodGhpcyxhLGMpO3RoaXMubWF0cml4PXRoaXMubGlnaHQubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHRIZWxwZXIiO3RoaXMubGlnaHQ9YTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsLTEsMCwxLDEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7Yz1uZXcgRmIoe2ZvZzohMX0pO1hiLmNhbGwodGhpcyxhLGMpO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFsxLDEsMCwtMSwxLDAsLTEsLTEsMCwxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CnRoaXMuYWRkKG5ldyB5YShhLG5ldyBOKHtzaWRlOjEsZm9nOiExfSkpKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGNmKGEsYyxlKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWU7YT1uZXcgVGQoYyk7YS5yb3RhdGVZKC41Kk1hdGguUEkpO3RoaXMubWF0ZXJpYWw9bmV3IE4oe3dpcmVmcmFtZTohMCxmb2c6ITF9KTt2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9Mik7Yz1hLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypjLmNvdW50KSwzKSk7dGhpcy5hZGQobmV3IHlhKGEsdGhpcy5tYXRlcmlhbCkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZGYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9CmM7YT1uZXcgcWIoe2RlZmluZXM6e0dBTU1BX09VVFBVVDoiIn0sdW5pZm9ybXM6e3NoOnt2YWx1ZTp0aGlzLmxpZ2h0UHJvYmUuc2guY29lZmZpY2llbnRzfSxpbnRlbnNpdHk6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5pbnRlbnNpdHl9fSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6IiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NlxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIG5vcm1hbCwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdC8vIG1hdHJpeCBpcyBhc3N1bWVkIHRvIGJlIG9ydGhvZ29uYWxcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBub3JtYWwsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIGxpbmVhclRvT3V0cHV0KCBpbiB2ZWMzIGEgKSB7XG5cdCNpZmRlZiBHQU1NQV9PVVRQVVRcblx0XHRyZXR1cm4gcG93KCBhLCB2ZWMzKCAxLjAgLyBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSApO1xuXHQjZWxzZVxuXHRcdHJldHVybiBhO1xuXHQjZW5kaWZcbn1cbi8vIHNvdXJjZTogaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cdGZsb2F0IHggXHgzZCBub3JtYWwueCwgeSBceDNkIG5vcm1hbC55LCB6IFx4M2Qgbm9ybWFsLno7XG5cdC8vIGJhbmQgMFxuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0Ly8gYmFuZCAxXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdC8vIGJhbmQgMlxuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnVuaWZvcm0gdmVjMyBzaFsgOSBdOyAvLyBzaCBjb2VmZmljaWVudHNcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5OyAvLyBsaWdodCBwcm9iZSBpbnRlbnNpdHlcbnZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xudm9pZCBtYWluKCkge1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgc2ggKTtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgUkVDSVBST0NBTF9QSSAqIGlycmFkaWFuY2UgKiBpbnRlbnNpdHk7XG5cdG91dGdvaW5nTGlnaHQgXHgzZCBsaW5lYXJUb091dHB1dCggb3V0Z29pbmdMaWdodCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCAxLjAgKTtcbn0ifSk7CmM9bmV3IEVkKDEsMzIsMTYpO3lhLmNhbGwodGhpcyxjLGEpO3RoaXMub25CZWZvcmVSZW5kZXIoKX1mdW5jdGlvbiBmaChhLGMsZSxnKXthPWF8fDEwO2M9Y3x8MTA7ZT1uZXcgSCh2b2lkIDAhPT1lP2U6NDQ3MzkyNCk7Zz1uZXcgSCh2b2lkIDAhPT1nP2c6ODk0Nzg0OCk7dmFyIHQ9Yy8yLHY9YS9jLHo9YS8yO2E9W107Zm9yKHZhciBFPVtdLEY9MCxJPTAsTT0tejtGPD1jO0YrKyxNKz12KXthLnB1c2goLXosMCxNLHosMCxNKTthLnB1c2goTSwwLC16LE0sMCx6KTt2YXIgUD1GPT09dD9lOmc7UC50b0FycmF5KEUsSSk7SSs9MztQLnRvQXJyYXkoRSxJKTtJKz0zO1AudG9BcnJheShFLEkpO0krPTM7UC50b0FycmF5KEUsSSk7SSs9M31jPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYShhLDMpKTtjLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTtlPW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYyxlKX1mdW5jdGlvbiBnaChhLApjLGUsZyx0LHYpe2E9YXx8MTA7Yz1jfHwxNjtlPWV8fDg7Zz1nfHw2NDt0PW5ldyBIKHZvaWQgMCE9PXQ/dDo0NDczOTI0KTt2PW5ldyBIKHZvaWQgMCE9PXY/djo4OTQ3ODQ4KTt2YXIgej1bXSxFPVtdLEY7Zm9yKEY9MDtGPD1jO0YrKyl7dmFyIEk9Ri9jKjIqTWF0aC5QSTt2YXIgTT1NYXRoLnNpbihJKSphO0k9TWF0aC5jb3MoSSkqYTt6LnB1c2goMCwwLDApO3oucHVzaChNLDAsSSk7dmFyIFA9RiYxP3Q6djtFLnB1c2goUC5yLFAuZyxQLmIpO0UucHVzaChQLnIsUC5nLFAuYil9Zm9yKEY9MDtGPD1lO0YrKyl7UD1GJjE/dDp2O3ZhciBRPWEtYS9lKkY7Zm9yKGM9MDtjPGc7YysrKUk9Yy9nKjIqTWF0aC5QSSxNPU1hdGguc2luKEkpKlEsST1NYXRoLmNvcyhJKSpRLHoucHVzaChNLDAsSSksRS5wdXNoKFAucixQLmcsUC5iKSxJPShjKzEpL2cqMipNYXRoLlBJLE09TWF0aC5zaW4oSSkqUSxJPU1hdGguY29zKEkpKlEsei5wdXNoKE0sMCxJKSxFLnB1c2goUC5yLFAuZyxQLmIpfWE9Cm5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiYSh6LDMpKTthLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBiYShFLDMpKTt6PW5ldyBGYih7dmVydGV4Q29sb3JzOjJ9KTtJYi5jYWxsKHRoaXMsYSx6KX1mdW5jdGlvbiBlZihhLGMsZSxnKXt0aGlzLmF1ZGlvPWE7dGhpcy5yYW5nZT1jfHwxO3RoaXMuZGl2aXNpb25zSW5uZXJBbmdsZT1lfHwxNjt0aGlzLmRpdmlzaW9uc091dGVyQW5nbGU9Z3x8MjthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyooMyoodGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlKzIqdGhpcy5kaXZpc2lvbnNPdXRlckFuZ2xlKSszKSksMykpO2M9bmV3IEZiKHtjb2xvcjo2NTI4MH0pO2U9bmV3IEZiKHtjb2xvcjoxNjc3Njk2MH0pO1hiLmNhbGwodGhpcyxhLFtlLGNdKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PQpjP2M6MTthPXZvaWQgMCE9PWU/ZToxNjc3Njk2MDtnPXZvaWQgMCE9PWc/ZzoxO2M9MDsoZT10aGlzLm9iamVjdC5nZW9tZXRyeSkmJmUuaXNHZW9tZXRyeT9jPWUuZmFjZXMubGVuZ3RoOmNvbnNvbGUud2FybigiVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4iKTtlPW5ldyB2YTtjPW5ldyBiYSg2KmMsMyk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixjKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmEsbGluZXdpZHRoOmd9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZmYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTsKdm9pZCAwPT09YyYmKGM9MSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWy1jLGMsMCxjLGMsMCxjLC1jLDAsLWMsLWMsMCwtYyxjLDBdLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5saWdodFBsYW5lPW5ldyBYYihhLGMpO3RoaXMuYWRkKHRoaXMubGlnaHRQbGFuZSk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzAsMCwwLDAsMCwxXSwzKSk7dGhpcy50YXJnZXRMaW5lPW5ldyBYYihhLGMpO3RoaXMuYWRkKHRoaXMudGFyZ2V0TGluZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBnZyhhKXtmdW5jdGlvbiBjKFUsVixlYSl7ZShVLGVhKTtlKFYsZWEpfWZ1bmN0aW9uIGUoVSxWKXt2LnB1c2goMCwwLDApO3oucHVzaChWLnIsVi5nLFYuYik7dm9pZCAwPT09RVtVXSYmKEVbVV09W10pO0VbVV0ucHVzaCh2Lmxlbmd0aC8zLTEpfXZhciBnPW5ldyB2YSx0PW5ldyBGYih7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOjF9KSwKdj1bXSx6PVtdLEU9e30sRj1uZXcgSCgxNjc1NTIwMCksST1uZXcgSCgxNjcxMTY4MCksTT1uZXcgSCg0Mzc3NSksUD1uZXcgSCgxNjc3NzIxNSksUT1uZXcgSCgzMzU1NDQzKTtjKCJuMSIsIm4yIixGKTtjKCJuMiIsIm40IixGKTtjKCJuNCIsIm4zIixGKTtjKCJuMyIsIm4xIixGKTtjKCJmMSIsImYyIixGKTtjKCJmMiIsImY0IixGKTtjKCJmNCIsImYzIixGKTtjKCJmMyIsImYxIixGKTtjKCJuMSIsImYxIixGKTtjKCJuMiIsImYyIixGKTtjKCJuMyIsImYzIixGKTtjKCJuNCIsImY0IixGKTtjKCJwIiwibjEiLEkpO2MoInAiLCJuMiIsSSk7YygicCIsIm4zIixJKTtjKCJwIiwibjQiLEkpO2MoInUxIiwidTIiLE0pO2MoInUyIiwidTMiLE0pO2MoInUzIiwidTEiLE0pO2MoImMiLCJ0IixQKTtjKCJwIiwiYyIsUSk7YygiY24xIiwiY24yIixRKTtjKCJjbjMiLCJjbjQiLFEpO2MoImNmMSIsImNmMiIsUSk7YygiY2YzIiwiY2Y0IixRKTtnLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLApuZXcgYmEodiwzKSk7Zy5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgYmEoeiwzKSk7SWIuY2FsbCh0aGlzLGcsdCk7dGhpcy5jYW1lcmE9YTt0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5wb2ludE1hcD1FO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gUWIoYSxjLGUsZyx0LHYseil7aGguc2V0KHQsdix6KS51bnByb2plY3QoZyk7YT1jW2FdO2lmKHZvaWQgMCE9PWEpZm9yKGU9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksYz0wLGc9YS5sZW5ndGg7YzxnO2MrKyllLnNldFhZWihhW2NdLGhoLngsaGgueSxoaC56KX1mdW5jdGlvbiBqZChhLGMpe3RoaXMub2JqZWN0PWE7dm9pZCAwPT09YyYmKGM9MTY3NzY5NjApO2E9bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNywKNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgRmxvYXQzMkFycmF5KDI0KSxnPW5ldyB2YTtnLnNldEluZGV4KG5ldyBSKGEsMSkpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIoZSwzKSk7SWIuY2FsbCh0aGlzLGcsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGhnKGEsYyl7dGhpcy50eXBlPSJCb3gzSGVscGVyIjt0aGlzLmJveD1hO2M9Y3x8MTY3NzY5NjA7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSk7dmFyIGU9bmV3IHZhO2Uuc2V0SW5kZXgobmV3IFIoYSwxKSk7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSwzKSk7SWIuY2FsbCh0aGlzLGUsbmV3IEZiKHtjb2xvcjpjfSkpO3RoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9CmZ1bmN0aW9uIGlnKGEsYyxlKXt0aGlzLnR5cGU9IlBsYW5lSGVscGVyIjt0aGlzLnBsYW5lPWE7dGhpcy5zaXplPXZvaWQgMD09PWM/MTpjO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2M9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFsxLC0xLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwxLDAsMCwxLDAsMCwwXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtYYi5jYWxsKHRoaXMsYyxuZXcgRmIoe2NvbG9yOmF9KSk7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmEoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsMSwxLC0xLC0xLDEsMSwtMSwxXSwzKSk7Yy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLmFkZChuZXcgeWEoYyxuZXcgTih7Y29sb3I6YSxvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITF9KSkpfWZ1bmN0aW9uIGtkKGEsYyxlLGcsdCx2KXtBLmNhbGwodGhpcyk7CnZvaWQgMD09PWEmJihhPW5ldyBrKDAsMCwxKSk7dm9pZCAwPT09YyYmKGM9bmV3IGsoMCwwLDApKTt2b2lkIDA9PT1lJiYoZT0xKTt2b2lkIDA9PT1nJiYoZz0xNjc3Njk2MCk7dm9pZCAwPT09dCYmKHQ9LjIqZSk7dm9pZCAwPT09diYmKHY9LjIqdCk7dm9pZCAwPT09aWgmJihpaD1uZXcgdmEsaWguYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKFswLDAsMCwwLDEsMF0sMykpLEFpPW5ldyBoZCgwLC41LDEsNSwxKSxBaS50cmFuc2xhdGUoMCwtLjUsMCkpO3RoaXMucG9zaXRpb24uY29weShjKTt0aGlzLmxpbmU9bmV3IFhiKGloLG5ldyBGYih7Y29sb3I6Z30pKTt0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmxpbmUpO3RoaXMuY29uZT1uZXcgeWEoQWksbmV3IE4oe2NvbG9yOmd9KSk7dGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5hZGQodGhpcy5jb25lKTt0aGlzLnNldERpcmVjdGlvbihhKTt0aGlzLnNldExlbmd0aChlLAp0LHYpfWZ1bmN0aW9uIGpnKGEpe2E9YXx8MTt2YXIgYz1bMCwwLDAsYSwwLDAsMCwwLDAsMCxhLDAsMCwwLDAsMCwwLGFdO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGMsMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGJhKFsxLDAsMCwxLC42LDAsMCwxLDAsLjYsMSwwLDAsMCwxLDAsLjYsMV0sMykpO2M9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLGMpfWZ1bmN0aW9uIGlrKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuIik7YmMuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSI7dGhpcy5jbG9zZWQ9ITB9ZnVuY3Rpb24gamsoYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTsKYmMuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iY2F0bXVsbHJvbSJ9ZnVuY3Rpb24gQmkoYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TcGxpbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtiYy5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn12b2lkIDA9PT1OdW1iZXIuRVBTSUxPTiYmKE51bWJlci5FUFNJTE9OPU1hdGgucG93KDIsLTUyKSk7dm9pZCAwPT09TnVtYmVyLmlzSW50ZWdlciYmKE51bWJlci5pc0ludGVnZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgYSYmaXNGaW5pdGUoYSkmJk1hdGguZmxvb3IoYSk9PT1hfSk7dm9pZCAwPT09TWF0aC5zaWduJiYoTWF0aC5zaWduPWZ1bmN0aW9uKGEpe3JldHVybiAwPmE/LTE6MDxhPzE6K2F9KTshMT09PSJuYW1lImluIEZ1bmN0aW9uLnByb3RvdHlwZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwibmFtZSIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb25ccyooW15cKFxzXSopLylbMV19fSk7dm9pZCAwPT09T2JqZWN0LmFzc2lnbiYmKE9iamVjdC5hc3NpZ249ZnVuY3Rpb24oYSl7aWYodm9pZCAwPT09YXx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBjPU9iamVjdChhKSxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIGc9YXJndW1lbnRzW2VdO2lmKHZvaWQgMCE9PWcmJm51bGwhPT1nKWZvcih2YXIgdCBpbiBnKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChnLHQpJiYoY1t0XT1nW3RdKX1yZXR1cm4gY30pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO3ZhciBlPQp0aGlzLl9saXN0ZW5lcnM7dm9pZCAwPT09ZVthXSYmKGVbYV09W10pOy0xPT09ZVthXS5pbmRleE9mKGMpJiZlW2FdLnB1c2goYyl9LGhhc0V2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7dmFyIGU9dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1lW2FdJiYtMSE9PWVbYV0uaW5kZXhPZihjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyYmKGE9dGhpcy5fbGlzdGVuZXJzW2FdLHZvaWQgMCE9PWEmJihjPWEuaW5kZXhPZihjKSwtMSE9PWMmJmEuc3BsaWNlKGMsMSkpKX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT10aGlzLl9saXN0ZW5lcnMpe3ZhciBjPXRoaXMuX2xpc3RlbmVyc1thLnR5cGVdO2lmKHZvaWQgMCE9PWMpe2EudGFyZ2V0PXRoaXM7Yz1jLnNsaWNlKDApO2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLmNhbGwodGhpcywKYSl9fX19KTtmb3IodmFyICRiPVtdLGtnPTA7MjU2PmtnO2tnKyspJGJba2ddPSgxNj5rZz8iMCI6IiIpK2tnLnRvU3RyaW5nKDE2KTt2YXIgaGI9e0RFRzJSQUQ6TWF0aC5QSS8xODAsUkFEMkRFRzoxODAvTWF0aC5QSSxnZW5lcmF0ZVVVSUQ6ZnVuY3Rpb24oKXt2YXIgYT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxjPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZz00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oJGJbYSYyNTVdKyRiW2E+PjgmMjU1XSskYlthPj4xNiYyNTVdKyRiW2E+PjI0JjI1NV0rIi0iKyRiW2MmMjU1XSskYltjPj44JjI1NV0rIi0iKyRiW2M+PjE2JjE1fDY0XSskYltjPj4yNCYyNTVdKyItIiskYltlJjYzfDEyOF0rJGJbZT4+OCYyNTVdKyItIiskYltlPj4xNiYyNTVdKyRiW2U+PjI0JjI1NV0rJGJbZyYyNTVdKyRiW2c+PjgmMjU1XSskYltnPj4xNiYyNTVdKyRiW2c+PjI0JjI1NV0pLnRvVXBwZXJDYXNlKCl9LApjbGFtcDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIE1hdGgubWF4KGMsTWF0aC5taW4oZSxhKSl9LGV1Y2xpZGVhbk1vZHVsbzpmdW5jdGlvbihhLGMpe3JldHVybihhJWMrYyklY30sbWFwTGluZWFyOmZ1bmN0aW9uKGEsYyxlLGcsdCl7cmV0dXJuIGcrKGEtYykqKHQtZykvKGUtYyl9LGxlcnA6ZnVuY3Rpb24oYSxjLGUpe3JldHVybigxLWUpKmErZSpjfSxzbW9vdGhzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKigzLTIqYSl9LHNtb290aGVyc3RlcDpmdW5jdGlvbihhLGMsZSl7aWYoYTw9YylyZXR1cm4gMDtpZihhPj1lKXJldHVybiAxO2E9KGEtYykvKGUtYyk7cmV0dXJuIGEqYSphKihhKig2KmEtMTUpKzEwKX0scmFuZEludDpmdW5jdGlvbihhLGMpe3JldHVybiBhK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooYy1hKzEpKX0scmFuZEZsb2F0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErCk1hdGgucmFuZG9tKCkqKGMtYSl9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbihhKXtyZXR1cm4gYSooLjUtTWF0aC5yYW5kb20oKSl9LGRlZ1RvUmFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLkRFRzJSQUR9LHJhZFRvRGVnOmZ1bmN0aW9uKGEpe3JldHVybiBhKmhiLlJBRDJERUd9LGlzUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gMD09PShhJmEtMSkmJjAhPT1hfSxjZWlsUG93ZXJPZlR3bzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmNlaWwoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX0sZmxvb3JQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGYucHJvdG90eXBlLHt3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMueD1hfX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55fSwKc2V0OmZ1bmN0aW9uKGEpe3RoaXMueT1hfX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtpc1ZlY3RvcjI6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy54PWE7dGhpcy55PWM7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiKwphKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kz1hO3RoaXMueSs9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7cmV0dXJuIHRoaXN9LApzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTtyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09YTt0aGlzLnktPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hLng7dGhpcy55Kj1hLnk7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7cmV0dXJuIHRoaXN9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN107cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsCnRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0wPnRoaXMueD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PTA+dGhpcy55P01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KTsKcmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueX0sY3Jvc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLnktdGhpcy55KmEueH0sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sYW5nbGU6ZnVuY3Rpb24oKXt2YXIgYT1NYXRoLmF0YW4yKHRoaXMueSx0aGlzLngpOzA+YSYmKGErPTIqTWF0aC5QSSk7cmV0dXJuIGF9LApkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LGRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLng7YT10aGlzLnktYS55O3JldHVybiBjKmMrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueX0sCmZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTtyZXR1cm4gYX0sZnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7dm9pZCAwIT09ZSYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7dGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3JldHVybiB0aGlzfSxyb3RhdGVBcm91bmQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPXRoaXMueC1hLngsdD10aGlzLnktYS55O3RoaXMueD1nKmUtdCpjK2EueDt0aGlzLnk9ZypjK3QqZSthLnk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihoLAp7c2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyl7cmV0dXJuIGUuY29weShhKS5zbGVycChjLGcpfSxzbGVycEZsYXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7dmFyIEU9ZVtnKzBdLEY9ZVtnKzFdLEk9ZVtnKzJdO2U9ZVtnKzNdO2c9dFt2KzBdO3ZhciBNPXRbdisxXSxQPXRbdisyXTt0PXRbdiszXTtpZihlIT09dHx8RSE9PWd8fEYhPT1NfHxJIT09UCl7dj0xLXo7dmFyIFE9RSpnK0YqTStJKlArZSp0LFU9MDw9UT8xOi0xLFY9MS1RKlE7Vj5OdW1iZXIuRVBTSUxPTiYmKFY9TWF0aC5zcXJ0KFYpLFE9TWF0aC5hdGFuMihWLFEqVSksdj1NYXRoLnNpbih2KlEpL1Ysej1NYXRoLnNpbih6KlEpL1YpO1UqPXo7RT1FKnYrZypVO0Y9Rip2K00qVTtJPUkqditQKlU7ZT1lKnYrdCpVO3Y9PT0xLXomJih6PTEvTWF0aC5zcXJ0KEUqRStGKkYrSSpJK2UqZSksRSo9eixGKj16LEkqPXosZSo9eil9YVtjXT1FO2FbYysxXT1GO2FbYysyXT1JO2FbYyszXT1lfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGgucHJvdG90eXBlLAp7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sejp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3p9LHNldDpmdW5jdGlvbihhKXt0aGlzLl96PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sdzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3d9LHNldDpmdW5jdGlvbihhKXt0aGlzLl93PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX19KTtPYmplY3QuYXNzaWduKGgucHJvdG90eXBlLHtpc1F1YXRlcm5pb246ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX3c9Zzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsCnRoaXMuX3ksdGhpcy5feix0aGlzLl93KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLl94PWEueDt0aGlzLl95PWEueTt0aGlzLl96PWEuejt0aGlzLl93PWEudzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21FdWxlcjpmdW5jdGlvbihhLGMpe2lmKCFhfHwhYS5pc0V1bGVyKXRocm93IEVycm9yKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTt2YXIgZT1hLl94LGc9YS5feSx0PWEuX3o7YT1hLm9yZGVyO3ZhciB2PU1hdGguY29zLHo9TWF0aC5zaW4sRT12KGUvMiksRj12KGcvMik7dj12KHQvMik7ZT16KGUvMik7Zz16KGcvMik7dD16KHQvMik7IlhZWiI9PT1hPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdCtlKmcqdix0aGlzLl93PUUqRip2LWUqZyp0KToiWVhaIj09PQphPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdC1lKmcqdix0aGlzLl93PUUqRip2K2UqZyp0KToiWlhZIj09PWE/KHRoaXMuX3g9ZSpGKnYtRSpnKnQsdGhpcy5feT1FKmcqditlKkYqdCx0aGlzLl96PUUqRip0K2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnQpOiJaWVgiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqdCx0aGlzLl95PUUqZyp2K2UqRip0LHRoaXMuX3o9RSpGKnQtZSpnKnYsdGhpcy5fdz1FKkYqditlKmcqdCk6IllaWCI9PT1hPyh0aGlzLl94PWUqRip2K0UqZyp0LHRoaXMuX3k9RSpnKnYrZSpGKnQsdGhpcy5fej1FKkYqdC1lKmcqdix0aGlzLl93PUUqRip2LWUqZyp0KToiWFpZIj09PWEmJih0aGlzLl94PWUqRip2LUUqZyp0LHRoaXMuX3k9RSpnKnYtZSpGKnQsdGhpcy5fej1FKkYqdCtlKmcqdix0aGlzLl93PUUqRip2K2UqZyp0KTshMSE9PWMmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLApjKXtjLz0yO3ZhciBlPU1hdGguc2luKGMpO3RoaXMuX3g9YS54KmU7dGhpcy5feT1hLnkqZTt0aGlzLl96PWEueiplO3RoaXMuX3c9TWF0aC5jb3MoYyk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9YS5lbGVtZW50cyxlPWNbMF07YT1jWzRdO3ZhciBnPWNbOF0sdD1jWzFdLHY9Y1s1XSx6PWNbOV0sRT1jWzJdLEY9Y1s2XTtjPWNbMTBdO3ZhciBJPWUrditjOzA8ST8oZT0uNS9NYXRoLnNxcnQoSSsxKSx0aGlzLl93PS4yNS9lLHRoaXMuX3g9KEYteikqZSx0aGlzLl95PShnLUUpKmUsdGhpcy5fej0odC1hKSplKTplPnYmJmU+Yz8oZT0yKk1hdGguc3FydCgxK2Utdi1jKSx0aGlzLl93PShGLXopL2UsdGhpcy5feD0uMjUqZSx0aGlzLl95PShhK3QpL2UsdGhpcy5fej0oZytFKS9lKTp2PmM/KGU9MipNYXRoLnNxcnQoMSt2LWUtYyksdGhpcy5fdz0oZy1FKS9lLHRoaXMuX3g9KGErdCkvZSwKdGhpcy5feT0uMjUqZSx0aGlzLl96PSh6K0YpL2UpOihlPTIqTWF0aC5zcXJ0KDErYy1lLXYpLHRoaXMuX3c9KHQtYSkvZSx0aGlzLl94PShnK0UpL2UsdGhpcy5feT0oeitGKS9lLHRoaXMuX3o9LjI1KmUpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVVuaXRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5kb3QoYykrMTsxRS02PmU/KGU9MCxNYXRoLmFicyhhLngpPk1hdGguYWJzKGEueik/KHRoaXMuX3g9LWEueSx0aGlzLl95PWEueCx0aGlzLl96PTApOih0aGlzLl94PTAsdGhpcy5feT0tYS56LHRoaXMuX3o9YS55KSk6KHRoaXMuX3g9YS55KmMuei1hLnoqYy55LHRoaXMuX3k9YS56KmMueC1hLngqYy56LHRoaXMuX3o9YS54KmMueS1hLnkqYy54KTt0aGlzLl93PWU7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKGhiLmNsYW1wKHRoaXMuZG90KGEpLC0xLAoxKSkpfSxyb3RhdGVUb3dhcmRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5hbmdsZVRvKGEpO2lmKDA9PT1lKXJldHVybiB0aGlzO3RoaXMuc2xlcnAoYSxNYXRoLm1pbigxLGMvZSkpO3JldHVybiB0aGlzfSxpbnZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9LGNvbmp1Z2F0ZTpmdW5jdGlvbigpe3RoaXMuX3gqPS0xO3RoaXMuX3kqPS0xO3RoaXMuX3oqPS0xO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl94KmEuX3grdGhpcy5feSphLl95K3RoaXMuX3oqYS5feit0aGlzLl93KmEuX3d9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqCnRoaXMuX3ordGhpcy5fdyp0aGlzLl93KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZW5ndGgoKTswPT09YT8odGhpcy5fej10aGlzLl95PXRoaXMuX3g9MCx0aGlzLl93PTEpOihhPTEvYSx0aGlzLl94Kj1hLHRoaXMuX3kqPWEsdGhpcy5feio9YSx0aGlzLl93Kj1hKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LG11bHRpcGx5OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsYykpOnRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKGEsdGhpcyl9LG11bHRpcGx5UXVhdGVybmlvbnM6ZnVuY3Rpb24oYSwKYyl7dmFyIGU9YS5feCxnPWEuX3ksdD1hLl96O2E9YS5fdzt2YXIgdj1jLl94LHo9Yy5feSxFPWMuX3o7Yz1jLl93O3RoaXMuX3g9ZSpjK2EqditnKkUtdCp6O3RoaXMuX3k9ZypjK2Eqeit0KnYtZSpFO3RoaXMuX3o9dCpjK2EqRStlKnotZyp2O3RoaXMuX3c9YSpjLWUqdi1nKnotdCpFO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2xlcnA6ZnVuY3Rpb24oYSxjKXtpZigwPT09YylyZXR1cm4gdGhpcztpZigxPT09YylyZXR1cm4gdGhpcy5jb3B5KGEpO3ZhciBlPXRoaXMuX3gsZz10aGlzLl95LHQ9dGhpcy5feix2PXRoaXMuX3csej12KmEuX3crZSphLl94K2cqYS5feSt0KmEuX3o7MD56Pyh0aGlzLl93PS1hLl93LHRoaXMuX3g9LWEuX3gsdGhpcy5feT0tYS5feSx0aGlzLl96PS1hLl96LHo9LXopOnRoaXMuY29weShhKTtpZigxPD16KXJldHVybiB0aGlzLl93PXYsdGhpcy5feD1lLHRoaXMuX3k9Zyx0aGlzLl96PXQsdGhpczthPTEteip6O2lmKGE8PU51bWJlci5FUFNJTE9OKXJldHVybiB6PQoxLWMsdGhpcy5fdz16KnYrYyp0aGlzLl93LHRoaXMuX3g9eiplK2MqdGhpcy5feCx0aGlzLl95PXoqZytjKnRoaXMuX3ksdGhpcy5fej16KnQrYyp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXM7YT1NYXRoLnNxcnQoYSk7dmFyIEU9TWF0aC5hdGFuMihhLHopO3o9TWF0aC5zaW4oKDEtYykqRSkvYTtjPU1hdGguc2luKGMqRSkvYTt0aGlzLl93PXYqeit0aGlzLl93KmM7dGhpcy5feD1lKnordGhpcy5feCpjO3RoaXMuX3k9Zyp6K3RoaXMuX3kqYzt0aGlzLl96PXQqeit0aGlzLl96KmM7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3g9PT10aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX3c9PT10aGlzLl93fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLl94PWFbY107dGhpcy5feT1hW2MrMV07CnRoaXMuX3o9YVtjKzJdO3RoaXMuX3c9YVtjKzNdO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMuX3g7YVtjKzFdPXRoaXMuX3k7YVtjKzJdPXRoaXMuX3o7YVtjKzNdPXRoaXMuX3c7cmV0dXJuIGF9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pO3ZhciBDaT1uZXcgayxraz1uZXcgaDtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtpc1ZlY3RvcjM6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMuej10aGlzLnk9dGhpcy54PWE7cmV0dXJuIHRoaXN9LHNldFg6ZnVuY3Rpb24oYSl7dGhpcy54PWE7cmV0dXJuIHRoaXN9LApzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTsKdGhpcy56PWEuejtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7dGhpcy56Kz1hLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksCnRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3RoaXMuei09YS56O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTt0aGlzLnotPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnMoYSxjKTt0aGlzLngqPWEueDt0aGlzLnkqPWEueTt0aGlzLnoqPWEuejtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPQphO3JldHVybiB0aGlzfSxtdWx0aXBseVZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54KmMueDt0aGlzLnk9YS55KmMueTt0aGlzLno9YS56KmMuejtyZXR1cm4gdGhpc30sYXBwbHlFdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa2suc2V0RnJvbUV1bGVyKGEpKX0sYXBwbHlBeGlzQW5nbGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa2suc2V0RnJvbUF4aXNBbmdsZShhLGMpKX0sYXBwbHlNYXRyaXgzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMuejthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzNdKmUrYVs2XSpnO3RoaXMueT1hWzFdKmMrYVs0XSplK2FbN10qCmc7dGhpcy56PWFbMl0qYythWzVdKmUrYVs4XSpnO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt2YXIgdD0xLyhhWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0pO3RoaXMueD0oYVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0pKnQ7dGhpcy55PShhWzFdKmMrYVs1XSplK2FbOV0qZythWzEzXSkqdDt0aGlzLno9KGFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSkqdDtyZXR1cm4gdGhpc30sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueix0PWEueCx2PWEueSx6PWEuejthPWEudzt2YXIgRT1hKmMrdipnLXoqZSxGPWEqZSt6KmMtdCpnLEk9YSpnK3QqZS12KmM7Yz0tdCpjLXYqZS16Kmc7dGhpcy54PUUqYStjKi10K0YqLXotSSotdjt0aGlzLnk9RiphK2MqLXYrSSotdC1FKi16O3RoaXMuej1JKmErYyoteitFKi12LUYqLXQ7cmV0dXJuIHRoaXN9LApwcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEucHJvamVjdGlvbk1hdHJpeCl9LHVucHJvamVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpfSx0cmFuc2Zvcm1EaXJlY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmc7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnO3RoaXMuej1hWzJdKmMrYVs2XSplK2FbMTBdKmc7cmV0dXJuIHRoaXMubm9ybWFsaXplKCl9LGRpdmlkZTpmdW5jdGlvbihhKXt0aGlzLngvPWEueDt0aGlzLnkvPWEueTt0aGlzLnovPWEuejtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxtaW46ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWluKHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1pbih0aGlzLnksYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sY2xhbXA6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYS54LE1hdGgubWluKGMueCx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYS55LE1hdGgubWluKGMueSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYS56LE1hdGgubWluKGMueix0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBTY2FsYXI6ZnVuY3Rpb24oYSxjKXt0aGlzLng9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsCk1hdGgubWluKGMsdGhpcy56KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7dGhpcy56PU1hdGgucm91bmQodGhpcy56KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9CjA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7cmV0dXJuIHRoaXN9LG5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMueD0tdGhpcy54O3RoaXMueT0tdGhpcy55O3RoaXMuej0tdGhpcy56O3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueCphLngrdGhpcy55KmEueSt0aGlzLnoqYS56fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen0sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrCk1hdGguYWJzKHRoaXMueil9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei10aGlzLnopKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxjcm9zczpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnMoYSxjKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcywKYSl9LGNyb3NzVmVjdG9yczpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgdD1jLngsdj1jLnk7Yz1jLno7dGhpcy54PWcqYy1hKnY7dGhpcy55PWEqdC1lKmM7dGhpcy56PWUqdi1nKnQ7cmV0dXJuIHRoaXN9LHByb2plY3RPblZlY3RvcjpmdW5jdGlvbihhKXt2YXIgYz1hLmRvdCh0aGlzKS9hLmxlbmd0aFNxKCk7cmV0dXJuIHRoaXMuY29weShhKS5tdWx0aXBseVNjYWxhcihjKX0scHJvamVjdE9uUGxhbmU6ZnVuY3Rpb24oYSl7Q2kuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IoYSk7cmV0dXJuIHRoaXMuc3ViKENpKX0scmVmbGVjdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zdWIoQ2kuY29weShhKS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KGEpKSl9LGFuZ2xlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWNvcyhoYi5jbGFtcCh0aGlzLmRvdChhKS9NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKmEubGVuZ3RoU3EoKSksLTEsMSkpfSxkaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZChhKSl9LApkaXN0YW5jZVRvU3F1YXJlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngtYS54LGU9dGhpcy55LWEueTthPXRoaXMuei1hLno7cmV0dXJuIGMqYytlKmUrYSphfSxtYW5oYXR0YW5EaXN0YW5jZVRvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyh0aGlzLngtYS54KStNYXRoLmFicyh0aGlzLnktYS55KStNYXRoLmFicyh0aGlzLnotYS56KX0sc2V0RnJvbVNwaGVyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKGEucmFkaXVzLGEucGhpLGEudGhldGEpfSxzZXRGcm9tU3BoZXJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1NYXRoLnNpbihjKSphO3RoaXMueD1nKk1hdGguc2luKGUpO3RoaXMueT1NYXRoLmNvcyhjKSphO3RoaXMuej1nKk1hdGguY29zKGUpO3JldHVybiB0aGlzfSxzZXRGcm9tQ3lsaW5kcmljYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKGEucmFkaXVzLGEudGhldGEsCmEueSl9LHNldEZyb21DeWxpbmRyaWNhbENvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy54PWEqTWF0aC5zaW4oYyk7dGhpcy55PWU7dGhpcy56PWEqTWF0aC5jb3MoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhQb3NpdGlvbjpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy54PWFbMTJdO3RoaXMueT1hWzEzXTt0aGlzLno9YVsxNF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwwKS5sZW5ndGgoKSxlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDEpLmxlbmd0aCgpO2E9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMikubGVuZ3RoKCk7dGhpcy54PWM7dGhpcy55PWU7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXhDb2x1bW46ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkoYS5lbGVtZW50cyw0KmMpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PQp0aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56fSxmcm9tQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLng9YVtjXTt0aGlzLnk9YVtjKzFdO3RoaXMuej1hW2MrMl07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTtyZXR1cm4gdGhpc319KTt2YXIgZ2U9bmV3IGs7T2JqZWN0LmFzc2lnbihyLnByb3RvdHlwZSx7aXNNYXRyaXgzOiEwLHNldDpmdW5jdGlvbihhLApjLGUsZyx0LHYseixFLEYpe3ZhciBJPXRoaXMuZWxlbWVudHM7SVswXT1hO0lbMV09ZztJWzJdPXo7SVszXT1jO0lbNF09dDtJWzVdPUU7SVs2XT1lO0lbN109djtJWzhdPUY7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4NDpmdW5jdGlvbihhKXthPWEuZWxlbWVudHM7dGhpcy5zZXQoYVswXSxhWzRdLGFbOF0sYVsxXSxhWzVdLGFbOV0sYVsyXSxhWzZdLGFbMTBdKTtyZXR1cm4gdGhpc30sCmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT1hLmNvdW50O2M8ZTtjKyspZ2UueD1hLmdldFgoYyksZ2UueT1hLmdldFkoYyksZ2Uuej1hLmdldFooYyksZ2UuYXBwbHlNYXRyaXgzKHRoaXMpLGEuc2V0WFlaKGMsZ2UueCxnZS55LGdlLnopO3JldHVybiBhfSxtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHQ9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN10sST1lWzJdLE09ZVs1XTtlPWVbOF07dmFyIFA9Z1swXSxRPWdbM10sVT1nWzZdLFY9Z1sxXSxlYT1nWzRdLGRhPWdbN10scmE9Z1syXSxwYT1nWzVdO2c9Z1s4XTsKY1swXT1hKlArdCpWK3YqcmE7Y1szXT1hKlErdCplYSt2KnBhO2NbNl09YSpVK3QqZGErdipnO2NbMV09eipQK0UqVitGKnJhO2NbNF09eipRK0UqZWErRipwYTtjWzddPXoqVStFKmRhK0YqZztjWzJdPUkqUCtNKlYrZSpyYTtjWzVdPUkqUStNKmVhK2UqcGE7Y1s4XT1JKlUrTSpkYStlKmc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7Y1swXSo9YTtjWzNdKj1hO2NbNl0qPWE7Y1sxXSo9YTtjWzRdKj1hO2NbN10qPWE7Y1syXSo9YTtjWzVdKj1hO2NbOF0qPWE7cmV0dXJuIHRoaXN9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzFdLGc9YVsyXSx0PWFbM10sdj1hWzRdLHo9YVs1XSxFPWFbNl0sRj1hWzddO2E9YVs4XTtyZXR1cm4gYyp2KmEtYyp6KkYtZSp0KmErZSp6KkUrZyp0KkYtZyp2KkV9LGdldEludmVyc2U6ZnVuY3Rpb24oYSxjKXthJiZhLmlzTWF0cml4NCYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBhcmd1bWVudC4iKTt2YXIgZT1hLmVsZW1lbnRzO2E9dGhpcy5lbGVtZW50czt2YXIgZz1lWzBdLHQ9ZVsxXSx2PWVbMl0sej1lWzNdLEU9ZVs0XSxGPWVbNV0sST1lWzZdLE09ZVs3XTtlPWVbOF07dmFyIFA9ZSpFLUYqTSxRPUYqSS1lKnosVT1NKnotRSpJLFY9ZypQK3QqUSt2KlU7aWYoMD09PVYpe2lmKCEwPT09Yyl0aHJvdyBFcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtyZXR1cm4gdGhpcy5pZGVudGl0eSgpfWM9MS9WO2FbMF09UCpjO2FbMV09KHYqTS1lKnQpKmM7YVsyXT0oRip0LXYqRSkqYzthWzNdPVEqYzthWzRdPQooZSpnLXYqSSkqYzthWzVdPSh2KnotRipnKSpjO2FbNl09VSpjO2FbN109KHQqSS1NKmcpKmM7YVs4XT0oRSpnLXQqeikqYztyZXR1cm4gdGhpc30sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVszXTthWzNdPWM7Yz1hWzJdO2FbMl09YVs2XTthWzZdPWM7Yz1hWzVdO2FbNV09YVs3XTthWzddPWM7cmV0dXJuIHRoaXN9LGdldE5vcm1hbE1hdHJpeDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChhKS5nZXRJbnZlcnNlKHRoaXMpLnRyYW5zcG9zZSgpfSx0cmFuc3Bvc2VJbnRvQXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthWzBdPWNbMF07YVsxXT1jWzNdO2FbMl09Y1s2XTthWzNdPWNbMV07YVs0XT1jWzRdO2FbNV09Y1s3XTthWzZdPWNbMl07YVs3XT1jWzVdO2FbOF09Y1s4XTtyZXR1cm4gdGhpc30sc2V0VXZUcmFuc2Zvcm06ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7dmFyIEU9Ck1hdGguY29zKHQpO3Q9TWF0aC5zaW4odCk7dGhpcy5zZXQoZSpFLGUqdCwtZSooRSp2K3QqeikrdithLC1nKnQsZypFLC1nKigtdCp2K0UqeikreitjLDAsMCwxKX0sc2NhbGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWE7ZVszXSo9YTtlWzZdKj1hO2VbMV0qPWM7ZVs0XSo9YztlWzddKj1jO3JldHVybiB0aGlzfSxyb3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt2YXIgZT10aGlzLmVsZW1lbnRzLGc9ZVswXSx0PWVbM10sdj1lWzZdLHo9ZVsxXSxFPWVbNF0sRj1lWzddO2VbMF09YypnK2EqejtlWzNdPWMqdCthKkU7ZVs2XT1jKnYrYSpGO2VbMV09LWEqZytjKno7ZVs0XT0tYSp0K2MqRTtlWzddPS1hKnYrYypGO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0rPWEqZVsyXTtlWzNdKz1hKmVbNV07ZVs2XSs9YSplWzhdO2VbMV0rPWMqZVsyXTtlWzRdKz0KYyplWzVdO2VbN10rPWMqZVs4XTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2Zvcih2YXIgZT0wOzk+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07YVtjKzFdPWVbMV07YVtjKzJdPWVbMl07YVtjKzNdPWVbM107YVtjKzRdPWVbNF07YVtjKzVdPWVbNV07YVtjKzZdPWVbNl07YVtjKzddPWVbN107YVtjKzhdPWVbOF07cmV0dXJuIGF9fSk7dmFyIGdmLEdkPXtnZXREYXRhVVJMOmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIGEuc3JjOwppZighKGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkpe3ZvaWQgMD09PWdmJiYoZ2Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIikpO2dmLndpZHRoPWEud2lkdGg7Z2YuaGVpZ2h0PWEuaGVpZ2h0O3ZhciBjPWdmLmdldENvbnRleHQoIjJkIik7YSBpbnN0YW5jZW9mIEltYWdlRGF0YT9jLnB1dEltYWdlRGF0YShhLDAsMCk6Yy5kcmF3SW1hZ2UoYSwwLDAsYS53aWR0aCxhLmhlaWdodCk7YT1nZn1yZXR1cm4gMjA0ODxhLndpZHRofHwyMDQ4PGEuaGVpZ2h0P2EudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNik6YS50b0RhdGFVUkwoImltYWdlL3BuZyIpfX0saGw9MDtsLkRFRkFVTFRfSU1BR0U9dm9pZCAwO2wuREVGQVVMVF9NQVBQSU5HPTMwMDtsLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpsLGlzVGV4dHVyZTohMCx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LAp0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5pbWFnZT1hLmltYWdlO3RoaXMubWlwbWFwcz1hLm1pcG1hcHMuc2xpY2UoMCk7dGhpcy5tYXBwaW5nPWEubWFwcGluZzt0aGlzLndyYXBTPWEud3JhcFM7dGhpcy53cmFwVD1hLndyYXBUO3RoaXMubWFnRmlsdGVyPWEubWFnRmlsdGVyO3RoaXMubWluRmlsdGVyPWEubWluRmlsdGVyO3RoaXMuYW5pc290cm9weT1hLmFuaXNvdHJvcHk7dGhpcy5mb3JtYXQ9YS5mb3JtYXQ7dGhpcy50eXBlPWEudHlwZTt0aGlzLm9mZnNldC5jb3B5KGEub2Zmc2V0KTt0aGlzLnJlcGVhdC5jb3B5KGEucmVwZWF0KTt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5nZW5lcmF0ZU1pcG1hcHM9YS5nZW5lcmF0ZU1pcG1hcHM7dGhpcy5wcmVtdWx0aXBseUFscGhhPWEucHJlbXVsdGlwbHlBbHBoYTt0aGlzLmZsaXBZPWEuZmxpcFk7dGhpcy51bnBhY2tBbGlnbm1lbnQ9YS51bnBhY2tBbGlnbm1lbnQ7dGhpcy5lbmNvZGluZz1hLmVuY29kaW5nO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9dm9pZCAwPT09YXx8InN0cmluZyI9PT10eXBlb2YgYTtpZighYyYmdm9pZCAwIT09YS50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiBhLnRleHR1cmVzW3RoaXMudXVpZF07dmFyIGU9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsbWFwcGluZzp0aGlzLm1hcHBpbmcsCnJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtpZih2b2lkIDAhPT10aGlzLmltYWdlKXt2YXIgZz10aGlzLmltYWdlO3ZvaWQgMD09PWcudXVpZCYmKGcudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKSk7aWYoIWMmJnZvaWQgMD09PWEuaW1hZ2VzW2cudXVpZF0pe2lmKEFycmF5LmlzQXJyYXkoZykpe3ZhciB0PQpbXTtmb3IodmFyIHY9MCx6PWcubGVuZ3RoO3Y8ejt2KyspdC5wdXNoKEdkLmdldERhdGFVUkwoZ1t2XSkpfWVsc2UgdD1HZC5nZXREYXRhVVJMKGcpO2EuaW1hZ2VzW2cudXVpZF09e3V1aWQ6Zy51dWlkLHVybDp0fX1lLmltYWdlPWcudXVpZH1jfHwoYS50ZXh0dXJlc1t0aGlzLnV1aWRdPWUpO3JldHVybiBlfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfSx0cmFuc2Zvcm1VdjpmdW5jdGlvbihhKXtpZigzMDAhPT10aGlzLm1hcHBpbmcpcmV0dXJuIGE7YS5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpO2lmKDA+YS54fHwxPGEueClzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAxRTM6YS54LT1NYXRoLmZsb29yKGEueCk7YnJlYWs7Y2FzZSAxMDAxOmEueD0wPmEueD8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueD0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLngpJTIpP01hdGguY2VpbChhLngpLWEueDphLngtTWF0aC5mbG9vcihhLngpfWlmKDA+CmEueXx8MTxhLnkpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgMUUzOmEueS09TWF0aC5mbG9vcihhLnkpO2JyZWFrO2Nhc2UgMTAwMTphLnk9MD5hLnk/MDoxO2JyZWFrO2Nhc2UgMTAwMjphLnk9MT09PU1hdGguYWJzKE1hdGguZmxvb3IoYS55KSUyKT9NYXRoLmNlaWwoYS55KS1hLnk6YS55LU1hdGguZmxvb3IoYS55KX10aGlzLmZsaXBZJiYoYS55PTEtYS55KTtyZXR1cm4gYX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobC5wcm90b3R5cGUsIm5lZWRzVXBkYXRlIix7c2V0OmZ1bmN0aW9uKGEpeyEwPT09YSYmdGhpcy52ZXJzaW9uKyt9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocC5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy56PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnd9LHNldDpmdW5jdGlvbihhKXt0aGlzLnc9YX19fSk7T2JqZWN0LmFzc2lnbihwLnByb3RvdHlwZSwKe2lzVmVjdG9yNDohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy54PWE7dGhpcy55PWM7dGhpcy56PWU7dGhpcy53PWc7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnc9dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhKXt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0VzpmdW5jdGlvbihhKXt0aGlzLnc9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7Y2FzZSAyOnRoaXMuej1jO2JyZWFrO2Nhc2UgMzp0aGlzLnc9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54OwpjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX0sY29weTpmdW5jdGlvbihhKXt0aGlzLng9YS54O3RoaXMueT1hLnk7dGhpcy56PWEuejt0aGlzLnc9dm9pZCAwIT09YS53P2EudzoxO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejt0aGlzLncrPWEudztyZXR1cm4gdGhpc30sCmFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3RoaXMueis9YTt0aGlzLncrPWE7cmV0dXJuIHRoaXN9LGFkZFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54K2MueDt0aGlzLnk9YS55K2MueTt0aGlzLno9YS56K2Muejt0aGlzLnc9YS53K2MudztyZXR1cm4gdGhpc30sYWRkU2NhbGVkVmVjdG9yOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz1hLngqYzt0aGlzLnkrPWEueSpjO3RoaXMueis9YS56KmM7dGhpcy53Kz1hLncqYztyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7dGhpcy53LT1hLnc7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPQphO3RoaXMueS09YTt0aGlzLnotPWE7dGhpcy53LT1hO3JldHVybiB0aGlzfSxzdWJWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueC1jLng7dGhpcy55PWEueS1jLnk7dGhpcy56PWEuei1jLno7dGhpcy53PWEudy1jLnc7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCo9YTt0aGlzLnkqPWE7dGhpcy56Kj1hO3RoaXMudyo9YTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueCxlPXRoaXMueSxnPXRoaXMueix0PXRoaXMudzthPWEuZWxlbWVudHM7dGhpcy54PWFbMF0qYythWzRdKmUrYVs4XSpnK2FbMTJdKnQ7dGhpcy55PWFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKnQ7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZythWzE0XSp0O3RoaXMudz1hWzNdKmMrYVs3XSplK2FbMTFdKmcrYVsxNV0qdDtyZXR1cm4gdGhpc30sZGl2aWRlU2NhbGFyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvCmEpfSxzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnc9MipNYXRoLmFjb3MoYS53KTt2YXIgYz1NYXRoLnNxcnQoMS1hLncqYS53KTsxRS00PmM/KHRoaXMueD0xLHRoaXMuej10aGlzLnk9MCk6KHRoaXMueD1hLngvYyx0aGlzLnk9YS55L2MsdGhpcy56PWEuei9jKTtyZXR1cm4gdGhpc30sc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt2YXIgYz1hWzBdO3ZhciBlPWFbNF07dmFyIGc9YVs4XSx0PWFbMV0sdj1hWzVdLHo9YVs5XTt2YXIgRT1hWzJdO3ZhciBGPWFbNl07dmFyIEk9YVsxMF07aWYoLjAxPk1hdGguYWJzKGUtdCkmJi4wMT5NYXRoLmFicyhnLUUpJiYuMDE+TWF0aC5hYnMoei1GKSl7aWYoLjE+TWF0aC5hYnMoZSt0KSYmLjE+TWF0aC5hYnMoZytFKSYmLjE+TWF0aC5hYnMoeitGKSYmLjE+TWF0aC5hYnMoYyt2K0ktMykpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7YT1NYXRoLlBJOwpjPShjKzEpLzI7dj0odisxKS8yO0k9KEkrMSkvMjtlPShlK3QpLzQ7Zz0oZytFKS80O3o9KHorRikvNDtjPnYmJmM+ST8uMDE+Yz8oRj0wLGU9RT0uNzA3MTA2NzgxKTooRj1NYXRoLnNxcnQoYyksRT1lL0YsZT1nL0YpOnY+ST8uMDE+dj8oRj0uNzA3MTA2NzgxLEU9MCxlPS43MDcxMDY3ODEpOihFPU1hdGguc3FydCh2KSxGPWUvRSxlPXovRSk6LjAxPkk/KEU9Rj0uNzA3MTA2NzgxLGU9MCk6KGU9TWF0aC5zcXJ0KEkpLEY9Zy9lLEU9ei9lKTt0aGlzLnNldChGLEUsZSxhKTtyZXR1cm4gdGhpc31hPU1hdGguc3FydCgoRi16KSooRi16KSsoZy1FKSooZy1FKSsodC1lKSoodC1lKSk7LjAwMT5NYXRoLmFicyhhKSYmKGE9MSk7dGhpcy54PShGLXopL2E7dGhpcy55PShnLUUpL2E7dGhpcy56PSh0LWUpL2E7dGhpcy53PU1hdGguYWNvcygoYyt2K0ktMSkvMik7cmV0dXJuIHRoaXN9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSwKYS55KTt0aGlzLno9TWF0aC5taW4odGhpcy56LGEueik7dGhpcy53PU1hdGgubWluKHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxtYXg6ZnVuY3Rpb24oYSl7dGhpcy54PU1hdGgubWF4KHRoaXMueCxhLngpO3RoaXMueT1NYXRoLm1heCh0aGlzLnksYS55KTt0aGlzLno9TWF0aC5tYXgodGhpcy56LGEueik7dGhpcy53PU1hdGgubWF4KHRoaXMudyxhLncpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLncsTWF0aC5taW4oYy53LHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnopKTt0aGlzLnc9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMudykpO3JldHVybiB0aGlzfSxjbGFtcExlbmd0aDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGV8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGEsTWF0aC5taW4oYyxlKSkpfSxmbG9vcjpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmZsb29yKHRoaXMueCk7dGhpcy55PU1hdGguZmxvb3IodGhpcy55KTt0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopO3RoaXMudz1NYXRoLmZsb29yKHRoaXMudyk7cmV0dXJuIHRoaXN9LGNlaWw6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5jZWlsKHRoaXMueCk7dGhpcy55PU1hdGguY2VpbCh0aGlzLnkpO3RoaXMuej1NYXRoLmNlaWwodGhpcy56KTt0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kOmZ1bmN0aW9uKCl7dGhpcy54PQpNYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3RoaXMudz1NYXRoLnJvdW5kKHRoaXMudyk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej0wPnRoaXMuej9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueik7dGhpcy53PTA+dGhpcy53P01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7dGhpcy53PS10aGlzLnc7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueioKYS56K3RoaXMudyphLnd9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9LG1hbmhhdHRhbkxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9LHNldExlbmd0aDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihhKX0sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMueCs9KGEueC10aGlzLngpKmM7dGhpcy55Kz0oYS55LXRoaXMueSkqYzt0aGlzLnorPShhLnotCnRoaXMueikqYzt0aGlzLncrPShhLnctdGhpcy53KSpjO3JldHVybiB0aGlzfSxsZXJwVmVjdG9yczpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyhjLGEpLm11bHRpcGx5U2NhbGFyKGUpLmFkZChhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLng9PT10aGlzLngmJmEueT09PXRoaXMueSYmYS56PT09dGhpcy56JiZhLnc9PT10aGlzLnd9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTt0aGlzLnc9YVtjKzNdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy54O2FbYysxXT10aGlzLnk7YVtjKzJdPXRoaXMuejthW2MrM109dGhpcy53O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTsKdGhpcy54PWEuZ2V0WChjKTt0aGlzLnk9YS5nZXRZKGMpO3RoaXMuej1hLmdldFooYyk7dGhpcy53PWEuZ2V0VyhjKTtyZXR1cm4gdGhpc319KTttLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjptLGlzV2ViR0xSZW5kZXJUYXJnZXQ6ITAsc2V0U2l6ZTpmdW5jdGlvbihhLGMpe2lmKHRoaXMud2lkdGghPT1hfHx0aGlzLmhlaWdodCE9PWMpdGhpcy53aWR0aD1hLHRoaXMuaGVpZ2h0PWMsdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWEsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1jLHRoaXMuZGlzcG9zZSgpO3RoaXMudmlld3BvcnQuc2V0KDAsMCxhLGMpO3RoaXMuc2Npc3Nvci5zZXQoMCwwLGEsYyl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMud2lkdGg9YS53aWR0aDt0aGlzLmhlaWdodD1hLmhlaWdodDt0aGlzLnZpZXdwb3J0LmNvcHkoYS52aWV3cG9ydCk7CnRoaXMudGV4dHVyZT1hLnRleHR1cmUuY2xvbmUoKTt0aGlzLmRlcHRoQnVmZmVyPWEuZGVwdGhCdWZmZXI7dGhpcy5zdGVuY2lsQnVmZmVyPWEuc3RlbmNpbEJ1ZmZlcjt0aGlzLmRlcHRoVGV4dHVyZT1hLmRlcHRoVGV4dHVyZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtuLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpuLGlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldDohMCxjb3B5OmZ1bmN0aW9uKGEpe20ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2FtcGxlcz1hLnNhbXBsZXM7cmV0dXJuIHRoaXN9fSk7dmFyIHRjPW5ldyBrLFJiPW5ldyBxLFNtPW5ldyBrKDAsMCwwKSxUbT1uZXcgaygxLDEsMSksSGQ9bmV3IGssamg9bmV3IGssaWM9bmV3IGs7T2JqZWN0LmFzc2lnbihxLnByb3RvdHlwZSx7aXNNYXRyaXg0OiEwLApzZXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYseixFLEYsSSxNLFAsUSxVLFYsZWEpe3ZhciBkYT10aGlzLmVsZW1lbnRzO2RhWzBdPWE7ZGFbNF09YztkYVs4XT1lO2RhWzEyXT1nO2RhWzFdPXQ7ZGFbNV09djtkYVs5XT16O2RhWzEzXT1FO2RhWzJdPUY7ZGFbNl09STtkYVsxMF09TTtkYVsxNF09UDtkYVszXT1RO2RhWzddPVU7ZGFbMTFdPVY7ZGFbMTVdPWVhO3JldHVybiB0aGlzfSxpZGVudGl0eTpmdW5jdGlvbigpe3RoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgcSkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfSxjb3B5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMF09YVswXTtjWzFdPWFbMV07Y1syXT1hWzJdO2NbM109YVszXTtjWzRdPWFbNF07Y1s1XT1hWzVdO2NbNl09YVs2XTtjWzddPWFbN107Y1s4XT1hWzhdO2NbOV09YVs5XTtjWzEwXT0KYVsxMF07Y1sxMV09YVsxMV07Y1sxMl09YVsxMl07Y1sxM109YVsxM107Y1sxNF09YVsxNF07Y1sxNV09YVsxNV07cmV0dXJuIHRoaXN9LGNvcHlQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtyZXR1cm4gdGhpc30sZXh0cmFjdEJhc2lzOmZ1bmN0aW9uKGEsYyxlKXthLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKTtjLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKTtlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKTtyZXR1cm4gdGhpc30sbWFrZUJhc2lzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLngsYy54LGUueCwwLGEueSxjLnksZS55LDAsYS56LGMueixlLnosMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sZXh0cmFjdFJvdGF0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLmVsZW1lbnRzLGc9MS90Yy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsCjApLmxlbmd0aCgpLHQ9MS90Yy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT0xL3RjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTtjWzBdPWVbMF0qZztjWzFdPWVbMV0qZztjWzJdPWVbMl0qZztjWzNdPTA7Y1s0XT1lWzRdKnQ7Y1s1XT1lWzVdKnQ7Y1s2XT1lWzZdKnQ7Y1s3XT0wO2NbOF09ZVs4XSphO2NbOV09ZVs5XSphO2NbMTBdPWVbMTBdKmE7Y1sxMV09MDtjWzEyXT0wO2NbMTNdPTA7Y1sxNF09MDtjWzE1XT0xO3JldHVybiB0aGlzfSxtYWtlUm90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7YSYmYS5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnksdD1hLnosdj1NYXRoLmNvcyhlKTtlPU1hdGguc2luKGUpOwp2YXIgej1NYXRoLmNvcyhnKTtnPU1hdGguc2luKGcpO3ZhciBFPU1hdGguY29zKHQpO3Q9TWF0aC5zaW4odCk7aWYoIlhZWiI9PT1hLm9yZGVyKXthPXYqRTt2YXIgRj12KnQsST1lKkUsTT1lKnQ7Y1swXT16KkU7Y1s0XT0teip0O2NbOF09ZztjWzFdPUYrSSpnO2NbNV09YS1NKmc7Y1s5XT0tZSp6O2NbMl09TS1hKmc7Y1s2XT1JK0YqZztjWzEwXT12Knp9ZWxzZSJZWFoiPT09YS5vcmRlcj8oYT16KkUsRj16KnQsST1nKkUsTT1nKnQsY1swXT1hK00qZSxjWzRdPUkqZS1GLGNbOF09dipnLGNbMV09dip0LGNbNV09dipFLGNbOV09LWUsY1syXT1GKmUtSSxjWzZdPU0rYSplLGNbMTBdPXYqeik6IlpYWSI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqdCxJPWcqRSxNPWcqdCxjWzBdPWEtTSplLGNbNF09LXYqdCxjWzhdPUkrRiplLGNbMV09RitJKmUsY1s1XT12KkUsY1s5XT1NLWEqZSxjWzJdPS12KmcsY1s2XT1lLGNbMTBdPXYqeik6IlpZWCI9PT1hLm9yZGVyPyhhPXYqRSxGPXYqdCxJPWUqCkUsTT1lKnQsY1swXT16KkUsY1s0XT1JKmctRixjWzhdPWEqZytNLGNbMV09eip0LGNbNV09TSpnK2EsY1s5XT1GKmctSSxjWzJdPS1nLGNbNl09ZSp6LGNbMTBdPXYqeik6IllaWCI9PT1hLm9yZGVyPyhhPXYqeixGPXYqZyxJPWUqeixNPWUqZyxjWzBdPXoqRSxjWzRdPU0tYSp0LGNbOF09SSp0K0YsY1sxXT10LGNbNV09dipFLGNbOV09LWUqRSxjWzJdPS1nKkUsY1s2XT1GKnQrSSxjWzEwXT1hLU0qdCk6IlhaWSI9PT1hLm9yZGVyJiYoYT12KnosRj12KmcsST1lKnosTT1lKmcsY1swXT16KkUsY1s0XT0tdCxjWzhdPWcqRSxjWzFdPWEqdCtNLGNbNV09dipFLGNbOV09Rip0LUksY1syXT1JKnQtRixjWzZdPWUqRSxjWzEwXT1NKnQrYSk7Y1szXT0wO2NbN109MDtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvbXBvc2UoU20sYSxUbSl9LGxvb2tBdDpmdW5jdGlvbihhLApjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7aWMuc3ViVmVjdG9ycyhhLGMpOzA9PT1pYy5sZW5ndGhTcSgpJiYoaWMuej0xKTtpYy5ub3JtYWxpemUoKTtIZC5jcm9zc1ZlY3RvcnMoZSxpYyk7MD09PUhkLmxlbmd0aFNxKCkmJigxPT09TWF0aC5hYnMoZS56KT9pYy54Kz0xRS00OmljLnorPTFFLTQsaWMubm9ybWFsaXplKCksSGQuY3Jvc3NWZWN0b3JzKGUsaWMpKTtIZC5ub3JtYWxpemUoKTtqaC5jcm9zc1ZlY3RvcnMoaWMsSGQpO2dbMF09SGQueDtnWzRdPWpoLng7Z1s4XT1pYy54O2dbMV09SGQueTtnWzVdPWpoLnk7Z1s5XT1pYy55O2dbMl09SGQuejtnWzZdPWpoLno7Z1sxMF09aWMuejtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsYykpOnRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGEpfSxwcmVtdWx0aXBseTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKGEsdGhpcyl9LG11bHRpcGx5TWF0cmljZXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmVsZW1lbnRzLGc9Yy5lbGVtZW50cztjPXRoaXMuZWxlbWVudHM7YT1lWzBdO3ZhciB0PWVbNF0sdj1lWzhdLHo9ZVsxMl0sRT1lWzFdLEY9ZVs1XSxJPWVbOV0sTT1lWzEzXSxQPWVbMl0sUT1lWzZdLFU9ZVsxMF0sVj1lWzE0XSxlYT1lWzNdLGRhPWVbN10scmE9ZVsxMV07ZT1lWzE1XTt2YXIgcGE9Z1swXSxxYT1nWzRdLHVhPWdbOF0sbmE9Z1sxMl0sdGE9Z1sxXSxCYT1nWzVdLFRhPWdbOV0sVWE9Z1sxM10sQ2E9Z1syXSxIYT1nWzZdLERhPWdbMTBdLE1hPWdbMTRdLGRiPWdbM10sdGI9Z1s3XSxLYT1nWzExXTtnPWdbMTVdO2NbMF09YSpwYSt0KnRhK3YqQ2EreipkYjtjWzRdPWEqcWErdCpCYSt2KgpIYSt6KnRiO2NbOF09YSp1YSt0KlRhK3YqRGEreipLYTtjWzEyXT1hKm5hK3QqVWErdipNYSt6Kmc7Y1sxXT1FKnBhK0YqdGErSSpDYStNKmRiO2NbNV09RSpxYStGKkJhK0kqSGErTSp0YjtjWzldPUUqdWErRipUYStJKkRhK00qS2E7Y1sxM109RSpuYStGKlVhK0kqTWErTSpnO2NbMl09UCpwYStRKnRhK1UqQ2ErVipkYjtjWzZdPVAqcWErUSpCYStVKkhhK1YqdGI7Y1sxMF09UCp1YStRKlRhK1UqRGErVipLYTtjWzE0XT1QKm5hK1EqVWErVSpNYStWKmc7Y1szXT1lYSpwYStkYSp0YStyYSpDYStlKmRiO2NbN109ZWEqcWErZGEqQmErcmEqSGErZSp0YjtjWzExXT1lYSp1YStkYSpUYStyYSpEYStlKkthO2NbMTVdPWVhKm5hK2RhKlVhK3JhKk1hK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbNF0qPWE7Y1s4XSo9YTtjWzEyXSo9YTtjWzFdKj1hO2NbNV0qPWE7Y1s5XSo9YTtjWzEzXSo9YTtjWzJdKj0KYTtjWzZdKj1hO2NbMTBdKj1hO2NbMTRdKj1hO2NbM10qPWE7Y1s3XSo9YTtjWzExXSo9YTtjWzE1XSo9YTtyZXR1cm4gdGhpc30sYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyl0Yy54PWEuZ2V0WChjKSx0Yy55PWEuZ2V0WShjKSx0Yy56PWEuZ2V0WihjKSx0Yy5hcHBseU1hdHJpeDQodGhpcyksYS5zZXRYWVooYyx0Yy54LHRjLnksdGMueik7cmV0dXJuIGF9LGRldGVybWluYW50OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cyxjPWFbMF0sZT1hWzRdLGc9YVs4XSx0PWFbMTJdLHY9YVsxXSx6PWFbNV0sRT1hWzldLEY9YVsxM10sST1hWzJdLE09YVs2XSxQPWFbMTBdLFE9YVsxNF07cmV0dXJuIGFbM10qKCt0KkUqTS1nKkYqTS10KnoqUCtlKkYqUCtnKnoqUS1lKkUqUSkrYVs3XSooK2MqRSpRLWMqRipQK3QqdipQLWcqdipRK2cqRipJLXQqRSpJKSthWzExXSooK2MqRipNLWMqeipRLXQqdipNK2UqdipRKwp0KnoqSS1lKkYqSSkrYVsxNV0qKC1nKnoqSS1jKkUqTStjKnoqUCtnKnYqTS1lKnYqUCtlKkUqSSl9LHRyYW5zcG9zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudHM7dmFyIGM9YVsxXTthWzFdPWFbNF07YVs0XT1jO2M9YVsyXTthWzJdPWFbOF07YVs4XT1jO2M9YVs2XTthWzZdPWFbOV07YVs5XT1jO2M9YVszXTthWzNdPWFbMTJdO2FbMTJdPWM7Yz1hWzddO2FbN109YVsxM107YVsxM109YztjPWFbMTFdO2FbMTFdPWFbMTRdO2FbMTRdPWM7cmV0dXJuIHRoaXN9LHNldFBvc2l0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzO2EuaXNWZWN0b3IzPyhnWzEyXT1hLngsZ1sxM109YS55LGdbMTRdPWEueik6KGdbMTJdPWEsZ1sxM109YyxnWzE0XT1lKTtyZXR1cm4gdGhpc30sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHMsZz1hLmVsZW1lbnRzO2E9Z1swXTt2YXIgdD1nWzFdLHY9Z1syXSx6PWdbM10sRT1nWzRdLEY9Z1s1XSwKST1nWzZdLE09Z1s3XSxQPWdbOF0sUT1nWzldLFU9Z1sxMF0sVj1nWzExXSxlYT1nWzEyXSxkYT1nWzEzXSxyYT1nWzE0XTtnPWdbMTVdO3ZhciBwYT1RKnJhKk0tZGEqVSpNK2RhKkkqVi1GKnJhKlYtUSpJKmcrRipVKmcscWE9ZWEqVSpNLVAqcmEqTS1lYSpJKlYrRSpyYSpWK1AqSSpnLUUqVSpnLHVhPVAqZGEqTS1lYSpRKk0rZWEqRipWLUUqZGEqVi1QKkYqZytFKlEqZyxuYT1lYSpRKkktUCpkYSpJLWVhKkYqVStFKmRhKlUrUCpGKnJhLUUqUSpyYSx0YT1hKnBhK3QqcWErdip1YSt6Km5hO2lmKDA9PT10YSl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL3RhO2VbMF09CnBhKmM7ZVsxXT0oZGEqVSp6LVEqcmEqei1kYSp2KlYrdCpyYSpWK1EqdipnLXQqVSpnKSpjO2VbMl09KEYqcmEqei1kYSpJKnorZGEqdipNLXQqcmEqTS1GKnYqZyt0KkkqZykqYztlWzNdPShRKkkqei1GKlUqei1RKnYqTSt0KlUqTStGKnYqVi10KkkqVikqYztlWzRdPXFhKmM7ZVs1XT0oUCpyYSp6LWVhKlUqeitlYSp2KlYtYSpyYSpWLVAqdipnK2EqVSpnKSpjO2VbNl09KGVhKkkqei1FKnJhKnotZWEqdipNK2EqcmEqTStFKnYqZy1hKkkqZykqYztlWzddPShFKlUqei1QKkkqeitQKnYqTS1hKlUqTS1FKnYqVithKkkqVikqYztlWzhdPXVhKmM7ZVs5XT0oZWEqUSp6LVAqZGEqei1lYSp0KlYrYSpkYSpWK1AqdCpnLWEqUSpnKSpjO2VbMTBdPShFKmRhKnotZWEqRip6K2VhKnQqTS1hKmRhKk0tRSp0KmcrYSpGKmcpKmM7ZVsxMV09KFAqRip6LUUqUSp6LVAqdCpNK2EqUSpNK0UqdCpWLWEqRipWKSpjO2VbMTJdPW5hKmM7ZVsxM109KFAqZGEqdi1lYSpRKnYrZWEqdCpVLWEqZGEqVS0KUCp0KnJhK2EqUSpyYSkqYztlWzE0XT0oZWEqRip2LUUqZGEqdi1lYSp0KkkrYSpkYSpJK0UqdCpyYS1hKkYqcmEpKmM7ZVsxNV09KEUqUSp2LVAqRip2K1AqdCpJLWEqUSpJLUUqdCpVK2EqRipVKSpjO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzLGU9YS54LGc9YS55O2E9YS56O2NbMF0qPWU7Y1s0XSo9ZztjWzhdKj1hO2NbMV0qPWU7Y1s1XSo9ZztjWzldKj1hO2NbMl0qPWU7Y1s2XSo9ZztjWzEwXSo9YTtjWzNdKj1lO2NbN10qPWc7Y1sxMV0qPWE7cmV0dXJuIHRoaXN9LGdldE1heFNjYWxlT25BeGlzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGFbMF0qYVswXSthWzFdKmFbMV0rYVsyXSphWzJdLGFbNF0qYVs0XSthWzVdKmFbNV0rYVs2XSphWzZdLGFbOF0qYVs4XSthWzldKmFbOV0rYVsxMF0qYVsxMF0pKX0sbWFrZVRyYW5zbGF0aW9uOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLAowLDAsYSwwLDEsMCxjLDAsMCwxLGUsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblg6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldCgxLDAsMCwwLDAsYywtYSwwLDAsYSxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblk6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLDAsYSwwLDAsMSwwLDAsLWEsMCxjLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvblo6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5jb3MoYSk7YT1NYXRoLnNpbihhKTt0aGlzLnNldChjLC1hLDAsMCxhLGMsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkF4aXM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1NYXRoLmNvcyhjKTtjPU1hdGguc2luKGMpO3ZhciBnPTEtZSx0PWEueCx2PWEueTthPWEuejt2YXIgej1nKnQsRT1nKnY7dGhpcy5zZXQoeioKdCtlLHoqdi1jKmEseiphK2MqdiwwLHoqditjKmEsRSp2K2UsRSphLWMqdCwwLHoqYS1jKnYsRSphK2MqdCxnKmEqYStlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTY2FsZTpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoYSwwLDAsMCwwLGMsMCwwLDAsMCxlLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LG1ha2VTaGVhcjpmdW5jdGlvbihhLGMsZSl7dGhpcy5zZXQoMSxjLGUsMCxhLDEsZSwwLGEsYywxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNvbXBvc2U6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHMsdD1jLl94LHY9Yy5feSx6PWMuX3osRT1jLl93LEY9dCt0LEk9dit2LE09eit6O2M9dCpGO3ZhciBQPXQqSTt0Kj1NO3ZhciBRPXYqSTt2Kj1NO3oqPU07Rio9RTtJKj1FO0UqPU07TT1lLng7dmFyIFU9ZS55O2U9ZS56O2dbMF09KDEtKFEreikpKk07Z1sxXT0oUCtFKSpNO2dbMl09KHQtSSkqTTtnWzNdPTA7Z1s0XT0oUC1FKSpVO2dbNV09KDEtKGMreikpKgpVO2dbNl09KHYrRikqVTtnWzddPTA7Z1s4XT0odCtJKSplO2dbOV09KHYtRikqZTtnWzEwXT0oMS0oYytRKSkqZTtnWzExXT0wO2dbMTJdPWEueDtnWzEzXT1hLnk7Z1sxNF09YS56O2dbMTVdPTE7cmV0dXJuIHRoaXN9LGRlY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyx0PXRjLnNldChnWzBdLGdbMV0sZ1syXSkubGVuZ3RoKCksdj10Yy5zZXQoZ1s0XSxnWzVdLGdbNl0pLmxlbmd0aCgpLHo9dGMuc2V0KGdbOF0sZ1s5XSxnWzEwXSkubGVuZ3RoKCk7MD50aGlzLmRldGVybWluYW50KCkmJih0PS10KTthLng9Z1sxMl07YS55PWdbMTNdO2Euej1nWzE0XTtSYi5jb3B5KHRoaXMpO2E9MS90O2c9MS92O3ZhciBFPTEvejtSYi5lbGVtZW50c1swXSo9YTtSYi5lbGVtZW50c1sxXSo9YTtSYi5lbGVtZW50c1syXSo9YTtSYi5lbGVtZW50c1s0XSo9ZztSYi5lbGVtZW50c1s1XSo9ZztSYi5lbGVtZW50c1s2XSo9ZztSYi5lbGVtZW50c1s4XSo9RTtSYi5lbGVtZW50c1s5XSo9CkU7UmIuZWxlbWVudHNbMTBdKj1FO2Muc2V0RnJvbVJvdGF0aW9uTWF0cml4KFJiKTtlLng9dDtlLnk9djtlLno9ejtyZXR1cm4gdGhpc30sbWFrZVBlcnNwZWN0aXZlOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt2b2lkIDA9PT12JiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4iKTt2YXIgej10aGlzLmVsZW1lbnRzO3pbMF09Mip0LyhjLWEpO3pbNF09MDt6WzhdPShjK2EpLyhjLWEpO3pbMTJdPTA7elsxXT0wO3pbNV09Mip0LyhlLWcpO3pbOV09KGUrZykvKGUtZyk7elsxM109MDt6WzJdPTA7els2XT0wO3pbMTBdPS0odit0KS8odi10KTt6WzE0XT0tMip2KnQvKHYtdCk7elszXT0wO3pbN109MDt6WzExXT0tMTt6WzE1XT0wO3JldHVybiB0aGlzfSxtYWtlT3J0aG9ncmFwaGljOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt2YXIgej0KdGhpcy5lbGVtZW50cyxFPTEvKGMtYSksRj0xLyhlLWcpLEk9MS8odi10KTt6WzBdPTIqRTt6WzRdPTA7els4XT0wO3pbMTJdPS0oKGMrYSkqRSk7elsxXT0wO3pbNV09MipGO3pbOV09MDt6WzEzXT0tKChlK2cpKkYpO3pbMl09MDt6WzZdPTA7elsxMF09LTIqSTt6WzE0XT0tKCh2K3QpKkkpO3pbM109MDt6WzddPTA7elsxMV09MDt6WzE1XT0xO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7MTY+ZTtlKyspaWYoY1tlXSE9PWFbZV0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT0wOzE2PmU7ZSsrKXRoaXMuZWxlbWVudHNbZV09YVtlK2NdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO3ZhciBlPXRoaXMuZWxlbWVudHM7YVtjXT1lWzBdOwphW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTthW2MrOV09ZVs5XTthW2MrMTBdPWVbMTBdO2FbYysxMV09ZVsxMV07YVtjKzEyXT1lWzEyXTthW2MrMTNdPWVbMTNdO2FbYysxNF09ZVsxNF07YVtjKzE1XT1lWzE1XTtyZXR1cm4gYX19KTt2YXIgbGs9bmV3IHEsbWs9bmV3IGg7dS5Sb3RhdGlvbk9yZGVycz0iWFlaIFlaWCBaWFkgWFpZIFlYWiBaWVgiLnNwbGl0KCIgIik7dS5EZWZhdWx0T3JkZXI9IlhZWiI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModS5wcm90b3R5cGUse3g6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl94fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feD1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LHk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl95fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5feT1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LAp6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSxvcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yZGVyfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fb3JkZXI9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24odS5wcm90b3R5cGUse2lzRXVsZXI6ITAsc2V0OmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuX3g9YTt0aGlzLl95PWM7dGhpcy5fej1lO3RoaXMuX29yZGVyPWd8fHRoaXMuX29yZGVyO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS5feDt0aGlzLl95PWEuX3k7dGhpcy5fej1hLl96O3RoaXMuX29yZGVyPWEuX29yZGVyOwp0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9aGIuY2xhbXAsdD1hLmVsZW1lbnRzO2E9dFswXTt2YXIgdj10WzRdLHo9dFs4XSxFPXRbMV0sRj10WzVdLEk9dFs5XSxNPXRbMl0sUD10WzZdO3Q9dFsxMF07Yz1jfHx0aGlzLl9vcmRlcjsiWFlaIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKGcoeiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoeik/KHRoaXMuX3g9TWF0aC5hdGFuMigtSSx0KSx0aGlzLl96PU1hdGguYXRhbjIoLXYsYSkpOih0aGlzLl94PU1hdGguYXRhbjIoUCxGKSx0aGlzLl96PTApKToiWVhaIj09PWM/KHRoaXMuX3g9TWF0aC5hc2luKC1nKEksLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEkpPyh0aGlzLl95PU1hdGguYXRhbjIoeix0KSx0aGlzLl96PU1hdGguYXRhbjIoRSxGKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtTSxhKSx0aGlzLl96PTApKToiWlhZIj09PWM/KHRoaXMuX3g9Ck1hdGguYXNpbihnKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl95PU1hdGguYXRhbjIoLU0sdCksdGhpcy5fej1NYXRoLmF0YW4yKC12LEYpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihFLGEpKSk6IlpZWCI9PT1jPyh0aGlzLl95PU1hdGguYXNpbigtZyhNLC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyhNKT8odGhpcy5feD1NYXRoLmF0YW4yKFAsdCksdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpOih0aGlzLl94PTAsdGhpcy5fej1NYXRoLmF0YW4yKC12LEYpKSk6IllaWCI9PT1jPyh0aGlzLl96PU1hdGguYXNpbihnKEUsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKEUpPyh0aGlzLl94PU1hdGguYXRhbjIoLUksRiksdGhpcy5feT1NYXRoLmF0YW4yKC1NLGEpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMih6LHQpKSk6IlhaWSI9PT1jPyh0aGlzLl96PU1hdGguYXNpbigtZyh2LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh2KT8odGhpcy5feD0KTWF0aC5hdGFuMihQLEYpLHRoaXMuX3k9TWF0aC5hdGFuMih6LGEpKToodGhpcy5feD1NYXRoLmF0YW4yKC1JLHQpLHRoaXMuX3k9MCkpOmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBnaXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogIitjKTt0aGlzLl9vcmRlcj1jOyExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhLGMsZSl7bGsubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oYSk7cmV0dXJuIHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGxrLGMsZSl9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuc2V0KGEueCxhLnksYS56LGN8fHRoaXMuX29yZGVyKX0scmVvcmRlcjpmdW5jdGlvbihhKXttay5zZXRGcm9tRXVsZXIodGhpcyk7cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24obWssYSl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PQp0aGlzLl94JiZhLl95PT09dGhpcy5feSYmYS5fej09PXRoaXMuX3omJmEuX29yZGVyPT09dGhpcy5fb3JkZXJ9LGZyb21BcnJheTpmdW5jdGlvbihhKXt0aGlzLl94PWFbMF07dGhpcy5feT1hWzFdO3RoaXMuX3o9YVsyXTt2b2lkIDAhPT1hWzNdJiYodGhpcy5fb3JkZXI9YVszXSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fb3JkZXI7cmV0dXJuIGF9LHRvVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLnNldCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feik6bmV3IGsodGhpcy5feCx0aGlzLl95LHRoaXMuX3opfSxfb25DaGFuZ2U6ZnVuY3Rpb24oYSl7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxfb25DaGFuZ2VDYWxsYmFjazpmdW5jdGlvbigpe319KTsKT2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEpe3RoaXMubWFzaz0xPDxhfDB9LGVuYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2s9dGhpcy5tYXNrfDE8PGF8MH0sZW5hYmxlQWxsOmZ1bmN0aW9uKCl7dGhpcy5tYXNrPS0xfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrXj0xPDxhfDB9LGRpc2FibGU6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrJj1+KDE8PGF8MCl9LGRpc2FibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9MH0sdGVzdDpmdW5jdGlvbihhKXtyZXR1cm4gMCE9PSh0aGlzLm1hc2smYS5tYXNrKX19KTt2YXIgaWw9MCxuaz1uZXcgayxoZj1uZXcgaCxsZD1uZXcgcSxraD1uZXcgayxsZz1uZXcgayxVbT1uZXcgayxWbT1uZXcgaCxvaz1uZXcgaygxLDAsMCkscGs9bmV3IGsoMCwxLDApLHFrPW5ldyBrKDAsMCwxKSxXbT17dHlwZToiYWRkZWQifSxYbT17dHlwZToicmVtb3ZlZCJ9O0EuRGVmYXVsdFVwPW5ldyBrKDAsMSwwKTtBLkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlPQohMDtBLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBLGlzT2JqZWN0M0Q6ITAsb25CZWZvcmVSZW5kZXI6ZnVuY3Rpb24oKXt9LG9uQWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKTt0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShhKTt0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9LGFwcGx5UXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoYSk7cmV0dXJuIHRoaXN9LHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyl9LHNldFJvdGF0aW9uRnJvbUV1bGVyOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoYSwKITApfSxzZXRSb3RhdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChhKX0sc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uY29weShhKX0scm90YXRlT25BeGlzOmZ1bmN0aW9uKGEsYyl7aGYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5tdWx0aXBseShoZik7cmV0dXJuIHRoaXN9LHJvdGF0ZU9uV29ybGRBeGlzOmZ1bmN0aW9uKGEsYyl7aGYuc2V0RnJvbUF4aXNBbmdsZShhLGMpO3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShoZik7cmV0dXJuIHRoaXN9LHJvdGF0ZVg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKG9rLGEpfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhwayxhKX0scm90YXRlWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMocWssYSl9LHRyYW5zbGF0ZU9uQXhpczpmdW5jdGlvbihhLApjKXtuay5jb3B5KGEpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pO3RoaXMucG9zaXRpb24uYWRkKG5rLm11bHRpcGx5U2NhbGFyKGMpKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMob2ssYSl9LHRyYW5zbGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHBrLGEpfSx0cmFuc2xhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhxayxhKX0sbG9jYWxUb1dvcmxkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX0sd29ybGRUb0xvY2FsOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGx5TWF0cml4NChsZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpKX0sbG9va0F0OmZ1bmN0aW9uKGEsYyxlKXthLmlzVmVjdG9yMz9raC5jb3B5KGEpOmtoLnNldChhLGMsZSk7YT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLAohMSk7bGcuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO3RoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9sZC5sb29rQXQobGcsa2gsdGhpcy51cCk6bGQubG9va0F0KGtoLGxnLHRoaXMudXApO3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgobGQpO2EmJihsZC5leHRyYWN0Um90YXRpb24oYS5tYXRyaXhXb3JsZCksaGYuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGxkKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoaGYuaW52ZXJzZSgpKSl9LGFkZDpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5hZGQoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31pZihhPT09dGhpcylyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIixhKSx0aGlzO2EmJmEuaXNPYmplY3QzRD8KKG51bGwhPT1hLnBhcmVudCYmYS5wYXJlbnQucmVtb3ZlKGEpLGEucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKGEpLGEuZGlzcGF0Y2hFdmVudChXbSkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLGEpO3JldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoMTxhcmd1bWVudHMubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tjXSk7cmV0dXJuIHRoaXN9Yz10aGlzLmNoaWxkcmVuLmluZGV4T2YoYSk7LTEhPT1jJiYoYS5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShjLDEpLGEuZGlzcGF0Y2hFdmVudChYbSkpO3JldHVybiB0aGlzfSxhdHRhY2g6ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7bGQuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKTtudWxsIT09CmEucGFyZW50JiYoYS5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGxkLm11bHRpcGx5KGEucGFyZW50Lm1hdHJpeFdvcmxkKSk7YS5hcHBseU1hdHJpeChsZCk7YS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7dGhpcy5hZGQoYSk7cmV0dXJuIHRoaXN9LGdldE9iamVjdEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLGEpfSxnZXRPYmplY3RCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsYSl9LGdldE9iamVjdEJ5UHJvcGVydHk6ZnVuY3Rpb24oYSxjKXtpZih0aGlzW2FdPT09YylyZXR1cm4gdGhpcztmb3IodmFyIGU9MCxnPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO2U8ZztlKyspe3ZhciB0PXRoaXMuY2hpbGRyZW5bZV0uZ2V0T2JqZWN0QnlQcm9wZXJ0eShhLGMpO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHR9fSxnZXRXb3JsZFBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUG9zaXRpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7cmV0dXJuIGEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfSxnZXRXb3JsZFF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFF1YXRlcm5pb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgaCk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobGcsYSxVbSk7cmV0dXJuIGF9LGdldFdvcmxkU2NhbGU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApOwp0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZyxWbSxhKTtyZXR1cm4gYX0sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldChjWzhdLGNbOV0sY1sxMF0pLm5vcm1hbGl6ZSgpfSxyYXljYXN0OmZ1bmN0aW9uKCl7fSx0cmF2ZXJzZTpmdW5jdGlvbihhKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZShhKX0sdHJhdmVyc2VWaXNpYmxlOmZ1bmN0aW9uKGEpe2lmKCExIT09dGhpcy52aXNpYmxlKXthKHRoaXMpO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS50cmF2ZXJzZVZpc2libGUoYSl9fSwKdHJhdmVyc2VBbmNlc3RvcnM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5wYXJlbnQ7bnVsbCE9PWMmJihhKGMpLGMudHJhdmVyc2VBbmNlc3RvcnMoYSkpfSx1cGRhdGVNYXRyaXg6ZnVuY3Rpb24oKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH0sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO2lmKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8YSludWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSxhPSEwO2Zvcih2YXIgYz10aGlzLmNoaWxkcmVuLGU9CjAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0udXBkYXRlTWF0cml4V29ybGQoYSl9LHVwZGF0ZVdvcmxkTWF0cml4OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJlbnQ7ITA9PT1hJiZudWxsIT09ZSYmZS51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO251bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCk7aWYoITA9PT1jKWZvcihhPXRoaXMuY2hpbGRyZW4sYz0wLGU9YS5sZW5ndGg7YzxlO2MrKylhW2NdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoTSxQKXt2b2lkIDA9PT1NW1AudXVpZF0mJihNW1AudXVpZF09UC50b0pTT04oYSkpO3JldHVybiBQLnV1aWR9ZnVuY3Rpb24gZShNKXt2YXIgUD0KW10sUTtmb3IoUSBpbiBNKXt2YXIgVT1NW1FdO2RlbGV0ZSBVLm1ldGFkYXRhO1AucHVzaChVKX1yZXR1cm4gUH12YXIgZz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhLHQ9e307ZyYmKGE9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e319LHQubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7dmFyIHY9e307di51dWlkPXRoaXMudXVpZDt2LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodi5uYW1lPXRoaXMubmFtZSk7ITA9PT10aGlzLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9ITApOyEwPT09dGhpcy5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PSEwKTshMT09PXRoaXMudmlzaWJsZSYmKHYudmlzaWJsZT0hMSk7ITE9PT10aGlzLmZydXN0dW1DdWxsZWQmJih2LmZydXN0dW1DdWxsZWQ9ITEpOzAhPT10aGlzLnJlbmRlck9yZGVyJiYKKHYucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlcik7Int9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYodi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTt2LmxheWVycz10aGlzLmxheWVycy5tYXNrO3YubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKTshMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT0hMSk7dGhpcy5pc01lc2gmJjAhPT10aGlzLmRyYXdNb2RlJiYodi5kcmF3TW9kZT10aGlzLmRyYXdNb2RlKTtpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe3YuZ2VvbWV0cnk9YyhhLmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7dmFyIHo9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PXomJnZvaWQgMCE9PXouc2hhcGVzKWlmKHo9ei5zaGFwZXMsQXJyYXkuaXNBcnJheSh6KSlmb3IodmFyIEU9MCxGPXoubGVuZ3RoO0U8RjtFKyspYyhhLnNoYXBlcyx6W0VdKTtlbHNlIGMoYS5zaGFwZXMsCnopfWlmKHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7ej1bXTtFPTA7Zm9yKEY9dGhpcy5tYXRlcmlhbC5sZW5ndGg7RTxGO0UrKyl6LnB1c2goYyhhLm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW0VdKSk7di5tYXRlcmlhbD16fWVsc2Ugdi5tYXRlcmlhbD1jKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKDA8dGhpcy5jaGlsZHJlbi5sZW5ndGgpZm9yKHYuY2hpbGRyZW49W10sRT0wO0U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7RSsrKXYuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW0VdLnRvSlNPTihhKS5vYmplY3QpO2lmKGcpe2c9ZShhLmdlb21ldHJpZXMpO0U9ZShhLm1hdGVyaWFscyk7Rj1lKGEudGV4dHVyZXMpO3ZhciBJPWUoYS5pbWFnZXMpO3o9ZShhLnNoYXBlcyk7MDxnLmxlbmd0aCYmKHQuZ2VvbWV0cmllcz1nKTswPEUubGVuZ3RoJiYodC5tYXRlcmlhbHM9RSk7MDxGLmxlbmd0aCYmKHQudGV4dHVyZXM9Rik7CjA8SS5sZW5ndGgmJih0LmltYWdlcz1JKTswPHoubGVuZ3RoJiYodC5zaGFwZXM9eil9dC5vYmplY3Q9djtyZXR1cm4gdH0sY2xvbmU6ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsYSl9LGNvcHk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0hMCk7dGhpcy5uYW1lPWEubmFtZTt0aGlzLnVwLmNvcHkoYS51cCk7dGhpcy5wb3NpdGlvbi5jb3B5KGEucG9zaXRpb24pO3RoaXMucXVhdGVybmlvbi5jb3B5KGEucXVhdGVybmlvbik7dGhpcy5zY2FsZS5jb3B5KGEuc2NhbGUpO3RoaXMubWF0cml4LmNvcHkoYS5tYXRyaXgpO3RoaXMubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlO3RoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7dGhpcy5sYXllcnMubWFzaz1hLmxheWVycy5tYXNrO3RoaXMudmlzaWJsZT1hLnZpc2libGU7CnRoaXMuY2FzdFNoYWRvdz1hLmNhc3RTaGFkb3c7dGhpcy5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdzt0aGlzLmZydXN0dW1DdWxsZWQ9YS5mcnVzdHVtQ3VsbGVkO3RoaXMucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcjt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO2lmKCEwPT09Yylmb3IoYz0wO2M8YS5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuYWRkKGEuY2hpbGRyZW5bY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7eS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eSxpc1NjZW5lOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO251bGwhPT1hLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQ9YS5iYWNrZ3JvdW5kLmNsb25lKCkpO251bGwhPT1hLmZvZyYmKHRoaXMuZm9nPWEuZm9nLmNsb25lKCkpOwpudWxsIT09YS5vdmVycmlkZU1hdGVyaWFsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPWEub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKTt0aGlzLmF1dG9VcGRhdGU9YS5hdXRvVXBkYXRlO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO251bGwhPT10aGlzLmJhY2tncm91bmQmJihjLm9iamVjdC5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oYSkpO251bGwhPT10aGlzLmZvZyYmKGMub2JqZWN0LmZvZz10aGlzLmZvZy50b0pTT04oKSk7cmV0dXJuIGN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIG1kPVtuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcgayxuZXcga10sWWM9bmV3IGssamY9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssCklkPW5ldyBrLEpkPW5ldyBrLGhlPW5ldyBrLG1nPW5ldyBrLGxoPW5ldyBrLG1oPW5ldyBrLE1kPW5ldyBrO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUse2lzQm94MzohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm1pbi5jb3B5KGEpO3RoaXMubWF4LmNvcHkoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21BcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSxnPUluZmluaXR5LHQ9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEubGVuZ3RoO0U8RjtFKz0zKXt2YXIgST1hW0VdLE09YVtFKzFdLFA9YVtFKzJdO0k8YyYmKGM9SSk7TTxlJiYoZT1NKTtQPGcmJihnPVApO0k+dCYmKHQ9SSk7TT52JiYodj1NKTtQPnomJih6PVApfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHQsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9SW5maW5pdHksZT1JbmZpbml0eSwKZz1JbmZpbml0eSx0PS1JbmZpbml0eSx2PS1JbmZpbml0eSx6PS1JbmZpbml0eSxFPTAsRj1hLmNvdW50O0U8RjtFKyspe3ZhciBJPWEuZ2V0WChFKSxNPWEuZ2V0WShFKSxQPWEuZ2V0WihFKTtJPGMmJihjPUkpO008ZSYmKGU9TSk7UDxnJiYoZz1QKTtJPnQmJih0PUkpO00+diYmKHY9TSk7UD56JiYoej1QKX10aGlzLm1pbi5zZXQoYyxlLGcpO3RoaXMubWF4LnNldCh0LHYseik7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspdGhpcy5leHBhbmRCeVBvaW50KGFbY10pO3JldHVybiB0aGlzfSxzZXRGcm9tQ2VudGVyQW5kU2l6ZTpmdW5jdGlvbihhLGMpe2M9WWMuY29weShjKS5tdWx0aXBseVNjYWxhciguNSk7dGhpcy5taW4uY29weShhKS5zdWIoYyk7dGhpcy5tYXguY29weShhKS5hZGQoYyk7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dGhpcy5tYWtlRW1wdHkoKTsKcmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoYSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubWluLmNvcHkoYS5taW4pO3RoaXMubWF4LmNvcHkoYS5tYXgpO3JldHVybiB0aGlzfSxtYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tSW5maW5pdHk7cmV0dXJuIHRoaXN9LGlzRW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPwphLnNldCgwLDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfSxleHBhbmRCeVBvaW50OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhKTt0aGlzLm1heC5tYXgoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5VmVjdG9yOmZ1bmN0aW9uKGEpe3RoaXMubWluLnN1YihhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZFNjYWxhcigtYSk7dGhpcy5tYXguYWRkU2NhbGFyKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYzthLnVwZGF0ZVdvcmxkTWF0cml4KCExLAohMSk7dmFyIGU9YS5nZW9tZXRyeTtpZih2b2lkIDAhPT1lKWlmKGUuaXNHZW9tZXRyeSl7dmFyIGc9ZS52ZXJ0aWNlcztlPTA7Zm9yKGM9Zy5sZW5ndGg7ZTxjO2UrKylZYy5jb3B5KGdbZV0pLFljLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoWWMpfWVsc2UgaWYoZS5pc0J1ZmZlckdlb21ldHJ5JiYoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24sdm9pZCAwIT09ZykpZm9yKGU9MCxjPWcuY291bnQ7ZTxjO2UrKylZYy5mcm9tQnVmZmVyQXR0cmlidXRlKGcsZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChZYyk7YT1hLmNoaWxkcmVuO2U9MDtmb3IoYz1hLmxlbmd0aDtlPGM7ZSsrKXRoaXMuZXhwYW5kQnlPYmplY3QoYVtlXSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55fHwKYS56PHRoaXMubWluLnp8fGEuej50aGlzLm1heC56PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9YS5taW4ueiYmYS5tYXguejw9dGhpcy5tYXguen0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLChhLnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm1heC54PHRoaXMubWluLnh8fAphLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55fHxhLm1heC56PHRoaXMubWluLnp8fGEubWluLno+dGhpcy5tYXguej8hMTohMH0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt0aGlzLmNsYW1wUG9pbnQoYS5jZW50ZXIsWWMpO3JldHVybiBZYy5kaXN0YW5jZVRvU3F1YXJlZChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxpbnRlcnNlY3RzUGxhbmU6ZnVuY3Rpb24oYSl7aWYoMDxhLm5vcm1hbC54KXt2YXIgYz1hLm5vcm1hbC54KnRoaXMubWluLng7dmFyIGU9YS5ub3JtYWwueCp0aGlzLm1heC54fWVsc2UgYz1hLm5vcm1hbC54KnRoaXMubWF4LngsZT1hLm5vcm1hbC54KnRoaXMubWluLng7MDxhLm5vcm1hbC55PyhjKz1hLm5vcm1hbC55KnRoaXMubWluLnksZSs9YS5ub3JtYWwueSp0aGlzLm1heC55KTooYys9YS5ub3JtYWwueSp0aGlzLm1heC55LGUrPWEubm9ybWFsLnkqdGhpcy5taW4ueSk7MDxhLm5vcm1hbC56PwooYys9YS5ub3JtYWwueip0aGlzLm1pbi56LGUrPWEubm9ybWFsLnoqdGhpcy5tYXgueik6KGMrPWEubm9ybWFsLnoqdGhpcy5tYXgueixlKz1hLm5vcm1hbC56KnRoaXMubWluLnopO3JldHVybiBjPD0tYS5jb25zdGFudCYmZT49LWEuY29uc3RhbnR9LGludGVyc2VjdHNUcmlhbmdsZTpmdW5jdGlvbihhKXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcihtZyk7bGguc3ViVmVjdG9ycyh0aGlzLm1heCxtZyk7amYuc3ViVmVjdG9ycyhhLmEsbWcpO2tmLnN1YlZlY3RvcnMoYS5iLG1nKTtsZi5zdWJWZWN0b3JzKGEuYyxtZyk7SWQuc3ViVmVjdG9ycyhrZixqZik7SmQuc3ViVmVjdG9ycyhsZixrZik7aGUuc3ViVmVjdG9ycyhqZixsZik7YT1bMCwtSWQueixJZC55LDAsLUpkLnosSmQueSwwLC1oZS56LGhlLnksSWQueiwwLC1JZC54LEpkLnosMCwtSmQueCxoZS56LDAsLWhlLngsLUlkLnksSWQueCwwLC1KZC55LEpkLngsMCwtaGUueSxoZS54LDBdO2lmKCFDKGEsCmpmLGtmLGxmLGxoKSlyZXR1cm4hMTthPVsxLDAsMCwwLDEsMCwwLDAsMV07aWYoIUMoYSxqZixrZixsZixsaCkpcmV0dXJuITE7bWguY3Jvc3NWZWN0b3JzKElkLEpkKTthPVttaC54LG1oLnksbWguel07cmV0dXJuIEMoYSxqZixrZixsZixsaCl9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBZYy5jb3B5KGEpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIoYSkubGVuZ3RoKCl9LGdldEJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKTt0aGlzLmdldENlbnRlcihhLmNlbnRlcik7CmEucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShZYykubGVuZ3RoKCk7cmV0dXJuIGF9LGludGVyc2VjdDpmdW5jdGlvbihhKXt0aGlzLm1pbi5tYXgoYS5taW4pO3RoaXMubWF4Lm1pbihhLm1heCk7dGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiB0aGlzO21kWzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO21kWzFdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO21kWzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO21kWzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpOwptZFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTttZFs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTttZFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChhKTttZFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChhKTt0aGlzLnNldEZyb21Qb2ludHMobWQpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciBZbT1uZXcgeDtPYmplY3QuYXNzaWduKEcucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLmNlbnRlci5jb3B5KGEpO3RoaXMucmFkaXVzPQpjO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5jZW50ZXI7dm9pZCAwIT09Yz9lLmNvcHkoYyk6WW0uc2V0RnJvbVBvaW50cyhhKS5nZXRDZW50ZXIoZSk7Zm9yKHZhciBnPWM9MCx0PWEubGVuZ3RoO2c8dDtnKyspYz1NYXRoLm1heChjLGUuZGlzdGFuY2VUb1NxdWFyZWQoYVtnXSkpO3RoaXMucmFkaXVzPU1hdGguc3FydChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7dGhpcy5yYWRpdXM9YS5yYWRpdXM7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA+PXRoaXMucmFkaXVzfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS0KdGhpcy5yYWRpdXN9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yYWRpdXMrYS5yYWRpdXM7cmV0dXJuIGEuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9YypjfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNTcGhlcmUodGhpcyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoYS5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9LGNsYW1wUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChhKTt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2MuY29weShhKTtlPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoYy5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGMubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpOwpyZXR1cm4gY30sZ2V0Qm91bmRpbmdCb3g6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgeCk7YS5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpO2EuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpO3JldHVybiBhfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KGEpO3RoaXMucmFkaXVzKj1hLmdldE1heFNjYWxlT25BeGlzKCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmYS5yYWRpdXM9PT10aGlzLnJhZGl1c319KTt2YXIgbmQ9bmV3IGssRGk9bmV3IGssbmg9bmV3IGssS2Q9bmV3IGssRWk9bmV3IGssb2g9bmV3IGssRmk9bmV3IGs7Ck9iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMub3JpZ2luLmNvcHkoYSk7dGhpcy5kaXJlY3Rpb24uY29weShjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weShhLm9yaWdpbik7dGhpcy5kaXJlY3Rpb24uY29weShhLmRpcmVjdGlvbik7cmV0dXJuIHRoaXN9LGF0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sbG9va0F0OmZ1bmN0aW9uKGEpe3RoaXMuZGlyZWN0aW9uLmNvcHkoYSkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30scmVjYXN0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmNvcHkodGhpcy5hdChhLApuZCkpO3JldHVybiB0aGlzfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtjLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbik7YT1jLmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIDA+YT9jLmNvcHkodGhpcy5vcmlnaW4pOmMuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKX0sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhKSl9LGRpc3RhbmNlU3FUb1BvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPW5kLnN1YlZlY3RvcnMoYSx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPmMpcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGEpO25kLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh0aGlzLm9yaWdpbik7CnJldHVybiBuZC5kaXN0YW5jZVRvU3F1YXJlZChhKX0sZGlzdGFuY2VTcVRvU2VnbWVudDpmdW5jdGlvbihhLGMsZSxnKXtEaS5jb3B5KGEpLmFkZChjKS5tdWx0aXBseVNjYWxhciguNSk7bmguY29weShjKS5zdWIoYSkubm9ybWFsaXplKCk7S2QuY29weSh0aGlzLm9yaWdpbikuc3ViKERpKTt2YXIgdD0uNSphLmRpc3RhbmNlVG8oYyksdj0tdGhpcy5kaXJlY3Rpb24uZG90KG5oKSx6PUtkLmRvdCh0aGlzLmRpcmVjdGlvbiksRT0tS2QuZG90KG5oKSxGPUtkLmxlbmd0aFNxKCksST1NYXRoLmFicygxLXYqdik7aWYoMDxJKXthPXYqRS16O2M9dip6LUU7dmFyIE09dCpJOzA8PWE/Yz49LU0/Yzw9TT8odD0xL0ksYSo9dCxjKj10LHY9YSooYSt2KmMrMip6KStjKih2KmErYysyKkUpK0YpOihjPXQsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOihjPS10LGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGKTpjPD0tTT8oYT1NYXRoLm1heCgwLAotKC12KnQreikpLGM9MDxhPy10Ok1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PS1hKmErYyooYysyKkUpK0YpOmM8PU0/KGE9MCxjPU1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PWMqKGMrMipFKStGKTooYT1NYXRoLm1heCgwLC0odip0K3opKSxjPTA8YT90Ok1hdGgubWluKE1hdGgubWF4KC10LC1FKSx0KSx2PS1hKmErYyooYysyKkUpK0YpfWVsc2UgYz0wPHY/LXQ6dCxhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRjtlJiZlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLm9yaWdpbik7ZyYmZy5jb3B5KG5oKS5tdWx0aXBseVNjYWxhcihjKS5hZGQoRGkpO3JldHVybiB2fSxpbnRlcnNlY3RTcGhlcmU6ZnVuY3Rpb24oYSxjKXtuZC5zdWJWZWN0b3JzKGEuY2VudGVyLHRoaXMub3JpZ2luKTt2YXIgZT1uZC5kb3QodGhpcy5kaXJlY3Rpb24pLGc9bmQuZG90KG5kKS1lKmU7YT1hLnJhZGl1cyphLnJhZGl1czsKaWYoZz5hKXJldHVybiBudWxsO2E9TWF0aC5zcXJ0KGEtZyk7Zz1lLWE7ZSs9YTtyZXR1cm4gMD5nJiYwPmU/bnVsbDowPmc/dGhpcy5hdChlLGMpOnRoaXMuYXQoZyxjKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVNxVG9Qb2ludChhLmNlbnRlcik8PWEucmFkaXVzKmEucmFkaXVzfSxkaXN0YW5jZVRvUGxhbmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09YylyZXR1cm4gMD09PWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7YT0tKHRoaXMub3JpZ2luLmRvdChhLm5vcm1hbCkrYS5jb25zdGFudCkvYztyZXR1cm4gMDw9YT9hOm51bGx9LGludGVyc2VjdFBsYW5lOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmRpc3RhbmNlVG9QbGFuZShhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDp0aGlzLmF0KGEsYyl9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7CnJldHVybiAwPT09Y3x8MD5hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmM/ITA6ITF9LGludGVyc2VjdEJveDpmdW5jdGlvbihhLGMpe3ZhciBlPTEvdGhpcy5kaXJlY3Rpb24ueDt2YXIgZz0xL3RoaXMuZGlyZWN0aW9uLnk7dmFyIHQ9MS90aGlzLmRpcmVjdGlvbi56LHY9dGhpcy5vcmlnaW47aWYoMDw9ZSl7dmFyIHo9KGEubWluLngtdi54KSplO2UqPWEubWF4Lngtdi54fWVsc2Ugej0oYS5tYXgueC12LngpKmUsZSo9YS5taW4ueC12Lng7aWYoMDw9Zyl7dmFyIEU9KGEubWluLnktdi55KSpnO2cqPWEubWF4Lnktdi55fWVsc2UgRT0oYS5tYXgueS12LnkpKmcsZyo9YS5taW4ueS12Lnk7aWYoej5nfHxFPmUpcmV0dXJuIG51bGw7aWYoRT56fHx6IT09eil6PUU7aWYoZzxlfHxlIT09ZSllPWc7MDw9dD8oRT0oYS5taW4uei12LnopKnQsYT0oYS5tYXguei12LnopKnQpOihFPShhLm1heC56LXYueikqdCxhPShhLm1pbi56LXYueikqdCk7aWYoej5hfHxFPmUpcmV0dXJuIG51bGw7CmlmKEU+enx8eiE9PXopej1FO2lmKGE8ZXx8ZSE9PWUpZT1hO3JldHVybiAwPmU/bnVsbDp0aGlzLmF0KDA8PXo/ejplLGMpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3goYSxuZCl9LGludGVyc2VjdFRyaWFuZ2xlOmZ1bmN0aW9uKGEsYyxlLGcsdCl7RWkuc3ViVmVjdG9ycyhjLGEpO29oLnN1YlZlY3RvcnMoZSxhKTtGaS5jcm9zc1ZlY3RvcnMoRWksb2gpO2M9dGhpcy5kaXJlY3Rpb24uZG90KEZpKTtpZigwPGMpe2lmKGcpcmV0dXJuIG51bGw7Zz0xfWVsc2UgaWYoMD5jKWc9LTEsYz0tYztlbHNlIHJldHVybiBudWxsO0tkLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sYSk7YT1nKnRoaXMuZGlyZWN0aW9uLmRvdChvaC5jcm9zc1ZlY3RvcnMoS2Qsb2gpKTtpZigwPmEpcmV0dXJuIG51bGw7ZT1nKnRoaXMuZGlyZWN0aW9uLmRvdChFaS5jcm9zcyhLZCkpO2lmKDA+ZXx8YStlPmMpcmV0dXJuIG51bGw7YT0tZypLZC5kb3QoRmkpOwpyZXR1cm4gMD5hP251bGw6dGhpcy5hdChhL2MsdCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoYSk7dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3JpZ2luLmVxdWFscyh0aGlzLm9yaWdpbikmJmEuZGlyZWN0aW9uLmVxdWFscyh0aGlzLmRpcmVjdGlvbil9fSk7dmFyIEtjPW5ldyBrLG9kPW5ldyBrLEdpPW5ldyBrLHBkPW5ldyBrLG1mPW5ldyBrLG5mPW5ldyBrLHJrPW5ldyBrLEhpPW5ldyBrLElpPW5ldyBrLEppPW5ldyBrO09iamVjdC5hc3NpZ24oQix7Z2V0Tm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWcmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGc9bmV3IGspO2cuc3ViVmVjdG9ycyhlLGMpO0tjLnN1YlZlY3RvcnMoYSxjKTtnLmNyb3NzKEtjKTsKYT1nLmxlbmd0aFNxKCk7cmV0dXJuIDA8YT9nLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KGEpKTpnLnNldCgwLDAsMCl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMsZSxnLHQpe0tjLnN1YlZlY3RvcnMoZyxjKTtvZC5zdWJWZWN0b3JzKGUsYyk7R2kuc3ViVmVjdG9ycyhhLGMpO2E9S2MuZG90KEtjKTtjPUtjLmRvdChvZCk7ZT1LYy5kb3QoR2kpO3ZhciB2PW9kLmRvdChvZCk7Zz1vZC5kb3QoR2kpO3ZhciB6PWEqdi1jKmM7dm9pZCAwPT09dCYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksdD1uZXcgayk7aWYoMD09PXopcmV0dXJuIHQuc2V0KC0yLC0xLC0xKTt6PTEvejt2PSh2KmUtYypnKSp6O2E9KGEqZy1jKmUpKno7cmV0dXJuIHQuc2V0KDEtdi1hLGEsdil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSxjLGUsZyl7Qi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxwZCk7cmV0dXJuIDA8PXBkLngmJgowPD1wZC55JiYxPj1wZC54K3BkLnl9LGdldFVWOmZ1bmN0aW9uKGEsYyxlLGcsdCx2LHosRSl7dGhpcy5nZXRCYXJ5Y29vcmQoYSxjLGUsZyxwZCk7RS5zZXQoMCwwKTtFLmFkZFNjYWxlZFZlY3Rvcih0LHBkLngpO0UuYWRkU2NhbGVkVmVjdG9yKHYscGQueSk7RS5hZGRTY2FsZWRWZWN0b3IoeixwZC56KTtyZXR1cm4gRX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhLGMsZSxnKXtLYy5zdWJWZWN0b3JzKGUsYyk7b2Quc3ViVmVjdG9ycyhhLGMpO3JldHVybiAwPktjLmNyb3NzKG9kKS5kb3QoZyk/ITA6ITF9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmEuY29weShhKTt0aGlzLmIuY29weShjKTt0aGlzLmMuY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50c0FuZEluZGljZXM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5hLmNvcHkoYVtjXSk7dGhpcy5iLmNvcHkoYVtlXSk7dGhpcy5jLmNvcHkoYVtnXSk7cmV0dXJuIHRoaXN9LApjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmEuY29weShhLmEpO3RoaXMuYi5jb3B5KGEuYik7dGhpcy5jLmNvcHkoYS5jKTtyZXR1cm4gdGhpc30sZ2V0QXJlYTpmdW5jdGlvbigpe0tjLnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYik7b2Quc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKTtyZXR1cm4uNSpLYy5jcm9zcyhvZCkubGVuZ3RoKCl9LGdldE1pZHBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuZ2V0TWlkcG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfSxnZXROb3JtYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxnZXRQbGFuZTpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfSxnZXRCYXJ5Y29vcmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyxjKX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyx0KXtyZXR1cm4gQi5nZXRVVihhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMsZSxnLHQpfSxjb250YWluc1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBCLmNvbnRhaW5zUG9pbnQoYSx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGlzRnJvbnRGYWNpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyxhKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSwKYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3ZhciBlPXRoaXMuYSxnPXRoaXMuYix0PXRoaXMuYzttZi5zdWJWZWN0b3JzKGcsZSk7bmYuc3ViVmVjdG9ycyh0LGUpO0hpLnN1YlZlY3RvcnMoYSxlKTt2YXIgdj1tZi5kb3QoSGkpLHo9bmYuZG90KEhpKTtpZigwPj12JiYwPj16KXJldHVybiBjLmNvcHkoZSk7SWkuc3ViVmVjdG9ycyhhLGcpO3ZhciBFPW1mLmRvdChJaSksRj1uZi5kb3QoSWkpO2lmKDA8PUUmJkY8PUUpcmV0dXJuIGMuY29weShnKTt2YXIgST12KkYtRSp6O2lmKDA+PUkmJjA8PXYmJjA+PUUpcmV0dXJuIGc9di8odi1FKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKG1mLGcpO0ppLnN1YlZlY3RvcnMoYSx0KTthPW1mLmRvdChKaSk7dmFyIE09bmYuZG90KEppKTtpZigwPD1NJiZhPD1NKXJldHVybiBjLmNvcHkodCk7dj1hKnotCnYqTTtpZigwPj12JiYwPD16JiYwPj1NKXJldHVybiBJPXovKHotTSksYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihuZixJKTt6PUUqTS1hKkY7aWYoMD49eiYmMDw9Ri1FJiYwPD1hLU0pcmV0dXJuIHJrLnN1YlZlY3RvcnModCxnKSxJPShGLUUpLyhGLUUrKGEtTSkpLGMuY29weShnKS5hZGRTY2FsZWRWZWN0b3IocmssSSk7dD0xLyh6K3YrSSk7Zz12KnQ7SSo9dDtyZXR1cm4gYy5jb3B5KGUpLmFkZFNjYWxlZFZlY3RvcihtZixnKS5hZGRTY2FsZWRWZWN0b3IobmYsSSl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5hLmVxdWFscyh0aGlzLmEpJiZhLmIuZXF1YWxzKHRoaXMuYikmJmEuYy5lcXVhbHModGhpcy5jKX19KTt2YXIgWm09e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsCmJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSwKZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LApsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsCm1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNiwKcmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxvYz17aDowLApzOjAsbDowfSxwaD17aDowLHM6MCxsOjB9O09iamVjdC5hc3NpZ24oSC5wcm90b3R5cGUse2lzQ29sb3I6ITAscjoxLGc6MSxiOjEsc2V0OmZ1bmN0aW9uKGEpe2EmJmEuaXNDb2xvcj90aGlzLmNvcHkoYSk6Im51bWJlciI9PT10eXBlb2YgYT90aGlzLnNldEhleChhKToic3RyaW5nIj09PXR5cGVvZiBhJiZ0aGlzLnNldFN0eWxlKGEpO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5iPXRoaXMuZz10aGlzLnI9YTtyZXR1cm4gdGhpc30sc2V0SGV4OmZ1bmN0aW9uKGEpe2E9TWF0aC5mbG9vcihhKTt0aGlzLnI9KGE+PjE2JjI1NSkvMjU1O3RoaXMuZz0oYT4+OCYyNTUpLzI1NTt0aGlzLmI9KGEmMjU1KS8yNTU7cmV0dXJuIHRoaXN9LHNldFJHQjpmdW5jdGlvbihhLGMsZSl7dGhpcy5yPWE7dGhpcy5nPWM7dGhpcy5iPWU7cmV0dXJuIHRoaXN9LHNldEhTTDpmdW5jdGlvbihhLGMsZSl7YT1oYi5ldWNsaWRlYW5Nb2R1bG8oYSwxKTtjPWhiLmNsYW1wKGMsMCwKMSk7ZT1oYi5jbGFtcChlLDAsMSk7MD09PWM/dGhpcy5yPXRoaXMuZz10aGlzLmI9ZTooYz0uNT49ZT9lKigxK2MpOmUrYy1lKmMsZT0yKmUtYyx0aGlzLnI9SyhlLGMsYSsxLzMpLHRoaXMuZz1LKGUsYyxhKSx0aGlzLmI9SyhlLGMsYS0xLzMpKTtyZXR1cm4gdGhpc30sc2V0U3R5bGU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyh6KXt2b2lkIDAhPT16JiYxPnBhcnNlRmxvYXQoeikmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK2ErIiB3aWxsIGJlIGlnbm9yZWQuIil9dmFyIGU7aWYoZT0vXigoPzpyZ2J8aHNsKWE/KVwoXHMqKFteXCldKilcKS8uZXhlYyhhKSl7dmFyIGc9ZVsyXTtzd2l0Y2goZVsxXSl7Y2FzZSAicmdiIjpjYXNlICJyZ2JhIjppZihlPS9eKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbMV0sCjEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KGVbM10sMTApKS8yNTUsYyhlWzVdKSx0aGlzO2lmKGU9L14oXGQrKSVccyosXHMqKFxkKyklXHMqLFxzKihcZCspJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludChlWzNdLDEwKSkvMTAwLGMoZVs1XSksdGhpczticmVhaztjYXNlICJoc2wiOmNhc2UgImhzbGEiOmlmKGU9L14oWzAtOV0qXC4/WzAtOV0rKVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSl7Zz1wYXJzZUZsb2F0KGVbMV0pLzM2MDt2YXIgdD1wYXJzZUludChlWzJdLAoxMCkvMTAwLHY9cGFyc2VJbnQoZVszXSwxMCkvMTAwO2MoZVs1XSk7cmV0dXJuIHRoaXMuc2V0SFNMKGcsdCx2KX19fWVsc2UgaWYoZT0vXiMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoYSkpe2U9ZVsxXTtnPWUubGVuZ3RoO2lmKDM9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMSkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMiksMTYpLzI1NSx0aGlzO2lmKDY9PT1nKXJldHVybiB0aGlzLnI9cGFyc2VJbnQoZS5jaGFyQXQoMCkrZS5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQoZS5jaGFyQXQoMikrZS5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQoZS5jaGFyQXQoNCkrZS5jaGFyQXQoNSksMTYpLzI1NSx0aGlzfWEmJjA8YS5sZW5ndGgmJihlPVptW2FdLHZvaWQgMCE9PWU/dGhpcy5zZXRIZXgoZSk6CmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIithKSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnI9YS5yO3RoaXMuZz1hLmc7dGhpcy5iPWEuYjtyZXR1cm4gdGhpc30sY29weUdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29weUxpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0yKTtjPTA8Yz8xL2M6MTt0aGlzLnI9TWF0aC5wb3coYS5yLGMpO3RoaXMuZz1NYXRoLnBvdyhhLmcsYyk7dGhpcy5iPU1hdGgucG93KGEuYixjKTtyZXR1cm4gdGhpc30sY29udmVydEdhbW1hVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5R2FtbWFUb0xpbmVhcih0aGlzLAphKTtyZXR1cm4gdGhpc30sY29udmVydExpbmVhclRvR2FtbWE6ZnVuY3Rpb24oYSl7dGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLGEpO3JldHVybiB0aGlzfSxjb3B5U1JHQlRvTGluZWFyOmZ1bmN0aW9uKGEpe3RoaXMucj1MKGEucik7dGhpcy5nPUwoYS5nKTt0aGlzLmI9TChhLmIpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9TUkdCOmZ1bmN0aW9uKGEpe3RoaXMucj1KKGEucik7dGhpcy5nPUooYS5nKTt0aGlzLmI9SihhLmIpO3JldHVybiB0aGlzfSxjb252ZXJ0U1JHQlRvTGluZWFyOmZ1bmN0aW9uKCl7dGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9TUkdCOmZ1bmN0aW9uKCl7dGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpO3JldHVybiB0aGlzfSxnZXRIZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfSxnZXRIZXhTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4oIjAwMDAwMCIrCnRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9LGdldEhTTDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPXtoOjAsczowLGw6MH0pO3ZhciBjPXRoaXMucixlPXRoaXMuZyxnPXRoaXMuYix0PU1hdGgubWF4KGMsZSxnKSx2PU1hdGgubWluKGMsZSxnKSx6LEU9KHYrdCkvMjtpZih2PT09dCl2PXo9MDtlbHNle3ZhciBGPXQtdjt2PS41Pj1FP0YvKHQrdik6Ri8oMi10LXYpO3N3aXRjaCh0KXtjYXNlIGM6ej0oZS1nKS9GKyhlPGc/NjowKTticmVhaztjYXNlIGU6ej0oZy1jKS9GKzI7YnJlYWs7Y2FzZSBnOno9KGMtZSkvRis0fXovPTZ9YS5oPXo7YS5zPXY7YS5sPUU7cmV0dXJuIGF9LGdldFN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifSxvZmZzZXRIU0w6ZnVuY3Rpb24oYSwKYyxlKXt0aGlzLmdldEhTTChvYyk7b2MuaCs9YTtvYy5zKz1jO29jLmwrPWU7dGhpcy5zZXRIU0wob2MuaCxvYy5zLG9jLmwpO3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hLnI7dGhpcy5nKz1hLmc7dGhpcy5iKz1hLmI7cmV0dXJuIHRoaXN9LGFkZENvbG9yczpmdW5jdGlvbihhLGMpe3RoaXMucj1hLnIrYy5yO3RoaXMuZz1hLmcrYy5nO3RoaXMuYj1hLmIrYy5iO3JldHVybiB0aGlzfSxhZGRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKz1hO3RoaXMuZys9YTt0aGlzLmIrPWE7cmV0dXJuIHRoaXN9LHN1YjpmdW5jdGlvbihhKXt0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItYS5yKTt0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctYS5nKTt0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItYS5iKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSl7dGhpcy5yKj1hLnI7dGhpcy5nKj1hLmc7dGhpcy5iKj1hLmI7cmV0dXJuIHRoaXN9LG11bHRpcGx5U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMucio9CmE7dGhpcy5nKj1hO3RoaXMuYio9YTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe3RoaXMucis9KGEuci10aGlzLnIpKmM7dGhpcy5nKz0oYS5nLXRoaXMuZykqYzt0aGlzLmIrPShhLmItdGhpcy5iKSpjO3JldHVybiB0aGlzfSxsZXJwSFNMOmZ1bmN0aW9uKGEsYyl7dGhpcy5nZXRIU0wob2MpO2EuZ2V0SFNMKHBoKTthPWhiLmxlcnAob2MuaCxwaC5oLGMpO3ZhciBlPWhiLmxlcnAob2MucyxwaC5zLGMpO2M9aGIubGVycChvYy5sLHBoLmwsYyk7dGhpcy5zZXRIU0woYSxlLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucj09PXRoaXMuciYmYS5nPT09dGhpcy5nJiZhLmI9PT10aGlzLmJ9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMucj1hW2NdO3RoaXMuZz1hW2MrMV07dGhpcy5iPWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT0KYyYmKGM9MCk7YVtjXT10aGlzLnI7YVtjKzFdPXRoaXMuZzthW2MrMl09dGhpcy5iO3JldHVybiBhfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19KTtPYmplY3QuYXNzaWduKE8ucHJvdG90eXBlLHtjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmE9YS5hO3RoaXMuYj1hLmI7dGhpcy5jPWEuYzt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXRlcmlhbEluZGV4PWEubWF0ZXJpYWxJbmRleDtmb3IodmFyIGM9MCxlPWEudmVydGV4Tm9ybWFscy5sZW5ndGg7YzxlO2MrKyl0aGlzLnZlcnRleE5vcm1hbHNbY109YS52ZXJ0ZXhOb3JtYWxzW2NdLmNsb25lKCk7Yz0wO2ZvcihlPWEudmVydGV4Q29sb3JzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Q29sb3JzW2NdPWEudmVydGV4Q29sb3JzW2NdLmNsb25lKCk7CnJldHVybiB0aGlzfX0pO3ZhciBqbD0wO1MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlMsaXNNYXRlcmlhbDohMCxvbkJlZm9yZUNvbXBpbGU6ZnVuY3Rpb24oKXt9LHNldFZhbHVlczpmdW5jdGlvbihhKXtpZih2b2lkIDAhPT1hKWZvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKHZvaWQgMD09PWUpY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogJyIrYysiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2Vsc2UgaWYoInNoYWRpbmciPT09Yyljb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1lPyEwOiExO2Vsc2V7dmFyIGc9dGhpc1tjXTt2b2lkIDA9PT1nP2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrYysiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpOgpnJiZnLmlzQ29sb3I/Zy5zZXQoZSk6ZyYmZy5pc1ZlY3RvcjMmJmUmJmUuaXNWZWN0b3IzP2cuY29weShlKTp0aGlzW2NdPWV9fX0sdG9KU09OOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGModCl7dmFyIHY9W10sejtmb3IoeiBpbiB0KXt2YXIgRT10W3pdO2RlbGV0ZSBFLm1ldGFkYXRhO3YucHVzaChFKX1yZXR1cm4gdn12YXIgZT12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2UmJihhPXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTt2YXIgZz17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtnLnV1aWQ9dGhpcy51dWlkO2cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihnLm5hbWU9dGhpcy5uYW1lKTt0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihnLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpOwp2b2lkIDAhPT10aGlzLm1ldGFsbmVzcyYmKGcubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKTt0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihnLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYoZy5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KTt0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihnLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpO3ZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpO3ZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiYKdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKGcubWFwPXRoaXMubWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYoZy5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYoZy5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKGcubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihnLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKGEpLnV1aWQsCmcuYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSk7dGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYoZy5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04oYSkudXVpZCxnLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSk7dGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKGcubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTihhKS51dWlkLGcubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsZy5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSk7dGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKGcuZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTihhKS51dWlkLGcuZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxnLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKTt0aGlzLnJvdWdobmVzc01hcCYmCnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKGcucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYoZy5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKGcuc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbnZNYXAmJnRoaXMuZW52TWFwLmlzVGV4dHVyZSYmKGcuZW52TWFwPXRoaXMuZW52TWFwLnRvSlNPTihhKS51dWlkLGcucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5LGcucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvLAp2b2lkIDAhPT10aGlzLmNvbWJpbmUmJihnLmNvbWJpbmU9dGhpcy5jb21iaW5lKSx2b2lkIDAhPT10aGlzLmVudk1hcEludGVuc2l0eSYmKGcuZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSk7dGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihnLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKGEpLnV1aWQpO3ZvaWQgMCE9PXRoaXMuc2l6ZSYmKGcuc2l6ZT10aGlzLnNpemUpO3ZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pOzEhPT10aGlzLmJsZW5kaW5nJiYoZy5ibGVuZGluZz10aGlzLmJsZW5kaW5nKTshMD09PXRoaXMuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPXRoaXMuZmxhdFNoYWRpbmcpOzAhPT10aGlzLnNpZGUmJihnLnNpZGU9dGhpcy5zaWRlKTswIT09dGhpcy52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz0KdGhpcy52ZXJ0ZXhDb2xvcnMpOzE+dGhpcy5vcGFjaXR5JiYoZy5vcGFjaXR5PXRoaXMub3BhY2l0eSk7ITA9PT10aGlzLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD10aGlzLnRyYW5zcGFyZW50KTtnLmRlcHRoRnVuYz10aGlzLmRlcHRoRnVuYztnLmRlcHRoVGVzdD10aGlzLmRlcHRoVGVzdDtnLmRlcHRoV3JpdGU9dGhpcy5kZXB0aFdyaXRlO2cuc3RlbmNpbFdyaXRlPXRoaXMuc3RlbmNpbFdyaXRlO2cuc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYztnLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmO2cuc3RlbmNpbE1hc2s9dGhpcy5zdGVuY2lsTWFzaztnLnN0ZW5jaWxGYWlsPXRoaXMuc3RlbmNpbEZhaWw7Zy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsWkZhaWw7Zy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWlBhc3M7dGhpcy5yb3RhdGlvbiYmMCE9PXRoaXMucm90YXRpb24mJihnLnJvdGF0aW9uPXRoaXMucm90YXRpb24pOyEwPT09dGhpcy5wb2x5Z29uT2Zmc2V0JiYKKGcucG9seWdvbk9mZnNldD0hMCk7MCE9PXRoaXMucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpOzAhPT10aGlzLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKTt0aGlzLmxpbmV3aWR0aCYmMSE9PXRoaXMubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpO3ZvaWQgMCE9PXRoaXMuZGFzaFNpemUmJihnLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpO3ZvaWQgMCE9PXRoaXMuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT10aGlzLmdhcFNpemUpO3ZvaWQgMCE9PXRoaXMuc2NhbGUmJihnLnNjYWxlPXRoaXMuc2NhbGUpOyEwPT09dGhpcy5kaXRoZXJpbmcmJihnLmRpdGhlcmluZz0hMCk7MDx0aGlzLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KTshMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYoZy5wcmVtdWx0aXBsaWVkQWxwaGE9CnRoaXMucHJlbXVsdGlwbGllZEFscGhhKTshMD09PXRoaXMud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9dGhpcy53aXJlZnJhbWUpOzE8dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgmJihnLndpcmVmcmFtZUxpbmV3aWR0aD10aGlzLndpcmVmcmFtZUxpbmV3aWR0aCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWNhcCYmKGcud2lyZWZyYW1lTGluZWNhcD10aGlzLndpcmVmcmFtZUxpbmVjYXApOyJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVqb2luKTshMD09PXRoaXMubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9ITApOyEwPT09dGhpcy5tb3JwaE5vcm1hbHMmJihnLm1vcnBoTm9ybWFscz0hMCk7ITA9PT10aGlzLnNraW5uaW5nJiYoZy5za2lubmluZz0hMCk7ITE9PT10aGlzLnZpc2libGUmJihnLnZpc2libGU9ITEpOyExPT09dGhpcy50b25lTWFwcGVkJiYoZy50b25lTWFwcGVkPSExKTsKInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoZy51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtlJiYoZT1jKGEudGV4dHVyZXMpLGE9YyhhLmltYWdlcyksMDxlLmxlbmd0aCYmKGcudGV4dHVyZXM9ZSksMDxhLmxlbmd0aCYmKGcuaW1hZ2VzPWEpKTtyZXR1cm4gZ30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmZvZz1hLmZvZzt0aGlzLmxpZ2h0cz1hLmxpZ2h0czt0aGlzLmJsZW5kaW5nPWEuYmxlbmRpbmc7dGhpcy5zaWRlPWEuc2lkZTt0aGlzLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmc7dGhpcy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnM7dGhpcy5vcGFjaXR5PWEub3BhY2l0eTt0aGlzLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQ7dGhpcy5ibGVuZFNyYz1hLmJsZW5kU3JjO3RoaXMuYmxlbmREc3Q9YS5ibGVuZERzdDt0aGlzLmJsZW5kRXF1YXRpb249CmEuYmxlbmRFcXVhdGlvbjt0aGlzLmJsZW5kU3JjQWxwaGE9YS5ibGVuZFNyY0FscGhhO3RoaXMuYmxlbmREc3RBbHBoYT1hLmJsZW5kRHN0QWxwaGE7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9YS5ibGVuZEVxdWF0aW9uQWxwaGE7dGhpcy5kZXB0aEZ1bmM9YS5kZXB0aEZ1bmM7dGhpcy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3Q7dGhpcy5kZXB0aFdyaXRlPWEuZGVwdGhXcml0ZTt0aGlzLnN0ZW5jaWxXcml0ZT1hLnN0ZW5jaWxXcml0ZTt0aGlzLnN0ZW5jaWxGdW5jPWEuc3RlbmNpbEZ1bmM7dGhpcy5zdGVuY2lsUmVmPWEuc3RlbmNpbFJlZjt0aGlzLnN0ZW5jaWxNYXNrPWEuc3RlbmNpbE1hc2s7dGhpcy5zdGVuY2lsRmFpbD1hLnN0ZW5jaWxGYWlsO3RoaXMuc3RlbmNpbFpGYWlsPWEuc3RlbmNpbFpGYWlsO3RoaXMuc3RlbmNpbFpQYXNzPWEuc3RlbmNpbFpQYXNzO3RoaXMuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGU7dGhpcy5wcmVjaXNpb249YS5wcmVjaXNpb247dGhpcy5wb2x5Z29uT2Zmc2V0PQphLnBvbHlnb25PZmZzZXQ7dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcjt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz1hLnBvbHlnb25PZmZzZXRVbml0czt0aGlzLmRpdGhlcmluZz1hLmRpdGhlcmluZzt0aGlzLmFscGhhVGVzdD1hLmFscGhhVGVzdDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT1hLnByZW11bHRpcGxpZWRBbHBoYTt0aGlzLnZpc2libGU9YS52aXNpYmxlO3RoaXMudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQ7dGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEudXNlckRhdGEpKTt0aGlzLmNsaXBTaGFkb3dzPWEuY2xpcFNoYWRvd3M7dGhpcy5jbGlwSW50ZXJzZWN0aW9uPWEuY2xpcEludGVyc2VjdGlvbjt2YXIgYz1hLmNsaXBwaW5nUGxhbmVzLGU9bnVsbDtpZihudWxsIT09Yyl7dmFyIGc9Yy5sZW5ndGg7ZT1BcnJheShnKTtmb3IodmFyIHQ9MDt0IT09ZzsrK3QpZVt0XT1jW3RdLmNsb25lKCl9dGhpcy5jbGlwcGluZ1BsYW5lcz0KZTt0aGlzLnNoYWRvd1NpZGU9YS5zaGFkb3dTaWRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO04ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO04ucHJvdG90eXBlLmNvbnN0cnVjdG9yPU47Ti5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMDtOLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDsKdGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7cmV0dXJuIHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFIucHJvdG90eXBlLHtpc0J1ZmZlckF0dHJpYnV0ZTohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLml0ZW1TaXplOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubmFtZT1hLm5hbWU7dGhpcy5hcnJheT1uZXcgYS5hcnJheS5jb25zdHJ1Y3RvcihhLmFycmF5KTt0aGlzLml0ZW1TaXplPWEuaXRlbVNpemU7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMubm9ybWFsaXplZD1hLm5vcm1hbGl6ZWQ7dGhpcy5keW5hbWljPWEuZHluYW1pYztyZXR1cm4gdGhpc30sY29weUF0OmZ1bmN0aW9uKGEsYyxlKXthKj10aGlzLml0ZW1TaXplO2UqPWMuaXRlbVNpemU7Zm9yKHZhciBnPTAsdD10aGlzLml0ZW1TaXplO2c8dDtnKyspdGhpcy5hcnJheVthK2ddPWMuYXJyYXlbZStnXTtyZXR1cm4gdGhpc30sY29weUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXkuc2V0KGEpO3JldHVybiB0aGlzfSxjb3B5Q29sb3JzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPQp0aGlzLmFycmF5LGU9MCxnPTAsdD1hLmxlbmd0aDtnPHQ7ZysrKXt2YXIgdj1hW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBIKTtjW2UrK109di5yO2NbZSsrXT12Lmc7Y1tlKytdPXYuYn1yZXR1cm4gdGhpc30sY29weVZlY3RvcjJzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGYpO2NbZSsrXT12Lng7Y1tlKytdPXYueX1yZXR1cm4gdGhpc30sY29weVZlY3RvcjNzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PQphW2ddO3ZvaWQgMD09PXYmJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixnKSx2PW5ldyBrKTtjW2UrK109di54O2NbZSsrXT12Lnk7Y1tlKytdPXYuen1yZXR1cm4gdGhpc30sY29weVZlY3RvcjRzQXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYXJyYXksZT0wLGc9MCx0PWEubGVuZ3RoO2c8dDtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IHApO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56O2NbZSsrXT12Lnd9cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSoKdGhpcy5pdGVtU2l6ZV19LHNldFg6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZV09YztyZXR1cm4gdGhpc30sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMV19LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXT1jO3JldHVybiB0aGlzfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsyXX0sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdPWM7cmV0dXJuIHRoaXN9LGdldFc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzNdfSxzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM109YztyZXR1cm4gdGhpc30sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKwoxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSxjLGUsZyl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHQpe2EqPXRoaXMuaXRlbVNpemU7dGhpcy5hcnJheVthKzBdPWM7dGhpcy5hcnJheVthKzFdPWU7dGhpcy5hcnJheVthKzJdPWc7dGhpcy5hcnJheVthKzNdPXQ7cmV0dXJuIHRoaXN9LG9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KSwKbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX0pO1gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO1gucHJvdG90eXBlLmNvbnN0cnVjdG9yPVg7YWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2FhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hYTtmYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7ZmEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZhO29hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtvYS5wcm90b3R5cGUuY29uc3RydWN0b3I9b2E7Wi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7Wi5wcm90b3R5cGUuY29uc3RydWN0b3I9WjtjYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7Y2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNhO2phLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtqYS5wcm90b3R5cGUuY29uc3RydWN0b3I9amE7CmJhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7a2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2thLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rYTtPYmplY3QuYXNzaWduKFcucHJvdG90eXBlLHtjb21wdXRlR3JvdXBzOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGU9dm9pZCAwO2E9YS5mYWNlcztmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIHQ9YVtnXTtpZih0Lm1hdGVyaWFsSW5kZXghPT1lKXtlPXQubWF0ZXJpYWxJbmRleDt2b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3ZhciB2PXtzdGFydDozKmcsbWF0ZXJpYWxJbmRleDplfX19dm9pZCAwIT09diYmKHYuY291bnQ9MypnLXYuc3RhcnQsYy5wdXNoKHYpKTt0aGlzLmdyb3Vwcz1jfSxmcm9tR2VvbWV0cnk6ZnVuY3Rpb24oYSl7dmFyIGM9YS5mYWNlcyxlPWEudmVydGljZXMsZz1hLmZhY2VWZXJ0ZXhVdnMsCnQ9Z1swXSYmMDxnWzBdLmxlbmd0aCx2PWdbMV0mJjA8Z1sxXS5sZW5ndGgsej1hLm1vcnBoVGFyZ2V0cyxFPXoubGVuZ3RoO2lmKDA8RSl7dmFyIEY9W107Zm9yKHZhciBJPTA7STxFO0krKylGW0ldPXtuYW1lOnpbSV0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5wb3NpdGlvbj1GfXZhciBNPWEubW9ycGhOb3JtYWxzLFA9TS5sZW5ndGg7aWYoMDxQKXt2YXIgUT1bXTtmb3IoST0wO0k8UDtJKyspUVtJXT17bmFtZTpNW0ldLm5hbWUsZGF0YTpbXX07dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsPVF9dmFyIFU9YS5za2luSW5kaWNlcyxWPWEuc2tpbldlaWdodHMsZWE9VS5sZW5ndGg9PT1lLmxlbmd0aCxkYT1WLmxlbmd0aD09PWUubGVuZ3RoOzA8ZS5sZW5ndGgmJjA9PT1jLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuRGlyZWN0R2VvbWV0cnk6IEZhY2VsZXNzIGdlb21ldHJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7Zm9yKEk9MDtJPGMubGVuZ3RoO0krKyl7dmFyIHJhPQpjW0ldO3RoaXMudmVydGljZXMucHVzaChlW3JhLmFdLGVbcmEuYl0sZVtyYS5jXSk7dmFyIHBhPXJhLnZlcnRleE5vcm1hbHM7Mz09PXBhLmxlbmd0aD90aGlzLm5vcm1hbHMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLm5vcm1hbCx0aGlzLm5vcm1hbHMucHVzaChwYSxwYSxwYSkpO3BhPXJhLnZlcnRleENvbG9yczszPT09cGEubGVuZ3RoP3RoaXMuY29sb3JzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihwYT1yYS5jb2xvcix0aGlzLmNvbG9ycy5wdXNoKHBhLHBhLHBhKSk7ITA9PT10JiYocGE9Z1swXVtJXSx2b2lkIDAhPT1wYT90aGlzLnV2cy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICIsSSksdGhpcy51dnMucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTshMD09PXYmJihwYT1nWzFdW0ldLHZvaWQgMCE9PXBhP3RoaXMudXZzMi5wdXNoKHBhWzBdLApwYVsxXSxwYVsyXSk6KGNvbnNvbGUud2FybigiVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdjIgIixJKSx0aGlzLnV2czIucHVzaChuZXcgZixuZXcgZixuZXcgZikpKTtmb3IocGE9MDtwYTxFO3BhKyspe3ZhciBxYT16W3BhXS52ZXJ0aWNlcztGW3BhXS5kYXRhLnB1c2gocWFbcmEuYV0scWFbcmEuYl0scWFbcmEuY10pfWZvcihwYT0wO3BhPFA7cGErKylxYT1NW3BhXS52ZXJ0ZXhOb3JtYWxzW0ldLFFbcGFdLmRhdGEucHVzaChxYS5hLHFhLmIscWEuYyk7ZWEmJnRoaXMuc2tpbkluZGljZXMucHVzaChVW3JhLmFdLFVbcmEuYl0sVVtyYS5jXSk7ZGEmJnRoaXMuc2tpbldlaWdodHMucHVzaChWW3JhLmFdLFZbcmEuYl0sVltyYS5jXSl9dGhpcy5jb21wdXRlR3JvdXBzKGEpO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMuZ3JvdXBzTmVlZFVwZGF0ZT1hLmdyb3Vwc05lZWRVcGRhdGU7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9fSk7dmFyIGtsPTEsWmM9bmV3IHEsS2k9bmV3IEEscWg9bmV3IGssaWU9bmV3IHgsTGk9bmV3IHgsTGM9bmV3IGs7dmEucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZhLGlzQnVmZmVyR2VvbWV0cnk6ITAsZ2V0SW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbmRleH0sc2V0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5pbmRleD1BcnJheS5pc0FycmF5KGEpPwpuZXcgKDY1NTM1PEVhKGEpP2phOlopKGEsMSk6YX0sYWRkQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtpZighKGMmJmMuaXNCdWZmZXJBdHRyaWJ1dGV8fGMmJmMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuYWRkQXR0cmlidXRlKGEsbmV3IFIoYyxlKSk7aWYoImluZGV4Ij09PWEpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGMpLHRoaXM7dGhpcy5hdHRyaWJ1dGVzW2FdPWM7cmV0dXJuIHRoaXN9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2FdfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1thXTsKcmV0dXJuIHRoaXN9LGFkZEdyb3VwOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDphLGNvdW50OmMsbWF0ZXJpYWxJbmRleDp2b2lkIDAhPT1lP2U6MH0pfSxjbGVhckdyb3VwczpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPVtdfSxzZXREcmF3UmFuZ2U6ZnVuY3Rpb24oYSxjKXt0aGlzLmRyYXdSYW5nZS5zdGFydD1hO3RoaXMuZHJhd1JhbmdlLmNvdW50PWN9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1jJiYoYS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGMpLGMubmVlZHNVcGRhdGU9ITApO3ZhciBlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7dm9pZCAwIT09ZSYmKGM9KG5ldyByKS5nZXROb3JtYWxNYXRyaXgoYSksYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO2U9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7dm9pZCAwIT09ZSYmKGM9KG5ldyByKS5nZXROb3JtYWxNYXRyaXgoYSksCmMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShlKSxlLm5lZWRzVXBkYXRlPSEwKTtudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtaYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoWmMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpe1pjLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeChaYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7WmMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KFpjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXtaYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWmMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7WmMubWFrZVNjYWxlKGEsCmMsZSk7dGhpcy5hcHBseU1hdHJpeChaYyk7cmV0dXJuIHRoaXN9LGxvb2tBdDpmdW5jdGlvbihhKXtLaS5sb29rQXQoYSk7S2kudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChLaS5tYXRyaXgpO3JldHVybiB0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO3RoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKHFoKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShxaC54LHFoLnkscWgueik7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtpZihhLmlzUG9pbnRzfHxhLmlzTGluZSl7YT1uZXcgYmEoMypjLnZlcnRpY2VzLmxlbmd0aCwzKTt2YXIgZT1uZXcgYmEoMypjLmNvbG9ycy5sZW5ndGgsMyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixhLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLGUuY29weUNvbG9yc0FycmF5KGMuY29sb3JzKSk7CmMubGluZURpc3RhbmNlcyYmYy5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWMudmVydGljZXMubGVuZ3RoJiYoYT1uZXcgYmEoYy5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixhLmNvcHlBcnJheShjLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWMuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBhLmlzTWVzaCYmYyYmYy5pc0dlb21ldHJ5JiZ0aGlzLmZyb21HZW9tZXRyeShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9YVtlXTtjLnB1c2godC54LHQueSx0Lnp8fDApfXRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGJhKGMsMykpOwpyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNNZXNoKXt2YXIgZT1jLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1jLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGU9dm9pZCAwLGMuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1lKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShjKTtlLnZlcnRpY2VzTmVlZFVwZGF0ZT1jLnZlcnRpY2VzTmVlZFVwZGF0ZTtlLm5vcm1hbHNOZWVkVXBkYXRlPWMubm9ybWFsc05lZWRVcGRhdGU7ZS5jb2xvcnNOZWVkVXBkYXRlPWMuY29sb3JzTmVlZFVwZGF0ZTtlLnV2c05lZWRVcGRhdGU9Yy51dnNOZWVkVXBkYXRlO2UuZ3JvdXBzTmVlZFVwZGF0ZT1jLmdyb3Vwc05lZWRVcGRhdGU7Yy52ZXJ0aWNlc05lZWRVcGRhdGU9ITE7Yy5ub3JtYWxzTmVlZFVwZGF0ZT0hMTtjLmNvbG9yc05lZWRVcGRhdGU9ITE7Yy51dnNOZWVkVXBkYXRlPSExO2MuZ3JvdXBzTmVlZFVwZGF0ZT0hMTsKYz1lfSEwPT09Yy52ZXJ0aWNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yM3NBcnJheShjLnZlcnRpY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLm5vcm1hbHNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMubm9ybWFscyksZS5uZWVkc1VwZGF0ZT0hMCksYy5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1jLmNvbG9yc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5jb2xvcix2b2lkIDAhPT1lJiYoZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpLGUubmVlZHNVcGRhdGU9ITApLGMuY29sb3JzTmVlZFVwZGF0ZT0hMSk7Yy51dnNOZWVkVXBkYXRlJiYoZT10aGlzLmF0dHJpYnV0ZXMudXYsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjJzQXJyYXkoYy51dnMpLGUubmVlZHNVcGRhdGU9CiEwKSxjLnV2c05lZWRVcGRhdGU9ITEpO2MubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09ZSYmKGUuY29weUFycmF5KGMubGluZURpc3RhbmNlcyksZS5uZWVkc1VwZGF0ZT0hMCksYy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7Yy5ncm91cHNOZWVkVXBkYXRlJiYoYy5jb21wdXRlR3JvdXBzKGEuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWMuZ3JvdXBzLGMuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXthLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyBXKS5mcm9tR2VvbWV0cnkoYSk7cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KGEuX19kaXJlY3RHZW9tZXRyeSl9LGZyb21EaXJlY3RHZW9tZXRyeTpmdW5jdGlvbihhKXt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLChuZXcgUihuZXcgRmxvYXQzMkFycmF5KDMqYS52ZXJ0aWNlcy5sZW5ndGgpLAozKSkuY29weVZlY3RvcjNzQXJyYXkoYS52ZXJ0aWNlcykpOzA8YS5ub3JtYWxzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyphLm5vcm1hbHMubGVuZ3RoKSwzKSkuY29weVZlY3RvcjNzQXJyYXkoYS5ub3JtYWxzKSk7MDxhLmNvbG9ycy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMyphLmNvbG9ycy5sZW5ndGgpLDMpKS5jb3B5Q29sb3JzQXJyYXkoYS5jb2xvcnMpKTswPGEudXZzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzKSk7MDxhLnV2czIubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYyIiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmEudXZzMi5sZW5ndGgpLDIpKS5jb3B5VmVjdG9yMnNBcnJheShhLnV2czIpKTsKdGhpcy5ncm91cHM9YS5ncm91cHM7Zm9yKHZhciBjIGluIGEubW9ycGhUYXJnZXRzKXtmb3IodmFyIGU9W10sZz1hLm1vcnBoVGFyZ2V0c1tjXSx0PTAsdj1nLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1nW3RdLEU9bmV3IGJhKDMqei5kYXRhLmxlbmd0aCwzKTtFLm5hbWU9ei5uYW1lO2UucHVzaChFLmNvcHlWZWN0b3Izc0FycmF5KHouZGF0YSkpfXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPWV9MDxhLnNraW5JbmRpY2VzLmxlbmd0aCYmKGM9bmV3IGJhKDQqYS5za2luSW5kaWNlcy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5JbmRleCIsYy5jb3B5VmVjdG9yNHNBcnJheShhLnNraW5JbmRpY2VzKSkpOzA8YS5za2luV2VpZ2h0cy5sZW5ndGgmJihjPW5ldyBiYSg0KmEuc2tpbldlaWdodHMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luV2VpZ2h0IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbldlaWdodHMpKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJgoodGhpcy5ib3VuZGluZ1NwaGVyZT1hLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpO251bGwhPT1hLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1hLmJvdW5kaW5nQm94LmNsb25lKCkpO3JldHVybiB0aGlzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHgpO3ZhciBhPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHZvaWQgMCE9PWEpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSxjKXthPTA7Zm9yKHZhciBlPWMubGVuZ3RoO2E8ZTthKyspaWUuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShjW2FdKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoaWUubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoaWUubWF4KX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwooaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoYSl7dmFyIGU9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWUuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKTtpZihjKWZvcih2YXIgZz0wLHQ9Yy5sZW5ndGg7Zzx0O2crKyl7dmFyIHY9CmNbZ107TGkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh2KTtpZS5leHBhbmRCeVBvaW50KExpLm1pbik7aWUuZXhwYW5kQnlQb2ludChMaS5tYXgpfWllLmdldENlbnRlcihlKTt2YXIgej0wO2c9MDtmb3IodD1hLmNvdW50O2c8dDtnKyspTGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGcpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKExjKSk7aWYoYylmb3IoZz0wLHQ9Yy5sZW5ndGg7Zzx0O2crKyl7dj1jW2ddO2E9MDtmb3IodmFyIEU9di5jb3VudDthPEU7YSsrKUxjLmZyb21CdWZmZXJBdHRyaWJ1dGUodixhKSx6PU1hdGgubWF4KHosZS5kaXN0YW5jZVRvU3F1YXJlZChMYykpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydCh6KTtpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLAp0aGlzKX19LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmluZGV4LGM9dGhpcy5hdHRyaWJ1dGVzO2lmKGMucG9zaXRpb24pe3ZhciBlPWMucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09Yy5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShlLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBnPWMubm9ybWFsLmFycmF5LHQ9MCx2PWcubGVuZ3RoO3Q8djt0KyspZ1t0XT0wO2c9Yy5ub3JtYWwuYXJyYXk7dmFyIHo9bmV3IGssRT1uZXcgayxGPW5ldyBrLEk9bmV3IGssTT1uZXcgaztpZihhKXt2YXIgUD1hLmFycmF5O3Q9MDtmb3Iodj1hLmNvdW50O3Q8djt0Kz0zKXthPTMqUFt0KzBdO3ZhciBRPTMqUFt0KzFdO3ZhciBVPTMqUFt0KzJdO3ouZnJvbUFycmF5KGUsYSk7RS5mcm9tQXJyYXkoZSxRKTtGLmZyb21BcnJheShlLFUpO0kuc3ViVmVjdG9ycyhGLApFKTtNLnN1YlZlY3RvcnMoeixFKTtJLmNyb3NzKE0pO2dbYV0rPUkueDtnW2ErMV0rPUkueTtnW2ErMl0rPUkuejtnW1FdKz1JLng7Z1tRKzFdKz1JLnk7Z1tRKzJdKz1JLno7Z1tVXSs9SS54O2dbVSsxXSs9SS55O2dbVSsyXSs9SS56fX1lbHNlIGZvcih0PTAsdj1lLmxlbmd0aDt0PHY7dCs9OSl6LmZyb21BcnJheShlLHQpLEUuZnJvbUFycmF5KGUsdCszKSxGLmZyb21BcnJheShlLHQrNiksSS5zdWJWZWN0b3JzKEYsRSksTS5zdWJWZWN0b3JzKHosRSksSS5jcm9zcyhNKSxnW3RdPUkueCxnW3QrMV09SS55LGdbdCsyXT1JLnosZ1t0KzNdPUkueCxnW3QrNF09SS55LGdbdCs1XT1JLnosZ1t0KzZdPUkueCxnW3QrN109SS55LGdbdCs4XT1JLno7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7Yy5ub3JtYWwubmVlZHNVcGRhdGU9ITB9fSxtZXJnZTpmdW5jdGlvbihhLGMpe2lmKGEmJmEuaXNCdWZmZXJHZW9tZXRyeSl7dm9pZCAwPT09YyYmKGM9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXRceDNkMC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTsKdmFyIGU9dGhpcy5hdHRyaWJ1dGVzLGc7Zm9yKGcgaW4gZSlpZih2b2lkIDAhPT1hLmF0dHJpYnV0ZXNbZ10pe3ZhciB0PWVbZ10uYXJyYXksdj1hLmF0dHJpYnV0ZXNbZ10sej12LmFycmF5LEU9di5pdGVtU2l6ZSpjO3Y9TWF0aC5taW4oei5sZW5ndGgsdC5sZW5ndGgtRSk7Zm9yKHZhciBGPTA7Rjx2O0YrKyxFKyspdFtFXT16W0ZdfXJldHVybiB0aGlzfWNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLGEpfSxub3JtYWxpemVOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsYz0wLGU9YS5jb3VudDtjPGU7YysrKUxjLng9YS5nZXRYKGMpLExjLnk9YS5nZXRZKGMpLExjLno9YS5nZXRaKGMpLExjLm5vcm1hbGl6ZSgpLGEuc2V0WFlaKGMsTGMueCxMYy55LExjLnopfSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKE0sClApe3ZhciBRPU0uYXJyYXk7TT1NLml0ZW1TaXplO2Zvcih2YXIgVT1uZXcgUS5jb25zdHJ1Y3RvcihQLmxlbmd0aCpNKSxWLGVhPTAsZGE9MCxyYT1QLmxlbmd0aDtkYTxyYTtkYSsrKXtWPVBbZGFdKk07Zm9yKHZhciBwYT0wO3BhPE07cGErKylVW2VhKytdPVFbVisrXX1yZXR1cm4gbmV3IFIoVSxNKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO3ZhciBjPW5ldyB2YSxlPXRoaXMuaW5kZXguYXJyYXksZz10aGlzLmF0dHJpYnV0ZXMsdDtmb3IodCBpbiBnKXt2YXIgdj1nW3RdO3Y9YSh2LGUpO2MuYWRkQXR0cmlidXRlKHQsdil9dmFyIHo9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKHQgaW4geil7dmFyIEU9W10sRj16W3RdO2c9MDtmb3IodmFyIEk9Ri5sZW5ndGg7ZzxJO2crKyl2PUZbZ10sdj1hKHYsZSksRS5wdXNoKHYpOwpjLm1vcnBoQXR0cmlidXRlc1t0XT1FfWU9dGhpcy5ncm91cHM7Zz0wO2Zvcih0PWUubGVuZ3RoO2c8dDtnKyspdj1lW2ddLGMuYWRkR3JvdXAodi5zdGFydCx2LmNvdW50LHYubWF0ZXJpYWxJbmRleCk7cmV0dXJuIGN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2EudXVpZD10aGlzLnV1aWQ7YS50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGEubmFtZT10aGlzLm5hbWUpOzA8T2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoJiYoYS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciBjPXRoaXMucGFyYW1ldGVycztmb3IoSSBpbiBjKXZvaWQgMCE9PWNbSV0mJihhW0ldPWNbSV0pO3JldHVybiBhfWEuZGF0YT17YXR0cmlidXRlczp7fX07Yz10aGlzLmluZGV4O251bGwhPT0KYyYmKGEuZGF0YS5pbmRleD17dHlwZTpjLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYy5hcnJheSl9KTt2YXIgZT10aGlzLmF0dHJpYnV0ZXM7Zm9yKEkgaW4gZSl7Yz1lW0ldO3ZhciBnPWMudG9KU09OKCk7IiIhPT1jLm5hbWUmJihnLm5hbWU9Yy5uYW1lKTthLmRhdGEuYXR0cmlidXRlc1tJXT1nfWU9e307dmFyIHQ9ITE7Zm9yKEkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdj10aGlzLm1vcnBoQXR0cmlidXRlc1tJXSx6PVtdLEU9MCxGPXYubGVuZ3RoO0U8RjtFKyspYz12W0VdLGc9Yy50b0pTT04oKSwiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpLHoucHVzaChnKTswPHoubGVuZ3RoJiYoZVtJXT16LHQ9ITApfXQmJihhLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWUpO3ZhciBJPXRoaXMuZ3JvdXBzOzA8SS5sZW5ndGgmJihhLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSSkpKTtJPQp0aGlzLmJvdW5kaW5nU3BoZXJlO251bGwhPT1JJiYoYS5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6SS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpJLnJhZGl1c30pO3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdmEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9YS5uYW1lO3ZhciBlPWEuaW5kZXg7bnVsbCE9PWUmJnRoaXMuc2V0SW5kZXgoZS5jbG9uZSgpKTtlPWEuYXR0cmlidXRlcztmb3IoeiBpbiBlKXRoaXMuYWRkQXR0cmlidXRlKHosZVt6XS5jbG9uZSgpKTt2YXIgZz1hLm1vcnBoQXR0cmlidXRlcztmb3IoeiBpbiBnKXt2YXIgdD1bXSx2PWdbel07ZT0wO2ZvcihjPXYubGVuZ3RoO2U8YztlKyspdC5wdXNoKHZbZV0uY2xvbmUoKSk7CnRoaXMubW9ycGhBdHRyaWJ1dGVzW3pdPXR9dmFyIHo9YS5ncm91cHM7ZT0wO2ZvcihjPXoubGVuZ3RoO2U8YztlKyspZz16W2VdLHRoaXMuYWRkR3JvdXAoZy5zdGFydCxnLmNvdW50LGcubWF0ZXJpYWxJbmRleCk7ej1hLmJvdW5kaW5nQm94O251bGwhPT16JiYodGhpcy5ib3VuZGluZ0JveD16LmNsb25lKCkpO3o9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09eiYmKHRoaXMuYm91bmRpbmdTcGhlcmU9ei5jbG9uZSgpKTt0aGlzLmRyYXdSYW5nZS5zdGFydD1hLmRyYXdSYW5nZS5zdGFydDt0aGlzLmRyYXdSYW5nZS5jb3VudD1hLmRyYXdSYW5nZS5jb3VudDt0aGlzLnVzZXJEYXRhPWEudXNlckRhdGE7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIHNrPW5ldyBxLGplPW5ldyBELE1pPW5ldyBHLE5kPW5ldyBrLE9kPW5ldyBrLFBkPW5ldyBrLGlqPW5ldyBrLGpqPW5ldyBrLGtqPW5ldyBrLE5oPQpuZXcgayxPaD1uZXcgayxQaD1uZXcgayxxZT1uZXcgZixyZT1uZXcgZixzZT1uZXcgZix1Zj1uZXcgayx2Zz1uZXcgazt5YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eWEsaXNNZXNoOiEwLHNldERyYXdNb2RlOmZ1bmN0aW9uKGEpe3RoaXMuZHJhd01vZGU9YX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRyYXdNb2RlPWEuZHJhd01vZGU7dm9pZCAwIT09YS5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sYS5tb3JwaFRhcmdldERpY3Rpb25hcnkpKTtyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksCmc9dGhpcy5tYXRlcmlhbCx0PXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09ZyYmKG51bGw9PT1lLmJvdW5kaW5nU3BoZXJlJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLE1pLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSksTWkuYXBwbHlNYXRyaXg0KHQpLCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShNaSkmJihzay5nZXRJbnZlcnNlKHQpLGplLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChzayksbnVsbD09PWUuYm91bmRpbmdCb3h8fCExIT09amUuaW50ZXJzZWN0c0JveChlLmJvdW5kaW5nQm94KSkpKWlmKGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDt0PWUuYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgej1lLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixFPWUuYXR0cmlidXRlcy51dixGPWUuYXR0cmlidXRlcy51djIsST1lLmdyb3VwcyxNPWUuZHJhd1JhbmdlLFAsUTtpZihudWxsIT09dilpZihBcnJheS5pc0FycmF5KGcpKXt2YXIgVT0wO2ZvcihQPUkubGVuZ3RoO1U8ClA7VSsrKXt2YXIgVj1JW1VdO3ZhciBlYT1nW1YubWF0ZXJpYWxJbmRleF07dmFyIGRhPU1hdGgubWF4KFYuc3RhcnQsTS5zdGFydCk7Zm9yKFE9ZT1NYXRoLm1pbihWLnN0YXJ0K1YuY291bnQsTS5zdGFydCtNLmNvdW50KTtkYTxRO2RhKz0zKXtlPXYuZ2V0WChkYSk7dmFyIHJhPXYuZ2V0WChkYSsxKTt2YXIgcGE9di5nZXRYKGRhKzIpO2lmKGU9RmEodGhpcyxlYSxhLGplLHQseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihkYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1WLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfX19ZWxzZSBmb3IoZGE9TWF0aC5tYXgoMCxNLnN0YXJ0KSxlPU1hdGgubWluKHYuY291bnQsTS5zdGFydCtNLmNvdW50KSxVPWRhLFA9ZTtVPFA7VSs9Myl7aWYoZT12LmdldFgoVSkscmE9di5nZXRYKFUrMSkscGE9di5nZXRYKFUrMiksZT1GYSh0aGlzLGcsYSxqZSx0LHosRSxGLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVS8zKSwKYy5wdXNoKGUpfWVsc2UgaWYodm9pZCAwIT09dClpZihBcnJheS5pc0FycmF5KGcpKWZvcihVPTAsUD1JLmxlbmd0aDtVPFA7VSsrKWZvcihWPUlbVV0sZWE9Z1tWLm1hdGVyaWFsSW5kZXhdLGRhPU1hdGgubWF4KFYuc3RhcnQsTS5zdGFydCksUT1lPU1hdGgubWluKFYuc3RhcnQrVi5jb3VudCxNLnN0YXJ0K00uY291bnQpO2RhPFE7ZGErPTMpe2lmKGU9ZGEscmE9ZGErMSxwYT1kYSsyLGU9RmEodGhpcyxlYSxhLGplLHQseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihkYS8zKSxlLmZhY2UubWF0ZXJpYWxJbmRleD1WLm1hdGVyaWFsSW5kZXgsYy5wdXNoKGUpfWVsc2UgZm9yKGRhPU1hdGgubWF4KDAsTS5zdGFydCksZT1NYXRoLm1pbih0LmNvdW50LE0uc3RhcnQrTS5jb3VudCksVT1kYSxQPWU7VTxQO1UrPTMpaWYoZT1VLHJhPVUrMSxwYT1VKzIsZT1GYSh0aGlzLGcsYSxqZSx0LHosRSxGLGUscmEscGEpKWUuZmFjZUluZGV4PU1hdGguZmxvb3IoVS8zKSxjLnB1c2goZSl9ZWxzZSBpZihlLmlzR2VvbWV0cnkpZm9yKHQ9CkFycmF5LmlzQXJyYXkoZyksej1lLnZlcnRpY2VzLEU9ZS5mYWNlcyxlPWUuZmFjZVZlcnRleFV2c1swXSwwPGUubGVuZ3RoJiYodj1lKSxVPTAsUD1FLmxlbmd0aDtVPFA7VSsrKWlmKFY9RVtVXSxlPXQ/Z1tWLm1hdGVyaWFsSW5kZXhdOmcsdm9pZCAwIT09ZSYmKEY9eltWLmFdLEk9eltWLmJdLE09eltWLmNdLGU9QWEodGhpcyxlLGEsamUsRixJLE0sdWYpKSl2JiZ2W1VdJiYoZWE9dltVXSxxZS5jb3B5KGVhWzBdKSxyZS5jb3B5KGVhWzFdKSxzZS5jb3B5KGVhWzJdKSxlLnV2PUIuZ2V0VVYodWYsRixJLE0scWUscmUsc2UsbmV3IGYpKSxlLmZhY2U9VixlLmZhY2VJbmRleD1VLGMucHVzaChlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgbGw9MCwkYz1uZXcgcSxOaT1uZXcgQSxyaD1uZXcgazt4YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnhhLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPShuZXcgcikuZ2V0Tm9ybWFsTWF0cml4KGEpLGU9MCxnPXRoaXMudmVydGljZXMubGVuZ3RoO2U8ZztlKyspdGhpcy52ZXJ0aWNlc1tlXS5hcHBseU1hdHJpeDQoYSk7ZT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe2E9dGhpcy5mYWNlc1tlXTthLm5vcm1hbC5hcHBseU1hdHJpeDMoYykubm9ybWFsaXplKCk7Zm9yKHZhciB0PTAsdj1hLnZlcnRleE5vcm1hbHMubGVuZ3RoO3Q8djt0KyspYS52ZXJ0ZXhOb3JtYWxzW3RdLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKX1udWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSEwO3JldHVybiB0aGlzfSwKcm90YXRlWDpmdW5jdGlvbihhKXskYy5tYWtlUm90YXRpb25YKGEpO3RoaXMuYXBwbHlNYXRyaXgoJGMpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGEpeyRjLm1ha2VSb3RhdGlvblkoYSk7dGhpcy5hcHBseU1hdHJpeCgkYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYSl7JGMubWFrZVJvdGF0aW9uWihhKTt0aGlzLmFwcGx5TWF0cml4KCRjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyxlKXskYy5tYWtlVHJhbnNsYXRpb24oYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoJGMpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhLGMsZSl7JGMubWFrZVNjYWxlKGEsYyxlKTt0aGlzLmFwcGx5TWF0cml4KCRjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe05pLmxvb2tBdChhKTtOaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KE5pLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKFUsClYsZWEsZGEpe3ZhciByYT12b2lkIDA9PT1FP1tdOltlLmNvbG9yc1tVXS5jbG9uZSgpLGUuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbZWFdLmNsb25lKCldLHBhPXZvaWQgMD09PXo/W106WyhuZXcgaykuZnJvbUFycmF5KHosMypVKSwobmV3IGspLmZyb21BcnJheSh6LDMqViksKG5ldyBrKS5mcm9tQXJyYXkoeiwzKmVhKV07ZGE9bmV3IE8oVSxWLGVhLHBhLHJhLGRhKTtlLmZhY2VzLnB1c2goZGEpO3ZvaWQgMCE9PUYmJmUuZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShGLDIqVSksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKlYpLChuZXcgZikuZnJvbUFycmF5KEYsMiplYSldKTt2b2lkIDAhPT1JJiZlLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBmKS5mcm9tQXJyYXkoSSwyKlUpLChuZXcgZikuZnJvbUFycmF5KEksMipWKSwobmV3IGYpLmZyb21BcnJheShJLDIqZWEpXSl9dmFyIGU9dGhpcyxnPW51bGwhPT1hLmluZGV4P2EuaW5kZXguYXJyYXk6CnZvaWQgMCx0PWEuYXR0cmlidXRlcyx2PXQucG9zaXRpb24uYXJyYXksej12b2lkIDAhPT10Lm5vcm1hbD90Lm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT10LmNvbG9yP3QuY29sb3IuYXJyYXk6dm9pZCAwLEY9dm9pZCAwIT09dC51dj90LnV2LmFycmF5OnZvaWQgMCxJPXZvaWQgMCE9PXQudXYyP3QudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1JJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3IodD0wO3Q8di5sZW5ndGg7dCs9MyllLnZlcnRpY2VzLnB1c2goKG5ldyBrKS5mcm9tQXJyYXkodix0KSksdm9pZCAwIT09RSYmZS5jb2xvcnMucHVzaCgobmV3IEgpLmZyb21BcnJheShFLHQpKTt2YXIgTT1hLmdyb3VwcztpZigwPE0ubGVuZ3RoKWZvcih0PTA7dDxNLmxlbmd0aDt0Kyspe3Y9TVt0XTt2YXIgUD12LnN0YXJ0LFE9UDtmb3IoUCs9di5jb3VudDtRPFA7USs9Myl2b2lkIDAhPT1nP2MoZ1tRXSxnW1ErMV0sZ1tRKzJdLHYubWF0ZXJpYWxJbmRleCk6YyhRLApRKzEsUSsyLHYubWF0ZXJpYWxJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT1nKWZvcih0PTA7dDxnLmxlbmd0aDt0Kz0zKWMoZ1t0XSxnW3QrMV0sZ1t0KzJdKTtlbHNlIGZvcih0PTA7dDx2Lmxlbmd0aC8zO3QrPTMpYyh0LHQrMSx0KzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIocmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKHJoLngscmgueSxyaC56KTtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt2YXIgYT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlciwKYz10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztjPTA9PT1jPzE6MS9jO3ZhciBlPW5ldyBxO2Uuc2V0KGMsMCwwLC1jKmEueCwwLGMsMCwtYyphLnksMCwwLGMsLWMqYS56LDAsMCwwLDEpO3RoaXMuYXBwbHlNYXRyaXgoZSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgayxjPW5ldyBrLGU9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2U8ZztlKyspe3ZhciB0PXRoaXMuZmFjZXNbZV0sdj10aGlzLnZlcnRpY2VzW3QuYV0sej10aGlzLnZlcnRpY2VzW3QuYl07YS5zdWJWZWN0b3JzKHRoaXMudmVydGljZXNbdC5jXSx6KTtjLnN1YlZlY3RvcnModix6KTthLmNyb3NzKGMpO2Eubm9ybWFsaXplKCk7dC5ub3JtYWwuY29weShhKX19LGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPSEwKTt2YXIgYzt2YXIgZT1BcnJheSh0aGlzLnZlcnRpY2VzLmxlbmd0aCk7dmFyIGc9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPApjO2crKyllW2ddPW5ldyBrO2lmKGEpe3ZhciB0PW5ldyBrLHY9bmV3IGs7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspe2M9dGhpcy5mYWNlc1thXTt2YXIgej10aGlzLnZlcnRpY2VzW2MuYV07dmFyIEU9dGhpcy52ZXJ0aWNlc1tjLmJdO3ZhciBGPXRoaXMudmVydGljZXNbYy5jXTt0LnN1YlZlY3RvcnMoRixFKTt2LnN1YlZlY3RvcnMoeixFKTt0LmNyb3NzKHYpO2VbYy5hXS5hZGQodCk7ZVtjLmJdLmFkZCh0KTtlW2MuY10uYWRkKHQpfX1lbHNlIGZvcih0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpLGE9MCxnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz10aGlzLmZhY2VzW2FdLGVbYy5hXS5hZGQoYy5ub3JtYWwpLGVbYy5iXS5hZGQoYy5ub3JtYWwpLGVbYy5jXS5hZGQoYy5ub3JtYWwpO2c9MDtmb3IoYz10aGlzLnZlcnRpY2VzLmxlbmd0aDtnPGM7ZysrKWVbZ10ubm9ybWFsaXplKCk7YT0wO2ZvcihnPXRoaXMuZmFjZXMubGVuZ3RoO2E8ZzthKyspYz0KdGhpcy5mYWNlc1thXSx6PWMudmVydGV4Tm9ybWFscywzPT09ei5sZW5ndGg/KHpbMF0uY29weShlW2MuYV0pLHpbMV0uY29weShlW2MuYl0pLHpbMl0uY29weShlW2MuY10pKTooelswXT1lW2MuYV0uY2xvbmUoKSx6WzFdPWVbYy5iXS5jbG9uZSgpLHpbMl09ZVtjLmNdLmNsb25lKCkpOzA8dGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTt2YXIgYz0wO2ZvcihhPXRoaXMuZmFjZXMubGVuZ3RoO2M8YTtjKyspe3ZhciBlPXRoaXMuZmFjZXNbY107dmFyIGc9ZS52ZXJ0ZXhOb3JtYWxzOzM9PT1nLmxlbmd0aD8oZ1swXS5jb3B5KGUubm9ybWFsKSxnWzFdLmNvcHkoZS5ub3JtYWwpLGdbMl0uY29weShlLm5vcm1hbCkpOihnWzBdPWUubm9ybWFsLmNsb25lKCksZ1sxXT1lLm5vcm1hbC5jbG9uZSgpLGdbMl09ZS5ub3JtYWwuY2xvbmUoKSl9MDwKdGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZU1vcnBoTm9ybWFsczpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPGM7ZSsrKXt2YXIgZz10aGlzLmZhY2VzW2VdO2cuX19vcmlnaW5hbEZhY2VOb3JtYWw/Zy5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KGcubm9ybWFsKTpnLl9fb3JpZ2luYWxGYWNlTm9ybWFsPWcubm9ybWFsLmNsb25lKCk7Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc3x8KGcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM9W10pO3ZhciB0PTA7Zm9yKGE9Zy52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt0PGE7dCsrKWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbdF0/Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t0XS5jb3B5KGcudmVydGV4Tm9ybWFsc1t0XSk6Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t0XT1nLnZlcnRleE5vcm1hbHNbdF0uY2xvbmUoKX12YXIgdj1uZXcgeGE7CnYuZmFjZXM9dGhpcy5mYWNlczt0PTA7Zm9yKGE9dGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoO3Q8YTt0Kyspe2lmKCF0aGlzLm1vcnBoTm9ybWFsc1t0XSl7dGhpcy5tb3JwaE5vcm1hbHNbdF09e307dGhpcy5tb3JwaE5vcm1hbHNbdF0uZmFjZU5vcm1hbHM9W107dGhpcy5tb3JwaE5vcm1hbHNbdF0udmVydGV4Tm9ybWFscz1bXTtnPXRoaXMubW9ycGhOb3JtYWxzW3RdLmZhY2VOb3JtYWxzO3ZhciB6PXRoaXMubW9ycGhOb3JtYWxzW3RdLnZlcnRleE5vcm1hbHM7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBFPW5ldyBrO3ZhciBGPXthOm5ldyBrLGI6bmV3IGssYzpuZXcga307Zy5wdXNoKEUpO3oucHVzaChGKX19ej10aGlzLm1vcnBoTm9ybWFsc1t0XTt2LnZlcnRpY2VzPXRoaXMubW9ycGhUYXJnZXRzW3RdLnZlcnRpY2VzO3YuY29tcHV0ZUZhY2VOb3JtYWxzKCk7di5jb21wdXRlVmVydGV4Tm9ybWFscygpO2U9MDtmb3IoYz10aGlzLmZhY2VzLmxlbmd0aDtlPApjO2UrKylnPXRoaXMuZmFjZXNbZV0sRT16LmZhY2VOb3JtYWxzW2VdLEY9ei52ZXJ0ZXhOb3JtYWxzW2VdLEUuY29weShnLm5vcm1hbCksRi5hLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzBdKSxGLmIuY29weShnLnZlcnRleE5vcm1hbHNbMV0pLEYuYy5jb3B5KGcudmVydGV4Tm9ybWFsc1syXSl9ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspZz10aGlzLmZhY2VzW2VdLGcubm9ybWFsPWcuX19vcmlnaW5hbEZhY2VOb3JtYWwsZy52ZXJ0ZXhOb3JtYWxzPWcuX19vcmlnaW5hbFZlcnRleE5vcm1hbHN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgeCk7dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Cm5ldyBHKTt0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LG1lcmdlOmZ1bmN0aW9uKGEsYyxlKXtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBnLHQ9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdj10aGlzLnZlcnRpY2VzLHo9YS52ZXJ0aWNlcyxFPXRoaXMuZmFjZXMsRj1hLmZhY2VzLEk9dGhpcy5jb2xvcnMsTT1hLmNvbG9yczt2b2lkIDA9PT1lJiYoZT0wKTt2b2lkIDAhPT1jJiYoZz0obmV3IHIpLmdldE5vcm1hbE1hdHJpeChjKSk7Zm9yKHZhciBQPTAsUT16Lmxlbmd0aDtQPFE7UCsrKXt2YXIgVT16W1BdLmNsb25lKCk7dm9pZCAwIT09YyYmVS5hcHBseU1hdHJpeDQoYyk7di5wdXNoKFUpfVA9MDtmb3IoUT1NLmxlbmd0aDtQPFE7UCsrKUkucHVzaChNW1BdLmNsb25lKCkpO1A9MDtmb3IoUT1GLmxlbmd0aDtQPFE7UCsrKXt6PUZbUF07dmFyIFY9ei52ZXJ0ZXhOb3JtYWxzO009ei52ZXJ0ZXhDb2xvcnM7ST1uZXcgTyh6LmErdCx6LmIrdCx6LmMrCnQpO0kubm9ybWFsLmNvcHkoei5ub3JtYWwpO3ZvaWQgMCE9PWcmJkkubm9ybWFsLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKTtjPTA7Zm9yKHY9Vi5sZW5ndGg7Yzx2O2MrKylVPVZbY10uY2xvbmUoKSx2b2lkIDAhPT1nJiZVLmFwcGx5TWF0cml4MyhnKS5ub3JtYWxpemUoKSxJLnZlcnRleE5vcm1hbHMucHVzaChVKTtJLmNvbG9yLmNvcHkoei5jb2xvcik7Yz0wO2Zvcih2PU0ubGVuZ3RoO2M8djtjKyspVT1NW2NdLEkudmVydGV4Q29sb3JzLnB1c2goVS5jbG9uZSgpKTtJLm1hdGVyaWFsSW5kZXg9ei5tYXRlcmlhbEluZGV4K2U7RS5wdXNoKEkpfVA9MDtmb3IoUT1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO1A8UTtQKyspZm9yKGU9YS5mYWNlVmVydGV4VXZzW1BdLHZvaWQgMD09PXRoaXMuZmFjZVZlcnRleFV2c1tQXSYmKHRoaXMuZmFjZVZlcnRleFV2c1tQXT1bXSksYz0wLHY9ZS5sZW5ndGg7Yzx2O2MrKyl7Zz1lW2NdO3Q9W107RT0wO2ZvcihGPWcubGVuZ3RoO0U8RjtFKyspdC5wdXNoKGdbRV0uY2xvbmUoKSk7CnRoaXMuZmFjZVZlcnRleFV2c1tQXS5wdXNoKHQpfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4iLGEpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYSl7YSYmYS5pc01lc2g/KGEubWF0cml4QXV0b1VwZGF0ZSYmYS51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGEuZ2VvbWV0cnksYS5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGEpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGE9e30sYz1bXSxlPVtdLGc9TWF0aC5wb3coMTAsNCksdDt2YXIgdj0wO2Zvcih0PXRoaXMudmVydGljZXMubGVuZ3RoO3Y8dDt2Kyspe3ZhciB6PXRoaXMudmVydGljZXNbdl07ej1NYXRoLnJvdW5kKHoueCpnKSsiXyIrTWF0aC5yb3VuZCh6LnkqZykrIl8iK01hdGgucm91bmQoei56KgpnKTt2b2lkIDA9PT1hW3pdPyhhW3pdPXYsYy5wdXNoKHRoaXMudmVydGljZXNbdl0pLGVbdl09Yy5sZW5ndGgtMSk6ZVt2XT1lW2Fbel1dfWE9W107dj0wO2Zvcih0PXRoaXMuZmFjZXMubGVuZ3RoO3Y8dDt2KyspZm9yKGc9dGhpcy5mYWNlc1t2XSxnLmE9ZVtnLmFdLGcuYj1lW2cuYl0sZy5jPWVbZy5jXSxnPVtnLmEsZy5iLGcuY10sej0wOzM+ejt6KyspaWYoZ1t6XT09PWdbKHorMSklM10pe2EucHVzaCh2KTticmVha31mb3Iodj1hLmxlbmd0aC0xOzA8PXY7di0tKWZvcihnPWFbdl0sdGhpcy5mYWNlcy5zcGxpY2UoZywxKSxlPTAsdD10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2U8dDtlKyspdGhpcy5mYWNlVmVydGV4VXZzW2VdLnNwbGljZShnLDEpO3Y9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtYy5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1jO3JldHVybiB2fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXt2YXIgZz0KYVtjXTt0aGlzLnZlcnRpY2VzLnB1c2gobmV3IGsoZy54LGcueSxnLnp8fDApKX1yZXR1cm4gdGhpc30sc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZmFjZXMsYz1hLmxlbmd0aCxlPTA7ZTxjO2UrKylhW2VdLl9pZD1lO2Euc29ydChmdW5jdGlvbihGLEkpe3JldHVybiBGLm1hdGVyaWFsSW5kZXgtSS5tYXRlcmlhbEluZGV4fSk7dmFyIGc9dGhpcy5mYWNlVmVydGV4VXZzWzBdLHQ9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHYsejtnJiZnLmxlbmd0aD09PWMmJih2PVtdKTt0JiZ0Lmxlbmd0aD09PWMmJih6PVtdKTtmb3IoZT0wO2U8YztlKyspe3ZhciBFPWFbZV0uX2lkO3YmJnYucHVzaChnW0VdKTt6JiZ6LnB1c2godFtFXSl9diYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT12KTt6JiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPXopfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKG5hLHRhLEJhKXtyZXR1cm4gQmE/bmF8MTw8dGE6bmEmCn4oMTw8dGEpfWZ1bmN0aW9uIGMobmEpe3ZhciB0YT1uYS54LnRvU3RyaW5nKCkrbmEueS50b1N0cmluZygpK25hLnoudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1JW3RhXSlyZXR1cm4gSVt0YV07SVt0YV09Ri5sZW5ndGgvMztGLnB1c2gobmEueCxuYS55LG5hLnopO3JldHVybiBJW3RhXX1mdW5jdGlvbiBlKG5hKXt2YXIgdGE9bmEuci50b1N0cmluZygpK25hLmcudG9TdHJpbmcoKStuYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09UFt0YV0pcmV0dXJuIFBbdGFdO1BbdGFdPU0ubGVuZ3RoO00ucHVzaChuYS5nZXRIZXgoKSk7cmV0dXJuIFBbdGFdfWZ1bmN0aW9uIGcobmEpe3ZhciB0YT1uYS54LnRvU3RyaW5nKCkrbmEueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVVbdGFdKXJldHVybiBVW3RhXTtVW3RhXT1RLmxlbmd0aC8yO1EucHVzaChuYS54LG5hLnkpO3JldHVybiBVW3RhXX12YXIgdD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTsKdC51dWlkPXRoaXMudXVpZDt0LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgdj10aGlzLnBhcmFtZXRlcnMsejtmb3IoeiBpbiB2KXZvaWQgMCE9PXZbel0mJih0W3pdPXZbel0pO3JldHVybiB0fXY9W107Zm9yKHo9MDt6PHRoaXMudmVydGljZXMubGVuZ3RoO3orKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1t6XTt2LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEY9W10sST17fSxNPVtdLFA9e30sUT1bXSxVPXt9O2Zvcih6PTA7ejx0aGlzLmZhY2VzLmxlbmd0aDt6Kyspe3ZhciBWPXRoaXMuZmFjZXNbel0sZWE9dm9pZCAwIT09dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLGRhPTA8Vi5ub3JtYWwubGVuZ3RoKCkscmE9MDxWLnZlcnRleE5vcm1hbHMubGVuZ3RoLHBhPTEhPT1WLmNvbG9yLnJ8fDEhPT1WLmNvbG9yLmd8fDEhPT1WLmNvbG9yLmIscWE9MDxWLnZlcnRleENvbG9ycy5sZW5ndGgsCnVhPTA7dWE9YSh1YSwwLDApO3VhPWEodWEsMSwhMCk7dWE9YSh1YSwyLCExKTt1YT1hKHVhLDMsZWEpO3VhPWEodWEsNCxkYSk7dWE9YSh1YSw1LHJhKTt1YT1hKHVhLDYscGEpO3VhPWEodWEsNyxxYSk7RS5wdXNoKHVhKTtFLnB1c2goVi5hLFYuYixWLmMpO0UucHVzaChWLm1hdGVyaWFsSW5kZXgpO2VhJiYoZWE9dGhpcy5mYWNlVmVydGV4VXZzWzBdW3pdLEUucHVzaChnKGVhWzBdKSxnKGVhWzFdKSxnKGVhWzJdKSkpO2RhJiZFLnB1c2goYyhWLm5vcm1hbCkpO3JhJiYoZGE9Vi52ZXJ0ZXhOb3JtYWxzLEUucHVzaChjKGRhWzBdKSxjKGRhWzFdKSxjKGRhWzJdKSkpO3BhJiZFLnB1c2goZShWLmNvbG9yKSk7cWEmJihWPVYudmVydGV4Q29sb3JzLEUucHVzaChlKFZbMF0pLGUoVlsxXSksZShWWzJdKSkpfXQuZGF0YT17fTt0LmRhdGEudmVydGljZXM9djt0LmRhdGEubm9ybWFscz1GOzA8TS5sZW5ndGgmJih0LmRhdGEuY29sb3JzPU0pOzA8US5sZW5ndGgmJih0LmRhdGEudXZzPQpbUV0pO3QuZGF0YS5mYWNlcz1FO3JldHVybiB0fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgeGEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGMsZSxnO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIHQ9YS52ZXJ0aWNlczt2YXIgdj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy52ZXJ0aWNlcy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmNvbG9yczt2PTA7Zm9yKGM9dC5sZW5ndGg7djxjO3YrKyl0aGlzLmNvbG9ycy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmZhY2VzO3Y9MDtmb3IoYz0KdC5sZW5ndGg7djxjO3YrKyl0aGlzLmZhY2VzLnB1c2godFt2XS5jbG9uZSgpKTt2PTA7Zm9yKGM9YS5mYWNlVmVydGV4VXZzLmxlbmd0aDt2PGM7disrKXt2YXIgej1hLmZhY2VWZXJ0ZXhVdnNbdl07dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ZdJiYodGhpcy5mYWNlVmVydGV4VXZzW3ZdPVtdKTt0PTA7Zm9yKGU9ei5sZW5ndGg7dDxlO3QrKyl7dmFyIEU9elt0XSxGPVtdO3ZhciBJPTA7Zm9yKGc9RS5sZW5ndGg7STxnO0krKylGLnB1c2goRVtJXS5jbG9uZSgpKTt0aGlzLmZhY2VWZXJ0ZXhVdnNbdl0ucHVzaChGKX19ST1hLm1vcnBoVGFyZ2V0czt2PTA7Zm9yKGM9SS5sZW5ndGg7djxjO3YrKyl7Zz17fTtnLm5hbWU9SVt2XS5uYW1lO2lmKHZvaWQgMCE9PUlbdl0udmVydGljZXMpZm9yKGcudmVydGljZXM9W10sdD0wLGU9SVt2XS52ZXJ0aWNlcy5sZW5ndGg7dDxlO3QrKylnLnZlcnRpY2VzLnB1c2goSVt2XS52ZXJ0aWNlc1t0XS5jbG9uZSgpKTtpZih2b2lkIDAhPT1JW3ZdLm5vcm1hbHMpZm9yKGcubm9ybWFscz0KW10sdD0wLGU9SVt2XS5ub3JtYWxzLmxlbmd0aDt0PGU7dCsrKWcubm9ybWFscy5wdXNoKElbdl0ubm9ybWFsc1t0XS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKGcpfUk9YS5tb3JwaE5vcm1hbHM7dj0wO2ZvcihjPUkubGVuZ3RoO3Y8Yzt2Kyspe2c9e307aWYodm9pZCAwIT09SVt2XS52ZXJ0ZXhOb3JtYWxzKWZvcihnLnZlcnRleE5vcm1hbHM9W10sdD0wLGU9SVt2XS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt0PGU7dCsrKXo9SVt2XS52ZXJ0ZXhOb3JtYWxzW3RdLEU9e30sRS5hPXouYS5jbG9uZSgpLEUuYj16LmIuY2xvbmUoKSxFLmM9ei5jLmNsb25lKCksZy52ZXJ0ZXhOb3JtYWxzLnB1c2goRSk7aWYodm9pZCAwIT09SVt2XS5mYWNlTm9ybWFscylmb3IoZy5mYWNlTm9ybWFscz1bXSx0PTAsZT1JW3ZdLmZhY2VOb3JtYWxzLmxlbmd0aDt0PGU7dCsrKWcuZmFjZU5vcm1hbHMucHVzaChJW3ZdLmZhY2VOb3JtYWxzW3RdLmNsb25lKCkpO3RoaXMubW9ycGhOb3JtYWxzLnB1c2goZyl9dD0KYS5za2luV2VpZ2h0czt2PTA7Zm9yKGM9dC5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5XZWlnaHRzLnB1c2godFt2XS5jbG9uZSgpKTt0PWEuc2tpbkluZGljZXM7dj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy5za2luSW5kaWNlcy5wdXNoKHRbdl0uY2xvbmUoKSk7dD1hLmxpbmVEaXN0YW5jZXM7dj0wO2ZvcihjPXQubGVuZ3RoO3Y8Yzt2KyspdGhpcy5saW5lRGlzdGFuY2VzLnB1c2godFt2XSk7dj1hLmJvdW5kaW5nQm94O251bGwhPT12JiYodGhpcy5ib3VuZGluZ0JveD12LmNsb25lKCkpO3Y9YS5ib3VuZGluZ1NwaGVyZTtudWxsIT09diYmKHRoaXMuYm91bmRpbmdTcGhlcmU9di5jbG9uZSgpKTt0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT1hLmVsZW1lbnRzTmVlZFVwZGF0ZTt0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT1hLnZlcnRpY2VzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9YS51dnNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9YS5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWEuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWEubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtTYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TYTtYYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1hhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YYTt2YXIgJG09e2Nsb25lOnViLG1lcmdlOkJifTtxYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7cWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXFiO3FiLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO3FiLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmZyYWdtZW50U2hhZGVyPWEuZnJhZ21lbnRTaGFkZXI7dGhpcy52ZXJ0ZXhTaGFkZXI9YS52ZXJ0ZXhTaGFkZXI7dGhpcy51bmlmb3Jtcz11YihhLnVuaWZvcm1zKTt0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSxhLmRlZmluZXMpO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuY2xpcHBpbmc9YS5jbGlwcGluZzt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7dGhpcy5leHRlbnNpb25zPWEuZXh0ZW5zaW9ucztyZXR1cm4gdGhpc307cWIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihhKXt2YXIgYz1TLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2MudW5pZm9ybXM9e307Zm9yKHZhciBlIGluIHRoaXMudW5pZm9ybXMpe3ZhciBnPQp0aGlzLnVuaWZvcm1zW2VdLnZhbHVlO2MudW5pZm9ybXNbZV09ZyYmZy5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmcudG9KU09OKGEpLnV1aWR9OmcmJmcuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6Zy5nZXRIZXgoKX06ZyYmZy5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTpnLnRvQXJyYXkoKX06ZyYmZy5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTpnLnRvQXJyYXkoKX06e3ZhbHVlOmd9fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihjLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtjLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtjLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7YT17fTtmb3IodmFyIHQgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09CnRoaXMuZXh0ZW5zaW9uc1t0XSYmKGFbdF09ITApOzA8T2JqZWN0LmtleXMoYSkubGVuZ3RoJiYoYy5leHRlbnNpb25zPWEpO3JldHVybiBjfTt6Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6emIsaXNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShhLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4KTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoYS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7cmV0dXJuIHRoaXN9LGdldFdvcmxkRGlyZWN0aW9uOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLAphPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgYz10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBhLnNldCgtY1s4XSwtY1s5XSwtY1sxMF0pLm5vcm1hbGl6ZSgpfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7dmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh6Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp2Yixpc1BlcnNwZWN0aXZlQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmZvdj1hLmZvdjt0aGlzLnpvb209YS56b29tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9CmEuZmFyO3RoaXMuZm9jdXM9YS5mb2N1czt0aGlzLmFzcGVjdD1hLmFzcGVjdDt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTt0aGlzLmZpbG1HYXVnZT1hLmZpbG1HYXVnZTt0aGlzLmZpbG1PZmZzZXQ9YS5maWxtT2Zmc2V0O3JldHVybiB0aGlzfSxzZXRGb2NhbExlbmd0aDpmdW5jdGlvbihhKXt0aGlzLmZvdj0yKmhiLlJBRDJERUcqTWF0aC5hdGFuKC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2EpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxnZXRGb2NhbExlbmd0aDpmdW5jdGlvbigpe3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL01hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpfSxnZXRFZmZlY3RpdmVGT1Y6ZnVuY3Rpb24oKXtyZXR1cm4gMipoYi5SQUQyREVHKk1hdGguYXRhbihNYXRoLnRhbiguNSpoYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20pfSxnZXRGaWxtV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqCk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfSxnZXRGaWxtSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfSxzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXt0aGlzLmFzcGVjdD1hL2M7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSk7dGhpcy52aWV3LmVuYWJsZWQ9ITA7dGhpcy52aWV3LmZ1bGxXaWR0aD1hO3RoaXMudmlldy5mdWxsSGVpZ2h0PWM7dGhpcy52aWV3Lm9mZnNldFg9ZTt0aGlzLnZpZXcub2Zmc2V0WT1nO3RoaXMudmlldy53aWR0aD10O3RoaXMudmlldy5oZWlnaHQ9djt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sY2xlYXJWaWV3T2Zmc2V0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sCnVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5lYXIsYz1hKk1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSxlPTIqYyxnPXRoaXMuYXNwZWN0KmUsdD0tLjUqZyx2PXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7dmFyIHo9di5mdWxsV2lkdGgsRT12LmZ1bGxIZWlnaHQ7dCs9di5vZmZzZXRYKmcvejtjLT12Lm9mZnNldFkqZS9FO2cqPXYud2lkdGgvejtlKj12LmhlaWdodC9FfXY9dGhpcy5maWxtT2Zmc2V0OzAhPT12JiYodCs9YSp2L3RoaXMuZ2V0RmlsbVdpZHRoKCkpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUodCx0K2csYyxjLWUsYSx0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LHRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpO2Eub2JqZWN0LmZvdj10aGlzLmZvdjthLm9iamVjdC56b29tPXRoaXMuem9vbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7YS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1czthLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3Q7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTthLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2U7YS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQ7cmV0dXJuIGF9fSk7R2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO0diLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HYjtPYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSk7T2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPU9iO09iLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT0hMDtPYi5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmU9CmZ1bmN0aW9uKGEsYyl7dGhpcy50ZXh0dXJlLnR5cGU9Yy50eXBlO3RoaXMudGV4dHVyZS5mb3JtYXQ9Yy5mb3JtYXQ7dGhpcy50ZXh0dXJlLmVuY29kaW5nPWMuZW5jb2Rpbmc7dmFyIGU9bmV3IHksZz1uZXcgcWIoe3R5cGU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnViKHt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSksdmVydGV4U2hhZGVyOiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn0iLHNpZGU6MSxibGVuZGluZzowfSk7Zy51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9YzsKYz1uZXcgeWEobmV3IFhhKDUsNSw1KSxnKTtlLmFkZChjKTtnPW5ldyBHYigxLDEwLDEpO2cucmVuZGVyVGFyZ2V0PXRoaXM7Zy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhVGV4dHVyZSI7Zy51cGRhdGUoYSxlKTtjLmdlb21ldHJ5LmRpc3Bvc2UoKTtjLm1hdGVyaWFsLmRpc3Bvc2UoKTtyZXR1cm4gdGhpc307QWIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0FiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYjtBYi5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDt2YXIgT2k9bmV3IGssYW49bmV3IGssYm49bmV3IHI7T2JqZWN0LmFzc2lnbihIYi5wcm90b3R5cGUse2lzUGxhbmU6ITAsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PWM7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudHM6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5ub3JtYWwuc2V0KGEsYyxlKTt0aGlzLmNvbnN0YW50PWc7cmV0dXJuIHRoaXN9LApzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDpmdW5jdGlvbihhLGMpe3RoaXMubm9ybWFsLmNvcHkoYSk7dGhpcy5jb25zdGFudD0tYy5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxzZXRGcm9tQ29wbGFuYXJQb2ludHM6ZnVuY3Rpb24oYSxjLGUpe2M9T2kuc3ViVmVjdG9ycyhlLGMpLmNyb3NzKGFuLnN1YlZlY3RvcnMoYSxjKSkubm9ybWFsaXplKCk7dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChjLGEpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5vcm1hbC5jb3B5KGEubm9ybWFsKTt0aGlzLmNvbnN0YW50PWEuY29uc3RhbnQ7cmV0dXJuIHRoaXN9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBhPTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoYSk7dGhpcy5jb25zdGFudCo9YTtyZXR1cm4gdGhpc30sCm5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RhbnQqPS0xO3RoaXMubm9ybWFsLm5lZ2F0ZSgpO3JldHVybiB0aGlzfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdChhKSt0aGlzLmNvbnN0YW50fSxkaXN0YW5jZVRvU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludChhLmNlbnRlciktYS5yYWRpdXN9LHByb2plY3RQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludChhKSkuYWRkKGEpfSxpbnRlcnNlY3RMaW5lOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBrKTt2YXIgZT1hLmRlbHRhKE9pKSxnPXRoaXMubm9ybWFsLmRvdChlKTtpZigwPT09Zyl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpKXJldHVybiBjLmNvcHkoYS5zdGFydCl9ZWxzZSBpZihnPS0oYS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2csISgwPmd8fDE8ZykpcmV0dXJuIGMuY29weShlKS5tdWx0aXBseVNjYWxhcihnKS5hZGQoYS5zdGFydCl9LGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZGlzdGFuY2VUb1BvaW50KGEuc3RhcnQpO2E9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5lbmQpO3JldHVybiAwPmMmJjA8YXx8MD5hJiYwPGN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNQbGFuZSh0aGlzKX0sY29wbGFuYXJQb2ludDpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEsYyl7Yz1jfHxibi5nZXROb3JtYWxNYXRyaXgoYSk7YT10aGlzLmNvcGxhbmFyUG9pbnQoT2kpLmFwcGx5TWF0cml4NChhKTtjPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1hLmRvdChjKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY29uc3RhbnQtPWEuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZhLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH19KTt2YXIgb2Y9bmV3IEcsc2g9bmV3IGs7T2JqZWN0LmFzc2lnbihsYy5wcm90b3R5cGUsCntzZXQ6ZnVuY3Rpb24oYSxjLGUsZyx0LHYpe3ZhciB6PXRoaXMucGxhbmVzO3pbMF0uY29weShhKTt6WzFdLmNvcHkoYyk7elsyXS5jb3B5KGUpO3pbM10uY29weShnKTt6WzRdLmNvcHkodCk7els1XS5jb3B5KHYpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspY1tlXS5jb3B5KGEucGxhbmVzW2VdKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuZWxlbWVudHM7YT1lWzBdO3ZhciBnPWVbMV0sdD1lWzJdLHY9ZVszXSx6PWVbNF0sRT1lWzVdLEY9ZVs2XSxJPWVbN10sTT1lWzhdLFA9ZVs5XSxRPWVbMTBdLFU9ZVsxMV0sVj1lWzEyXSxlYT1lWzEzXSxkYT1lWzE0XTtlPWVbMTVdO2NbMF0uc2V0Q29tcG9uZW50cyh2LWEsSS16LFUtTSxlLVYpLm5vcm1hbGl6ZSgpOwpjWzFdLnNldENvbXBvbmVudHModithLEkreixVK00sZStWKS5ub3JtYWxpemUoKTtjWzJdLnNldENvbXBvbmVudHModitnLEkrRSxVK1AsZStlYSkubm9ybWFsaXplKCk7Y1szXS5zZXRDb21wb25lbnRzKHYtZyxJLUUsVS1QLGUtZWEpLm5vcm1hbGl6ZSgpO2NbNF0uc2V0Q29tcG9uZW50cyh2LXQsSS1GLFUtUSxlLWRhKS5ub3JtYWxpemUoKTtjWzVdLnNldENvbXBvbmVudHModit0LEkrRixVK1EsZStkYSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXN9LGludGVyc2VjdHNPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9YS5nZW9tZXRyeTtudWxsPT09Yy5ib3VuZGluZ1NwaGVyZSYmYy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtvZi5jb3B5KGMuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG9mKX0saW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbihhKXtvZi5jZW50ZXIuc2V0KDAsMCwwKTtvZi5yYWRpdXM9Ci43MDcxMDY3ODExODY1NDc2O29mLmFwcGx5TWF0cml4NChhLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKG9mKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBsYW5lcyxlPWEuY2VudGVyO2E9LWEucmFkaXVzO2Zvcih2YXIgZz0wOzY+ZztnKyspaWYoY1tnXS5kaXN0YW5jZVRvUG9pbnQoZSk8YSlyZXR1cm4hMTtyZXR1cm4hMH0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspe3ZhciBnPWNbZV07c2gueD0wPGcubm9ybWFsLng/YS5tYXgueDphLm1pbi54O3NoLnk9MDxnLm5vcm1hbC55P2EubWF4Lnk6YS5taW4ueTtzaC56PTA8Zy5ub3JtYWwuej9hLm1heC56OmEubWluLno7aWYoMD5nLmRpc3RhbmNlVG9Qb2ludChzaCkpcmV0dXJuITF9cmV0dXJuITB9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMucGxhbmVzLGU9MDs2PmU7ZSsrKWlmKDA+CmNbZV0uZGlzdGFuY2VUb1BvaW50KGEpKXJldHVybiExO3JldHVybiEwfX0pO3ZhciByYj17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKlx4M2QgdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgXHgzYyBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uIFx4M2QgKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqXHgzZCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmFvbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGJlZ2luX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZCBceDNkIHZlYzMoIHBvc2l0aW9uICk7IixiZWdpbm5vcm1hbF92ZXJ0ZXg6InZlYzMgb2JqZWN0Tm9ybWFsIFx4M2QgdmVjMyggbm9ybWFsICk7XG4jaWZkZWYgVVNFX1RBTkdFTlRcblx0dmVjMyBvYmplY3RUYW5nZW50IFx4M2QgdmVjMyggdGFuZ2VudC54eXogKTtcbiNlbmRpZiIsYnNkZnM6InZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCB2ZWM0IGMwIFx4M2QgdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSBceDNkIHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG5cdHZlYzQgciBceDNkIHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEwMDQgXHgzZCBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuXHRyZXR1cm4gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xufVxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgXHgzZCAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdGlmKCBjdXRvZmZEaXN0YW5jZSBceDNlIDAuMCApIHtcblx0XHRkaXN0YW5jZUZhbGxvZmYgKlx4M2QgcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0fVxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xuI2Vsc2Vcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wIFx4MjZceDI2IGRlY2F5RXhwb25lbnQgXHgzZSAwLjAgKSB7XG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHR9XG5cdHJldHVybiAxLjA7XG4jZW5kaWZcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsIFx4M2QgZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyIFx4M2QgbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgXHgzZCBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgXHgzZCBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tIFx4M2QgcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSBceDNkIHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMzIGhhbGZEaXIgXHgzZCBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRmbG9hdCBEIFx4M2QgRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgXHgzZCA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgXHgzZCAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgIFx4M2QgMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgXHgzZCB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgXHgzZCB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCBceDNkIGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCBceDNkIGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgXHgzZCBhYnMoIHggKTtcblx0ZmxvYXQgYSBceDNkIDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiBceDNkIDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiBceDNkIGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSBceDNkICggeCBceDNlIDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxIFx4M2QgcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyIFx4M2QgcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsIFx4M2QgY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIFx4M2MgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgXHgzZCBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgXHgzZCAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCBceDNkIG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0IFx4M2QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiBceDNkIGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzIFx4M2QgRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzIFx4M2QgYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgXHgzZCAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyBceDNkIHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgXHgzZCBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgK1x4M2QgRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgK1x4M2QgRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCBceDNkIERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhICBceDNkIDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggXHgzZCBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoIFx4M2QgbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCBceDNkIG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgXHgzZCBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlIFx4M2QgZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdIFx4M2QgdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSBceDNkIHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyBceDNkIHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59IiwKY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiBceDNkIGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSBceDNkIC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggXHgzZSBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueCBceDNlIDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueSBceDNlIDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi56IFx4M2UgMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlIFx4M2QgZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzIFx4M2QgZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyBceDNkIGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCBceDNkIGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSBceDNkIGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCBceDNkIG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkIFx4M2QgY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsIFx4M2QgMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgXHgzZCByb3VnaG5lc3NMZXZlbCBceDNlIGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhIFx4M2QgMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCBceDNkIGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkIFx4M2QgdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgXHgzZCBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgXHgzZCByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0IFx4M2QgMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyBceDNkIG1pcExldmVsIFx4M2RceDNkIDAuMDtcblx0c2NhbGUgXHgzZCAgYlJlcyBceDI2XHgyNiAoc2NhbGUgXHgzYyBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgXHgzZCBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSBceDNkIDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSBceDNkXHgzZCAwKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSBceDNkXHgzZCAxKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDIpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDMpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDQpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyIFx4M2Qgbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCBceDNkIDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzIFx4M2QgKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSBceDNkIG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgXHgzZCByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgXHgzZCBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiBceDNkIHIxICsgMS4wO1xuXHRmbG9hdCB0IFx4M2QgZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvIFx4M2QgTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgXHgzZCBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCBceDNkIG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxIFx4M2QgbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgXHgzZCBsZXZlbDEgXHgzZSA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArXHgzZCBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCBceDNkIGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0IFx4M2QgbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIiwKZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgXHgzZCBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdFRhbmdlbnQ7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50IFx4M2QgLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArXHgzZCBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLAplbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgXHgzZCBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqXHgzZCBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgXHgzZCBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCBceDNkIGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCIFx4M2QgbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNIFx4M2QgY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNIFx4M2QgY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgXHgzZCBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCBceDNkIG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gXHgzZCBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgXHgzZCBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwIFx4M2QgbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgXHgzZCBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgXHgzZCAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgXHgzZCBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56IFx4M2QgKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSBceDNkIG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgXHgzZCB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgXHgzZCBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiBceDNkIFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggXHgzZCB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiBceDNkIGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLAplbnZtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgXHgzZCBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSBceDNkIFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgXHgzZCBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdCAgcmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsIFx4M2QgZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyBceDNkIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmIiwKZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIixmb2dfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCBceDNkIC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiLApmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2QgMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yIFx4M2Qgc2hlZW47XG4jZW5kaWYiLApsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSBceDNkIGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfU2hlZW4oXG5cdFx0XHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcblx0XHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbixcblx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxuXHRcdCk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MpO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhcmNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIGNjRG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCAwLjA7XG5cdCNlbmRpZlxuXHRmbG9hdCBjbGVhcmNvYXRJbnYgXHgzZCAxLjAgLSBjbGVhcmNvYXRESFI7XG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIG11bHRpU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0dmVjMyBkaWZmdXNlIFx4M2QgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwgXHgzZCBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgXHgzZCBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSBceDI2XHgyNiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpYmxJcnJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyBceDNlIDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKlx4M2QgUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArXHgzZCBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgXHgzZCBub3JtYWw7IiwKbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0bm9ybWFsIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRub3JtYWwgXHgzZCAtIG5vcm1hbDtcblx0I2VuZGlmXG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbm9ybWFsU2NhbGUsIG5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcbiNlbmRpZlxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xuI2VuZGlmXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSBceDI2XHgyNiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgKVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIG5vcm1hbFNjYWxlLCBpbiBzYW1wbGVyMkQgbm9ybWFsTWFwICkge1xuXHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSBceDNkIHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCBceDNkIGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0ZmxvYXQgc2NhbGUgXHgzZCBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xuXHRcdHZlYzMgUyBceDNkIG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcblx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHR2ZWMzIE4gXHgzZCBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSAqXHgzZCBub3JtYWxTY2FsZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2ZWMzIE5mcm9tU1QgXHgzZCBjcm9zcyggUywgVCApO1xuXHRcdFx0aWYoIGRvdCggTmZyb21TVCwgTiApIFx4M2UgMC4wICkge1xuXHRcdFx0XHRTICpceDNkIC0xLjA7XG5cdFx0XHRcdFQgKlx4M2QgLTEuMDtcblx0XHRcdH1cblx0XHQjZWxzZVxuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0I2VuZGlmXG5cdFx0bWF0MyB0c24gXHgzZCBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsIFx4M2QgZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2QgY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlIFx4M2QgMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlIFx4M2QgMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzIFx4M2QgdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyBceDNkIFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggXHgzZCAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByIFx4M2QgdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC1ceDNkIHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBlbmNvZGVIYWxmUkdCQSAoIHZlYzIgdiApIHtcblx0dmVjNCBlbmNvZGVkIFx4M2QgdmVjNCggMC4wICk7XG5cdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMS4wIC8gMjU1LjAsIDAuMCApO1xuXHRlbmNvZGVkLnh5IFx4M2QgdmVjMiggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnh5IFx4M2QgZW5jb2RlZC54eSAtICggZW5jb2RlZC55eSAqIG9mZnNldCApO1xuXHRlbmNvZGVkLnp3IFx4M2QgdmVjMiggdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnp3IFx4M2QgZW5jb2RlZC56dyAtICggZW5jb2RlZC53dyAqIG9mZnNldCApO1xuXHRyZXR1cm4gZW5jb2RlZDtcbn1cbnZlYzIgZGVjb2RlSGFsZlJHQkEoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IiwKcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqXHgzZCBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uIFx4M2QgMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uIFx4M2QgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgXHgzZCBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIVx4M2QgMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgXHgzZCBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5IFx4M2QgdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uIFx4M2QgY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgXHgzZCAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmIFx4M2QgZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgXHgzZCBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiBceDNkIG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjIFx4M2QgbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogL1x4M2Qgc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjIFx4M2QgYnZlYzQgKCBzaGFkb3dDb29yZC54IFx4M2VceDNkIDAuMCwgc2hhZG93Q29vcmQueCBceDNjXHgzZCAxLjAsIHNoYWRvd0Nvb3JkLnkgXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC55IFx4M2NceDNkIDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtIFx4M2QgYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyBceDNkIGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCBceDNkIGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyIFx4M2QgZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyIFx4M2QgZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzIFx4M2QgZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzIFx4M2QgZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyBceDNkIFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViBceDNkIGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlIFx4M2QgMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKlx4M2Qgc2NhbGVUb0N1YmU7XG5cdFx0diAqXHgzZCBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyIFx4M2Qgdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgXHgzZCAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSBceDNkIDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiBceDNlIDAuMCApXG5cdFx0XHRcdHBsYW5hci54IFx4M2QgNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCBceDNkIHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSBceDNkIHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55IFx4M2Qgdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uIFx4M2Qgc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwIFx4M2QgKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEIFx4M2Qgbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSBceDNkIHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgXHgzZCAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLApza2luYmFzZV92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0WCBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XG4jZW5kaWYiLHNraW5uaW5nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0ZmxvYXQgaiBceDNkIGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4IFx4M2QgbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgXHgzZCBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHRmbG9hdCBkeSBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdHkgXHgzZCBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MiBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MyBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lIFx4M2QgbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBib25lTWF0cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggXHgzZCBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkIFx4M2QgKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCBceDNkIG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICBceDNkIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50IFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgXHgzZCB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yIFx4M2QgbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iLAp1dl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIiwKd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gXHgzZCBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IiwKY3ViZV9mcmFnOiJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICpceDNkIG9wYWNpdHk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IiwKZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHRcdGRpZmZ1c2VDb2xvci5hIFx4M2Qgb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRpZlxufSIsCmRlcHRoX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG59IiwKZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdGZsb2F0IGRpc3QgXHgzZCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCBceDNkICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0IFx4M2Qgc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IiwKZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG59IiwKZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSBceDNkIGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54IFx4M2QgYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IiwKZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApIFx4M2UgZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApsaW5lZGFzaGVkX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHR2TGluZURpc3RhbmNlIFx4M2Qgc2NhbGUgKiBsaW5lRGlzdGFuY2U7XG5cdHZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobGFtYmVydF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9lbmRceDNlXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIFRSQU5TUEFSRU5DWVxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaWZkZWYgVFJBTlNQQVJFTkNZXG5cdFx0ZGlmZnVzZUNvbG9yLmEgKlx4M2Qgc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50IFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50IFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsCm5vcm1hbF92ZXJ0OiIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLApwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0b3V0Z29pbmdMaWdodCBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKcG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9pbnRTaXplIFx4M2Qgc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICpceDNkICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCnNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLHNoYWRvd192ZXJ0OiIjaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCnNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55IFx4M2QgbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlIFx4M2QgKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSBceDNkXHgzZCAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICpceDNkIC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gXHgzZCAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54IFx4M2QgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgXHgzZCBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICtceDNkIHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSJ9LApXYT17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgSCgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyByfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSwKbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBmKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyLjVFLTR9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MkUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IEgoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LApzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fSxzaGFkb3c6e30sc2hhZG93Qmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0scG9pbnRMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRlY2F5Ont9LGRpc3RhbmNlOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0sCnBvaW50U2hhZG93TWFwOnt2YWx1ZTpbXX0scG9pbnRTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxoZW1pc3BoZXJlTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sc2t5Q29sb3I6e30sZ3JvdW5kQ29sb3I6e319fSxyZWN0QXJlYUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sd2lkdGg6e30saGVpZ2h0Ont9fX19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IEgoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHJ9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBIKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgZiguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgcn19fSxPYz0Ke2Jhc2ljOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLnNwZWN1bGFybWFwLFdhLmVudm1hcCxXYS5hb21hcCxXYS5saWdodG1hcCxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSCgwKX19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5ncmFkaWVudG1hcCwKV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBIKDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IEgoMTExODQ4MSl9LHNoaW5pbmVzczp7dmFsdWU6MzB9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmVtaXNzaXZlbWFwLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCxXYS5yb3VnaG5lc3NtYXAsV2EubWV0YWxuZXNzbWFwLFdhLmZvZyxXYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSCgwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9LAptYXRjYXA6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpCYihbV2EucG9pbnRzLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpyYi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6cmIuZGVwdGhfdmVydCwKZnJhZ21lbnRTaGFkZXI6cmIuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmJ1bXBtYXAsV2Eubm9ybWFsbWFwLFdhLmRpc3BsYWNlbWVudG1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnJiLm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOkJiKFtXYS5zcHJpdGUsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyByfSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6cmIuY3ViZV92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnJiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBrfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxRTN9fV0pLHZlcnRleFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpCYihbV2EubGlnaHRzLFdhLmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyBIKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc2hhZG93X2ZyYWd9fTtPYy5waHlzaWNhbD0Ke3VuaWZvcm1zOkJiKFtPYy5zdGFuZGFyZC51bmlmb3Jtcyx7dHJhbnNwYXJlbmN5Ont2YWx1ZTowfSxjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzczp7dmFsdWU6MH0sc2hlZW46e3ZhbHVlOm5ldyBIKDApfSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaHBoeXNpY2FsX2ZyYWd9O3VkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7dWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXVkO05jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7TmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPU5jO2VkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtlZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWQ7ZWQucHJvdG90eXBlLmlzQ3ViZVRleHR1cmU9CiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlZC5wcm90b3R5cGUsImltYWdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbWFnZT1hfX0pO3RlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTt0ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dGU7dGUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO3VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTt1ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9dWU7dWUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUzRD0hMDt2YXIgcmo9bmV3IGwsemw9bmV3IHRlLEJsPW5ldyB1ZSxzaj1uZXcgZWQsbGo9W10sbmo9W10scWo9bmV3IEZsb2F0MzJBcnJheSgxNikscGo9bmV3IEZsb2F0MzJBcnJheSg5KSxvaj1uZXcgRmxvYXQzMkFycmF5KDQpO3RqLnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNhY2hlO2EgaW5zdGFuY2VvZgpGbG9hdDMyQXJyYXkmJmMubGVuZ3RoIT09YS5sZW5ndGgmJih0aGlzLmNhY2hlPW5ldyBGbG9hdDMyQXJyYXkoYS5sZW5ndGgpKTtwYyhjLGEpfTt1ai5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz10aGlzLnNlcSx0PTAsdj1nLmxlbmd0aDt0IT09djsrK3Qpe3ZhciB6PWdbdF07ei5zZXRWYWx1ZShhLGNbei5pZF0sZSl9fTt2YXIgUWg9LyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7eGQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKGEsYyxlLGcpe2M9dGhpcy5tYXBbY107dm9pZCAwIT09YyYmYy5zZXRWYWx1ZShhLGUsZyl9O3hkLnByb3RvdHlwZS5zZXRPcHRpb25hbD1mdW5jdGlvbihhLGMsZSl7Yz1jW2VdO3ZvaWQgMCE9PWMmJnRoaXMuc2V0VmFsdWUoYSxlLGMpfTt4ZC51cGxvYWQ9ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciB0PTAsdj1jLmxlbmd0aDt0IT09djsrK3Qpe3ZhciB6PWNbdF0sRT1lW3ouaWRdOyExIT09RS5uZWVkc1VwZGF0ZSYmCnouc2V0VmFsdWUoYSxFLnZhbHVlLGcpfX07eGQuc2VxV2l0aFZhbHVlPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPVtdLGc9MCx0PWEubGVuZ3RoO2chPT10OysrZyl7dmFyIHY9YVtnXTt2LmlkIGluIGMmJmUucHVzaCh2KX1yZXR1cm4gZX07dmFyIGVtPTAsbm09MDt5ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7eWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXlkO3lkLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO3lkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVwdGhQYWNraW5nPWEuZGVwdGhQYWNraW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1hcD1hLm1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KYS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3JldHVybiB0aGlzfTt6ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7emQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpkO3pkLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPSEwO3pkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShhLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1hLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWEuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9CmEuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O3dlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3ZSxpc0dyb3VwOiEwfSk7d2YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2Yi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3Zixpc0FycmF5Q2FtZXJhOiEwfSk7dmFyIEhqPW5ldyBrLElqPW5ldyBrO09iamVjdC5hc3NpZ24oU2gucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKEpqLnByb3RvdHlwZSxkLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbihDZy5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5jb2xvciwKdGhpcy5kZW5zaXR5KX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX0pO09iamVjdC5hc3NpZ24oRGcucHJvdG90eXBlLHtpc0ZvZzohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgRGcodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nIixjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KFNkLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKFNkLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlcjohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihhKXtpZihBcnJheS5pc0FycmF5KGEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC90aGlzLnN0cmlkZTowO3RoaXMuYXJyYXk9YTtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihhKXt0aGlzLmR5bmFtaWM9YTtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbihhKXt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuY291bnQ9YS5jb3VudDt0aGlzLnN0cmlkZT1hLnN0cmlkZTt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuc3RyaWRlO2UqPWMuc3RyaWRlO2Zvcih2YXIgZz0wLHQ9dGhpcy5zdHJpZGU7Zzx0O2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0wKTt0aGlzLmFycmF5LnNldChhLGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sCm9uVXBsb2FkOmZ1bmN0aW9uKGEpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1hO3JldHVybiB0aGlzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHlmLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuY291bnR9fSxhcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX19fSk7T2JqZWN0LmFzc2lnbih5Zi5wcm90b3R5cGUse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWM7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWM7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWM7cmV0dXJuIHRoaXN9LApzZXRXOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1jO3JldHVybiB0aGlzfSxnZXRYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX0sZ2V0WTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXX0sZ2V0WjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXX0sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX0sc2V0WFk6ZnVuY3Rpb24oYSxjLGUpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGEsCmMsZSxnKXthPWEqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYSswXT1jO3RoaXMuZGF0YS5hcnJheVthKzFdPWU7dGhpcy5kYXRhLmFycmF5W2ErMl09ZztyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihhLGMsZSxnLHQpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3RoaXMuZGF0YS5hcnJheVthKzNdPXQ7cmV0dXJuIHRoaXN9fSk7RGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO0RkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZDtEZC5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtEZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5yb3RhdGlvbj0KYS5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIENlLG5nPW5ldyBrLHBmPW5ldyBrLHFmPW5ldyBrLERlPW5ldyBmLEFmPW5ldyBmLE9qPW5ldyBxLHRoPW5ldyBrLG9nPW5ldyBrLHVoPW5ldyBrLHRrPW5ldyBmLFBpPW5ldyBmLHVrPW5ldyBmO3pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Zixpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7bnVsbD09PWEuY2FtZXJhJiZjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyk7cGYuc2V0RnJvbU1hdHJpeFNjYWxlKHRoaXMubWF0cml4V29ybGQpO09qLmNvcHkoYS5jYW1lcmEubWF0cml4V29ybGQpO3RoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYS5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAp0aGlzLm1hdHJpeFdvcmxkKTtxZi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpO2EuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJnBmLm11bHRpcGx5U2NhbGFyKC1xZi56KTt2YXIgZT10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2lmKDAhPT1lKXt2YXIgZz1NYXRoLmNvcyhlKTt2YXIgdD1NYXRoLnNpbihlKX1lPXRoaXMuY2VudGVyO0VnKHRoLnNldCgtLjUsLS41LDApLHFmLGUscGYsdCxnKTtFZyhvZy5zZXQoLjUsLS41LDApLHFmLGUscGYsdCxnKTtFZyh1aC5zZXQoLjUsLjUsMCkscWYsZSxwZix0LGcpO3RrLnNldCgwLDApO1BpLnNldCgxLDApO3VrLnNldCgxLDEpO3ZhciB2PWEucmF5LmludGVyc2VjdFRyaWFuZ2xlKHRoLG9nLHVoLCExLG5nKTtpZihudWxsPT09diYmKEVnKG9nLnNldCgtLjUsLjUsMCkscWYsZSxwZix0LGcpLFBpLnNldCgwLDEpLHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUodGgsCnVoLG9nLCExLG5nKSxudWxsPT09dikpcmV0dXJuO3Q9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8obmcpO3Q8YS5uZWFyfHx0PmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOnQscG9pbnQ6bmcuY2xvbmUoKSx1djpCLmdldFVWKG5nLHRoLG9nLHVoLHRrLFBpLHVrLG5ldyBmKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dm9pZCAwIT09YS5jZW50ZXImJnRoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3JldHVybiB0aGlzfX0pO3ZhciB2aD1uZXcgayx2az1uZXcgaztCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QmYsaXNMT0Q6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSwhMSk7YT1hLmxldmVscztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPWFbY107dGhpcy5hZGRMZXZlbChnLm9iamVjdC5jbG9uZSgpLGcuZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2M9TWF0aC5hYnMoYyk7Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGc9MDtnPGUubGVuZ3RoJiYhKGM8ZVtnXS5kaXN0YW5jZSk7ZysrKTtlLnNwbGljZShnLDAse2Rpc3RhbmNlOmMsb2JqZWN0OmF9KTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MSxnPWMubGVuZ3RoO2U8ZyYmIShhPGNbZV0uZGlzdGFuY2UpO2UrKyk7cmV0dXJuIGNbZS0xXS5vYmplY3R9LHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXt2aC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShhLnJheS5vcmlnaW4uZGlzdGFuY2VUbyh2aCkpLnJheWNhc3QoYSwKYyl9LHVwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmxldmVscztpZigxPGMubGVuZ3RoKXt2aC5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS5tYXRyaXhXb3JsZCk7dmsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2E9dmguZGlzdGFuY2VUbyh2ayk7Y1swXS5vYmplY3QudmlzaWJsZT0hMDtmb3IodmFyIGU9MSxnPWMubGVuZ3RoO2U8ZztlKyspaWYoYT49Y1tlXS5kaXN0YW5jZSljW2UtMV0ub2JqZWN0LnZpc2libGU9ITEsY1tlXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7ZTxnO2UrKyljW2VdLm9iamVjdC52aXNpYmxlPSExfX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBjPXRoaXMubGV2ZWxzLGU9MCxnPWMubGVuZ3RoO2U8ZztlKyspe3ZhciB0PWNbZV07YS5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDp0Lm9iamVjdC51dWlkLApkaXN0YW5jZTp0LmRpc3RhbmNlfSl9cmV0dXJuIGF9fSk7Q2YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpDZixpc1NraW5uZWRNZXNoOiEwLGJpbmQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnNrZWxldG9uPWE7dm9pZCAwPT09YyYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxjPXRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGMpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShjKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYT1uZXcgcCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7YS54PWMuZ2V0WChlKTthLnk9Yy5nZXRZKGUpO2Euej1jLmdldFooZSk7CmEudz1jLmdldFcoZSk7dmFyIHQ9MS9hLm1hbmhhdHRhbkxlbmd0aCgpO0luZmluaXR5IT09dD9hLm11bHRpcGx5U2NhbGFyKHQpOmEuc2V0KDEsMCwwLDApO2Muc2V0WFlaVyhlLGEueCxhLnksYS56LGEudyl9fSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt5YS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpOyJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7CnZhciB3az1uZXcgcSxjbj1uZXcgcTtPYmplY3QuYXNzaWduKEZnLnByb3RvdHlwZSx7Y2FsY3VsYXRlSW52ZXJzZXM6ZnVuY3Rpb24oKXt0aGlzLmJvbmVJbnZlcnNlcz1bXTtmb3IodmFyIGE9MCxjPXRoaXMuYm9uZXMubGVuZ3RoO2E8YzthKyspe3ZhciBlPW5ldyBxO3RoaXMuYm9uZXNbYV0mJmUuZ2V0SW52ZXJzZSh0aGlzLmJvbmVzW2FdLm1hdHJpeFdvcmxkKTt0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGUpfX0scG9zZTpmdW5jdGlvbigpe3ZhciBhLGM7dmFyIGU9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKShhPXRoaXMuYm9uZXNbZV0pJiZhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodGhpcy5ib25lSW52ZXJzZXNbZV0pO2U9MDtmb3IoYz10aGlzLmJvbmVzLmxlbmd0aDtlPGM7ZSsrKWlmKGE9dGhpcy5ib25lc1tlXSlhLnBhcmVudCYmYS5wYXJlbnQuaXNCb25lPyhhLm1hdHJpeC5nZXRJbnZlcnNlKGEucGFyZW50Lm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5tdWx0aXBseShhLm1hdHJpeFdvcmxkKSk6CmEubWF0cml4LmNvcHkoYS5tYXRyaXhXb3JsZCksYS5tYXRyaXguZGVjb21wb3NlKGEucG9zaXRpb24sYS5xdWF0ZXJuaW9uLGEuc2NhbGUpfSx1cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ib25lcyxjPXRoaXMuYm9uZUludmVyc2VzLGU9dGhpcy5ib25lTWF0cmljZXMsZz10aGlzLmJvbmVUZXh0dXJlLHQ9MCx2PWEubGVuZ3RoO3Q8djt0Kyspd2subXVsdGlwbHlNYXRyaWNlcyhhW3RdP2FbdF0ubWF0cml4V29ybGQ6Y24sY1t0XSksd2sudG9BcnJheShlLDE2KnQpO3ZvaWQgMCE9PWcmJihnLm5lZWRzVXBkYXRlPSEwKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEZnKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfSxnZXRCb25lQnlOYW1lOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9dGhpcy5ib25lc1tjXTtpZihnLm5hbWU9PT1hKXJldHVybiBnfX19KTtaaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOlpoLGlzQm9uZTohMH0pO0ZiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtGYi5wcm90b3R5cGUuY29uc3RydWN0b3I9RmI7RmIucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWw9ITA7RmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubGluZXdpZHRoPWEubGluZXdpZHRoO3RoaXMubGluZWNhcD1hLmxpbmVjYXA7dGhpcy5saW5lam9pbj1hLmxpbmVqb2luO3JldHVybiB0aGlzfTt2YXIgeGs9bmV3IGsseWs9bmV3IGssems9bmV3IHEsd2g9bmV3IEQscGc9bmV3IEc7WGIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlhiLGlzTGluZTohMCxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT0KYS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVswXSxnPTEsdD1jLmNvdW50O2c8dDtnKyspeGsuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGctMSkseWsuZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLGVbZ109ZVtnLTFdLGVbZ10rPXhrLmRpc3RhbmNlVG8oeWspO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBiYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihhLmlzR2VvbWV0cnkpZm9yKGM9YS52ZXJ0aWNlcyxlPWEubGluZURpc3RhbmNlcyxlWzBdPTAsZz0xLHQ9Yy5sZW5ndGg7Zzx0O2crKyllW2ddPWVbZy0xXSxlW2ddKz1jW2ctMV0uZGlzdGFuY2VUbyhjW2ddKTtyZXR1cm4gdGhpc30scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEubGluZVByZWNpc2lvbiwKZz10aGlzLmdlb21ldHJ5LHQ9dGhpcy5tYXRyaXhXb3JsZDtudWxsPT09Zy5ib3VuZGluZ1NwaGVyZSYmZy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGcuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NCh0KTtwZy5yYWRpdXMrPWU7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSl7emsuZ2V0SW52ZXJzZSh0KTt3aC5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQoemspO2UvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMztlKj1lO3ZhciB2PW5ldyBrLHo9bmV3IGs7dD1uZXcgazt2YXIgRT1uZXcgayxGPXRoaXMmJnRoaXMuaXNMaW5lU2VnbWVudHM/MjoxO2lmKGcuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIEk9Zy5pbmRleCxNPWcuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09SSl7ST1JLmFycmF5O2c9MDtmb3IodmFyIFA9SS5sZW5ndGgtMTtnPFA7Zys9Ril7dmFyIFE9SVtnKzFdO3YuZnJvbUFycmF5KE0sCjMqSVtnXSk7ei5mcm9tQXJyYXkoTSwzKlEpO1E9d2guZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSx0KTtRPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxRPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFE8YS5uZWFyfHxRPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlEscG9pbnQ6dC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19ZWxzZSBmb3IoZz0wLFA9TS5sZW5ndGgvMy0xO2c8UDtnKz1GKXYuZnJvbUFycmF5KE0sMypnKSx6LmZyb21BcnJheShNLDMqZyszKSxRPXdoLmRpc3RhbmNlU3FUb1NlZ21lbnQodix6LEUsdCksUT5lfHwoRS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksUT1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhFKSxRPGEubmVhcnx8UT5hLmZhcnx8Yy5wdXNoKHtkaXN0YW5jZTpRLHBvaW50OnQuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksCmluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfWVsc2UgaWYoZy5pc0dlb21ldHJ5KWZvcih2PWcudmVydGljZXMsej12Lmxlbmd0aCxnPTA7Zzx6LTE7Zys9RilRPXdoLmRpc3RhbmNlU3FUb1NlZ21lbnQodltnXSx2W2crMV0sRSx0KSxRPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxRPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFE8YS5uZWFyfHxRPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlEscG9pbnQ6dC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDpnLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7dmFyIHhoPW5ldyBrLHloPW5ldyBrO0liLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOkliLGlzTGluZVNlZ21lbnRzOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PWEuaW5kZXgpe2Zvcih2YXIgYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sZT1bXSxnPTAsdD1jLmNvdW50O2c8dDtnKz0yKXhoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKSx5aC5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZysxKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3hoLmRpc3RhbmNlVG8oeWgpO2EuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBiYShlLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9CmEubGluZURpc3RhbmNlcyxnPTAsdD1jLmxlbmd0aDtnPHQ7Zys9Mil4aC5jb3B5KGNbZ10pLHloLmNvcHkoY1tnKzFdKSxlW2ddPTA9PT1nPzA6ZVtnLTFdLGVbZysxXT1lW2ddK3hoLmRpc3RhbmNlVG8oeWgpO3JldHVybiB0aGlzfX0pO0dnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csaXNMaW5lTG9vcDohMH0pO0NjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtDYy5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2M7Q2MucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Q2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7Uy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMuc2l6ZT1hLnNpemU7dGhpcy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb247dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7CnJldHVybiB0aGlzfTt2YXIgQWs9bmV3IHEsYWk9bmV3IEQscWc9bmV3IEcsemg9bmV3IGs7RWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVlLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdlb21ldHJ5LGc9dGhpcy5tYXRyaXhXb3JsZCx0PWEucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7cWcuY29weShlLmJvdW5kaW5nU3BoZXJlKTtxZy5hcHBseU1hdHJpeDQoZyk7cWcucmFkaXVzKz10O2lmKCExIT09YS5yYXkuaW50ZXJzZWN0c1NwaGVyZShxZykpaWYoQWsuZ2V0SW52ZXJzZShnKSxhaS5jb3B5KGEucmF5KS5hcHBseU1hdHJpeDQoQWspLHQvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyx0Kj10LGUuaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHY9ZS5pbmRleDsKZT1lLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PXYpe3ZhciB6PXYuYXJyYXk7dj0wO2Zvcih2YXIgRT16Lmxlbmd0aDt2PEU7disrKXt2YXIgRj16W3ZdO3poLmZyb21BcnJheShlLDMqRik7JGgoemgsRix0LGcsYSxjLHRoaXMpfX1lbHNlIGZvcih2PTAsej1lLmxlbmd0aC8zO3Y8ejt2KyspemguZnJvbUFycmF5KGUsMyp2KSwkaCh6aCx2LHQsZyxhLGMsdGhpcyl9ZWxzZSBmb3IoZT1lLnZlcnRpY2VzLHY9MCx6PWUubGVuZ3RoO3Y8ejt2KyspJGgoZVt2XSx2LHQsZyxhLGMsdGhpcyl9LHVwZGF0ZU1vcnBoVGFyZ2V0czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnk7aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXthPWEubW9ycGhBdHRyaWJ1dGVzO3ZhciBjPU9iamVjdC5rZXlzKGEpO2lmKDA8Yy5sZW5ndGgpe3ZhciBlPWFbY1swXV07aWYodm9pZCAwIT09ZSlmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9Cnt9LGE9MCxjPWUubGVuZ3RoO2E8YzthKyspe3ZhciBnPWVbYV0ubmFtZXx8U3RyaW5nKGEpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbZ109YX19fWVsc2UgYT1hLm1vcnBoVGFyZ2V0cyx2b2lkIDAhPT1hJiYwPGEubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5Qb2ludHMudXBkYXRlTW9ycGhUYXJnZXRzKCkgZG9lcyBub3Qgc3VwcG9ydCBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7YmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGlzVmlkZW9UZXh0dXJlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW1hZ2U7YS5yZWFkeVN0YXRlPj0KYS5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX0pO0ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtGZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RmU7RmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO0VmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RWYucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO0hlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7CkhlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtHZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0dmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HZjttYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO21jLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tYztIZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtJZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0lmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZjtUZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO1RkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZDtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KSmY7SmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtKZS5wcm90b3R5cGUuY29uc3RydWN0b3I9SmU7S2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtLZi5wcm90b3R5cGUuY29uc3RydWN0b3I9S2Y7S2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtLZS5wcm90b3R5cGUuY29uc3RydWN0b3I9S2U7TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtMZi5wcm90b3R5cGUuY29uc3RydWN0b3I9TGY7VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtVZC5wcm90b3R5cGUuY29uc3RydWN0b3I9VWQ7VWQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGF9O01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7Ck1mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZjtMZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0xlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MZTtOZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO05mLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZjtNZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO01lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1NZTt2YXIgZG49e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGEsYyxlKXtlPWV8fDI7dmFyIGc9YyYmYy5sZW5ndGgsdD1nP2NbMF0qZTphLmxlbmd0aCx2PVBqKGEsMCx0LGUsITApLHo9W107aWYoIXZ8fHYubmV4dD09PXYucHJldilyZXR1cm4gejtnJiYodj15bShhLGMsdixlKSk7aWYoYS5sZW5ndGg+ODAqZSl7dmFyIEU9Yz1hWzBdO3ZhciBGPWc9YVsxXTtmb3IodmFyIEk9ZTtJPHQ7SSs9ZSl7dmFyIE09YVtJXTt2YXIgUD1hW0krMV07TTxFJiYoRT1NKTtQPEYmJihGPVApOwpNPmMmJihjPU0pO1A+ZyYmKGc9UCl9TT1NYXRoLm1heChjLUUsZy1GKTtNPTAhPT1NPzEvTTowfVFmKHYseixlLEUsRixNKTtyZXR1cm4gen19LGdkPXthcmVhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hLmxlbmd0aCxlPTAsZz1jLTEsdD0wO3Q8YztnPXQrKyllKz1hW2ddLngqYVt0XS55LWFbdF0ueCphW2ddLnk7cmV0dXJuLjUqZX0saXNDbG9ja1dpc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIDA+Z2QuYXJlYShhKX0sdHJpYW5ndWxhdGVTaGFwZTpmdW5jdGlvbihhLGMpe3ZhciBlPVtdLGc9W10sdD1bXTtUaihhKTtVaihlLGEpO3ZhciB2PWEubGVuZ3RoO2MuZm9yRWFjaChUaik7Zm9yKGE9MDthPGMubGVuZ3RoO2ErKylnLnB1c2godiksdis9Y1thXS5sZW5ndGgsVWooZSxjW2FdKTtjPWRuLnRyaWFuZ3VsYXRlKGUsZyk7Zm9yKGE9MDthPGMubGVuZ3RoO2ErPTMpdC5wdXNoKGMuc2xpY2UoYSxhKzMpKTtyZXR1cm4gdH19O1dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7CldkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1XZDtXZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eGEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGEpfTt2YXIgR209e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYSxjLGUsZyx0KXthPWNbMypnXTtnPWNbMypnKzFdO3ZhciB2PWNbMyp0XTt0PWNbMyp0KzFdO3JldHVybltuZXcgZihjWzMqZV0sY1szKmUrMV0pLG5ldyBmKGEsZyksbmV3IGYodix0KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihhLApjLGUsZyx0LHYpe2E9Y1szKmVdO3ZhciB6PWNbMyplKzFdO2U9Y1szKmUrMl07dmFyIEU9Y1szKmddLEY9Y1szKmcrMV07Zz1jWzMqZysyXTt2YXIgST1jWzMqdF0sTT1jWzMqdCsxXTt0PWNbMyp0KzJdO3ZhciBQPWNbMyp2XSxRPWNbMyp2KzFdO2M9Y1szKnYrMl07cmV0dXJuLjAxPk1hdGguYWJzKHotRik/W25ldyBmKGEsMS1lKSxuZXcgZihFLDEtZyksbmV3IGYoSSwxLXQpLG5ldyBmKFAsMS1jKV06W25ldyBmKHosMS1lKSxuZXcgZihGLDEtZyksbmV3IGYoTSwxLXQpLG5ldyBmKFEsMS1jKV19fTtTZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUYy5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtFZC5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZC5wcm90b3R5cGUuY29uc3RydWN0b3I9RWQ7VWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtVZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VWY7UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7UWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtRZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UWU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7WGQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXhhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gV2oodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywKYSl9O1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlkO1lkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIFdqKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYSl9O1JlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJlO1pkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVpkO2hkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7aGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWhkO1dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpkLnByb3RvdHlwZSk7V2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhkLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpYZjtZZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1lmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZjtTZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZTt2YXIgamM9T2JqZWN0LmZyZWV6ZSh7V2lyZWZyYW1lR2VvbWV0cnk6R2UsUGFyYW1ldHJpY0dlb21ldHJ5OkZmLFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpIZSxUZXRyYWhlZHJvbkdlb21ldHJ5OkhmLFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SWUsT2N0YWhlZHJvbkdlb21ldHJ5OklmLE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpUZCxJY29zYWhlZHJvbkdlb21ldHJ5OkpmLEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6SmUsRG9kZWNhaGVkcm9uR2VvbWV0cnk6S2YsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6S2UsUG9seWhlZHJvbkdlb21ldHJ5OkdmLFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTptYyxUdWJlR2VvbWV0cnk6TGYsClR1YmVCdWZmZXJHZW9tZXRyeTpVZCxUb3J1c0tub3RHZW9tZXRyeTpNZixUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTpMZSxUb3J1c0dlb21ldHJ5Ok5mLFRvcnVzQnVmZmVyR2VvbWV0cnk6TWUsVGV4dEdlb21ldHJ5OlNmLFRleHRCdWZmZXJHZW9tZXRyeTpPZSxTcGhlcmVHZW9tZXRyeTpUZixTcGhlcmVCdWZmZXJHZW9tZXRyeTpFZCxSaW5nR2VvbWV0cnk6VWYsUmluZ0J1ZmZlckdlb21ldHJ5OlBlLFBsYW5lR2VvbWV0cnk6dWQsUGxhbmVCdWZmZXJHZW9tZXRyeTpOYyxMYXRoZUdlb21ldHJ5OlZmLExhdGhlQnVmZmVyR2VvbWV0cnk6UWUsU2hhcGVHZW9tZXRyeTpYZCxTaGFwZUJ1ZmZlckdlb21ldHJ5OllkLEV4dHJ1ZGVHZW9tZXRyeTpXZCxFeHRydWRlQnVmZmVyR2VvbWV0cnk6VGMsRWRnZXNHZW9tZXRyeTpSZSxDb25lR2VvbWV0cnk6V2YsQ29uZUJ1ZmZlckdlb21ldHJ5OlhmLEN5bGluZGVyR2VvbWV0cnk6WmQsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpoZCxDaXJjbGVHZW9tZXRyeTpZZiwKQ2lyY2xlQnVmZmVyR2VvbWV0cnk6U2UsQm94R2VvbWV0cnk6U2EsQm94QnVmZmVyR2VvbWV0cnk6WGF9KTskZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwOyRkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTtyZXR1cm4gdGhpc307VGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocWIucHJvdG90eXBlKTtUZS5wcm90b3R5cGUuY29uc3RydWN0b3I9VGU7VGUucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7VWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtVYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMucm91Z2huZXNzPWEucm91Z2huZXNzO3RoaXMubWV0YWxuZXNzPWEubWV0YWxuZXNzO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLmVtaXNzaXZlLmNvcHkoYS5lbWlzc2l2ZSk7dGhpcy5lbWlzc2l2ZU1hcD1hLmVtaXNzaXZlTWFwO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpOwp0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhczt0aGlzLnJvdWdobmVzc01hcD1hLnJvdWdobmVzc01hcDt0aGlzLm1ldGFsbmVzc01hcD1hLm1ldGFsbmVzc01hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPQphLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVWMucHJvdG90eXBlKTthZS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWU7YWUucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITA7YWUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7VWMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMuY2xlYXJjb2F0PWEuY2xlYXJjb2F0O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWEuY2xlYXJjb2F0Um91Z2huZXNzO3RoaXMuc2hlZW49YS5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IEgpLmNvcHkoYS5zaGVlbik6bnVsbDt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1hLmNsZWFyY29hdE5vcm1hbE1hcDt0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoYS5jbGVhcmNvYXROb3JtYWxTY2FsZSk7CnRoaXMudHJhbnNwYXJlbmN5PWEudHJhbnNwYXJlbmN5O3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1MucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLnNwZWN1bGFyLmNvcHkoYS5zcGVjdWxhcik7dGhpcy5zaGluaW5lc3M9YS5zaGluaW5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KYS5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9YS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KYS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtiZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShEYy5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0RjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyYWRpZW50TWFwPWEuZ3JhZGllbnRNYXA7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPQohMDtjZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307CmRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKTtkZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGU7ZGUucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9YS5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWEuYWxwaGFNYXA7dGhpcy5lbnZNYXA9CmEuZW52TWFwO3RoaXMuY29tYmluZT1hLmNvbWJpbmU7dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89YS5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWEud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtlZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTLnByb3RvdHlwZSk7ZWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWVlO2VlLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMDtlZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGNhcD1hLm1hdGNhcDt0aGlzLm1hcD1hLm1hcDt0aGlzLmJ1bXBNYXA9YS5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWEuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWEubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGEubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2ZlLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShGYi5wcm90b3R5cGUpO2ZlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZTtmZS5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7ZmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7RmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuc2NhbGU9YS5zY2FsZTt0aGlzLmRhc2hTaXplPWEuZGFzaFNpemU7dGhpcy5nYXBTaXplPWEuZ2FwU2l6ZTtyZXR1cm4gdGhpc307dmFyIGVuPU9iamVjdC5mcmVlemUoe1NoYWRvd01hdGVyaWFsOiRkLFNwcml0ZU1hdGVyaWFsOkRkLFJhd1NoYWRlck1hdGVyaWFsOlRlLFNoYWRlck1hdGVyaWFsOnFiLFBvaW50c01hdGVyaWFsOkNjLE1lc2hQaHlzaWNhbE1hdGVyaWFsOmFlLE1lc2hTdGFuZGFyZE1hdGVyaWFsOlVjLE1lc2hQaG9uZ01hdGVyaWFsOkRjLE1lc2hUb29uTWF0ZXJpYWw6YmUsTWVzaE5vcm1hbE1hdGVyaWFsOmNlLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ZGUsTWVzaERlcHRoTWF0ZXJpYWw6eWQsCk1lc2hEaXN0YW5jZU1hdGVyaWFsOnpkLE1lc2hCYXNpY01hdGVyaWFsOk4sTWVzaE1hdGNhcE1hdGVyaWFsOmVlLExpbmVEYXNoZWRNYXRlcmlhbDpmZSxMaW5lQmFzaWNNYXRlcmlhbDpGYixNYXRlcmlhbDpTfSksVmI9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBWYi5pc1R5cGVkQXJyYXkoYSk/bmV3IGEuY29uc3RydWN0b3IoYS5zdWJhcnJheShjLHZvaWQgMCE9PWU/ZTphLmxlbmd0aCkpOmEuc2xpY2UoYyxlKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4hYXx8IWUmJmEuY29uc3RydWN0b3I9PT1jP2E6Im51bWJlciI9PT10eXBlb2YgYy5CWVRFU19QRVJfRUxFTUVOVD9uZXcgYyhhKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKX0saXNUeXBlZEFycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYSkmJiEoYSBpbnN0YW5jZW9mIERhdGFWaWV3KX0sZ2V0S2V5ZnJhbWVPcmRlcjpmdW5jdGlvbihhKXtmb3IodmFyIGM9CmEubGVuZ3RoLGU9QXJyYXkoYyksZz0wO2chPT1jOysrZyllW2ddPWc7ZS5zb3J0KGZ1bmN0aW9uKHQsdil7cmV0dXJuIGFbdF0tYVt2XX0pO3JldHVybiBlfSxzb3J0ZWRBcnJheTpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPWEubGVuZ3RoLHQ9bmV3IGEuY29uc3RydWN0b3IoZyksdj0wLHo9MDt6IT09ZzsrK3YpZm9yKHZhciBFPWVbdl0qYyxGPTA7RiE9PWM7KytGKXRbeisrXT1hW0UrRl07cmV0dXJuIHR9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgdD0xLHY9YVswXTt2b2lkIDAhPT12JiZ2b2lkIDA9PT12W2ddOyl2PWFbdCsrXTtpZih2b2lkIDAhPT12KXt2YXIgej12W2ddO2lmKHZvaWQgMCE9PXopaWYoQXJyYXkuaXNBcnJheSh6KSl7ZG8gej12W2ddLHZvaWQgMCE9PXomJihjLnB1c2godi50aW1lKSxlLnB1c2guYXBwbHkoZSx6KSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZSBpZih2b2lkIDAhPT16LnRvQXJyYXkpe2RvIHo9dltnXSwKdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLHoudG9BcnJheShlLGUubGVuZ3RoKSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9ZWxzZXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaCh6KSksdj1hW3QrK107d2hpbGUodm9pZCAwIT09dil9fX19O09iamVjdC5hc3NpZ24ocmMucHJvdG90eXBlLHtldmFsdWF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxlPXRoaXMuX2NhY2hlZEluZGV4LGc9Y1tlXSx0PWNbZS0xXTthOntiOntjOntkOmlmKCEoYTxnKSl7Zm9yKHZhciB2PWUrMjs7KXtpZih2b2lkIDA9PT1nKXtpZihhPHQpYnJlYWsgZDt0aGlzLl9jYWNoZWRJbmRleD1lPWMubGVuZ3RoO3JldHVybiB0aGlzLmFmdGVyRW5kXyhlLTEsYSx0KX1pZihlPT09dilicmVhazt0PWc7Zz1jWysrZV07aWYoYTxnKWJyZWFrIGJ9Zz1jLmxlbmd0aDticmVhayBjfWlmKGE+PXQpYnJlYWsgYTtlbHNle3Y9Y1sxXTthPHYmJgooZT0yLHQ9dik7Zm9yKHY9ZS0yOzspe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKGU9PT12KWJyZWFrO2c9dDt0PWNbLS1lLTFdO2lmKGE+PXQpYnJlYWsgYn1nPWU7ZT0wfX1mb3IoO2U8ZzspdD1lK2c+Pj4xLGE8Y1t0XT9nPXQ6ZT10KzE7Zz1jW2VdO3Q9Y1tlLTFdO2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxhLGcpO2lmKHZvaWQgMD09PWcpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGgsdGhpcy5hZnRlckVuZF8oZS0xLHQsYSl9dGhpcy5fY2FjaGVkSW5kZXg9ZTt0aGlzLmludGVydmFsQ2hhbmdlZF8oZSx0LGcpfXJldHVybiB0aGlzLmludGVycG9sYXRlXyhlLHQsYSxnKX0sc2V0dGluZ3M6bnVsbCxEZWZhdWx0U2V0dGluZ3NfOnt9LGdldFNldHRpbmdzXzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfHwKdGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucmVzdWx0QnVmZmVyLGU9dGhpcy5zYW1wbGVWYWx1ZXMsZz10aGlzLnZhbHVlU2l6ZTthKj1nO2Zvcih2YXIgdD0wO3QhPT1nOysrdCljW3RdPWVbYSt0XTtyZXR1cm4gY30saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIik7fSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKCl7fX0pO09iamVjdC5hc3NpZ24ocmMucHJvdG90eXBlLHtiZWZvcmVTdGFydF86cmMucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sYWZ0ZXJFbmRfOnJjLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVffSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShyYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxEZWZhdWx0U2V0dGluZ3NfOntlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsdD1hLTIsdj1hKzEsej1nW3RdLEU9Z1t2XTtpZih2b2lkIDA9PT16KXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6dD1hO3o9MipjLWU7YnJlYWs7Y2FzZSAyNDAyOnQ9Zy5sZW5ndGgtMjt6PWMrZ1t0XS1nW3QrMV07YnJlYWs7ZGVmYXVsdDp0PWEsej1lfWlmKHZvaWQgMD09PUUpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIDI0MDE6dj1hO0U9MiplLWM7YnJlYWs7Y2FzZSAyNDAyOnY9MTtFPWUrZ1sxXS1nWzBdO2JyZWFrO2RlZmF1bHQ6dj1hLTEsRT1jfWE9LjUqKGUtYyk7Zz10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWEvKGMteik7dGhpcy5fd2VpZ2h0TmV4dD1hLyhFLWUpO3RoaXMuX29mZnNldFByZXY9dCpnO3RoaXMuX29mZnNldE5leHQ9dipnfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHQ9dGhpcy5yZXN1bHRCdWZmZXIsCnY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEteixGPXRoaXMuX29mZnNldFByZXYsST10aGlzLl9vZmZzZXROZXh0LE09dGhpcy5fd2VpZ2h0UHJldixQPXRoaXMuX3dlaWdodE5leHQsUT0oZS1jKS8oZy1jKTtlPVEqUTtnPWUqUTtjPS1NKmcrMipNKmUtTSpRO009KDErTSkqZysoLTEuNS0yKk0pKmUrKC0uNStNKSpRKzE7UT0oLTEtUCkqZysoMS41K1ApKmUrLjUqUTtQPVAqZy1QKmU7Zm9yKGU9MDtlIT09ejsrK2UpdFtlXT1jKnZbRitlXStNKnZbRStlXStRKnZbYStlXStQKnZbSStlXTtyZXR1cm4gdH19KTtaZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHJjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlpmLGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLnJlc3VsdEJ1ZmZlcix2PXRoaXMuc2FtcGxlVmFsdWVzLHo9dGhpcy52YWx1ZVNpemU7YSo9ejt2YXIgRT1hLXo7Yz0oZS1jKS8oZy0KYyk7ZT0xLWM7Zm9yKGc9MDtnIT09ejsrK2cpdFtnXT12W0UrZ10qZSt2W2ErZ10qYztyZXR1cm4gdH19KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHJjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGEtMSl9fSk7T2JqZWN0LmFzc2lnbihaYix7dG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPWEuY29uc3RydWN0b3I7aWYodm9pZCAwIT09Yy50b0pTT04pYz1jLnRvSlNPTihhKTtlbHNle2M9e25hbWU6YS5uYW1lLHRpbWVzOlZiLmNvbnZlcnRBcnJheShhLnRpbWVzLEFycmF5KSx2YWx1ZXM6VmIuY29udmVydEFycmF5KGEudmFsdWVzLEFycmF5KX07dmFyIGU9YS5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PWEuRGVmYXVsdEludGVycG9sYXRpb24mJihjLmludGVycG9sYXRpb249ZSl9Yy50eXBlPWEuVmFsdWVUeXBlTmFtZTtyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKFpiLnByb3RvdHlwZSwKe2NvbnN0cnVjdG9yOlpiLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFpmKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSGcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxzZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDIzMDA6dmFyIGM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKYnJlYWs7Y2FzZSAyMzAxOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmM9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09Yyl7Yz0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KWlmKGEhPT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTtlbHNlIHRocm93IEVycm9yKGMpO2NvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGMpO3JldHVybiB0aGlzfXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9YztyZXR1cm4gdGhpc30sZ2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNyZWF0ZUludGVycG9sYW50KXtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6cmV0dXJuIDIzMDA7CmNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9LHNoaWZ0OmZ1bmN0aW9uKGEpe2lmKDAhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKz1hO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtpZigxIT09YSlmb3IodmFyIGM9dGhpcy50aW1lcyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2UpY1tlXSo9YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnRpbWVzLGc9ZS5sZW5ndGgsdD0wLHY9Zy0xO3QhPT1nJiZlW3RdPGE7KSsrdDtmb3IoOy0xIT09diYmZVt2XT5jOyktLXY7Kyt2O2lmKDAhPT10fHx2IT09Zyl0Pj12JiYodj1NYXRoLm1heCh2LAoxKSx0PXYtMSksYT10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9VmIuYXJyYXlTbGljZShlLHQsdiksdGhpcy52YWx1ZXM9VmIuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyx0KmEsdiphKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYT0hMCxjPXRoaXMuZ2V0VmFsdWVTaXplKCk7MCE9PWMtTWF0aC5mbG9vcihjKSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLGE9ITEpO3ZhciBlPXRoaXMudGltZXM7Yz10aGlzLnZhbHVlczt2YXIgZz1lLmxlbmd0aDswPT09ZyYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksYT0hMSk7Zm9yKHZhciB0PW51bGwsdj0wO3YhPT1nO3YrKyl7dmFyIHo9ZVt2XTtpZigibnVtYmVyIj09PXR5cGVvZiB6JiZpc05hTih6KSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwKdGhpcyx2LHopO2E9ITE7YnJlYWt9aWYobnVsbCE9PXQmJnQ+eil7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHYseix0KTthPSExO2JyZWFrfXQ9en1pZih2b2lkIDAhPT1jJiZWYi5pc1R5cGVkQXJyYXkoYykpZm9yKHY9MCxlPWMubGVuZ3RoO3YhPT1lOysrdilpZihnPWNbdl0saXNOYU4oZykpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsdixnKTthPSExO2JyZWFrfXJldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnRpbWVzLGM9dGhpcy52YWx1ZXMsZT10aGlzLmdldFZhbHVlU2l6ZSgpLGc9MjMwMj09PXRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpLHQ9MSx2PWEubGVuZ3RoLTEsej0xO3o8djsrK3ope3ZhciBFPSExLEY9YVt6XTtpZihGIT09YVt6KzFdJiYoMSE9PXp8fEYhPT1GWzBdKSlpZihnKUU9ITA7CmVsc2V7dmFyIEk9eiplLE09SS1lLFA9SStlO2ZvcihGPTA7RiE9PWU7KytGKXt2YXIgUT1jW0krRl07aWYoUSE9PWNbTStGXXx8USE9PWNbUCtGXSl7RT0hMDticmVha319fWlmKEUpe2lmKHohPT10KWZvcihhW3RdPWFbel0sRT16KmUsST10KmUsRj0wO0YhPT1lOysrRiljW0krRl09Y1tFK0ZdOysrdH19aWYoMDx2KXthW3RdPWFbdl07RT12KmU7ST10KmU7Zm9yKEY9MDtGIT09ZTsrK0YpY1tJK0ZdPWNbRStGXTsrK3R9dCE9PWEubGVuZ3RoJiYodGhpcy50aW1lcz1WYi5hcnJheVNsaWNlKGEsMCx0KSx0aGlzLnZhbHVlcz1WYi5hcnJheVNsaWNlKGMsMCx0KmUpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYT1WYi5hcnJheVNsaWNlKHRoaXMudGltZXMsMCksYz1WYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLDApO2E9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLGEsYyk7YS5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50O3JldHVybiBhfX0pOwpKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO0tnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6S2csVmFsdWVUeXBlTmFtZToiY29sb3IifSk7VWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpVZSxWYWx1ZVR5cGVOYW1lOiJudW1iZXIifSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShyYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYSwKYyxlLGcpe3ZhciB0PXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O2M9KGUtYykvKGctYyk7Zm9yKGU9YSt6O2EhPT1lO2ErPTQpaC5zbGVycEZsYXQodCwwLHYsYS16LHYsYSxjKTtyZXR1cm4gdH19KTskZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRmLFZhbHVlVHlwZU5hbWU6InF1YXRlcm5pb24iLERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgTGcodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShaYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxWYWx1ZVR5cGVOYW1lOiJzdHJpbmciLApWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtWZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZlLFZhbHVlVHlwZU5hbWU6InZlY3RvciJ9KTtPYmplY3QuYXNzaWduKHZjLHtwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT1hLnRyYWNrcyxnPTEvKGEuZnBzfHwxKSx0PTAsdj1lLmxlbmd0aDt0IT09djsrK3QpYy5wdXNoKEltKGVbdF0pLnNjYWxlKGcpKTtyZXR1cm4gbmV3IHZjKGEubmFtZSxhLmR1cmF0aW9uLGMpfSx0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT1hLnRyYWNrczthPXtuYW1lOmEubmFtZSxkdXJhdGlvbjphLmR1cmF0aW9uLHRyYWNrczpjLHV1aWQ6YS51dWlkfTtmb3IodmFyIGc9MCx0PWUubGVuZ3RoO2chPT0KdDsrK2cpYy5wdXNoKFpiLnRvSlNPTihlW2ddKSk7cmV0dXJuIGF9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGEsYyxlLGcpe2Zvcih2YXIgdD1jLmxlbmd0aCx2PVtdLHo9MDt6PHQ7eisrKXt2YXIgRT1bXSxGPVtdO0UucHVzaCgoeit0LTEpJXQseiwoeisxKSV0KTtGLnB1c2goMCwxLDApO3ZhciBJPVZiLmdldEtleWZyYW1lT3JkZXIoRSk7RT1WYi5zb3J0ZWRBcnJheShFLDEsSSk7Rj1WYi5zb3J0ZWRBcnJheShGLDEsSSk7Z3x8MCE9PUVbMF18fChFLnB1c2godCksRi5wdXNoKEZbMF0pKTt2LnB1c2goKG5ldyBVZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2Nbel0ubmFtZSsiXSIsRSxGKSkuc2NhbGUoMS9lKSl9cmV0dXJuIG5ldyB2YyhhLC0xLHYpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YTtBcnJheS5pc0FycmF5KGEpfHwoZT1hLmdlb21ldHJ5JiZhLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGEuYW5pbWF0aW9ucyk7Zm9yKGE9CjA7YTxlLmxlbmd0aDthKyspaWYoZVthXS5uYW1lPT09YylyZXR1cm4gZVthXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYSxjLGUpe2Zvcih2YXIgZz17fSx0PS9eKFtcdy1dKj8pKFtcZF0rKSQvLHY9MCx6PWEubGVuZ3RoO3Y8ejt2Kyspe3ZhciBFPWFbdl0sRj1FLm5hbWUubWF0Y2godCk7aWYoRiYmMTxGLmxlbmd0aCl7dmFyIEk9RlsxXTsoRj1nW0ldKXx8KGdbSV09Rj1bXSk7Ri5wdXNoKEUpfX1hPVtdO2ZvcihJIGluIGcpYS5wdXNoKHZjLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKEksZ1tJXSxjLGUpKTtyZXR1cm4gYX0scGFyc2VBbmltYXRpb246ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKGVhLGRhLHJhLHBhLHFhKXtpZigwIT09cmEubGVuZ3RoKXt2YXIgdWE9W10sbmE9W107VmIuZmxhdHRlbkpTT04ocmEsdWEsbmEscGEpOzAhPT11YS5sZW5ndGgmJnFhLnB1c2gobmV3IGVhKGRhLHVhLG5hKSl9fQppZighYSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO3ZhciBnPVtdLHQ9YS5uYW1lfHwiZGVmYXVsdCIsdj1hLmxlbmd0aHx8LTEsej1hLmZwc3x8MzA7YT1hLmhpZXJhcmNoeXx8W107Zm9yKHZhciBFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV0ua2V5cztpZihGJiYwIT09Ri5sZW5ndGgpaWYoRlswXS5tb3JwaFRhcmdldHMpe3Y9e307Zm9yKHZhciBJPTA7STxGLmxlbmd0aDtJKyspaWYoRltJXS5tb3JwaFRhcmdldHMpZm9yKHZhciBNPTA7TTxGW0ldLm1vcnBoVGFyZ2V0cy5sZW5ndGg7TSsrKXZbRltJXS5tb3JwaFRhcmdldHNbTV1dPS0xO2Zvcih2YXIgUCBpbiB2KXt2YXIgUT1bXSxVPVtdO2ZvcihNPTA7TSE9PUZbSV0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK00pe3ZhciBWPUZbSV07US5wdXNoKFYudGltZSk7VS5wdXNoKFYubW9ycGhUYXJnZXQ9PT1QPzE6MCl9Zy5wdXNoKG5ldyBVZSgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIrClArIl0iLFEsVSkpfXY9di5sZW5ndGgqKHp8fDEpfWVsc2UgST0iLmJvbmVzWyIrY1tFXS5uYW1lKyJdIixlKFZlLEkrIi5wb3NpdGlvbiIsRiwicG9zIixnKSxlKCRmLEkrIi5xdWF0ZXJuaW9uIixGLCJyb3QiLGcpLGUoVmUsSSsiLnNjYWxlIixGLCJzY2wiLGcpfXJldHVybiAwPT09Zy5sZW5ndGg/bnVsbDpuZXcgdmModCx2LGcpfX0pO09iamVjdC5hc3NpZ24odmMucHJvdG90eXBlLHtyZXNldER1cmF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz0wLGU9dGhpcy50cmFja3MubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9dGhpcy50cmFja3NbY107YT1NYXRoLm1heChhLGcudGltZXNbZy50aW1lcy5sZW5ndGgtMV0pfXRoaXMuZHVyYXRpb249YTtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQohMCxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWE9YSYmdGhpcy50cmFja3NbY10udmFsaWRhdGUoKTtyZXR1cm4gYX0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMudHJhY2tzLmxlbmd0aDthKyspdGhpcy50cmFja3NbYV0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYz0wO2M8dGhpcy50cmFja3MubGVuZ3RoO2MrKylhLnB1c2godGhpcy50cmFja3NbY10uY2xvbmUoKSk7cmV0dXJuIG5ldyB2Yyh0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbixhKX19KTt2YXIga2U9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGEsYyl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW2FdPWMpfSxnZXQ6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbYV19LHJlbW92ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5maWxlc1thXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPQp7fX19LFhqPW5ldyBlaTtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbigpe30scGFyc2U6ZnVuY3Rpb24oKXt9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGEpe3RoaXMuY3Jvc3NPcmlnaW49YTtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihhKXt0aGlzLnBhdGg9YTtyZXR1cm4gdGhpc30sc2V0UmVzb3VyY2VQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucmVzb3VyY2VQYXRoPWE7cmV0dXJuIHRoaXN9fSk7RGIuSGFuZGxlcnM9e2hhbmRsZXJzOltdLGFkZDpmdW5jdGlvbihhLGMpe3RoaXMuaGFuZGxlcnMucHVzaChhLGMpfSxnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuaGFuZGxlcnMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrPTIpe3ZhciB0PWNbZSsxXTtpZihjW2VdLnRlc3QoYSkpcmV0dXJuIHR9cmV0dXJuIG51bGx9fTt2YXIgTWM9e307d2MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp3YywKbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgdD10aGlzLHY9a2UuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHQubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7aWYodm9pZCAwIT09TWNbYV0pTWNbYV0ucHVzaCh7b25Mb2FkOmMsb25Qcm9ncmVzczplLG9uRXJyb3I6Z30pO2Vsc2V7dmFyIHo9YS5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7aWYoeil7ZT16WzFdO3ZhciBFPSEhelsyXTt6PXpbM107ej1kZWNvZGVVUklDb21wb25lbnQoeik7RSYmKHo9YXRvYih6KSk7dHJ5e3ZhciBGPSh0aGlzLnJlc3BvbnNlVHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKEYpe2Nhc2UgImFycmF5YnVmZmVyIjpjYXNlICJibG9iIjp2YXIgST0KbmV3IFVpbnQ4QXJyYXkoei5sZW5ndGgpO2ZvcihFPTA7RTx6Lmxlbmd0aDtFKyspSVtFXT16LmNoYXJDb2RlQXQoRSk7dmFyIE09ImJsb2IiPT09Rj9uZXcgQmxvYihbSS5idWZmZXJdLHt0eXBlOmV9KTpJLmJ1ZmZlcjticmVhaztjYXNlICJkb2N1bWVudCI6TT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHosZSk7YnJlYWs7Y2FzZSAianNvbiI6TT1KU09OLnBhcnNlKHopO2JyZWFrO2RlZmF1bHQ6TT16fXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKE0pO3QubWFuYWdlci5pdGVtRW5kKGEpfSwwKX1jYXRjaChRKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZyYmZyhRKTt0Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3QubWFuYWdlci5pdGVtRW5kKGEpfSwwKX19ZWxzZXtNY1thXT1bXTtNY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7dmFyIFA9bmV3IFhNTEh0dHBSZXF1ZXN0O1Aub3BlbigiR0VUIixhLCEwKTtQLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLApmdW5jdGlvbihRKXt2YXIgVT10aGlzLnJlc3BvbnNlO2tlLmFkZChhLFUpO3ZhciBWPU1jW2FdO2RlbGV0ZSBNY1thXTtpZigyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKTtmb3IodmFyIGVhPTAsZGE9Vi5sZW5ndGg7ZWE8ZGE7ZWErKyl7dmFyIHJhPVZbZWFdO2lmKHJhLm9uTG9hZClyYS5vbkxvYWQoVSl9fWVsc2V7ZWE9MDtmb3IoZGE9Vi5sZW5ndGg7ZWE8ZGE7ZWErKylpZihyYT1WW2VhXSxyYS5vbkVycm9yKXJhLm9uRXJyb3IoUSk7dC5tYW5hZ2VyLml0ZW1FcnJvcihhKX10Lm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1AuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFEpe2Zvcih2YXIgVT1NY1thXSxWPTAsZWE9VS5sZW5ndGg7VjxlYTtWKyspe3ZhciBkYT1VW1ZdO2lmKGRhLm9uUHJvZ3Jlc3MpZGEub25Qcm9ncmVzcyhRKX19LAohMSk7UC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oUSl7dmFyIFU9TWNbYV07ZGVsZXRlIE1jW2FdO2Zvcih2YXIgVj0wLGVhPVUubGVuZ3RoO1Y8ZWE7VisrKXt2YXIgZGE9VVtWXTtpZihkYS5vbkVycm9yKWRhLm9uRXJyb3IoUSl9dC5tYW5hZ2VyLml0ZW1FcnJvcihhKTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO1AuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKFEpe3ZhciBVPU1jW2FdO2RlbGV0ZSBNY1thXTtmb3IodmFyIFY9MCxlYT1VLmxlbmd0aDtWPGVhO1YrKyl7dmFyIGRhPVVbVl07aWYoZGEub25FcnJvcilkYS5vbkVycm9yKFEpfXQubWFuYWdlci5pdGVtRXJyb3IoYSk7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFAucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFAud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTsKUC5vdmVycmlkZU1pbWVUeXBlJiZQLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKEUgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKVAuc2V0UmVxdWVzdEhlYWRlcihFLHRoaXMucmVxdWVzdEhlYWRlcltFXSk7UC5zZW5kKG51bGwpfXQubWFuYWdlci5pdGVtU3RhcnQoYSk7cmV0dXJuIFB9fSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5yZXNwb25zZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGEpe3RoaXMud2l0aENyZWRlbnRpYWxzPWE7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGEpe3RoaXMubWltZVR5cGU9YTtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhKXt0aGlzLnJlcXVlc3RIZWFkZXI9YTtyZXR1cm4gdGhpc319KTtmaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpmaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModC5tYW5hZ2VyKTt2LnNldFBhdGgodC5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHQucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz12Yy5wYXJzZShhW2VdKTtjLnB1c2goZyl9cmV0dXJuIGN9fSk7Z2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpnaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHQoUSl7Ri5sb2FkKGFbUV0sZnVuY3Rpb24oVSl7VT12Ll9wYXJzZXIoVSwhMCk7eltRXT17d2lkdGg6VS53aWR0aCxoZWlnaHQ6VS5oZWlnaHQsZm9ybWF0OlUuZm9ybWF0LG1pcG1hcHM6VS5taXBtYXBzfTtJKz0xOzY9PT1JJiYoMT09PVUubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0KMTAwNiksRS5mb3JtYXQ9VS5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxjJiZjKEUpKX0sZSxnKX12YXIgdj10aGlzLHo9W10sRT1uZXcgRmU7RS5pbWFnZT16O3ZhciBGPW5ldyB3Yyh0aGlzLm1hbmFnZXIpO0Yuc2V0UGF0aCh0aGlzLnBhdGgpO0Yuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBJPTAsTT0wLFA9YS5sZW5ndGg7TTxQOysrTSl0KE0pO2Vsc2UgRi5sb2FkKGEsZnVuY3Rpb24oUSl7UT12Ll9wYXJzZXIoUSwhMCk7aWYoUS5pc0N1YmVtYXApZm9yKHZhciBVPVEubWlwbWFwcy5sZW5ndGgvUS5taXBtYXBDb3VudCxWPTA7VjxVO1YrKyl7eltWXT17bWlwbWFwczpbXX07Zm9yKHZhciBlYT0wO2VhPFEubWlwbWFwQ291bnQ7ZWErKyl6W1ZdLm1pcG1hcHMucHVzaChRLm1pcG1hcHNbVipRLm1pcG1hcENvdW50K2VhXSkseltWXS5mb3JtYXQ9US5mb3JtYXQseltWXS53aWR0aD1RLndpZHRoLHpbVl0uaGVpZ2h0PVEuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD0KUS53aWR0aCxFLmltYWdlLmhlaWdodD1RLmhlaWdodCxFLm1pcG1hcHM9US5taXBtYXBzOzE9PT1RLm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNik7RS5mb3JtYXQ9US5mb3JtYXQ7RS5uZWVkc1VwZGF0ZT0hMDtjJiZjKEUpfSxlLGcpO3JldHVybiBFfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TmcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9bmV3IEFiLHo9bmV3IHdjKHRoaXMubWFuYWdlcik7ei5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ei5zZXRQYXRoKHRoaXMucGF0aCk7ei5sb2FkKGEsZnVuY3Rpb24oRSl7aWYoRT10Ll9wYXJzZXIoRSkpdm9pZCAwIT09RS5pbWFnZT92LmltYWdlPUUuaW1hZ2U6dm9pZCAwIT09RS5kYXRhJiYodi5pbWFnZS53aWR0aD1FLndpZHRoLHYuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LHYuaW1hZ2UuZGF0YT1FLmRhdGEpLHYud3JhcFM9CnZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHYud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdi5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNix2Lm1pbkZpbHRlcj12b2lkIDAhPT1FLm1pbkZpbHRlcj9FLm1pbkZpbHRlcjoxMDA4LHYuYW5pc290cm9weT12b2lkIDAhPT1FLmFuaXNvdHJvcHk/RS5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09RS5mb3JtYXQmJih2LmZvcm1hdD1FLmZvcm1hdCksdm9pZCAwIT09RS50eXBlJiYodi50eXBlPUUudHlwZSksdm9pZCAwIT09RS5taXBtYXBzJiYodi5taXBtYXBzPUUubWlwbWFwcyksMT09PUUubWlwbWFwQ291bnQmJih2Lm1pbkZpbHRlcj0xMDA2KSx2Lm5lZWRzVXBkYXRlPSEwLGMmJmModixFKX0sZSxnKTtyZXR1cm4gdn19KTtXZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldlLGxvYWQ6ZnVuY3Rpb24oYSwKYyxlLGcpe2Z1bmN0aW9uIHQoKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHQsITEpO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2tlLmFkZChhLHRoaXMpO2MmJmModGhpcyk7ei5tYW5hZ2VyLml0ZW1FbmQoYSl9ZnVuY3Rpb24gdihJKXtGLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHQsITEpO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpO2cmJmcoSSk7ei5tYW5hZ2VyLml0ZW1FcnJvcihhKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX12b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciB6PXRoaXMsRT1rZS5nZXQoYSk7aWYodm9pZCAwIT09RSlyZXR1cm4gei5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyhFKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX0sMCksRTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiaW1nIik7Ri5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix0LCExKTtGLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix2LCExKTsiZGF0YToiIT09YS5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKEYuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbik7ei5tYW5hZ2VyLml0ZW1TdGFydChhKTtGLnNyYz1hO3JldHVybiBGfX0pO09nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6T2csbG9hZDpmdW5jdGlvbihhLGMsZSxnKXtmdW5jdGlvbiB0KEYpe3oubG9hZChhW0ZdLGZ1bmN0aW9uKEkpe3YuaW1hZ2VzW0ZdPUk7RSsrOzY9PT1FJiYodi5uZWVkc1VwZGF0ZT0hMCxjJiZjKHYpKX0sdm9pZCAwLGcpfXZhciB2PW5ldyBlZCx6PW5ldyBXZSh0aGlzLm1hbmFnZXIpO3ouc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7ei5zZXRQYXRoKHRoaXMucGF0aCk7dmFyIEU9MDtmb3IoZT0KMDtlPGEubGVuZ3RoOysrZSl0KGUpO3JldHVybiB2fX0pO1BnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UGcsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD1uZXcgbCx2PW5ldyBXZSh0aGlzLm1hbmFnZXIpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dC5pbWFnZT16O3o9MDxhLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWEuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3QuZm9ybWF0PXo/MTAyMjoxMDIzO3QubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09YyYmYyh0KX0sZSxnKTtyZXR1cm4gdH19KTtPYmplY3QuYXNzaWduKFphLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LApnZXRQb2ludEF0OmZ1bmN0aW9uKGEsYyl7YT10aGlzLmdldFV0b1RtYXBwaW5nKGEpO3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9LGdldFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50KGUvYSkpO3JldHVybiBjfSxnZXRTcGFjZWRQb2ludHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9NSk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludEF0KGUvYSkpO3JldHVybiBjfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWErMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwp0aGlzLm5lZWRzVXBkYXRlPSExO3ZhciBjPVtdLGU9dGhpcy5nZXRQb2ludCgwKSxnLHQ9MDtjLnB1c2goMCk7Zm9yKGc9MTtnPD1hO2crKyl7dmFyIHY9dGhpcy5nZXRQb2ludChnL2EpO3QrPXYuZGlzdGFuY2VUbyhlKTtjLnB1c2godCk7ZT12fXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1jfSx1cGRhdGVBcmNMZW5ndGhzOmZ1bmN0aW9uKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdldExlbmd0aHMoKX0sZ2V0VXRvVG1hcHBpbmc6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmdldExlbmd0aHMoKSxnPWUubGVuZ3RoO2M9Yz9jOmEqZVtnLTFdO2Zvcih2YXIgdD0wLHY9Zy0xLHo7dDw9djspaWYoYT1NYXRoLmZsb29yKHQrKHYtdCkvMiksej1lW2FdLWMsMD56KXQ9YSsxO2Vsc2UgaWYoMDx6KXY9YS0xO2Vsc2V7dj1hO2JyZWFrfWE9djtpZihlW2FdPT09YylyZXR1cm4gYS8oZy0xKTt0PWVbYV07cmV0dXJuKGErKGMtdCkvKGVbYSsxXS10KSkvKGctMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9CmEtMUUtNDthKz0xRS00OzA+YyYmKGM9MCk7MTxhJiYoYT0xKTtjPXRoaXMuZ2V0UG9pbnQoYyk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSkuY2xvbmUoKS5zdWIoYykubm9ybWFsaXplKCl9LGdldFRhbmdlbnRBdDpmdW5jdGlvbihhKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChhKX0sY29tcHV0ZUZyZW5ldEZyYW1lczpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBrLGc9W10sdD1bXSx2PVtdLHo9bmV3IGssRT1uZXcgcSxGO2ZvcihGPTA7Rjw9YTtGKyspe3ZhciBJPUYvYTtnW0ZdPXRoaXMuZ2V0VGFuZ2VudEF0KEkpO2dbRl0ubm9ybWFsaXplKCl9dFswXT1uZXcgazt2WzBdPW5ldyBrO0Y9TnVtYmVyLk1BWF9WQUxVRTtJPU1hdGguYWJzKGdbMF0ueCk7dmFyIE09TWF0aC5hYnMoZ1swXS55KSxQPU1hdGguYWJzKGdbMF0ueik7STw9RiYmKEY9SSxlLnNldCgxLDAsMCkpO008PUYmJihGPU0sZS5zZXQoMCwxLDApKTtQPD1GJiZlLnNldCgwLAowLDEpO3ouY3Jvc3NWZWN0b3JzKGdbMF0sZSkubm9ybWFsaXplKCk7dFswXS5jcm9zc1ZlY3RvcnMoZ1swXSx6KTt2WzBdLmNyb3NzVmVjdG9ycyhnWzBdLHRbMF0pO2ZvcihGPTE7Rjw9YTtGKyspdFtGXT10W0YtMV0uY2xvbmUoKSx2W0ZdPXZbRi0xXS5jbG9uZSgpLHouY3Jvc3NWZWN0b3JzKGdbRi0xXSxnW0ZdKSx6Lmxlbmd0aCgpPk51bWJlci5FUFNJTE9OJiYoei5ub3JtYWxpemUoKSxlPU1hdGguYWNvcyhoYi5jbGFtcChnW0YtMV0uZG90KGdbRl0pLC0xLDEpKSx0W0ZdLmFwcGx5TWF0cml4NChFLm1ha2VSb3RhdGlvbkF4aXMoeixlKSkpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0sdFtGXSk7aWYoITA9PT1jKWZvcihlPU1hdGguYWNvcyhoYi5jbGFtcCh0WzBdLmRvdCh0W2FdKSwtMSwxKSksZS89YSwwPGdbMF0uZG90KHouY3Jvc3NWZWN0b3JzKHRbMF0sdFthXSkpJiYoZT0tZSksRj0xO0Y8PWE7RisrKXRbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhnW0ZdLAplKkYpKSx2W0ZdLmNyb3NzVmVjdG9ycyhnW0ZdLHRbRl0pO3JldHVybnt0YW5nZW50czpnLG5vcm1hbHM6dCxiaW5vcm1hbHM6dn19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTthLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9uczthLnR5cGU9dGhpcy50eXBlO3JldHVybiBhfSxmcm9tSlNPTjpmdW5jdGlvbihhKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1hLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtzYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO3NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0Kc2M7c2MucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlPSEwO3NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7Zm9yKHZhciBlPTIqTWF0aC5QSSxnPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGUsdD1NYXRoLmFicyhnKTxOdW1iZXIuRVBTSUxPTjswPmc7KWcrPWU7Zm9yKDtnPmU7KWctPWU7ZzxOdW1iZXIuRVBTSUxPTiYmKGc9dD8wOmUpOyEwIT09dGhpcy5hQ2xvY2t3aXNlfHx0fHwoZz1nPT09ZT8tZTpnLWUpO2U9dGhpcy5hU3RhcnRBbmdsZSthKmc7YT10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhlKTt2YXIgdj10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihlKTswIT09dGhpcy5hUm90YXRpb24mJihlPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxnPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSx0PWEtdGhpcy5hWCx2LT10aGlzLmFZLGE9dCplLXYqZyt0aGlzLmFYLHY9dCpnK3YqZSt0aGlzLmFZKTtyZXR1cm4gYy5zZXQoYSwKdil9O3NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmFYPWEuYVg7dGhpcy5hWT1hLmFZO3RoaXMueFJhZGl1cz1hLnhSYWRpdXM7dGhpcy55UmFkaXVzPWEueVJhZGl1czt0aGlzLmFTdGFydEFuZ2xlPWEuYVN0YXJ0QW5nbGU7dGhpcy5hRW5kQW5nbGU9YS5hRW5kQW5nbGU7dGhpcy5hQ2xvY2t3aXNlPWEuYUNsb2Nrd2lzZTt0aGlzLmFSb3RhdGlvbj1hLmFSb3RhdGlvbjtyZXR1cm4gdGhpc307c2MucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmFYPXRoaXMuYVg7YS5hWT10aGlzLmFZO2EueFJhZGl1cz10aGlzLnhSYWRpdXM7YS55UmFkaXVzPXRoaXMueVJhZGl1czthLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7YS5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7YS5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTthLmFSb3RhdGlvbj0KdGhpcy5hUm90YXRpb247cmV0dXJuIGF9O3NjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtYZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzYy5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgQWg9bmV3IGssUWk9bmV3IGhpLFJpPW5ldyBoaSxTaT1uZXcgaGk7YmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtiYy5wcm90b3R5cGUuY29uc3RydWN0b3I9YmM7CmJjLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTM9ITA7YmMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnBvaW50cyxnPWUubGVuZ3RoO2EqPWctKHRoaXMuY2xvc2VkPzA6MSk7dmFyIHQ9TWF0aC5mbG9vcihhKTthLT10O3RoaXMuY2xvc2VkP3QrPTA8dD8wOihNYXRoLmZsb29yKE1hdGguYWJzKHQpL2cpKzEpKmc6MD09PWEmJnQ9PT1nLTEmJih0PWctMixhPTEpO2lmKHRoaXMuY2xvc2VkfHwwPHQpdmFyIHY9ZVsodC0xKSVnXTtlbHNlIEFoLnN1YlZlY3RvcnMoZVswXSxlWzFdKS5hZGQoZVswXSksdj1BaDt2YXIgej1lW3QlZ107dmFyIEU9ZVsodCsxKSVnXTt0aGlzLmNsb3NlZHx8dCsyPGc/ZT1lWyh0KzIpJWddOihBaC5zdWJWZWN0b3JzKGVbZy0xXSxlW2ctMl0pLmFkZChlW2ctMV0pLGU9QWgpO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBGPQoiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZT8uNTouMjU7Zz1NYXRoLnBvdyh2LmRpc3RhbmNlVG9TcXVhcmVkKHopLEYpO3Q9TWF0aC5wb3coei5kaXN0YW5jZVRvU3F1YXJlZChFKSxGKTtGPU1hdGgucG93KEUuZGlzdGFuY2VUb1NxdWFyZWQoZSksRik7MUUtND50JiYodD0xKTsxRS00PmcmJihnPXQpOzFFLTQ+RiYmKEY9dCk7UWkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueCx6LngsRS54LGUueCxnLHQsRik7UmkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueSx6LnksRS55LGUueSxnLHQsRik7U2kuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHYueix6LnosRS56LGUueixnLHQsRil9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYoUWkuaW5pdENhdG11bGxSb20odi54LHoueCxFLngsZS54LHRoaXMudGVuc2lvbiksUmkuaW5pdENhdG11bGxSb20odi55LHoueSxFLnksZS55LHRoaXMudGVuc2lvbiksU2kuaW5pdENhdG11bGxSb20odi56LHoueixFLnosCmUueix0aGlzLnRlbnNpb24pKTtjLnNldChRaS5jYWxjKGEpLFJpLmNhbGMoYSksU2kuY2FsYyhhKSk7cmV0dXJuIGN9O2JjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXRoaXMucG9pbnRzLnB1c2goYS5wb2ludHNbY10uY2xvbmUoKSk7dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307YmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTthLmNsb3NlZD10aGlzLmNsb3NlZDthLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTsKYS50ZW5zaW9uPXRoaXMudGVuc2lvbjtyZXR1cm4gYX07YmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGspLmZyb21BcnJheShnKSl9dGhpcy5jbG9zZWQ9YS5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9YS5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWEudGVuc2lvbjtyZXR1cm4gdGhpc307RWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtFYy5wcm90b3R5cGUuY29uc3RydWN0b3I9RWM7RWMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHQ9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYmcoYSwKZS54LGcueCx0Lngsdi54KSxiZyhhLGUueSxnLnksdC55LHYueSkpO3JldHVybiBjfTtFYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO2EudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpOwp0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307VmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtWYy5wcm90b3R5cGUuY29uc3RydWN0b3I9VmM7VmMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITA7VmMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSx0PXRoaXMudjIsdj10aGlzLnYzO2Muc2V0KGJnKGEsZS54LGcueCx0Lngsdi54KSxiZyhhLGUueSxnLnksdC55LHYueSksYmcoYSxlLnosZy56LHQueix2LnopKTtyZXR1cm4gY307VmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3RoaXMudjMuY29weShhLnYzKTtyZXR1cm4gdGhpc307VmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPQpaYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07VmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7dGhpcy52My5mcm9tQXJyYXkoYS52Myk7cmV0dXJuIHRoaXN9O25jLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7bmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPW5jO25jLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtuYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmOzE9PT1hP2MuY29weSh0aGlzLnYyKTooYy5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSwKYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtuYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O25jLnByb3RvdHlwZS5nZXRUYW5nZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudjIuY2xvbmUoKS5zdWIodGhpcy52MSkubm9ybWFsaXplKCl9O25jLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtuYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07bmMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0ZjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYztGYy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGs7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGMubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMudjEpKTtyZXR1cm4gY307RmMucHJvdG90eXBlLmdldFBvaW50QXQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRQb2ludChhLGMpfTtGYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307RmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKYS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307R2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtHYy5wcm90b3R5cGUuY29uc3RydWN0b3I9R2M7R2MucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITA7R2MucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjt2YXIgZT10aGlzLnYwLGc9dGhpcy52MSx0PXRoaXMudjI7Yy5zZXQoYWcoYSxlLngsZy54LHQueCksYWcoYSxlLnksZy55LHQueSkpO3JldHVybiBjfTtHYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApOwp0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtHYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtHYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTtyZXR1cm4gdGhpc307V2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtXYy5wcm90b3R5cGUuY29uc3RydWN0b3I9V2M7V2MucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO1djLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8Cm5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHQ9dGhpcy52MjtjLnNldChhZyhhLGUueCxnLngsdC54KSxhZyhhLGUueSxnLnksdC55KSxhZyhhLGUueixnLnosdC56KSk7cmV0dXJuIGN9O1djLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTtyZXR1cm4gdGhpc307V2MucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYX07V2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7CnRoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtIYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0hjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IYztIYy5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZT0hMDtIYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMucG9pbnRzLGc9KGUubGVuZ3RoLTEpKmE7YT1NYXRoLmZsb29yKGcpO2ctPWE7dmFyIHQ9ZVswPT09YT9hOmEtMV0sdj1lW2FdLHo9ZVthPmUubGVuZ3RoLTI/ZS5sZW5ndGgtMTphKzFdO2U9ZVthPmUubGVuZ3RoLTM/ZS5sZW5ndGgtMTphKzJdO2Muc2V0KFlqKGcsdC54LHYueCx6LngsZS54KSxZaihnLHQueSx2Lnksei55LGUueSkpO3JldHVybiBjfTtIYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzwKZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc307SGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPVphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPXRoaXMucG9pbnRzLmxlbmd0aDtjPGU7YysrKWEucG9pbnRzLnB1c2godGhpcy5wb2ludHNbY10udG9BcnJheSgpKTtyZXR1cm4gYX07SGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5wb2ludHM9W107Zm9yKHZhciBjPTAsZT1hLnBvaW50cy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5wb2ludHNbY107dGhpcy5wb2ludHMucHVzaCgobmV3IGYpLmZyb21BcnJheShnKSl9cmV0dXJuIHRoaXN9O3ZhciBUaT1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpYZSxDYXRtdWxsUm9tQ3VydmUzOmJjLEN1YmljQmV6aWVyQ3VydmU6RWMsQ3ViaWNCZXppZXJDdXJ2ZTM6VmMsCkVsbGlwc2VDdXJ2ZTpzYyxMaW5lQ3VydmU6bmMsTGluZUN1cnZlMzpGYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpHYyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6V2MsU3BsaW5lQ3VydmU6SGN9KTtpZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmlkLGFkZDpmdW5jdGlvbihhKXt0aGlzLmN1cnZlcy5wdXNoKGEpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxjPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTthLmVxdWFscyhjKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcgbmMoYyxhKSl9LGdldFBvaW50OmZ1bmN0aW9uKGEpe3ZhciBjPWEqdGhpcy5nZXRMZW5ndGgoKSxlPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGE9MDthPGUubGVuZ3RoOyl7aWYoZVthXT49YylyZXR1cm4gYz1lW2FdLWMsYT10aGlzLmN1cnZlc1thXSxlPQphLmdldExlbmd0aCgpLGEuZ2V0UG9pbnRBdCgwPT09ZT8wOjEtYy9lKTthKyt9cmV0dXJuIG51bGx9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGFbYS5sZW5ndGgtMV19LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuY2FjaGVMZW5ndGhzPW51bGw7dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX0sZ2V0Q3VydmVMZW5ndGhzOmZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Zm9yKHZhciBhPVtdLGM9MCxlPTAsZz10aGlzLmN1cnZlcy5sZW5ndGg7ZTxnO2UrKyljKz10aGlzLmN1cnZlc1tlXS5nZXRMZW5ndGgoKSxhLnB1c2goYyk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWF9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGE9NDApO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7dGhpcy5hdXRvQ2xvc2UmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe2E9YXx8MTI7Zm9yKHZhciBjPVtdLGUsZz0wLHQ9dGhpcy5jdXJ2ZXM7Zzx0Lmxlbmd0aDtnKyspe3ZhciB2PXRbZ107dj12LmdldFBvaW50cyh2JiZ2LmlzRWxsaXBzZUN1cnZlPzIqYTp2JiYodi5pc0xpbmVDdXJ2ZXx8di5pc0xpbmVDdXJ2ZTMpPzE6diYmdi5pc1NwbGluZUN1cnZlP2Eqdi5wb2ludHMubGVuZ3RoOmEpO2Zvcih2YXIgej0wO3o8di5sZW5ndGg7eisrKXt2YXIgRT12W3pdO2UmJmUuZXF1YWxzKEUpfHwoYy5wdXNoKEUpLGU9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGMubGVuZ3RoJiYhY1tjLmxlbmd0aC0xXS5lcXVhbHMoY1swXSkmJmMucHVzaChjWzBdKTtyZXR1cm4gY30sY29weTpmdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9YS5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5jdXJ2ZXMucHVzaChhLmN1cnZlc1tjXS5jbG9uZSgpKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlO2EuY3VydmVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5jdXJ2ZXMubGVuZ3RoO2M8ZTtjKyspYS5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hdXRvQ2xvc2U9YS5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5jdXJ2ZXNbY107dGhpcy5jdXJ2ZXMucHVzaCgobmV3IFRpW2cudHlwZV0pLmZyb21KU09OKGcpKX1yZXR1cm4gdGhpc319KTsKSWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShpZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpJYyxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubW92ZVRvKGFbMF0ueCxhWzBdLnkpO2Zvcih2YXIgYz0xLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmxpbmVUbyhhW2NdLngsYVtjXS55KX0sbW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3ZhciBlPW5ldyBuYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYykpO3RoaXMuY3VydmVzLnB1c2goZSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7YT1uZXcgR2ModGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZihhLGMpLG5ldyBmKGUsZykpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGUsZyl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYSwKYyxlLGcsdCx2KXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSxuZXcgZih0LHYpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO3RoaXMuY3VycmVudFBvaW50LnNldCh0LHYpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGEpe3ZhciBjPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQoYSk7Yz1uZXcgSGMoYyk7dGhpcy5jdXJ2ZXMucHVzaChjKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGFbYS5sZW5ndGgtMV0pfSxhcmM6ZnVuY3Rpb24oYSxjLGUsZyx0LHYpe3RoaXMuYWJzYXJjKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksZSxnLHQsdil9LGFic2FyYzpmdW5jdGlvbihhLGMsZSxnLHQsdil7dGhpcy5hYnNlbGxpcHNlKGEsYyxlLGUsZyx0LHYpfSxlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcsdCx2LHosRSl7dGhpcy5hYnNlbGxpcHNlKGErdGhpcy5jdXJyZW50UG9pbnQueCxjK3RoaXMuY3VycmVudFBvaW50LnksCmUsZyx0LHYseixFKX0sYWJzZWxsaXBzZTpmdW5jdGlvbihhLGMsZSxnLHQsdix6LEUpe2E9bmV3IHNjKGEsYyxlLGcsdCx2LHosRSk7MDx0aGlzLmN1cnZlcy5sZW5ndGgmJihjPWEuZ2V0UG9pbnQoMCksYy5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhjLngsYy55KSk7dGhpcy5jdXJ2ZXMucHVzaChhKTthPWEuZ2V0UG9pbnQoMSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhKX0sY29weTpmdW5jdGlvbihhKXtpZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShhLmN1cnJlbnRQb2ludCk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPWlkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe2lkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGEuY3VycmVudFBvaW50KTsKcmV0dXJuIHRoaXN9fSk7RmQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShJYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGZCxnZXRQb2ludHNIb2xlczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wLGc9dGhpcy5ob2xlcy5sZW5ndGg7ZTxnO2UrKyljW2VdPXRoaXMuaG9sZXNbZV0uZ2V0UG9pbnRzKGEpO3JldHVybiBjfSxleHRyYWN0UG9pbnRzOmZ1bmN0aW9uKGEpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhhKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGEpfX0sY29weTpmdW5jdGlvbihhKXtJYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGM9MCxlPWEuaG9sZXMubGVuZ3RoO2M8ZTtjKyspdGhpcy5ob2xlcy5wdXNoKGEuaG9sZXNbY10uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPUljLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnV1aWQ9dGhpcy51dWlkOwphLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5ob2xlcy5sZW5ndGg7YzxlO2MrKylhLmhvbGVzLnB1c2godGhpcy5ob2xlc1tjXS50b0pTT04oKSk7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe0ljLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy51dWlkPWEudXVpZDt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YS5ob2xlc1tjXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBJYykuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pO0tiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT0KQS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpO2Eub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eTt2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoYS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGEub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpO3ZvaWQgMCE9PXRoaXMuYW5nbGUmJihhLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKTt2b2lkIDAhPT10aGlzLmRlY2F5JiYoYS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSk7dm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGEub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc0hlbWlzcGhlcmVMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0tiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdyb3VuZENvbG9yLmNvcHkoYS5ncm91bmRDb2xvcik7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihYYy5wcm90b3R5cGUse19wcm9qU2NyZWVuTWF0cml4Om5ldyBxLF9saWdodFBvc2l0aW9uV29ybGQ6bmV3IGssX2xvb2tUYXJnZXQ6bmV3IGssZ2V0Vmlld3BvcnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fSxnZXRGcnVzdHVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19LHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FtZXJhLGU9dGhpcy5tYXRyaXgsZz10aGlzLl9wcm9qU2NyZWVuTWF0cml4LHQ9dGhpcy5fbG9va1RhcmdldCx2PXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDt2LnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTsKYy5wb3NpdGlvbi5jb3B5KHYpO3Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEudGFyZ2V0Lm1hdHJpeFdvcmxkKTtjLmxvb2tBdCh0KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tdWx0aXBseU1hdHJpY2VzKGMucHJvamVjdGlvbk1hdHJpeCxjLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KGcpO2Uuc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpO2UubXVsdGlwbHkoYy5wcm9qZWN0aW9uTWF0cml4KTtlLm11bHRpcGx5KGMubWF0cml4V29ybGRJbnZlcnNlKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1thXX0sZ2V0RnJhbWVFeHRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50c30sY29weTpmdW5jdGlvbihhKXt0aGlzLmNhbWVyYT1hLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1hLmJpYXM7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYS5tYXBTaXplKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT17fTswIT09dGhpcy5iaWFzJiYoYS5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYS5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSlhLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTthLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYS5jYW1lcmEubWF0cml4O3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuY2FtZXJhLHQ9MipoYi5SQUQyREVHKmEuYW5nbGUsdj10aGlzLm1hcFNpemUud2lkdGgvCnRoaXMubWFwU2l6ZS5oZWlnaHQsej1hLmRpc3RhbmNlfHxnLmZhcjtpZih0IT09Zy5mb3Z8fHYhPT1nLmFzcGVjdHx8eiE9PWcuZmFyKWcuZm92PXQsZy5hc3BlY3Q9dixnLmZhcj16LGcudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1hjLnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKHRoaXMsYSxjLGUpfX0pO1NnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6U2csaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuYW5nbGU9YS5hbmdsZTt0aGlzLnBlbnVtYnJhPWEucGVudW1icmE7dGhpcy5kZWNheT1hLmRlY2F5O3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtpaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhjLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjppaSxpc1BvaW50TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSxjLGUpe2M9dGhpcy5jYW1lcmE7dmFyIGc9dGhpcy5tYXRyaXgsdD10aGlzLl9saWdodFBvc2l0aW9uV29ybGQsdj10aGlzLl9sb29rVGFyZ2V0LHo9dGhpcy5fcHJvalNjcmVlbk1hdHJpeDt0LnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTtjLnBvc2l0aW9uLmNvcHkodCk7di5jb3B5KGMucG9zaXRpb24pO3YuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKTtjLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSk7Yy5sb29rQXQodik7Yy51cGRhdGVNYXRyaXhXb3JsZCgpO2cubWFrZVRyYW5zbGF0aW9uKC10LngsLXQueSwtdC56KTt6Lm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoeil9fSk7VGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VGcsaXNQb2ludExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7S2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZGlzdGFuY2U9YS5kaXN0YW5jZTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtjZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNnLGlzT3J0aG9ncmFwaGljQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYSxjKXt6Yi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLmxlZnQ9YS5sZWZ0O3RoaXMucmlnaHQ9YS5yaWdodDt0aGlzLnRvcD1hLnRvcDt0aGlzLmJvdHRvbT1hLmJvdHRvbTt0aGlzLm5lYXI9YS5uZWFyO3RoaXMuZmFyPWEuZmFyO3RoaXMuem9vbT1hLnpvb207dGhpcy52aWV3PW51bGw9PT1hLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGEudmlldyk7cmV0dXJuIHRoaXN9LApzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXtudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXQ7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGE9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS8oMip0aGlzLnpvb20pLGM9KHRoaXMudG9wLQp0aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixnPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMix0PWUtYTtlKz1hO2E9ZytjO2M9Zy1jO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtlPXRoaXMuem9vbS8odGhpcy52aWV3LndpZHRoL3RoaXMudmlldy5mdWxsV2lkdGgpO2M9dGhpcy56b29tLyh0aGlzLnZpZXcuaGVpZ2h0L3RoaXMudmlldy5mdWxsSGVpZ2h0KTt2YXIgdj0odGhpcy5yaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy53aWR0aDtnPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmhlaWdodDt0Kz10aGlzLnZpZXcub2Zmc2V0WC9lKnY7ZT10K3RoaXMudmlldy53aWR0aC9lKnY7YS09dGhpcy52aWV3Lm9mZnNldFkvYypnO2M9YS10aGlzLnZpZXcuaGVpZ2h0L2MqZ310aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyh0LGUsYSxjLHRoaXMubmVhcix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LAp0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0O2Eub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQ7YS5vYmplY3QudG9wPXRoaXMudG9wO2Eub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbTthLm9iamVjdC5uZWFyPXRoaXMubmVhcjthLm9iamVjdC5mYXI9dGhpcy5mYXI7bnVsbCE9PXRoaXMudmlldyYmKGEub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtyZXR1cm4gYX19KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7WGMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7VmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VmcsaXNEaXJlY3Rpb25hbExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7S2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudGFyZ2V0PWEudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9YS5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzQW1iaWVudExpZ2h0OiEwfSk7WGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc1JlY3RBcmVhTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7YT1LYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKTthLm9iamVjdC53aWR0aD0KdGhpcy53aWR0aDthLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModC5tYW5hZ2VyKTt2LnNldFBhdGgodC5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHQucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKEUpe3ZvaWQgMD09PWVbRV0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixFKTtyZXR1cm4gZVtFXX12YXIgZT10aGlzLnRleHR1cmVzLGc9bmV3IGVuW2EudHlwZV07dm9pZCAwIT09YS51dWlkJiYoZy51dWlkPWEudXVpZCk7dm9pZCAwIT09YS5uYW1lJiYoZy5uYW1lPWEubmFtZSk7dm9pZCAwIT09YS5jb2xvciYmZy5jb2xvci5zZXRIZXgoYS5jb2xvcik7CnZvaWQgMCE9PWEucm91Z2huZXNzJiYoZy5yb3VnaG5lc3M9YS5yb3VnaG5lc3MpO3ZvaWQgMCE9PWEubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9YS5tZXRhbG5lc3MpO3ZvaWQgMCE9PWEuZW1pc3NpdmUmJmcuZW1pc3NpdmUuc2V0SGV4KGEuZW1pc3NpdmUpO3ZvaWQgMCE9PWEuc3BlY3VsYXImJmcuc3BlY3VsYXIuc2V0SGV4KGEuc3BlY3VsYXIpO3ZvaWQgMCE9PWEuc2hpbmluZXNzJiYoZy5zaGluaW5lc3M9YS5zaGluaW5lc3MpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0JiYoZy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Um91Z2huZXNzJiYoZy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3MpO3ZvaWQgMCE9PWEudmVydGV4Q29sb3JzJiYoZy52ZXJ0ZXhDb2xvcnM9YS52ZXJ0ZXhDb2xvcnMpO3ZvaWQgMCE9PWEuZm9nJiYoZy5mb2c9YS5mb2cpO3ZvaWQgMCE9PWEuZmxhdFNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPWEuZmxhdFNoYWRpbmcpOwp2b2lkIDAhPT1hLmJsZW5kaW5nJiYoZy5ibGVuZGluZz1hLmJsZW5kaW5nKTt2b2lkIDAhPT1hLmNvbWJpbmUmJihnLmNvbWJpbmU9YS5jb21iaW5lKTt2b2lkIDAhPT1hLnNpZGUmJihnLnNpZGU9YS5zaWRlKTt2b2lkIDAhPT1hLm9wYWNpdHkmJihnLm9wYWNpdHk9YS5vcGFjaXR5KTt2b2lkIDAhPT1hLnRyYW5zcGFyZW50JiYoZy50cmFuc3BhcmVudD1hLnRyYW5zcGFyZW50KTt2b2lkIDAhPT1hLmFscGhhVGVzdCYmKGcuYWxwaGFUZXN0PWEuYWxwaGFUZXN0KTt2b2lkIDAhPT1hLmRlcHRoVGVzdCYmKGcuZGVwdGhUZXN0PWEuZGVwdGhUZXN0KTt2b2lkIDAhPT1hLmRlcHRoV3JpdGUmJihnLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlKTt2b2lkIDAhPT1hLmNvbG9yV3JpdGUmJihnLmNvbG9yV3JpdGU9YS5jb2xvcldyaXRlKTt2b2lkIDAhPT1hLndpcmVmcmFtZSYmKGcud2lyZWZyYW1lPWEud2lyZWZyYW1lKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPWEud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09YS53aXJlZnJhbWVMaW5lam9pbiYmKGcud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09YS5yb3RhdGlvbiYmKGcucm90YXRpb249YS5yb3RhdGlvbik7MSE9PWEubGluZXdpZHRoJiYoZy5saW5ld2lkdGg9YS5saW5ld2lkdGgpO3ZvaWQgMCE9PWEuZGFzaFNpemUmJihnLmRhc2hTaXplPWEuZGFzaFNpemUpO3ZvaWQgMCE9PWEuZ2FwU2l6ZSYmKGcuZ2FwU2l6ZT1hLmdhcFNpemUpO3ZvaWQgMCE9PWEuc2NhbGUmJihnLnNjYWxlPWEuc2NhbGUpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldCYmKGcucG9seWdvbk9mZnNldD1hLnBvbHlnb25PZmZzZXQpO3ZvaWQgMCE9PWEucG9seWdvbk9mZnNldEZhY3RvciYmKGcucG9seWdvbk9mZnNldEZhY3Rvcj1hLnBvbHlnb25PZmZzZXRGYWN0b3IpOwp2b2lkIDAhPT1hLnBvbHlnb25PZmZzZXRVbml0cyYmKGcucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1hLnNraW5uaW5nJiYoZy5za2lubmluZz1hLnNraW5uaW5nKTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0cyYmKGcubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT1hLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzKTt2b2lkIDAhPT1hLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPWEuZGl0aGVyaW5nKTt2b2lkIDAhPT1hLnZpc2libGUmJihnLnZpc2libGU9YS52aXNpYmxlKTt2b2lkIDAhPT1hLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9YS50b25lTWFwcGVkKTt2b2lkIDAhPT1hLnVzZXJEYXRhJiYoZy51c2VyRGF0YT1hLnVzZXJEYXRhKTtpZih2b2lkIDAhPT1hLnVuaWZvcm1zKWZvcih2YXIgdCBpbiBhLnVuaWZvcm1zKXt2YXIgdj1hLnVuaWZvcm1zW3RdO2cudW5pZm9ybXNbdF09Cnt9O3N3aXRjaCh2LnR5cGUpe2Nhc2UgInQiOmcudW5pZm9ybXNbdF0udmFsdWU9Yyh2LnZhbHVlKTticmVhaztjYXNlICJjIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgSCkuc2V0SGV4KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgZikuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgaykuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcCkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2Nhc2UgIm0zIjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcikuZnJvbUFycmF5KHYudmFsdWUpO2Nhc2UgIm00IjpnLnVuaWZvcm1zW3RdLnZhbHVlPShuZXcgcSkuZnJvbUFycmF5KHYudmFsdWUpO2JyZWFrO2RlZmF1bHQ6Zy51bmlmb3Jtc1t0XS52YWx1ZT12LnZhbHVlfX12b2lkIDAhPT1hLmRlZmluZXMmJihnLmRlZmluZXM9YS5kZWZpbmVzKTsKdm9pZCAwIT09YS52ZXJ0ZXhTaGFkZXImJihnLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcik7dm9pZCAwIT09YS5mcmFnbWVudFNoYWRlciYmKGcuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09YS5leHRlbnNpb25zKWZvcih2YXIgeiBpbiBhLmV4dGVuc2lvbnMpZy5leHRlbnNpb25zW3pdPWEuZXh0ZW5zaW9uc1t6XTt2b2lkIDAhPT1hLnNoYWRpbmcmJihnLmZsYXRTaGFkaW5nPTE9PT1hLnNoYWRpbmcpO3ZvaWQgMCE9PWEuc2l6ZSYmKGcuc2l6ZT1hLnNpemUpO3ZvaWQgMCE9PWEuc2l6ZUF0dGVudWF0aW9uJiYoZy5zaXplQXR0ZW51YXRpb249YS5zaXplQXR0ZW51YXRpb24pO3ZvaWQgMCE9PWEubWFwJiYoZy5tYXA9YyhhLm1hcCkpO3ZvaWQgMCE9PWEubWF0Y2FwJiYoZy5tYXRjYXA9YyhhLm1hdGNhcCkpO3ZvaWQgMCE9PWEuYWxwaGFNYXAmJihnLmFscGhhTWFwPWMoYS5hbHBoYU1hcCksZy50cmFuc3BhcmVudD0hMCk7dm9pZCAwIT09CmEuYnVtcE1hcCYmKGcuYnVtcE1hcD1jKGEuYnVtcE1hcCkpO3ZvaWQgMCE9PWEuYnVtcFNjYWxlJiYoZy5idW1wU2NhbGU9YS5idW1wU2NhbGUpO3ZvaWQgMCE9PWEubm9ybWFsTWFwJiYoZy5ub3JtYWxNYXA9YyhhLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEubm9ybWFsTWFwVHlwZSYmKGcubm9ybWFsTWFwVHlwZT1hLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWEubm9ybWFsU2NhbGUmJih0PWEubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHQpJiYodD1bdCx0XSksZy5ub3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheSh0KSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRNYXAmJihnLmRpc3BsYWNlbWVudE1hcD1jKGEuZGlzcGxhY2VtZW50TWFwKSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRTY2FsZSYmKGcuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZSk7dm9pZCAwIT09YS5kaXNwbGFjZW1lbnRCaWFzJiYoZy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50Qmlhcyk7CnZvaWQgMCE9PWEucm91Z2huZXNzTWFwJiYoZy5yb3VnaG5lc3NNYXA9YyhhLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWEubWV0YWxuZXNzTWFwJiYoZy5tZXRhbG5lc3NNYXA9YyhhLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwPWMoYS5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWEuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuc3BlY3VsYXJNYXAmJihnLnNwZWN1bGFyTWFwPWMoYS5zcGVjdWxhck1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwJiYoZy5lbnZNYXA9YyhhLmVudk1hcCkpO3ZvaWQgMCE9PWEuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9YS5lbnZNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEucmVmbGVjdGl2aXR5JiYoZy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHkpO3ZvaWQgMCE9PWEucmVmcmFjdGlvblJhdGlvJiYoZy5yZWZyYWN0aW9uUmF0aW89CmEucmVmcmFjdGlvblJhdGlvKTt2b2lkIDAhPT1hLmxpZ2h0TWFwJiYoZy5saWdodE1hcD1jKGEubGlnaHRNYXApKTt2b2lkIDAhPT1hLmxpZ2h0TWFwSW50ZW5zaXR5JiYoZy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmFvTWFwJiYoZy5hb01hcD1jKGEuYW9NYXApKTt2b2lkIDAhPT1hLmFvTWFwSW50ZW5zaXR5JiYoZy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1hLmdyYWRpZW50TWFwJiYoZy5ncmFkaWVudE1hcD1jKGEuZ3JhZGllbnRNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbE1hcCYmKGcuY2xlYXJjb2F0Tm9ybWFsTWFwPWMoYS5jbGVhcmNvYXROb3JtYWxNYXApKTt2b2lkIDAhPT1hLmNsZWFyY29hdE5vcm1hbFNjYWxlJiYoZy5jbGVhcmNvYXROb3JtYWxTY2FsZT0obmV3IGYpLmZyb21BcnJheShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSk7cmV0dXJuIGd9LHNldFRleHR1cmVzOmZ1bmN0aW9uKGEpe3RoaXMudGV4dHVyZXM9CmE7cmV0dXJuIHRoaXN9fSk7dmFyIFVpPXtkZWNvZGVUZXh0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShhKTtmb3IodmFyIGM9IiIsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGFbZV0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShjKSl9Y2F0Y2godCl7cmV0dXJuIGN9fSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1jPyIuLyI6YS5zdWJzdHIoMCxjKzEpfX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYSl7dmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9CmEubWF4SW5zdGFuY2VkQ291bnQ7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5tYXhJbnN0YW5jZWRDb3VudD10aGlzLm1heEluc3RhbmNlZENvdW50O2EuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMDtyZXR1cm4gYX19KTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6JGcsaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ITAsY29weTpmdW5jdGlvbihhKXtSLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1SLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1lc2hQZXJBdHRyaWJ1dGU9CnRoaXMubWVzaFBlckF0dHJpYnV0ZTthLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwO3JldHVybiBhfX0pO2FoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YWgsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9bmV3IHdjKHQubWFuYWdlcik7di5zZXRQYXRoKHQucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7Yyh0LnBhcnNlKEpTT04ucGFyc2UoeikpKX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7dmFyIGM9YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBaZzpuZXcgdmEsZT1hLmRhdGEuaW5kZXg7aWYodm9pZCAwIT09ZSl7dmFyIGc9bmV3IFZpW2UudHlwZV0oZS5hcnJheSk7Yy5zZXRJbmRleChuZXcgUihnLDEpKX1lPWEuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgdCBpbiBlKXt2YXIgdj1lW3RdO2c9bmV3IFZpW3YudHlwZV0odi5hcnJheSk7Zz1uZXcgKHYuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/CiRnOlIpKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpO3ZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpO2MuYWRkQXR0cmlidXRlKHQsZyl9dmFyIHo9YS5kYXRhLm1vcnBoQXR0cmlidXRlcztpZih6KWZvcih0IGluIHope3ZhciBFPXpbdF0sRj1bXTtlPTA7Zm9yKHZhciBJPUUubGVuZ3RoO2U8STtlKyspdj1FW2VdLGc9bmV3IFZpW3YudHlwZV0odi5hcnJheSksZz1uZXcgUihnLHYuaXRlbVNpemUsdi5ub3JtYWxpemVkKSx2b2lkIDAhPT12Lm5hbWUmJihnLm5hbWU9di5uYW1lKSxGLnB1c2goZyk7Yy5tb3JwaEF0dHJpYnV0ZXNbdF09Rn10PWEuZGF0YS5ncm91cHN8fGEuZGF0YS5kcmF3Y2FsbHN8fGEuZGF0YS5vZmZzZXRzO2lmKHZvaWQgMCE9PXQpZm9yKGU9MCx2PXQubGVuZ3RoO2UhPT12OysrZSlnPXRbZV0sYy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTtlPWEuZGF0YS5ib3VuZGluZ1NwaGVyZTt2b2lkIDAhPT1lJiYodD1uZXcgaywKdm9pZCAwIT09ZS5jZW50ZXImJnQuZnJvbUFycmF5KGUuY2VudGVyKSxjLmJvdW5kaW5nU3BoZXJlPW5ldyBHKHQsZS5yYWRpdXMpKTthLm5hbWUmJihjLm5hbWU9YS5uYW1lKTthLnVzZXJEYXRhJiYoYy51c2VyRGF0YT1hLnVzZXJEYXRhKTtyZXR1cm4gY319KTt2YXIgVmk9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OiJ1bmRlZmluZWQiIT09dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P1VpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O2JoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmgsbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2YXIgdD10aGlzLHY9IiI9PT10aGlzLnBhdGg/VWkuZXh0cmFjdFVybEJhc2UoYSk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPQp0aGlzLnJlc291cmNlUGF0aHx8djt2PW5ldyB3Yyh0Lm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3ZhciBFPW51bGw7dHJ5e0U9SlNPTi5wYXJzZSh6KX1jYXRjaChGKXt2b2lkIDAhPT1nJiZnKEYpO2NvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIithKyIuIixGLm1lc3NhZ2UpO3JldHVybn16PUUubWV0YWRhdGE7dm9pZCAwPT09enx8dm9pZCAwPT09ei50eXBlfHwiZ2VvbWV0cnkiPT09ei50eXBlLnRvTG93ZXJDYXNlKCk/Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrYSk6dC5wYXJzZShFLGMpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMucGFyc2VTaGFwZShhLnNoYXBlcyk7ZT10aGlzLnBhcnNlR2VvbWV0cmllcyhhLmdlb21ldHJpZXMsZSk7dmFyIGc9dGhpcy5wYXJzZUltYWdlcyhhLmltYWdlcyxmdW5jdGlvbigpe3ZvaWQgMCE9PQpjJiZjKHQpfSk7Zz10aGlzLnBhcnNlVGV4dHVyZXMoYS50ZXh0dXJlcyxnKTtnPXRoaXMucGFyc2VNYXRlcmlhbHMoYS5tYXRlcmlhbHMsZyk7dmFyIHQ9dGhpcy5wYXJzZU9iamVjdChhLm9iamVjdCxlLGcpO2EuYW5pbWF0aW9ucyYmKHQuYW5pbWF0aW9ucz10aGlzLnBhcnNlQW5pbWF0aW9ucyhhLmFuaW1hdGlvbnMpKTt2b2lkIDAhPT1hLmltYWdlcyYmMCE9PWEuaW1hZ2VzLmxlbmd0aHx8dm9pZCAwPT09Y3x8Yyh0KTtyZXR1cm4gdH0scGFyc2VTaGFwZTpmdW5jdGlvbihhKXt2YXIgYz17fTtpZih2b2lkIDAhPT1hKWZvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9KG5ldyBGZCkuZnJvbUpTT04oYVtlXSk7Y1t0LnV1aWRdPXR9cmV0dXJuIGN9LHBhcnNlR2VvbWV0cmllczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBnPW5ldyBhaCx0PTAsdj1hLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1hW3RdO3N3aXRjaCh6LnR5cGUpe2Nhc2UgIlBsYW5lR2VvbWV0cnkiOmNhc2UgIlBsYW5lQnVmZmVyR2VvbWV0cnkiOnZhciBFPQpuZXcgamNbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzKTticmVhaztjYXNlICJCb3hHZW9tZXRyeSI6Y2FzZSAiQm94QnVmZmVyR2VvbWV0cnkiOmNhc2UgIkN1YmVHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LndpZHRoLHouaGVpZ2h0LHouZGVwdGgsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5kZXB0aFNlZ21lbnRzKTticmVhaztjYXNlICJDaXJjbGVHZW9tZXRyeSI6Y2FzZSAiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5yYWRpdXMsei5zZWdtZW50cyx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ3lsaW5kZXJHZW9tZXRyeSI6Y2FzZSAiQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1c1RvcCx6LnJhZGl1c0JvdHRvbSx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsCnoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDb25lR2VvbWV0cnkiOmNhc2UgIkNvbmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LmhlaWdodCx6LnJhZGlhbFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMsei5vcGVuRW5kZWQsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlNwaGVyZUdlb21ldHJ5IjpjYXNlICJTcGhlcmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJEb2RlY2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIk9jdGFoZWRyb25HZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPQpuZXcgamNbei50eXBlXSh6LnJhZGl1cyx6LmRldGFpbCk7YnJlYWs7Y2FzZSAiUmluZ0dlb21ldHJ5IjpjYXNlICJSaW5nQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5pbm5lclJhZGl1cyx6Lm91dGVyUmFkaXVzLHoudGhldGFTZWdtZW50cyx6LnBoaVNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJUb3J1c0dlb21ldHJ5IjpjYXNlICJUb3J1c0J1ZmZlckdlb21ldHJ5IjpFPW5ldyBqY1t6LnR5cGVdKHoucmFkaXVzLHoudHViZSx6LnJhZGlhbFNlZ21lbnRzLHoudHVidWxhclNlZ21lbnRzLHouYXJjKTticmVhaztjYXNlICJUb3J1c0tub3RHZW9tZXRyeSI6Y2FzZSAiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoudHVidWxhclNlZ21lbnRzLHoucmFkaWFsU2VnbWVudHMsei5wLHoucSk7YnJlYWs7Y2FzZSAiVHViZUdlb21ldHJ5IjpjYXNlICJUdWJlQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBqY1t6LnR5cGVdKChuZXcgVGlbei5wYXRoLnR5cGVdKS5mcm9tSlNPTih6LnBhdGgpLHoudHVidWxhclNlZ21lbnRzLHoucmFkaXVzLHoucmFkaWFsU2VnbWVudHMsei5jbG9zZWQpO2JyZWFrO2Nhc2UgIkxhdGhlR2VvbWV0cnkiOmNhc2UgIkxhdGhlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGpjW3oudHlwZV0oei5wb2ludHMsei5zZWdtZW50cyx6LnBoaVN0YXJ0LHoucGhpTGVuZ3RoKTticmVhaztjYXNlICJQb2x5aGVkcm9uR2VvbWV0cnkiOmNhc2UgIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI6RT1uZXcgamNbei50eXBlXSh6LnZlcnRpY2VzLHouaW5kaWNlcyx6LnJhZGl1cyx6LmRldGFpbHMpO2JyZWFrO2Nhc2UgIlNoYXBlR2VvbWV0cnkiOmNhc2UgIlNoYXBlQnVmZmVyR2VvbWV0cnkiOkU9W107Zm9yKHZhciBGPTAsST16LnNoYXBlcy5sZW5ndGg7RjxJO0YrKyl7dmFyIE09Y1t6LnNoYXBlc1tGXV07RS5wdXNoKE0pfUU9bmV3IGpjW3oudHlwZV0oRSx6LmN1cnZlU2VnbWVudHMpOwpicmVhaztjYXNlICJFeHRydWRlR2VvbWV0cnkiOmNhc2UgIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtGPTA7Zm9yKEk9ei5zaGFwZXMubGVuZ3RoO0Y8STtGKyspTT1jW3ouc2hhcGVzW0ZdXSxFLnB1c2goTSk7Rj16Lm9wdGlvbnMuZXh0cnVkZVBhdGg7dm9pZCAwIT09RiYmKHoub3B0aW9ucy5leHRydWRlUGF0aD0obmV3IFRpW0YudHlwZV0pLmZyb21KU09OKEYpKTtFPW5ldyBqY1t6LnR5cGVdKEUsei5vcHRpb25zKTticmVhaztjYXNlICJCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOkU9Zy5wYXJzZSh6KTticmVhaztjYXNlICJHZW9tZXRyeSI6IlRIUkVFImluIHdpbmRvdyYmIkxlZ2FjeUpTT05Mb2FkZXIiaW4gVEhSRUU/RT0obmV3IFRIUkVFLkxlZ2FjeUpTT05Mb2FkZXIpLnBhcnNlKHosdGhpcy5yZXNvdXJjZVBhdGgpLmdlb21ldHJ5OmNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKYnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJyt6LnR5cGUrJyInKTtjb250aW51ZX1FLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpOyEwPT09RS5pc0J1ZmZlckdlb21ldHJ5JiZ2b2lkIDAhPT16LnVzZXJEYXRhJiYoRS51c2VyRGF0YT16LnVzZXJEYXRhKTtlW3oudXVpZF09RX1yZXR1cm4gZX0scGFyc2VNYXRlcmlhbHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT17fSxnPXt9O2lmKHZvaWQgMCE9PWEpe3ZhciB0PW5ldyBZZzt0LnNldFRleHR1cmVzKGMpO2M9MDtmb3IodmFyIHY9YS5sZW5ndGg7Yzx2O2MrKyl7dmFyIHo9YVtjXTtpZigiTXVsdGlNYXRlcmlhbCI9PT16LnR5cGUpe2Zvcih2YXIgRT1bXSxGPTA7Rjx6Lm1hdGVyaWFscy5sZW5ndGg7RisrKXt2YXIgST16Lm1hdGVyaWFsc1tGXTt2b2lkIDA9PT1lW0kudXVpZF0mJihlW0kudXVpZF09dC5wYXJzZShJKSk7CkUucHVzaChlW0kudXVpZF0pfWdbei51dWlkXT1FfWVsc2Ugdm9pZCAwPT09ZVt6LnV1aWRdJiYoZVt6LnV1aWRdPXQucGFyc2UoeikpLGdbei51dWlkXT1lW3oudXVpZF19fXJldHVybiBnfSxwYXJzZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIGc9YVtlXSx0PXZjLnBhcnNlKGcpO3ZvaWQgMCE9PWcudXVpZCYmKHQudXVpZD1nLnV1aWQpO2MucHVzaCh0KX1yZXR1cm4gY30scGFyc2VJbWFnZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKFEpe2cubWFuYWdlci5pdGVtU3RhcnQoUSk7cmV0dXJuIHYubG9hZChRLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FbmQoUSl9LHZvaWQgMCxmdW5jdGlvbigpe2cubWFuYWdlci5pdGVtRXJyb3IoUSk7Zy5tYW5hZ2VyLml0ZW1FbmQoUSl9KX12YXIgZz10aGlzLHQ9e307aWYodm9pZCAwIT09YSYmMDxhLmxlbmd0aCl7Yz1uZXcgZWkoYyk7dmFyIHY9bmV3IFdlKGMpO3Yuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CmM9MDtmb3IodmFyIHo9YS5sZW5ndGg7Yzx6O2MrKyl7dmFyIEU9YVtjXSxGPUUudXJsO2lmKEFycmF5LmlzQXJyYXkoRikpe3RbRS51dWlkXT1bXTtmb3IodmFyIEk9MCxNPUYubGVuZ3RoO0k8TTtJKyspe3ZhciBQPUZbSV07UD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChQKT9QOmcucmVzb3VyY2VQYXRoK1A7dFtFLnV1aWRdLnB1c2goZShQKSl9fWVsc2UgUD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChFLnVybCk/RS51cmw6Zy5yZXNvdXJjZVBhdGgrRS51cmwsdFtFLnV1aWRdPWUoUCl9fXJldHVybiB0fSxwYXJzZVRleHR1cmVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShGLEkpe2lmKCJudW1iZXIiPT09dHlwZW9mIEYpcmV0dXJuIEY7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsRik7cmV0dXJuIElbRl19dmFyIGc9e307aWYodm9pZCAwIT09CmEpZm9yKHZhciB0PTAsdj1hLmxlbmd0aDt0PHY7dCsrKXt2YXIgej1hW3RdO3ZvaWQgMD09PXouaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLHoudXVpZCk7dm9pZCAwPT09Y1t6LmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsei5pbWFnZSk7dmFyIEU9QXJyYXkuaXNBcnJheShjW3ouaW1hZ2VdKT9uZXcgZWQoY1t6LmltYWdlXSk6bmV3IGwoY1t6LmltYWdlXSk7RS5uZWVkc1VwZGF0ZT0hMDtFLnV1aWQ9ei51dWlkO3ZvaWQgMCE9PXoubmFtZSYmKEUubmFtZT16Lm5hbWUpO3ZvaWQgMCE9PXoubWFwcGluZyYmKEUubWFwcGluZz1lKHoubWFwcGluZyxmbikpO3ZvaWQgMCE9PXoub2Zmc2V0JiZFLm9mZnNldC5mcm9tQXJyYXkoei5vZmZzZXQpO3ZvaWQgMCE9PXoucmVwZWF0JiZFLnJlcGVhdC5mcm9tQXJyYXkoei5yZXBlYXQpO3ZvaWQgMCE9PXouY2VudGVyJiYKRS5jZW50ZXIuZnJvbUFycmF5KHouY2VudGVyKTt2b2lkIDAhPT16LnJvdGF0aW9uJiYoRS5yb3RhdGlvbj16LnJvdGF0aW9uKTt2b2lkIDAhPT16LndyYXAmJihFLndyYXBTPWUoei53cmFwWzBdLEJrKSxFLndyYXBUPWUoei53cmFwWzFdLEJrKSk7dm9pZCAwIT09ei5mb3JtYXQmJihFLmZvcm1hdD16LmZvcm1hdCk7dm9pZCAwIT09ei50eXBlJiYoRS50eXBlPXoudHlwZSk7dm9pZCAwIT09ei5lbmNvZGluZyYmKEUuZW5jb2Rpbmc9ei5lbmNvZGluZyk7dm9pZCAwIT09ei5taW5GaWx0ZXImJihFLm1pbkZpbHRlcj1lKHoubWluRmlsdGVyLENrKSk7dm9pZCAwIT09ei5tYWdGaWx0ZXImJihFLm1hZ0ZpbHRlcj1lKHoubWFnRmlsdGVyLENrKSk7dm9pZCAwIT09ei5hbmlzb3Ryb3B5JiYoRS5hbmlzb3Ryb3B5PXouYW5pc290cm9weSk7dm9pZCAwIT09ei5mbGlwWSYmKEUuZmxpcFk9ei5mbGlwWSk7dm9pZCAwIT09ei5wcmVtdWx0aXBseUFscGhhJiYoRS5wcmVtdWx0aXBseUFscGhhPQp6LnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PXoudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9ei51bnBhY2tBbGlnbm1lbnQpO2dbei51dWlkXT1FfXJldHVybiBnfSxwYXJzZU9iamVjdDpmdW5jdGlvbihhLGMsZSl7ZnVuY3Rpb24gZyhJKXt2b2lkIDA9PT1jW0ldJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixJKTtyZXR1cm4gY1tJXX1mdW5jdGlvbiB0KEkpe2lmKHZvaWQgMCE9PUkpe2lmKEFycmF5LmlzQXJyYXkoSSkpe2Zvcih2YXIgTT1bXSxQPTAsUT1JLmxlbmd0aDtQPFE7UCsrKXt2YXIgVT1JW1BdO3ZvaWQgMD09PWVbVV0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLFUpO00ucHVzaChlW1VdKX1yZXR1cm4gTX12b2lkIDA9PT1lW0ldJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixJKTtyZXR1cm4gZVtJXX19CnN3aXRjaChhLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdj1uZXcgeTt2b2lkIDAhPT1hLmJhY2tncm91bmQmJk51bWJlci5pc0ludGVnZXIoYS5iYWNrZ3JvdW5kKSYmKHYuYmFja2dyb3VuZD1uZXcgSChhLmJhY2tncm91bmQpKTt2b2lkIDAhPT1hLmZvZyYmKCJGb2ciPT09YS5mb2cudHlwZT92LmZvZz1uZXcgRGcoYS5mb2cuY29sb3IsYS5mb2cubmVhcixhLmZvZy5mYXIpOiJGb2dFeHAyIj09PWEuZm9nLnR5cGUmJih2LmZvZz1uZXcgQ2coYS5mb2cuY29sb3IsYS5mb2cuZGVuc2l0eSkpKTticmVhaztjYXNlICJQZXJzcGVjdGl2ZUNhbWVyYSI6dj1uZXcgdmIoYS5mb3YsYS5hc3BlY3QsYS5uZWFyLGEuZmFyKTt2b2lkIDAhPT1hLmZvY3VzJiYodi5mb2N1cz1hLmZvY3VzKTt2b2lkIDAhPT1hLnpvb20mJih2Lnpvb209YS56b29tKTt2b2lkIDAhPT1hLmZpbG1HYXVnZSYmKHYuZmlsbUdhdWdlPWEuZmlsbUdhdWdlKTt2b2lkIDAhPT1hLmZpbG1PZmZzZXQmJih2LmZpbG1PZmZzZXQ9CmEuZmlsbU9mZnNldCk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjp2PW5ldyBjZyhhLmxlZnQsYS5yaWdodCxhLnRvcCxhLmJvdHRvbSxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEudmlldyYmKHYudmlldz1PYmplY3QuYXNzaWduKHt9LGEudmlldykpO2JyZWFrO2Nhc2UgIkFtYmllbnRMaWdodCI6dj1uZXcgV2coYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dj1uZXcgVmcoYS5jb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6dj1uZXcgVGcoYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOnY9bmV3IFhnKGEuY29sb3IsYS5pbnRlbnNpdHksYS53aWR0aCxhLmhlaWdodCk7YnJlYWs7CmNhc2UgIlNwb3RMaWdodCI6dj1uZXcgU2coYS5jb2xvcixhLmludGVuc2l0eSxhLmRpc3RhbmNlLGEuYW5nbGUsYS5wZW51bWJyYSxhLmRlY2F5KTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOnY9bmV3IFFnKGEuY29sb3IsYS5ncm91bmRDb2xvcixhLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiU2tpbm5lZE1lc2giOmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuIik7Y2FzZSAiTWVzaCI6dj1nKGEuZ2VvbWV0cnkpO3ZhciB6PXQoYS5tYXRlcmlhbCk7dj12LmJvbmVzJiYwPHYuYm9uZXMubGVuZ3RoP25ldyBDZih2LHopOm5ldyB5YSh2LHopO3ZvaWQgMCE9PWEuZHJhd01vZGUmJnYuc2V0RHJhd01vZGUoYS5kcmF3TW9kZSk7YnJlYWs7Y2FzZSAiTE9EIjp2PW5ldyBCZjticmVhaztjYXNlICJMaW5lIjp2PW5ldyBYYihnKGEuZ2VvbWV0cnkpLHQoYS5tYXRlcmlhbCksYS5tb2RlKTsKYnJlYWs7Y2FzZSAiTGluZUxvb3AiOnY9bmV3IEdnKGcoYS5nZW9tZXRyeSksdChhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiTGluZVNlZ21lbnRzIjp2PW5ldyBJYihnKGEuZ2VvbWV0cnkpLHQoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlBvaW50Q2xvdWQiOmNhc2UgIlBvaW50cyI6dj1uZXcgRWUoZyhhLmdlb21ldHJ5KSx0KGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJTcHJpdGUiOnY9bmV3IHpmKHQoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIkdyb3VwIjp2PW5ldyB3ZTticmVhaztkZWZhdWx0OnY9bmV3IEF9di51dWlkPWEudXVpZDt2b2lkIDAhPT1hLm5hbWUmJih2Lm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLm1hdHJpeD8odi5tYXRyaXguZnJvbUFycmF5KGEubWF0cml4KSx2b2lkIDAhPT1hLm1hdHJpeEF1dG9VcGRhdGUmJih2Lm1hdHJpeEF1dG9VcGRhdGU9YS5tYXRyaXhBdXRvVXBkYXRlKSx2Lm1hdHJpeEF1dG9VcGRhdGUmJnYubWF0cml4LmRlY29tcG9zZSh2LnBvc2l0aW9uLAp2LnF1YXRlcm5pb24sdi5zY2FsZSkpOih2b2lkIDAhPT1hLnBvc2l0aW9uJiZ2LnBvc2l0aW9uLmZyb21BcnJheShhLnBvc2l0aW9uKSx2b2lkIDAhPT1hLnJvdGF0aW9uJiZ2LnJvdGF0aW9uLmZyb21BcnJheShhLnJvdGF0aW9uKSx2b2lkIDAhPT1hLnF1YXRlcm5pb24mJnYucXVhdGVybmlvbi5mcm9tQXJyYXkoYS5xdWF0ZXJuaW9uKSx2b2lkIDAhPT1hLnNjYWxlJiZ2LnNjYWxlLmZyb21BcnJheShhLnNjYWxlKSk7dm9pZCAwIT09YS5jYXN0U2hhZG93JiYodi5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdyk7dm9pZCAwIT09YS5yZWNlaXZlU2hhZG93JiYodi5yZWNlaXZlU2hhZG93PWEucmVjZWl2ZVNoYWRvdyk7YS5zaGFkb3cmJih2b2lkIDAhPT1hLnNoYWRvdy5iaWFzJiYodi5zaGFkb3cuYmlhcz1hLnNoYWRvdy5iaWFzKSx2b2lkIDAhPT1hLnNoYWRvdy5yYWRpdXMmJih2LnNoYWRvdy5yYWRpdXM9YS5zaGFkb3cucmFkaXVzKSx2b2lkIDAhPT1hLnNoYWRvdy5tYXBTaXplJiYKdi5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoYS5zaGFkb3cubWFwU2l6ZSksdm9pZCAwIT09YS5zaGFkb3cuY2FtZXJhJiYodi5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QoYS5zaGFkb3cuY2FtZXJhKSkpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKHYudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQpO3ZvaWQgMCE9PWEucmVuZGVyT3JkZXImJih2LnJlbmRlck9yZGVyPWEucmVuZGVyT3JkZXIpO3ZvaWQgMCE9PWEudXNlckRhdGEmJih2LnVzZXJEYXRhPWEudXNlckRhdGEpO3ZvaWQgMCE9PWEubGF5ZXJzJiYodi5sYXllcnMubWFzaz1hLmxheWVycyk7aWYodm9pZCAwIT09YS5jaGlsZHJlbil7ej1hLmNoaWxkcmVuO2Zvcih2YXIgRT0wO0U8ei5sZW5ndGg7RSsrKXYuYWRkKHRoaXMucGFyc2VPYmplY3QoeltFXSxjLGUpKX1pZigiTE9EIj09PWEudHlwZSlmb3IoYT1hLmxldmVscyx6PQowO3o8YS5sZW5ndGg7eisrKXtFPWFbel07dmFyIEY9di5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixFLm9iamVjdCk7dm9pZCAwIT09RiYmdi5hZGRMZXZlbChGLEUuZGlzdGFuY2UpfXJldHVybiB2fX0pO3ZhciBmbj17VVZNYXBwaW5nOjMwMCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6MzAxLEN1YmVSZWZyYWN0aW9uTWFwcGluZzozMDIsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6MzAzLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOjMwNCxTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzozMDUsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6MzA2LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOjMwN30sQms9e1JlcGVhdFdyYXBwaW5nOjFFMyxDbGFtcFRvRWRnZVdyYXBwaW5nOjEwMDEsTWlycm9yZWRSZXBlYXRXcmFwcGluZzoxMDAyfSxDaz17TmVhcmVzdEZpbHRlcjoxMDAzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDQsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjoxMDA1LApMaW5lYXJGaWx0ZXI6MTAwNixMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDcsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOjEwMDh9O2ppLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6amksc2V0T3B0aW9uczpmdW5jdGlvbihhKXt0aGlzLm9wdGlvbnM9YTtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihhLGMsZSxnKXt2b2lkIDA9PT1hJiYoYT0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYT10aGlzLnBhdGgrYSk7YT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChhKTt2YXIgdD10aGlzLHY9a2UuZ2V0KGEpO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHQubWFuYWdlci5pdGVtU3RhcnQoYSksc2V0VGltZW91dChmdW5jdGlvbigpe2MmJmModik7dC5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApLHY7ZmV0Y2goYSkudGhlbihmdW5jdGlvbih6KXtyZXR1cm4gei5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB2b2lkIDA9PT0KdC5vcHRpb25zP2NyZWF0ZUltYWdlQml0bWFwKHopOmNyZWF0ZUltYWdlQml0bWFwKHosdC5vcHRpb25zKX0pLnRoZW4oZnVuY3Rpb24oeil7a2UuYWRkKGEseik7YyYmYyh6KTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0pLmNhdGNoKGZ1bmN0aW9uKHope2cmJmcoeik7dC5tYW5hZ2VyLml0ZW1FcnJvcihhKTt0Lm1hbmFnZXIuaXRlbUVuZChhKX0pO3QubWFuYWdlci5pdGVtU3RhcnQoYSl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse21vdmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGg9bmV3IEljO3RoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKTt0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhhLGMpfSxsaW5lVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyhhLGMpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKGEsYyxlLGcpe3RoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhhLGMsZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyx0LHYpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhhLGMsZSxnLHQsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KGEpfSx0b1NoYXBlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoZGEpe2Zvcih2YXIgcmE9W10scGE9MCxxYT1kYS5sZW5ndGg7cGE8cWE7cGErKyl7dmFyIHVhPWRhW3BhXSxuYT1uZXcgRmQ7bmEuY3VydmVzPXVhLmN1cnZlcztyYS5wdXNoKG5hKX1yZXR1cm4gcmF9ZnVuY3Rpb24gZyhkYSxyYSl7Zm9yKHZhciBwYT1yYS5sZW5ndGgscWE9ITEsdWE9cGEtMSxuYT0wO25hPHBhO3VhPW5hKyspe3ZhciB0YT1yYVt1YV0sQmE9cmFbbmFdLFRhPUJhLngtdGEueCxVYT1CYS55LXRhLnk7aWYoTWF0aC5hYnMoVWEpPk51bWJlci5FUFNJTE9OKXtpZigwPlVhJiYodGE9cmFbbmFdLFRhPS1UYSxCYT1yYVt1YV0sVWE9LVVhKSwhKGRhLnk8dGEueXx8ZGEueT5CYS55KSlpZihkYS55PT09dGEueSl7aWYoZGEueD09PQp0YS54KXJldHVybiEwfWVsc2V7dWE9VWEqKGRhLngtdGEueCktVGEqKGRhLnktdGEueSk7aWYoMD09PXVhKXJldHVybiEwOzA+dWF8fChxYT0hcWEpfX1lbHNlIGlmKGRhLnk9PT10YS55JiYoQmEueDw9ZGEueCYmZGEueDw9dGEueHx8dGEueDw9ZGEueCYmZGEueDw9QmEueCkpcmV0dXJuITB9cmV0dXJuIHFhfXZhciB0PWdkLmlzQ2xvY2tXaXNlLHY9dGhpcy5zdWJQYXRocztpZigwPT09di5sZW5ndGgpcmV0dXJuW107aWYoITA9PT1jKXJldHVybiBlKHYpO2M9W107aWYoMT09PXYubGVuZ3RoKXt2YXIgej12WzBdO3ZhciBFPW5ldyBGZDtFLmN1cnZlcz16LmN1cnZlcztjLnB1c2goRSk7cmV0dXJuIGN9dmFyIEY9IXQodlswXS5nZXRQb2ludHMoKSk7Rj1hPyFGOkY7RT1bXTt2YXIgST1bXSxNPVtdLFA9MDtJW1BdPXZvaWQgMDtNW1BdPVtdO2Zvcih2YXIgUT0wLFU9di5sZW5ndGg7UTxVO1ErKyl7ej12W1FdO3ZhciBWPXouZ2V0UG9pbnRzKCk7dmFyIGVhPXQoVik7KGVhPWE/IWVhOgplYSk/KCFGJiZJW1BdJiZQKyssSVtQXT17czpuZXcgRmQscDpWfSxJW1BdLnMuY3VydmVzPXouY3VydmVzLEYmJlArKyxNW1BdPVtdKTpNW1BdLnB1c2goe2g6eixwOlZbMF19KX1pZighSVswXSlyZXR1cm4gZSh2KTtpZigxPEkubGVuZ3RoKXtRPSExO2E9W107dD0wO2Zvcih2PUkubGVuZ3RoO3Q8djt0KyspRVt0XT1bXTt0PTA7Zm9yKHY9SS5sZW5ndGg7dDx2O3QrKylmb3Ioej1NW3RdLGVhPTA7ZWE8ei5sZW5ndGg7ZWErKyl7Rj16W2VhXTtQPSEwO2ZvcihWPTA7VjxJLmxlbmd0aDtWKyspZyhGLnAsSVtWXS5wKSYmKHQhPT1WJiZhLnB1c2goe2Zyb21zOnQsdG9zOlYsaG9sZTplYX0pLFA/KFA9ITEsRVtWXS5wdXNoKEYpKTpRPSEwKTtQJiZFW3RdLnB1c2goRil9MDxhLmxlbmd0aCYmKFF8fChNPUUpKX1RPTA7Zm9yKHQ9SS5sZW5ndGg7UTx0O1ErKylmb3IoRT1JW1FdLnMsYy5wdXNoKEUpLGE9TVtRXSx2PTAsej1hLmxlbmd0aDt2PHo7disrKUUuaG9sZXMucHVzaChhW3ZdLmgpOwpyZXR1cm4gY319KTtPYmplY3QuYXNzaWduKGxpLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MTAwKTt2YXIgZT1bXTthPVFtKGEsYyx0aGlzLmRhdGEpO2M9MDtmb3IodmFyIGc9YS5sZW5ndGg7YzxnO2MrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlLGFbY10udG9TaGFwZXMoKSk7cmV0dXJuIGV9fSk7bWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjptaSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PXRoaXMsdj1uZXcgd2ModGhpcy5tYW5hZ2VyKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXt0cnl7dmFyIEU9SlNPTi5wYXJzZSh6KX1jYXRjaChGKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSwKRT1KU09OLnBhcnNlKHouc3Vic3RyaW5nKDY1LHoubGVuZ3RoLTIpKX16PXQucGFyc2UoRSk7YyYmYyh6KX0sZSxnKX0scGFyc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBsaShhKX19KTt2YXIgQmgscmk9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT1CaCYmKEJoPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiBCaH0sc2V0Q29udGV4dDpmdW5jdGlvbihhKXtCaD1hfX07Y2gucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjaCxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciB0PW5ldyB3Yyh0aGlzLm1hbmFnZXIpO3Quc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3Quc2V0UGF0aCh0aGlzLnBhdGgpO3QubG9hZChhLGZ1bmN0aW9uKHYpe3Y9di5zbGljZSgwKTtyaS5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHYsZnVuY3Rpb24oeil7Yyh6KX0pfSwKZSxnKX19KTtPYmplY3QuYXNzaWduKGRoLnByb3RvdHlwZSx7aXNTcGhlcmljYWxIYXJtb25pY3MzOiEwLHNldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmNvcHkoYVtjXSk7cmV0dXJuIHRoaXN9LHplcm86ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDs5PmE7YSsrKXRoaXMuY29lZmZpY2llbnRzW2FdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9LGdldEF0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciB0PXRoaXMuY29lZmZpY2llbnRzO2MuY29weSh0WzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KTtjLmFkZFNjYWxlKHRbMV0sLjQ4ODYwMypnKTtjLmFkZFNjYWxlKHRbMl0sLjQ4ODYwMyphKTtjLmFkZFNjYWxlKHRbM10sLjQ4ODYwMyplKTtjLmFkZFNjYWxlKHRbNF0sMS4wOTI1NDgqZSpnKTtjLmFkZFNjYWxlKHRbNV0sMS4wOTI1NDgqZyphKTtjLmFkZFNjYWxlKHRbNl0sLjMxNTM5MiooMyphKmEtMSkpOwpjLmFkZFNjYWxlKHRbN10sMS4wOTI1NDgqZSphKTtjLmFkZFNjYWxlKHRbOF0sLjU0NjI3NCooZSplLWcqZykpO3JldHVybiBjfSxnZXRJcnJhZGlhbmNlQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHQ9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHRbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpO2MuYWRkU2NhbGUodFsxXSwxLjAyMzMyOCpnKTtjLmFkZFNjYWxlKHRbMl0sMS4wMjMzMjgqYSk7Yy5hZGRTY2FsZSh0WzNdLDEuMDIzMzI4KmUpO2MuYWRkU2NhbGUodFs0XSwuODU4MDg2KmUqZyk7Yy5hZGRTY2FsZSh0WzVdLC44NTgwODYqZyphKTtjLmFkZFNjYWxlKHRbNl0sLjc0MzEyNSphKmEtLjI0NzcwOCk7Yy5hZGRTY2FsZSh0WzddLC44NTgwODYqZSphKTtjLmFkZFNjYWxlKHRbOF0sLjQyOTA0MyooZSplLWcqZykpO3JldHVybiBjfSxhZGQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5hZGQoYS5jb2VmZmljaWVudHNbY10pOwpyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKyl0aGlzLmNvZWZmaWNpZW50c1tjXS5tdWx0aXBseVNjYWxhcihhKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT0wOzk+ZTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubGVycChhLmNvZWZmaWNpZW50c1tlXSxjKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2NdLmVxdWFscyhhLmNvZWZmaWNpZW50c1tjXSkpcmV0dXJuITE7cmV0dXJuITB9LGNvcHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0KGEuY29lZmZpY2llbnRzKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO2Zvcih2YXIgZT10aGlzLmNvZWZmaWNpZW50cyxnPTA7OT5nO2crKyllW2ddLmZyb21BcnJheShhLApjKzMqZyk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10udG9BcnJheShhLGMrMypnKTtyZXR1cm4gYX19KTtPYmplY3QuYXNzaWduKGRoLHtnZXRCYXNpc0F0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O2NbMF09LjI4MjA5NTtjWzFdPS40ODg2MDMqZztjWzJdPS40ODg2MDMqYTtjWzNdPS40ODg2MDMqZTtjWzRdPTEuMDkyNTQ4KmUqZztjWzVdPTEuMDkyNTQ4KmcqYTtjWzZdPS4zMTUzOTIqKDMqYSphLTEpO2NbN109MS4wOTI1NDgqZSphO2NbOF09LjU0NjI3NCooZSplLWcqZyl9fSk7SmMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpKYyxpc0xpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtLYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuc2guY29weShhLnNoKTt0aGlzLmludGVuc2l0eT1hLmludGVuc2l0eTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBLYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtuaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm5pLGlzSGVtaXNwaGVyZUxpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtKYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSmMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSl9fSk7b2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpvaSxpc0FtYmllbnRMaWdodFByb2JlOiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpjLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLAphKX19KTt2YXIgRGs9bmV3IHEsRWs9bmV3IHE7T2JqZWN0LmFzc2lnbihaai5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9jYWNoZTtpZihjLmZvY3VzIT09YS5mb2N1c3x8Yy5mb3YhPT1hLmZvdnx8Yy5hc3BlY3QhPT1hLmFzcGVjdCp0aGlzLmFzcGVjdHx8Yy5uZWFyIT09YS5uZWFyfHxjLmZhciE9PWEuZmFyfHxjLnpvb20hPT1hLnpvb218fGMuZXllU2VwIT09dGhpcy5leWVTZXApe2MuZm9jdXM9YS5mb2N1cztjLmZvdj1hLmZvdjtjLmFzcGVjdD1hLmFzcGVjdCp0aGlzLmFzcGVjdDtjLm5lYXI9YS5uZWFyO2MuZmFyPWEuZmFyO2Muem9vbT1hLnpvb207Yy5leWVTZXA9dGhpcy5leWVTZXA7dmFyIGU9YS5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCksZz1jLmV5ZVNlcC8yLHQ9ZypjLm5lYXIvYy5mb2N1cyx2PWMubmVhcipNYXRoLnRhbihoYi5ERUcyUkFEKmMuZm92Ki41KS9jLnpvb207RWsuZWxlbWVudHNbMTJdPS1nO0RrLmVsZW1lbnRzWzEyXT0KZztnPS12KmMuYXNwZWN0K3Q7dmFyIHo9dipjLmFzcGVjdCt0O2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpO2c9LXYqYy5hc3BlY3QtdDt6PXYqYy5hc3BlY3QtdDtlLmVsZW1lbnRzWzBdPTIqYy5uZWFyLyh6LWcpO2UuZWxlbWVudHNbOF09KHorZykvKHotZyk7dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShlKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseShFayk7dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoYS5tYXRyaXhXb3JsZCkubXVsdGlwbHkoRGspfX0pO09iamVjdC5hc3NpZ24ocGkucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7CnRoaXMuZWxhcHNlZFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITB9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmdldEVsYXBzZWRUaW1lKCk7dGhpcy5hdXRvU3RhcnQ9dGhpcy5ydW5uaW5nPSExfSxnZXRFbGFwc2VkVGltZTpmdW5jdGlvbigpe3RoaXMuZ2V0RGVsdGEoKTtyZXR1cm4gdGhpcy5lbGFwc2VkVGltZX0sZ2V0RGVsdGE6ZnVuY3Rpb24oKXt2YXIgYT0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBjPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTthPShjLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1jO3RoaXMuZWxhcHNlZFRpbWUrPWF9cmV0dXJuIGF9fSk7dmFyIGxlPW5ldyBrLEZrPW5ldyBoLGduPW5ldyBrLG1lPW5ldyBrO3FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6cWksZ2V0SW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxyZW1vdmVGaWx0ZXI6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcn0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe251bGwhPT10aGlzLmZpbHRlcj8odGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSk6dGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTt0aGlzLmZpbHRlcj1hO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZmlsdGVyKTsKdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3JldHVybiB0aGlzfSxnZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9LHNldE1hc3RlclZvbHVtZTpmdW5jdGlvbihhKXt0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoYSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKTtyZXR1cm4gdGhpc30sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpO2E9dGhpcy5jb250ZXh0Lmxpc3RlbmVyO3ZhciBjPXRoaXMudXA7dGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSxGayxnbik7bWUuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKEZrKTtpZihhLnBvc2l0aW9uWCl7dmFyIGU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhOwphLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGUpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksZSk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixlKTthLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLngsZSk7YS5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS55LGUpO2EuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixlKTthLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLngsZSk7YS51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy55LGUpO2EudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueixlKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCxsZS55LGxlLnopLGEuc2V0T3JpZW50YXRpb24obWUueCxtZS55LG1lLnosYy54LGMueSxjLnopfX0pO1llLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6WWUsZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0sc2V0Tm9kZVNvdXJjZTpmdW5jdGlvbihhKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9ImF1ZGlvTm9kZSI7dGhpcy5zb3VyY2U9YTt0aGlzLmNvbm5lY3QoKTtyZXR1cm4gdGhpc30sc2V0TWVkaWFFbGVtZW50U291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIjt0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGEpO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXI9YTt0aGlzLnNvdXJjZVR5cGU9ImJ1ZmZlciI7dGhpcy5hdXRvcGxheSYmdGhpcy5wbGF5KCk7cmV0dXJuIHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKZWxzZSBpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZXt2YXIgYT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7YS5idWZmZXI9dGhpcy5idWZmZXI7YS5sb29wPXRoaXMubG9vcDthLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyk7dGhpcy5zdGFydFRpbWU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO2Euc3RhcnQodGhpcy5zdGFydFRpbWUsdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbik7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9YTt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0Kz0odGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLXRoaXMuc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmlzUGxheWluZz0hMSksdGhpc30sc3RvcDpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLQoxXS5jb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZigwPHRoaXMuZmlsdGVycy5sZW5ndGgpe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IodmFyIGE9MSxjPXRoaXMuZmlsdGVycy5sZW5ndGg7YTxjO2ErKyl0aGlzLmZpbHRlcnNbYS0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1thXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGEpe2F8fAooYT1bXSk7ITA9PT10aGlzLmlzUGxheWluZz8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWEsdGhpcy5jb25uZWN0KCkpOnRoaXMuZmlsdGVycz1hO3JldHVybiB0aGlzfSxzZXREZXR1bmU6ZnVuY3Rpb24oYSl7dGhpcy5kZXR1bmU9YTtpZih2b2lkIDAhPT10aGlzLnNvdXJjZS5kZXR1bmUpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYT9bYV06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZT1hLCEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc30sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfSxvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYSl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD0KYSwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9LGdldFZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0Vm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfX0pO3ZhciBuZT1uZXcgayxHaz1uZXcgaCxobj1uZXcgayxvZT1uZXcgaztzaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFllLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnNpLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lcn0sZ2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9LHNldFJlZkRpc3RhbmNlOmZ1bmN0aW9uKGEpe3RoaXMucGFubmVyLnJlZkRpc3RhbmNlPWE7cmV0dXJuIHRoaXN9LGdldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcn0sCnNldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj1hO3JldHVybiB0aGlzfSxnZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWx9LHNldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbD1hO3JldHVybiB0aGlzfSxnZXRNYXhEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX0sc2V0TWF4RGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sc2V0RGlyZWN0aW9uYWxDb25lOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZT1hO3RoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlPWM7dGhpcy5wYW5uZXIuY29uZU91dGVyR2Fpbj1lO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsCmEpO2lmKCEwIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2x8fCExIT09dGhpcy5pc1BsYXlpbmcpaWYodGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UobmUsR2ssaG4pLG9lLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKEdrKSxhPXRoaXMucGFubmVyLGEucG9zaXRpb25YKXt2YXIgYz10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7YS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobmUueCxjKTthLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuZS55LGMpO2EucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG5lLnosYyk7YS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUob2UueCxjKTthLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvZS55LGMpO2Eub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG9lLnosYyl9ZWxzZSBhLnNldFBvc2l0aW9uKG5lLngsCm5lLnksbmUueiksYS5zZXRPcmllbnRhdGlvbihvZS54LG9lLnksb2Uueil9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUse2dldEZyZXF1ZW5jeURhdGE6ZnVuY3Rpb24oKXt0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksZT0wO2U8Yy5sZW5ndGg7ZSsrKWErPWNbZV07cmV0dXJuIGEvYy5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbih1aS5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmJ1ZmZlcixnPXRoaXMudmFsdWVTaXplO2E9YSpnK2c7dmFyIHQ9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT10KXtmb3IodD0wO3QhPT1nOysrdCllW2ErdF09ZVt0XTt0PWN9ZWxzZSB0Kz1jLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihlLGEsMCxjL3QsZyk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PQp0fSxhcHBseTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZhbHVlU2l6ZSxlPXRoaXMuYnVmZmVyO2E9YSpjK2M7dmFyIGc9dGhpcy5jdW11bGF0aXZlV2VpZ2h0LHQ9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wOzE+ZyYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwzKmMsMS1nLGMpO2c9Yztmb3IodmFyIHY9YytjO2chPT12OysrZylpZihlW2ddIT09ZVtnK2NdKXt0LnNldFZhbHVlKGUsYSk7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYnVmZmVyLGM9dGhpcy52YWx1ZVNpemUsZT0zKmM7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGEsZSk7Zm9yKHZhciBnPWM7ZyE9PWU7KytnKWFbZ109YVtlK2clY107dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGEsCmMsZSxnLHQpe2lmKC41PD1nKWZvcihnPTA7ZyE9PXQ7KytnKWFbYytnXT1hW2UrZ119LF9zbGVycDpmdW5jdGlvbihhLGMsZSxnKXtoLnNsZXJwRmxhdChhLGMsYSxjLGEsZSxnKX0sX2xlcnA6ZnVuY3Rpb24oYSxjLGUsZyx0KXtmb3IodmFyIHY9MS1nLHo9MDt6IT09dDsrK3ope3ZhciBFPWMrejthW0VdPWFbRV0qdithW2Urel0qZ319fSk7dmFyIGpuPS9bXFtcXVwuOlwvXS9nLGtuPSJbXiIrIlxcW1xcXVxcLjpcXC8iLnJlcGxhY2UoIlxcLiIsIiIpKyJdIixsbj0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksbW49LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsa24pLG5uPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksb249L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIikscG49Cm5ldyBSZWdFeHAoIl4iK2xuK21uK25uK29uKyIkIikscW49WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07T2JqZWN0LmFzc2lnbihhay5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dmFyIGU9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1lJiZlLmdldFZhbHVlKGEsYyl9LHNldFZhbHVlOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHQ9ZS5sZW5ndGg7ZyE9PXQ7KytnKWVbZ10uc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9iaW5kaW5ncyxjPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxlPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLAplPWEubGVuZ3RoO2MhPT1lOysrYylhW2NdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24oY2Mse0NvbXBvc2l0ZTphayxjcmVhdGU6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhJiZhLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IGNjLkNvbXBvc2l0ZShhLGMsZSk6bmV3IGNjKGEsYyxlKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShqbiwiIil9LHBhcnNlVHJhY2tOYW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXBuLmV4ZWMoYSk7aWYoIWMpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIithKTtjPXtub2RlTmFtZTpjWzJdLG9iamVjdE5hbWU6Y1szXSxvYmplY3RJbmRleDpjWzRdLHByb3BlcnR5TmFtZTpjWzVdLHByb3BlcnR5SW5kZXg6Y1s2XX07dmFyIGU9Yy5ub2RlTmFtZSYmYy5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWUmJi0xIT09CmUpe3ZhciBnPWMubm9kZU5hbWUuc3Vic3RyaW5nKGUrMSk7LTEhPT1xbi5pbmRleE9mKGcpJiYoYy5ub2RlTmFtZT1jLm5vZGVOYW1lLnN1YnN0cmluZygwLGUpLGMub2JqZWN0TmFtZT1nKX1pZihudWxsPT09Yy5wcm9wZXJ0eU5hbWV8fDA9PT1jLnByb3BlcnR5TmFtZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrYSk7cmV0dXJuIGN9LGZpbmROb2RlOmZ1bmN0aW9uKGEsYyl7aWYoIWN8fCIiPT09Y3x8InJvb3QiPT09Y3x8Ii4iPT09Y3x8LTE9PT1jfHxjPT09YS5uYW1lfHxjPT09YS51dWlkKXJldHVybiBhO2lmKGEuc2tlbGV0b24pe3ZhciBlPWEuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShjKTtpZih2b2lkIDAhPT1lKXJldHVybiBlfWlmKGEuY2hpbGRyZW4pe3ZhciBnPWZ1bmN0aW9uKHQpe2Zvcih2YXIgdj0wO3Y8dC5sZW5ndGg7disrKXt2YXIgej10W3ZdO2lmKHoubmFtZT09PQpjfHx6LnV1aWQ9PT1jKXJldHVybiB6O2lmKHo9Zyh6LmNoaWxkcmVuKSlyZXR1cm4gen1yZXR1cm4gbnVsbH07aWYoYT1nKGEuY2hpbGRyZW4pKXJldHVybiBhfXJldHVybiBudWxsfX0pO09iamVjdC5hc3NpZ24oY2MucHJvdG90eXBlLHtfZ2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LF9zZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sQmluZGluZ1R5cGU6e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sVmVyc2lvbmluZzp7Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxHZXR0ZXJCeUJpbmRpbmdUeXBlOltmdW5jdGlvbihhLGMpe2FbY109dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCx0PWUubGVuZ3RoO2chPT10OysrZylhW2MrK109ZVtnXX0sZnVuY3Rpb24oYSxjKXthW2NdPQp0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShhLGMpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCx0PWUubGVuZ3RoO2chPT10OysrZyllW2ddPWFbYysrXX0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LApnPTAsdD1lLmxlbmd0aDtnIT09dDsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxnPTAsdD1lLmxlbmd0aDtnIT09dDsrK2cpZVtnXT1hW2MrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsCmMpfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGEsYyk7dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dXSxnZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt0aGlzLnNldFZhbHVlKGEsYyl9LGJpbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5vZGUsYz10aGlzLnBhcnNlZFBhdGgsZT1jLm9iamVjdE5hbWUsZz1jLnByb3BlcnR5TmFtZSx0PWMucHJvcGVydHlJbmRleDthfHwodGhpcy5ub2RlPWE9Y2MuZmluZE5vZGUodGhpcy5yb290Tm9kZSxjLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSk7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihhKXtpZihlKXt2YXIgdj1jLm9iamVjdEluZGV4O3N3aXRjaChlKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFhLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighYS5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59YT1hLm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlICJib25lcyI6aWYoIWEuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsCnRoaXMpO3JldHVybn1hPWEuc2tlbGV0b24uYm9uZXM7Zm9yKGU9MDtlPGEubGVuZ3RoO2UrKylpZihhW2VdLm5hbWU9PT12KXt2PWU7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1hW2VdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWE9YVtlXX1pZih2b2lkIDAhPT12KXtpZih2b2lkIDA9PT1hW3ZdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGEpO3JldHVybn1hPWFbdl19fXY9YVtnXTtpZih2b2lkIDA9PT12KWNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrYy5ub2RlTmFtZSsiLiIrZysiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwKYSk7ZWxzZXtjPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWE7dm9pZCAwIT09YS5uZWVkc1VwZGF0ZT9jPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1hLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihjPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtlPXRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O2lmKHZvaWQgMCE9PXQpe2lmKCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiPT09Zyl7aWYoIWEuZ2VvbWV0cnkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7cmV0dXJufWlmKGEuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSl7aWYoIWEuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwKdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bZV0ubmFtZT09PXQpe3Q9ZTticmVha319ZWxzZXtpZighYS5nZW9tZXRyeS5tb3JwaFRhcmdldHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4iLHRoaXMpO3JldHVybn1mb3IoZT0wO2U8dGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7ZSsrKWlmKGEuZ2VvbWV0cnkubW9ycGhUYXJnZXRzW2VdLm5hbWU9PT10KXt0PWU7YnJlYWt9fX1lPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O3RoaXMucmVzb2x2ZWRQcm9wZXJ0eT12O3RoaXMucHJvcGVydHlJbmRleD10fWVsc2Ugdm9pZCAwIT09CnYuZnJvbUFycmF5JiZ2b2lkIDAhPT12LnRvQXJyYXk/KGU9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dik6QXJyYXkuaXNBcnJheSh2KT8oZT10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTp0aGlzLnByb3BlcnR5TmFtZT1nO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2VdO3RoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1tlXVtjXX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKX0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5ub2RlPW51bGw7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kO3RoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19KTsKT2JqZWN0LmFzc2lnbihjYy5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOmNjLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDpjYy5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKGJrLnByb3RvdHlwZSx7aXNBbmltYXRpb25PYmplY3RHcm91cDohMCxhZGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPWEubGVuZ3RoLGU9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZz10aGlzLl9pbmRpY2VzQnlVVUlELHQ9dGhpcy5fcGF0aHMsdj10aGlzLl9wYXJzZWRQYXRocyx6PXRoaXMuX2JpbmRpbmdzLEU9ei5sZW5ndGgsRj12b2lkIDAsST0wLE09YXJndW1lbnRzLmxlbmd0aDtJIT09TTsrK0kpe3ZhciBQPWFyZ3VtZW50c1tJXSxRPVAudXVpZCxVPWdbUV07aWYodm9pZCAwPT09VSl7VT1jKys7Z1tRXT1VO2EucHVzaChQKTtRPTA7Zm9yKHZhciBWPUU7USE9PVY7KytRKXpbUV0ucHVzaChuZXcgY2MoUCx0W1FdLHZbUV0pKX1lbHNlIGlmKFU8CmUpe0Y9YVtVXTt2YXIgZWE9LS1lO1Y9YVtlYV07Z1tWLnV1aWRdPVU7YVtVXT1WO2dbUV09ZWE7YVtlYV09UDtRPTA7Zm9yKFY9RTtRIT09VjsrK1Epe3ZhciBkYT16W1FdLHJhPWRhW1VdO2RhW1VdPWRhW2VhXTt2b2lkIDA9PT1yYSYmKHJhPW5ldyBjYyhQLHRbUV0sdltRXSkpO2RhW2VhXT1yYX19ZWxzZSBhW1VdIT09RiYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb2JqZWN0cyxjPXRoaXMubkNhY2hlZE9iamVjdHNfLGU9dGhpcy5faW5kaWNlc0J5VVVJRCxnPXRoaXMuX2JpbmRpbmdzLHQ9Zy5sZW5ndGgsdj0wLHo9YXJndW1lbnRzLmxlbmd0aDt2IT09Cno7Kyt2KXt2YXIgRT1hcmd1bWVudHNbdl0sRj1FLnV1aWQsST1lW0ZdO2lmKHZvaWQgMCE9PUkmJkk+PWMpe3ZhciBNPWMrKyxQPWFbTV07ZVtQLnV1aWRdPUk7YVtJXT1QO2VbRl09TTthW01dPUU7RT0wO2ZvcihGPXQ7RSE9PUY7KytFKXtQPWdbRV07dmFyIFE9UFtJXTtQW0ldPVBbTV07UFtNXT1RfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189Y30sdW5jYWNoZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQsdD10aGlzLl9iaW5kaW5ncyx2PXQubGVuZ3RoLHo9MCxFPWFyZ3VtZW50cy5sZW5ndGg7eiE9PUU7Kyt6KXt2YXIgRj1hcmd1bWVudHNbel0udXVpZCxJPWdbRl07aWYodm9pZCAwIT09SSlpZihkZWxldGUgZ1tGXSxJPGUpe0Y9LS1lO3ZhciBNPWFbRl0sUD0tLWMsUT1hW1BdO2dbTS51dWlkXT1JO2FbSV09TTtnW1EudXVpZF09RjthW0ZdPVE7YS5wb3AoKTtNPQowO2ZvcihRPXY7TSE9PVE7KytNKXt2YXIgVT10W01dLFY9VVtQXTtVW0ldPVVbRl07VVtGXT1WO1UucG9wKCl9fWVsc2UgZm9yKFA9LS1jLFE9YVtQXSxnW1EudXVpZF09SSxhW0ldPVEsYS5wb3AoKSxNPTAsUT12O00hPT1ROysrTSlVPXRbTV0sVVtJXT1VW1BdLFUucG9wKCl9dGhpcy5uQ2FjaGVkT2JqZWN0c189ZX0sc3Vic2NyaWJlXzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxnPWVbYV0sdD10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1nKXJldHVybiB0W2ddO3ZhciB2PXRoaXMuX3BhdGhzLHo9dGhpcy5fcGFyc2VkUGF0aHMsRT10aGlzLl9vYmplY3RzLEY9dGhpcy5uQ2FjaGVkT2JqZWN0c18sST1BcnJheShFLmxlbmd0aCk7Zz10Lmxlbmd0aDtlW2FdPWc7di5wdXNoKGEpO3oucHVzaChjKTt0LnB1c2goSSk7ZT1GO2ZvcihnPUUubGVuZ3RoO2UhPT1nOysrZSlJW2VdPW5ldyBjYyhFW2VdLGEsYyk7cmV0dXJuIEl9LHVuc3Vic2NyaWJlXzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGU9Y1thXTtpZih2b2lkIDAhPT1lKXt2YXIgZz10aGlzLl9wYXRocyx0PXRoaXMuX3BhcnNlZFBhdGhzLHY9dGhpcy5fYmluZGluZ3Msej12Lmxlbmd0aC0xLEU9dlt6XTtjW2Fbel1dPWU7dltlXT1FO3YucG9wKCk7dFtlXT10W3pdO3QucG9wKCk7Z1tlXT1nW3pdO2cucG9wKCl9fX0pO09iamVjdC5hc3NpZ24oY2sucHJvdG90eXBlLHtwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50aW1lPTA7dGhpcy5fbG9vcENvdW50PS0xO3RoaXMuX3N0YXJ0VGltZT1udWxsO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYKIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0saXNTY2hlZHVsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxzdGFydEF0OmZ1bmN0aW9uKGEpe3RoaXMuX3N0YXJ0VGltZT1hO3JldHVybiB0aGlzfSxzZXRMb29wOmZ1bmN0aW9uKGEsYyl7dGhpcy5sb29wPWE7dGhpcy5yZXBldGl0aW9ucz1jO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oYSl7dGhpcy53ZWlnaHQ9YTt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP2E6MDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCl9LGdldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9LGZhZGVJbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYSwwLDEpfSxmYWRlT3V0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLAoxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGEsYyxlKXthLmZhZGVPdXQoYyk7dGhpcy5mYWRlSW4oYyk7aWYoZSl7ZT10aGlzLl9jbGlwLmR1cmF0aW9uO3ZhciBnPWEuX2NsaXAuZHVyYXRpb24sdD1lL2c7YS53YXJwKDEsZy9lLGMpO3RoaXMud2FycCh0LDEsYyl9cmV0dXJuIHRoaXN9LGNyb3NzRmFkZVRvOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gYS5jcm9zc0ZhZGVGcm9tKHRoaXMsYyxlKX0sc3RvcEZhZGluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dGhpcy50aW1lU2NhbGU9YTt0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDphO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGdldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9LApzZXREdXJhdGlvbjpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL2E7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sc3luY1dpdGg6ZnVuY3Rpb24oYSl7dGhpcy50aW1lPWEudGltZTt0aGlzLnRpbWVTY2FsZT1hLnRpbWVTY2FsZTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxoYWx0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsYSl9LHdhcnA6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHQ9Zy50aW1lLHY9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsej10aGlzLnRpbWVTY2FsZTtudWxsPT09diYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXY9Zy5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpKTtnPXYucGFyYW1ldGVyUG9zaXRpb25zO3Y9di5zYW1wbGVWYWx1ZXM7Z1swXT10O2dbMV09dCtlO3ZbMF09YS96O3ZbMV09Yy96O3JldHVybiB0aGlzfSxzdG9wV2FycGluZzpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtudWxsIT09YSYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGEpKTtyZXR1cm4gdGhpc30sZ2V0TWl4ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9LGdldENsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fSxfdXBkYXRlOmZ1bmN0aW9uKGEsYyxlLGcpe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHQ9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT10KXtjPShhLXQpKmU7aWYoMD5jfHwwPT09ZSlyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGw7Yyo9ZX1jKj10aGlzLl91cGRhdGVUaW1lU2NhbGUoYSk7ZT10aGlzLl91cGRhdGVUaW1lKGMpO2E9dGhpcy5fdXBkYXRlV2VpZ2h0KGEpO2lmKDA8YSl7Yz10aGlzLl9pbnRlcnBvbGFudHM7CnQ9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIHY9MCx6PWMubGVuZ3RoO3YhPT16OysrdiljW3ZdLmV2YWx1YXRlKGUpLHRbdl0uYWNjdW11bGF0ZShnLGEpfX1lbHNlIHRoaXMuX3VwZGF0ZVdlaWdodChhKX0sX3VwZGF0ZVdlaWdodDpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKHRoaXMuZW5hYmxlZCl7Yz10aGlzLndlaWdodDt2YXIgZT10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTtjKj1nO2E+ZS5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09ZyYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWN9LF91cGRhdGVUaW1lU2NhbGU6ZnVuY3Rpb24oYSl7dmFyIGM9MDtpZighdGhpcy5wYXVzZWQpe2M9dGhpcy50aW1lU2NhbGU7dmFyIGU9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobnVsbCE9PWUpe3ZhciBnPWUuZXZhbHVhdGUoYSlbMF07CmMqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSwwPT09Yz90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1jKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1jfSxfdXBkYXRlVGltZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRpbWUrYSxlPXRoaXMuX2NsaXAuZHVyYXRpb24sZz10aGlzLmxvb3AsdD10aGlzLl9sb29wQ291bnQsdj0yMjAyPT09ZztpZigwPT09YSlyZXR1cm4tMT09PXQ/Yzp2JiYxPT09KHQmMSk/ZS1jOmM7aWYoMjIwMD09PWcpYTp7aWYoLTE9PT10JiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpLGM+PWUpYz1lO2Vsc2UgaWYoMD5jKWM9MDtlbHNle3RoaXMudGltZT1jO2JyZWFrIGF9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITE7dGhpcy50aW1lPWM7dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLAphY3Rpb246dGhpcyxkaXJlY3Rpb246MD5hPy0xOjF9KX1lbHNley0xPT09dCYmKDA8PWE/KHQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLDA9PT10aGlzLnJlcGV0aXRpb25zLHYpKTp0aGlzLl9zZXRFbmRpbmdzKDA9PT10aGlzLnJlcGV0aXRpb25zLCEwLHYpKTtpZihjPj1lfHwwPmMpe2c9TWF0aC5mbG9vcihjL2UpO2MtPWUqZzt0Kz1NYXRoLmFicyhnKTt2YXIgej10aGlzLnJlcGV0aXRpb25zLXQ7MD49ej8odGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWM9MDxhP2U6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8YT8xOi0xfSkpOigxPT09ej8oYT0wPmEsdGhpcy5fc2V0RW5kaW5ncyhhLCFhLHYpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHYpLHRoaXMuX2xvb3BDb3VudD10LHRoaXMudGltZT1jLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLAphY3Rpb246dGhpcyxsb29wRGVsdGE6Z30pKX1lbHNlIHRoaXMudGltZT1jO2lmKHYmJjE9PT0odCYxKSlyZXR1cm4gZS1jfXJldHVybiBjfSxfc2V0RW5kaW5nczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztlPyhnLmVuZGluZ1N0YXJ0PTI0MDEsZy5lbmRpbmdFbmQ9MjQwMSk6KGcuZW5kaW5nU3RhcnQ9YT90aGlzLnplcm9TbG9wZUF0U3RhcnQ/MjQwMToyNDAwOjI0MDIsZy5lbmRpbmdFbmQ9Yz90aGlzLnplcm9TbG9wZUF0RW5kPzI0MDE6MjQwMDoyNDAyKX0sX3NjaGVkdWxlRmFkaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9taXhlcix0PWcudGltZSx2PXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGw9PT12JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXQ7dlswXT1jO2dbMV09dCthO3ZbMV09CmU7cmV0dXJuIHRoaXN9fSk7dmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZpLF9iaW5kQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5fbG9jYWxSb290fHx0aGlzLl9yb290LGc9YS5fY2xpcC50cmFja3MsdD1nLmxlbmd0aCx2PWEuX3Byb3BlcnR5QmluZGluZ3M7YT1hLl9pbnRlcnBvbGFudHM7dmFyIHo9ZS51dWlkLEU9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLEY9RVt6XTt2b2lkIDA9PT1GJiYoRj17fSxFW3pdPUYpO2ZvcihFPTA7RSE9PXQ7KytFKXt2YXIgST1nW0VdLE09SS5uYW1lLFA9RltNXTtpZih2b2lkIDA9PT1QKXtQPXZbRV07aWYodm9pZCAwIT09UCl7bnVsbD09PVAuX2NhY2hlSW5kZXgmJigrK1AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFAseixNKSk7Y29udGludWV9UD1uZXcgdWkoY2MuY3JlYXRlKGUsTSxjJiZjLl9wcm9wZXJ0eUJpbmRpbmdzW0VdLmJpbmRpbmcucGFyc2VkUGF0aCksCkkuVmFsdWVUeXBlTmFtZSxJLmdldFZhbHVlU2l6ZSgpKTsrK1AucmVmZXJlbmNlQ291bnQ7dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFAseixNKX12W0VdPVA7YVtFXS5yZXN1bHRCdWZmZXI9UC5idWZmZXJ9fSxfYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYSl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtpZihudWxsPT09YS5fY2FjaGVJbmRleCl7dmFyIGM9KGEuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxlPWEuX2NsaXAudXVpZCxnPXRoaXMuX2FjdGlvbnNCeUNsaXBbZV07dGhpcy5fYmluZEFjdGlvbihhLGcmJmcua25vd25BY3Rpb25zWzBdKTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihhLGUsYyl9Yz1hLl9wcm9wZXJ0eUJpbmRpbmdzO2U9MDtmb3IoZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciB0PWNbZV07MD09PXQudXNlQ291bnQrKyYmKHRoaXMuX2xlbmRCaW5kaW5nKHQpLHQuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbihhKX19LApfZGVhY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbihhKSl7Zm9yKHZhciBjPWEuX3Byb3BlcnR5QmluZGluZ3MsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKXt2YXIgdD1jW2VdOzA9PT0tLXQudXNlQ291bnQmJih0LnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHQpKX10aGlzLl90YWtlQmFja0FjdGlvbihhKX19LF9pbml0TWVtb3J5TWFuYWdlcjpmdW5jdGlvbigpe3RoaXMuX2FjdGlvbnM9W107dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt0aGlzLl9hY3Rpb25zQnlDbGlwPXt9O3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX25BY3RpdmVCaW5kaW5ncz0wO3RoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fTt0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdO3RoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7dmFyIGE9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYWN0aW9ucy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGEuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fSxfaXNBY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7YT1hLl9jYWNoZUluZGV4O3JldHVybiBudWxsIT09YSYmYTx0aGlzLl9uQWN0aXZlQWN0aW9uc30sX2FkZEluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9hY3Rpb25zLHQ9dGhpcy5fYWN0aW9uc0J5Q2xpcCx2PXRbY107dm9pZCAwPT09dj8odj17a25vd25BY3Rpb25zOlthXSxhY3Rpb25CeVJvb3Q6e319LGEuX2J5Q2xpcENhY2hlSW5kZXg9MCx0W2NdPXYpOihjPQp2Lmtub3duQWN0aW9ucyxhLl9ieUNsaXBDYWNoZUluZGV4PWMubGVuZ3RoLGMucHVzaChhKSk7YS5fY2FjaGVJbmRleD1nLmxlbmd0aDtnLnB1c2goYSk7di5hY3Rpb25CeVJvb3RbZV09YX0sX3JlbW92ZUluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1jW2MubGVuZ3RoLTFdLGc9YS5fY2FjaGVJbmRleDtlLl9jYWNoZUluZGV4PWc7Y1tnXT1lO2MucG9wKCk7YS5fY2FjaGVJbmRleD1udWxsO2M9YS5fY2xpcC51dWlkO2U9dGhpcy5fYWN0aW9uc0J5Q2xpcDtnPWVbY107dmFyIHQ9Zy5rbm93bkFjdGlvbnMsdj10W3QubGVuZ3RoLTFdLHo9YS5fYnlDbGlwQ2FjaGVJbmRleDt2Ll9ieUNsaXBDYWNoZUluZGV4PXo7dFt6XT12O3QucG9wKCk7YS5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2RlbGV0ZSBnLmFjdGlvbkJ5Um9vdFsoYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkXTswPT09dC5sZW5ndGgmJmRlbGV0ZSBlW2NdO3RoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYSl9LApfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjpmdW5jdGlvbihhKXthPWEuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjIT09ZTsrK2Mpe3ZhciBnPWFbY107MD09PS0tZy5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGcpfX0sX2xlbmRBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHQ9Y1tnXTthLl9jYWNoZUluZGV4PWc7Y1tnXT1hO3QuX2NhY2hlSW5kZXg9ZTtjW2VdPXR9LF90YWtlQmFja0FjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMsdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX2FkZEluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAp0PWdbY10sdj10aGlzLl9iaW5kaW5nczt2b2lkIDA9PT10JiYodD17fSxnW2NdPXQpO3RbZV09YTthLl9jYWNoZUluZGV4PXYubGVuZ3RoO3YucHVzaChhKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuYmluZGluZyxnPWUucm9vdE5vZGUudXVpZDtlPWUucGF0aDt2YXIgdD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdj10W2ddLHo9Y1tjLmxlbmd0aC0xXTthPWEuX2NhY2hlSW5kZXg7ei5fY2FjaGVJbmRleD1hO2NbYV09ejtjLnBvcCgpO2RlbGV0ZSB2W2VdOzA9PT1PYmplY3Qua2V5cyh2KS5sZW5ndGgmJmRlbGV0ZSB0W2ddfSxfbGVuZEJpbmRpbmc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKyssdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX3Rha2VCYWNrQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz0KdGhpcy5fYmluZGluZ3MsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQmluZGluZ3MsdD1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7dC5fY2FjaGVJbmRleD1lO2NbZV09dH0sX2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGM9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKyxlPWFbY107dm9pZCAwPT09ZSYmKGU9bmV3IFpmKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIpLGUuX19jYWNoZUluZGV4PWMsYVtjXT1lKTtyZXR1cm4gZX0sX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT1hLl9fY2FjaGVJbmRleCxnPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsdD1jW2ddO2EuX19jYWNoZUluZGV4PQpnO2NbZ109YTt0Ll9fY2FjaGVJbmRleD1lO2NbZV09dH0sX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6bmV3IEZsb2F0MzJBcnJheSgxKSxjbGlwQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdCxnPWUudXVpZDtlPSJzdHJpbmciPT09dHlwZW9mIGE/dmMuZmluZEJ5TmFtZShlLGEpOmE7YT1udWxsIT09ZT9lLnV1aWQ6YTt2YXIgdD10aGlzLl9hY3Rpb25zQnlDbGlwW2FdLHY9bnVsbDtpZih2b2lkIDAhPT10KXt2PXQuYWN0aW9uQnlSb290W2ddO2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7dj10Lmtub3duQWN0aW9uc1swXTtudWxsPT09ZSYmKGU9di5fY2xpcCl9aWYobnVsbD09PWUpcmV0dXJuIG51bGw7Yz1uZXcgY2sodGhpcyxlLGMpO3RoaXMuX2JpbmRBY3Rpb24oYyx2KTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLGEsZyk7cmV0dXJuIGN9LGV4aXN0aW5nQWN0aW9uOmZ1bmN0aW9uKGEsYyl7dmFyIGU9Y3x8dGhpcy5fcm9vdDtjPWUudXVpZDsKZT0ic3RyaW5nIj09PXR5cGVvZiBhP3ZjLmZpbmRCeU5hbWUoZSxhKTphO2E9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlP2UudXVpZDphXTtyZXR1cm4gdm9pZCAwIT09YT9hLmFjdGlvbkJ5Um9vdFtjXXx8bnVsbDpudWxsfSxzdG9wQWxsQWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2FjdGlvbnMsYz10aGlzLl9uQWN0aXZlQWN0aW9ucyxlPXRoaXMuX2JpbmRpbmdzLGc9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHQ9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPXRoaXMuX25BY3RpdmVBY3Rpb25zPTA7dCE9PWM7Kyt0KWFbdF0ucmVzZXQoKTtmb3IodD0wO3QhPT1nOysrdCllW3RdLnVzZUNvdW50PTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihhKXthKj10aGlzLnRpbWVTY2FsZTtmb3IodmFyIGM9dGhpcy5fYWN0aW9ucyxlPXRoaXMuX25BY3RpdmVBY3Rpb25zLGc9dGhpcy50aW1lKz1hLHQ9TWF0aC5zaWduKGEpLHY9dGhpcy5fYWNjdUluZGV4Xj0xLHo9MDt6IT09ZTsrK3opY1t6XS5fdXBkYXRlKGcsCmEsdCx2KTthPXRoaXMuX2JpbmRpbmdzO2M9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2Zvcih6PTA7eiE9PWM7Kyt6KWFbel0uYXBwbHkodik7cmV0dXJuIHRoaXN9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdW5jYWNoZUNsaXA6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9uczthPWEudXVpZDt2YXIgZT10aGlzLl9hY3Rpb25zQnlDbGlwLGc9ZVthXTtpZih2b2lkIDAhPT1nKXtnPWcua25vd25BY3Rpb25zO2Zvcih2YXIgdD0wLHY9Zy5sZW5ndGg7dCE9PXY7Kyt0KXt2YXIgej1nW3RdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oeik7dmFyIEU9ei5fY2FjaGVJbmRleCxGPWNbYy5sZW5ndGgtMV07ei5fY2FjaGVJbmRleD1udWxsO3ouX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtGLl9jYWNoZUluZGV4PUU7Y1tFXT1GO2MucG9wKCk7dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih6KX1kZWxldGUgZVthXX19LHVuY2FjaGVSb290OmZ1bmN0aW9uKGEpe2E9CmEudXVpZDt2YXIgYz10aGlzLl9hY3Rpb25zQnlDbGlwO2ZvcihnIGluIGMpe3ZhciBlPWNbZ10uYWN0aW9uQnlSb290W2FdO3ZvaWQgMCE9PWUmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGUpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGUpKX12YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWVbYV07aWYodm9pZCAwIT09Zylmb3IodmFyIHQgaW4gZylhPWdbdF0sYS5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhhKX0sdW5jYWNoZUFjdGlvbjpmdW5jdGlvbihhLGMpe2E9dGhpcy5leGlzdGluZ0FjdGlvbihhLGMpO251bGwhPT1hJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihhKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihhKSl9fSk7ZWgucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBlaCh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX07d2kucHJvdG90eXBlPQpPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoU2QucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6d2ksaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjohMCxjb3B5OmZ1bmN0aW9uKGEpe1NkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9YS5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oZGsucHJvdG90eXBlLHtsaW5lUHJlY2lzaW9uOjEsc2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5yYXkuc2V0KGEsYyl9LHNldEZyb21DYW1lcmE6ZnVuY3Rpb24oYSxjKXtjJiZjLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChhLngsYS55LC41KS51bnByb2plY3QoYykuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9Yyk6YyYmYy5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHRoaXMucmF5Lm9yaWdpbi5zZXQoYS54LGEueSwoYy5uZWFyK2MuZmFyKS8oYy5uZWFyLWMuZmFyKSkudW5wcm9qZWN0KGMpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oYy5tYXRyaXhXb3JsZCksdGhpcy5jYW1lcmE9Yyk6Y29uc29sZS5lcnJvcigiVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4iKX0saW50ZXJzZWN0T2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtlPWV8fFtdO3hpKGEsdGhpcyxlLGMpO2Uuc29ydChlayk7cmV0dXJuIGV9LGludGVyc2VjdE9iamVjdHM6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107aWYoITE9PT1BcnJheS5pc0FycmF5KGEpKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4iKSxlO2Zvcih2YXIgZz0wLHQ9YS5sZW5ndGg7Zzx0O2crKyl4aShhW2ddLHRoaXMsZSxjKTtlLnNvcnQoZWspO3JldHVybiBlfX0pOwpPYmplY3QuYXNzaWduKGZrLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMucGhpPWM7dGhpcy50aGV0YT1lO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLnBoaT1hLnBoaTt0aGlzLnRoZXRhPWEudGhldGE7cmV0dXJuIHRoaXN9LG1ha2VTYWZlOmZ1bmN0aW9uKCl7dGhpcy5waGk9TWF0aC5tYXgoMUUtNixNYXRoLm1pbihNYXRoLlBJLTFFLTYsdGhpcy5waGkpKTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhhLngsYS55LGEueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPU1hdGguc3FydChhKmErYypjK2UqZSk7MD09PXRoaXMucmFkaXVzP3RoaXMucGhpPQp0aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihhLGUpLHRoaXMucGhpPU1hdGguYWNvcyhoYi5jbGFtcChjL3RoaXMucmFkaXVzLC0xLDEpKSk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihnay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9YTt0aGlzLnRoZXRhPWM7dGhpcy55PWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMudGhldGE9YS50aGV0YTt0aGlzLnk9YS55O3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStlKmUpO3RoaXMudGhldGE9TWF0aC5hdGFuMihhLAplKTt0aGlzLnk9YztyZXR1cm4gdGhpc319KTt2YXIgSGs9bmV3IGY7T2JqZWN0LmFzc2lnbih5aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1Iay5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LAptYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgZik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Euc2V0KDAsMCk6YS5zdWJWZWN0b3JzKHRoaXMubWF4LAp0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueDx0aGlzLm1pbi54fHxhLng+dGhpcy5tYXgueHx8YS55PHRoaXMubWluLnl8fGEueT50aGlzLm1heC55PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5taW4ueDw9YS5taW4ueCYmYS5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9YS5taW4ueSYmYS5tYXgueTw9dGhpcy5tYXgueX0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKYz1uZXcgZik7cmV0dXJuIGMuc2V0KChhLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGEueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8YS5taW4ueD50aGlzLm1heC54fHxhLm1heC55PHRoaXMubWluLnl8fGEubWluLnk+dGhpcy5tYXgueT8hMTohMH0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGYpO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEhrLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7CnRoaXMubWF4Lm1pbihhLm1heCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGEpe3RoaXMubWluLm1pbihhLm1pbik7dGhpcy5tYXgubWF4KGEubWF4KTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMubWluLmFkZChhKTt0aGlzLm1heC5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5taW4uZXF1YWxzKHRoaXMubWluKSYmYS5tYXguZXF1YWxzKHRoaXMubWF4KX19KTt2YXIgSWs9bmV3IGssQ2g9bmV3IGs7T2JqZWN0LmFzc2lnbih6aS5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuc3RhcnQuY29weShhKTt0aGlzLmVuZC5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmNvcHkoYS5zdGFydCk7dGhpcy5lbmQuY29weShhLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihhKXt2b2lkIDA9PT0KYSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9Cm5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShjKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXtJay5zdWJWZWN0b3JzKGEsdGhpcy5zdGFydCk7Q2guc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTthPUNoLmRvdChJaykvQ2guZG90KENoKTtjJiYoYT1oYi5jbGFtcChhLDAsMSkpO3JldHVybiBhfSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGEsYyxlKXthPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihhLGMpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBrKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5zdGFydCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NChhKTsKdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZhLmVuZC5lcXVhbHModGhpcy5lbmQpfX0pO2RnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PSEwO3ZhciBhZD1uZXcgayxxZD1uZXcgayxXaT1uZXcgcixybj1bImEiLCJiIiwiYyJdO2VnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZWcucHJvdG90eXBlLmNvbnN0cnVjdG9yPWVnO2VnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCghMCk7V2kuZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTt2YXIgYT10aGlzLm9iamVjdC5tYXRyaXhXb3JsZCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiwKZT10aGlzLm9iamVjdC5nZW9tZXRyeTtpZihlJiZlLmlzR2VvbWV0cnkpZm9yKHZhciBnPWUudmVydGljZXMsdD1lLmZhY2VzLHY9ZT0wLHo9dC5sZW5ndGg7djx6O3YrKylmb3IodmFyIEU9dFt2XSxGPTAsST1FLnZlcnRleE5vcm1hbHMubGVuZ3RoO0Y8STtGKyspe3ZhciBNPUUudmVydGV4Tm9ybWFsc1tGXTthZC5jb3B5KGdbRVtybltGXV1dKS5hcHBseU1hdHJpeDQoYSk7cWQuY29weShNKS5hcHBseU1hdHJpeDMoV2kpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKGFkKTtjLnNldFhZWihlLGFkLngsYWQueSxhZC56KTtlKz0xO2Muc2V0WFlaKGUscWQueCxxZC55LHFkLnopO2UrPTF9ZWxzZSBpZihlJiZlLmlzQnVmZmVyR2VvbWV0cnkpZm9yKGc9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQ9ZS5hdHRyaWJ1dGVzLm5vcm1hbCxGPWU9MCxJPWcuY291bnQ7RjxJO0YrKylhZC5zZXQoZy5nZXRYKEYpLGcuZ2V0WShGKSxnLmdldFooRikpLmFwcGx5TWF0cml4NChhKSwKcWQuc2V0KHQuZ2V0WChGKSx0LmdldFkoRiksdC5nZXRaKEYpKSxxZC5hcHBseU1hdHJpeDMoV2kpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKGFkKSxjLnNldFhZWihlLGFkLngsYWQueSxhZC56KSxlKz0xLGMuc2V0WFlaKGUscWQueCxxZC55LHFkLnopLGUrPTE7Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEprPW5ldyBrO1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtaZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WmU7WmUucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIGE9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFFMyxjPWEqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CnRoaXMuY29uZS5zY2FsZS5zZXQoYyxjLGEpO0prLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7dGhpcy5jb25lLmxvb2tBdChKayk7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTt2YXIgTGQ9bmV3IGssRGg9bmV3IHEsWGk9bmV3IHE7JGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTskZS5wcm90b3R5cGUuY29uc3RydWN0b3I9JGU7JGUucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYm9uZXMsZT10aGlzLmdlb21ldHJ5LGc9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7WGkuZ2V0SW52ZXJzZSh0aGlzLnJvb3QubWF0cml4V29ybGQpO2Zvcih2YXIgdD0wLHY9MDt0PGMubGVuZ3RoO3QrKyl7dmFyIHo9Y1t0XTt6LnBhcmVudCYmCnoucGFyZW50LmlzQm9uZSYmKERoLm11bHRpcGx5TWF0cmljZXMoWGksei5tYXRyaXhXb3JsZCksTGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKERoKSxnLnNldFhZWih2LExkLngsTGQueSxMZC56KSxEaC5tdWx0aXBseU1hdHJpY2VzKFhpLHoucGFyZW50Lm1hdHJpeFdvcmxkKSxMZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oRGgpLGcuc2V0WFlaKHYrMSxMZC54LExkLnksTGQueiksdis9Mil9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7QS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpfTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2FmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZjthZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTthZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jb2xvcj8KdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTtiZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjtiZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYT10aGlzLm1hdGVyaWFsLmNvbG9yLGM9TWF0aC5tYXgoYS5yLGEuZyxhLmIpOzE8YyYmYS5tdWx0aXBseVNjYWxhcigxLwpjKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTtiZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTt2YXIgc249bmV3IGssS2s9bmV3IEgsTGs9bmV3IEg7Y2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZjtjZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTtjZi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGlsZHJlblswXTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwplbHNle3ZhciBjPWEuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0trLmNvcHkodGhpcy5saWdodC5jb2xvcik7TGsuY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IodmFyIGU9MCxnPWMuY291bnQ7ZTxnO2UrKyl7dmFyIHQ9ZTxnLzI/S2s6TGs7Yy5zZXRYWVooZSx0LnIsdC5nLHQuYil9Yy5uZWVkc1VwZGF0ZT0hMH1hLmxvb2tBdChzbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCkubmVnYXRlKCkpfTtkZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kZjtkZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtkZi5wcm90b3R5cGUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uLmNvcHkodGhpcy5saWdodFByb2JlLnBvc2l0aW9uKTt0aGlzLnNjYWxlLnNldCgxLAoxLDEpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSk7dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWU9dGhpcy5saWdodFByb2JlLmludGVuc2l0eX07ZmgucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpmaCxjb3B5OmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmdlb21ldHJ5LmNvcHkoYS5nZW9tZXRyeSk7dGhpcy5tYXRlcmlhbC5jb3B5KGEubWF0ZXJpYWwpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTtnaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1naDtlZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpO2VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZjtlZi5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoVixlYSxkYSxyYSl7ZGE9KGVhLVYpL2RhO1Uuc2V0WFlaKEYsMCwwLDApO0krKztmb3IoTT1WO008ZWE7TSs9ZGEpUD1GK0ksVS5zZXRYWVooUCxNYXRoLnNpbihNKSplLDAsTWF0aC5jb3MoTSkqZSksVS5zZXRYWVooUCsxLE1hdGguc2luKE1hdGgubWluKE0rZGEsZWEpKSplLDAsTWF0aC5jb3MoTWF0aC5taW4oTStkYSxlYSkpKmUpLFUuc2V0WFlaKFArMiwwLDAsMCksSSs9MztRLmFkZEdyb3VwKEYsSSxyYSk7Ris9STtJPTB9dmFyIGM9dGhpcy5hdWRpbyxlPXRoaXMucmFuZ2UsZz10aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUsdD10aGlzLmRpdmlzaW9uc091dGVyQW5nbGUsdj1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lSW5uZXJBbmdsZSk7Yz1oYi5kZWdUb1JhZChjLnBhbm5lci5jb25lT3V0ZXJBbmdsZSk7dmFyIHo9di8yLEU9Yy8yLEY9MCxJPTAsTSxQLFE9dGhpcy5nZW9tZXRyeSxVPVEuYXR0cmlidXRlcy5wb3NpdGlvbjtRLmNsZWFyR3JvdXBzKCk7CmEoLUUsLXosdCwwKTthKC16LHosZywxKTthKHosRSx0LDApO1UubmVlZHNVcGRhdGU9ITA7dj09PWMmJih0aGlzLm1hdGVyaWFsWzBdLnZpc2libGU9ITEpfTtlZi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMF0uZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMV0uZGlzcG9zZSgpfTt2YXIgcmc9bmV3IGssRWg9bmV3IGssTWs9bmV3IHI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtNay5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5vYmplY3QuZ2VvbWV0cnksZz0KZS52ZXJ0aWNlcztlPWUuZmFjZXM7Zm9yKHZhciB0PTAsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9ZVt2XSxGPUUubm9ybWFsO3JnLmNvcHkoZ1tFLmFdKS5hZGQoZ1tFLmJdKS5hZGQoZ1tFLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KGEpO0VoLmNvcHkoRikuYXBwbHlNYXRyaXgzKE1rKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChyZyk7Yy5zZXRYWVoodCxyZy54LHJnLnkscmcueik7dCs9MTtjLnNldFhZWih0LEVoLngsRWgueSxFaC56KTt0Kz0xfWMubmVlZHNVcGRhdGU9ITB9O3ZhciBOaz1uZXcgayxGaD1uZXcgayxPaz1uZXcgaztmZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7ZmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWZmO2ZmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwp0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9O2ZmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtOay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCk7Rmguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTtPay5zdWJWZWN0b3JzKEZoLE5rKTt0aGlzLmxpZ2h0UGxhbmUubG9va0F0KEZoKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSk7dGhpcy50YXJnZXRMaW5lLmxvb2tBdChGaCk7CnRoaXMudGFyZ2V0TGluZS5zY2FsZS56PU9rLmxlbmd0aCgpfTt2YXIgaGg9bmV3IGssUGI9bmV3IHpiO2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5LGM9dGhpcy5wb2ludE1hcDtQYi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtRYigiYyIsYyxhLFBiLDAsMCwtMSk7UWIoInQiLGMsYSxQYiwwLDAsMSk7UWIoIm4xIixjLGEsUGIsLTEsLTEsLTEpO1FiKCJuMiIsYyxhLFBiLDEsLTEsLTEpO1FiKCJuMyIsYyxhLFBiLC0xLDEsLTEpO1FiKCJuNCIsYyxhLFBiLDEsMSwtMSk7UWIoImYxIixjLGEsUGIsLTEsLTEsMSk7UWIoImYyIixjLGEsUGIsMSwtMSwxKTtRYigiZjMiLGMsYSxQYiwtMSwxLDEpO1FiKCJmNCIsYyxhLFBiLDEsMSwxKTtRYigidTEiLApjLGEsUGIsLjcsMS4xLC0xKTtRYigidTIiLGMsYSxQYiwtLjcsMS4xLC0xKTtRYigidTMiLGMsYSxQYiwwLDIsLTEpO1FiKCJjZjEiLGMsYSxQYiwtMSwwLDEpO1FiKCJjZjIiLGMsYSxQYiwxLDAsMSk7UWIoImNmMyIsYyxhLFBiLDAsLTEsMSk7UWIoImNmNCIsYyxhLFBiLDAsMSwxKTtRYigiY24xIixjLGEsUGIsLTEsMCwtMSk7UWIoImNuMiIsYyxhLFBiLDEsMCwtMSk7UWIoImNuMyIsYyxhLFBiLDAsLTEsLTEpO1FiKCJjbjQiLGMsYSxQYiwwLDEsLTEpO2EuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfTt2YXIgR2g9bmV3IHg7amQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtqZC5wcm90b3R5cGUuY29uc3RydWN0b3I9amQ7amQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXt2b2lkIDAhPT1hJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpO3ZvaWQgMCE9PQp0aGlzLm9iamVjdCYmR2guc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCk7aWYoIUdoLmlzRW1wdHkoKSl7YT1HaC5taW47dmFyIGM9R2gubWF4LGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGc9ZS5hcnJheTtnWzBdPWMueDtnWzFdPWMueTtnWzJdPWMuejtnWzNdPWEueDtnWzRdPWMueTtnWzVdPWMuejtnWzZdPWEueDtnWzddPWEueTtnWzhdPWMuejtnWzldPWMueDtnWzEwXT1hLnk7Z1sxMV09Yy56O2dbMTJdPWMueDtnWzEzXT1jLnk7Z1sxNF09YS56O2dbMTVdPWEueDtnWzE2XT1jLnk7Z1sxN109YS56O2dbMThdPWEueDtnWzE5XT1hLnk7Z1syMF09YS56O2dbMjFdPWMueDtnWzIyXT1hLnk7Z1syM109YS56O2UubmVlZHNVcGRhdGU9ITA7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX19O2pkLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0PWZ1bmN0aW9uKGEpe3RoaXMub2JqZWN0PWE7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307amQucHJvdG90eXBlLmNvcHk9CmZ1bmN0aW9uKGEpe0liLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLm9iamVjdD1hLm9iamVjdDtyZXR1cm4gdGhpc307amQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib3g7Yy5pc0VtcHR5KCl8fChjLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxjLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSksQS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGEpKX07aWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKTtpZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aWc7aWcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPQpmdW5jdGlvbihhKXt2YXIgYz0tdGhpcy5wbGFuZS5jb25zdGFudDsxRS04Pk1hdGguYWJzKGMpJiYoYz0xRS04KTt0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT0wPmM/MTowO3RoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O3ZhciBQaz1uZXcgayxpaCxBaTtrZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7a2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPWtkO2tkLnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24oYSl7Ljk5OTk5PGEueT90aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpOi0uOTk5OTk+YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk6KFBrLnNldChhLnosMCwtYS54KS5ub3JtYWxpemUoKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShQayxNYXRoLmFjb3MoYS55KSkpfTsKa2QucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihhLGMsZSl7dm9pZCAwPT09YyYmKGM9LjIqYSk7dm9pZCAwPT09ZSYmKGU9LjIqYyk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYS1jKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChlLGMsZSk7dGhpcy5jb25lLnBvc2l0aW9uLnk9YTt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O2tkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihhKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGEpO3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoYSl9O2tkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsITEpO3RoaXMubGluZS5jb3B5KGEubGluZSk7dGhpcy5jb25lLmNvcHkoYS5jb25lKTtyZXR1cm4gdGhpc307a2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTsKamcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtqZy5wcm90b3R5cGUuY29uc3RydWN0b3I9amc7WmEuY3JlYXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YTthLnByb3RvdHlwZS5nZXRQb2ludD1jO3JldHVybiBhfTtPYmplY3QuYXNzaWduKGlkLnByb3RvdHlwZSx7Y3JlYXRlUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2E9dGhpcy5nZXRQb2ludHMoYSk7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYSl9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTsKYT10aGlzLmdldFNwYWNlZFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2Zvcih2YXIgYz1uZXcgeGEsZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKyl7dmFyIHQ9YVtlXTtjLnZlcnRpY2VzLnB1c2gobmV3IGsodC54LHQueSx0Lnp8fDApKX1yZXR1cm4gY319KTtPYmplY3QuYXNzaWduKEljLnByb3RvdHlwZSx7ZnJvbVBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLiIpO3RoaXMuc2V0RnJvbVBvaW50cyhhKX19KTtpay5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYy5wcm90b3R5cGUpOwpqay5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiYy5wcm90b3R5cGUpO0JpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGJjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbihCaS5wcm90b3R5cGUse2luaXRGcm9tQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sZ2V0Q29udHJvbFBvaW50c0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtmaC5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfTsKJGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfTtPYmplY3QuYXNzaWduKERiLnByb3RvdHlwZSx7ZXh0cmFjdFVybEJhc2U6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIik7cmV0dXJuIFVpLmV4dHJhY3RVcmxCYXNlKGEpfX0pO09iamVjdC5hc3NpZ24oYmgucHJvdG90eXBlLHtzZXRUZXh0dXJlUGF0aDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogLnNldFRleHR1cmVQYXRoKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0UmVzb3VyY2VQYXRoKCkuIik7cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKGEpfX0pO09iamVjdC5hc3NpZ24oeWkucHJvdG90eXBlLAp7Y2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LHNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShhKX0sCnNpemU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGEpfX0pO3ppLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihhKX07T2JqZWN0LmFzc2lnbihoYix7cmFuZG9tMTY6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuIik7cmV0dXJuIE1hdGgucmFuZG9tKCl9LG5lYXJlc3RQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuIik7CnJldHVybiBoYi5mbG9vclBvd2VyT2ZUd28oYSl9LG5leHRQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gaGIuY2VpbFBvd2VyT2ZUd28oYSl9fSk7T2JqZWN0LmFzc2lnbihyLnByb3RvdHlwZSx7ZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXgzKHRoaXMpfSwKbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtleHRyYWN0UG9zaXRpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLmNvcHlQb3NpdGlvbihhKX0sZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShhLGMpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybihuZXcgaykuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpOwpyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKcm90YXRlQXhpczpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2EudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBhLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYSl9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG1ha2VGcnVzdHVtOmZ1bmN0aW9uKGEsYyxlLGcsdCx2KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuIik7CnJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShhLGMsZyxlLHQsdil9fSk7SGIucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZShhKX07aC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKEQucHJvdG90eXBlLHtpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShhKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfX0pO09iamVjdC5hc3NpZ24oQi5wcm90b3R5cGUse2FyZWE6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKTtyZXR1cm4gdGhpcy5nZXRBcmVhKCl9LGJhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIik7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGEsYyl9LG1pZHBvaW50OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIik7cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoYSl9LG5vcm1hbDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIik7cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKGEpfSxwbGFuZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpO3JldHVybiB0aGlzLmdldFBsYW5lKGEpfX0pO09iamVjdC5hc3NpZ24oQiwKe2Jhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihhLGMsZSxnLHQpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYSxjLGUsZyx0KX0sbm9ybWFsOmZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQi5nZXROb3JtYWwoYSxjLGUsZyl9fSk7T2JqZWN0LmFzc2lnbihGZC5wcm90b3R5cGUse2V4dHJhY3RBbGxQb2ludHM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoYSl9LGV4dHJ1ZGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBXZCh0aGlzLGEpfSxtYWtlR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFhkKHRoaXMsYSl9fSk7T2JqZWN0LmFzc2lnbihmLnByb3RvdHlwZSx7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LApsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKGsucHJvdG90eXBlLHtzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxzZXRFdWxlckZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxnZXRQb3NpdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbihhKX0sZ2V0U2NhbGVGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZShhKX0sZ2V0Q29sdW1uRnJvbU1hdHJpeDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihjLGEpfSxhcHBseVByb2plY3Rpb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhKX0sCmZyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGMsZSl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKGEpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbih4YS5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKEEucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYSl9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhjLGEpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQS5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9YX19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhCZi5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRmcucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7Q2YucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWmEucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWF9fSk7dmIucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09YyYmKHRoaXMuZmlsbUdhdWdlPWMpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYSl9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEtiLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1hfX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWF9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWF9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9YX19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWF9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9YX19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWF9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1hfX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWF9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFIucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24odmEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYSl9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGEsYyl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKFRjLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZWgucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFMucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9fSx3cmFwUkdCOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpO3JldHVybiBuZXcgSH19LHNoYWRpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpO3RoaXMuZmxhdFNoYWRpbmc9MT09PWF9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERjLnByb3RvdHlwZSx7bWV0YWw6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4iKTsKcmV0dXJuITF9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhxYi5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPWF9fX0pO09iamVjdC5hc3NpZ24oVGgucHJvdG90eXBlLAp7Y2xlYXJUYXJnZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpO3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGEpO3RoaXMuY2xlYXIoYyxlLGcpfSxhbmltYXRlOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4iKTt0aGlzLnNldEFuaW1hdGlvbkxvb3AoYSl9LGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4iKTtyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKX0sZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCl9LGdldFByZWNpc2lvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4iKTtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9ufSxyZXNldEdMU3RhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuIik7cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKX0sc3VwcG9ydHNGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpfSwKc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKS4iKTsKcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfSxzdXBwb3J0c0JsZW5kTWluTWF4OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iil9LHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlc30sc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIil9LGVuYWJsZVNjaXNzb3JUZXN0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpO3RoaXMuc2V0U2Npc3NvclRlc3QoYSl9LGluaXRNYXRlcmlhbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFkZFByZVBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LAphZGRQb3N0UGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHVwZGF0ZVNoYWRvd01hcDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldEZhY2VDdWxsaW5nOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhbGxvY1RleHR1cmVVbml0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTJEOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldFRleHR1cmVDdWJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRBY3RpdmVNaXBNYXBMZXZlbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLiIpO3JldHVybiB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVGgucHJvdG90eXBlLHtzaGFkb3dNYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZH0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4iKTt0aGlzLnNoYWRvd01hcC5lbmFibGVkPWF9fSxzaGFkb3dNYXBUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZX0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuIik7dGhpcy5zaGFkb3dNYXAudHlwZT1hfX0sc2hhZG93TWFwQ3VsbEZhY2U6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxjb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jb250ZXh0IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZ2V0Q29udGV4dCgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRWoucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyUmV2ZXJzZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LApyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPYi5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sCmFjdGl2ZU1pcE1hcExldmVsOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZU1pcE1hcExldmVsIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG0ucHJvdG90eXBlLHt3cmFwUzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9YX19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKTt0aGlzLnRleHR1cmUud3JhcFQ9YX19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9YX19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKTt0aGlzLnRleHR1cmUubWluRmlsdGVyPWF9fSxhbmlzb3Ryb3B5OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHl9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1hfX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LiIpO3RoaXMudGV4dHVyZS5vZmZzZXQ9YX19LHJlcGVhdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUucmVwZWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3RoaXMudGV4dHVyZS5yZXBlYXQ9YX19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpOwp0aGlzLnRleHR1cmUuZm9ybWF0PWF9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTt0aGlzLnRleHR1cmUudHlwZT1hfX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7CnRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2gucHJvdG90eXBlLHtzdGFuZGluZzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sdXNlckhlaWdodDp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC51c2VySGVpZ2h0IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pO1llLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLiIpO3ZhciBjPXRoaXM7KG5ldyBjaCkubG9hZChhLGZ1bmN0aW9uKGUpe2Muc2V0QnVmZmVyKGUpfSk7cmV0dXJuIHRoaXN9O3RpLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpOwpyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9O0diLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuIik7cmV0dXJuIHRoaXMudXBkYXRlKGEsYyl9O0dkLmNyb3NzT3JpZ2luPXZvaWQgMDtHZC5sb2FkVGV4dHVyZT1mdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO3ZhciB0PW5ldyBQZzt0LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2E9dC5sb2FkKGEsZSx2b2lkIDAsZyk7YyYmKGEubWFwcGluZz1jKTtyZXR1cm4gYX07R2QubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTsKdmFyIHQ9bmV3IE9nO3Quc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT10LmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtHZC5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O0dkLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTtiLkFDRVNGaWxtaWNUb25lTWFwcGluZz01O2IuQWRkRXF1YXRpb249MTAwO2IuQWRkT3BlcmF0aW9uPTI7Yi5BZGRpdGl2ZUJsZW5kaW5nPTI7Yi5BbHBoYUZvcm1hdD0xMDIxO2IuQWx3YXlzRGVwdGg9CjE7Yi5BbHdheXNTdGVuY2lsRnVuYz01MTk7Yi5BbWJpZW50TGlnaHQ9V2c7Yi5BbWJpZW50TGlnaHRQcm9iZT1vaTtiLkFuaW1hdGlvbkNsaXA9dmM7Yi5BbmltYXRpb25Mb2FkZXI9Zmk7Yi5BbmltYXRpb25NaXhlcj12aTtiLkFuaW1hdGlvbk9iamVjdEdyb3VwPWJrO2IuQW5pbWF0aW9uVXRpbHM9VmI7Yi5BcmNDdXJ2ZT1YZTtiLkFycmF5Q2FtZXJhPXdmO2IuQXJyb3dIZWxwZXI9a2Q7Yi5BdWRpbz1ZZTtiLkF1ZGlvQW5hbHlzZXI9dGk7Yi5BdWRpb0NvbnRleHQ9cmk7Yi5BdWRpb0xpc3RlbmVyPXFpO2IuQXVkaW9Mb2FkZXI9Y2g7Yi5BeGVzSGVscGVyPWpnO2IuQXhpc0hlbHBlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLiIpO3JldHVybiBuZXcgamcoYSl9O2IuQmFja1NpZGU9MTtiLkJhc2ljRGVwdGhQYWNraW5nPTMyMDA7Yi5CYXNpY1NoYWRvd01hcD0wO2IuQmluYXJ5VGV4dHVyZUxvYWRlcj0KZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIik7cmV0dXJuIG5ldyBOZyhhKX07Yi5Cb25lPVpoO2IuQm9vbGVhbktleWZyYW1lVHJhY2s9Smc7Yi5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGpkKGEsYyl9O2IuQm94Mj15aTtiLkJveDM9eDtiLkJveDNIZWxwZXI9aGc7Yi5Cb3hCdWZmZXJHZW9tZXRyeT1YYTtiLkJveEdlb21ldHJ5PVNhO2IuQm94SGVscGVyPWpkO2IuQnVmZmVyQXR0cmlidXRlPVI7Yi5CdWZmZXJHZW9tZXRyeT12YTtiLkJ1ZmZlckdlb21ldHJ5TG9hZGVyPWFoO2IuQnl0ZVR5cGU9MTAxMDtiLkNhY2hlPWtlO2IuQ2FtZXJhPXpiO2IuQ2FtZXJhSGVscGVyPQpnZztiLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfTtiLkNhbnZhc1RleHR1cmU9RGY7Yi5DYXRtdWxsUm9tQ3VydmUzPWJjO2IuQ2luZW9uVG9uZU1hcHBpbmc9NDtiLkNpcmNsZUJ1ZmZlckdlb21ldHJ5PVNlO2IuQ2lyY2xlR2VvbWV0cnk9WWY7Yi5DbGFtcFRvRWRnZVdyYXBwaW5nPTEwMDE7Yi5DbG9jaz1waTtiLkNsb3NlZFNwbGluZUN1cnZlMz1paztiLkNvbG9yPUg7Yi5Db2xvcktleWZyYW1lVHJhY2s9S2c7Yi5Db21wcmVzc2VkVGV4dHVyZT1GZTtiLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyPWdpO2IuQ29uZUJ1ZmZlckdlb21ldHJ5PVhmO2IuQ29uZUdlb21ldHJ5PVdmO2IuQ3ViZUNhbWVyYT1HYjtiLkN1YmVHZW9tZXRyeT1TYTtiLkN1YmVSZWZsZWN0aW9uTWFwcGluZz0zMDE7Yi5DdWJlUmVmcmFjdGlvbk1hcHBpbmc9MzAyO2IuQ3ViZVRleHR1cmU9ZWQ7Yi5DdWJlVGV4dHVyZUxvYWRlcj0KT2c7Yi5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZz0zMDY7Yi5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZz0zMDc7Yi5DdWJpY0JlemllckN1cnZlPUVjO2IuQ3ViaWNCZXppZXJDdXJ2ZTM9VmM7Yi5DdWJpY0ludGVycG9sYW50PUhnO2IuQ3VsbEZhY2VCYWNrPTE7Yi5DdWxsRmFjZUZyb250PTI7Yi5DdWxsRmFjZUZyb250QmFjaz0zO2IuQ3VsbEZhY2VOb25lPTA7Yi5DdXJ2ZT1aYTtiLkN1cnZlUGF0aD1pZDtiLkN1c3RvbUJsZW5kaW5nPTU7Yi5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PWhkO2IuQ3lsaW5kZXJHZW9tZXRyeT1aZDtiLkN5bGluZHJpY2FsPWdrO2IuRGF0YVRleHR1cmU9QWI7Yi5EYXRhVGV4dHVyZTJEQXJyYXk9dGU7Yi5EYXRhVGV4dHVyZTNEPXVlO2IuRGF0YVRleHR1cmVMb2FkZXI9Tmc7Yi5EZWNyZW1lbnRTdGVuY2lsT3A9NzY4MztiLkRlY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTY7Yi5EZWZhdWx0TG9hZGluZ01hbmFnZXI9WGo7Yi5EZXB0aEZvcm1hdD0xMDI2OwpiLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2IuRGVwdGhUZXh0dXJlPUVmO2IuRGlyZWN0aW9uYWxMaWdodD1WZztiLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9ZmY7Yi5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PVVnO2IuRGlzY3JldGVJbnRlcnBvbGFudD1JZztiLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PUtlO2IuRG9kZWNhaGVkcm9uR2VvbWV0cnk9S2Y7Yi5Eb3VibGVTaWRlPTI7Yi5Ec3RBbHBoYUZhY3Rvcj0yMDY7Yi5Ec3RDb2xvckZhY3Rvcj0yMDg7Yi5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBSKGEsYykpLnNldER5bmFtaWMoITApfTtiLkVkZ2VzR2VvbWV0cnk9UmU7Yi5FZGdlc0hlbHBlcj1mdW5jdGlvbihhLApjKXtjb25zb2xlLndhcm4oIlRIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgUmUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuRWxsaXBzZUN1cnZlPXNjO2IuRXF1YWxEZXB0aD00O2IuRXF1YWxTdGVuY2lsRnVuYz01MTQ7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7Yi5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0zMDQ7Yi5FdWxlcj11O2IuRXZlbnREaXNwYXRjaGVyPWQ7Yi5FeHRydWRlQnVmZmVyR2VvbWV0cnk9VGM7Yi5FeHRydWRlR2VvbWV0cnk9V2Q7Yi5GYWNlMz1PO2IuRmFjZTQ9ZnVuY3Rpb24oYSxjLGUsZyx0LHYseil7Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLiIpO3JldHVybiBuZXcgTyhhLApjLGUsdCx2LHopfTtiLkZhY2VDb2xvcnM9MTtiLkZhY2VOb3JtYWxzSGVscGVyPWZnO2IuRmlsZUxvYWRlcj13YztiLkZsYXRTaGFkaW5nPTE7Yi5GbG9hdDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBiYShhLGMpfTtiLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5GbG9hdDY0QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBrYShhLGMpfTtiLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9a2E7Yi5GbG9hdFR5cGU9MTAxNTtiLkZvZz1EZztiLkZvZ0V4cDI9Q2c7Yi5Gb250PWxpOwpiLkZvbnRMb2FkZXI9bWk7Yi5Gcm9udEZhY2VEaXJlY3Rpb25DQ1c9MTtiLkZyb250RmFjZURpcmVjdGlvbkNXPTA7Yi5Gcm9udFNpZGU9MDtiLkZydXN0dW09bGM7Yi5HYW1tYUVuY29kaW5nPTMwMDc7Yi5HZW9tZXRyeT14YTtiLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihjLmlzTWVzaCl7Yy5tYXRyaXhBdXRvVXBkYXRlJiZjLnVwZGF0ZU1hdHJpeCgpO3ZhciBnPWMubWF0cml4O2M9Yy5nZW9tZXRyeX1hLm1lcmdlKGMsZyxlKX0sY2VudGVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGEuY2VudGVyKCl9fTtiLkdyZWF0ZXJEZXB0aD02O2IuR3JlYXRlckVxdWFsRGVwdGg9NTtiLkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxODtiLkdyZWF0ZXJTdGVuY2lsRnVuYz01MTY7Yi5HcmlkSGVscGVyPWZoO2IuR3JvdXA9d2U7Yi5IYWxmRmxvYXRUeXBlPTEwMTY7Yi5IZW1pc3BoZXJlTGlnaHQ9UWc7Yi5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9Y2Y7Yi5IZW1pc3BoZXJlTGlnaHRQcm9iZT1uaTtiLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SmU7Yi5JY29zYWhlZHJvbkdlb21ldHJ5PUpmO2IuSW1hZ2VCaXRtYXBMb2FkZXI9amk7Yi5JbWFnZUxvYWRlcj1XZTtiLkltYWdlVXRpbHM9R2Q7Yi5JbW1lZGlhdGVSZW5kZXJPYmplY3Q9ZGc7Yi5JbmNyZW1lbnRTdGVuY2lsT3A9NzY4MjtiLkluY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTU7Yi5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9JGc7Yi5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1aZztiLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPQp3aTtiLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IG9hKGEsYyl9O2IuSW50MTZCdWZmZXJBdHRyaWJ1dGU9b2E7Yi5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBjYShhLGMpfTtiLkludDMyQnVmZmVyQXR0cmlidXRlPWNhO2IuSW50OEF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLApjKX07Yi5JbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5JbnRUeXBlPTEwMTM7Yi5JbnRlcmxlYXZlZEJ1ZmZlcj1TZDtiLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPXlmO2IuSW50ZXJwb2xhbnQ9cmM7Yi5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7Yi5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2IuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjtiLkludmVydFN0ZW5jaWxPcD01Mzg2O2IuSlNPTkxvYWRlcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX07Yi5LZWVwU3RlbmNpbE9wPTc2ODA7Yi5LZXlmcmFtZVRyYWNrPVpiO2IuTE9EPUJmO2IuTGF0aGVCdWZmZXJHZW9tZXRyeT1RZTtiLkxhdGhlR2VvbWV0cnk9VmY7Yi5MYXllcnM9dztiLkxlbnNGbGFyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMiKX07CmIuTGVzc0RlcHRoPTI7Yi5MZXNzRXF1YWxEZXB0aD0zO2IuTGVzc0VxdWFsU3RlbmNpbEZ1bmM9NTE1O2IuTGVzc1N0ZW5jaWxGdW5jPTUxMztiLkxpZ2h0PUtiO2IuTGlnaHRQcm9iZT1KYztiLkxpZ2h0UHJvYmVIZWxwZXI9ZGY7Yi5MaWdodFNoYWRvdz1YYztiLkxpbmU9WGI7Yi5MaW5lMz16aTtiLkxpbmVCYXNpY01hdGVyaWFsPUZiO2IuTGluZUN1cnZlPW5jO2IuTGluZUN1cnZlMz1GYztiLkxpbmVEYXNoZWRNYXRlcmlhbD1mZTtiLkxpbmVMb29wPUdnO2IuTGluZVBpZWNlcz0xO2IuTGluZVNlZ21lbnRzPUliO2IuTGluZVN0cmlwPTA7Yi5MaW5lYXJFbmNvZGluZz0zRTM7Yi5MaW5lYXJGaWx0ZXI9MTAwNjtiLkxpbmVhckludGVycG9sYW50PVpmO2IuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7Yi5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDc7Yi5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNzsKYi5MaW5lYXJUb25lTWFwcGluZz0xO2IuTG9hZGVyPURiO2IuTG9hZGVyVXRpbHM9VWk7Yi5Mb2FkaW5nTWFuYWdlcj1laTtiLkxvZ0x1dkVuY29kaW5nPTMwMDM7Yi5Mb29wT25jZT0yMjAwO2IuTG9vcFBpbmdQb25nPTIyMDI7Yi5Mb29wUmVwZWF0PTIyMDE7Yi5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2IuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7Yi5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn07Yi5NYXRlcmlhbD1TO2IuTWF0ZXJpYWxMb2FkZXI9WWc7Yi5NYXRoPWhiO2IuTWF0cml4Mz1yO2IuTWF0cml4ND1xO2IuTWF4RXF1YXRpb249MTA0O2IuTWVzaD15YTtiLk1lc2hCYXNpY01hdGVyaWFsPU47Yi5NZXNoRGVwdGhNYXRlcmlhbD15ZDtiLk1lc2hEaXN0YW5jZU1hdGVyaWFsPXpkO2IuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7CnJldHVybiBhfTtiLk1lc2hMYW1iZXJ0TWF0ZXJpYWw9ZGU7Yi5NZXNoTWF0Y2FwTWF0ZXJpYWw9ZWU7Yi5NZXNoTm9ybWFsTWF0ZXJpYWw9Y2U7Yi5NZXNoUGhvbmdNYXRlcmlhbD1EYztiLk1lc2hQaHlzaWNhbE1hdGVyaWFsPWFlO2IuTWVzaFN0YW5kYXJkTWF0ZXJpYWw9VWM7Yi5NZXNoVG9vbk1hdGVyaWFsPWJlO2IuTWluRXF1YXRpb249MTAzO2IuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2IuTWl4T3BlcmF0aW9uPTE7Yi5NdWx0aU1hdGVyaWFsPWZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPVtdKTtjb25zb2xlLndhcm4oIlRIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7YS5pc011bHRpTWF0ZXJpYWw9ITA7YS5tYXRlcmlhbHM9YTthLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuc2xpY2UoKX07cmV0dXJuIGF9O2IuTXVsdGlwbHlCbGVuZGluZz00O2IuTXVsdGlwbHlPcGVyYXRpb249MDtiLk5lYXJlc3RGaWx0ZXI9CjEwMDM7Yi5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj0xMDA1O2IuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNDtiLk5ldmVyRGVwdGg9MDtiLk5ldmVyU3RlbmNpbEZ1bmM9NTEyO2IuTm9CbGVuZGluZz0wO2IuTm9Db2xvcnM9MDtiLk5vVG9uZU1hcHBpbmc9MDtiLk5vcm1hbEJsZW5kaW5nPTE7Yi5Ob3RFcXVhbERlcHRoPTc7Yi5Ob3RFcXVhbFN0ZW5jaWxGdW5jPTUxNztiLk51bWJlcktleWZyYW1lVHJhY2s9VWU7Yi5PYmplY3QzRD1BO2IuT2JqZWN0TG9hZGVyPWJoO2IuT2JqZWN0U3BhY2VOb3JtYWxNYXA9MTtiLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1UZDtiLk9jdGFoZWRyb25HZW9tZXRyeT1JZjtiLk9uZUZhY3Rvcj0yMDE7Yi5PbmVNaW51c0RzdEFscGhhRmFjdG9yPTIwNztiLk9uZU1pbnVzRHN0Q29sb3JGYWN0b3I9MjA5O2IuT25lTWludXNTcmNBbHBoYUZhY3Rvcj0KMjA1O2IuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7Yi5PcnRob2dyYXBoaWNDYW1lcmE9Y2c7Yi5QQ0ZTaGFkb3dNYXA9MTtiLlBDRlNvZnRTaGFkb3dNYXA9MjtiLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1IZTtiLlBhcmFtZXRyaWNHZW9tZXRyeT1GZjtiLlBhcnRpY2xlPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIik7cmV0dXJuIG5ldyB6ZihhKX07Yi5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IENjKGEpfTtiLlBhcnRpY2xlU3lzdGVtPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKTtyZXR1cm4gbmV3IEVlKGEsCmMpfTtiLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBDYyhhKX07Yi5QYXRoPUljO2IuUGVyc3BlY3RpdmVDYW1lcmE9dmI7Yi5QbGFuZT1IYjtiLlBsYW5lQnVmZmVyR2VvbWV0cnk9TmM7Yi5QbGFuZUdlb21ldHJ5PXVkO2IuUGxhbmVIZWxwZXI9aWc7Yi5Qb2ludENsb3VkPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgRWUoYSxjKX07Yi5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IENjKGEpfTtiLlBvaW50TGlnaHQ9ClRnO2IuUG9pbnRMaWdodEhlbHBlcj1hZjtiLlBvaW50cz1FZTtiLlBvaW50c01hdGVyaWFsPUNjO2IuUG9sYXJHcmlkSGVscGVyPWdoO2IuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5PW1jO2IuUG9seWhlZHJvbkdlb21ldHJ5PUdmO2IuUG9zaXRpb25hbEF1ZGlvPXNpO2IuUG9zaXRpb25hbEF1ZGlvSGVscGVyPWVmO2IuUHJvcGVydHlCaW5kaW5nPWNjO2IuUHJvcGVydHlNaXhlcj11aTtiLlF1YWRyYXRpY0JlemllckN1cnZlPUdjO2IuUXVhZHJhdGljQmV6aWVyQ3VydmUzPVdjO2IuUXVhdGVybmlvbj1oO2IuUXVhdGVybmlvbktleWZyYW1lVHJhY2s9JGY7Yi5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ9TGc7Yi5SRVZJU0lPTj0iMTA4IjtiLlJHQkFEZXB0aFBhY2tpbmc9MzIwMTtiLlJHQkFGb3JtYXQ9MTAyMztiLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7Yi5SR0JBX0FTVENfMTB4NV9Gb3JtYXQ9Mzc4MTY7Yi5SR0JBX0FTVENfMTB4Nl9Gb3JtYXQ9Mzc4MTc7Yi5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9CjM3ODE4O2IuUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdD0zNzgyMDtiLlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Mzc4MjE7Yi5SR0JBX0FTVENfNHg0X0Zvcm1hdD0zNzgwODtiLlJHQkFfQVNUQ181eDRfRm9ybWF0PTM3ODA5O2IuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Mzc4MTA7Yi5SR0JBX0FTVENfNng1X0Zvcm1hdD0zNzgxMTtiLlJHQkFfQVNUQ182eDZfRm9ybWF0PTM3ODEyO2IuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Mzc4MTM7Yi5SR0JBX0FTVENfOHg2X0Zvcm1hdD0zNzgxNDtiLlJHQkFfQVNUQ184eDhfRm9ybWF0PTM3ODE1O2IuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2IuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQyO2IuUkdCQV9TM1RDX0RYVDFfRm9ybWF0PTMzNzc3O2IuUkdCQV9TM1RDX0RYVDNfRm9ybWF0PTMzNzc4O2IuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PTMzNzc5O2IuUkdCREVuY29kaW5nPTMwMDY7Yi5SR0JFRW5jb2Rpbmc9MzAwMjtiLlJHQkVGb3JtYXQ9CjEwMjM7Yi5SR0JGb3JtYXQ9MTAyMjtiLlJHQk0xNkVuY29kaW5nPTMwMDU7Yi5SR0JNN0VuY29kaW5nPTMwMDQ7Yi5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTY7Yi5SR0JfUFZSVENfMkJQUFYxX0Zvcm1hdD0zNTg0MTtiLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2IuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9MzM3NzY7Yi5SYXdTaGFkZXJNYXRlcmlhbD1UZTtiLlJheT1EO2IuUmF5Y2FzdGVyPWRrO2IuUmVjdEFyZWFMaWdodD1YZztiLlJlY3RBcmVhTGlnaHRIZWxwZXI9YmY7Yi5SZWRGb3JtYXQ9MTAyODtiLlJlaW5oYXJkVG9uZU1hcHBpbmc9MjtiLlJlcGVhdFdyYXBwaW5nPTFFMztiLlJlcGxhY2VTdGVuY2lsT3A9NzY4MTtiLlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uPTEwMjtiLlJpbmdCdWZmZXJHZW9tZXRyeT1QZTtiLlJpbmdHZW9tZXRyeT1VZjtiLlNjZW5lPXk7Yi5TY2VuZVV0aWxzPXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSwKZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSxhdHRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9fTtiLlNoYWRlckNodW5rPXJiO2IuU2hhZGVyTGliPU9jO2IuU2hhZGVyTWF0ZXJpYWw9cWI7Yi5TaGFkb3dNYXRlcmlhbD0kZDtiLlNoYXBlPUZkO2IuU2hhcGVCdWZmZXJHZW9tZXRyeT1ZZDtiLlNoYXBlR2VvbWV0cnk9WGQ7Yi5TaGFwZVBhdGg9a2k7Yi5TaGFwZVV0aWxzPWdkO2IuU2hvcnRUeXBlPTEwMTE7Yi5Ta2VsZXRvbj1GZztiLlNrZWxldG9uSGVscGVyPSRlO2IuU2tpbm5lZE1lc2g9Q2Y7Yi5TbW9vdGhTaGFkaW5nPTI7Yi5TcGhlcmU9RztiLlNwaGVyZUJ1ZmZlckdlb21ldHJ5PUVkO2IuU3BoZXJlR2VvbWV0cnk9ClRmO2IuU3BoZXJpY2FsPWZrO2IuU3BoZXJpY2FsSGFybW9uaWNzMz1kaDtiLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nPTMwNTtiLlNwbGluZT1CaTtiLlNwbGluZUN1cnZlPUhjO2IuU3BsaW5lQ3VydmUzPWprO2IuU3BvdExpZ2h0PVNnO2IuU3BvdExpZ2h0SGVscGVyPVplO2IuU3BvdExpZ2h0U2hhZG93PVJnO2IuU3ByaXRlPXpmO2IuU3ByaXRlTWF0ZXJpYWw9RGQ7Yi5TcmNBbHBoYUZhY3Rvcj0yMDQ7Yi5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yPTIxMDtiLlNyY0NvbG9yRmFjdG9yPTIwMjtiLlN0ZXJlb0NhbWVyYT1aajtiLlN0cmluZ0tleWZyYW1lVHJhY2s9TWc7Yi5TdWJ0cmFjdEVxdWF0aW9uPTEwMTtiLlN1YnRyYWN0aXZlQmxlbmRpbmc9MztiLlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M307Yi5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MDtiLlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5UZXRyYWhlZHJvbkdlb21ldHJ5PQpIZjtiLlRleHRCdWZmZXJHZW9tZXRyeT1PZTtiLlRleHRHZW9tZXRyeT1TZjtiLlRleHR1cmU9bDtiLlRleHR1cmVMb2FkZXI9UGc7Yi5Ub3J1c0J1ZmZlckdlb21ldHJ5PU1lO2IuVG9ydXNHZW9tZXRyeT1OZjtiLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5PUxlO2IuVG9ydXNLbm90R2VvbWV0cnk9TWY7Yi5UcmlhbmdsZT1CO2IuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2IuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTE7Yi5UcmlhbmdsZXNEcmF3TW9kZT0wO2IuVHViZUJ1ZmZlckdlb21ldHJ5PVVkO2IuVHViZUdlb21ldHJ5PUxmO2IuVVZNYXBwaW5nPTMwMDtiLlVpbnQxNkF0dHJpYnV0ZT1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFooYSxjKX07Yi5VaW50MTZCdWZmZXJBdHRyaWJ1dGU9WjtiLlVpbnQzMkF0dHJpYnV0ZT0KZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBqYShhLGMpfTtiLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZT1qYTtiLlVpbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGFhKGEsYyl9O2IuVWludDhCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBmYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9ZmE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09ZWg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9JG07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVZlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1lZztiLlZpZGVvVGV4dHVyZT1iaTtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9T2I7Yi5XZWJHTFJlbmRlcmVyPVRoO2IuV2ViR0xVdGlscz1GajtiLldpcmVmcmFtZUdlb21ldHJ5PUdlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgR2UoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB3YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpXLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxXLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHIoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7Vy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6Vy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFcub2JqZWN0Lnpvb209TWF0aC5tYXgoVy5taW5ab29tLE1hdGgubWluKFcubWF4Wm9vbSxXLm9iamVjdC56b29tKnNhKSksVy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFcuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7Vy5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlcub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhXLm9iamVjdC56b29tPU1hdGgubWF4KFcubWluWm9vbSxNYXRoLm1pbihXLm1heFpvb20sVy5vYmplY3Quem9vbS9zYSkpLFcub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxXLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2xjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe09iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFcucm90YXRlU3BlZWQpO3NhPQpXLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9XLmRvbUVsZW1lbnQuYm9keTpXLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3IoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtXLnVwZGF0ZSgpfWZ1bmN0aW9uIHcoc2Epe2VjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO1FkLnN1YlZlY3RvcnMoZWMsbGMpOzA8UWQueT9sKGgoKSk6MD5RZC55JiZwKGgoKSk7bGMuY29weShlYyk7Vy51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE9iKS5tdWx0aXBseVNjYWxhcihXLnBhblNwZWVkKTt2ZChIYi54LEhiLnkpO09iLmNvcHkoQWIpO1cudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB4KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtXLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBOYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBXLmtleXMuVVA6dmQoMCwKVy5rZXlQYW5TcGVlZCk7TmI9ITA7YnJlYWs7Y2FzZSBXLmtleXMuQk9UVE9NOnZkKDAsLVcua2V5UGFuU3BlZWQpO05iPSEwO2JyZWFrO2Nhc2UgVy5rZXlzLkxFRlQ6dmQoVy5rZXlQYW5TcGVlZCwwKTtOYj0hMDticmVhaztjYXNlIFcua2V5cy5SSUdIVDp2ZCgtVy5rZXlQYW5TcGVlZCwwKSxOYj0hMH1OYiYmKHNhLnByZXZlbnREZWZhdWx0KCksVy51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9PYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpPYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTmI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtsYy5zZXQoMCxNYXRoLnNxcnQoTmIqTmIrc2Eqc2EpKX1mdW5jdGlvbiBIKHNhKXtXLmVuYWJsZVpvb20mJkIoc2EpO1cuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBLKHNhKXtXLmVuYWJsZVpvb20mJkIoc2EpO1cuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBMKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihXLnJvdGF0ZVNwZWVkKTtzYT1XLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9XLmRvbUVsZW1lbnQuYm9keTpXLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3IoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBKKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsT2IpLm11bHRpcGx5U2NhbGFyKFcucGFuU3BlZWQpO3ZkKEhiLngsSGIueSk7T2IuY29weShBYil9ZnVuY3Rpb24gTyhzYSl7dmFyIE5iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2VjLnNldCgwLE1hdGguc3FydChOYipOYitzYSpzYSkpO1FkLnNldCgwLE1hdGgucG93KGVjLnkvbGMueSxXLnpvb21TcGVlZCkpO2woUWQueSk7bGMuY29weShlYyl9ZnVuY3Rpb24gUyhzYSl7Vy5lbmFibGVab29tJiZPKHNhKTtXLmVuYWJsZVBhbiYmSihzYSl9ZnVuY3Rpb24gTihzYSl7Vy5lbmFibGVab29tJiZPKHNhKTtXLmVuYWJsZVJvdGF0ZSYmTChzYSl9ZnVuY3Rpb24gUigpe31mdW5jdGlvbiBYKHNhKXtpZighMSE9PVcuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtXLmRvbUVsZW1lbnQuZm9jdXM/Vy5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChXLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1XLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFcubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVcuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goVy5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhYSwhMSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZmEsITEpLFcuZGlzcGF0Y2hFdmVudCh2YSkpfX1mdW5jdGlvbiBhYShzYSl7aWYoITEhPT1XLmVuYWJsZWQpc3dpdGNoKHNhLnByZXZlbnREZWZhdWx0KCksRmEpe2Nhc2UgQWEuUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpYnJlYWs7dShzYSk7YnJlYWs7Y2FzZSBBYS5ET0xMWTppZighMT09PVcuZW5hYmxlWm9vbSlicmVhazt3KHNhKTticmVhaztjYXNlIEFhLlBBTjohMSE9PVcuZW5hYmxlUGFuJiZBKHNhKX19ZnVuY3Rpb24gZmEoc2EpeyExIT09Vy5lbmFibGVkJiYoeShzYSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIiwKYWEsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhLCExKSxXLmRpc3BhdGNoRXZlbnQoeWEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIG9hKHNhKXshMT09PVcuZW5hYmxlZHx8ITE9PT1XLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFcuZGlzcGF0Y2hFdmVudCh2YSkseChzYSksVy5kaXNwYXRjaEV2ZW50KHlhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1XLmVuYWJsZWQmJiExIT09Vy5lbmFibGVLZXlzJiYhMSE9PVcuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBjYShzYSl7aWYoITEhPT1XLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFcudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1XLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFcudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09Vy5lbmFibGVab29tJiYhMT09PVcuZW5hYmxlUGFuKXJldHVybjtIKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1XLmVuYWJsZVpvb20mJiExPT09Vy5lbmFibGVSb3RhdGUpcmV0dXJuO0soc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmVy5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gamEoc2Epe2lmKCExIT09Vy5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1XLmVuYWJsZVJvdGF0ZSlicmVhaztMKHNhKTtXLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09Vy5lbmFibGVQYW4pYnJlYWs7SihzYSk7Vy51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVcuZW5hYmxlWm9vbSYmITE9PT1XLmVuYWJsZVBhbilicmVhaztTKHNhKTtXLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09Vy5lbmFibGVab29tJiYhMT09PVcuZW5hYmxlUm90YXRlKWJyZWFrO04oc2EpO1cudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBiYShzYSl7ITEhPT1XLmVuYWJsZWQmJihSKHNhKSxXLmRpc3BhdGNoRXZlbnQoeWEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVcuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1cudGFyZ2V0MC5jb3B5KFcudGFyZ2V0KTtXLnBvc2l0aW9uMC5jb3B5KFcub2JqZWN0LnBvc2l0aW9uKTsKVy56b29tMD1XLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7Vy50YXJnZXQuY29weShXLnRhcmdldDApO1cub2JqZWN0LnBvc2l0aW9uLmNvcHkoVy5wb3NpdGlvbjApO1cub2JqZWN0Lnpvb209Vy56b29tMDtXLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7Vy5kaXNwYXRjaEV2ZW50KEVhKTtXLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE5iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx5Yz1OYi5jbG9uZSgpLmludmVyc2UoKSxkZD1uZXcgVEhSRUUuVmVjdG9yMyx3ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgd2c9Vy5vYmplY3QucG9zaXRpb247c2EuY29weSh3Zykuc3ViKFcudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTmIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKVy5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtXLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpXLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqVy5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChXLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihXLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChXLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oVy5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoVy5taW5EaXN0YW5jZSxNYXRoLm1pbihXLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09Vy5lbmFibGVEYW1waW5nP1cudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixXLmRhbXBpbmdGYWN0b3IpOlcudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHljKTsKd2cuY29weShXLnRhcmdldCkuYWRkKHNhKTtXLm9iamVjdC5sb29rQXQoVy50YXJnZXQpOyEwPT09Vy5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1XLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVcuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVcuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxkZC5kaXN0YW5jZVRvU3F1YXJlZChXLm9iamVjdC5wb3NpdGlvbik+eGF8fDgqKDEtd2QuZG90KFcub2JqZWN0LnF1YXRlcm5pb24pKT54YT8oVy5kaXNwYXRjaEV2ZW50KEVhKSxkZC5jb3B5KFcub2JqZWN0LnBvc2l0aW9uKSx3ZC5jb3B5KFcub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClgsITEpO1cuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsb2EsITEpO1cuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixiYSwhMSk7Vy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsamEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSl9O3ZhciBXPXRoaXMsRWE9e3R5cGU6ImNoYW5nZSJ9LHZhPXt0eXBlOiJzdGFydCJ9LHlhPXt0eXBlOiJlbmQifSxBYT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX1BBTjo0LFRPVUNIX0RPTExZX1BBTjo1LFRPVUNIX0RPTExZX1JPVEFURTo2fSwKRmE9QWEuTk9ORSx4YT0xRS02LFNhPW5ldyBUSFJFRS5TcGhlcmljYWwsWGE9bmV3IFRIUkVFLlNwaGVyaWNhbCx1Yj0xLEJiPW5ldyBUSFJFRS5WZWN0b3IzLHFiPSExLHpiPW5ldyBUSFJFRS5WZWN0b3IyLHZiPW5ldyBUSFJFRS5WZWN0b3IyLEdiPW5ldyBUSFJFRS5WZWN0b3IyLE9iPW5ldyBUSFJFRS5WZWN0b3IyLEFiPW5ldyBUSFJFRS5WZWN0b3IyLEhiPW5ldyBUSFJFRS5WZWN0b3IyLGxjPW5ldyBUSFJFRS5WZWN0b3IyLGVjPW5ldyBUSFJFRS5WZWN0b3IyLFFkPW5ldyBUSFJFRS5WZWN0b3IyLHVkPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihOYix5Yyl7c2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywwKTtzYS5tdWx0aXBseVNjYWxhcigtTmIpO0JiLmFkZChzYSl9fSgpLE5jPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbihOYix5Yyl7ITA9PT1XLnNjcmVlblNwYWNlUGFubmluZz8Kc2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywxKTooc2Euc2V0RnJvbU1hdHJpeENvbHVtbih5YywwKSxzYS5jcm9zc1ZlY3RvcnMoVy5vYmplY3QudXAsc2EpKTtzYS5tdWx0aXBseVNjYWxhcihOYik7QmIuYWRkKHNhKX19KCksdmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE5iLHljKXt2YXIgZGQ9Vy5kb21FbGVtZW50PT09ZG9jdW1lbnQ/Vy5kb21FbGVtZW50LmJvZHk6Vy5kb21FbGVtZW50O2lmKFcub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe3NhLmNvcHkoVy5vYmplY3QucG9zaXRpb24pLnN1YihXLnRhcmdldCk7dmFyIHdkPXNhLmxlbmd0aCgpO3dkKj1NYXRoLnRhbihXLm9iamVjdC5mb3YvMipNYXRoLlBJLzE4MCk7dWQoMipOYip3ZC9kZC5jbGllbnRIZWlnaHQsVy5vYmplY3QubWF0cml4KTtOYygyKnljKndkL2RkLmNsaWVudEhlaWdodCxXLm9iamVjdC5tYXRyaXgpfWVsc2UgVy5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/Cih1ZChOYiooVy5vYmplY3QucmlnaHQtVy5vYmplY3QubGVmdCkvVy5vYmplY3Quem9vbS9kZC5jbGllbnRXaWR0aCxXLm9iamVjdC5tYXRyaXgpLE5jKHljKihXLm9iamVjdC50b3AtVy5vYmplY3QuYm90dG9tKS9XLm9iamVjdC56b29tL2RkLmNsaWVudEhlaWdodCxXLm9iamVjdC5tYXRyaXgpKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuIiksVy5lbmFibGVQYW49ITEpfX0oKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGthLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixYLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLG9hLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsY2EsITEpO1cuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCmJhLCExKTtXLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixqYSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLFosITEpO3RoaXMudXBkYXRlKCl9O1RIUkVFLk9yYml0Q29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuT3JiaXRDb250cm9scztUSFJFRS5NYXBDb250cm9scz1mdW5jdGlvbihiLGQpe1RIUkVFLk9yYml0Q29udHJvbHMuY2FsbCh0aGlzLGIsZCk7dGhpcy5tb3VzZUJ1dHRvbnMuTEVGVD1USFJFRS5NT1VTRS5QQU47dGhpcy5tb3VzZUJ1dHRvbnMuUklHSFQ9VEhSRUUuTU9VU0UuUk9UQVRFO3RoaXMudG91Y2hlcy5PTkU9VEhSRUUuVE9VQ0guUEFOO3RoaXMudG91Y2hlcy5UV089VEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFfTsKVEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoVEhSRUUuRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSk7VEhSRUUuTWFwQ29udHJvbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVRIUkVFLk1hcENvbnRyb2xzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvYXJyYXktYnVmZmVyLWRhdGEtcHJvdmlkZXIuanMKdmFyIGZsOwooZnVuY3Rpb24oYil7Yi5FcnJvckNvZGVzPXtDQU5DRUxMRUQ6MX07Y29uc3QgZD17VkVSVEVYOjEsRkFDRToyLENPTE9SOjN9LGY9e1ZFUlRFWDoiZmxvYXQzMiIsRkFDRToiaW50MzIiLENPTE9SOiJ1aW50OCJ9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayl7dGhpcy5fcmVxdWVzdE1hbmFnZXI9azt0aGlzLl9jYW5jZWxsZXI9bmV3IGRjLkNhbmNlbGxlcn1yZWxvYWQoayxyLGwpe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTtyZXR1cm4gdGhpcy5fZmV0Y2hNZXRhZGF0YShrLHIsbCl9X2ZldGNoRGF0YUJ5U3RlcChrLHIsbCxwLG0sbil7ZnVuY3Rpb24gcSh1KXtsZXQgdz1bXTtmb3IobGV0IEE9MDtBPHUubGVuZ3RoLzM7QSsrKXtsZXQgeT1bXTtmb3IobGV0IHg9MDszPng7eCsrKXkucHVzaCh1WzMqQSt4XSk7dy5wdXNoKHkpfXJldHVybiB3fWs9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnIscnVuOmssCmNvbnRlbnRfdHlwZTpsLHNhbXBsZTpwLHN0ZXA6bX0pKTtyPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSh1PT57aWYodS5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTt1PXUudmFsdWU7c3dpdGNoKGwpe2Nhc2UgIlZFUlRFWCI6bi52ZXJ0aWNlcz1xKG5ldyBGbG9hdDMyQXJyYXkodSkpO2JyZWFrO2Nhc2UgIkZBQ0UiOm4uZmFjZXM9cShuZXcgSW50MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiQ09MT1IiOm4uY29sb3JzPXEobmV3IFVpbnQ4QXJyYXkodSkpfXJldHVybiBufSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGssbnVsbCwiYXJyYXlidWZmZXIiLGZbbF0pLnRoZW4odT0+dS5hcnJheUJ1ZmZlcigpKS50aGVuKHIpfWZldGNoRGF0YShrLHIsbCxwKXtsZXQgbT1bXSxuPW5ldyBNYXA7T2JqZWN0LmtleXMoZCkuZm9yRWFjaChxPT4Ke2suY29tcG9uZW50cyYxPDxkW3FdJiZtLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKHIsbCxxLHAsay5zdGVwLG4pKX0pO3JldHVybiBQcm9taXNlLmFsbChtKX1fZmV0Y2hNZXRhZGF0YShrLHIsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2s9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvbWVzaGVzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6cixydW46ayxzYW1wbGU6bH0pKTtyPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShwPT5wLmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTpiLkVycm9yQ29kZXMuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6cC52YWx1ZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGspLnRoZW4ocD0+cC5qc29uKCkpLnRoZW4ocikudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YShrKXtpZihrKXt2YXIgcj0KbmV3IE1hcDtmb3IobGV0IHA9MDtwPGsubGVuZ3RoO3ArKyl7bGV0IG09a1twXTtyLmhhcyhtLnN0ZXApfHxyLnNldChtLnN0ZXAsW10pO3IuZ2V0KG0uc3RlcCkucHVzaChtKX12YXIgbD1bXTtyLmZvckVhY2gocD0+e3A9dGhpcy5fY3JlYXRlU3RlcERhdHVtKHBbMF0pO2wucHVzaChwKX0pO3JldHVybiBsfX1fY3JlYXRlU3RlcERhdHVtKGspe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmsud2FsbF90aW1lKSxzdGVwOmsuc3RlcCxjb25maWc6ay5jb25maWcsY29udGVudF90eXBlOmsuY29udGVudF90eXBlLGNvbXBvbmVudHM6ay5jb21wb25lbnRzfX19Yi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcj1ofSkoZmx8fChmbD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvbWVzaC12aWV3ZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXJ7Y29uc3RydWN0b3IoZil7c3VwZXIoKTt0aGlzLl9sYXN0TWVzaD1udWxsO3RoaXMuX2Nsb2NrPW5ldyBUSFJFRS5DbG9jazt0aGlzLl9jYW52YXNTaXplPW51bGw7dGhpcy5fcnVuQ29sb3I9Zn1faXNPYmplY3QoZil7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBmJiZudWxsIT1mJiYhQXJyYXkuaXNBcnJheShmKX1fYXBwbHlEZWZhdWx0cyhmLGgpe2xldCBrPXt9O2Y9W2YsaF07Zm9yKGg9MDtoPGYubGVuZ3RoO2grKyl7Y29uc3Qgcj1mW2hdO2ZvcihsZXQgbCBpbiByKXtjb25zdCBwPWwgaW4gazt0aGlzLl9pc09iamVjdChyW2xdKT9rW2xdPXRoaXMuX2FwcGx5RGVmYXVsdHMoa1tsXXx8e30scltsXSk6cHx8KGtbbF09cltsXSl9fXJldHVybiBrfV9jcmVhdGVXb3JsZChmLGgpe3RoaXMuaXNSZWFkeSgpfHwodGhpcy5fc2NlbmU9bmV3IFRIUkVFLlNjZW5lLHRoaXMuX2NhbWVyYT1mPW5ldyBUSFJFRVtmLmNhbWVyYS5jbHNdKGYuY2FtZXJhLmZvdiwKdGhpcy5fY2FudmFzU2l6ZS53aWR0aC90aGlzLl9jYW52YXNTaXplLmhlaWdodCxmLmNhbWVyYS5uZWFyLGYuY2FtZXJhLmZhciksaD1uZXcgVEhSRUUuT3JiaXRDb250cm9scyhmLGgpLGgubG9va1NwZWVkPS40LGgubW92ZW1lbnRTcGVlZD0yMCxoLm5vRmx5PSEwLGgubG9va1ZlcnRpY2FsPSEwLGguY29uc3RyYWluVmVydGljYWw9ITAsaC52ZXJ0aWNhbE1pbj0xLGgudmVydGljYWxNYXg9MixoLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9jYW1lcmFDb250cm9scz1oLHRoaXMuX3JlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6ITB9KSx0aGlzLl9yZW5kZXJlci5zZXRQaXhlbFJhdGlvKCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LAoxKSl9X2NsZWFyU2NlbmUoKXtmb3IoOzA8dGhpcy5fc2NlbmUuY2hpbGRyZW4ubGVuZ3RoOyl0aGlzLl9zY2VuZS5yZW1vdmUodGhpcy5fc2NlbmUuY2hpbGRyZW5bMF0pfWdldFJlbmRlcmVyKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyfWdldENhbWVyYUNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzfWlzUmVhZHkoKXtyZXR1cm4hIXRoaXMuX2NhbWVyYSYmISF0aGlzLl9jYW1lcmFDb250cm9sc31nZXRDYW1lcmFQb3NpdGlvbigpe3JldHVybntmYXI6dGhpcy5fY2FtZXJhLmZhcixwb3NpdGlvbjp0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSx0YXJnZXQ6dGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCl9fXNldENhbnZhc1NpemUoZil7dGhpcy5fY2FudmFzU2l6ZT1mfWRyYXcoKXt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4JiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTt0aGlzLl9jYW1lcmEuYXNwZWN0PQp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0O3RoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCBmPWZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoaCk7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZik7dGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7ZigpfXVwZGF0ZVNjZW5lKGYsaCl7bGV0IGs9e307ImNvbmZpZyJpbiBmJiZmLmNvbmZpZyYmKGs9SlNPTi5wYXJzZShmLmNvbmZpZykpO3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSk7az10aGlzLl9hcHBseURlZmF1bHRzKGsse2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsCmZvdjo3NSxuZWFyOi4xLGZhcjoxRTN9LGxpZ2h0czpbe2NsczoiQW1iaWVudExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NX0se2NsczoiRGlyZWN0aW9uYWxMaWdodCIsY29sb3I6IiNmZmZmZmYiLGludGVuc2l0eTouNzUscG9zaXRpb246WzAsLTEsMl19XX0pO3RoaXMuX2NyZWF0ZVdvcmxkKGssaCk7dGhpcy5fY2xlYXJTY2VuZSgpO3RoaXMuX2NyZWF0ZUxpZ2h0cyh0aGlzLl9zY2VuZSxrKTt0aGlzLl9jcmVhdGVHZW9tZXRyeShmLGspO3RoaXMuZHJhdygpfXJlc2V0Vmlldygpe2lmKHRoaXMuaXNSZWFkeSgpKXt0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpO2lmKCFmJiZ0aGlzLl9sYXN0TWVzaCl2YXIgZj10aGlzLl9sYXN0TWVzaDtmJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChmKSx0aGlzLl9sYXN0TWVzaD1mKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX19X2NyZWF0ZUdlb21ldHJ5KGYsaCl7Zj1mLm1lc2g7Zi52ZXJ0aWNlcyYmZi5mYWNlcyYmCmYuZmFjZXMubGVuZ3RoP3RoaXMuX2NyZWF0ZU1lc2goZixoKTp0aGlzLl9jcmVhdGVQb2ludENsb3VkKGYsaCl9X2NyZWF0ZVBvaW50Q2xvdWQoZixoKXt2YXIgaz1mLnZlcnRpY2VzO2Y9Zi5jb2xvcnM7bGV0IHI9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtmJiZmLmxlbmd0aD09ay5sZW5ndGg/ci5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9VEhSRUUuVmVydGV4Q29sb3JzOnIubWF0ZXJpYWwuY29sb3I9dGhpcy5fcnVuQ29sb3I7aD10aGlzLl9hcHBseURlZmF1bHRzKGgscik7dmFyIGw9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgbT1uZXcgVEhSRUUuVmVjdG9yMyhwWzBdLHBbMV0scFsyXSk7bS54PTEqcFswXTttLnk9MSpwWzFdO20uej0xKnBbMl07bC52ZXJ0aWNlcy5wdXNoKG0pfSk7ZiYmZi5sZW5ndGg9PWsubGVuZ3RoJiZmLmZvckVhY2goZnVuY3Rpb24ocCl7cD1uZXcgVEhSRUUuQ29sb3IocFswXS8yNTUsCnBbMV0vMjU1LHBbMl0vMjU1KTtsLmNvbG9ycy5wdXNoKHApfSk7az1uZXcgVEhSRUVbaC5tYXRlcmlhbC5jbHNdKGgubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLlBvaW50cyhsLGspO3RoaXMuX3NjZW5lLmFkZChrKTt0aGlzLl9sYXN0TWVzaD1rfXNldENhbWVyYVZpZXdwb2ludChmLGgsayl7dGhpcy5fc2lsZW50PSEwO3RoaXMuX2NhbWVyYS5mYXI9aDt0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KGYueCxmLnksZi56KTt0aGlzLl9jYW1lcmEubG9va0F0KGsuY2xvbmUoKSk7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9ay5jbG9uZSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpO3RoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZShmKXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OmZ9KX1fZml0T2JqZWN0VG9WaWV3cG9ydChmKXt2YXIgaD0KbmV3IFRIUkVFLkJveDM7aC5zZXRGcm9tT2JqZWN0KGYpO2Y9aC5jZW50ZXIoKTt2YXIgaz1oLnNpemUoKTtrPTEuMjUqTWF0aC5hYnMoTWF0aC5tYXgoay54LGsueSxrLnopLygyKk1hdGgudGFuKE1hdGguUEkvMTgwKnRoaXMuX2NhbWVyYS5mb3YvMikpKTtoPWgubWluLno7dGhpcy5zZXRDYW1lcmFWaWV3cG9pbnQoe3g6Zi54LHk6Zi55LHo6a30sMyooMD5oPy1oK2s6ay1oKSxmKX1fY3JlYXRlTWVzaChmLGgpe3ZhciBrPWYudmVydGljZXM7Y29uc3Qgcj1mLmZhY2VzLGw9Zi5jb2xvcnM7Zj10aGlzLl9hcHBseURlZmF1bHRzKGgse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSk7bGV0IHA9bmV3IFRIUkVFLkdlb21ldHJ5O2suZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuVmVjdG9yMyhtWzBdLG1bMV0sbVsyXSk7bi54PTEqbVswXTtuLnk9MSptWzFdO24uej0xKm1bMl07CnAudmVydGljZXMucHVzaChuKX0pO3IuZm9yRWFjaChmdW5jdGlvbihtKXtsZXQgbj1uZXcgVEhSRUUuRmFjZTMobVswXSxtWzFdLG1bMl0pO2lmKGwmJmwubGVuZ3RoKXttPVtsW21bMF1dLGxbbVsxXV0sbFttWzJdXV07Zm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1Kyspe3ZhciBxPW1bdV07cT1uZXcgVEhSRUUuQ29sb3IocVswXS8yNTUscVsxXS8yNTUscVsyXS8yNTUpO24udmVydGV4Q29sb3JzLnB1c2gocSl9fXAuZmFjZXMucHVzaChuKX0pO2wmJmwubGVuZ3RoJiYoZi5tYXRlcmlhbD1mLm1hdGVyaWFsfHx7fSxmLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnMpO3AuY2VudGVyKCk7cC5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7az1uZXcgVEhSRUVbZi5tYXRlcmlhbC5jbHNdKGYubWF0ZXJpYWwpO2s9bmV3IFRIUkVFLk1lc2gocCxrKTtrLmNhc3RTaGFkb3c9ITA7ay5yZWNlaXZlU2hhZG93PSEwO3RoaXMuX3NjZW5lLmFkZChrKTsKdGhpcy5fbGFzdE1lc2g9a31fY3JlYXRlTGlnaHRzKGYsaCl7Zm9yKGxldCBrPTA7azxoLmxpZ2h0cy5sZW5ndGg7aysrKXtjb25zdCByPWgubGlnaHRzW2tdO2xldCBsPW5ldyBUSFJFRVtyLmNsc10oci5jb2xvcixyLmludGVuc2l0eSk7ci5wb3NpdGlvbiYmbC5wb3NpdGlvbi5zZXQoci5wb3NpdGlvblswXSxyLnBvc2l0aW9uWzFdLHIucG9zaXRpb25bMl0pO2YuYWRkKGwpfX19Yi5NZXNoVmlld2VyPWR9KShmbHx8KGZsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvbWVzc2FnZS5qcwpKaD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYixkLGYsaCl7cmV0dXJuIG5ldyAoZnx8KGY9UHJvbWlzZSkpKGZ1bmN0aW9uKGsscil7ZnVuY3Rpb24gbChuKXt0cnl7bShoLm5leHQobikpfWNhdGNoKHEpe3IocSl9fWZ1bmN0aW9uIHAobil7dHJ5e20oaFsidGhyb3ciXShuKSl9Y2F0Y2gocSl7cihxKX19ZnVuY3Rpb24gbShuKXtuLmRvbmU/ayhuLnZhbHVlKToobmV3IGYoZnVuY3Rpb24ocSl7cShuLnZhbHVlKX0pKS50aGVuKGwscCl9bSgoaD1oLmFwcGx5KGIsZHx8W10pKS5uZXh0KCkpfSl9O3ZhciBnbDsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLnBvcnQ9azt0aGlzLmlkPTA7dGhpcy5yZXNwb25zZVdhaXRzPW5ldyBNYXA7dGhpcy5saXN0ZW5lcnM9bmV3IE1hcDt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscj0+dGhpcy5vbk1lc3NhZ2UocikpfWxpc3RlbihrLHIpe3RoaXMubGlzdGVuZXJzLnNldChrLHIpfXVubGlzdGVuKGspe3RoaXMubGlzdGVuZXJzLmRlbGV0ZShrKX1vbk1lc3NhZ2Uoayl7cmV0dXJuIEpoKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgcj1KU09OLnBhcnNlKGsuZGF0YSk7Y29uc3QgbD1yLnR5cGUscD1yLmlkLG09ci5wYXlsb2FkO3ZhciBuPXIuZXJyb3I7aWYoci5pc1JlcGx5KXtpZih0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKHApKXt2YXIge3Jlc29sdmU6cSxyZWplY3Q6dX09dGhpcy5yZXNwb25zZVdhaXRzLmdldChwKTt0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKHApOwpuP3UoRXJyb3IobikpOnEobSl9fWVsc2V7bj1yPW51bGw7aWYodGhpcy5saXN0ZW5lcnMuaGFzKGwpKXtjb25zdCB3PXRoaXMubGlzdGVuZXJzLmdldChsKTt0cnl7cj15aWVsZCB3KG0pfWNhdGNoKEEpe249QX19dGhpcy5wb3N0TWVzc2FnZSh7WyJ0eXBlIl06bCxbImlkIl06cCxbInBheWxvYWQiXTpyLFsiZXJyb3IiXTpuLFsiaXNSZXBseSJdOiEwfSl9fSl9cG9zdE1lc3NhZ2Uoayl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGspKX1zZW5kTWVzc2FnZShrKXtjb25zdCByPXRoaXMuaWQrKzt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLGlkOnIscGF5bG9hZDprLGVycm9yOm51bGwsaXNSZXBseTohMX0pO3JldHVybiBuZXcgUHJvbWlzZSgobCxwKT0+e3RoaXMucmVzcG9uc2VXYWl0cy5zZXQocix7cmVzb2x2ZTpsLHJlamVjdDpwfSl9KX19Zi5JUEM9aH0pKGQuRE9fTk9UX1VTRV9JTlRFUk5BTHx8KGQuRE9fTk9UX1VTRV9JTlRFUk5BTD0Ke30pKX0pKGIubGlifHwoYi5saWI9e30pKX0pKGdsfHwoZ2w9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9wbHVnaW4taG9zdC1pcGMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKG0sbil7Y29uc3QgcT1uZXcgYi5saWIuRE9fTk9UX1VTRV9JTlRFUk5BTC5JUEMobSk7ci5hZGQocSk7cC5zZXQocSxuKTttLnN0YXJ0KCk7Zm9yKGNvbnN0IFt1LHddb2YgbCltPWgodyxxKSxxLmxpc3Rlbih1LG0pfWZ1bmN0aW9uIGgobSxuKXtyZXR1cm4gcT0+e3ZhciB1PXAuZ2V0KG4pO3U9ay5nZXQodSl8fG51bGw7cmV0dXJuIG0odSxxKX19ZC5yZWdpc3RlclBsdWdpbklmcmFtZT1mdW5jdGlvbihtLG4pe2suc2V0KG0se3BsdWdpbk5hbWU6bn0pfTtjb25zdCBrPW5ldyBXZWFrTWFwLHI9bmV3IFNldCxsPW5ldyBNYXAscD1uZXcgTWFwO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixtPT57aWYoImV4cGVyaW1lbnRhbC5ib290c3RyYXAiPT09bS5kYXRhKXt2YXIgbj1tLnBvcnRzWzBdO24mJihtPW0uc291cmNlP20uc291cmNlLmZyYW1lRWxlbWVudDpudWxsKSYmZihuLG0pfX0pO2QuYnJvYWRjYXN0PQpmdW5jdGlvbigpe3ZhciBtPWRjLnJ1bnNTdG9yZS5nZXRSdW5zKCk7Zm9yKHZhciBuIG9mIHIpcC5nZXQobikuaXNDb25uZWN0ZWR8fChyLmRlbGV0ZShuKSxwLmRlbGV0ZShuKSk7bj1bLi4ucl0ubWFwKHE9PnEuc2VuZE1lc3NhZ2UobSkpO3JldHVybiBQcm9taXNlLmFsbChuKX07ZC5saXN0ZW49ZnVuY3Rpb24obSxuKXtsLnNldChtLG4pO2Zvcihjb25zdCBxIG9mIHIpe2NvbnN0IHU9aChuLHEpO3EubGlzdGVuKG0sdSl9fTtkLnVubGlzdGVuPWZ1bmN0aW9uKG0pe2wuZGVsZXRlKG0pO2Zvcihjb25zdCBuIG9mIHIpbi51bmxpc3RlbihtKX19KShiLmhvc3R8fChiLmhvc3Q9e30pKX0pKGdsfHwoZ2w9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9jb3JlLWhvc3QtaW1wbC5qcwpnbC5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFVSTFBsdWdpbkRhdGEiLGI9PntpZihiKXtiPWBwLiR7Yi5wbHVnaW5OYW1lfS5gO3ZhciBkPXt9O2ZvcihsZXQgZiBpbiBiZC51cmxEaWN0KWYuc3RhcnRzV2l0aChiKSYmKGRbZi5zdWJzdHJpbmcoYi5sZW5ndGgpXT1iZC51cmxEaWN0W2ZdKTtyZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9ydW5zLWhvc3QtaW1wbC5qcwpnbC5ob3N0Lmxpc3RlbigiZXhwZXJpbWVudGFsLkdldFJ1bnMiLCgpPT5kYy5ydW5zU3RvcmUuZ2V0UnVucygpKTtkYy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9PmdsLmhvc3QuYnJvYWRjYXN0KCkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWV4cGVyaW1lbnRhbC1wbHVnaW4taG9zdC1saWIiLF90ZW1wbGF0ZTpudWxsLHJlZ2lzdGVyUGx1Z2luSWZyYW1lOmdsLmhvc3QucmVnaXN0ZXJQbHVnaW5JZnJhbWV9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yaXBwbGUvcGFwZXItcmlwcGxlLmh0bWwuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLndpZHRoPXRoaXMuYm91bmRpbmdSZWN0LndpZHRoO3RoaXMuaGVpZ2h0PXRoaXMuYm91bmRpbmdSZWN0LmhlaWdodDt0aGlzLnNpemU9TWF0aC5tYXgodGhpcy53aWR0aCx0aGlzLmhlaWdodCl9ZnVuY3Rpb24gZChoKXt0aGlzLmVsZW1lbnQ9aDt0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGgpLmNvbG9yO3RoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yO3RoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIik7dGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIik7UG9seW1lci5kb20odGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9CnZhciBmPXtkaXN0YW5jZTpmdW5jdGlvbihoLGsscixsKXtoLT1yO2stPWw7cmV0dXJuIE1hdGguc3FydChoKmgrayprKX0sbm93OndpbmRvdy5wZXJmb3JtYW5jZSYmd2luZG93LnBlcmZvcm1hbmNlLm5vdz93aW5kb3cucGVyZm9ybWFuY2Uubm93LmJpbmQod2luZG93LnBlcmZvcm1hbmNlKTpEYXRlLm5vd307Yi5wcm90b3R5cGU9e2dldCBib3VuZGluZ1JlY3QoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxmdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbTpmdW5jdGlvbihoLGspe3ZhciByPWYuZGlzdGFuY2UoaCxrLDAsMCksbD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLDApLHA9Zi5kaXN0YW5jZShoLGssMCx0aGlzLmhlaWdodCk7aD1mLmRpc3RhbmNlKGgsayx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KTtyZXR1cm4gTWF0aC5tYXgocixsLHAsaCl9fTtkLk1BWF9SQURJVVM9MzAwO2QucHJvdG90eXBlPXtnZXQgcmVjZW50ZXJzKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5yZWNlbnRlcnN9LApnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7aWYoIXRoaXMubW91c2VEb3duU3RhcnQpcmV0dXJuIDA7dmFyIGg9Zi5ub3coKS10aGlzLm1vdXNlRG93blN0YXJ0O3RoaXMubW91c2VVcFN0YXJ0JiYoaC09dGhpcy5tb3VzZVVwRWxhcHNlZCk7cmV0dXJuIGh9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9mLm5vdygpLXRoaXMubW91c2VVcFN0YXJ0OjB9LGdldCBtb3VzZURvd25FbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWQvMUUzfSxnZXQgbW91c2VVcEVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VVcEVsYXBzZWQvMUUzfSxnZXQgbW91c2VJbnRlcmFjdGlvblNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkU2Vjb25kcyt0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kc30sZ2V0IGluaXRpYWxPcGFjaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5pbml0aWFsT3BhY2l0eX0sCmdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgaD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxkLk1BWF9SQURJVVMpKzU7cmV0dXJuIE1hdGguYWJzKGgqKDEtTWF0aC5wb3coODAsLSh0aGlzLm1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzLygxLjEtaC9kLk1BWF9SQURJVVMqLjIpKSkpKX0sZ2V0IG9wYWNpdHkoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/TWF0aC5tYXgoMCx0aGlzLmluaXRpYWxPcGFjaXR5LXRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzKnRoaXMub3BhY2l0eURlY2F5VmVsb2NpdHkpOnRoaXMuaW5pdGlhbE9wYWNpdHl9LGdldCBvdXRlck9wYWNpdHkoKXtyZXR1cm4gTWF0aC5tYXgoMCwKTWF0aC5taW4oLjMqdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMsdGhpcy5vcGFjaXR5KSl9LGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKXtyZXR1cm4uMDE+dGhpcy5vcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzUmVzdGluZ0F0TWF4UmFkaXVzKCl7cmV0dXJuIHRoaXMub3BhY2l0eT49dGhpcy5pbml0aWFsT3BhY2l0eSYmdGhpcy5yYWRpdXM+PU1hdGgubWluKHRoaXMubWF4UmFkaXVzLGQuTUFYX1JBRElVUyl9LGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P3RoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkOnRoaXMuaXNSZXN0aW5nQXRNYXhSYWRpdXN9LGdldCB0cmFuc2xhdGlvbkZyYWN0aW9uKCl7cmV0dXJuIE1hdGgubWluKDEsdGhpcy5yYWRpdXMvdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUqMi9NYXRoLnNxcnQoMikpfSxnZXQgeE5vdygpe3JldHVybiB0aGlzLnhFbmQ/CnRoaXMueFN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy54RW5kLXRoaXMueFN0YXJ0KTp0aGlzLnhTdGFydH0sZ2V0IHlOb3coKXtyZXR1cm4gdGhpcy55RW5kP3RoaXMueVN0YXJ0K3RoaXMudHJhbnNsYXRpb25GcmFjdGlvbioodGhpcy55RW5kLXRoaXMueVN0YXJ0KTp0aGlzLnlTdGFydH0sZ2V0IGlzTW91c2VEb3duKCl7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQmJiF0aGlzLm1vdXNlVXBTdGFydH0scmVzZXRJbnRlcmFjdGlvblN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5zbGlkZURpc3RhbmNlPXRoaXMueUVuZD10aGlzLnhFbmQ9dGhpcy55U3RhcnQ9dGhpcy54U3RhcnQ9dGhpcy5tb3VzZVVwU3RhcnQ9dGhpcy5tb3VzZURvd25TdGFydD10aGlzLm1heFJhZGl1cz0wO3RoaXMuY29udGFpbmVyTWV0cmljcz1uZXcgYih0aGlzLmVsZW1lbnQpfSxkcmF3OmZ1bmN0aW9uKCl7dGhpcy53YXZlLnN0eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5O3ZhciBoPXRoaXMucmFkaXVzLwoodGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUvMik7dmFyIGs9dGhpcy54Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yO3ZhciByPXRoaXMueU5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIraysicHgsICIrcisicHgpIjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2srInB4LCAiK3IrInB4LCAwKSI7dGhpcy53YXZlLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ic2NhbGUoIitoKyIsIitoKyIpIjt0aGlzLndhdmUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZTNkKCIraCsiLCIraCsiLDEpIn0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt2YXIgaz10aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMixyPXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLnJlc2V0SW50ZXJhY3Rpb25TdGF0ZSgpO3RoaXMubW91c2VEb3duU3RhcnQ9CmYubm93KCk7dGhpcy5jZW50ZXI/KHRoaXMueFN0YXJ0PWssdGhpcy55U3RhcnQ9cix0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk6KHRoaXMueFN0YXJ0PWg/aC5kZXRhaWwueC10aGlzLmNvbnRhaW5lck1ldHJpY3MuYm91bmRpbmdSZWN0LmxlZnQ6dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsdGhpcy55U3RhcnQ9aD9oLmRldGFpbC55LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QudG9wOnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMik7dGhpcy5yZWNlbnRlcnMmJih0aGlzLnhFbmQ9ayx0aGlzLnlFbmQ9cix0aGlzLnNsaWRlRGlzdGFuY2U9Zi5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk7dGhpcy5tYXhSYWRpdXM9dGhpcy5jb250YWluZXJNZXRyaWNzLmZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tKHRoaXMueFN0YXJ0LAp0aGlzLnlTdGFydCk7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRvcD0odGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0PSh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgtdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUpLzIrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4Ijt0aGlzLndhdmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKyJweCJ9LHVwQWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc01vdXNlRG93biYmKHRoaXMubW91c2VVcFN0YXJ0PWYubm93KCkpfSxyZW1vdmU6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKX19O1BvbHltZXIoe2lzOiJwYXBlci1yaXBwbGUiLApiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdLHByb3BlcnRpZXM6e2luaXRpYWxPcGFjaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouMjV9LG9wYWNpdHlEZWNheVZlbG9jaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouOH0scmVjZW50ZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNlbnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyaXBwbGVzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxhbmltYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGhvbGREb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob2xkRG93bkNoYW5nZWQifSxub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW59LF9ib3VuZEFuaW1hdGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmltYXRlLmJpbmQodGhpcyl9fX0sCmdldCB0YXJnZXQoKXtyZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldH0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX29uRW50ZXJLZXlkb3duIiwic3BhY2U6a2V5ZG93biI6Il9vblNwYWNlS2V5ZG93biIsInNwYWNlOmtleXVwIjoiX29uU3BhY2VLZXl1cCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5rZXlFdmVudFRhcmdldD0xMT09dGhpcy5wYXJlbnROb2RlLm5vZGVUeXBlP1BvbHltZXIuZG9tKHRoaXMpLmdldE93bmVyUm9vdCgpLmhvc3Q6dGhpcy5wYXJlbnROb2RlO3RoaXMubGlzdGVuKGgsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMubGlzdGVuKGgsImRvd24iLCJ1aURvd25BY3Rpb24iKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsInVwIiwidWlVcEFjdGlvbiIpO3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwiZG93biIsInVpRG93bkFjdGlvbiIpO3RoaXMua2V5RXZlbnRUYXJnZXQ9Cm51bGx9LGdldCBzaG91bGRLZWVwQW5pbWF0aW5nKCl7Zm9yKHZhciBoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraClpZighdGhpcy5yaXBwbGVzW2hdLmlzQW5pbWF0aW9uQ29tcGxldGUpcmV0dXJuITA7cmV0dXJuITF9LHNpbXVsYXRlZFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZG93bkFjdGlvbihudWxsKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy51cEFjdGlvbigpfSwxKX0sdWlEb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMubm9pbmt8fHRoaXMuZG93bkFjdGlvbihoKX0sZG93bkFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3duJiYwPHRoaXMucmlwcGxlcy5sZW5ndGh8fCh0aGlzLmFkZFJpcHBsZSgpLmRvd25BY3Rpb24oaCksdGhpcy5fYW5pbWF0aW5nfHwodGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKSl9LHVpVXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy51cEFjdGlvbihoKX0sdXBBY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ob2xkRG93bnx8Cih0aGlzLnJpcHBsZXMuZm9yRWFjaChmdW5jdGlvbihrKXtrLnVwQWN0aW9uKGgpfSksdGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKX0sb25BbmltYXRpb25Db21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZz0hMTt0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bnVsbDt0aGlzLmZpcmUoInRyYW5zaXRpb25lbmQiKX0sYWRkUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIGg9bmV3IGQodGhpcyk7UG9seW1lci5kb20odGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZChoLndhdmVDb250YWluZXIpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1oLmNvbG9yO3RoaXMucmlwcGxlcy5wdXNoKGgpO3RoaXMuX3NldEFuaW1hdGluZyghMCk7cmV0dXJuIGh9LHJlbW92ZVJpcHBsZTpmdW5jdGlvbihoKXt2YXIgaz10aGlzLnJpcHBsZXMuaW5kZXhPZihoKTswPmt8fCh0aGlzLnJpcHBsZXMuc3BsaWNlKGssMSksaC5yZW1vdmUoKSwKdGhpcy5yaXBwbGVzLmxlbmd0aHx8dGhpcy5fc2V0QW5pbWF0aW5nKCExKSl9LGFuaW1hdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9hbmltYXRpbmcpe3ZhciBoO2ZvcihoPTA7aDx0aGlzLnJpcHBsZXMubGVuZ3RoOysraCl7dmFyIGs9dGhpcy5yaXBwbGVzW2hdO2suZHJhdygpO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLm9wYWNpdHk9ay5vdXRlck9wYWNpdHk7ay5pc09wYWNpdHlGdWxseURlY2F5ZWQmJiFrLmlzUmVzdGluZ0F0TWF4UmFkaXVzJiZ0aGlzLnJlbW92ZVJpcHBsZShrKX1pZih0aGlzLnNob3VsZEtlZXBBbmltYXRpbmd8fDAhPT10aGlzLnJpcHBsZXMubGVuZ3RoKXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fYm91bmRBbmltYXRlKTtlbHNlIHRoaXMub25BbmltYXRpb25Db21wbGV0ZSgpfX0sX29uRW50ZXJLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKTt0aGlzLmFzeW5jKHRoaXMudWlVcEFjdGlvbiwxKX0sX29uU3BhY2VLZXlkb3duOmZ1bmN0aW9uKCl7dGhpcy51aURvd25BY3Rpb24oKX0sCl9vblNwYWNlS2V5dXA6ZnVuY3Rpb24oKXt0aGlzLnVpVXBBY3Rpb24oKX0sX2hvbGREb3duQ2hhbmdlZDpmdW5jdGlvbihoLGspe3ZvaWQgMCE9PWsmJihoP3RoaXMuZG93bkFjdGlvbigpOnRoaXMudXBBY3Rpb24oKSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJ1dHRvbi9wYXBlci1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvcl0scHJvcGVydGllczp7cmFpc2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExLG9ic2VydmVyOiJfY2FsY3VsYXRlRWxldmF0aW9uIn19LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt0aGlzLnJhaXNlZD9Qb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWNoZWNrYm94L3BhcGVyLWNoZWNrYm94Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWNoZWNrYm94IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiY2hlY2tib3giLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSIpLnRyaW0oKSxkPSJweCIsZj1iLm1hdGNoKC9bQS1aYS16XSskLyk7bnVsbCE9PWYmJihkPWZbMF0pO2I9cGFyc2VGbG9hdChiKTsKZj04LzMqYjsicHgiPT09ZCYmKGY9TWF0aC5mbG9vcihmKSxmJTIhPT1iJTImJmYrKyk7dGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWluay1zaXplIjpmK2R9KX19KX0sX2NvbXB1dGVDaGVja2JveENsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9IiI7YiYmKGYrPSJjaGVja2VkICIpO2QmJihmKz0iaW52YWxpZCIpO3JldHVybiBmfSxfY29tcHV0ZUNoZWNrbWFya0NsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiPyIiOiJoaWRkZW4ifSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5jaGVja2JveENvbnRhaW5lcjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pY29uL2lyb24taWNvbi5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb24iLHByb3BlcnRpZXM6e2ljb246e3R5cGU6U3RyaW5nfSx0aGVtZTp7dHlwZTpTdHJpbmd9LHNyYzp7dHlwZTpTdHJpbmd9LF9tZXRhOnt2YWx1ZTpQb2x5bWVyLkJhc2UuY3JlYXRlKCJpcm9uLW1ldGEiLHt0eXBlOiJpY29uc2V0In0pfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUljb24oX21ldGEsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZUljb24odGhlbWUsIGlzQXR0YWNoZWQpIiwiX3NyY0NoYW5nZWQoc3JjLCBpc0F0dGFjaGVkKSIsIl9pY29uQ2hhbmdlZChpY29uLCBpc0F0dGFjaGVkKSJdLF9ERUZBVUxUX0lDT05TRVQ6Imljb25zIixfaWNvbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj0oYnx8IiIpLnNwbGl0KCI6Iik7dGhpcy5faWNvbk5hbWU9Yi5wb3AoKTt0aGlzLl9pY29uc2V0TmFtZT1iLnBvcCgpfHx0aGlzLl9ERUZBVUxUX0lDT05TRVQ7dGhpcy5fdXBkYXRlSWNvbigpfSxfc3JjQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUljb24oKX0sCl91c2VzSWNvbnNldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmljb258fCF0aGlzLnNyY30sX3VwZGF0ZUljb246ZnVuY3Rpb24oKXt0aGlzLl91c2VzSWNvbnNldCgpPyh0aGlzLl9pbWcmJnRoaXMuX2ltZy5wYXJlbnROb2RlJiZQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX2ltZyksIiI9PT10aGlzLl9pY29uTmFtZT90aGlzLl9pY29uc2V0JiZ0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyk6dGhpcy5faWNvbnNldE5hbWUmJnRoaXMuX21ldGEmJigodGhpcy5faWNvbnNldD10aGlzLl9tZXRhLmJ5S2V5KHRoaXMuX2ljb25zZXROYW1lKSk/KHRoaXMuX2ljb25zZXQuYXBwbHlJY29uKHRoaXMsdGhpcy5faWNvbk5hbWUsdGhpcy50aGVtZSksdGhpcy51bmxpc3Rlbih3aW5kb3csImlyb24taWNvbnNldC1hZGRlZCIsIl91cGRhdGVJY29uIikpOnRoaXMubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSkpOih0aGlzLl9pY29uc2V0JiYKdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpLHRoaXMuX2ltZ3x8KHRoaXMuX2ltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSx0aGlzLl9pbWcuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuX2ltZy5kcmFnZ2FibGU9ITEpLHRoaXMuX2ltZy5zcmM9dGhpcy5zcmMsUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZCh0aGlzLl9pbWcpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWExMXktYW5ub3VuY2VyL2lyb24tYTExeS1hbm5vdW5jZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyPVBvbHltZXIoe2lzOiJpcm9uLWExMXktYW5ub3VuY2VyIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToicG9saXRlIn0sX3RleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2V8fChQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPXRoaXMpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1hbm5vdW5jZSIsdGhpcy5fb25Jcm9uQW5ub3VuY2UuYmluZCh0aGlzKSl9LGFubm91bmNlOmZ1bmN0aW9uKGIpe3RoaXMuX3RleHQ9IiI7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3RleHQ9Yn0sMTAwKX0sX29uSXJvbkFubm91bmNlOmZ1bmN0aW9uKGIpe2IuZGV0YWlsJiZiLmRldGFpbC50ZXh0JiZ0aGlzLmFubm91bmNlKGIuZGV0YWlsLnRleHQpfX0pOwpQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5PWZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1hMTF5LWFubm91bmNlciIpKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2UpfX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1pbnB1dC9pcm9uLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YmluZFZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVZhbHVlKGJpbmRWYWx1ZSkifSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRFbGVtZW50Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2JpbmRWYWx1ZUNoYW5nZWQoYmluZFZhbHVlLCBfaW5wdXRFbGVtZW50KSJdLGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0IixrZXlwcmVzczoiX29uS2V5cHJlc3MifSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCk7dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PSIiO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj0KUG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKCl7dGhpcy5faW5pdFNsb3R0ZWRJbnB1dCgpfS5iaW5kKHRoaXMpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmKFBvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKSx0aGlzLl9vYnNlcnZlcj1udWxsKX0sZ2V0IGlucHV0RWxlbWVudCgpe3JldHVybiB0aGlzLl9pbnB1dEVsZW1lbnR9LF9pbml0U2xvdHRlZElucHV0OmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRFbGVtZW50PXRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKVswXTt0aGlzLmlucHV0RWxlbWVudCYmdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUmJih0aGlzLmJpbmRWYWx1ZT10aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7dGhpcy5maXJlKCJpcm9uLWlucHV0LXJlYWR5Iil9LGdldCBfcGF0dGVyblJlZ0V4cCgpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm4pdmFyIGI9bmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRQYXR0ZXJuKTsKZWxzZSBzd2l0Y2godGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7Y2FzZSAibnVtYmVyIjpiPS9bMC05LixlLV0vfXJldHVybiBifSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJih2b2lkIDA9PT1iP2QudmFsdWU9bnVsbDpiIT09ZC52YWx1ZSYmKHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlPWIpLHRoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTpifSkpfSxfb25JbnB1dDpmdW5jdGlvbigpeyF0aGlzLmFsbG93ZWRQYXR0ZXJufHx0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWR8fHRoaXMuX2NoZWNrUGF0dGVyblZhbGlkaXR5KCl8fCh0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgbm90IGVudGVyZWQuIiksdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0KTt0aGlzLmJpbmRWYWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9CnRoaXMuaW5wdXRFbGVtZW50LnZhbHVlO3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sX2lzUHJpbnRhYmxlOmZ1bmN0aW9uKGIpe3ZhciBkPTE5PT1iLmtleUNvZGV8fDIwPT1iLmtleUNvZGV8fDQ1PT1iLmtleUNvZGV8fDQ2PT1iLmtleUNvZGV8fDE0ND09Yi5rZXlDb2RlfHwxNDU9PWIua2V5Q29kZXx8MzI8Yi5rZXlDb2RlJiY0MT5iLmtleUNvZGV8fDExMTxiLmtleUNvZGUmJjEyND5iLmtleUNvZGU7cmV0dXJuISg4PT1iLmtleUNvZGV8fDk9PWIua2V5Q29kZXx8MTM9PWIua2V5Q29kZXx8Mjc9PWIua2V5Q29kZSkmJiEoMD09Yi5jaGFyQ29kZSYmZCl9LF9vbktleXByZXNzOmZ1bmN0aW9uKGIpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm58fCJudW1iZXIiPT09dGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7dmFyIGQ9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZihkJiYhKGIubWV0YUtleXx8Yi5jdHJsS2V5fHxiLmFsdEtleSkpe3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0KITA7dmFyIGY9U3RyaW5nLmZyb21DaGFyQ29kZShiLmNoYXJDb2RlKTt0aGlzLl9pc1ByaW50YWJsZShiKSYmIWQudGVzdChmKSYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgY2hhcmFjdGVyICIrZisiIG5vdCBlbnRlcmVkLiIpKX19fSxfY2hlY2tQYXR0ZXJuVmFsaWRpdHk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKCFiKXJldHVybiEwO2Zvcih2YXIgZD0wO2Q8dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUubGVuZ3RoO2QrKylpZighYi50ZXN0KHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlW2RdKSlyZXR1cm4hMTtyZXR1cm4hMH0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5pbnB1dEVsZW1lbnQpcmV0dXJuIHRoaXMuaW52YWxpZD0hMSwhMDt2YXIgYj10aGlzLmlucHV0RWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7YiYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy5iaW5kVmFsdWU/Yj0hMToKdGhpcy5oYXNWYWxpZGF0b3IoKSYmKGI9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy5iaW5kVmFsdWUpKSk7dGhpcy5pbnZhbGlkPSFiO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpO3JldHVybiBifSxfYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6Yn0pfSxfY29tcHV0ZVZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWNoYXItY291bnRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7X2NoYXJDb3VudGVyU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiMCJ9fSx1cGRhdGU6ZnVuY3Rpb24oYil7aWYoYi5pbnB1dEVsZW1lbnQpe2IudmFsdWU9Yi52YWx1ZXx8IiI7dmFyIGQ9Yi52YWx1ZS50b1N0cmluZygpLmxlbmd0aC50b1N0cmluZygpO2IuaW5wdXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibWF4bGVuZ3RoIikmJihkKz0iLyIrYi5pbnB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSk7dGhpcy5fY2hhckNvdW50ZXJTdHI9ZH19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY29udGFpbmVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNvbnRhaW5lciIscHJvcGVydGllczp7bm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXR0ckZvclZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiYmluZC12YWx1ZSJ9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOntvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZvY3VzZWQ6e3JlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9hZGRvbnM6e3R5cGU6QXJyYXl9LF9pbnB1dEhhc0NvbnRlbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0U2VsZWN0b3I6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbnB1dCxpcm9uLWlucHV0LHRleHRhcmVhLC5wYXBlci1pbnB1dC1pbnB1dCJ9LF9ib3VuZE9uRm9jdXM6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpfX0sCl9ib3VuZE9uQmx1cjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkJsdXIuYmluZCh0aGlzKX19LF9ib3VuZE9uSW5wdXQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25JbnB1dC5iaW5kKHRoaXMpfX0sX2JvdW5kVmFsdWVDaGFuZ2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uVmFsdWVDaGFuZ2VkLmJpbmQodGhpcyl9fX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIiwiaXJvbi1pbnB1dC12YWxpZGF0ZSI6Il9vbklyb25JbnB1dFZhbGlkYXRlIn0sZ2V0IF92YWx1ZUNoYW5nZWRFdmVudCgpe3JldHVybiB0aGlzLmF0dHJGb3JWYWx1ZSsiLWNoYW5nZWQifSxnZXQgX3Byb3BlcnR5Rm9yVmFsdWUoKXtyZXR1cm4gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZSh0aGlzLmF0dHJGb3JWYWx1ZSl9LGdldCBfaW5wdXRFbGVtZW50KCl7cmV0dXJuIFBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcil9LApnZXQgX2lucHV0RWxlbWVudFZhbHVlKCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudFt0aGlzLl9wcm9wZXJ0eUZvclZhbHVlXXx8dGhpcy5faW5wdXRFbGVtZW50LnZhbHVlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITA7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9ib3VuZE9uRm9jdXMsITApO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fYm91bmRPbkJsdXIsITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXR0ckZvclZhbHVlP3RoaXMuX2lucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3ZhbHVlQ2hhbmdlZEV2ZW50LHRoaXMuX2JvdW5kVmFsdWVDaGFuZ2VkKTp0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0Iix0aGlzLl9vbklucHV0KTt0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSYmIiIhPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlPwp0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpOnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTtiPWIudGFyZ2V0Oy0xPT09dGhpcy5fYWRkb25zLmluZGV4T2YoYikmJih0aGlzLl9hZGRvbnMucHVzaChiKSx0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCkpfSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3NldEZvY3VzZWQoITApfSxfb25CbHVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMSk7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O2lmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGUmJih0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSExLHZvaWQgMD09PWQudmFsdWV8fCIiPT09ZC52YWx1ZSkpcmV0dXJuO3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKGIudGFyZ2V0KX0sX2hhbmRsZVZhbHVlOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlO2R8fDA9PT1kfHwibnVtYmVyIj09PWIudHlwZSYmIWIuY2hlY2tWYWxpZGl0eSgpP3RoaXMuX2lucHV0SGFzQ29udGVudD0hMDp0aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ITE7dGhpcy51cGRhdGVBZGRvbnMoe2lucHV0RWxlbWVudDpiLHZhbHVlOmQsaW52YWxpZDp0aGlzLmludmFsaWR9KX0sX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuYXV0b1ZhbGlkYXRlJiZiJiYodGhpcy5pbnZhbGlkPSEoYi52YWxpZGF0ZT9iLnZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudFZhbHVlKTpiLmNoZWNrVmFsaWRpdHkoKSkpOwp0aGlzLl9oYW5kbGVWYWx1ZShiKX0sX29uSXJvbklucHV0VmFsaWRhdGU6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ9dGhpcy5faW5wdXRFbGVtZW50LmludmFsaWR9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FkZG9ucyYmdGhpcy51cGRhdGVBZGRvbnMoe2ludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LHVwZGF0ZUFkZG9uczpmdW5jdGlvbihiKXtmb3IodmFyIGQsZj0wO2Q9dGhpcy5fYWRkb25zW2ZdO2YrKylkLnVwZGF0ZShiKX0sX2NvbXB1dGVJbnB1dENvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQsZixoLGspe3ZhciByPSJpbnB1dC1jb250ZW50IjtiPyhrJiYocis9IiBsYWJlbC1pcy1oaWRkZW4iKSxoJiYocis9IiBpcy1pbnZhbGlkIikpOihiPXRoaXMucXVlcnlTZWxlY3RvcigibGFiZWwiKSxkfHxrPyhyKz0iIGxhYmVsLWlzLWZsb2F0aW5nIix0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0ic3RhdGljIixoP3IrPSIgaXMtaW52YWxpZCI6CmYmJihyKz0iIGxhYmVsLWlzLWhpZ2hsaWdodGVkIikpOihiJiYodGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaCYmKHIrPSIgaXMtaW52YWxpZCIpKSk7ZiYmKHIrPSIgZm9jdXNlZCIpO3JldHVybiByfSxfY29tcHV0ZVVuZGVybGluZUNsYXNzOmZ1bmN0aW9uKGIsZCl7dmFyIGY9InVuZGVybGluZSI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9LF9jb21wdXRlQWRkT25Db250ZW50Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iYWRkLW9uLWNvbnRlbnQiO2Q/Zis9IiBpcy1pbnZhbGlkIjpiJiYoZis9IiBpcy1oaWdobGlnaHRlZCIpO3JldHVybiBmfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0LWVycm9yLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWVycm9yIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEFkZG9uQmVoYXZpb3JdLHByb3BlcnRpZXM6e2ludmFsaWQ6e3JlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW59fSx1cGRhdGU6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW52YWxpZChiLmludmFsaWQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLWlucHV0Lmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0IixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOlN0cmluZ319LGJlZm9yZVJlZ2lzdGVyOmZ1bmN0aW9uKCl7dmFyIGI9ImZ1bmN0aW9uIj09dHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24taW5wdXQiKS5faW5pdFNsb3R0ZWRJbnB1dD8idjEiOiJ2MCIsZD1Qb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoInBhcGVyLWlucHV0IiwidGVtcGxhdGUiKTtiPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSMiK2IpOyhkPWQuY29udGVudC5xdWVyeVNlbGVjdG9yKCIjdGVtcGxhdGUtcGxhY2Vob2xkZXIiKSkmJmQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoYi5jb250ZW50LGQpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5FbGVtZW50P3RoaXMuaW5wdXRFbGVtZW50Ll9pbnB1dEVsZW1lbnQ6CnRoaXMuaW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKTt0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCk7dGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1kcm9wZG93bi9pcm9uLWRyb3Bkb3duLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sb3BlbkFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZm9jdXNUYXJnZXQ6e3R5cGU6T2JqZWN0fSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkIn19LApsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbihwb3NpdGlvblRhcmdldCwgdmVydGljYWxBbGlnbiwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbE9mZnNldCwgaG9yaXpvbnRhbE9mZnNldCkiXSxnZXQgY29udGFpbmVkRWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249dGhpcy5hbGxvd091dHNpZGVTY3JvbGw/InJlZml0IjoibG9jayIpO3RoaXMuX3JlYWRpZWQ9ITB9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zaXppbmdUYXJnZXQmJnRoaXMuc2l6aW5nVGFyZ2V0IT09CnRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLm9wZW4/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oIm9wZW4iKSk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fcmVuZGVyT3BlbmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXshdGhpcy5ub0FuaW1hdGlvbnMmJnRoaXMuYW5pbWF0aW9uQ29uZmlnLmNsb3NlPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJjbG9zZSIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJDbG9zZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGluZyIpO3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuY29udGFpbmVkRWxlbWVudCxkPVtdLmNvbmNhdCh0aGlzLm9wZW5BbmltYXRpb25Db25maWd8fFtdKS5jb25jYXQodGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ3x8CltdKSxmPTA7ZjxkLmxlbmd0aDtmKyspZFtmXS5ub2RlPWI7dGhpcy5hbmltYXRpb25Db25maWc9e29wZW46dGhpcy5vcGVuQW5pbWF0aW9uQ29uZmlnLGNsb3NlOnRoaXMuY2xvc2VBbmltYXRpb25Db25maWd9fSxfdXBkYXRlT3ZlcmxheVBvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfSxfYWxsb3dPdXRzaWRlU2Nyb2xsQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9yZWFkaWVkJiYoYj90aGlzLnNjcm9sbEFjdGlvbiYmImxvY2siIT09dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj0icmVmaXQiKTp0aGlzLnNjcm9sbEFjdGlvbj0ibG9jayIpfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZm9jdXNUYXJnZXR8fHRoaXMuY29udGFpbmVkRWxlbWVudDtiJiZ0aGlzLm9wZW5lZCYmIXRoaXMubm9BdXRvRm9jdXM/Yi5mb2N1cygpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX2FwcGx5Rm9jdXMuYXBwbHkodGhpcywKYXJndW1lbnRzKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWVudS1idXR0b24vcGFwZXItbWVudS1idXR0b24uaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07UG9seW1lci5QYXBlck1lbnVCdXR0b249ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5yZWdpc3RlcmVkPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuYWRkT3duS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlbW92ZU93bktleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NvbGxlY3RLZXlCaW5kaW5ncz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9wcmVwS2V5QmluZGluZ3M9CmZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2FkZEtleUJpbmRpbmc9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fcmVzZXRLZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX29uS2V5QmluZGluZ0V2ZW50PWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3RyaWdnZXJLZXlIYW5kbGVyPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2ZvY3VzQmx1ckhhbmRsZXI9ZnVuY3Rpb24oZCl7aWYoUG9seW1lci5FbGVtZW50KXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PQpkLnR5cGUpO2Vsc2UgaWYoZC50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWQudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGY9UG9seW1lci5kb20oZCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChmKXx8dGhpcy5maXJlKGQudHlwZSx7c291cmNlRXZlbnQ6ZH0se25vZGU6dGhpcyxidWJibGVzOmQuYnViYmxlcyxjYW5jZWxhYmxlOmQuY2FuY2VsYWJsZX0pfX07UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9jaGFuZ2VkQ29udHJvbFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3NldEZvY3VzZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uPVBvbHltZXIoe2lzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLApQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e29wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saWdub3JlU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NlT25BY3RpdmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoyMDB9fSx7bmFtZToicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MTUwLGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjI3NSxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LAp7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kcm9wZG93bkNvbnRlbnQ6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxsaXN0ZW5lcnM6eyJpcm9uLWFjdGl2YXRlIjoiX29uSXJvbkFjdGl2YXRlIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0In0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBkPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZj0wLGg9ZC5sZW5ndGg7ZjxoO2YrKylpZihkW2ZdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGRbZl19LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPwp0aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkfHx0aGlzLiQuZHJvcGRvd24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5kcm9wZG93bi5jbG9zZSgpfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVTZWxlY3R8fHRoaXMuY2xvc2UoKX0sX29uSXJvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtkPyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZiYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZS5fZGlzYWJsZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkJiZ0aGlzLm9wZW5lZCYmCnRoaXMuY2xvc2UoKX0sX19vbklyb25PdmVybGF5Q2FuY2VsZWQ6ZnVuY3Rpb24oZCl7dmFyIGY9dGhpcy4kLnRyaWdnZXI7LTE8UG9seW1lci5kb20oZC5kZXRhaWwpLnBhdGguaW5kZXhPZihmKSYmZC5wcmV2ZW50RGVmYXVsdCgpfX0pO09iamVjdC5rZXlzKGIpLmZvckVhY2goZnVuY3Rpb24oZCl7UG9seW1lci5QYXBlck1lbnVCdXR0b25bZF09YltkXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kcm9wZG93bi1tZW51L3BhcGVyLWRyb3Bkb3duLW1lbnUuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicGFwZXItZHJvcGRvd24tbWVudSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWxlY3RlZEl0ZW1MYWJlbDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sbGFiZWw6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sCnZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToicmlnaHQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToidG9wIn0sdmVydGljYWxPZmZzZXQ6TnVtYmVyLGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RhcDoiX29uVGFwIn0sa2V5QmluZGluZ3M6eyJ1cCBkb3duIjoib3BlbiIsZXNjOiJjbG9zZSJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjb21ib2JveCIsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsImFyaWEtaGFzcG9wdXAiOiJ0cnVlIn0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtKSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuY29udGVudEVsZW1lbnQ7YiYmYi5zZWxlY3RlZEl0ZW0mJnRoaXMuX3NldFNlbGVjdGVkSXRlbShiLnNlbGVjdGVkSXRlbSl9LGdldCBjb250ZW50RWxlbWVudCgpe2Zvcih2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYltkXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiBiW2RdfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5tZW51QnV0dG9uLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuZGV0YWlsLml0ZW0pfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCl9LF9vblRhcDpmdW5jdGlvbihiKXtQb2x5bWVyLkdlc3R1cmVzLmZpbmRPcmlnaW5hbFRhcmdldChiKT09PXRoaXMmJgp0aGlzLm9wZW4oKX0sX3NlbGVjdGVkSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1iPWI/Yi5sYWJlbHx8Yi5nZXRBdHRyaWJ1dGUoImxhYmVsIil8fGIudGV4dENvbnRlbnQudHJpbSgpOiIiO3RoaXMuX3NldFNlbGVjdGVkSXRlbUxhYmVsKGIpfSxfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldDpmdW5jdGlvbihiLGQpe3JldHVybiBkP2Q6Yj8tNDo4fSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMucmVxdWlyZWQmJiEhdGhpcy52YWx1ZX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9wZW5lZD8idHJ1ZSI6ImZhbHNlIixkPXRoaXMuY29udGVudEVsZW1lbnQ7ZCYmZC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1saXN0Ym94L3BhcGVyLWxpc3Rib3guaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicGFwZXItbGlzdGJveCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJsaXN0Ym94In19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWl0ZW0iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkoZGN8fChkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvdGYtc3RvcmFnZS1wb2x5bWVyLmpzCihmdW5jdGlvbihiKXtQb2x5bWVyKHtpczoidGYtc3RvcmFnZSIsX3RlbXBsYXRlOm51bGwsdGZfc3RvcmFnZTpifSl9KShiZHx8KGJkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvdGYtdGFnLWZpbHRlcmVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRhZy1maWx0ZXJlciIscHJvcGVydGllczp7dGFnRmlsdGVyOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKF90YWdGaWx0ZXIpIn0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6YmQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifX0sX3RhZ0ZpbHRlck9ic2VydmVyOmJkLmdldFN0cmluZ09ic2VydmVyKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KSxfY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIscHJvcGVydGllczp7Y2F0ZWdvcnk6T2JqZWN0LGluaXRpYWxPcGVuZWQ6Qm9vbGVhbixvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udGVudEFjdGl2ZShvcGVuZWQpIn0sZGlzYWJsZVBhZ2luYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9LF9oYXNNdWx0aXBsZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlKF9jb3VudCkifSxfcGFuZVJlbmRlcmVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSxfaXRlbXNSZW5kZXJlZDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSxfaXNTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUpIn0sX2lzSW52YWxpZFNlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LF9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSxnZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PkpTT04uc3RyaW5naWZ5KGIpLG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9LF9saW1pdDp7dHlwZTpOdW1iZXIsdmFsdWU6MTIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSwKX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRQYWdlKF9saW1pdCwgX2FjdGl2ZUluZGV4KSJ9LF9wYWdlQ291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0sX211bHRpcGxlUGFnZXNFeGlzdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChfcGFnZUNvdW50LCBkaXNhYmxlUGFnaW5hdGlvbikifSxfaGFzUHJldmlvdXNQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzUHJldmlvdXNQYWdlKF9jdXJyZW50UGFnZSkifSxfaGFzTmV4dFBhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNOZXh0UGFnZShfY3VycmVudFBhZ2UsIF9wYWdlQ291bnQpIn0sX2lucHV0V2lkdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUlucHV0V2lkdGgoX3BhZ2VDb3VudCkiLApvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSxfcGFnZUlucHV0VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSxfcGFnZUlucHV0UmF3VmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcGFnZUlucHV0Rm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2NsYW1wQWN0aXZlSW5kZXgoY2F0ZWdvcnkuaXRlbXMuKikiLCJfdXBkYXRlUmVuZGVyZWRJdGVtcyhfaXRlbXNSZW5kZXJlZCwgY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0LCBfYWN0aXZlSW5kZXgsIF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJdLGJlaGF2aW9yczpbcmQuVGZEb21SZXBlYXRCZWhhdmlvcl0sX2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH0sCl9jb21wdXRlSGFzTXVsdGlwbGUoKXtyZXR1cm4gMTx0aGlzLl9jb3VudH0sX3RvZ2dsZVBhbmUoKXt0aGlzLl9zZXRPcGVuZWQoIXRoaXMub3BlbmVkKX0sX2NvbXB1dGVDb250ZW50QWN0aXZlKCl7cmV0dXJuIHRoaXMub3BlbmVkfSxfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGIsZCl7YiYmYiE9PWQmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChiKXtyZXR1cm4hKGIubWV0YWRhdGEudHlwZT09PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1iLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYil7cmV0dXJuIGI9PT1rYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYi50eXBlPT09a2MuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYKIWIudmFsaWRSZWdleH0sX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGIpe3JldHVybiBiLnR5cGU9PT1rYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJmIudW5pdmVyc2FsUmVnZXh9LF9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0IGI9dGhpcy5jYXRlZ29yeS5tZXRhZGF0YS50eXBlO3JldHVybiB0aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLmNvbXBvc2l0ZVNlYXJjaCYmYj09PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30scmVhZHkoKXt0aGlzLl9zZXRPcGVuZWQobnVsbD09dGhpcy5pbml0aWFsT3BlbmVkPyEwOnRoaXMuaW5pdGlhbE9wZW5lZCk7dGhpcy5fbGltaXRMaXN0ZW5lcj0oKT0+e3RoaXMuc2V0KCJfbGltaXQiLHNkLmdldExpbWl0KCkpfTtzZC5hZGRMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpO3RoaXMuX2xpbWl0TGlzdGVuZXIoKX0sZGV0YWNoZWQoKXtzZC5yZW1vdmVMaW1pdExpc3RlbmVyKHRoaXMuX2xpbWl0TGlzdGVuZXIpfSwKX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYixkLGYsaCxrLHIpe2ImJihiPU1hdGguZmxvb3IoaC9mKSxkPXRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdLHRoaXMudXBkYXRlRG9tKHI/ZDpkLnNsaWNlKGIqZiwoYisxKSpmKSx0aGlzLmdldENhdGVnb3J5SXRlbUtleSkpfSxfbGltaXRDaGFuZ2VkKGIpe3RoaXMuc2V0Q2FjaGVTaXplKDIqYil9LF9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkKCl7dGhpcy5zZXRHZXRJdGVtS2V5KHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KX0sX2NvbXB1dGVDdXJyZW50UGFnZShiLGQpe3JldHVybiBNYXRoLmZsb29yKGQvYikrMX0sX2NvbXB1dGVQYWdlQ291bnQoYixkKXtyZXR1cm4gdGhpcy5jYXRlZ29yeT9NYXRoLmNlaWwodGhpcy5jYXRlZ29yeS5pdGVtcy5sZW5ndGgvZCk6MH0sX2NvbXB1dGVNdWx0aXBsZVBhZ2VzRXhpc3QoYixkKXtyZXR1cm4hZCYmMTxifSxfY29tcHV0ZUhhc1ByZXZpb3VzUGFnZShiKXtyZXR1cm4gMTxifSxfY29tcHV0ZUhhc05leHRQYWdlKGIsCmQpe3JldHVybiBiPGR9LF9jb21wdXRlSW5wdXRXaWR0aChiKXtyZXR1cm5gY2FsYygke2IudG9TdHJpbmcoKS5sZW5ndGh9ZW0gKyAyMHB4KWB9LF9zZXRBY3RpdmVJbmRleChiKXtjb25zdCBkPSh0aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSkubGVuZ3RoLTE7Yj5kJiYoYj1kKTswPmImJihiPTApO3RoaXMuc2V0KCJfYWN0aXZlSW5kZXgiLGIpfSxfY2xhbXBBY3RpdmVJbmRleCgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4KX0sX3BlcmZvcm1QcmV2aW91c1BhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleC10aGlzLl9saW1pdCl9LF9wZXJmb3JtTmV4dFBhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCt0aGlzLl9saW1pdCl9LF9jb21wdXRlUGFnZUlucHV0VmFsdWUoYixkLGYpe3JldHVybiBiP2Q6Zi50b1N0cmluZygpfSxfaGFuZGxlUGFnZUlucHV0RXZlbnQoYil7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsCmIudGFyZ2V0LnZhbHVlKTtiPU51bWJlcihiLnRhcmdldC52YWx1ZXx8TmFOKTtpc05hTihiKXx8dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQqKE1hdGgubWF4KDEsTWF0aC5taW4oYix0aGlzLl9wYWdlQ291bnQpKS0xKSl9LF9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9jdXJyZW50UGFnZS50b1N0cmluZygpKX0sX2hhbmRsZVBhZ2VGb2N1c0V2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsdGhpcy5fcGFnZUlucHV0VmFsdWUpO3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITApfSxfaGFuZGxlUGFnZUJsdXJFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITEpfSxfdXBkYXRlUGFnZUlucHV0VmFsdWUoYil7Y29uc3QgZD10aGlzLiQkKCIjcGFnZS1pbnB1dCBpbnB1dCIpO2QmJihkLnZhbHVlPWIpfSxfdXBkYXRlSW5wdXRXaWR0aCgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoIjp0aGlzLl9pbnB1dFdpZHRofSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nL3BhcGVyLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1kaWFsb2ciLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yLFBvbHltZXIuTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJuZW9uLWFuaW1hdGlvbi1maW5pc2giOiJfb25OZW9uQW5pbWF0aW9uRmluaXNoIn0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJlbnRyeSIpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKTt0aGlzLnBsYXlBbmltYXRpb24oImV4aXQiKX0sX29uTmVvbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciB0ZDsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkodGR8fCh0ZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiByKCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIocik7cigpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayxyKT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3IldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQoZGMucnVuc1N0b3JlLCgpPT5kYy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZChkYy5leHBlcmltZW50c1N0b3JlLCgpPT5kYy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHRkfHwodGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkoY2R8fChjZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXdici1zdHJpbmcvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsZGVsaW1pdGVyUGF0dGVybjpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlLCBkZWxpbWl0ZXJQYXR0ZXJuKSJ9fSxfY29tcHV0ZVBhcnRzKGIsZCl7Y29uc3QgZj1bXTtmb3IoOzspe2NvbnN0IGg9bmV3IFJlZ0V4cChkLCJnIik7aC50ZXN0KGIpO2lmKDA9PT1oLmxhc3RJbmRleCl7Zi5wdXNoKGIpO2JyZWFrfWVsc2UgZi5wdXNoKGIuc2xpY2UoMCxoLmxhc3RJbmRleCkpLGI9Yi5zbGljZShoLmxhc3RJbmRleCl9cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcnVucy1zZWxlY3Rvci90Zi1ydW5zLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXJ1bnMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1blNlbGVjdGlvblN0YXRlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGUiLHZhbHVlOmJkLmdldE9iamVjdEluaXRpYWxpemVyKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pfSxyZWdleElucHV0Ont0eXBlOlN0cmluZyx2YWx1ZTpiZC5nZXRTdHJpbmdJbml0aWFsaXplcigicmVnZXhJbnB1dCIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJfcmVnZXhPYnNlcnZlciJ9LHNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHJ1bnM6QXJyYXksZGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jbGlwcGVkRGF0YUxvY2F0aW9uOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENsaXBwZWREYXRhTG9jYXRpb24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCkifSxfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aDp7dHlwZTpOdW1iZXIsCnZhbHVlOjI1MCxyZWFkT25seTohMH0sX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm46e3R5cGU6U3RyaW5nLHZhbHVlOiJbL1x4M2RfLC1dIixyZWFkT25seTohMH0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjp0ZC5ydW5zQ29sb3JTY2FsZX19fSxhdHRhY2hlZCgpe3RoaXMuX3J1blN0b3JlTGlzdGVuZXI9ZGMucnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoInJ1bnMiLGRjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpfSk7dGhpcy5zZXQoInJ1bnMiLGRjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3RoaXMuX2VudlN0b3JlTGlzdGVuZXI9ZGMuZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuc2V0KCJkYXRhTG9jYXRpb24iLGRjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCkpfSk7dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsZGMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9LGRldGFjaGVkKCl7ZGMucnVuc1N0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lcik7CmRjLmVudmlyb25tZW50U3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9lbnZTdG9yZUxpc3RlbmVyKX0sX3RvZ2dsZUFsbDpmdW5jdGlvbigpe3RoaXMuJC5tdWx0aUNoZWNrYm94LnRvZ2dsZUFsbCgpfSxfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbjpmdW5jdGlvbihiLGQpe2lmKHZvaWQgMCE9PWIpcmV0dXJuIGIubGVuZ3RoPmQ/Yi5zdWJzdHJpbmcoMCxkKTpifSxfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZzpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy4kJCgiI2RhdGEtbG9jYXRpb24tZGlhbG9nIikub3BlbigpfSxfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihiLGQpe3JldHVybiBiJiZiLmxlbmd0aD5kfSxfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZTpiZC5nZXRPYmplY3RPYnNlcnZlcigicnVuU2VsZWN0aW9uU3RhdGUiLHtkZWZhdWx0VmFsdWU6e319KSxfcmVnZXhPYnNlcnZlcjpiZC5nZXRTdHJpbmdPYnNlcnZlcigicmVnZXhJbnB1dCIsCntkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1saXRlLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNwaW5uZXItbGl0ZSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyU3Bpbm5lckJlaGF2aW9yXX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtdG9vbHRpcC5qcwp2YXIgc2c7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aC5BVVRPPSJhdXRvIjtoLkJPVFRPTT0iYm90dG9tIjtoLlJJR0hUPSJyaWdodCJ9KShkPWIuVG9vbHRpcFBvc2l0aW9ufHwoYi5Ub29sdGlwUG9zaXRpb249e30pKTtjb25zdCBmPXtib3hTaGFkb3c6IjAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIC4zKSIsb3BhY2l0eTowLHBvc2l0aW9uOiJmaXhlZCIsd2lsbENoYW5nZToidHJhbnNmb3JtIix6SW5kZXg6NX07UG9seW1lcih7aXM6InZ6LWNoYXJ0LXRvb2x0aXAiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2NvbnRlbnRDb21wb25lbnROYW1lOlN0cmluZyxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ZC5BVVRPfSxtaW5EaXN0RnJvbUVkZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjE1fX0scmVhZHkoKXt0aGlzLl90dW5uZWw9dGhpcy5fcmFmPXRoaXMuX3N0eWxlQ2FjaGU9bnVsbH0sYXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCk7dGhpcy5faGlkZU9uQmx1cj0KKCk9Pntkb2N1bWVudC5oaWRkZW4mJnRoaXMuaGlkZSgpfTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGRldGFjaGVkKCl7dGhpcy5oaWRlKCk7dGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7dGhpcy5fdHVubmVsPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxjb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fSxoaWRlKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fc3R5bGVDYWNoZT1udWxsO3RoaXMuX3R1bm5lbC5zdHlsZS5vcGFjaXR5PTB9LHVwZGF0ZUFuZFBvc2l0aW9uKGgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9yZXBvc2l0aW9uSW1wbChoKX0pfSwKX3JlcG9zaXRpb25JbXBsKGgpe2NvbnN0IGs9dGhpcy5fdHVubmVsO2g9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCByPWsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD13aW5kb3cuaW5uZXJIZWlnaHQscD1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLG09aC50b3Asbj1tK2guaGVpZ2h0LHE9ci5oZWlnaHQrc2YuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDtsZXQgdT1udWxsLHc9TWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsaC5sZWZ0KSxBPW51bGwseT1tO3RoaXMucG9zaXRpb249PWQuUklHSFQ/dz1oLnJpZ2h0Oih5PW4rc2YuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCxwPHcrci53aWR0aCt0aGlzLm1pbkRpc3RGcm9tRWRnZSYmKHc9bnVsbCxBPXRoaXMubWluRGlzdEZyb21FZGdlKSk7dGhpcy5wb3NpdGlvbj09ZC5BVVRPJiYwPGgudG9wLXEmJmw8aC50b3AraC5oZWlnaHQrcSYmKHk9bnVsbCx1PWwtbStzZi5UT09MVElQX1lfUElYRUxfT0ZGU0VUKTtoPXtjb250YWluOiJjb250ZW50IiwKb3BhY2l0eToxLGxlZnQ6dz9gJHt3fXB4YDpudWxsLHJpZ2h0OkE/YCR7QX1weGA6bnVsbCx0b3A6eT9gJHt5fXB4YDpudWxsLGJvdHRvbTp1P2Ake3V9cHhgOm51bGx9O18uaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLGgpfHwoT2JqZWN0LmFzc2lnbihrLnN0eWxlLGgpLHRoaXMuX3N0eWxlQ2FjaGU9aCl9LF9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO09iamVjdC5hc3NpZ24oaC5zdHlsZSxmKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3JldHVybiBofSxfcmVtb3ZlVHVubmVsKGgpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaCl9fSl9KShzZ3x8KHNnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdGYtc2NhbGUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuUXVhbnRpdGF0aXZlU2NhbGV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITF9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihmKXt0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPWZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtjb25zdCBmPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGYpfX1iLlRmU2NhbGU9ZH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lYXItc2NhbGUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5faWdub3JlT3V0bGllcj0hMTt0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfV9uaWNlRG9tYWluKGYsaCl7Y29uc3QgW2sscl09ZixsPXItaztmPTA9PT1sPzEuMSpNYXRoLmFicyhrKSsxLjE6bCp0aGlzLnBhZFByb3BvcnRpb24oKTtyZXR1cm4gc3VwZXIuX25pY2VEb21haW4oWzA8PWsmJms8bD8tLjEqcjprLWYscitmXSxoKX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGYpe2Y9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoZik7bGV0IGg9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1mLmxlbmd0aCYmKGY9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihmLGhbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChmLGhbMV0pXSxoPXRoaXMuX25pY2VEb21haW4oZikpOwpyZXR1cm4gaH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtjb25zdCBmPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGYpfWV4dGVudE9mVmFsdWVzKGYpe3ZhciBoPWY9Zi5maWx0ZXIoaz0+UGxvdHRhYmxlLlV0aWxzLk1hdGguaXNWYWxpZE51bWJlcihrKSk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2g9Zi5zb3J0KChsLHApPT5sLXApO2NvbnN0IGs9ZDMucXVhbnRpbGUoaCwuMDUpLHI9ZDMucXVhbnRpbGUoaCwuOTUpO2g9Zi5maWx0ZXIobD0+bD49ayYmbDw9cil9Zj1kMy5leHRlbnQoaCk7cmV0dXJuIG51bGw9PWZbMF18fG51bGw9PWZbMV0/W106Zn1pZ25vcmVPdXRsaWVyKGYpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGY/KHRoaXMuX2lnbm9yZU91dGxpZXI9Zix0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfX1iLkxpbmVhclNjYWxlPWR9KSh1Z3x8KHVnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbG9nLXNjYWxlLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGspe3JldHVybiBNYXRoLmxvZzEwKGspfWZ1bmN0aW9uIGYoayl7cmV0dXJuIE1hdGgucG93KDEwLGspfWIuTUlOX1BPU0lUSVZFX1ZBTFVFPU1hdGgucG93KDIsLTEwNzQpO2NsYXNzIGggZXh0ZW5kcyBiLlRmU2NhbGV7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2QzTG9nU2NhbGU9ZDMuc2NhbGVMb2coKTt0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNjYWxlKGspe3JldHVybiAwPj1rP05hTjp0aGlzLl9kM0xvZ1NjYWxlKGspfWludmVydChrKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5pbnZlcnQoayl9c2NhbGVUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5zY2FsZShrKX1pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKGspe3JldHVybiB0aGlzLmludmVydChrKX1nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpe3JldHVybiB0aGlzLmRvbWFpbigpfXNldFRyYW5zZm9ybWF0aW9uRG9tYWluKGspe3RoaXMuZG9tYWluKGspfWdldFRyYW5zZm9ybWF0aW9uRXh0ZW50KCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oayl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0Kaztjb25zdCBbcixsXT1rO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGIuTUlOX1BPU0lUSVZFX1ZBTFVFLHIpLGxdKX1fbmljZURvbWFpbihrKXtjb25zdCBbcixsXT1rO2s9TWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksZChyKSk7Y29uc3QgcD1kKGwpO3ZhciBtPXAtazttPW0/bSp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltmKE1hdGgubWF4KGQoYi5NSU5fUE9TSVRJVkVfVkFMVUUpLGstbSkpLGYocCttKV19X2dldFVuYm91bmRlZEV4dGVudChrKXtrPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGspO2xldCByPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09ay5sZW5ndGgmJihrPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oayxyWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoayxyWzFdKV0scj10aGlzLl9uaWNlRG9tYWluKGspKTtyZXR1cm4gcn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGs9PgowPGs/azpiLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGspO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGspe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2Uoayl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoayl7bGV0IHI9az1rLmZpbHRlcihsPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGwpJiYwPGwpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtrPWsubWFwKGQpLnNvcnQoKG0sbik9Pm0tbik7Y29uc3QgbD1kMy5xdWFudGlsZShrLC4wNSkscD1kMy5xdWFudGlsZShrLAouOTUpO3I9ay5maWx0ZXIobT0+bT49bCYmbTw9cCkubWFwKGYpfWs9ZDMuZXh0ZW50KHIpO3JldHVybiBudWxsPT1rWzBdfHxudWxsPT1rWzFdP1tdOmt9fWIuTG9nU2NhbGU9aH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7a1trLlRFWFQ9MF09IlRFWFQiO2tbay5ET009MV09IkRPTSJ9KShkfHwoZD17fSkpO2xldCBmOyhmdW5jdGlvbihrKXtrLkxPRz0ibG9nIjtrLkxJTkVBUj0ibGluZWFyIn0pKGZ8fChmPXt9KSk7Y2xhc3MgaHtjb25zdHJ1Y3RvcihrLHIsbCxwLG0sbixxLHUsdyxBLHkpe3RoaXMuZGlydHlEYXRhc2V0cz1uZXcgU2V0O3RoaXMuc2VyaWVzTmFtZXM9W107dGhpcy5uYW1lMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1wO3RoaXMudG9vbHRpcD1tO3RoaXMuZGF0YXNldHM9W107dGhpcy5faWdub3JlWU91dGxpZXJzPSExO3RoaXMubGFzdFBvaW50c0RhdGFzZXQ9bmV3IFBsb3R0YWJsZS5EYXRhc2V0O3RoaXMubmFuRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy55VmFsdWVBY2Nlc3Nvcj1yO3RoaXMuc3ltYm9sRnVuY3Rpb249QTt0aGlzLl9kZWZhdWx0WFJhbmdlPXU7dGhpcy5fZGVmYXVsdFlSYW5nZT13Owp0aGlzLnRvb2x0aXBDb2x1bW5zPW47dGhpcy5idWlsZENoYXJ0KGssbCxxLHkpfWJ1aWxkQ2hhcnQoayxyLGwscCl7dGhpcy5kZXN0cm95KCk7az1rKCk7dGhpcy54QWNjZXNzb3I9ay5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1rLnNjYWxlO3RoaXMueEF4aXM9ay5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7cCYmdGhpcy54QXhpcy5mb3JtYXR0ZXIocCk7dGhpcy55U2NhbGU9aC5nZXRZU2NhbGVGcm9tVHlwZShyKTt0aGlzLnlTY2FsZS5zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKCgpPT50aGlzLmdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpKTt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7cD1zZi5tdWx0aXNjYWxlRm9ybWF0dGVyKHNmLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihwKTsKdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO3RoaXMuZmlsbEFyZWE9bDtwPW5ldyBiLlBhblpvb21EcmFnTGF5ZXIodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsKCk9PnRoaXMucmVzZXREb21haW4oKSk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb249dGhpcy5jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocCk7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50PW5ldyBQbG90dGFibGUuQ29tcG9uZW50O2w9dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsbCk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7az1udWxsO3IhPT1mLkxPRyYmKGs9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJob3Jpem9udGFsIiksay5zY2FsZSh0aGlzLnlTY2FsZSkudmFsdWUoMCkpO3I9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJ2ZXJ0aWNhbCIpOwpyLnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGsscixsLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudCxwXSk7dGhpcy5jZW50ZXIuYWRkQ2xhc3MoIm1haW4iKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGsscixsKXtsJiYodGhpcy5tYXJnaW5BcmVhUGxvdD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLGspLHRoaXMubWFyZ2luQXJlYVBsb3QueShsLmhpZ2hlckFjY2Vzc29yLHIpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAobC5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLChxLHUsdyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh3Lm1ldGFkYXRhKCkubmFtZSkpLAp0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigic3Ryb2tlLXdpZHRoIiwwKSk7dGhpcy5zbW9vdGhlZEFjY2Vzc29yPXE9PnEuc21vb3RoZWQ7bD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7bC54KHRoaXMueEFjY2Vzc29yLGspO2wueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHIpO2wuYXR0cigic3Ryb2tlIiwocSx1LHcpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUody5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLmxpbmVQbG90PWw7dGhpcy5zZXR1cFRvb2x0aXBzKGwpO2xldCBwPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtwLngodGhpcy54QWNjZXNzb3Isayk7cC55KHRoaXMuc21vb3RoZWRBY2Nlc3NvcixyKTtwLmF0dHIoInN0cm9rZSIsKHEsdSx3KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHcubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5zbW9vdGhMaW5lUGxvdD1wO2lmKHRoaXMuc3ltYm9sRnVuY3Rpb24pe3ZhciBtPQpuZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHIpO20uYXR0cigiZmlsbCIsKHEsdSx3KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHcubWV0YWRhdGEoKS5uYW1lKSk7bS5hdHRyKCJvcGFjaXR5IiwxKTttLnNpemUoMipzZi5UT09MVElQX0NJUkNMRV9TSVpFKTttLnN5bWJvbCgocSx1LHcpPT50aGlzLnN5bWJvbEZ1bmN0aW9uKHcubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9bX1tPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjttLngodGhpcy54QWNjZXNzb3Isayk7bS55KHRoaXMueVZhbHVlQWNjZXNzb3Iscik7bS5hdHRyKCJmaWxsIixxPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUocS5uYW1lKSk7bS5hdHRyKCJvcGFjaXR5IiwxKTttLnNpemUoMipzZi5UT09MVElQX0NJUkNMRV9TSVpFKTttLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSk7dGhpcy5zY2F0dGVyUGxvdD0KbTtsZXQgbj1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bi54KHRoaXMueEFjY2Vzc29yLGspO24ueShxPT5xLmRpc3BsYXlZLHIpO24uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO24uYXR0cigib3BhY2l0eSIsMSk7bi5zaXplKDIqc2YuTkFOX1NZTUJPTF9TSVpFKTtuLmRhdGFzZXRzKFt0aGlzLm5hbkRhdGFzZXRdKTtuLnN5bWJvbChQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlKTt0aGlzLm5hbkRpc3BsYXk9bjtrPVtuLG0scCxsXTt0aGlzLm1hcmdpbkFyZWFQbG90JiZrLnB1c2godGhpcy5tYXJnaW5BcmVhUGxvdCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJmsucHVzaCh0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCk7cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChrKX1pZ25vcmVZT3V0bGllcnMoayl7ayE9PXRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksCnRoaXMueVNjYWxlLmlnbm9yZU91dGxpZXIoayksdGhpcy5yZXNldFlEb21haW4oKSl9Z2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCl7Y29uc3Qgaz10aGlzLmdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpO3JldHVybiBfLmZsYXR0ZW5EZWVwKHRoaXMuZGF0YXNldHMubWFwKHI9PmsubWFwKGw9PnIuZGF0YSgpLm1hcChwPT5sKHAsLTEscikpKSkpLmZpbHRlcihpc0Zpbml0ZSl9dXBkYXRlU3BlY2lhbERhdGFzZXRzKCl7Y29uc3Qgaz10aGlzLmdldFlBeGlzQWNjZXNzb3IoKTt2YXIgcj10aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLmZpbHRlcihuPT4haXNOYU4oayhuLC0xLGwpKSk7MDxtLmxlbmd0aCYmKHA9bVttLmxlbmd0aC0xXSxwLm5hbWU9bC5tZXRhZGF0YSgpLm5hbWUscC5yZWxhdGl2ZT1zZi5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YShyKTsKdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7cj1fLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAobD0+e2xldCBwPW51bGwsbT1sLmRhdGEoKSxuPTA7Zm9yKDtuPG0ubGVuZ3RoJiZudWxsPT1wOylpc05hTihrKG1bbl0sLTEsbCkpfHwocD1rKG1bbl0sLTEsbCkpLG4rKztudWxsPT1wJiYocD0wKTtsZXQgcT1bXTtmb3Iobj0wO248bS5sZW5ndGg7bisrKWlzTmFOKGsobVtuXSwtMSxsKSk/KG1bbl0ubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxtW25dLmRpc3BsYXlZPXAsbVtuXS5yZWxhdGl2ZT1zZi5yZWxhdGl2ZUFjY2Vzc29yKG1bbl0sLTEsbCkscS5wdXNoKG1bbl0pKTpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YShyKX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT0KdGhpcy5fZGVmYXVsdFhSYW5nZSl2YXIgaz10aGlzLl9kZWZhdWx0WFJhbmdlO2Vsc2Ugaz10aGlzLnhTY2FsZSxrLl9kb21haW5NaW49bnVsbCxrLl9kb21haW5NYXg9bnVsbCxrPWsuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlLmRvbWFpbihrKX1yZXNldFlEb21haW4oKXtudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlP3RoaXMueVNjYWxlLmRvbWFpbih0aGlzLl9kZWZhdWx0WVJhbmdlKToodGhpcy55U2NhbGUuYXV0b0RvbWFpbigpLHRoaXMueVNjYWxlLmRvbWFpbih0aGlzLnlTY2FsZS5kb21haW4oKSkpfWdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpe2NvbnN0IGs9W3RoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpXTt0aGlzLmZpbGxBcmVhJiZrLnB1c2godGhpcy5maWxsQXJlYS5sb3dlckFjY2Vzc29yLHRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcjoKdGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24oayl7Y29uc3Qgcj1uZXcgc2YuUG9pbnRlckludGVyYWN0aW9uLGw9KCk9PntyLmVuYWJsZWQoITEpO3RoaXMuaGlkZVRvb2x0aXBzKCl9LHA9KCk9PnIuZW5hYmxlZCghMCk7ay5vblBhblN0YXJ0KGwpO2sub25EcmFnWm9vbVN0YXJ0KGwpO2sub25QYW5FbmQocCk7ay5vbkRyYWdab29tRW5kKHApO2sub25TY3JvbGxab29tKCgpPT50aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uKSk7ci5vblBvaW50ZXJNb3ZlKG09Pnt0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj1tO3RoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQobSl9KTtyLm9uUG9pbnRlckV4aXQoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpO3JldHVybiByfXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSwKdGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntsZXQgcj17eDprLngseTprLnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LGw9dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCk7dmFyIHA9dGhpcy5saW5lUGxvdC5kYXRhc2V0cygpLm1hcCh1PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQocix1KSkuZmlsdGVyKEJvb2xlYW4pO2xldCBtPVBsb3R0YWJsZS5VdGlscy5ET00uaW50ZXJzZWN0c0JCb3gsbj1wLmZpbHRlcih1PT5tKHUueCx1LnksbCl8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwwLHUuZGF0YXNldCkpKSxxPW4uZmlsdGVyKHU9PiFpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHUuZGF0dW0sMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLAp1PT51LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSxwLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJwb2ludCIsITApLHAuYXR0cigiciIsc2YuVE9PTFRJUF9DSVJDTEVfU0laRSkuYXR0cigiY3giLHU9PnUueCkuYXR0cigiY3kiLHU9PnUueSkuc3R5bGUoInN0cm9rZSIsIm5vbmUiKS5hdHRyKCJmaWxsIix1PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpLHAuZXhpdCgpLnJlbW92ZSgpLHRoaXMuZHJhd1Rvb2x0aXBzKG4scix0aGlzLnRvb2x0aXBDb2x1bW5zKSk6dGhpcy5oaWRlVG9vbHRpcHMoKX0pKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKTt0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+Cnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMSl9KTtrLm9uQW5jaG9yKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8oayk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KX1kcmF3VG9vbHRpcHMoayxyLGwpe2lmKGsubGVuZ3RoKXt2YXIgcD10aGlzLmNvbG9yU2NhbGU7bD1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpkLkRPTSxldmFsdWF0ZSh5KXtkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgpPT5wLnNjYWxlKHkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTtyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwKLi4ubF07dmFyIG09eT0+TWF0aC5wb3coeS54LXIueCwyKStNYXRoLnBvdyh5Lnktci55LDIpLG49Xy5taW4oay5tYXAobSkpLHE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO2s9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP18uc29ydEJ5KGsseT0+cSh5LmRhdHVtLC0xLHkuZGF0YXNldCkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSkucmV2ZXJzZSgpOiJuZWFyZXN0Ij09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoayxtKTprLnNsaWNlKDApLnJldmVyc2UoKTt2YXIgdT10aGlzLHc9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXcuc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7CkEuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCh5PT55LnRpdGxlKS5ub2RlcygpO0EuZXhpdCgpLnJlbW92ZSgpO2s9dy5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoayx5PT55LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTtrLmNsYXNzZWQoImRpc3RhbnQiLHk9Pnt2YXIgeD15LmRhdGFzZXQuZGF0YSgpWzBdLEM9Xy5sYXN0KHkuZGF0YXNldC5kYXRhKCkpO3g9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoeCwwLHkuZGF0YXNldCkpO0M9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoQywwLHkuZGF0YXNldCkpO3k9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3kuZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih5LmRhdHVtLDAseS5kYXRhc2V0KTtyZXR1cm4gci54PHh8fHIueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcywKbCx5KX0pLm9yZGVyKCk7ay5leGl0KCkucmVtb3ZlKCk7ay5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkubm9kZXMoKTt0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1lbHNlIHRoaXMudG9vbHRpcC5oaWRlKCl9ZHJhd1Rvb2x0aXBSb3coayxyLGwpe2NvbnN0IHA9dGhpcztrPWQzLnNlbGVjdChrKS5zZWxlY3RBbGwoInRkIikuZGF0YShyKTtrLmVhY2goZnVuY3Rpb24obSl7bS5zdGF0aWN8fHAuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChwLHRoaXMsbSxsKX0pO2suZXhpdCgpLnJlbW92ZSgpO2suZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaChmdW5jdGlvbihtKXttLmVudGVyJiZtLmVudGVyLmNhbGwodGhpcyxsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHIsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7CnIuZXZhbFR5cGU9PWQuRE9NP3IuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pOmQzLnNlbGVjdChrKS50ZXh0KHIuZXZhbHVhdGUuY2FsbChrLGwse3Ntb290aGluZ0VuYWJsZWQ6cH0pKX1maW5kQ2xvc2VzdFBvaW50KGsscil7Y29uc3QgbD1yLmRhdGEoKS5tYXAoKG4scSk9PnRoaXMueFNjYWxlLnNjYWxlKHRoaXMueEFjY2Vzc29yKG4scSxyKSkpO2xldCBwPV8uc29ydGVkSW5kZXgobCxrLngpO2lmKDA9PWwubGVuZ3RoKXJldHVybiBudWxsO3A9PT1sLmxlbmd0aD8tLXA6MCE9PXAmJihwPU1hdGguYWJzKGxbcC0xXS1rLngpPE1hdGguYWJzKGxbcF0tay54KT9wLTE6cCk7az1yLmRhdGEoKVtwXTtjb25zdCBtPXRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3IoayxwLHIpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHIpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6cn19cmVzbW9vdGhEYXRhc2V0KGspe2xldCByPQprLmRhdGEoKTtjb25zdCBsPXRoaXMuc21vb3RoaW5nV2VpZ2h0O2xldCBwPTA8ci5sZW5ndGg/MDpOYU4sbT0wO2NvbnN0IG49ci5tYXAoKHUsdyk9PnRoaXMueVZhbHVlQWNjZXNzb3IodSx3LGspKSxxPW4uZXZlcnkodT0+dT09blswXSk7ci5mb3JFYWNoKCh1LHcpPT57dz1uW3ddO3F8fCFOdW1iZXIuaXNGaW5pdGUodyk/dS5zbW9vdGhlZD13OihwPXAqbCsoMS1sKSp3LG0rKyx3PTEsMSE9PWwmJih3PTEtTWF0aC5wb3cobCxtKSksdS5zbW9vdGhlZD1wL3cpfSl9Z2V0RGF0YXNldChrKXt2b2lkIDA9PT10aGlzLm5hbWUyZGF0YXNldHNba10mJih0aGlzLm5hbWUyZGF0YXNldHNba109bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtuYW1lOmssbWV0YTpudWxsfSkpO3JldHVybiB0aGlzLm5hbWUyZGF0YXNldHNba119c3RhdGljIGdldFlTY2FsZUZyb21UeXBlKGspe2lmKGs9PT1mLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTsKdGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCB5U2NhbGUgdHlwZSAiK2spO31zZXRWaXNpYmxlU2VyaWVzKGspe3RoaXMuZGlzYWJsZUNoYW5nZXMoKTtrPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuc2VyaWVzTmFtZXM9a31kaXNhYmxlQ2hhbmdlcygpe3RoaXMuZGlydHlEYXRhc2V0cy5zaXplfHwodGhpcy5saW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5zbW9vdGhMaW5lUGxvdCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyhbXSkpfWNvbW1pdENoYW5nZXMoKXt0aGlzLmRhdGFzZXRzPXRoaXMuc2VyaWVzTmFtZXMubWFwKGs9PnRoaXMuZ2V0RGF0YXNldChrKSk7Wy4uLnRoaXMuZGlydHlEYXRhc2V0c10uZm9yRWFjaChrPT57dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldCh0aGlzLmdldERhdGFzZXQoaykpfSk7dGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKTsKdGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKTt0aGlzLmRpcnR5RGF0YXNldHMuY2xlYXIoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3Qgcj1rLmRhdGEoKTtpZigyMD49ci5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwoci5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcihyLmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT1yW25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayxyKXt0aGlzLmRpc2FibGVDaGFuZ2VzKCk7CnRoaXMuZ2V0RGF0YXNldChrKS5kYXRhKHIpO3RoaXMuZGlydHlEYXRhc2V0cy5hZGQoayl9c2V0U2VyaWVzTWV0YWRhdGEoayxyKXt0aGlzLmRpc2FibGVDaGFuZ2VzKCk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKE9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKCkse21ldGE6cn0pKTt0aGlzLmRpcnR5RGF0YXNldHMuYWRkKGspfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD1rO3RoaXMuZGF0YXNldHMuZm9yRWFjaChyPT50aGlzLnJlc21vb3RoRGF0YXNldChyKSk7dGhpcy5zbW9vdGhpbmdFbmFibGVkfHwodGhpcy5saW5lUGxvdC5hZGRDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITAsdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJgp0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpfXNldENvbG9yU2NhbGUoayl7dGhpcy5jb2xvclNjYWxlPWt9c2V0VG9vbHRpcENvbHVtbnMoayl7dGhpcy50b29sdGlwQ29sdW1ucz1rfXNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKGspe3RoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q9Cmt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTt0aGlzLm91dGVyLnJlZHJhdygpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pgp7dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDpyfT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazxyJiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKX1vbkFuY2hvcihrKXtpZih0aGlzLm91dGVyKXRoaXMub3V0ZXIub25BbmNob3Ioayl9aXNEYXRhRml0VG9Eb21haW4oKXtmdW5jdGlvbiBrKHIpe2NvbnN0IGw9CnIuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyPXIuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKTtyZXR1cm4gclswXT09PWxbMF0mJnJbMV09PT1sWzFdfXJldHVybiBrKHRoaXMueEF4aXMuZ2V0U2NhbGUoKSkmJmsodGhpcy55QXhpcy5nZXRTY2FsZSgpKX19Yi5MaW5lQ2hhcnQ9aH0pKHVnfHwodWc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi92ei1saW5lLWNoYXJ0Mi5qcwooZnVuY3Rpb24oYil7Y29uc3QgZD1zZi5tdWx0aXNjYWxlRm9ybWF0dGVyKHNmLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxmPWg9PmlzTmFOKGgpPyJOYU4iOmQoaCk7Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpoPT5oLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZShoLGspe3JldHVybiBmKGsuc21vb3RoaW5nRW5hYmxlZD9oLmRhdHVtLnNtb290aGVkOmguZGF0dW0uc2NhbGFyKX19LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmg9PmYoaC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmg9PnNmLnN0ZXBGb3JtYXR0ZXIoaC5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIixldmFsdWF0ZTpoPT5zZi50aW1lRm9ybWF0dGVyKGguZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6aD0+c2YucmVsYXRpdmVGb3JtYXR0ZXIoc2YucmVsYXRpdmVBY2Nlc3NvcihoLmRhdHVtLAotMSxoLmRhdGFzZXQpKX1dO1BvbHltZXIoe2lzOiJ2ei1saW5lLWNoYXJ0MiIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sc3ltYm9sRnVuY3Rpb246T2JqZWN0LHNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNtb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjZ9LHhUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LHhBeGlzRm9ybWF0dGVyOk9iamVjdCx5VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pmg9Pmguc2NhbGFyfSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+Yi5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OU30sZmlsbEFyZWE6T2JqZWN0LApkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXkseVNjYWxlVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImxpbmVhciJ9LGlnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0b29sdGlwU29ydGluZ01ldGhvZDp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSx0b29sdGlwUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOnNnLlRvb2x0aXBQb3NpdGlvbi5CT1RUT019LF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfc2VyaWVzTWV0YWRhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6Il9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCBpc0F0dGFjaGVkKTtfY29sb3JTY2FsZUNoYW5nZWQoY29sb3JTY2FsZSk7X3Rvb2x0aXBDb2x1bW5zQ2hhbmdlZCh0b29sdGlwQ29sdW1ucyk7X3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpO19zbW9vdGhpbmdDaGFuZ2VkKHNtb290aGluZ0VuYWJsZWQsIHNtb290aGluZ1dlaWdodCwgX2NoYXJ0KTtfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkKHRvb2x0aXBTb3J0aW5nTWV0aG9kLCBfY2hhcnQpO19vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIi5zcGxpdCgiOyIpLApyZWFkeSgpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LGF0dGFjaGVkKCl7Y29uc3QgaD17Y2FwdHVyZTohMCxwYXNzaXZlOiEwfTt0aGlzLl9saXN0ZW4odGhpcywibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlRG93bi5iaW5kKHRoaXMpLGgpO3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZXVwIix0aGlzLl9vbk1vdXNlVXAuYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4od2luZG93LCJrZXlkb3duIix0aGlzLl9vbktleURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4od2luZG93LCJrZXl1cCIsdGhpcy5fb25LZXlVcC5iaW5kKHRoaXMpLGgpfSxkZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSx0aGlzLl9jaGFydD12b2lkIDApO3RoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh7bm9kZTpoLGV2ZW50TmFtZTprLApmdW5jOnIsb3B0aW9uOmx9KT0+e2gucmVtb3ZlRXZlbnRMaXN0ZW5lcihrLHIsbCl9KSx0aGlzLl9saXN0ZW5lcnMuY2xlYXIoKSl9LF9saXN0ZW4oaCxrLHIsbD17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpO3RoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6aCxldmVudE5hbWU6ayxmdW5jOnIsb3B0aW9uOmx9KTtoLmFkZEV2ZW50TGlzdGVuZXIoayxyLGwpfSxfb25LZXlEb3duKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsYi5QYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGgpKX0sX29uS2V5VXAoaCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixiLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoaCkpfSxfb25Nb3VzZURvd24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCEwKX0sX29uTW91c2VVcCgpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITEpfSxpc0RhdGFGaXRUb0RvbWFpbigpe3JldHVybiB0aGlzLl9jaGFydD8KdGhpcy5fY2hhcnQuaXNEYXRhRml0VG9Eb21haW4oKTohMH0sc2V0VmlzaWJsZVNlcmllczpmdW5jdGlvbihoKXtfLmlzRXF1YWwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLGgpfHwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWgpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGgsayl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2hdPWs7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoaCxrKX0sc2V0U2VyaWVzTWV0YWRhdGEoaCxrKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdPWs7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKGgsayl9LGNvbW1pdENoYW5nZXMoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVkcmF3KCl9LApfbWFrZUNoYXJ0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDt2YXIgaD10aGlzLnhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q7dGhpcy54VHlwZXx8aD90aGlzLnhUeXBlJiYoaD0oKT0+c2YuZ2V0WENvbXBvbmVudHModGhpcy54VHlwZSkpOmg9c2Yuc3RlcFg7aWYoaCYmdGhpcy55VmFsdWVBY2Nlc3NvciYmdGhpcy50b29sdGlwQ29sdW1ucyl7aD1uZXcgYi5MaW5lQ2hhcnQoaCx0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlVHlwZSx0aGlzLmNvbG9yU2NhbGUsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucywKdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLHRoaXMuc3ltYm9sRnVuY3Rpb24sdGhpcy54QXhpc0Zvcm1hdHRlcik7dmFyIGs9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7aC5yZW5kZXJUbyhrKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PWg7dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksCnRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSx0aGlzLl9jaGFydC5jb21taXRDaGFuZ2VzKCkpfSxfc21vb3RoaW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX0sX291dGxpZXJzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpfSxfY29sb3JTY2FsZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldENvbG9yU2NhbGUodGhpcy5jb2xvclNjYWxlKSx0aGlzLl9jaGFydC5yZWRyYXcoKSl9LF90b29sdGlwQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcENvbHVtbnModGhpcy50b29sdGlwQ29sdW1ucyl9LApfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QpfSxnZXRFeHBvcnRlcigpe3JldHVybiBuZXcgYi5MaW5lQ2hhcnRFeHBvcnRlcih0aGlzLiQuY2hhcnRkaXYpfX0pfSkodWd8fCh1Zz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LWV4cG9ydGVyLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oayl7ay5HUk9VUD0iRyI7ay5ESVY9IkRJViI7ay5TVkc9IlNWRyI7ay5URVhUPSJURVhUIn0pKGR8fChkPXt9KSk7Y2xhc3MgZntjb25zdHJ1Y3RvcihrKXt0aGlzLnVuaXF1ZUlkPTA7dGhpcy5yb290PWt9ZXhwb3J0QXNTdHJpbmcoKXtjb25zdCBrPXRoaXMuY29udmVydCh0aGlzLnJvb3QpO2lmKCFrKXJldHVybiIiO2NvbnN0IHI9dGhpcy5jcmVhdGVSb290U3ZnKCk7ci5hcHBlbmRDaGlsZChrKTtyZXR1cm4gci5vdXRlckhUTUx9Y3JlYXRlVW5pcXVlSWQoKXtyZXR1cm5gJHsiY2xpcCJ9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIikscj10aGlzLmdldFNpemUoKTtrLnNldEF0dHJpYnV0ZU5TKCJzdmciLCJ2aWV3Qm94IixgMCAwICR7ci53aWR0aH0gJHtyLmhlaWdodH1gKTsKay5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKTtyZXR1cm4ga31jb252ZXJ0KGspe2xldCByPW51bGw7dmFyIGw9ay5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGsubm9kZVR5cGUhPU5vZGUuRUxFTUVOVF9OT0RFfHxsIT1kLkRJViYmbCE9ZC5TVkcpcj1rLmNsb25lTm9kZSgpO2Vsc2V7cj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQuR1JPVVApO3ZhciBwPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGspLG09cGFyc2VJbnQocC5sZWZ0LDEwKSxuPXBhcnNlSW50KHAudG9wLDEwKTtpZihtfHxuKWw9dGhpcy5jcmVhdGVVbmlxdWVJZCgpLHIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHttfSwgJHtufSlgKSxyLnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIixgdXJsKCMke2x9KWApLG49cGFyc2VJbnQocC5oZWlnaHQsMTApLG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpLG0uc2V0QXR0cmlidXRlKCJ3aWR0aCIsClN0cmluZyhwYXJzZUludChwLndpZHRoLDEwKSkpLG0uc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhuKSkscD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoInN2ZyIsImNsaXBQYXRoIikscC5pZD1sLHAuYXBwZW5kQ2hpbGQobSksci5hcHBlbmRDaGlsZChwKX1BcnJheS5mcm9tKGsuY2hpbGROb2RlcykubWFwKHE9PnRoaXMuY29udmVydChxKSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2gocT0+ci5hcHBlbmRDaGlsZChxKSk7cmV0dXJuIHIubm9kZU5hbWUudG9VcHBlckNhc2UoKT09ZC5HUk9VUCYmIXIuaGFzQ2hpbGROb2RlcygpfHx0aGlzLnNob3VsZE9taXROb2RlKGspP251bGw6dGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShrLHIpKX1zdHJpcENsYXNzKGspe2subm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZrLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtyZXR1cm4ga310cmFuc2ZlclN0eWxlKGsscil7aWYoci5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHI7CmNvbnN0IGw9ci5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2s9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayk7bD09ZC5URVhUJiZPYmplY3QuYXNzaWduKHIuc3R5bGUse2ZvbnRGYW1pbHk6ay5mb250RmFtaWx5LGZvbnRTaXplOmsuZm9udFNpemUsZm9udFdlaWdodDprLmZvbnRXZWlnaHR9KTtsIT1kLkdST1VQJiYoci5zZXRBdHRyaWJ1dGUoImZpbGwiLGsuZmlsbCksci5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsay5zdHJva2UpLHIuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGsuc3Ryb2tlV2lkdGgpKTsiMSIhPWsub3BhY2l0eSYmci5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLGsub3BhY2l0eSk7cmV0dXJuIHJ9c2hvdWxkT21pdE5vZGUoKXtyZXR1cm4hMX19Yi5QbG90dGFibGVFeHBvcnRlcj1mO2NsYXNzIGggZXh0ZW5kcyBme3Nob3VsZE9taXROb2RlKGspe3JldHVybiBrLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERT9rLmNsYXNzTGlzdC5jb250YWlucygic2NhdHRlci1wbG90Iik6CiExfX1iLkxpbmVDaGFydEV4cG9ydGVyPWh9KSh1Z3x8KHVnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj1bXSxkPWZ1bmN0aW9uKCl7cmV0dXJuIF8udGhyb3R0bGUoZnVuY3Rpb24gaCgpe2lmKDAhPWIubGVuZ3RoKXt2YXIgaz1iLnNoaWZ0KCk7ay5hY3RpdmUmJihrLnJlZHJhdygpLGsuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExKTt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoMCk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShoKX19LDEwMCl9KCk7UG9seW1lcih7aXM6InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiLHByb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0sZGF0YVNlcmllczpBcnJheSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsbG9nU2NhbGVBY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvZ1NjYWxlQ2hhbmdlZCJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6T2JqZWN0LHhUeXBlOlN0cmluZyx5VmFsdWVBY2Nlc3NvcjpPYmplY3QsZmlsbEFyZWE6T2JqZWN0LApzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0b29sdGlwQ29sdW1uczpBcnJheSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsdG9vbHRpcFBvc2l0aW9uOlN0cmluZyxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXksc3ltYm9sRnVuY3Rpb246T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnRkLnJ1bnNDb2xvclNjYWxlfSl9LF9yZXNldERvbWFpbk9uTmV4dExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltjZC5EYXRhTG9hZGVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9kYXRhU2VyaWVzQ2hhbmdlZChkYXRhU2VyaWVzLiopIiwiX2xvYWRLZXlDaGFuZ2VkKGxvYWRLZXkpIl0sb25Mb2FkRmluaXNoKCl7MDwKdGhpcy5kYXRhVG9Mb2FkLmxlbmd0aCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuJC5jaGFydC5yZXNldERvbWFpbigpKTt0aGlzLnJlZHJhdygpfSxkZXRhY2hlZCgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZil9LGV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuJC5jaGFydC5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9LHJlc2V0RG9tYWluKCl7dGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCl9LHNldFNlcmllc0RhdGEoZixoKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShmLGgpfSxzZXRTZXJpZXNNZXRhZGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShmLGgpfSxjb21taXRDaGFuZ2VzKCl7dGhpcy4kLmNoYXJ0LmNvbW1pdENoYW5nZXMoKX0scmVkcmF3KCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9CndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT90aGlzLiQuY2hhcnQucmVkcmF3KCk6dGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITB9KX0sX2xvYWRLZXlDaGFuZ2VkKCl7dGhpcy5yZXNldCgpO3RoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZD0hMH0sX2RhdGFTZXJpZXNDaGFuZ2VkKCl7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5kYXRhU2VyaWVzKX0sX2xvZ1NjYWxlQ2hhbmdlZChmKXt0aGlzLiQuY2hhcnQueVNjYWxlVHlwZT1mPyJsb2ciOiJsaW5lYXIiO3RoaXMucmVkcmF3KCl9LF9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUmJihiLnB1c2godGhpcyksZCgpKX0sX29uQ2hhcnRBdHRhY2hlZCgpe3RoaXMuYWN0aXZlfHwodGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITApfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3RoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpO3JlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIiwwPHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCk7dGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCk7dGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIiwKdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wK3RoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodD49dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KX0sX2Vuc3VyZVRhcmdldDpmdW5jdGlvbigpeyh0aGlzLmRpYWxvZ0VsZW1lbnQ9dGhpcy5kaWFsb2dFbGVtZW50fHx0aGlzLnBhcmVudEVsZW1lbnQpJiZ0aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzJiYwPD10aGlzLmRpYWxvZ0VsZW1lbnQuYmVoYXZpb3JzLmluZGV4T2YoUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbCk/KHRoaXMuZGlhbG9nRWxlbWVudC5zaXppbmdUYXJnZXQ9dGhpcy5zY3JvbGxUYXJnZXQsdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgiZml0IikpOnRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LmFkZCgiZml0Iil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWFya2Rvd24tdmlldy90Zi1tYXJrZG93bi12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLW1hcmtkb3duLXZpZXciLHByb3BlcnRpZXM6e2h0bWw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sYXR0YWNoZWQoKXt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhcmQtaGVhZGluZy90Zi1jYXJkLWhlYWRpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY2FyZC1oZWFkaW5nIixwcm9wZXJ0aWVzOntkaXNwbGF5TmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGFnOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxydW46e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3J1bkJhY2tncm91bmQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9uYW1lTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWVMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9LF90YWdMYWJlbDp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfY29tcHV0ZVRhZ0xhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn19LF91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYil7cmV0dXJuIGJ8fCJub25lIn0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gSGgucGlja1RleHRDb2xvcihiKX0sX2NvbXB1dGVOYW1lTGFiZWwoYixkKXtyZXR1cm4gYnx8ZHx8IiJ9LF9jb21wdXRlVGFnTGFiZWwoYixkKXtyZXR1cm4gZCYmZCE9PWI/ZDoiIn0sX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nKGIpe3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy5wb3NpdGlvblRhcmdldD1iLnRhcmdldDt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cudG9nZ2xlKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxydW5zOkFycmF5LHRhZzpTdHJpbmcsdXJsRm46RnVuY3Rpb259LF9jc3ZVcmwoYixkLGYpe3JldHVybiBkP2RjLmFkZFBhcmFtcyhmKGIsZCkse2Zvcm1hdDoiY3N2In0pOiIifSxfanNvblVybChiLGQsZil7cmV0dXJuIGQ/ZihiLGQpOiIifSxfY3N2TmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5jc3ZgOiIifSxfanNvbk5hbWUoYixkKXtyZXR1cm4gZD9gcnVuLSR7ZH0tdGFnLSR7Yn0uanNvbmA6IiJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2Y9Zi5tYXAoaz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmtbMF0pLHN0ZXA6a1sxXSxzY2FsYXI6a1syXX0pKTtjb25zdCBoPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oZCk7Yi5zZXRTZXJpZXNNZXRhZGF0YShoLGQpO2Iuc2V0U2VyaWVzRGF0YShoLApmKTtiLmNvbW1pdENoYW5nZXMoKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmIscnVuOmR9KT0+ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmIscnVuOmR9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YixydW46ZH0pfX0scmVxdWVzdERhdGE6RnVuY3Rpb24sX2dldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpfX0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksCnZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj11Zy5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpLGQ9Yi5maW5kSW5kZXgoZj0+Ik5hbWUiPT1mLnRpdGxlKTtiLnNwbGljZShkLDEse3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT57Zj1mLmRhdGFzZXQubWV0YWRhdGEoKS5tZXRhO3JldHVybiB0aGlzLl9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bShmKX19KTtyZXR1cm4gYn19fSxyZWxvYWQoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTsKYiYmYi5yZXNldERvbWFpbigpfSxfdXBkYXRlRG93bmxvYWRMaW5rKCl7Y29uc3QgYj10aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLiQkKCIjc3ZnTGluayIpLmhyZWY9YGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtidG9hKGIpfWB9LF9ydW5zRnJvbURhdGEoYil7cmV0dXJuIGIubWFwKGQ9PmQucnVuKX0sX2dldERhdGFTZXJpZXMoKXtyZXR1cm4gdGhpcy5kYXRhVG9Mb2FkLm1hcChiPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGIpKX0sX2dldFNlcmllc05hbWVGcm9tRGF0dW0oe3J1bjpiLGV4cGVyaW1lbnQ6ZD17bmFtZToiX2RlZmF1bHQifX0pe3JldHVybiBKU09OLnN0cmluZ2lmeShbZC5uYW1lLGJdKX0sX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGIpe3JldHVybiBiLnJ1bn0sX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6CntzY2FsZTpiPT57WyxiXT1KU09OLnBhcnNlKGIpO3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX19fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHI9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8ocik7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHIpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6YmQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOmJkLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9zbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChfc21vb3RoaW5nV2VpZ2h0KSJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6YmQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOnNmLlhUeXBlLlNURVB9LF9zZWxlY3RlZFJ1bnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuUmVxdWVzdE1hbmFnZXIoNTApfX0sYmVoYXZpb3JzOltjZC5BcnJheVVwZGF0ZUhlbHBlcl0sCm9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6YmQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOmJkLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOmJkLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYil7cmV0dXJuIDA8Yn0sX2dldENhdGVnb3J5S2V5KGIpe3JldHVybiBiLm1ldGFkYXRhLnR5cGU9PWtjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUz8KIiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDaGFydHMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9ZGMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+CntiLnJlbG9hZCgpfSl9LF91cGRhdGVDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO2Q9a2MuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpO2QuZm9yRWFjaChoPT57aC5pdGVtcz1oLml0ZW1zLm1hcChrPT4oe3RhZzprLnRhZyxzZXJpZXM6ay5ydW5zLm1hcChyPT4oe3J1bjpyLHRhZzprLnRhZ30pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsZCx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShiLGQsZil7Y29uc3QgaD1mLnRhZyxrPXt9O2Yuc2VyaWVzLmZvckVhY2goKHtydW46cH0pPT57a1twXT1kW3BdW2hdfSk7Zj1oLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjpyLGRpc3BsYXlOYW1lOmx9PXJmLmFnZ3JlZ2F0ZVRhZ0luZm8oayxmKTtiLm1ldGFkYXRhLnR5cGU9PWtjLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmwuc3RhcnRzV2l0aChiLm5hbWUrCiIvIikmJihsPWwuc2xpY2UoYi5uYW1lLmxlbmd0aCsxKSk7cmV0dXJue2Rlc2NyaXB0aW9uOnIsZGlzcGxheU5hbWU6bH19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLG1hcmdpbkNoYXJ0U2VyaWVzOkFycmF5LGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bmxvYWRMaW5rczpCb29sZWFuLHRhZ01ldGFkYXRhOk9iamVjdCx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm5ldyBJaC5EYXRhU2VyaWVzQ29sb3JTY2FsZSh7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKG1hcmdpbkNoYXJ0U2VyaWVzKSJ9LF90YWdGaWx0ZXJJbnZhbGlkOkJvb2xlYW4sX25hbWVUb0RhdGFTZXJpZXM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+KHt9KX0sX3Nlcmllc05hbWVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXJpZXNOYW1lcyhfbmFtZVRvRGF0YVNlcmllcywgcnVucykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMuX3RhZ0ZpbHRlcjtyZXR1cm4gZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIikse3RhZzpkLHJ1bjpifSl9fX0sX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX21hdGNoZXNMaXN0T3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90aXRsZURpc3BsYXlTdHJpbmc6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyh0aXRsZSkifSwKX2ZpbGxBcmVhOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTp7bG93ZXJBY2Nlc3NvcjpiPT5iLmxvd2VyLGhpZ2hlckFjY2Vzc29yOmI9PmIudXBwZXJ9fSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBiPXNmLm11bHRpc2NhbGVGb3JtYXR0ZXIoc2YuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGQ9Zj0+aXNOYU4oZik/Ik5hTiI6YihmKTtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpmPT5mLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJMb3dlciBNYXJnaW4iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5sb3dlcil9LHt0aXRsZToiVXBwZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0udXBwZXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmY9PnNmLnN0ZXBGb3JtYXR0ZXIoZi5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIiwKZXZhbHVhdGU6Zj0+c2YudGltZUZvcm1hdHRlcihmLmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOmY9PnNmLnJlbGF0aXZlRm9ybWF0dGVyKHNmLnJlbGF0aXZlQWNjZXNzb3IoZi5kYXR1bSwtMSxmLmRhdGFzZXQpKX1dfX0sX21pc3NpbmdUYWdzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcHNNaXNtYXRjaDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVDaGFydChfbmFtZVRvRGF0YVNlcmllcykiLCJfcmVmcmVzaERhdGFTZXJpZXMoX3RhZ0ZpbHRlcikiXSxyZWxvYWQoKXt0aGlzLiQubG9hZGVyLnJlbG9hZCgpfSxyZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLAohdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gZGMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIGRjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6Impzb24ifSl9LF9kb3dubG9hZERhdGFVcmwoYixkKXtiPWJbZF07Yj17dGFnOmIuZ2V0VGFnKCkscnVuOmIuZ2V0UnVuKCl9O3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxiKX0sX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oYil7cmV0dXJuKGQsZixoKT0+e2lmKGgucmVnZXhfdmFsaWQpe3ZhciBrPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyksCnI9W107Xy5mb3JFYWNoKGIsbD0+e3ZhciBwPSExLG09aC50YWdfdG9fZXZlbnRzW2wudmFsdWVdO2NvbnN0IG49aC50YWdfdG9fZXZlbnRzW2wubG93ZXJdLHE9aC50YWdfdG9fZXZlbnRzW2wudXBwZXJdO18uaXNVbmRlZmluZWQobSkmJihyLnB1c2gobC52YWx1ZSkscD0hMCk7Xy5pc1VuZGVmaW5lZChuKSYmKHIucHVzaChsLmxvd2VyKSxwPSEwKTtfLmlzVW5kZWZpbmVkKHEpJiYoci5wdXNoKGwudXBwZXIpLHA9ITApO2lmKCFwKXt2YXIgdT15PT55WzFdO2lmKHA9dGhpcy5fZmluZFN0ZXBNaXNtYXRjaChsLG0ubWFwKHUpLG4ubWFwKHUpLHEubWFwKHUpKSl0aGlzLnNldCgiX3N0ZXBzTWlzbWF0Y2giLHApO2Vsc2V7dmFyIHc9eT0+eVsyXTtwPW0ubWFwKCh5LHgpPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqeVswXSksc3RlcDp1KHkpLHNjYWxhcjp3KHkpLGxvd2VyOncoblt4XSksdXBwZXI6dyhxW3hdKX0pKTttPUloLmdlbmVyYXRlRGF0YVNlcmllc05hbWUoZixsLnZhbHVlKTsKdmFyIEE9a1ttXTtBP0Euc2V0RGF0YShwKToobD10aGlzLl9jcmVhdGVOZXdEYXRhU2VyaWVzKGYsbC52YWx1ZSxtLHApLGtbbV09bCl9fX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsayk7ZD1fLmZpbmRJbmRleCh0aGlzLl9taXNzaW5nVGFncyxsPT5sLnJ1bj09PWYpO2lmKHIubGVuZ3RoJiYzIT1yLmxlbmd0aCl7Y29uc3QgbD17cnVuOmYsdGFnczpyfTswPD1kP3RoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGQsMSxsKTp0aGlzLnB1c2goIl9taXNzaW5nVGFncyIsbCl9ZWxzZSAwPD1kJiZ0aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEpfWVsc2UgdGhpcy5zZXQoIl90YWdGaWx0ZXJJbnZhbGlkIiwhMCl9fSxfZmluZFN0ZXBNaXNtYXRjaChiLGQsZixoKXtyZXR1cm4gXy5pc0VxdWFsKGYsZCkmJl8uaXNFcXVhbChoLGQpP251bGw6e3Nlcmllc09iamVjdDpiLHZhbHVlU3RlcHM6ZCxsb3dlclN0ZXBzOmYsdXBwZXJTdGVwczpofX0sX2NyZWF0ZU5ld0RhdGFTZXJpZXMoYiwKZCxmLGgpe3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdfD0wO2Q9bmV3IEloLkRhdGFTZXJpZXMoYixkLGYsaCxzZi5TWU1CT0xTX0xJU1RbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl1dKTt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl0rMSklc2YuU1lNQk9MU19MSVNULmxlbmd0aDtyZXR1cm4gZH0sX3VwZGF0ZUNoYXJ0KGIpe18uZm9yT3duKGIsZD0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLmdldE5hbWUoKSxkLmdldERhdGEoKSl9KTt0aGlzLiQubG9hZGVyLmNvbW1pdENoYW5nZXMoKX0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssZF0pPT5iLmhhcyhkLnJ1bikpLm1hcCgoW2RdKT0+CmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gXy5mbGF0dGVuKGIubWFwKGQ9PltkLnZhbHVlLGQubG93ZXIsZC51cHBlcl0pKS5tYXAoZD0+IigiK3RoaXMuX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhkKSsiKSIpLmpvaW4oInwiKX0sX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhiKXtyZXR1cm4gYi5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkXHgyNiIpfSxfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sCl90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwidW50aXRsZWQifSxfc2VwYXJhdGVXaXRoQ29tbWFzKGIpe3JldHVybiBiLmpvaW4oIiwgIil9LF90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3Blbigpe3RoaXMuc2V0KCJfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCIsIXRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQpfSxfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQoKXtjb25zdCBiPXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO2ImJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goZD0+e2NvbnN0IGY9Yi5pdGVtRm9yRWxlbWVudChkKTtkLnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsZil9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyx0YWdSZWdleGVzOkFycmF5LGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bmxvYWRMaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm5ldyBJaC5EYXRhU2VyaWVzQ29sb3JTY2FsZSh7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKHRhZ1JlZ2V4ZXMpIn0sX25hbWVUb0RhdGFTZXJpZXM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+KHt9KX0sX3Nlcmllc05hbWVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXJpZXNOYW1lcyhfbmFtZVRvRGF0YVNlcmllcywgcnVucykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMuX3RhZ0ZpbHRlcjtyZXR1cm4gZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIikse3RhZzpkLHJ1bjpifSl9fX0sX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX21hdGNoZXNMaXN0T3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90aXRsZURpc3BsYXlTdHJpbmc6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyh0aXRsZSkifX0sCm9ic2VydmVyczpbIl91cGRhdGVDaGFydChfbmFtZVRvRGF0YVNlcmllcykiLCJfcmVmcmVzaERhdGFTZXJpZXMoX3RhZ0ZpbHRlcikiXSxyZWxvYWQoKXt0aGlzLiQubG9hZGVyLnJlbG9hZCgpfSxyZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kLmxvYWRlcjtiJiZiLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiBkYy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gZGMuYWRkUGFyYW1zKGIsCntmb3JtYXQ6Impzb24ifSl9LF9kb3dubG9hZERhdGFVcmwoYixkKXtiPWJbZF07Yj17dGFnOmIuZ2V0VGFnKCkscnVuOmIuZ2V0UnVuKCl9O3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxiKX0sX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57aWYoZi5yZWdleF92YWxpZCl7Y29uc3QgaD1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpO18uZm9yT3duKGYudGFnX3RvX2V2ZW50cywoayxyKT0+e2NvbnN0IGw9ay5tYXAobT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKm1bMF0pLHN0ZXA6bVsxXSxzY2FsYXI6bVsyXX0pKTtrPUloLmdlbmVyYXRlRGF0YVNlcmllc05hbWUoZCxyKTtjb25zdCBwPWhba107cD9wLnNldERhdGEobCk6KF8uaXNVbmRlZmluZWQodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF0pJiYodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF09CjApLHI9bmV3IEloLkRhdGFTZXJpZXMoZCxyLGssbCxzZi5TWU1CT0xTX0xJU1RbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF1dKSxoW2tdPXIsdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZF09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKzEpJXNmLlNZTUJPTFNfTElTVC5sZW5ndGgpfSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixoKX19fSxfdXBkYXRlQ2hhcnQoYil7T2JqZWN0LmVudHJpZXMoYikuZm9yRWFjaCgoW2QsZl0pPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGQsZi5nZXREYXRhKCkpfSk7dGhpcy4kLmxvYWRlci5jb21taXRDaGFuZ2VzKCl9LF9jb21wdXRlU2VsZWN0ZWRSdW5zU2V0KGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09MX0pO3JldHVybiBkfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYj1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWywKZF0pPT5iLmhhcyhkLnJ1bikpLm1hcCgoW2RdKT0+ZCl9LF9kZXRlcm1pbmVDb2xvcihiLGQpe3JldHVybiBiLnNjYWxlKGQpfSxfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYl0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYixkKXtyZXR1cm4gYltkXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGIpe3JldHVybiAxPT09Yi5sZW5ndGg/YlswXTpiLm1hcChkPT4iKCIrZCsiKSIpLmpvaW4oInwiKX0sX2dldFRvZ2dsZU1hdGNoZXNJY29uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3RvZ2dsZU1hdGNoZXNPcGVuKCl7dGhpcy5zZXQoIl9tYXRjaGVzTGlzdE9wZW5lZCIsIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYil7cmV0dXJuIGJ8fAoidW50aXRsZWQifSxfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQoKXtjb25zdCBiPXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO2ImJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goZD0+e2NvbnN0IGY9Yi5pdGVtRm9yRWxlbWVudChkKTtkLnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsZil9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDUwKX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOmJkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdFbmFibGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChfc21vb3RoaW5nV2VpZ2h0KSJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIsCntkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOmJkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9sYXlvdXQ6T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9sYXlvdXQpIn0sX29wZW5lZENhdGVnb3JpZXM6e3R5cGU6T2JqZWN0fSxfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHJlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSwKcmVsb2FkKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGQ9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT4Ke2YuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGYudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpiZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6YmQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107CmxldCBkPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChkPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBiLmNhdGVnb3J5Lm1hcChmPT57ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPWRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPWRjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfYWN0dWFsU2l6ZTpCb29sZWFuLF9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjEscmVhZE9ubHk6ITB9LF9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDAscmVhZE9ubHk6ITB9LF9icmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2NvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwfSxfdGFnRmlsdGVyOlN0cmluZyxfYnJpZ2h0bmVzc0lzRGVmYXVsdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoX2JyaWdodG5lc3NBZGp1c3RtZW50KSJ9LF9jb250cmFzdElzRGVmYXVsdDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Cl8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9ZGMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYil7cmV0dXJuIGI9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LApfY29tcHV0ZUNvbnRyYXN0SXNEZWZhdWx0KGIpe3JldHVybiBiPT09dGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtmdW5jdGlvbiBoKHIpe2NvbnN0IGw9YltyLnJ1bl1bci50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UobCkubWFwKHA9Pk9iamVjdC5hc3NpZ24oe30scix7c2FtcGxlOnAsb2ZTYW1wbGVzOmx9KSl9Y29uc3Qgaz1fLm1hcFZhbHVlcyhiLHI9Pk9iamVjdC5rZXlzKHIpKTtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhrLGQsZikubWFwKHI9Pk9iamVjdC5hc3NpZ24oe30scix7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHIuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsdG90YWxTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zdGVwSW5kZXg6TnVtYmVyLF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9jdXJyZW50RGF0dW06e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnREYXR1bShfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LF9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXModG90YWxTYW1wbGVzKSJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGQucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYil7cmV0dXJuISFiJiYwPGIubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYil7cmV0dXJuISFiJiYxPGIubGVuZ3RofSxfY29tcHV0ZU1heFN0ZXBJbmRleChiKXtyZXR1cm4gYi5sZW5ndGgtMX0sX2NvbXB1dGVDdXJyZW50RGF0dW0oYixkKXtyZXR1cm4gYltkXX0sX2NvbXB1dGVTYW1wbGVUZXh0KGIpe3JldHVybmAke2IrCjF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2F1ZGlvIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pKSxkPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntmLmNhbmNlbGxlZHx8KGY9Zi52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLHRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7dmFyIGQ9Cm5ldyBVUkxTZWFyY2hQYXJhbXMoYi5xdWVyeSk7ZC5hcHBlbmQoInRzIixiLndhbGxfdGltZSk7ZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvaW5kaXZpZHVhbEF1ZGlvIixkKTtyZXR1cm57d2FsbF90aW1lOkhoLmZvcm1hdERhdGUobmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSksc3RlcDpiLnN0ZXAsbGFiZWw6Yi5sYWJlbCxjb250ZW50VHlwZTpiLmNvbnRlbnRUeXBlLHVybDpkfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWRhc2hib2FyZCIscHJvcGVydGllczp7cmVsb2FkT25SZWFkeTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkQXVkaW8oKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvdGFncyIpOwpyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZEF1ZGlvKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWF1ZGlvLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7ZnVuY3Rpb24gaChyKXtjb25zdCBsPWJbci5ydW5dW3IudGFnXS5zYW1wbGVzO3JldHVybiBfLnJhbmdlKGwpLm1hcChwPT5PYmplY3QuYXNzaWduKHt9LHIse3NhbXBsZTpwLHRvdGFsU2FtcGxlczpsfSkpfWNvbnN0IGs9Xy5tYXBWYWx1ZXMoYixyPT5PYmplY3Qua2V5cyhyKSk7CnJldHVybiBrYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAocj0+T2JqZWN0LmFzc2lnbih7fSxyLHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sci5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWF1dG9ncm93LXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlXSxwcm9wZXJ0aWVzOnt2YWx1ZTp7b2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQiLHR5cGU6U3RyaW5nLG5vdGlmeTohMH0sYmluZFZhbHVlOntvYnNlcnZlcjoiX2JpbmRWYWx1ZUNoYW5nZWQiLHR5cGU6U3RyaW5nLG5vdGlmeTohMH0scm93czp7dHlwZTpOdW1iZXIsdmFsdWU6MSxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nfSxyZWFkb25seTp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW59LAptaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxsYWJlbDp7dHlwZTpTdHJpbmd9fSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCJ9LGdldCB0ZXh0YXJlYSgpe3JldHVybiB0aGlzLiQudGV4dGFyZWF9LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvblN0YXJ0KGIpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1ifSxzZXQgc2VsZWN0aW9uRW5kKGIpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykmJih0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdD0iLTNweCIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC50ZXh0YXJlYS52YWxpZGl0eS52YWxpZDsKYiYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy52YWx1ZT9iPSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJihiPVBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IudmFsaWRhdGUuY2FsbCh0aGlzLHRoaXMudmFsdWUpKSk7dGhpcy5pbnZhbGlkPSFiO3RoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpO3JldHVybiBifSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWJ9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy50ZXh0YXJlYTtkJiYoZC52YWx1ZSE9PWImJihkLnZhbHVlPWJ8fDA9PT1iP2I6IiIpLHRoaXMuYmluZFZhbHVlPWIsdGhpcy4kLm1pcnJvci5pbm5lckhUTUw9dGhpcy5fdmFsdWVGb3JNaXJyb3IoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnRoaXMuYmluZFZhbHVlfSkpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXRoO3RoaXMudmFsdWU9ZD9kWzBdLnZhbHVlOgpiLnRhcmdldC52YWx1ZX0sX2NvbnN0cmFpbjpmdW5jdGlvbihiKXtiPWJ8fFsiIl07Zm9yKGI9MDx0aGlzLm1heFJvd3MmJmIubGVuZ3RoPnRoaXMubWF4Um93cz9iLnNsaWNlKDAsdGhpcy5tYXhSb3dzKTpiLnNsaWNlKDApOzA8dGhpcy5yb3dzJiZiLmxlbmd0aDx0aGlzLnJvd3M7KWIucHVzaCgiIik7cmV0dXJuIGIuam9pbigiXHgzY2JyL1x4M2UiKSsiXHgyNiMxNjA7In0sX3ZhbHVlRm9yTWlycm9yOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy50ZXh0YXJlYTtpZihiKXJldHVybiB0aGlzLnRva2Vucz1iJiZiLnZhbHVlP2IudmFsdWUucmVwbGFjZSgvJi9nbSwiXHgyNmFtcDsiKS5yZXBsYWNlKC8iL2dtLCJceDI2cXVvdDsiKS5yZXBsYWNlKC8nL2dtLCJceDI2IzM5OyIpLnJlcGxhY2UoLzwvZ20sIlx4MjZsdDsiKS5yZXBsYWNlKC8+L2dtLCJceDI2Z3Q7Iikuc3BsaXQoIlxuIik6WyIiXSx0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfSxfdXBkYXRlQ2FjaGVkOmZ1bmN0aW9uKCl7dGhpcy4kLm1pcnJvci5pbm5lckhUTUw9CnRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7X2FyaWFMYWJlbGxlZEJ5OntvYnNlcnZlcjoiX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZCIsdHlwZTpTdHJpbmd9LF9hcmlhRGVzY3JpYmVkQnk6e29ic2VydmVyOiJfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZCIsdHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZ30scm93czp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSwKc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYil9LF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixiKX0sZ2V0IF9mb2N1c2FibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvYXN0L3BhcGVyLXRvYXN0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9bnVsbDtQb2x5bWVyKHtpczoicGFwZXItdG9hc3QiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3csb2JzZXJ2ZXI6Il9vbkZpdEludG9DaGFuZ2VkIn0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToibGVmdCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsdmFsdWU6M0UzfSx0ZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbm9DYW5jZWxPbk91dHNpZGVDbGljazp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfX29uVHJhbnNpdGlvbkVuZCJ9LGdldCB2aXNpYmxlKCl7UG9seW1lci5CYXNlLl93YXJuKCJgdmlzaWJsZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBvcGVuZWRgIGluc3RlYWQiKTsKcmV0dXJuIHRoaXMub3BlbmVkfSxnZXQgX2NhbkF1dG9DbG9zZSgpe3JldHVybiAwPHRoaXMuZHVyYXRpb24mJkluZmluaXR5IT09dGhpcy5kdXJhdGlvbn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2F1dG9DbG9zZT1udWxsO1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxzaG93OmZ1bmN0aW9uKGQpeyJzdHJpbmciPT10eXBlb2YgZCYmKGQ9e3RleHQ6ZH0pO2Zvcih2YXIgZiBpbiBkKTA9PT1mLmluZGV4T2YoIl8iKT9Qb2x5bWVyLkJhc2UuX3dhcm4oJ1RoZSBwcm9wZXJ0eSAiJytmKyciIGlzIHByaXZhdGUgYW5kIHdhcyBub3Qgc2V0LicpOmYgaW4gdGhpcz90aGlzW2ZdPWRbZl06UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBub3QgdmFsaWQuJyk7dGhpcy5vcGVuKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCl9LF9fb25UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGQpe2QmJmQudGFyZ2V0PT09CnRoaXMmJiJvcGFjaXR5Ij09PWQucHJvcGVydHlOYW1lJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe251bGwhPT10aGlzLl9hdXRvQ2xvc2UmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2F1dG9DbG9zZSksdGhpcy5fYXV0b0Nsb3NlPW51bGwpO3RoaXMub3BlbmVkPyhiJiZiIT09dGhpcyYmYi5jbG9zZSgpLGI9dGhpcyx0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OnRoaXMudGV4dH0pLHRoaXMuX2NhbkF1dG9DbG9zZSYmKHRoaXMuX2F1dG9DbG9zZT10aGlzLmFzeW5jKHRoaXMuY2xvc2UsdGhpcy5kdXJhdGlvbikpKTpiPT09dGhpcyYmKGI9bnVsbCk7UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInBhcGVyLXRvYXN0LW9wZW4iKX0sCl9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInBhcGVyLXRvYXN0LW9wZW4iKX0sX29uRml0SW50b0NoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5wb3NpdGlvblRhcmdldD1kfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2dnbGUtYnV0dG9uL3BhcGVyLXRvZ2dsZS1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9nZ2xlLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsImFyaWEtcHJlc3NlZCI6ImZhbHNlIix0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnt9LGxpc3RlbmVyczp7dHJhY2s6Il9vbnRyYWNrIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe1BvbHltZXIuR2VzdHVyZXMuc2V0VG91Y2hBY3Rpb24odGhpcywicGFuLXkiKX0pfSxfb250cmFjazpmdW5jdGlvbihiKXtiPWIuZGV0YWlsOyJzdGFydCI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrU3RhcnQoYik6InRyYWNrIj09PWIuc3RhdGU/dGhpcy5fdHJhY2tNb3ZlKGIpOiJlbmQiPT09Yi5zdGF0ZSYmdGhpcy5fdHJhY2tFbmQoYil9LF90cmFja1N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fd2lkdGg9dGhpcy4kLnRvZ2dsZUJhci5vZmZzZXRXaWR0aC8KMjt0aGlzLl90cmFja0NoZWNrZWQ9dGhpcy5jaGVja2VkO3RoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LmFkZCgiZHJhZ2dpbmciKX0sX3RyYWNrTW92ZTpmdW5jdGlvbihiKXtiPWIuZHg7dGhpcy5feD1NYXRoLm1pbih0aGlzLl93aWR0aCxNYXRoLm1heCgwLHRoaXMuX3RyYWNrQ2hlY2tlZD90aGlzLl93aWR0aCtiOmIpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX3grInB4IiwwLDAsdGhpcy4kLnRvZ2dsZUJ1dHRvbik7dGhpcy5fdXNlckFjdGl2YXRlKHRoaXMuX3g+dGhpcy5fd2lkdGgvMil9LF90cmFja0VuZDpmdW5jdGlvbigpe3RoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTt0aGlzLnRyYW5zZm9ybSgiIix0aGlzLiQudG9nZ2xlQnV0dG9uKX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQudG9nZ2xlQnV0dG9uO3ZhciBiPVBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fY3JlYXRlUmlwcGxlKCk7CmIuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoInJlY2VudGVycyIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiwidG9nZ2xlLWluayIpO3JldHVybiBifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLW1pbmltYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtbWluaW1hcCIsaW5pdDpmdW5jdGlvbihiLGQsZixoLGspe3JldHVybiBuZXcgdGYuc2NlbmUuTWluaW1hcChiLGQsZix0aGlzLGgsayl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShiKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYiwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGIpe3RoaXMudGVtcGxhdGVJbmRleD1iLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGIucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGIucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYil9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGIpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmImJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiLnRpdGxlIiksZj1kLnN0eWxlLGg9dGhpcy4kJCgiLmF1eFRpdGxlIiksaz1oLnN0eWxlLHI9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3QgbD1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIHA9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGImJnAmJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2I9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGwuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIG09cC5nZXRDVE0oKS5lO3A9Yj9iLmdldENUTSgpLmU6bnVsbDtmLmRpc3BsYXk9ImlubGluZSI7Zi5sZWZ0PW0rInB4IjtudWxsIT09cCYmcCE9PW0/KGsuZGlzcGxheT0iaW5saW5lIixwPU1hdGgubWF4KG0rZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxwKSxrLmxlZnQ9cCsicHgiKTprLmRpc3BsYXk9Im5vbmUiO2Q9KGQ9bC5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9kLmdldENUTSgpLmU6bnVsbDtudWxsIT09ZCYmZCE9PXA/KHIuZGlzcGxheT0iaW5saW5lIixkPU1hdGgubWF4KHAraC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxkKSxyLmxlZnQ9ZCsicHgiKToKci5kaXNwbGF5PSJub25lIn1lbHNlIGYuZGlzcGxheT0ibm9uZSIsay5kaXNwbGF5PSJub25lIixyLmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYixkKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYiwKZCxmKXtiPWIubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXVtkLm5vZGUubmFtZV09Zn0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtiXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGIsZCl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Iubm9kZS5uYW1lXVtkLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX25vZGVHcm91cEluZGV4W2JdPWR9LGdldE5vZGVHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYl19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihiLGQpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2JdPQpkfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2JdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYixkKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGIsZCl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5nZXROb2RlKGIpLGY9dGhpcy5nZXROb2RlR3JvdXAoYik7ZiYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGYsZCx0aGlzKTtkLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFkLmlzTGlicmFyeUZ1bmN0aW9uJiYoZj1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpkLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYiksaD0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShoLGQsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiE9PWQmJihkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCksYikpe3RoaXMubWluaW1hcC51cGRhdGUoKTtkPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGIpO2Zvcih2YXIgZj1bXTtudWxsIT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWQ9ZC5wYXJlbnROb2RlLGYucHVzaChkLm5hbWUpO3ZhciBoO18uZm9yRWFjaFJpZ2h0KGYsaz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGspOwprPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoayk7ay5ub2RlLmlzR3JvdXBOb2RlJiYhay5leHBhbmRlZCYmKGsuZXhwYW5kZWQ9ITAsaHx8KGg9aykpfSk7aCYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGgpLHRoaXMuX3pvb21lZD0hMCk7YiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShiKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtiIT09ZCYmKGImJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShiKSxkJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZCkpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZ3JhcGhDaGFuZ2VkIn0sYmFzaWNHcmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LGRldmljZXNGb3JTdGF0czpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx0aXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkRWRnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfbGFzdFNlbGVjdGVkRWRnZUdyb3VwOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sdHJhY2VJbnB1dHM6Qm9vbGVhbiwKbm9kZUNvbnRleHRNZW51SXRlbXM6QXJyYXksX3JlbmRlckRlcHRoOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfYWxsb3dHcmFwaFNlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixlZGdlV2lkdGhGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZU5vZGVTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGVkZ2VMYWJlbEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlRWRnZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn19LG9ic2VydmVyczpbIl9zdGF0c0NoYW5nZWQoc3RhdHMsIGRldmljZXNGb3JTdGF0cykiLCJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHksIGVkZ2VXaWR0aEZ1bmN0aW9uLCBoYW5kbGVOb2RlU2VsZWN0ZWQsIGVkZ2VMYWJlbEZ1bmN0aW9uLCBoYW5kbGVFZGdlU2VsZWN0ZWQpIiwiX3NlbGVjdGVkTm9kZUNoYW5nZWQoc2VsZWN0ZWROb2RlKSIsCiJfc2VsZWN0ZWRFZGdlQ2hhbmdlZChzZWxlY3RlZEVkZ2UpIl0scGFuVG9Ob2RlKGIpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKGIpfSxfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoYil7YiYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkoYil9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYoYiYmZCYmKHRmLmdyYXBoLmpvaW5TdGF0c0luZm9XaXRoR3JhcGgodGhpcy5iYXNpY0dyYXBoLGIsZCksdGYuZ3JhcGguaGllcmFyY2h5LmpvaW5BbmRBZ2dyZWdhdGVTdGF0cyh0aGlzLmdyYXBoSGllcmFyY2h5KSksdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSkpfSxfYnVpbGRSZW5kZXJIaWVyYXJjaHk6ZnVuY3Rpb24oYil7dGYuZ3JhcGgudXRpbC50aW1lKCJuZXcgdGYuZ3JhcGgucmVuZGVyLkhpZXJhcmNoeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBkKGgpe3JldHVybnttaW5WYWx1ZTpoLmRvbWFpbigpWzBdLAptYXhWYWx1ZTpoLmRvbWFpbigpWzFdLHN0YXJ0Q29sb3I6aC5yYW5nZSgpWzBdLGVuZENvbG9yOmgucmFuZ2UoKVsxXX19aWYoYi5yb290LnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBKXt2YXIgZj1uZXcgdGYuZ3JhcGgucmVuZGVyLlJlbmRlckdyYXBoSW5mbyhiLCEhdGhpcy5zdGF0cyk7Zi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uO2YuZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbjt0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6ZChmLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTpkKGYubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOl8ubWFwKGYuZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue2RldmljZTpoLGNvbG9yOmYuZGV2aWNlQ29sb3JNYXAoaCl9fSkseGxhX2NsdXN0ZXI6Xy5tYXAoZi54bGFDbHVzdGVyQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oaCl7cmV0dXJue3hsYV9jbHVzdGVyOmgsCmNvbG9yOmYueGxhQ2x1c3RlckNvbG9yTWFwKGgpfX0pfSk7dGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KGYpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoInJlbmRlcmVkIil9KX19LmJpbmQodGhpcykpfSxfZ2V0VmlzaWJsZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKGIpOmJ9LGxpc3RlbmVyczp7ImdyYXBoLXNlbGVjdCI6Il9ncmFwaFNlbGVjdGVkIiwiZGlzYWJsZS1jbGljayI6Il9kaXNhYmxlQ2xpY2siLCJlbmFibGUtY2xpY2siOiJfZW5hYmxlQ2xpY2siLCJub2RlLXRvZ2dsZS1leHBhbmQiOiJfbm9kZVRvZ2dsZUV4cGFuZCIsIm5vZGUtc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsIm5vZGUtaGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsIm5vZGUtdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQiLCJub2RlLXRvZ2dsZS1leHRyYWN0IjoiX25vZGVUb2dnbGVFeHRyYWN0IiwKIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIjoiX25vZGVUb2dnbGVTZXJpZXNHcm91cCIsImVkZ2Utc2VsZWN0IjoiX2VkZ2VTZWxlY3RlZCIsImFubm90YXRpb24tc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsImFubm90YXRpb24taGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsImFubm90YXRpb24tdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQifSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuZml0KCl9LF9ncmFwaENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImdyYXBoLXNlbGVjdCIpfSxfZ3JhcGhTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgic2VsZWN0ZWROb2RlIixudWxsKSx0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixudWxsKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2Rpc2FibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITF9LF9lbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9CiEwfSxfc2VsZWN0ZWROb2RlQ2hhbmdlZChiKXt0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCYmdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoYil9LF9zZWxlY3RlZEVkZ2VDaGFuZ2VkKGIpe3RoaXMuX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCk7YiYmKHRoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITApLHRoaXMuX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGIpKTt0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCYmdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQoYil9LF9ub2RlU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmdGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5kZXRhaWwubmFtZSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2VkZ2VTZWxlY3RlZChiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLGIuZGV0YWlsLmVkZ2VHcm91cCksCnRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLGIuZGV0YWlsLmVkZ2VEYXRhKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX25vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihiKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixiLmRldGFpbC5uYW1lKX0sX25vZGVVbmhpZ2hsaWdodGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsbnVsbCl9LF9ub2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKGIpe3RoaXMuX25vZGVTZWxlY3RlZChiKTtiPWIuZGV0YWlsLm5hbWU7dmFyIGQ9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtkLm5vZGUudHlwZSE9PXRmLmdyYXBoLk5vZGVUeXBlLk9QJiYodGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoYiksZC5leHBhbmRlZD0hZC5leHBhbmRlZCx0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChkKX0sNzUpKX0sX25vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihiKXtiPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYik7Yi5ub2RlLmluY2x1ZGU9Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU6Yi5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KGIpP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LF9ub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LG5vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0Zi5ncmFwaC50b2dnbGVOb2RlU2VyaWVzR3JvdXAodGhpcy5oaWVyYXJjaHlQYXJhbXMuc2VyaWVzTWFwLApiKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3RmLmdyYXBoLmhpZXJhcmNoeS5idWlsZCh0aGlzLmJhc2ljR3JhcGgsdGhpcy5oaWVyYXJjaHlQYXJhbXMsdGYuZ3JhcGgudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcih0Zi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksMTAwLCJOYW1lc3BhY2UgaGllcmFyY2h5IikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5IixkKTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9LF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpe2QzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCkuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCExKS5lYWNoKGI9PntpZihiLmxhYmVsKXtjb25zdCBkPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKTtiLmxhYmVsLnN0YXJ0TWFya2VySWQmJgpkLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Yi5sYWJlbC5zdGFydE1hcmtlcklkfSlgKTtiLmxhYmVsLmVuZE1hcmtlcklkJiZkLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke2IubGFiZWwuZW5kTWFya2VySWR9KWApfX0pfSxfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYil7aWYoYi5sYWJlbCl7dmFyIGQ9Yi5sYWJlbC5zdGFydE1hcmtlcklkfHxiLmxhYmVsLmVuZE1hcmtlcklkO2lmKGQpe2NvbnN0IGY9ZC5yZXBsYWNlKCJkYXRhZmxvdy0iLCJzZWxlY3RlZC0iKTtsZXQgaD10aGlzLiQkKCIjIitmKTtofHwoZD10aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcigiIyIrZCksaD1kLmNsb25lTm9kZSghMCksaC5zZXRBdHRyaWJ1dGUoImlkIixmKSxoLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkLWFycm93aGVhZCIpLGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChoKSk7Yj1iLmxhYmVsLnN0YXJ0TWFya2VySWQ/Im1hcmtlci1zdGFydCI6Im1hcmtlci1lbmQiO3RoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKS5zdHlsZShiLApgdXJsKCMke2Z9KWApfX19LG5vdDpmdW5jdGlvbihiKXtyZXR1cm4hYn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyIscHJvcGVydGllczp7Y29udGludWVOdW06e3R5cGU6TnVtYmVyLHZhbHVlOjV9LHNlc3Npb25SdW5HbzpGdW5jdGlvbix0ZW5zb3JDb25kaXRpb25HbzpGdW5jdGlvbixmb3JjZUNvbnRpbnVhdGlvblN0b3A6RnVuY3Rpb24sX2NvbnRpbnVlQnV0dG9uVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIn0sX2NvbnRpbnVlQnV0dG9uQ29udGludWVUZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4iLHJlYWRvbmx5OiEwfSxfY29udGludWVCdXR0b25TdG9wVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IlN0b3AgQ29udGludWF0aW9uIixyZWFkb25seTohMH0sX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uOlN0cmluZyxfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxfaXNSZWZWYWx1ZUlucHV0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAsCm5vdGlmeTohMH19LG9ic2VydmVyczpbIl9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pIl0sbm90aWZ5Q29udGludWF0aW9uU3RvcCgpe3RoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCExKX0sX29wZW5EaWFsb2coKXt0aGlzLiQuY29udGludWVEaWFsb2cub3BlbigpfSxfY2xvc2VEaWFsb2coKXt0aGlzLiQuY29udGludWVEaWFsb2cuY2xvc2UoKX0sX2NvbnRpbnVlQnV0dG9uQ2FsbGJhY2soKXt0aGlzLl9jb250aW51ZUJ1dHRvblRleHQ9PT10aGlzLl9jb250aW51ZUJ1dHRvblN0b3BUZXh0P3RoaXMuZm9yY2VDb250aW51YXRpb25TdG9wKCk6dGhpcy5fb3BlbkRpYWxvZygpfSx1cGRhdGVDb250aW51ZUJ1dHRvblRleHQoYil7dGhpcy5zZXQoIl9jb250aW51ZUJ1dHRvblRleHQiLGI/dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dDp0aGlzLl9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dCl9LF9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjaygpezA8CnRoaXMuY29udGludWVOdW0/KHRoaXMuc2Vzc2lvblJ1bkdvKHRoaXMuY29udGludWVOdW0pLHRoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKSx0aGlzLl9jbG9zZURpYWxvZygpKTp0aGlzLnNldCgiY29udGludWVOdW0iLDEpfSxfdGVuc29yQ29udGludWVHb0J1dHRvbkNhbGxiYWNrKCl7aWYobnVsbCE9dGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pe3ZhciBiPUtoLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleSh0aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbik7bnVsbD09YiYmY29uc29sZS5lcnJvcigiSW52YWxpZCBUZW5zb3IgQ29uZGl0aW9uIG5hbWU6Iit0aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbik7dmFyIGQ9TnVtYmVyKHRoaXMuX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlKTtOdW1iZXIuaXNGaW5pdGUoZCk/KHRoaXMudGVuc29yQ29uZGl0aW9uR28oYixkKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6CnRoaXMuc2V0KCJfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWUiLDApfX0sX29uU2VsZWN0ZWRUZW5zb3JDb25kaXRpb25DaGFuZ2VkKGIpe2I9S2gudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5KGIpO3RoaXMuc2V0KCJfaXNSZWZWYWx1ZUlucHV0SGlkZGVuIiwtMSE9PVsiSU5GX09SX05BTiIsIklORiIsIk5BTiJdLmluZGV4T2YoYikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1pbml0aWFsLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2hhc0N1c3RvbU1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKF9jdXN0b21NZXNzYWdlKSJ9LF9ob3N0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIiwiRGVidWdnZXIgaXMgd2FpdGluZyBmb3IgU2Vzc2lvbi5ydW4oKSBjb25uZWN0aW9ucy4uLiIpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsbnVsbCk7dGhpcy4kLmRpYWxvZy5vcGVuKCk7Cm51bGwhPWImJm51bGwhPWQmJih0aGlzLnNldCgiX2hvc3QiLGIpLHRoaXMuc2V0KCJfcG9ydCIsZCkpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sb3BlbkRpc2FibGVkRGlhbG9nKCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIG5vdCBlbmFibGVkIGluIHRoaXMgVGVuc29yQm9hcmQgaW5zdGFuY2UiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLCJUbyBlbmFibGUgdGhlIGRlYnVnZ2VyIGluIFRlbnNvckJvYXJkLCB1c2UgdGhlIGZsYWc6IC0tZGVidWdnZXJfcG9ydCBceDNjcG9ydF9udW1iZXJceDNlIik7dGhpcy4kLmRpYWxvZy5vcGVuKCl9LF9jb21wdXRlSGlkZGVuKGIpe3JldHVybiFifSxfY29tcHV0ZUhhc0N1c3RvbU1lc3NhZ2UoYil7cmV0dXJuIV8uaXNFbXB0eShiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItcmVzaXplci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1yZXNpemVyIixwcm9wZXJ0aWVzOntjdXJyZW50TGVuZ3RoOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LG1pbkxlbmd0aDpOdW1iZXIsbWF4TGVuZ3RoOk51bWJlcixpc0hvcml6b250YWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yZXNpemVySWRlbnRpZmllcjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2lzVmVydGljYWw6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1ZlcnRpY2FsKGlzSG9yaXpvbnRhbCkiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH0sX2RyYWdTdGFydFBvc2l0aW9uOk51bWJlcixfZHJhZ1N0YXJ0TGVuZ3RoOk51bWJlcixfcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjazpPYmplY3QsX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrOk9iamVjdH0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9oYW5kbGVNb3VzZURvd24ifSwKX2hhbmRsZU1vdXNlRG93bihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZW5kRHJhZygpO3RoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s9ZD0+e2QucHJldmVudERlZmF1bHQoKTtkPXRoaXMuX2RyYWdTdGFydExlbmd0aCsodGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoZCktdGhpcy5fZHJhZ1N0YXJ0UG9zaXRpb24pO2Q9TWF0aC5tYXgoZCx0aGlzLm1pbkxlbmd0aCk7ZD1NYXRoLm1pbihkLHRoaXMubWF4TGVuZ3RoKTt0aGlzLnNldCgiY3VycmVudExlbmd0aCIsZCl9O3RoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZW5kRHJhZygpfTt0aGlzLnNldCgiX2RyYWdTdGFydFBvc2l0aW9uIix0aGlzLl9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChiKSk7dGhpcy5zZXQoIl9kcmFnU3RhcnRMZW5ndGgiLHRoaXMuY3VycmVudExlbmd0aCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLAp0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSl9LF9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChiKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWw/Yi5jbGllbnRZOmIuY2xpZW50WH0sX2VuZERyYWcoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrLCExKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrLCExKTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1udWxsfSxfY29tcHV0ZUlzVmVydGljYWwoYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3NlbGVjdGlvbi10cmVlLW5vZGUuanMKKGZ1bmN0aW9uKGIpe2IuTk9ERV9OQU1FX1NFUEFSQVRPUj0iLyI7Yi5ERVZJQ0VfTkFNRV9QQVRURVJOPS9eXC9qb2I6W0EtWmEtejAtOV9dK1wvcmVwbGljYTpbMC05X10rXC90YXNrOlswLTldK1wvZGV2aWNlOltBLVphLXowLTlfXSs6WzAtOV0rLztsZXQgZDsoZnVuY3Rpb24oayl7a1trLkVNUFRZPTBdPSJFTVBUWSI7a1trLkNIRUNLRUQ9MV09IkNIRUNLRUQiO2tbay5QQVJUSUFMPTJdPSJQQVJUSUFMIn0pKGQ9Yi5DaGVja2JveFN0YXRlfHwoYi5DaGVja2JveFN0YXRlPXt9KSk7Yi5zcGxpdE5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCByPVtdO2NvbnN0IGw9ay5tYXRjaChiLkRFVklDRV9OQU1FX1BBVFRFUk4pO251bGwhPWwmJihyLnB1c2gobFswXSksIi8iIT09a1tsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLGs9ay5zbGljZShsWzBdLmxlbmd0aCsxKSk7cmV0dXJuIHIuY29uY2F0KGsuc3BsaXQoYi5OT0RFX05BTUVfU0VQQVJBVE9SKSl9OwpiLmdldENsZWFuTm9kZU5hbWU9ZnVuY3Rpb24oayl7bGV0IHI9aztjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sPyhyLmxlbmd0aD5sWzBdLmxlbmd0aCYmIi8iIT1yW2xbMF0ubGVuZ3RoXSYmY29uc29sZS5lcnJvcignTm8gc2xhc2ggKCIvIikgYWZ0ZXIgZGV2aWNlIG5hbWUgaW4gbm9kZSBuYW1lOicsaykscj1yLnNsaWNlKGxbMF0ubGVuZ3RoKzEpKToiLyI9PT1yWzBdJiYocj1yLnNsaWNlKDEpKTtyLmluZGV4T2YoIikiKT09PXIubGVuZ3RoLTEmJihyPXIuc2xpY2UoMCxyLmluZGV4T2YoIi8oIikpKTtyZXR1cm4gcn07Yi5zb3J0QW5kQmFzZUV4cGFuZERlYnVnV2F0Y2hlcz1mdW5jdGlvbihrKXtrLnNvcnQoKGwscCk9Pmwubm9kZV9uYW1lPHAubm9kZV9uYW1lPy0xOmwubm9kZV9uYW1lPnAubm9kZV9uYW1lPzE6bC5vdXRwdXRfc2xvdC1wLm91dHB1dF9zbG90KTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7dmFyIHI9a1tsXS5ub2RlX25hbWUrCiIvIjtsZXQgcD0hMTtmb3IobGV0IG09bCsxO208ay5sZW5ndGg7KyttKWlmKDA9PT1rW21dLm5vZGVfbmFtZS5pbmRleE9mKHIpKXtwPSEwO2JyZWFrfXAmJihyPWtbbF0ubm9kZV9uYW1lLnNwbGl0KCIvIiksa1tsXS5ub2RlX25hbWUrPSIvKCIrcltyLmxlbmd0aC0xXSsiKSIpfX07Yi5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb249ZnVuY3Rpb24oayl7cmV0dXJuIGsuZW5kc1dpdGgoIikiKT9rLnNsaWNlKDAsay5sYXN0SW5kZXhPZigiLygiKSk6a307Yi5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcz1mdW5jdGlvbihrKXtjb25zdCByPVtudWxsLG51bGxdO2lmKGtbMF0ubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKSl7bGV0IGw9a1swXTsiLyI9PT1sW2wubGVuZ3RoLTFdJiYobD1sLnNsaWNlKDAsbC5sZW5ndGgtMSkpO3JbMF09bDtyWzFdPWsuc2xpY2UoMSkuam9pbigiLyIpfWVsc2UgclsxXT1rLmpvaW4oIi8iKTtyZXR1cm4gcn07bGV0IGY7KGZ1bmN0aW9uKGspe2tbay5Ob2RlTmFtZT0KMF09Ik5vZGVOYW1lIjtrW2suT3BUeXBlPTFdPSJPcFR5cGUifSkoZj1iLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlfHwoYi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZT17fSkpO2IuZmlsdGVyRGVidWdXYXRjaGVzPWZ1bmN0aW9uKGsscixsKXtpZihyPT09Zi5Ob2RlTmFtZSlyZXR1cm4gay5maWx0ZXIocD0+cC5ub2RlX25hbWUubWF0Y2gobCkpO2lmKHI9PT1mLk9wVHlwZSlyZXR1cm4gay5maWx0ZXIocD0+cC5vcF90eXBlLm1hdGNoKGwpKX07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrLHIsbCxwKXt0aGlzLmRlYnVnV2F0Y2hDaGFuZ2U9cjt0aGlzLmRlYnVnV2F0Y2g9cDt0aGlzLm5hbWU9azt0aGlzLmRlYnVnV2F0Y2g9cDt0aGlzLmNoZWNrYm94U3RhdGU9ZC5FTVBUWTt0aGlzLnBhcmVudD1sO3RoaXMuY2hpbGRyZW49e307dGhpcy5jaGVja2JveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1jaGVja2JveCIpO3RoaXMuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwoKT0+Cnt0aGlzLl9oYW5kbGVDaGFuZ2UoKX0sITEpfV9oYW5kbGVDaGFuZ2UoKXtpZih0aGlzLmF2b2lkUHJvcGFnYXRpb24pdGhpcy5kZWJ1Z1dhdGNoJiZ0aGlzLmRlYnVnV2F0Y2hDaGFuZ2UodGhpcy5kZWJ1Z1dhdGNoLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSk7ZWxzZSBpZih0aGlzLmRlYnVnV2F0Y2gpdGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP3RoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpOnRoaXMuc2V0Tm9kZXNBYm92ZVRvRW1wdHkoKSx0aGlzLmRlYnVnV2F0Y2hDaGFuZ2UodGhpcy5kZWJ1Z1dhdGNoLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSk7ZWxzZSBpZih0aGlzLnNldENoZWNrYm94U3RhdGUodGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP2QuQ0hFQ0tFRDpkLkVNUFRZLCEwKSx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpe2NvbnN0IHI9Xy52YWx1ZXModGhpcy5jaGlsZHJlbik7CmZvcig7ci5sZW5ndGg7KXt2YXIgaz1yLnBvcCgpO18uZm9yRWFjaChrLmNoaWxkcmVuLGw9PnIucHVzaChsKSk7ay5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCwhMCl9dGhpcy5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl9ZWxzZXtjb25zdCByPV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pO2Zvcig7ci5sZW5ndGg7KWs9ci5wb3AoKSxfLmZvckVhY2goay5jaGlsZHJlbixsPT5yLnB1c2gobCkpLGsuc2V0Q2hlY2tib3hTdGF0ZShkLkVNUFRZLCEwKTt0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCl9fWlzTGVhZigpe3JldHVybiEhdGhpcy5kZWJ1Z1dhdGNofXNldFRvQWxsQ2hlY2tlZEV4dGVybmFsbHkoKXt0aGlzLnNldENoZWNrYm94U3RhdGUoZC5DSEVDS0VEKTt0aGlzLl9oYW5kbGVDaGFuZ2UoKX1zZXRDaGVja2JveFN0YXRlKGsscil7dGhpcy5hdm9pZFByb3BhZ2F0aW9uPXI7dGhpcy5jaGVja2JveFN0YXRlPWs7dGhpcy5jaGVja2JveC5jbGFzc0xpc3QudG9nZ2xlKCJwYXJ0aWFsLWNoZWNrYm94IiwKaz09PWQuUEFSVElBTCk7az09PWQuQ0hFQ0tFRD90aGlzLmNoZWNrYm94LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKTp0aGlzLmNoZWNrYm94LnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpO3RoaXMuYXZvaWRQcm9wYWdhdGlvbj0hMX1pc0NoZWNrYm94Q2hlY2tlZCgpe3JldHVybiB0aGlzLmNoZWNrYm94Lmhhc0F0dHJpYnV0ZSgiY2hlY2tlZCIpfXNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKXtsZXQgaz10aGlzLnBhcmVudCxyPSExO2Zvcig7azspcj9rLnNldENoZWNrYm94U3RhdGUoZC5QQVJUSUFMLCEwKToocj0tMSE9PV8uZmluZEluZGV4KF8udmFsdWVzKGsuY2hpbGRyZW4pLGw9PmwuY2hlY2tib3hTdGF0ZSE9PWQuQ0hFQ0tFRCksay5zZXRDaGVja2JveFN0YXRlKHI/ZC5QQVJUSUFMOmQuQ0hFQ0tFRCwhMCkpLGs9ay5wYXJlbnR9c2V0Tm9kZXNBYm92ZVRvRW1wdHkoKXtsZXQgaz10aGlzLnBhcmVudCxyPSExO2Zvcig7azspcj9rLnNldENoZWNrYm94U3RhdGUoZC5QQVJUSUFMLAohMCk6KHI9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkVNUFRZKSxrLnNldENoZWNrYm94U3RhdGUocj9kLlBBUlRJQUw6ZC5FTVBUWSwhMCkpLGs9ay5wYXJlbnR9c2V0TGV2ZWxEb20oayl7dGhpcy5sZXZlbERvbT1rfX1iLlNlbGVjdGlvblRyZWVOb2RlPWh9KShLaHx8KEtoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLW9wLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntkZWJ1Z1dhdGNoZXM6QXJyYXksZGVidWdXYXRjaENoYW5nZTpPYmplY3Qsbm9kZUNsaWNrZWQ6RnVuY3Rpb24sZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmb3JjZUV4cGFuZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9sZXZlbE5hbWUyQ29udGFpbmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbGV2ZWxOYW1lMk5vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF93YXRjaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoZGVidWdXYXRjaGVzLCBkZWJ1Z1dhdGNoQ2hhbmdlLCBfZmlsdGVyTW9kZSwgX2ZpbHRlcklucHV0KSJ9LF9maWx0ZXJNb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToiTm9kZSBOYW1lIiwKbm90aWZ5OiEwfSxfZmlsdGVySW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sX2lzTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaGlnaGxpZ2h0ZWRMZXZlbERvbTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChfd2F0Y2hIaWVyYXJjaHksIGRlYnVnV2F0Y2hDaGFuZ2UpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGZvcmNlRXhwYW5kTm9kZU5hbWUpIl0sX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShiLGQsZixoKXtoPWgudHJpbSgpO2xldCBrPWI7bnVsbCE9ZiYmMDxoLmxlbmd0aCYmKGs9S2guZmlsdGVyRGVidWdXYXRjaGVzKGIsS2guRGVidWdXYXRjaEZpbHRlck1vZGVbZi5yZXBsYWNlKC9ccy9nLCIiKV0sbmV3IFJlZ0V4cChoKSkpO2NvbnN0IHI9bmV3IEtoLlNlbGVjdGlvblRyZWVOb2RlKCIiLApkKTtyLmlzUm9vdD0hMDtfLmZvckVhY2goayxsPT57Y29uc3QgcD1LaC5zcGxpdE5vZGVOYW1lKGwuZGV2aWNlX25hbWUrIi8iK2wubm9kZV9uYW1lKTtsZXQgbT1yO18uZm9yRWFjaChwLChuLHEpPT57cT09PXAubGVuZ3RoLTE/KHE9bmV3IEtoLlNlbGVjdGlvblRyZWVOb2RlKG4sZCxtLGwpLG0uY2hpbGRyZW5bbl09cSk6KG0uY2hpbGRyZW5bbl18fChtLmNoaWxkcmVuW25dPW5ldyBLaC5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSkpLG09bS5jaGlsZHJlbltuXSl9KX0pO3JldHVybiByfSxfY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpe2NvbnN0IGI9dGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LF9yZW5kZXJIaWVyYXJjaHlXaXRoVGltZW91dChiLGQsZixoKXt0aGlzLl9pc0xvYWRpbmd8fCh0aGlzLnNldCgiX2lzTG9hZGluZyIsITApLHRoaXMuX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKSwKc2V0VGltZW91dCgoKT0+e3RoaXMuX3JlbmRlckhpZXJhcmNoeShiLGQsZixoKX0sMTApKX0sX3JlbmRlckhpZXJhcmNoeShiLGQpe3RoaXMuc2V0KCJfbGV2ZWxOYW1lMkNvbnRhaW5lciIse30pO3RoaXMuc2V0KCJfbGV2ZWxOYW1lMk5vZGUiLHt9KTtiPXRoaXMuX3JlbmRlckxldmVsKG51bGwsbnVsbCxiLGQpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKSkuYXBwZW5kQ2hpbGQoYik7dGhpcy5zZXQoIl9pc0xvYWRpbmciLCExKX0sX3JlbmRlckxldmVsKGIsZCxmLGgpe2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bnVsbCE9YiYmay5zZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiLGIpO2xldCByO3I9bnVsbD09ZD9iOmQrIi8iK2I7UG9seW1lci5kb20oaykuY2xhc3NMaXN0LmFkZCgibGV2ZWwtY29udGFpbmVyIik7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWNvbGxhcHNlIik7aWYoYil7dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltyXT0KbDtsLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik7UG9seW1lci5kb20oaykuY2xhc3NMaXN0LmFkZCgiaW5kZW50ZWQtbGV2ZWwtY29udGFpbmVyIik7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZSIpO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtQb2x5bWVyLmRvbShuKS5jbGFzc0xpc3QuYWRkKCJub2RlLWV4cGFuZC1idXR0b24iKTtjb25zdCBxPSgpPT57bi5zZXRBdHRyaWJ1dGUoImljb24iLGwuaGFzQXR0cmlidXRlKCJvcGVuZWQiKT8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSIpfTtuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2wuaGFzQXR0cmlidXRlKCJvcGVuZWQiKT9sLnJlbW92ZUF0dHJpYnV0ZSgib3BlbmVkIik6bC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO3EoKX0sITEpO3EoKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChuKTsKUG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoZi5jaGVja2JveCk7Zi5zZXRMZXZlbERvbShkKTtjb25zdCB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtQb2x5bWVyLmRvbSh1KS5jbGFzc0xpc3QuYWRkKCJsZXZlbC10aXRsZS10ZXh0Iik7dS50ZXh0Q29udGVudD1iO1BvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHUpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGQpOyhiLm1hdGNoKEtoLkRFVklDRV9OQU1FX1BBVFRFUk4pfHwxPT09T2JqZWN0LmtleXMoZi5jaGlsZHJlbikubGVuZ3RoKSYmbC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApfWVsc2UgbC5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApO2NvbnN0IHA9W10sbT1bXTtQb2x5bWVyLmRvbShsKS5jbGFzc0xpc3QuYWRkKCJjb250ZW50LWNvbnRhaW5lciIpO18uZm9yRWFjaChmLmNoaWxkcmVuLChuLHEpPT57Y29uc3QgdT1uLmRlYnVnV2F0Y2g7dmFyIHc9cjtudWxsPT1yJiYodz0iIik7dys9Ii8iK3E7CnRoaXMuX2xldmVsTmFtZTJOb2RlW3ddPW47bnVsbCE9dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1t3XSYmKG4uc2V0Q2hlY2tib3hTdGF0ZShLaC5DaGVja2JveFN0YXRlLkNIRUNLRUQpLG4uc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpKTtpZih1KXt3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKHcpLmNsYXNzTGlzdC5hZGQoIm9wLWRlc2NyaXB0aW9uIik7bi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGgsdSx5LnRhcmdldC5jaGVja2VkKX0sITEpO1BvbHltZXIuZG9tKHcpLmFwcGVuZENoaWxkKG4uY2hlY2tib3gpO24uc2V0TGV2ZWxEb20odyk7dmFyIEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0EudGV4dENvbnRlbnQ9IlsiK3Uub3BfdHlwZSsiXSI7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdHlwZSIpO1BvbHltZXIuZG9tKHcpLmFwcGVuZENoaWxkKEEpOwpBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PXE7QS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwib3AtdGl0bGUtbGVhZiIpO0EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57Y29uc3QgeT10aGlzLl9nZXREZXZpY2VBbmROb2RlTmFtZXMocSxrKTt0aGlzLm5vZGVDbGlja2VkKHlbMF0seVsxXSl9LCExKTtQb2x5bWVyLmRvbSh3KS5hcHBlbmRDaGlsZChBKTttLnB1c2godyl9ZWxzZSBuLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIseT0+e3RoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKG4saCx5LnRhcmdldC5jaGVja2VkKX0pLHAucHVzaCh0aGlzLl9yZW5kZXJMZXZlbChxLHIsbixoKSl9KTtiPW49PntQb2x5bWVyLmRvbShsKS5hcHBlbmRDaGlsZChuKX07Xy5mb3JFYWNoKG0sYik7Xy5mb3JFYWNoKHAsYik7UG9seW1lci5kb20oaykuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIGt9LF9nZXRMZWFmRGVidWdXYXRjaGVzKGIsZCl7Yi5kZWJ1Z1dhdGNoPwpkLnB1c2goYi5kZWJ1Z1dhdGNoKTpfLmZvckVhY2goYi5jaGlsZHJlbixmPT57dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhmLGQpfSl9LF9nZXREZXZpY2VBbmROb2RlTmFtZXMoYixkKXtmb3IoYj1bYl07Oyl7Y29uc3QgZj1kLmdldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIpO2lmKG51bGw9PWYpYnJlYWs7ZWxzZSBiLnB1c2goZik7ZD1Qb2x5bWVyLmRvbShkKS5wYXJlbnROb2RlLnBhcmVudE5vZGV9Yi5yZXZlcnNlKCk7cmV0dXJuIEtoLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzKGIpfSxfaGFuZGxlTWV0YU5vZGVDaGFuZ2UoYixkLGYpe2xldCBoPVtdO3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoYixoKTtfLmZvckVhY2goaCxrPT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChkLGssZil9KX0sX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoYixkLGYpe2NvbnN0IGg9ZC5kZXZpY2VfbmFtZSsiLyIrZC5ub2RlX25hbWU7Zj90aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2hdPQpkOmRlbGV0ZSB0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2hdO2IoZCxmKX0sX2hhbmRsZUZvcmNlTm9kZShiLGQpe3RoaXMuc2V0KCJfZmlsdGVySW5wdXQiLCIiKTtzZXRUaW1lb3V0KCgpPT57aWYobnVsbCE9YiYmbnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcil7dmFyIGY9S2guc3BsaXROb2RlTmFtZShiKTtmb3IobGV0IGs9MTtrPD1mLmxlbmd0aDsrK2spe3ZhciBoPWYuc2xpY2UoMCxrKS5qb2luKCIvIik7Y29uc3Qgcj10aGlzLl9sZXZlbE5hbWUyTm9kZVtoXTtudWxsIT1yJiZudWxsIT1yLmxldmVsRG9tJiZyLmxldmVsRG9tLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTtrPGYubGVuZ3RoP251bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbaF0mJnRoaXMuX2xldmVsTmFtZTJDb250YWluZXJbaF0uc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTooci5kZWJ1Z1dhdGNofHx0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShyLApyLmRlYnVnV2F0Y2hDaGFuZ2UsITApLGQmJihyLnNldFRvQWxsQ2hlY2tlZEV4dGVybmFsbHkoKSwoaD1yLmRlYnVnV2F0Y2gpJiZudWxsPT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2gubm9kZV9uYW1lXSYmKHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbYl09aCkpLG51bGwhPXRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20mJnRoaXMuX2hpZ2hsaWdodGVkTGV2ZWxEb20uY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSxyLmxldmVsRG9tLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksdGhpcy5zZXQoIl9oaWdobGlnaHRlZExldmVsRG9tIixyLmxldmVsRG9tKSl9fX0sMjApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soYil7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGIsITApfSxfaGFuZGxlRm9yY2VOb2RlRXhwYW5kKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCExKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc2Vzc2lvbi1ydW5zLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2Vzc2lvbi1ydW5zLXZpZXciLHByb3BlcnRpZXM6e2xhdGVzdFNlc3Npb25SdW46T2JqZWN0LHNlc3Npb25SdW5LZXlUb0RldmljZU5hbWVzOk9iamVjdCxzb2xlQWN0aXZlOkJvb2xlYW4sbm9kZU9yVGVuc29yQ2xpY2tlZDpGdW5jdGlvbixfcnVuS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3J1bktleTJOdW1EZXZpY2VzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVJ1bktleTpTdHJpbmd9LG9ic2VydmVyczpbInJlbmRlckxhdGVzdChsYXRlc3RTZXNzaW9uUnVuKSIsInNldFNvbGVBY3RpdmVTdGF0dXMoc29sZUFjdGl2ZSkiXSxyZW5kZXJMYXRlc3QoYil7Yj1KU09OLnN0cmluZ2lmeShiKTt0aGlzLl9ydW5LZXkyQ291bnRbYl09dm9pZCAwPT09dGhpcy5fcnVuS2V5MkNvdW50W2JdPzE6dGhpcy5fcnVuS2V5MkNvdW50W2JdKzE7dm9pZCAwPT09dGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl0mJih0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tiXT0KMCk7dGhpcy5fYWN0aXZlUnVuS2V5PWI7dGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl9LHVwZGF0ZU51bURldmljZXMoYil7bnVsbCE9dGhpcy5fYWN0aXZlUnVuS2V5JiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbdGhpcy5fYWN0aXZlUnVuS2V5XT1iLHRoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpKX0sc2V0U29sZUFjdGl2ZVN0YXR1cygpe3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSxfcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl7dGhpcy5fY2xlYXJUYWJsZSgpO3RoaXMuX3JlbmRlckhlYWRlcigpO2xldCBiO2Zvcihjb25zdCBmIGluIHRoaXMuX3J1bktleTJDb3VudClpZih0aGlzLl9ydW5LZXkyQ291bnQuaGFzT3duUHJvcGVydHkoZikpe3ZhciBkPUpTT04ucGFyc2UoZik7KGQ9dGhpcy5fcmVuZGVyUm93KGQsdGhpcy5fcnVuS2V5Mk51bURldmljZXNbZl0sdGhpcy5fcnVuS2V5MkNvdW50W2ZdLHRoaXMuX2FjdGl2ZVJ1bktleT09PWYsdGhpcy5zb2xlQWN0aXZlKSkmJgooYj1kKX1iJiYoUG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5wYXJlbnROb2RlLnBhcmVudE5vZGUuc2Nyb2xsVG9wPWIub2Zmc2V0VG9wKX0sX2NsZWFyVGFibGUoKXtjb25zdCBiPXRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhZGVyKCl7Y29uc3QgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtkLnRleHRDb250ZW50PSJGZWVkcyI7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2YudGV4dENvbnRlbnQ9IkZldGNoZXMiO2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtoLnRleHRDb250ZW50PSJUYXJnZXRzIjtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ay50ZXh0Q29udGVudD0iIyhEZXZpY2VzKSI7Y29uc3Qgcj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtyLnRleHRDb250ZW50PSJDb3VudCI7Yi5hcHBlbmRDaGlsZChkKTtiLmFwcGVuZENoaWxkKGYpO2IuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChrKTtiLmFwcGVuZENoaWxkKHIpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkuYXBwZW5kQ2hpbGQoYil9LF9yZW5kZXJSb3coYixkLGYsaCxrKXtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbD10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGIuZmVlZHMpLHA9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZldGNoZXMpO2I9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLnRhcmdldHMpO2NvbnN0IG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTttLnRleHRDb250ZW50PWQ7ZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2QudGV4dENvbnRlbnQ9ZjtyLmFwcGVuZENoaWxkKGwpO3IuYXBwZW5kQ2hpbGQocCk7CnIuYXBwZW5kQ2hpbGQoYik7ci5hcHBlbmRDaGlsZChtKTtyLmFwcGVuZENoaWxkKGQpO2gmJihrP3Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIik6ci5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYWN0aXZlLXNlc3Npb24tcnVuIikpO1BvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkuYXBwZW5kQ2hpbGQocik7aWYoaClyZXR1cm4gcn0sX3JlbmRlckdyYXBoRWxlbWVudHMoYil7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO18uZm9yRWFjaChiLGY9Pntjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2gudGV4dENvbnRlbnQ9ZjtoLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJub2RlLW9yLXRlbnNvci1lbGVtZW50Iik7aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt0aGlzLm5vZGVPclRlbnNvckNsaWNrZWQoZil9KTtkLmFwcGVuZENoaWxkKGgpfSk7cmV0dXJuIGR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNvdXJjZS1jb2RlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc291cmNlLWNvZGUtdmlldyIscHJvcGVydGllczp7cmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vbGRGb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxkZWJ1Z1dhdGNoZXM6e3R5cGU6QXJyYXksdmFsdWU6W119LG5vZGVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGNvbnRpbnVlVG9Ob2RlOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LF9oaWdobGlnaHRlZEVsZW1lbnRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfZmlsZVBhdGhTZWxlY3RlZDpOdW1iZXIsX2Z1bGxGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX3Nob3J0RmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9maWxlTGluZXM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX25vZGVOYW1lMkRldmljZU5hbWU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LApfbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJOb2RlRWxlbWVudHM6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZnVsbFN0YWNrU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2Z1bGxTdGFja05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcmVuZGVyRGVsYXlNaWxsaXM6e3R5cGU6TnVtYmVyLHZhbHVlOjUwLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckZpbGUoX2ZpbGVQYXRoU2VsZWN0ZWQpIiwiX2ZvY3VzT25Ob2RlKGZvY3VzTm9kZU5hbWUpIl0scmVuZGVyKGIpe251bGwhPWImJnRoaXMuc2V0KCJfZGVidWdXYXRjaGVzIixiKTt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToicGF0aHMifSkudGhlbihkPT4Ke3RoaXMuc2V0KCJfZnVsbEZpbGVQYXRocyIsZC5wYXRocyk7Y29uc3QgZj1kLnBhdGhzLm1hcChoPT4oe2lkOmgsbmFtZTp0aGlzLl9zaG9ydGVuUGF0aChoLGQucGF0aHMpfSkpO3RoaXMuc2V0KCJfc2hvcnRGaWxlUGF0aHMiLGYpOzA8Zi5sZW5ndGgmJnRoaXMuc2V0KCJfZmlsZVBhdGhTZWxlY3RlZCIsMCl9KX0sX3Nob3J0ZW5QYXRoKGIpe2I9Yi5yZXBsYWNlKC9cXC9nLCIvIik7Yj1iLnNwbGl0KCIvIik7cmV0dXJuIGJbYi5sZW5ndGgtMV19LF9yZW5kZXJGaWxlKGIpe2lmKG51bGwhPWIpe3ZhciBkPXRoaXMuX3Nob3J0RmlsZVBhdGhzW2JdLmlkO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJjb250ZW50IixmaWxlX3BhdGg6ZH0pLnRoZW4oZj0+e2NvbnN0IGg9W10saz1mLmNvbnRlbnRbZF0scj1mLmxpbmVub190b19vcF9uYW1lX2FuZF9zdGFja19wb3M7Zj17fTtmb3IodmFyIGwgaW4gcilyLmhhc093blByb3BlcnR5KGwpJiYoZltsXT1yW2xdLmxlbmd0aCk7CnRoaXMuX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMocik7Zm9yKGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgbT1sKzE7aC5wdXNoKHtsaW5lbm86bSxudW1Ob2RlczpudWxsIT1yW21dP1N0cmluZyhyW21dLmxlbmd0aCkrIi8iK1N0cmluZyhmW21dKSsiIFx1MjViYyI6IiIsdGV4dDp0aGlzLl9odG1sRXNjYXBlKGtbbF0pfSl9dGhpcy5zZXQoIl9maWxlTGluZXMiLGgpO2NvbnN0IHA9dGhpcztzZXRUaW1lb3V0KCgpPT57Y29uc3QgbT17fSxuPXt9O2Zvcihjb25zdCB1IGluIHIpe2lmKCFyLmhhc093blByb3BlcnR5KHUpKWNvbnRpbnVlO2Zvcih2YXIgcT1wLiQkKCIjc291cmNlLWxpbmUtbm9kZXMtIit1KTtxLmZpcnN0Q2hpbGQ7KXEucmVtb3ZlQ2hpbGQocS5maXJzdENoaWxkKTtjb25zdCB3PXJbdV07dy5zb3J0KGZ1bmN0aW9uKEEseSl7cmV0dXJuIEFbMF08eVswXT8tMTpBWzBdPnlbMF0/MTowfSk7Zm9yKGxldCBBPTA7QTx3Lmxlbmd0aDsrK0Epe2NvbnN0IHk9CndbQV1bMF0seD13W0FdWzFdLEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Ry5zZXRBdHRyaWJ1dGUoImNsYXNzIiwic291cmNlLWxpbmUtbm9kZS1lbnR0cnkiKTtHLnNldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIix1KTtHLnRleHRDb250ZW50PXk7Ry5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5ub2RlQ2xpY2tlZCh0aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLHRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldLCEwKX0pO2NvbnN0IEQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtELnNldEF0dHJpYnV0ZSgiaWNvbiIsImZpbHRlci1saXN0Iik7RC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiU2hvdyBzdGFjayIpO0QuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyh5KTt0aGlzLnNldCgiX2Z1bGxTdGFja05vZGVOYW1lIiwKeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITApO3RoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKHksdGhpcy5fZnVsbEZpbGVQYXRoc1t0aGlzLl9maWxlUGF0aFNlbGVjdGVkXSxOdW1iZXIodSkpfSk7Y29uc3QgQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Iuc2V0QXR0cmlidXRlKCJpY29uIiwiZm9yd2FyZCIpO0Iuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkNvbnRpbnVlIHRvIik7Qi5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5ub2RlQ2xpY2tlZCh0aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLHRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3ldLCEwKTtjb25zdCBIPXRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbeV0sSz10aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XTt0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsRyk7dGhpcy5jb250aW51ZVRvTm9kZShILApLKX0pO0MuYXBwZW5kQ2hpbGQoRCk7Qy5hcHBlbmRDaGlsZChCKTtDLmFwcGVuZENoaWxkKEcpO3EuYXBwZW5kQ2hpbGQoQyk7bS5oYXNPd25Qcm9wZXJ0eSh5KXx8KG1beV09W10pO21beV0ucHVzaChHKTtuLmhhc093blByb3BlcnR5KHkpfHwoblt5XT1bRyx4XSk7eD5uW3ldWzFdJiYoblt5XT1bRyx4XSl9cS5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApO3E9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLSIrdSk7bnVsbD09cS5nZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IikmJihxLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntwLl90b2dnbGVMaW5lTm9kZXMoTnVtYmVyKHUpKX0pLHEuc2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIsITApKX1wLnNldCgiX25vZGVOYW1lMk5vZGVFbGVtZW50cyIsbSk7Zm9yKGNvbnN0IHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYoblt1XT1uW3VdWzBdKTtwLnNldCgiX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQiLApuKX0sdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSl9fSxfdG9nZ2xlTGluZU5vZGVzKGIsZD0hMSl7Yj10aGlzLiQkKCIjc291cmNlLWxpbmUtbm9kZXMtIitiKTtudWxsPT1iLmdldEF0dHJpYnV0ZSgiaGlkZGVuIikmJiEwIT09ZD9iLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk6Yi5yZW1vdmVBdHRyaWJ1dGUoImhpZGRlbiIpfSxfZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyhiKXtjb25zdCBkPXRoaXMuZGVidWdXYXRjaGVzLm1hcChrPT5LaC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oay5ub2RlX25hbWUpKSxmPXt9LGg9e307Zm9yKGNvbnN0IGsgb2YgdGhpcy5kZWJ1Z1dhdGNoZXMpe2NvbnN0IHI9S2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKTtmW3JdPWsuZGV2aWNlX25hbWU7aFtyXT1rLm5vZGVfbmFtZX10aGlzLnNldCgiX25vZGVOYW1lMkRldmljZU5hbWUiLGYpO3RoaXMuc2V0KCJfbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWUiLApoKTtmb3IoY29uc3QgayBpbiBiKWIuaGFzT3duUHJvcGVydHkoaykmJihiW2tdPWJba10uZmlsdGVyKHI9Pl8uaW5jbHVkZXMoZCxyWzBdKSkpfSxfcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoYil7Y29uc3QgZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvc291cmNlX2NvZGUiKTtiPWRjLmFkZFBhcmFtcyhkLGIpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYil9LF9odG1sRXNjYXBlKGIpe3JldHVybiBiLnJlcGxhY2UoLyAvZywiXHUwMGEwIil9LF9mb2N1c09uTm9kZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1t0aGlzLl9maWxlUGF0aFNlbGVjdGVkXS5pZCxmPXRoaXM7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6Im9wX3RyYWNlYmFjayIsb3BfbmFtZTpifSkudGhlbihoPT57Y29uc3Qgaz1oLm9wX3RyYWNlYmFja1tiXTtoPVtdO2ZvcihsZXQgbD0wO2w8ay5sZW5ndGg7KytsKXtjb25zdCBwPQprW2xdWzFdO2tbbF1bMF09PT1kJiZoLnB1c2gocCl9Zm9yKHZhciByIG9mIGYuX2hpZ2hsaWdodGVkRWxlbWVudHMpci5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpO3I9W107Zm9yKGNvbnN0IGwgb2YgaCloPXRoaXMuJCQoIiNzb3VyY2UtbGluZS0iK2wpLHIucHVzaChoKSxoLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIiksZi5fdG9nZ2xlTGluZU5vZGVzKGwsITApO2Yuc2V0KCJfaGlnaGxpZ2h0ZWRFbGVtZW50cyIscik7dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpfSl9fSxfaGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpe2lmKG51bGwhPXRoaXMuX29sZEZvY3VzTm9kZU5hbWUpZm9yKGNvbnN0IGQgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW3RoaXMuX29sZEZvY3VzTm9kZU5hbWVdKWQuc3R5bGVbImZvbnQtd2VpZ2h0Il09Im5vcm1hbCI7Zm9yKGNvbnN0IGQgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2JdKWQuc3R5bGVbImZvbnQtd2VpZ2h0Il09CiJib2xkIjtudWxsPT10aGlzLl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ/dGhpcy5fbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk6dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLG51bGwpO3RoaXMuc2V0KCJfb2xkRm9jdXNOb2RlTmFtZSIsYil9LF9wb3B1bGF0ZUZ1bGxTdGFjayhiLGQsZil7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6Im9wX3RyYWNlYmFjayIsb3BfbmFtZTpifSkudGhlbihoPT57Y29uc3Qgaz10aGlzLiQkKCIjZnVsbC1zdGFjay1jb250ZW50Iik7Zm9yKDtrLmZpcnN0Q2hpbGQ7KWsucmVtb3ZlQ2hpbGQoay5maXJzdENoaWxkKTtmb3IoY29uc3QgciBvZiBoLm9wX3RyYWNlYmFja1tiXSl7Y29uc3QgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpLHA9clswXSxtPU51bWJlcihyWzFdKTtsLnRleHRDb250ZW50PQpwKyI6ICIrU3RyaW5nKG0pO18uaW5jbHVkZXModGhpcy5fZnVsbEZpbGVQYXRocyxwKT8obC5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1jbGlja2FibGUiKSxsLnN0eWxlLmNvbG9yPSJibHVlIixsLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixsLnN0eWxlLmN1cnNvcj0icG9pbnRlciIscD09PWQmJm09PT1mJiYobC5zdHlsZVsiZm9udC13ZWlnaHQiXT0iYm9sZCIpLGwuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMuc2V0KCJfZmlsZVBhdGhTZWxlY3RlZCIsdGhpcy5fZnVsbEZpbGVQYXRocy5pbmRleE9mKHApKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5fdG9nZ2xlTGluZU5vZGVzKG0sITApO2Zvcihjb25zdCBuIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlOdW1iZXIobi5nZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIpKT09PU51bWJlcihtKSYmKG4uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pLAp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbCksdGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKGIpLGQ9PT1wJiZmPT09bXx8dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soYixwLG0pKX0sMip0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KSk6KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtbm9uY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iIzU1NSIpO2suYXBwZW5kQ2hpbGQobCl9fSl9LF9jbG9zZUZ1bGxTdGFja0RpYWxvZygpe3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCExKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLWRhdGEtc3VtbWFyeS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Iixwcm9wZXJ0aWVzOntsYXRlc3RUZW5zb3JEYXRhOk9iamVjdCxleHBhbmRIYW5kbGVyOk9iamVjdCxjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24saGlnaGxpZ2h0ZWROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGVuc29yTmFtZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaGVhbHRoUGlsbHNFbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAsbm90aWZ5OiEwfSxfd2F0Y2hLZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfd2F0Y2hLZXkyRGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJFeHBhbmRIYW5kbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlZhbHVlU2hvcnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyUm93Ont0eXBlOk9iamVjdCwKdmFsdWU6e319LF9hY3RpdmVXYXRjaEtleTpTdHJpbmcsX2hlYWx0aFBpbGxXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRvbmx5OiEwfSxfaGVhbHRoUGlsbEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MzIscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyTGF0ZXN0KGxhdGVzdFRlbnNvckRhdGEsIGV4cGFuZEhhbmRsZXIpIiwiX2hpZ2hsaWdodChoaWdobGlnaHRlZE5vZGVOYW1lKSJdLGxpc3RlbmVyczp7InNob3ctaGVhbHRoLXBpbGxzLmNoYW5nZSI6Il9zaG93SGVhbHRoUGlsbHNDaGFuZ2VkIn0scmVhZHkoKXt0aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl9LGVuYWJsZUhlYWx0aFBpbGxzKCl7dGhpcy5zZXQoIl9oZWFsdGhQaWxsc0VuYWJsZWQiLCEwKTt0aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl9LF9zaG93SGVhbHRoUGlsbHNDaGFuZ2VkKCl7dGhpcy5faGVhbHRoUGlsbHNFbmFibGVkP3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKToKdGhpcy5fY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCk7dGhpcy5fcmVuZGVyQWxsKCl9LF9yZW5kZXJBbGwoKXt0aGlzLl9jbGVhclRlbnNvckRhdGFUYWJsZSgpO2Zvcihjb25zdCBiIG9mIHRoaXMuX3dhdGNoS2V5cyl0aGlzLl9yZW5kZXJMYXRlc3QodGhpcy5fd2F0Y2hLZXkyRGF0YVtiXSx0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdKX0sX3RlbnNvckRhdGEyV2F0Y2hLZXkoYil7cmV0dXJuIGIuZGV2aWNlTmFtZSsiLyIrYi50ZW5zb3JOYW1lKyI6IitiLmRlYnVnT3B9LF9yZW5kZXJMYXRlc3QoYixkKXtpZihiKXt2YXIgZj10aGlzLl90ZW5zb3JEYXRhMldhdGNoS2V5KGIpLGg9bnVsbDsiVW5pbml0aWFsaXplZCIhPT1iLmR0eXBlJiYiVW5zdXBwb3J0ZWQiIT09Yi5kdHlwZSYmKGg9KCk9PmQoYikpO3ZhciBrPW51bGwhPWIudmFsdWU/SlNPTi5zdHJpbmdpZnkoYi52YWx1ZSwocixsKT0+bC50b0ZpeGVkP051bWJlcihsLnRvRml4ZWQoMykpOmwpOiIoQ2xpY2sgdG8gdmlldykiOwp0aGlzLl93YXRjaEtleTJEYXRhW2ZdPWI7LTE9PT10aGlzLl93YXRjaEtleXMuaW5kZXhPZihmKT8odGhpcy5fd2F0Y2hLZXlzLnB1c2goZiksdGhpcy5fd2F0Y2hLZXkyQ291bnRbZl09MSk6dGhpcy5fd2F0Y2hLZXkyQ291bnRbZl0rPTE7dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltmXT1oO3RoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbZl09azt0aGlzLl9hY3RpdmVXYXRjaEtleT1mO3RoaXMuX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCk7dGhpcy5fcmVuZGVyUm93KGYpfX0sX2NsZWFyVGVuc29yRGF0YVRhYmxlKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShiKSYmKHRoaXMuX3dhdGNoS2V5MlJvd1tiXS5yZW1vdmUoKSxkZWxldGUgdGhpcy5fd2F0Y2hLZXkyUm93W2JdKX0sX2NsZWFyVGVuc29yRGF0YVJvdyhiKXtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSwKX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpe2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9LF9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCl7dGhpcy5fY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCk7Y29uc3QgYj10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC50ZXh0Q29udGVudD0iTGVnZW5kOiI7Yi5hcHBlbmRDaGlsZChkKTtkLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC41ZW0iO2Quc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjtmb3IoZD0wO2Q8dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXMubGVuZ3RoOysrZCl7Y29uc3QgZj10Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllc1tkXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIjsKaC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuMjVlbSI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7ay50ZXh0Q29udGVudD0iXHUyNWEwIjtrLnN0eWxlLmNvbG9yPWYuYmFja2dyb3VuZF9jb2xvcjtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLnRleHRDb250ZW50PWYubGFiZWw7ci5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7aC5hcHBlbmRDaGlsZChrKTtoLmFwcGVuZENoaWxkKHIpO2IuYXBwZW5kQ2hpbGQoaCl9fSxfcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKXtmb3IoY29uc3QgYiBpbiB0aGlzLl93YXRjaEtleTJSb3cpe2lmKCF0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikpY29udGludWU7Y29uc3QgZD10aGlzLl93YXRjaEtleTJSb3dbYl07UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlLXRlbnNvciIpO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIil9fSwKX3JlbmRlclJvdyhiKXtsZXQgZCxmPSExO251bGwhPXRoaXMuX3dhdGNoS2V5MlJvd1tiXT8oZD10aGlzLl93YXRjaEtleTJSb3dbYl0sdGhpcy5fY2xlYXJUZW5zb3JEYXRhUm93KGQpLGY9ITEpOihkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksZj0hMCk7Y29uc3QgaD10aGlzLl93YXRjaEtleTJEYXRhW2JdLmRldmljZU5hbWUsaz10aGlzLl93YXRjaEtleTJEYXRhW2JdLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUscj1oKyIvIitrO3ZhciBsPXRoaXMuX3dhdGNoS2V5MkNvdW50W2JdLHA9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS50ZW5zb3JOYW1lLG09dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZWJ1Z09wLG49dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtiXTtjb25zdCBxPXRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYl0sdT1iPT09dGhpcy5fYWN0aXZlV2F0Y2hLZXksdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKHcpLmNsYXNzTGlzdC5hZGQoInRlbnNvci1uYW1lIik7Cncuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiO3cuc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt3LnRleHRDb250ZW50PXA7dy5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57bnVsbCE9dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZCYmdGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChoLGspfSk7Y29uc3QgQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0EudGV4dENvbnRlbnQ9bDtjb25zdCB5PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZHR5cGU7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2NvbnN0IHg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5zaGFwZTtsLnRleHRDb250ZW50PXk7Y29uc3QgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0MudGV4dENvbnRlbnQ9SlNPTi5zdHJpbmdpZnkoeCk7Y29uc3QgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO0cudGV4dENvbnRlbnQ9bjtQb2x5bWVyLmRvbShHKS5jbGFzc0xpc3QuYWRkKCJ2YWx1ZS1leHBhbnNpb24tbGluayIpOwpudWxsIT1xJiYoRy5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHEsITEpLEcuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLEcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bj1udWxsO249dGhpcy5faGVhbHRoUGlsbHNFbmFibGVkP3RoaXMuX3JlbmRlckhlYWx0aFBpbGwocCsiOiIrbSx7ZGV2aWNlX25hbWU6aCxub2RlX25hbWU6ayxkdHlwZTp5LHNoYXBlOngsdmFsdWU6bnVsbH0scSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO20uc2V0QXR0cmlidXRlKCJpY29uIiwiZm9yd2FyZCIpO20uc2V0QXR0cmlidXRlKCJ0aXRsZSIsIkNvbnRpbnVlIHRvIik7bS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt0aGlzLmNvbnRpbnVlVG9DYWxsYmFjayhoLGspfSk7cC5hcHBlbmRDaGlsZChtKTtkLmFwcGVuZENoaWxkKHcpOwpkLmFwcGVuZENoaWxkKEEpO2QuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChDKTtkLmFwcGVuZENoaWxkKEcpO2QuYXBwZW5kQ2hpbGQobik7ZC5hcHBlbmRDaGlsZChwKTtkLnNldEF0dHJpYnV0ZSgibm9kZU5hbWVXaXRoRGV2aWNlIixyKTt1JiYoUG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlLXRlbnNvciIpLFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIikpO3RoaXMuX3dhdGNoS2V5MlJvd1tiXT1kO2YmJlBvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSB0Ym9keSIpKS5hcHBlbmRDaGlsZChkKTtkLnNjcm9sbEludG9WaWV3KHtibG9jazoiZW5kIixpbmxpbmU6Im5lYXJlc3QiLGJlaGF2aW91cjoic21vb3RoIn0pfSxfcmVuZGVySGVhbHRoUGlsbChiLGQsZil7Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKGgpLmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsIik7Cm51bGwhPWYmJmguYWRkRXZlbnRMaXN0ZW5lcigidGFwIixmLCExKTtmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJzdmciKTtmLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2hlYWx0aFBpbGxXaWR0aCk7Zi5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5faGVhbHRoUGlsbEhlaWdodCk7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwiZyIpO2YuYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZChmKTtjb25zdCByPSJ0ZHAvIitiO3RoaXMuZ2V0SGVhbHRoUGlsbChiLGQuZGV2aWNlX25hbWUsZC5ub2RlX25hbWUsbD0+e251bGw9PWw/KGgudGV4dENvbnRlbnQ9Ik4vQSIsaC5zdHlsZS5jb2xvcj0iZ3JheSIpOihkLnZhbHVlPWwsdGYuZ3JhcGguc2NlbmUuYWRkSGVhbHRoUGlsbChrLGQsbnVsbCxyLHRoaXMuX2hlYWx0aFBpbGxXaWR0aCx0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LwoyLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvMiwwKSl9KTtyZXR1cm4gaH0sX2hpZ2hsaWdodChiKXtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUiKSk7Y29uc3QgZD1bXTtmb3IoY29uc3QgZiBpbiB0aGlzLl93YXRjaEtleTJSb3cpe2lmKCF0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoZikpY29udGludWU7Y29uc3QgaD10aGlzLl93YXRjaEtleTJSb3dbZl07bnVsbCE9aC5nZXRBdHRyaWJ1dGUmJihoLmdldEF0dHJpYnV0ZSgibm9kZU5hbWVXaXRoRGV2aWNlIik9PT1iP2QucHVzaChoKTpQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpKX1pZihudWxsIT1iKWZvcihiPTA7YjxkLmxlbmd0aDsrK2IpUG9seW1lci5kb20oZFtiXSkuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSxkW2JdLnNjcm9sbEludG9WaWV3KHtibG9jazoiZW5kIixpbmxpbmU6Im5lYXJlc3QiLGJlaGF2aW91cjoic21vb3RoIn0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKTtkLmNvbW1pdENoYW5nZXMoKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBXYihmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHI9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT1yLmluZGV4T2YobSk/cCs9YCR7bFtyLmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHI9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHIsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHtyfWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCByPTA7cjxoLmxlbmd0aDsrK3Ipay54LnB1c2gocisxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIGRjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKEtofHwoS2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgYWw9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsYmw9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsY2w9KGFsKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyBkYy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpiZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOmNsfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0LHJlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LG9ic2VydmVyczpbIl9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUpIiwiX3NpemVEYXNoYm9hcmRSZWdpb25zKF9sZWZ0UGFuZVdpZHRoLCBfdG9wUmlnaHRRdWFkcmFudEhlaWdodCwgX3dpbmRvd1dpZHRoKSIsCiJfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoX2dyYXBoUHJvZ3Jlc3MpIl0scmVhZHkoKXt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxsb25nX3BvbGwoKXtjb25zdCBiPXtwb3M6Kyt0aGlzLl9sb25nUG9sbENvdW50fTtsZXQgZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvY29tbSIpO2Q9ZGMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9Pntjb25zdCBoPWYudHlwZTtmPWYuZGF0YTtpZigibWV0YSI9PT1oKXt2YXIgaz1mLnJ1bl9rZXkscj1rWzBdLnNwbGl0KCIsIiksbD1rWzFdLnNwbGl0KCIsIik7Y29uc3QgbT1rWzJdLnNwbGl0KCIsIik7dmFyIHA9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5LZXkiLAprKTt0aGlzLnNldCgiX2xhdGVzdFNlc3Npb25SdW4iLHtmZWVkczpyLGZldGNoZXM6bCx0YXJnZXRzOm19KTt0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMCk7dm9pZCAwPT09dGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT8odGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXT1bXSx0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIixbXSkpOnRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNba10pO3RoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbz1yPSJGZWVkczogIityKyI7IEZldGNoZXM6ICIrbCsiOyBUYXJnZXRzOiAiK207dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzLmhhc093blByb3BlcnR5KHIpP3RoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1tyXSs9MTp0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnNbcl09MTt0aGlzLl9zZXNzaW9uUnVuVG90YWxDb3VudGVyKys7CnRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCk7dGhpcy5fY29udGludWVUb1R5cGUmJl8uaXNFcXVhbChwLGspfHwodGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGssITEpLHRoaXMuX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpKX1lbHNlInRlbnNvciI9PT1oPyhrPWYuZGV2aWNlX25hbWUscD1mLm5vZGVfbmFtZSxyPWYubWF5YmVfYmFzZV9leHBhbmRlZF9ub2RlX25hbWUsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9az90aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGspOiF0aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJih0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGssciksdGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixrKyIvIityKSksdGhpcy5zZXQoIl9zZXNzaW9uUnVuU29sZUFjdGl2ZSIsITEpLGw9cCsiOiIrZi5vdXRwdXRfc2xvdCx0aGlzLnNldCgiX2xhdGVzdFRlbnNvckRhdGEiLAp7ZGV2aWNlTmFtZTprLHRlbnNvck5hbWU6bCxub2RlTmFtZTpwLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6cixkZWJ1Z09wOmYuZGVidWdfb3AsZHR5cGU6Zi5kdHlwZSxzaGFwZTpmLnNoYXBlLHZhbHVlOmYudmFsdWVzfSksdGhpcy5fbWF5YmVVcGRhdGVUZW5zb3JWYWx1ZVZpZXdzKGwsZi5kZWJ1Z19vcCksdGhpcy5zZXQoIl9idXN5IiwhMSkpOmNvbnNvbGUuZXJyb3IoIkludmFsaWQgbG9uZy1wb2xsaW5nIHJlc3BvbnNlIHR5cGU6ICIsaCk7bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJnRoaXMuX3Byb2Nlc3NDb250aW51ZVRvKGgsZik7dGhpcy5sb25nX3BvbGwoKX0pfSxfcHJvY2Vzc0NvbnRpbnVlVG8oYixkKXt0aGlzLl9jb250aW51ZVN0b3A/dGhpcy5fY2xlYXJDb250aW51ZVRvKCk6IlNlc3Npb25SdW4iPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKCJtZXRhIj09PWIpOiJUZW5zb3JDb25kaXRpb24iPT09CnRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3N0ZXAoKToib3AiPT09dGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG9PcCgibWV0YSI9PT1iLGQpOm51bGwhPXRoaXMuX2NvbnRpbnVlVG9UeXBlJiYiIiE9PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIF9jb250aW51ZVRvVHlwZToiLHRoaXMuX2NvbnRpbnVlVG9UeXBlKX0sX3Byb2Nlc3NDb250aW51ZVRvU2Vzc2lvblJ1bihiKXtiJiZ0aGlzLnNldCgiX2NvbnRpbnVlVG9Db3VudGVyIix0aGlzLl9jb250aW51ZVRvQ291bnRlcisxKTt0aGlzLl9jb250aW51ZVRvQ291bnRlcjx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD90aGlzLl9zdGVwKCk6dGhpcy5fY2xlYXJDb250aW51ZVRvKCl9LF9wcm9jZXNzQ29udGludWVUb09wKGIsZCl7YiYmdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCk7Yj1kLmRldmljZV9uYW1lO2Q9ZC5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZTsKY29uc3QgZj1udWxsPT1kP251bGw6S2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpO2IrIi8iK2Q9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0fHxiKyIvIitmPT09dGhpcy5fY29udGludWVUb1RhcmdldD8odGhpcy5fY2xlYXJDb250aW51ZVRvKCksdGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGYpKTp0aGlzLl9zdGVwKCl9LF9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MoYixkKXtjb25zdCBmPXRoaXMuJCQoIiN0ZW5zb3JWYWx1ZU11bHRpVmlldyIpO2lmKG51bGwhPWYpe3ZhciBoPSExO18uZm9yRWFjaChmLmdldFZpZXdzKCksaz0+e2lmKGsudGVuc29yTmFtZT09PWImJmsuZGVidWdPcD09PWQpcmV0dXJuIGg9ITAsITF9KTtoJiZmLnJlbmRlclRlbnNvclZhbHVlcygpfX0scmVsb2FkKCl7aWYoIXRoaXMuYWxyZWFkeVN0YXJ0ZWQpe3RoaXMuc2V0KCJhbHJlYWR5U3RhcnRlZCIsITApO3ZhciBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsCiIvZGVidWdnZXJfZ3JwY19ob3N0X3BvcnQiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+ezA8ZC5wb3J0Pyh0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuRGlhbG9nKGQuaG9zdCxkLnBvcnQpLHRoaXMubG9uZ19wb2xsKCkpOnRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaXNhYmxlZERpYWxvZygpfSl9fSxfc2hvd1NvdXJjZUNvZGVDaGFuZ2VkKCl7dGhpcy5fc291cmNlQ29kZVNob3duPyh0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI0MCUiLHRoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoKSk6dGhpcy4kJCgiI25vZGUtZW50cmllcyIpLnN0eWxlLmhlaWdodD0iODAlIn0sX3Nob3dUb2FzdChiKXt0aGlzLiQudG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudG9hc3Qub3BlbigpfSxfYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCl7dGhpcy5fc2hvd1RvYXN0KCJTZXNzaW9uLnJ1bigpICMiK3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrCiIgaXMgc3RhcnRpbmcuIil9LF9kaXNwbGF5R3JhcGgoYixkKXtiPXtydW5fa2V5OkpTT04uc3RyaW5naWZ5KGIpLGRldmljZV9uYW1lOmR9O2I9ZGMuYWRkUGFyYW1zKCIvZGF0YS9wbHVnaW4vZGVidWdnZXIvZGVidWdnZXJfZ3JhcGgiLGIpO3RoaXMuJC5sb2FkZXIuZGF0YXNldHM9W3tuYW1lOiIvZGVidWdnZXJfZ3JhcGgiLHBhdGg6Yn1dO3RoaXMuJC5sb2FkZXIuc2V0KCJzZWxlY3RlZERhdGFzZXQiLDApfSxfcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsZCl7ZD9jb25zb2xlLmxvZygiUG9sbGluZyBmb3IgZmlyc3QgR3JhcGhEZWYgZm9yIHJ1biBrZXk6IixiKTp0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLG51bGwpO3ZhciBmPXttb2RlOiJyZXRyaWV2ZV9hbGwiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYil9O2NvbnN0IGg9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtmPWRjLmFkZFBhcmFtcyhoLApmKTtsZXQgaz1bXTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4ocj0+e2lmKDA9PXIuZGV2aWNlX25hbWVzLmxlbmd0aClkfHx0aGlzLl9zdGVwKCksdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKGIsITApO2Vsc2V7dmFyIGw9bnVsbDtmb3IoY29uc3QgcCBpbiByLmdhdGVkX2dycGNfdGVuc29ycylpZihyLmdhdGVkX2dycGNfdGVuc29ycy5oYXNPd25Qcm9wZXJ0eShwKSl7LTE9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLmluZGV4T2YocCkmJih0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnB1c2gocCksdGhpcy4kLnNlc3Npb25SdW5zVmlldy51cGRhdGVOdW1EZXZpY2VzKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ubGVuZ3RoKSk7dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5zbGljZSgpKTtsPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzW3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aC0KMV07Y29uc3QgbT1yLmdhdGVkX2dycGNfdGVuc29yc1twXTtmb3IobGV0IG49MDtuPG0ubGVuZ3RoOysrbilrLnB1c2goe2RldmljZV9uYW1lOnAsbm9kZV9uYW1lOm1bbl1bMF0sb3BfdHlwZTptW25dWzFdLG91dHB1dF9zbG90Om1bbl1bMl0sZGVidWdfb3A6bVtuXVszXX0pfW51bGwhPWwmJih0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGwpLHI9UG9seW1lci5kb20odGhpcy4kJCgiI2FjdGl2ZS1ydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIikpLG51bGwhPXImJnIuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsbCkpO0toLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzKGspO3RoaXMuc2V0KCJfZGVidWdXYXRjaGVzIixrKTt0aGlzLiQuc291cmNlQ29kZVZpZXcucmVuZGVyKGspfX0pfSxfY3JlYXRlRGVidWdXYXRjaENoYW5nZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e2Q9ZD8iYnJlYWsiOiJkaXNhYmxlIjt0aGlzLl9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKEtoLmdldENsZWFuTm9kZU5hbWUoYi5kZXZpY2VfbmFtZSsKIi8iK2Iubm9kZV9uYW1lKSxiLm91dHB1dF9zbG90LGIuZGVidWdfb3AsZCl9fSxfZm9jdXNPbkdyYXBoTm9kZShiLGQpe251bGwhPWImJnRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUhPT1iJiZ0aGlzLnNldCgiX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUiLGIpO3RoaXMuX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCk7Y29uc3QgZj10aGlzLiQkKCIjZ3JhcGgiKTtpZihmLnNlbGVjdGVkTm9kZT09PWQpZi5wYW5Ub05vZGUoZCk7ZWxzZXtjb25zdCBoPWYuZ2V0KCJyZW5kZXJIaWVyYXJjaHkiKS5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO251bGw9PWhbZF0mJihkPUtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7bnVsbCE9aFtkXSYmZi5zZXQoInNlbGVjdGVkTm9kZSIsZCl9dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsYisiLyIrZCl9LF9jcmVhdGVOb2RlQ2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4oYixkLGYpPT57dGhpcy5fc291cmNlQ29kZVNob3duJiYKITAhPT1mJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKXtyZXR1cm4gYj0+e2xldCBkPWI7LTEhPT1kLmluZGV4T2YoIjoiKSYmKGQ9ZC5zbGljZSgwLGQuaW5kZXhPZigiOiIpKSk7Yj1fLmZpbmQodGhpcy5fZGVidWdXYXRjaGVzLGY9PmYubm9kZV9uYW1lPT09ZHx8MD09PWYubm9kZV9uYW1lLmluZGV4T2YoZCkmJiIoIj09PWYubm9kZV9uYW1lW2QubGVuZ3RoXSk7bnVsbD09Yj90aGlzLl9zaG93VG9hc3QoIk5vZGUgJyIrZCsiJyBpcyBub3QgaW4gdGhlIHJ1bnRpbWUgZ3JhcGggb2YgdGhlIGN1cnJlbnQgU2Vzc2lvbi5ydW4gb3IgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIG9wIGF0dGFjaGVkLiIpOnRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYi5kZXZpY2VfbmFtZSwKZCl9fSxfY3JlYXRlVGVuc29yRGF0YUV4cGFuZEhhbmRsZXIoKXtyZXR1cm4gYj0+e3RoaXMuX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKTtzZXRUaW1lb3V0KCgpPT57dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3IikuYWRkVmlldyh7dmlld0lkOnRoaXMuX2NyZWF0ZVRlbnNvclZpZXdJZCgpLGRldmljZU5hbWU6Yi5kZXZpY2VOYW1lLHRlbnNvck5hbWU6Yi50ZW5zb3JOYW1lLG5vZGVOYW1lOmIubm9kZU5hbWUsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpiLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUsZGVidWdPcDpiLmRlYnVnT3AsZHR5cGU6Yi5kdHlwZSxzaGFwZTpiLnNoYXBlLHNsaWNpbmc6S2guZ2V0RGVmYXVsdFNsaWNpbmcoYi5zaGFwZSksdGltZUluZGljZXM6Ii0xIn0pfSwxMCl9fSxfY3JlYXRlVGVuc29yVmlld0lkKCl7Y29uc3QgYj0iZGVidWdnZXItdGVuc29yLXZpZXctIit0aGlzLl90ZW5zb3JWaWV3SWRDb3VudGVyO3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXIrKzsKcmV0dXJuIGJ9LF9jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpe3JldHVyblt7dGl0bGU6KCk9PiJFeHBhbmQgYW5kIGhpZ2hsaWdodCIsYWN0aW9uOmI9Pntjb25zdCBkPUtoLmdldENsZWFuTm9kZU5hbWUoYi5ub2RlLm5hbWUpO2I9dGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsiLyIrYi5ub2RlLm5hbWU7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKTt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsS2gucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkFkZCBicmVha3BvaW50IixhY3Rpb246Yj0+e2NvbnN0IGQ9S2guZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUiLHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUrCiIvIitiLm5vZGUubmFtZSk7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihkKSl9fSx7dGl0bGU6KCk9PiJDb250aW51ZSB0byIsYWN0aW9uOmI9PnstMSE9PVsiX0FyZyIsIl9SZXR2YWwiXS5pbmRleE9mKGIubm9kZS5vcCk/dGhpcy5fc2hvd1RvYXN0KCdDYW5ub3QgY29udGludWUgdG8gbm9kZSAiJytiLm5vZGUubmFtZSsnIiwgZHVlIHRvIG9wIHR5cGUgIicrYi5ub2RlLm9wKyciLicpOnRoaXMuX2NvbnRpbnVlVG9Ob2RlKHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUsYi5ub2RlLm5hbWUpfX1dfSxfY3JlYXRlR2V0SGVhbHRoUGlsbCgpe3JldHVybihiLGQsZixoKT0+e3ZhciBrPXt3YXRjaF9rZXk6Yix0aW1lX2luZGljZXM6Ii0xIixtYXBwaW5nOiJoZWFsdGgtcGlsbCJ9O2NvbnN0IHI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi90ZW5zb3JfZGF0YSIpO2s9ZGMuYWRkUGFyYW1zKHIsayk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChrKS50aGVuKGw9PntsPWwudGVuc29yX2RhdGFbMF07aChsKTt0aGlzLl9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGwpfSl9fSxfY29uZGl0aW9uYWxIZWFsdGhQaWxsU3RvcChiLGQsZixoKXtpZigiVGVuc29yQ29uZGl0aW9uIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZLaC5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5KHRoaXMuX2NvbnRpbnVlVG9UYXJnZXQsaCx0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldCkpe3RoaXMuc2V0KCJfY29udGludWVTdG9wIiwhMCk7aD1LaC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGgpO3RoaXMuX2ZvY3VzT25HcmFwaE5vZGUoZCxmKTtjb25zdCBrPWQrIi8iK2Y7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIiwKayk7c2V0VGltZW91dCgoKT0+e3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLG51bGwpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGspfSwxMDApO3RoaXMuX3Nob3dUb2FzdCgnVGVuc29yIGNvbmRpdGlvbiAiJyt0aGlzLl9jb250aW51ZVRvVGFyZ2V0KyciIGlzIG1ldCBieSB3YXRjaCBrZXk6ICInK2IrJyIuXG5TdG9wcGluZyBjb250aW51YXRpb24uJyl9fSxfY29udGludWVUb05vZGUoYixkKXtjb25zdCBmPUtoLmdldENsZWFuTm9kZU5hbWUoZCk7Yj1iKyIvIitkO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoZiwwLCJEZWJ1Z0lkZW50aXR5IiwiYnJlYWsiKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsYik7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLEtoLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKSk7dGhpcy5fc2V0Q29udGludWVUbygib3AiLGIpOwp0aGlzLiQuY29udGludWVEaWFsb2cudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKTt0aGlzLl9zdGVwKCl9LF9jcmVhdGVDb250aW51ZVRvTm9kZUhhbmRsZXIoKXtyZXR1cm4oYixkKT0+e3RoaXMuX2NvbnRpbnVlVG9Ob2RlKGIsZCl9fSxfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKGIpe2NvbnN0IGQ9UG9seW1lci5kb20odGhpcy4kJCgiI3J1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSk7aWYoMDx0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgpe2xldCBmO2Y9YisoIiAoZGV2aWNlICIrKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmluZGV4T2YoYikrMSkrIiBvZiAiK3RoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCsiKSIpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZudWxsIT1kJiYoZC50ZXh0Q29udGVudD1mKX1lbHNlIHRoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiYKbnVsbCE9ZCYmKGQudGV4dENvbnRlbnQ9IldhaXRpbmcgZm9yIGRldmljZS4uLiIpO251bGwhPWImJnRoaXMuX2Rpc3BsYXlHcmFwaCh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LGIpfSxfc3RlcCgpe2lmKG51bGwhPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXkpe3RoaXMuc2V0KCJfYnVzeSIsITApO3ZhciBiPXttb2RlOiJyZXRyaWV2ZV9kZXZpY2VfbmFtZXMiLHJ1bl9rZXk6SlNPTi5zdHJpbmdpZnkodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl9LGQ9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTtiPWRjLmFkZFBhcmFtcyhkLGIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihmPT57bGV0IGg9ITE7Zm9yKGxldCBrPTA7azxmLmRldmljZV9uYW1lcy5sZW5ndGg7KytrKWlmKC0xPT09dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihmLmRldmljZV9uYW1lc1trXSkpe2g9ITA7YnJlYWt9Zj0KZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2FjayIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbigoKT0+e2gmJnRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5LCExKX0pfSl9fSxfY3JlYXRlU2Vzc2lvblJ1bkdvKCl7cmV0dXJuIGI9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJTZXNzaW9uUnVuIix0aGlzLl9jdXJyZW50U2Vzc2lvblJ1bkluZm8sYik7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZVRlbnNvckNvbmRpdGlvbkdvKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJUZW5zb3JDb25kaXRpb24iLGIsZCk7dGhpcy4kLnRlbnNvckRhdGFTdW1tYXJ5LmVuYWJsZUhlYWx0aFBpbGxzKCk7dGhpcy5fc3RlcCgpfX0sX2NyZWF0ZUZvcmNlQ29udGludWF0aW9uU3RvcCgpe3JldHVybigpPT57dGhpcy5fc2hvd1RvYXN0KCdDb250aW51YXRpb24gb2YgdHlwZSAiJyt0aGlzLl9jb250aW51ZVRvVHlwZSsKJyIgd2FzIGludGVycnVwdGVkIGJ5IHVzZXIuJyk7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKX19LF9zZXRDb250aW51ZVRvKGIsZCxmPS0xKXt0aGlzLl9jb250aW51ZVRvVHlwZT1iO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9ZDt0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD1mO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExfSxfY2xlYXJDb250aW51ZVRvKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKTt0aGlzLl9jb250aW51ZVRvVGFyZ2V0PXRoaXMuX2NvbnRpbnVlVG9UeXBlPSIiO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PS0xO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPTA7dGhpcy5fY29udGludWVTdG9wPSExO3RoaXMuc2V0KCJfYnVzeSIsITEpfSxfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCl7cmV0dXJuKGIsZCk9Pnt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYisiLyIrCmQpO3RoaXMuX3N0ZXAoKTt0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmdGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLGQpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYisiLyIrZCl9fSxfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQoYil7Yj10aGlzLl90b3BSaWdodFRhYnNbYl0uaWQ7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsInRhYi1ydW50aW1lLWdyYXBocyI9PT1iKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCJ0YWItdGVuc29yLXZhbHVlcyI9PT1iKX0sX3NldFRvcFJpZ2h0UnVudGltZUdyYXBoc1RvQWN0aXZlKCl7dGhpcy5zZXQoIl90b3BSaWdodFNlbGVjdGVkIiwiMCIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCEwKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCExKX0sX3NldFRvcFJpZ2h0VGVuc29yVmFsdWVzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLAoiMSIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCExKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRUZW5zb3JWYWx1ZXNBY3RpdmUiLCEwKX0sX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoYixkLGYsaCl7Yj17bW9kZToic2V0X3N0YXRlIixub2RlX25hbWU6YixvdXRwdXRfc2xvdDpkLGRlYnVnX29wOmYsc3RhdGU6aH07ZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9ZGMuYWRkUGFyYW1zKGQsYik7dGhpcy5zZXQoIl9idXN5IiwhMCk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGs9Pnt0aGlzLnNldCgiX2J1c3kiLCExKTtjb25zb2xlLmxvZygiQnJlYWtwb2ludCBzZXRfc3RhdGUgcmVzcG9uc2U6ICIsayl9KX0sX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI3RvcC1yaWdodC1wcm9ncmVzcy1iYXIiKTtudWxsPT10aGlzLl9sYXRlc3RTZXNzaW9uUnVuPwooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwwKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6KGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsYi52YWx1ZSksdGhpcy5zZXQoIl9idXN5IiwxMDA+Yi52YWx1ZSkpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5zZXQoIl93aW5kb3dXaWR0aCIsYmwoKSk7dGhpcy5zZXQoIl93aW5kb3dIZWlnaHQiLGFsKCkpO3RoaXMuX3NpemVEYXNoYm9hcmRSZWdpb25zKHRoaXMuX2xlZnRQYW5lV2lkdGgsdGhpcy5fdG9wUmlnaHRRdWFkcmFudEhlaWdodCx0aGlzLl93aW5kb3dXaWR0aCl9LF9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChiLGQsZil7cmV0dXJuIGItZC1mfSxfY29tcHV0ZU1heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHQoYixkKXtyZXR1cm4gYi1kLTcwfSxfc2l6ZURhc2hib2FyZFJlZ2lvbnMoYixkLGYpe3RoaXMuJCQoIiNsZWZ0LXBhbmUiKS5zdHlsZS53aWR0aD1iKyJweCI7Yj1mLWItdGhpcy5fcmVzaXplcldpZHRoLTg7dGhpcy4kJCgiI2NlbnRlci1jb250ZW50Iikuc3R5bGUud2lkdGg9CmIrInB4IjtiPWQtdGhpcy5fcmVzaXplcldpZHRoO3RoaXMuJCQoIiN0b3AtcmlnaHQtcXVhZHJhbnQiKS5zdHlsZS5oZWlnaHQ9YisicHgiO3RoaXMuJCQoIiN0ZW5zb3ItZGF0YSIpLnN0eWxlLnRvcD1kKyJweCJ9LF9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9sZWZ0UGFuZVdpZHRoIix7ZGVmYXVsdFZhbHVlOjQ1MH0pLF90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXI6YmQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl90b3BSaWdodFF1YWRyYW50SGVpZ2h0Iix7ZGVmYXVsdFZhbHVlOmNsfSl9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tYXRlcmlhbC9wYXBlci1tYXRlcmlhbC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1tYXRlcmlhbCIscHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6MX0sYW5pbWF0ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlSW5jbHVkZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixoZWFsdGhQaWxsRW50cmllczp7dHlwZTpBcnJheSx2YWx1ZTp0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcyxyZWFkT25seTohMH0saGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZTp7dHlwZTpBcnJheSwKY29tcHV0ZWQ6Il9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgc2VsZWN0ZWROb2RlLCBhbGxTdGVwc01vZGVFbmFibGVkLCBhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIn0sYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMH0sX2JpZ2dlc3RTdGVwRXZlclNlZW46e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW4obm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgobm9kZU5hbWVzVG9IZWFsdGhQaWxscykifSxfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwRGlzcGxheVZhbHVlKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifX0sCm9ic2VydmVyczpbIl91cGRhdGVBbGVydHNMaXN0KGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cykiXSxyZWFkeTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluQ29udGFpbmVyIiksZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1kYXNoYm9hcmQtbGF5b3V0IC5zY3JvbGxiYXIiKTtiJiZkJiYoYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKX0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGImJmR9LF9jb21wdXRlVGVuc29yQ291bnRTdHJpbmc6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj9iW2RdLnRvRml4ZWQoMCk6IiJ9LF9jb21wdXRlSGVhbHRoUGlsbEZvck5vZGU6ZnVuY3Rpb24oYixkLGYsaCxrKXtpZihrfHwhZilyZXR1cm4gbnVsbDtiPWJbZl07cmV0dXJuIGI/KGQ9YltoPzA6ZF0pP2QudmFsdWUuc2xpY2UoMiw4KTpudWxsOm51bGx9LF9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWU6ZnVuY3Rpb24oYiwKZCxmLGgsayl7aWYoZilyZXR1cm4gaC50b0ZpeGVkKDApO2lmKGspcmV0dXJuIDA7Zm9yKGxldCByIGluIGIpcmV0dXJuIGJbcl1bZF0uc3RlcC50b0ZpeGVkKDApO3JldHVybiAwfSxfY29tcHV0ZUJpZ2dlc3RTdGVwRXZlclNlZW46ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGI9YltkXSxNYXRoLm1heCh0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVuLGJbYi5sZW5ndGgtMV0uc3RlcCk7cmV0dXJuIHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW58fDB9LF9jb21wdXRlTWF4U3RlcEluZGV4OmZ1bmN0aW9uKGIpe2ZvcihsZXQgZCBpbiBiKXJldHVybiBiW2RdLmxlbmd0aC0xO3JldHVybiAwfSxfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmxlbmd0aH0sX3VwZGF0ZUFsZXJ0c0xpc3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihkKXtkLmlubmVyVGV4dD0iIjtmb3IodmFyIGY9CjA7ZjxiLmxlbmd0aDtmKyspe3ZhciBoPWJbZl0saz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtyLmlubmVyVGV4dD10Zi5ncmFwaC51dGlsLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZShoLmZpcnN0X3RpbWVzdGFtcCk7ci5jbGFzc0xpc3QuYWRkKCJmaXJzdC1vZmZlbnNlLXRkIik7ay5hcHBlbmRDaGlsZChyKTtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ci5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKTtsLmlubmVyVGV4dD1oLnRlbnNvcl9uYW1lO3RoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIobCxoLnRlbnNvcl9uYW1lKTtyLmFwcGVuZENoaWxkKGwpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJkZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUiKTsKbC5pbm5lclRleHQ9IigiK2guZGV2aWNlX25hbWUrIikiO3IuYXBwZW5kQ2hpbGQobCk7ay5hcHBlbmRDaGlsZChyKTtyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3IuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbCIpO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtsLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwtdGQiKTtsLmFwcGVuZENoaWxkKHIpO2suYXBwZW5kQ2hpbGQobCk7aC5uZWdfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVyVGV4dD1oLm5lZ19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLm5lZ19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCAtXHUyMjFlIiksci5hcHBlbmRDaGlsZChsKSk7aC5wb3NfaW5mX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKbC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksbC5pbm5lclRleHQ9aC5wb3NfaW5mX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK1x1MjIxZSIpLHIuYXBwZW5kQ2hpbGQobCkpO2gubmFuX2V2ZW50X2NvdW50JiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxsLmNsYXNzTGlzdC5hZGQoIm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVyVGV4dD1oLm5hbl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmFuX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggTmFOIiksci5hcHBlbmRDaGlsZChsKSk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoayl9fX0sX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3ZhciBmPXRmLmdyYXBoLnJlbmRlci5leHBhbmRVbnRpbE5vZGVJc1Nob3duKHRoaXMucmVuZGVySGllcmFyY2h5LApkKSxoLGs9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ayYmKGg9ay5zY3JvbGxIZWlnaHQtay5zY3JvbGxUb3ApO3ZhciByPXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGYpO2Y9KCk9PntrLnNjcm9sbFRvcD1rLnNjcm9sbEhlaWdodC1ofTtrJiYocj9mKCk6d2luZG93LnNldFRpbWVvdXQoZiwyMCkpfSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEscj1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSxyKSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHc9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3AseD10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXktd31lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09eDtmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih3K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt3Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYodyt0aGlzLl9waHlzaWNhbFNpemUtRzw9eClicmVhaztwLnB1c2goQyk7dy09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6dy10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCkscikpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHc9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t3XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih3PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3ddKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3ddKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayxyKXtpZihudWxsIT1yKXJldHVybiByO3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHIpe2lmKG51bGwhPXIpcmV0dXJuIHI7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGsscil7cmV0dXJuIGs9PT1yfSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHIpe3JldHVybiBrPyJmYWRlZC0iK3I6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHI9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmciYmbC5nZXRGaWxsRm9yTm9kZShyLGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRSZW5kZXJJbmZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoYil9LF90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/CiJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX2dldEluY29tcGF0aWJsZU9wTm9kZXM6ZnVuY3Rpb24oYixkKXtpZihiJiZiLnJvb3QpcmV0dXJuIHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNpbmNvbXBhdGlibGVPcHNMaXN0IikpLHRmLmdyYXBoLmhpZXJhcmNoeS5nZXRJbmNvbXBhdGlibGVPcHMoYixkKX0sX2NvbXB1dGVPcENvbXBhdFNjb3JlOmZ1bmN0aW9uKGIpe2lmKGImJmIucm9vdCl7dmFyIGQ9Yi5yb290O2I9ZC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7ZD1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO3JldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSwKX2dldFRvdGFsSW5jb21wYXRpYmxlT3BzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLnJvb3Q/Yi5yb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOjB9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1saXN0LWl0ZW0uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1saXN0LWl0ZW0iLHByb3BlcnRpZXM6e2NhcmROb2RlOk9iamVjdCxpdGVtTm9kZTpPYmplY3QsZWRnZUxhYmVsOlN0cmluZyxpdGVtUmVuZGVySW5mbzpPYmplY3QsbmFtZTpTdHJpbmcsaXRlbVR5cGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaXRlbVR5cGVDaGFuZ2VkIn0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczpPYmplY3QsdGVtcGxhdGVJbmRleDpGdW5jdGlvbn0sX2l0ZW1UeXBlQ2hhbmdlZDpmdW5jdGlvbigpeyJzdWJub2RlIiE9PXRoaXMuaXRlbVR5cGU/dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QuYWRkKCJjbGlja2FibGUiKTp0aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5yZW1vdmUoImNsaWNrYWJsZSIpfSxfbm9kZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIitiLnR5cGUse2NhcmROb2RlOnRoaXMuY2FyZE5vZGUubmFtZSxub2RlTmFtZTp0aGlzLm5hbWUsCnR5cGU6dGhpcy5pdGVtVHlwZX0pfSxfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtbm9kZS1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtaW5mbyIscHJvcGVydGllczp7Z3JhcGhOb2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIixvYnNlcnZlcjoiX3Jlc2V0U3RhdGUifSxfbm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGVTdGF0cyhncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9oYXNEaXNwbGF5YWJsZU5vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRIYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlczp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUoX25vZGVTdGF0cykifSxfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcyhfbm9kZVN0YXRzKSJ9LG5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixvYnNlcnZlcjoiX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkIn0sX2F0dHJpYnV0ZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRBdHRyaWJ1dGVzKF9ub2RlKSJ9LF9kZXZpY2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0RGV2aWNlKF9ub2RlKSJ9LF9zdWNjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFN1Y2Nlc3NvcnMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LApfcHJlZGVjZXNzb3JzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldFByZWRlY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX2Z1bmN0aW9uVXNhZ2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0RnVuY3Rpb25Vc2FnZXMoX25vZGUsIGdyYXBoSGllcmFyY2h5KSJ9LF9zdWJub2Rlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldFN1Ym5vZGVzKF9ub2RlKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfdG90YWxQcmVkZWNlc3NvcnM6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfZ2V0VG90YWxQcmVkKF9wcmVkZWNlc3NvcnMpIn0sX3RvdGFsU3VjY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFN1Y2MoX3N1Y2Nlc3NvcnMpIn0sX29wZW5lZENvbnRyb2xQcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcGVuZWRDb250cm9sU3VjYzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYXV4QnV0dG9uVGV4dDpTdHJpbmcsX2dyb3VwQnV0dG9uVGV4dDpTdHJpbmd9LApleHBhbmROb2RlOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJfbm9kZS5leHBhbmQiLHRoaXMubm9kZSl9LF9nZXRUZW1wbGF0ZUluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldFRlbXBsYXRlSW5kZXgoKX0sX2dldE5vZGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gZC5ub2RlKGIpfSxfZ2V0Tm9kZVN0YXRzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuKGI9dGhpcy5fZ2V0Tm9kZShiLGQpKT9iLnN0YXRzOm51bGx9LF9nZXRUb3RhbE1pY3JvczpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmdldFRvdGFsTWljcm9zKCk6MH0sX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC51dGlsLmhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKGIpfSxfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXM6ZnVuY3Rpb24oYil7aWYoYiYmYi50b3RhbEJ5dGVzKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLnRvdGFsQnl0ZXMsdGYuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpfSwKX2dldE5vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lOmZ1bmN0aW9uKGIpe2lmKGImJmIuZ2V0VG90YWxNaWNyb3MoKSlyZXR1cm4gdGYuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoYi5nZXRUb3RhbE1pY3JvcygpLHRmLmdyYXBoLnV0aWwuVElNRV9VTklUUyl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczpmdW5jdGlvbihiKXtpZihiJiZiLm91dHB1dFNpemUmJmIub3V0cHV0U2l6ZS5sZW5ndGgpcmV0dXJuIF8ubWFwKGIub3V0cHV0U2l6ZSxmdW5jdGlvbihkKXtyZXR1cm4gMD09PWQubGVuZ3RoPyJzY2FsYXIiOiJbIitkLmpvaW4oIiwgIikrIl0ifSl9LF9nZXRSZW5kZXJJbmZvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoYil9LF9nZXRBdHRyaWJ1dGVzOmZ1bmN0aW9uKGIpe3RoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNhdHRyaWJ1dGVzTGlzdCIpKTsKaWYoIWJ8fCFiLmF0dHIpcmV0dXJuW107dmFyIGQ9W107Xy5lYWNoKGIuYXR0cixmdW5jdGlvbihmKXtmLmtleT09PXRmLmdyYXBoLkxBUkdFX0FUVFJTX0tFWT9kPWQuY29uY2F0KGYudmFsdWUubGlzdC5zLm1hcChmdW5jdGlvbihoKXtyZXR1cm57a2V5OmgsdmFsdWU6IlRvbyBsYXJnZSB0byBzaG93Li4uIn19KSk6ZC5wdXNoKHtrZXk6Zi5rZXksdmFsdWU6SlNPTi5zdHJpbmdpZnkoZi52YWx1ZSl9KX0pO3JldHVybiBkfSxfZ2V0RGV2aWNlOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZGV2aWNlOm51bGx9LF9nZXRTdWNjZXNzb3JzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiaW5wdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0U3VjY2Vzc29ycyhiLm5hbWUpLCExLGIuaXNHcm91cE5vZGUpOntyZWd1bGFyOltdLGNvbnRyb2w6W119fSxfZ2V0UHJlZGVjZXNzb3JzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgib3V0cHV0c0xpc3QiKTsKcmV0dXJuIGI/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZC5nZXRQcmVkZWNlc3NvcnMoYi5uYW1lKSwhMCxiLmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX0sX2dldEZ1bmN0aW9uVXNhZ2VzKGIsZCl7dGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiZnVuY3Rpb25Vc2FnZXNMaXN0Iik7cmV0dXJuIGImJmIudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEE/KGI9ZC5saWJyYXJ5RnVuY3Rpb25zW2IuYXNzb2NpYXRlZEZ1bmN0aW9uXSk/Yi51c2FnZXM6W106W119LF9yZWZyZXNoTm9kZUl0ZW1MaXN0KGIpe3RoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsYCMke2J9YCkpfSxfY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3Q6ZnVuY3Rpb24oYixkLGYpe3ZhciBoPXI9Pl8ubWFwKHIuYmFzZUVkZ2VMaXN0LGw9Pnt2YXIgcD1kP2wudjpsLnc7cmV0dXJue25hbWU6cCxub2RlOnRoaXMuX2dldE5vZGUocCx0aGlzLmdyYXBoSGllcmFyY2h5KSwKZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JCYXNlRWRnZShsLHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8ocCx0aGlzLnJlbmRlckhpZXJhcmNoeSl9fSksaz1mdW5jdGlvbihyKXt2YXIgbD1bXTtfLmVhY2gocixwPT57dmFyIG09ZD9wLnY6cC53O2YmJjEhPXAuYmFzZUVkZ2VMaXN0Lmxlbmd0aD9sLnB1c2goe25hbWU6bSxub2RlOnRoaXMuX2dldE5vZGUobSx0aGlzLmdyYXBoSGllcmFyY2h5KSxlZGdlTGFiZWw6dGYuZ3JhcGguc2NlbmUuZWRnZS5nZXRMYWJlbEZvckVkZ2UocCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG0sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfSk6bD1sLmNvbmNhdChoKHApKX0pO3JldHVybiBsfS5iaW5kKHRoaXMpO3JldHVybntyZWd1bGFyOmsoYi5yZWd1bGFyKSxjb250cm9sOmsoYi5jb250cm9sKX19LF9nZXRTdWJub2RlczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmCmIubWV0YWdyYXBoP2IubWV0YWdyYXBoLm5vZGVzKCk6bnVsbH0sX2dldFRvdGFsUHJlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfZ2V0VG90YWxTdWNjOmZ1bmN0aW9uKGIpe3JldHVybiBiLnJlZ3VsYXIubGVuZ3RoK2IuY29udHJvbC5sZW5ndGh9LF90b2dnbGVDb250cm9sUHJlZDpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSF0aGlzLl9vcGVuZWRDb250cm9sUHJlZH0sX3RvZ2dsZUNvbnRyb2xTdWNjOmZ1bmN0aW9uKCl7dGhpcy5fb3BlbmVkQ29udHJvbFN1Y2M9IXRoaXMuX29wZW5lZENvbnRyb2xTdWNjfSxfdG9nZ2xlRXhwYW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLl9leHBhbmRlZD0hdGhpcy5fZXhwYW5kZWR9LF9nZXRUb2dnbGVJY29uOmZ1bmN0aW9uKGIpe3JldHVybiBiPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0KdGhpcy5fb3BlbmVkQ29udHJvbFByZWQ9ITE7dGhpcy5zZXQoIl9ncm91cEJ1dHRvblRleHQiLHRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0R3JvdXBTZXR0aW5nTGFiZWwodGhpcy5fbm9kZSkpfSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfdG9nZ2xlSW5jbHVkZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgibm9kZS10b2dnbGUtaW5jbHVzaW9uIix7bmFtZTp0aGlzLmdyYXBoTm9kZU5hbWV9KX0sX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYikpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYj10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6Yn0pfSwKX2lzTGlicmFyeUZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm5hbWUuc3RhcnRzV2l0aCh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKX0sX2lzSW5TZXJpZXM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnNjZW5lLm5vZGUuY2FuQmVJblNlcmllcyhiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ncmFwaC1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWluZm8iLHByb3BlcnRpZXM6e3RpdGxlOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3Qsbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb21wYXROb2RlVGl0bGU6U3RyaW5nLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlSW5jbHVkZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW59LGxpc3RlbmVyczp7Im5vZGUtbGlzdC1pdGVtLWNsaWNrIjoiX25vZGVMaXN0SXRlbUNsaWNrZWQiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW92ZXIiOiJfbm9kZUxpc3RJdGVtTW91c2VvdmVyIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdXQiOiJfbm9kZUxpc3RJdGVtTW91c2VvdXQifSwKX25vZGVMaXN0SXRlbUNsaWNrZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZE5vZGU9Yi5kZXRhaWwubm9kZU5hbWV9LF9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXI6ZnVuY3Rpb24oYil7dGhpcy5oaWdobGlnaHRlZE5vZGU9Yi5kZXRhaWwubm9kZU5hbWV9LF9ub2RlTGlzdEl0ZW1Nb3VzZW91dDpmdW5jdGlvbigpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPW51bGx9LF9oZWFsdGhQaWxsc0F2YWlsYWJsZTpmdW5jdGlvbihiLGQpe3JldHVybiBiJiZkJiYwPE9iamVjdC5rZXlzKGQpLmxlbmd0aH0sX2VxdWFsczpmdW5jdGlvbihiLGQpe3JldHVybiBiPT09ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtYm9hcmQvdGYtZ3JhcGgtYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtYm9hcmQiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LHByb2dyZXNzOk9iamVjdCx0cmFjZUlucHV0czpCb29sZWFuLGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixkZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0saGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZywKbm90aWZ5OiEwfSxjb21wYXROb2RlVGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJUUFUgQ29tcGF0aWJpbGl0eSJ9LGVkZ2VXaWR0aEZ1bmN0aW9uOk9iamVjdCxfc2VsZWN0ZWROb2RlSW5jbHVkZTpOdW1iZXIsX2hpZ2hsaWdodGVkTm9kZTpTdHJpbmcsaGFuZGxlTm9kZVNlbGVjdGVkOk9iamVjdCxlZGdlTGFiZWxGdW5jdGlvbjpPYmplY3QsaGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU5vZGVJbmNsdWRlKHNlbGVjdGVkTm9kZSwgcmVuZGVySGllcmFyY2h5KSJdLGZpdDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaC5maXQoKX0sX2lzTm90Q29tcGxldGU6ZnVuY3Rpb24oYil7cmV0dXJuIDEwMD5iLnZhbHVlfSxfZ2V0Q29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oYil7dmFyIGQ9ImNvbnRhaW5lciI7Yi5lcnJvciYmKGQrPSIgZXJyb3IiKTt0aGlzLl9pc05vdENvbXBsZXRlKGIpJiYoZCs9IiBsb2FkaW5nIik7cmV0dXJuIGR9LF9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCl9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQoYil7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sX3VwZGF0ZU5vZGVJbmNsdWRlKCl7Y29uc3QgYj10aGlzLnJlbmRlckhpZXJhcmNoeT90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROb2RlQnlOYW1lKHRoaXMuc2VsZWN0ZWROb2RlKTpudWxsO3RoaXMuX3NlbGVjdGVkTm9kZUluY2x1ZGU9Yj9iLmluY2x1ZGU6dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1idXR0b24vcGFwZXItcmFkaW8tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgYj1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLApkPU1hdGguZmxvb3IoMypiKTtkJTIhPT1iJTImJmQrKzt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjpkKyJweCJ9KX19KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1ncm91cC9wYXBlci1yYWRpby1ncm91cC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1yYWRpby1ncm91cCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fdmFsdWVUb0l0ZW0oYik7aWYoIWR8fCFkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7ZD10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtpZih0aGlzLnNlbGVjdGVkPT1iKWlmKHRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbiliPSIiO2Vsc2V7ZCYmCihkLmNoZWNrZWQ9ITApO3JldHVybn1kJiYoZC5jaGVja2VkPSExKX1Qb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3Iuc2VsZWN0LmFwcGx5KHRoaXMsW2JdKTt0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNQcmV2aW91cygpO2IucHJldmVudERlZmF1bHQoKTt0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNOZXh0KCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGQ9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTpiLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ZC5ob3N0OmJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGIpeyJlbnRyeSI9PT1iP3RoaXMuc2hvdygpOiJleGl0Ij09PWImJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYj0hMCxkPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxmPTA7ZjxkLmxlbmd0aDtmKyspaWYoIiIhPT1kW2ZdLnRleHRDb250ZW50LnRyaW0oKSl7Yj0hMTticmVha31pZihiKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBiPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYj10aGlzLm1hcmdpblRvcCk7dmFyIGQ9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZj10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmg9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxrPShmLndpZHRoLWgud2lkdGgpLzIscj0oZi5oZWlnaHQtaC5oZWlnaHQpLzIsbD1mLmxlZnQtZC5sZWZ0LHA9Zi50b3AtZC50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIG09bCtrO3ZhciBuPXAtaC5oZWlnaHQtYjticmVhaztjYXNlICJib3R0b20iOm09bCtrO249cCtmLmhlaWdodCtiO2JyZWFrO2Nhc2UgImxlZnQiOm09bC1oLndpZHRoLWI7bj1wK3I7YnJlYWs7Y2FzZSAicmlnaHQiOm09bCtmLndpZHRoK2Isbj1wK3J9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGQubGVmdCttK2gud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLG0pKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGQudG9wK24raC5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KZC5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtZC50b3AsbikrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PW0rInB4Iix0aGlzLnN0eWxlLnRvcD1uKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYil7NTAwIT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmIrIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYil7aWYoImVudHJ5Ij09PWImJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcuZGVsYXkpe3ZhciBkPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09Yj90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6ZCsibXMifSk6ImV4aXQiPT09YiYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpkKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ub2RlLXNlYXJjaC90Zi1ncmFwaC1ub2RlLXNlYXJjaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3Jhd1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUmVnZXhJbnB1dChyZW5kZXJIaWVyYXJjaHksIF9yYXdSZWdleElucHV0KSJ9LF9wcmV2aW91c1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfc2VhcmNoVGltZW91dERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZToxNTAscmVhZE9ubHk6ITB9LF9zZWFyY2hQZW5kaW5nOkJvb2xlYW4sX21heFJlZ2V4UmVzdWx0czp7dHlwZTpOdW1iZXIsdmFsdWU6NDJ9LF9yZWdleE1hdGNoZXM6QXJyYXl9LG9ic2VydmVyczpbIl9yZWdleElucHV0Q2hhbmdlZChfcmVnZXhJbnB1dCkiXSxfY29tcHV0ZVJlZ2V4SW5wdXQoYixkKXtyZXR1cm4gZC50cmltKCl9LApfcmVnZXhJbnB1dENoYW5nZWQoKXt0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9LF9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfSxfcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0PT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0P3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE6KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZWFyY2hQZW5kaW5nPSExO3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSkpfSxfZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0KXt0cnl7dmFyIGI9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaChmKXt0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTtyZXR1cm59dmFyIGQ9W107Xy5lYWNoKHRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXROb2RlTWFwKCksCihmLGgpPT57aWYoZC5sZW5ndGg+PXRoaXMuX21heFJlZ2V4UmVzdWx0cylyZXR1cm4hMTtiLnRlc3QoaCkmJmQucHVzaChoKX0pO3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixkKX1lbHNlIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfSxfbWF0Y2hDbGlja2VkKGIpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGIubW9kZWwuaXRlbSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29udHJvbHMvdGYtZ3JhcGgtY29udHJvbHMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y29uc3QgaD0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8saz1be3JlZ2V4Omh9XSxyPVtdO2xldCBsOyhmdW5jdGlvbihtKXttLkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIjttLk1FTU9SWT0ibWVtb3J5IjttLlNUUlVDVFVSRT0ic3RydWN0dXJlIjttLlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciI7bS5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5In0pKGw9Zi5Db2xvckJ5fHwoZi5Db2xvckJ5PXt9KSk7Y29uc3QgcD1uZXcgU2V0KFtsLkNPTVBVVEVfVElNRSxsLk1FTU9SWV0pO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1jb250cm9scyIscHJvcGVydGllczp7c3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zdGF0c0NoYW5nZWQifSxkZXZpY2VzRm9yU3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRvbmx5OiEwfSxjb2xvckJ5Ont0eXBlOlN0cmluZywKdmFsdWU6bC5TVFJVQ1RVUkUsbm90aWZ5OiEwfSxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGRhdGFzZXRzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIix2YWx1ZTooKT0+W119LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3R9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0sc2VsZWN0ZWRGaWxlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9zZWxlY3RlZFJ1bkluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSx0cmFjZUlucHV0czp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX3NlbGVjdGVkVGFnSW5kZXg6e3R5cGU6TnVtYmVyLAp2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSxfc2VsZWN0ZWRHcmFwaFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jdXJyZW50RGV2aWNlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VzKGRldmljZXNGb3JTdGF0cykifSxfY3VycmVudERldmljZVBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VQYXJhbXMoY29sb3JCeVBhcmFtcykifSxfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50R3JhZGllbnRQYXJhbXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zKGNvbG9yQnlQYXJhbXMsIGNvbG9yQnkpIn0sCnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LHNob3dVcGxvYWRCdXR0b246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZDpCb29sZWFuLGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGVnZW5kT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxfeGxhQ2x1c3RlcnNQcm92aWRlZDpmdW5jdGlvbihtKXtyZXR1cm4gbSYmbS5oaWVyYXJjaHkmJjA8bS5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RofSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKG0pe2lmKG51bGwhPW0pe3ZhciBuPXt9O18uZWFjaChtLmRldl9zdGF0cyxmdW5jdGlvbihxKXt2YXIgdT1fLnNvbWUoayxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pLHc9Xy5zb21lKHIsZnVuY3Rpb24oQSl7cmV0dXJuIEEucmVnZXgudGVzdChxLmRldmljZSl9KTt1JiYhdyYmKG5bcS5kZXZpY2VdPQohMCl9KTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX19LF9nZXRDdXJyZW50RGV2aWNlczpmdW5jdGlvbihtKXt2YXIgbj10aGlzLnN0YXRzO249KG4/bi5kZXZfc3RhdHM6W10pLm1hcCh1PT51LmRldmljZSkuZmlsdGVyKHU9Pmsuc29tZSh3PT53LnJlZ2V4LnRlc3QodSkpKTtjb25zdCBxPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobik7aWYoMT09cS5sZW5ndGgpe2NvbnN0IHU9cVswXS5tYXRjaChoKTt1JiYocVswXT11WzFdKX1yZXR1cm4gbi5tYXAoKHUsdyk9PntsZXQgQT1udWxsO3IuZm9yRWFjaCh5PT57eS5yZWdleC50ZXN0KHUpJiYoQT15Lm1zZyl9KTtyZXR1cm57ZGV2aWNlOnUsc3VmZml4OnFbd10sdXNlZDptW3VdLGlnbm9yZWRNc2c6QX19KX0sX2RldmljZUNoZWNrYm94Q2xpY2tlZDpmdW5jdGlvbihtKXttPW0udGFyZ2V0O2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cykscT1tLnZhbHVlO20uY2hlY2tlZD8KbltxXT0hMDpkZWxldGUgbltxXTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX0sX251bVRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gdGhpcy5fZ2V0VGFncyhtLG4pLmxlbmd0aH0sX2dldFRhZ3M6ZnVuY3Rpb24obSxuKXtyZXR1cm4gbSYmbVtuXT9tW25dLnRhZ3M6W119LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImZpdC10YXAiKX0sX2lzR3JhZGllbnRDb2xvcmluZzpmdW5jdGlvbihtLG4pe3JldHVybiBwLmhhcyhuKSYmbnVsbCE9bX0sX2VxdWFsczpmdW5jdGlvbihtLG4pe3JldHVybiBtPT09bn0sX2dldEN1cnJlbnREZXZpY2VQYXJhbXM6ZnVuY3Rpb24obSl7bT1tLmRldmljZS5maWx0ZXIodT0+ay5zb21lKHc9PncucmVnZXgudGVzdCh1LmRldmljZSkpKTtjb25zdCBuPWIuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgobS5tYXAodT0+dS5kZXZpY2UpKTtpZigxPT1uLmxlbmd0aCl7dmFyIHE9blswXS5tYXRjaChoKTtxJiYoblswXT1xWzFdKX1yZXR1cm4gbS5tYXAoKHUsCncpPT4oe2RldmljZTpuW3ddLGNvbG9yOnUuY29sb3J9KSl9LF9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtczpmdW5jdGlvbihtKXtyZXR1cm4gbS54bGFfY2x1c3Rlcn0sX2dldEN1cnJlbnRHcmFkaWVudFBhcmFtczpmdW5jdGlvbihtLG4pe2lmKHRoaXMuX2lzR3JhZGllbnRDb2xvcmluZyh0aGlzLnN0YXRzLG4pKXttPW1bbl07dmFyIHE9bS5taW5WYWx1ZSx1PW0ubWF4VmFsdWU7bj09PWwuTUVNT1JZPyhxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSx1PWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodSxiLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSk6bj09PWwuQ09NUFVURV9USU1FJiYocT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHEsYi5ncmFwaC51dGlsLlRJTUVfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LApiLmdyYXBoLnV0aWwuVElNRV9VTklUUykpO3JldHVybnttaW5WYWx1ZTpxLG1heFZhbHVlOnUsc3RhcnRDb2xvcjptLnN0YXJ0Q29sb3IsZW5kQ29sb3I6bS5lbmRDb2xvcn19fSxkb3dubG9hZDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCl9LF91cGRhdGVGaWxlSW5wdXQ6ZnVuY3Rpb24obSl7dmFyIG49bS50YXJnZXQuZmlsZXNbMF07aWYobil7bj1uLm5hbWU7dmFyIHE9bi5sYXN0SW5kZXhPZigiLiIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKDAscSkpO3E9bi5sYXN0SW5kZXhPZigiLyIpOzA8PXEmJihuPW4uc3Vic3RyaW5nKHErMSkpO3RoaXMuX3NldERvd25sb2FkRmlsZW5hbWUobik7dGhpcy5zZXQoInNlbGVjdGVkRmlsZSIsbSl9fSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKG0sbil7bnVsbCE9biYmKHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCl9LF9jb21wdXRlU2VsZWN0aW9uOmZ1bmN0aW9uKG0sbixxLHUpe3JldHVybiBtW25dJiZtW25dLnRhZ3NbcV0/CntydW46bVtuXS5uYW1lLHRhZzptW25dLnRhZ3NbcV0udGFnLHR5cGU6dX06bnVsbH0sX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKG0pe3RoaXMuZGF0YXNldHMmJih0aGlzLmNvbG9yQnk9bC5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKHRoaXMuZGF0YXNldHNbbV0/dGhpcy5kYXRhc2V0c1ttXS5uYW1lOiIiKSl9LF9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9LF9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpe2NvbnN0IG09dGhpcy5kYXRhc2V0cyxuPXRoaXMuX3NlbGVjdGVkUnVuSW5kZXgscT10aGlzLl9zZWxlY3RlZFRhZ0luZGV4O3JldHVybiBtJiZtW25dJiZtW25dLnRhZ3NbcV0mJgohbVtuXS50YWdzW3FdLm9wR3JhcGg/bVtuXS50YWdzW3FdLnByb2ZpbGU/Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6bVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaD9iLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxfZ2V0RmlsZTpmdW5jdGlvbigpe3RoaXMuJCQoIiNmaWxlIikuY2xpY2soKX0sX3NldERvd25sb2FkRmlsZW5hbWU6ZnVuY3Rpb24obSl7dGhpcy4kLmdyYXBoZG93bmxvYWQuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsbSsiLnBuZyIpfSxfc3RhdHNOb3ROdWxsOmZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT09bX0sX3RvZ2dsZUxlZ2VuZE9wZW4oKXt0aGlzLnNldCgiX2xlZ2VuZE9wZW5lZCIsIXRoaXMuX2xlZ2VuZE9wZW5lZCl9LF9nZXRUb2dnbGVUZXh0KG0pe3JldHVybiBtPyJDbG9zZSBsZWdlbmQuIjoiRXhwYW5kIGxlZ2VuZC4ifSwKX2dldFRvZ2dsZUxlZ2VuZEljb24obSl7cmV0dXJuIG0/ImV4cGFuZC1tb3JlIjoiZXhwYW5kLWxlc3MifSxfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5vcEdyYXBofSxfZ2V0U2VsZWN0aW9uUHJvZmlsZURpc2FibGVkKG0sbixxKXtyZXR1cm4hbVtuXXx8IW1bbl0udGFnc1txXXx8IW1bbl0udGFnc1txXS5wcm9maWxlfSxfZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLmNvbmNlcHR1YWxHcmFwaH19KX0pKGQuY29udHJvbHN8fChkLmNvbnRyb2xzPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWRhc2hib2FyZC90Zi1ncmFwaC1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfZGF0YXNldHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZGF0YXNldHNGZXRjaGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zZWxlY3RlZERhdGFzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9yZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9kZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYWxsU3RlcHNNb2RlRW5hYmxlZDpCb29sZWFuLHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQifSwKc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pc0F0dGFjaGVkOkJvb2xlYW4sX2luaXRpYWxpemVkOkJvb2xlYW4sX2FyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLF9kZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfbm9kZU5hbWVzVG9IZWFsdGhQaWxsczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9oZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixfaGVhbHRoUGlsbFJlcXVlc3RJZDp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ6TnVtYmVyLF9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTo1MDAscmVhZE9ubHk6ITB9LHJ1bnM6QXJyYXkscnVuOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6YmQuZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInJ1biIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxvYnNlcnZlcjoiX3J1bk9ic2VydmVyIn0sCl9zZWxlY3Rpb246e3R5cGU6T2JqZWN0fSxfY29tcGF0aWJpbGl0eVByb3ZpZGVyOk9iamVjdCxfdHJhY2VJbnB1dHM6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS10b2dnbGUtZXhwYW5kIjoiX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQifSxvYnNlcnZlcnM6WyJfbWF5YmVGZXRjaEhlYWx0aFBpbGxzKF9kZWJ1Z2dlckRhdGFFbmFibGVkLCBhbGxTdGVwc01vZGVFbmFibGVkLCBzcGVjaWZpY0hlYWx0aFBpbGxTdGVwLCBfc2VsZWN0ZWROb2RlKSIsIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQoX2lzQXR0YWNoZWQpIiwiX2RldGVybWluZVNlbGVjdGVkRGF0YXNldChfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIHJ1bikiLCJfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsIF9zZWxlY3RlZERhdGFzZXQpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLAohMSl9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWR8fHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZGMuZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoYj0+e2IuY2FuY2VsbGVkfHxiLnZhbHVlWyJkZWJ1Z2dlciJdJiZ0aGlzLnNldCgiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCEwKX0pKTt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZml0KCl9LF9ydW5PYnNlcnZlcjpiZC5nZXRTdHJpbmdPYnNlcnZlcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHBvbHltZXJQcm9wZXJ0eToicnVuIix1c2VMb2NhbFN0b3JhZ2U6ITF9KSxfZmV0Y2hEYXRhc2V0KCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9pbmZvIikpfSxfZmV0Y2hIZWFsdGhQaWxscyhiLApkKXtiPXtub2RlX25hbWVzOkpTT04uc3RyaW5naWZ5KGIpLHJ1bjoiX19kZWJ1Z2dlcl9kYXRhX18ifTt2b2lkIDAhPT1kJiYoYi5zdGVwPWQpO2Q9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2hlYWx0aF9waWxscyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQsYil9LF9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvbnVtZXJpY3NfYWxlcnRfcmVwb3J0IikpfSxfZ3JhcGhVcmwoYixkLGYpe3JldHVybiBkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixuZXcgVVJMU2VhcmNoUGFyYW1zKHtydW46YixsaW1pdF9hdHRyX3NpemU6ZCxsYXJnZV9hdHRyc19rZXk6Zn0pKX0sX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWJ1Z2dlckRhdGFFbmFibGVkJiYKdGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdGhpcy5fcmVuZGVySGllcmFyY2h5JiZ0aGlzLl9kYXRhc2V0c1N0YXRlKHRoaXMuX2RhdGFzZXRzRmV0Y2hlZCx0aGlzLl9kYXRhc2V0cywiUFJFU0VOVCIpfSxfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkOmZ1bmN0aW9uKGIpeyF0aGlzLl9pbml0aWFsaXplZCYmYiYmKHRoaXMuc2V0KCJfY29tcGF0aWJpbGl0eVByb3ZpZGVyIixuZXcgdGYuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyKSx0aGlzLl9pbml0aWFsaXplZD0hMCx0aGlzLl9mZXRjaERhdGFzZXQoKS50aGVuKGQ9Pnt0aGlzLl9kYXRhc2V0cz1PYmplY3Qua2V5cyhkKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcykubWFwKGY9Pntjb25zdCBoPWRbZl07dmFyIGs9T2JqZWN0LmtleXMoaC50YWdzKS5zb3J0KGFjLmNvbXBhcmVUYWdOYW1lcykubWFwKHI9PmgudGFnc1tyXSkubWFwKCh7dGFnOnIsY29uY2VwdHVhbF9ncmFwaDpsLG9wX2dyYXBoOnAscHJvZmlsZTptfSk9Pgooe3RhZzpyLGRpc3BsYXlOYW1lOnIsY29uY2VwdHVhbEdyYXBoOmwsb3BHcmFwaDpwLHByb2ZpbGU6bX0pKTtrPWgucnVuX2dyYXBoP1t7dGFnOm51bGwsZGlzcGxheU5hbWU6IkRlZmF1bHQiLGNvbmNlcHR1YWxHcmFwaDohMSxvcEdyYXBoOiEwLHByb2ZpbGU6ITF9LC4uLmtdOms7cmV0dXJue25hbWU6Zix0YWdzOmt9fSk7dGhpcy5fZGF0YXNldHNGZXRjaGVkPSEwfSkpfSxfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KGIsZCxmKXtmPyhkPWQuZmluZEluZGV4KGg9PmgubmFtZT09PWYpLC0xPT09ZD9iJiYoYj10aGlzLiQkKCIjZXJyb3ItZGlhbG9nIiksYi50ZXh0Q29udGVudD1gTm8gZGF0YXNldCBuYW1lZCAiJHtmfSIgY291bGQgYmUgZm91bmQuYCxiLm9wZW4oKSk6dGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLGQpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsMCl9LF91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKGIsZCxmKXtiJiYoZC5sZW5ndGg8PWZ8fHRoaXMuc2V0KCJydW4iLApkW2ZdLm5hbWUpKX0sX3JlcXVlc3RIZWFsdGhQaWxsczpmdW5jdGlvbigpe3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMCk7dmFyIGI9Kyt0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkO251bGwhPT10aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGwpO3RoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGw7dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfS5iaW5kKHRoaXMpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXkpOnRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhiKX0sCl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHM6ZnVuY3Rpb24oYil7aWYodGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZD09PWIpe3ZhciBkPXRoaXMuX2ZldGNoSGVhbHRoUGlsbHModGhpcy5fcmVuZGVySGllcmFyY2h5LmdldE5hbWVzT2ZSZW5kZXJlZE9wcygpLHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6dm9pZCAwKSxmPXRoaXMuX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpO1Byb21pc2UuYWxsKFtkLGZdKS50aGVuKGZ1bmN0aW9uKGgpe3ZhciBrPWhbMF07aD1oWzFdO2lmKHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJmI9PT10aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkKXtmb3IodmFyIHIgaW4gayl7dGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcEluZGV4IixrW3JdLmxlbmd0aC0xKTticmVha310aGlzLnNldCgiX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsaCk7dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwKayk7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCExKTt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQiLG51bGwpfX0uYmluZCh0aGlzKSl9fSxfZGF0YXNldHNTdGF0ZTpmdW5jdGlvbihiLGQsZil7cmV0dXJuIGI/ZCYmZC5sZW5ndGg/IlBSRVNFTlQiPT09ZjoiRU1QVFkiPT09ZjoiTk9UX0xPQURFRCI9PT1mfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbigpe3RoaXMucmVsb2FkKCl9LF9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9LF9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQ6ZnVuY3Rpb24oYil7Yj90aGlzLnJlbG9hZCgpOnRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIse30pfSxfbWF5YmVGZXRjaEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzKCkmJnRoaXMuX3JlcXVlc3RIZWFsdGhQaWxscygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC92ei1kaXN0cmlidXRpb24tY2hhcnQuanMKdmFyIGRsOwooZnVuY3Rpb24oYil7Y2xhc3MgZHtjb25zdHJ1Y3RvcihmLGgpe3RoaXMucnVuMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1oO3RoaXMuYnVpbGRDaGFydChmKX1nZXREYXRhc2V0KGYpe3ZvaWQgMD09PXRoaXMucnVuMmRhdGFzZXRzW2ZdJiYodGhpcy5ydW4yZGF0YXNldHNbZl09bmV3IFBsb3R0YWJsZS5EYXRhc2V0KFtdLHtydW46Zn0pKTtyZXR1cm4gdGhpcy5ydW4yZGF0YXNldHNbZl19YnVpbGRDaGFydChmKXt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKTtmPXNmLmdldFhDb21wb25lbnRzKGYpO3RoaXMueEFjY2Vzc29yPWYuYWNjZXNzb3I7dGhpcy54U2NhbGU9Zi5zY2FsZTt0aGlzLnhBeGlzPWYuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3RoaXMueVNjYWxlPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7Zj0Kc2YubXVsdGlzY2FsZUZvcm1hdHRlcihzZi5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoZik7dGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO2Y9dGhpcy5idWlsZFBsb3QodGhpcy54QWNjZXNzb3IsdGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO3RoaXMuY2VudGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsZl0pO3RoaXMub3V0ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbdGhpcy55QXhpcyx0aGlzLmNlbnRlcl0sW251bGwsdGhpcy54QXhpc11dKX1idWlsZFBsb3QoZixoLGspe2xldCByPVswLDIyOCwxNTg3LDMwODUsNUUzLDY5MTUsODQxMyw5NzcyLDFFNF0sbD1fLnJhbmdlKHIubGVuZ3RoLQoxKS5tYXAodT0+KHJbdSsxXS1yW3VdKS8yNTAwKSxwPXIubWFwKCh1LHcpPT5BPT5BW3ddWzFdKSxtPXBbNF0sbj1fLnJhbmdlKHAubGVuZ3RoLTEpLm1hcCh1PT57bGV0IHc9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhO3cueChmLGgpO2xldCBBPTQ8dT9wW3VdOnBbdSsxXTt3LnkoNDx1P3BbdSsxXTpwW3VdLGspO3cueTAoQSk7dy5hdHRyKCJmaWxsIiwoeSx4LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3cuYXR0cigic3Ryb2tlIiwoeSx4LEMpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoQy5tZXRhZGF0YSgpLnJ1bikpO3cuYXR0cigic3Ryb2tlLXdlaWdodCIsKCk9PiIwLjVweCIpO3cuYXR0cigic3Ryb2tlLW9wYWNpdHkiLCgpPT5sW3VdKTt3LmF0dHIoImZpbGwtb3BhY2l0eSIsKCk9PmxbdV0pO3JldHVybiB3fSkscT1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cS54KGYsaCk7cS55KG0sayk7cS5hdHRyKCJzdHJva2UiLCh1LHcsQSk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShBLnJ1bikpOwp0aGlzLnBsb3RzPW47cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChuKX1zZXRWaXNpYmxlU2VyaWVzKGYpe3RoaXMucnVucz1mO2xldCBoPWYubWFwKGs9PnRoaXMuZ2V0RGF0YXNldChrKSk7dGhpcy5wbG90cy5mb3JFYWNoKGs9PmsuZGF0YXNldHMoaCkpfXNldFNlcmllc0RhdGEoZixoKXt0aGlzLmdldERhdGFzZXQoZikuZGF0YShoKX1yZW5kZXJUbyhmKXt0aGlzLnRhcmdldFNWRz1mO3RoaXMub3V0ZXIucmVuZGVyVG8oZil9cmVkcmF3KCl7dGhpcy5vdXRlci5yZWRyYXcoKX1kZXN0cm95KCl7dGhpcy5vdXRlci5kZXN0cm95KCl9fWIuRGlzdHJpYnV0aW9uQ2hhcnQ9ZDtQb2x5bWVyKHtpczoidnotZGlzdHJpYnV0aW9uLWNoYXJ0Iixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSx4VHlwZTp7dHlwZTpTdHJpbmcsCnZhbHVlOiJzdGVwIn0sX2F0dGFjaGVkOkJvb2xlYW4sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfc2VyaWVzRGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeFR5cGUsIGNvbG9yU2NhbGUsIF9hdHRhY2hlZCkiLCJfcmVsb2FkRnJvbUNhY2hlKF9jaGFydCkiXSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGYpe3RoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1mO3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhmKSx0aGlzLnJlZHJhdygpKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihmLGgpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXT1oO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGYsCmgpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydC5yZWRyYXcoKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGYsaCxrKXtudWxsPT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiZ0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihrKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3ZhciByPW5ldyBkKGYsaCksbD1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtyLnJlbmRlclRvKGwpO3RoaXMuX2NoYXJ0PXJ9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksCnRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZix0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl18fFtdKX0uYmluZCh0aGlzKSkpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfX0pfSkoZGx8fChkbD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWxvYWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHhUeXBlOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PmRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsIi9kaXN0cmlidXRpb25zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1mLm1hcChoPT57Y29uc3QgW2sscixsXT1oO2wud2FsbF90aW1lPW5ldyBEYXRlKDFFMyprKTtsLnN0ZXA9cjtyZXR1cm4gbH0pOwpkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYik7dGhpcy4kLmNoYXJ0LnNldFZpc2libGVTZXJpZXMoW2RdKX19fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KSxyZWFkT25seTohMH0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sYmVoYXZpb3JzOltjZC5EYXRhTG9hZGVyQmVoYXZpb3JdLF9jb21wdXRlRGF0YVRvTG9hZChiLGQpe3JldHVyblt7cnVuOmIsdGFnOmR9XX0sX2NvbXB1dGVSdW5Db2xvcihiKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5zY2FsZShiKX0sCnJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQvdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+Cnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGs9Pk9iamVjdC5rZXlzKGspKSxoPWRjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1oLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZik7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj0KYn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLGQsZil7cmV0dXJuIGJbZF1bZl19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSx0aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sYmluczp7dHlwZTpTdHJpbmcsdmFsdWU6ImJpbnMifSx4Ont0eXBlOlN0cmluZyx2YWx1ZToieCJ9LGR4Ont0eXBlOlN0cmluZyx2YWx1ZToiZHgifSx5Ont0eXBlOlN0cmluZyx2YWx1ZToieSJ9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKX19LG1vZGVUcmFuc2l0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sX2F0dGFjaGVkOkJvb2xlYW4sX25hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9kYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJyZWRyYXcodGltZVByb3BlcnR5LCBjb2xvclNjYWxlLCBfYXR0YWNoZWQpIiwKIl9tb2RlUmVkcmF3KG1vZGUpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihiLGQpe3RoaXMuX25hbWU9Yjt0aGlzLl9kYXRhPWQ7dGhpcy5yZWRyYXcoKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdygwKX0sX21vZGVSZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9kcmF3KHRoaXMubW9kZVRyYW5zaXRpb25EdXJhdGlvbil9LF9kcmF3OmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2F0dGFjaGVkJiZ0aGlzLl9kYXRhKXtpZih2b2lkIDA9PT1iKXRocm93IEVycm9yKCJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBfZHJhdyBuZWVkcyBkdXJhdGlvbiIpO2lmKDA+PXRoaXMuX2RhdGEubGVuZ3RoKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIHN0ZXBzIGluIHRoZSBkYXRhIik7CmlmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrdGhpcy5iaW5zKyInIGluIGRhdGEiKTtpZigwPj10aGlzLl9kYXRhWzBdW3RoaXMuYmluc10ubGVuZ3RoKXRocm93IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgRXJyb3IoIk5vIHggcHJvcGVydHkgJyIrdGhpcy54KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy5keCkpdGhyb3cgRXJyb3IoIk5vIGR4IHByb3BlcnR5ICciK3RoaXMuZHgrIicgb24gYmlucyBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLnkpKXRocm93IEVycm9yKCJObyB5IHByb3BlcnR5ICciKwp0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LHI9dGhpcy55LGw9dGhpcy5fZGF0YSxwPXRoaXMubW9kZSxtPWQzLmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLG49ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKSxxPWZ1bmN0aW9uKHhhKXtyZXR1cm4geGFbZl19LHU9ZnVuY3Rpb24oeGEpe3JldHVybiB4YVtyXX0sdz1mdW5jdGlvbih4YSl7cmV0dXJuIHhhW2ZdK3hhW2tdfSxBPWZ1bmN0aW9uKHhhKXtyZXR1cm4geGFbZF19OyJyZWxhdGl2ZSI9PT1kJiYoQT1mdW5jdGlvbih4YSl7cmV0dXJuIHhhLndhbGxfdGltZS1sWzBdLndhbGxfdGltZX0pO3ZhciB5PXRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseD15LndpZHRoLEM9eS5oZWlnaHQsRz01O2lmKCJvZmZzZXQiPT09cCl7dmFyIEQ9Qy8yLjU7Rz1EKzV9ZWxzZSBEPUMtRy0yMDt2YXIgQj14LTI0LTYwLEg9CkMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx3KTt2YXIgSz1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PWQ/eT1kMy50aW1lRm9ybWF0KCIlbS8lZCAlWCIpOiJyZWxhdGl2ZSI9PT1kJiYoeT1mdW5jdGlvbih4YSl7cmV0dXJuIGQzLmZvcm1hdCgiLjFyIikoeGEvMzZFNSkrImgifSk7dmFyIEw9bC5tYXAoZnVuY3Rpb24oeGEpe3JldHVybltkMy5taW4oeGFbaF0scSksZDMubWF4KHhhW2hdLHcpXX0pLEo9bC5tYXAoZnVuY3Rpb24oeGEpe3JldHVybiBkMy5leHRlbnQoeGFbaF0sdSl9KSxPPWQzLmV4dGVudChsLEEpLFM9KCJ3YWxsX3RpbWUiPT09ZD9kMy5zY2FsZVRpbWUoKTpkMy5zY2FsZUxpbmVhcigpKS5kb21haW4oTykucmFuZ2UoWzAsIm9mZnNldCI9PT1wP0g6MF0pLE49ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsZDMubWF4KGwsZnVuY3Rpb24oeGEsU2Epe3JldHVybiBKW1NhXVsxXX0pXSkucmFuZ2UoW0QsMF0pLFI9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oTi5kb21haW4oKSkucmFuZ2UoWzUwMCwKMF0pLFg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHhhLFNhKXtyZXR1cm4gTFtTYV1bMF19KSxkMy5tYXgobCxmdW5jdGlvbih4YSxTYSl7cmV0dXJuIExbU2FdWzFdfSldKS5uaWNlKCkucmFuZ2UoWzAsQl0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFguZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGZhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFgpLnRpY2tzKCk7dmFyIG9hPWQzLmF4aXNSaWdodChTKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTikudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoSyksY2E9ZnVuY3Rpb24oeGEpe3JldHVybiB4YVtmXSt4YVtrXS8yfSxqYT1kMy5saW5lKCkueChmdW5jdGlvbih4YSl7cmV0dXJuIGFhKGNhKHhhKSl9KS55KGZ1bmN0aW9uKHhhKXtyZXR1cm4gUih4YVtyXSl9KSwKYmE9ZnVuY3Rpb24oeGEpe3JldHVybiJNIithYShjYSh4YVswXSkpKyIsIitSKDApKyJMIitqYSh4YSkuc2xpY2UoMSkrIkwiK2FhKGNhKHhhW3hhLmxlbmd0aC0xXSkpKyIsIitSKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBXPWQzLmJpc2VjdG9yKHcpLmxlZnQ7Tz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eWEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwKMSk7RmEuc3R5bGUoIm9wYWNpdHkiLDEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt5YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB4YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFcoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9WC5pbnZlcnQoU2FbMF0pO1MuaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXhhKEFiKTtxYj1BYjt2YXIgbGM9WChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpOwpIYj1OKEFiW2hdW0hiXVtyXSk7dmFyIGVjPSJvZmZzZXQiPT09cD9TKEEoQWIpKS0oRC1IYik6SGI7ZWM9TWF0aC5hYnMoU2FbMV0tZWMpO2VjPEJiJiYoQmI9ZWMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitsYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXhhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3JdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXhhKHFiKTt5YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1gocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0grIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBLKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTsKdmFyIHZiPW9hLnRpY2tGb3JtYXQoKTtBYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP1MoQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6Tih1YltoXVt6Yl1bcl0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bcl0pfSk7dmFyIE9iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoT2JbMF0rMTUpKyJweCwiKyhPYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT0KcD9HYih1YltoXVt6Yl1bcl0pOigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtPLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIseCkuYXR0cigiaGVpZ2h0IixDKTtDPU8uc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt4PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9eC5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHhhLFNhKXtyZXR1cm4gQSh4YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih4YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/UyhBKHhhKSktRDowKSsiKSJ9KTt4LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IiwKZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PXA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3guYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih4YSl7cmV0dXJuIGJhKHhhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHhhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjpmYShBKHhhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeGEpe3JldHVybiBmYShBKHhhKSl9KTt4PXguYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLAoiaG92ZXIiKTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpLnN0eWxlKCJmaWxsIixmdW5jdGlvbih4YSl7cmV0dXJuIGZhKEEoeGEpKX0pO3guYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt4LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt4PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHlhPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3g9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXgubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7eD15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHgpO3guYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7eC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3guYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0grIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SCkrIikiKS5jYWxsKG9hKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+ZGMuYWRkUGFyYW1zKGRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL2hpc3RvZ3JhbXMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWVsLmJhY2tlbmRUb1Z6KGYpO2Q9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKX19fSx0YWdNZXRhZGF0YTpPYmplY3QsdGltZVByb3BlcnR5OlN0cmluZywKaGlzdG9ncmFtTW9kZTpTdHJpbmcsX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnRkLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIHJlcXVlc3RNYW5hZ2VyKSJdLGJlaGF2aW9yczpbY2QuRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYixkKXtyZXR1cm5be3J1bjpiLHRhZzpkfV19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihiKX0scmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2hpc3RvZ3JhbU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSxfdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX3Jlc3RhbXA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LApsaXN0ZW5lcnM6eyJjb250ZW50LXZpc2liaWxpdHktY2hhbmdlZCI6Il9yZWRyYXdDYXRlZ29yeVBhbmUifSxfcmVkcmF3Q2F0ZWdvcnlQYW5lKGIsZCl7ZCYmYi50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goZj0+Zi5yZWRyYXcoKSl9LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWgubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixmKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuIGtjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9fSxvYnNlcnZlcnM6WyJfY2hhbmdlUnVuQ29sb3IoX3J1bkNvbG9yKSJdLF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRkLnJ1bnNDb2xvclNjYWxlKGIpfSxfY2hhbmdlUnVuQ29sb3IoYil7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRiLXRleHQtbG9hZGVyLW91dGxpbmUiOmJ9KX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPWRjLmFkZFBhcmFtcyhkYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsCiIvdGV4dCIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVufSksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkVGV4dHMoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX2ZldGNoVGFncygpe2NvbnN0IGI9CmRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWcpKXt2YXIgZj1kYy5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRUZXh0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi10ZXh0LWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4ga2MuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx0YWc6U3RyaW5nLHRhZ01ldGFkYXRhOk9iamVjdCxydW5Ub1N0ZXBDYXA6T2JqZWN0LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxhY3RpdmU6Qm9vbGVhbixfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9ydW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU3RlcEF2YWlsYWJsZTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUocnVucywgX3J1blRvUHJDdXJ2ZUVudHJ5KSJ9LF9zZXRPZlJlbGV2YW50UnVuczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSkifSxfcnVuVG9EYXRhT3ZlclRpbWU6T2JqZWN0LApvbkRhdGFDaGFuZ2U6RnVuY3Rpb24sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6dGQucnVuc0NvbG9yU2NhbGV9KX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5DYW5jZWxsZXJ9LF9hdHRhY2hlZDpCb29sZWFuLF94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBiPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YixheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGIsImJvdHRvbSIpLGFjY2Vzc29yOmQ9PmQucmVjYWxsfX19LF95VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIucHJlY2lzaW9ufSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Pntjb25zdCBiPXNmLm11bHRpc2NhbGVGb3JtYXR0ZXIoc2YuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLApkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTpmPT5mLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19fSxfc2VyaWVzRGF0YUZpZWxkczp7dHlwZTpBcnJheSx2YWx1ZToidGhyZXNob2xkcyBwcmVjaXNpb24gcmVjYWxsIHRydWVfcG9zaXRpdmVzIGZhbHNlX3Bvc2l0aXZlcyB0cnVlX25lZ2F0aXZlcyBmYWxzZV9uZWdhdGl2ZXMiLnNwbGl0KCIgIiksCnJlYWRPbmx5OiEwfSxfZGVmYXVsdFhSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RlZmF1bHRZUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9Pntjb25zdCBkPXRoaXMudGFnO3JldHVybiBkYy5hZGRQYXJhbXMoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9wcl9jdXJ2ZXMiKSx7dGFnOmQscnVuOmJ9KX19fSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1bnMsIHRhZykiLCJfc2V0Q2hhcnREYXRhKF9ydW5Ub1ByQ3VydmVFbnRyeSwgX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnksIF9zZXRPZlJlbGV2YW50UnVucykiLCJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoX3J1blRvRGF0YU92ZXJUaW1lLCBydW5Ub1N0ZXBDYXApIiwKIl9ub3RpZnlEYXRhQ2hhbmdlKF9ydW5Ub0RhdGFPdmVyVGltZSkiXSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3Qgcj1kW2tdO3ImJmJba10uc3RlcD09PXIuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLApoKTp0aGlzLl9jbGVhclNlcmllc0RhdGEoaykpfSl9LF91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7dmFyIGY9Xy5yZWR1Y2UodGhpcy5fc2VyaWVzRGF0YUZpZWxkcywoayxyKT0+e2tbcl09ZFtyXS5zbGljZSgpLnJldmVyc2UoKTtyZXR1cm4ga30se30pO2NvbnN0IGg9QXJyYXkoZlt0aGlzLl9zZXJpZXNEYXRhRmllbGRzWzBdXS5sZW5ndGgpO2ZvcihsZXQgaz0wO2s8aC5sZW5ndGg7aysrKWhba109Xy5tYXBWYWx1ZXMoZixyPT5yW2tdKTtmPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTtmLnNldFNlcmllc0RhdGEoYixoKTtmLmNvbW1pdENoYW5nZXMoKX0sX2NsZWFyU2VyaWVzRGF0YShiKXtjb25zdCBkPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTtkLnNldFNlcmllc0RhdGEoYixbXSk7ZC5jb21taXRDaGFuZ2VzKCl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJgpoLmxlbmd0aCYmKGZba109dGhpcy5fY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoZFtrXSxoKSl9KTt0aGlzLnNldCgiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX25vdGlmeURhdGFDaGFuZ2UoYil7aWYodGhpcy5vbkRhdGFDaGFuZ2UpdGhpcy5vbkRhdGFDaGFuZ2UoYil9LF9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChiLGQpe2I9TWF0aC5taW4oXy5zb3J0ZWRJbmRleChkLm1hcChmPT5mLnN0ZXApLGIpLGQubGVuZ3RoLTEpO3JldHVybiBkW2JdfSxfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShiLGQpe3JldHVybiBfLmZpbHRlcihiLGY9PmRbZl0pLnNvcnQoKX0sX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPSEwfSk7cmV0dXJuIGR9LF9jb21wdXRlQ3VycmVudFN0ZXBGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSk/Yi5zdGVwOm51bGx9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lRm9yUnVuKGIsZCl7cmV0dXJuKGI9YltkXSk/KG5ldyBEYXRlKDFFMypiLndhbGxfdGltZSkpLnRvU3RyaW5nKCk6bnVsbH0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfcmVzZXREb21haW4oKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVzZXREb21haW4oKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuczpBcnJheSxydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOk9iamVjdCxydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVSdW5Ub1N0ZXAocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4KSJ9LHRpbWVEaXNwbGF5VHlwZTpTdHJpbmcsX3J1blRvU3RlcEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3J1bnNXaXRoU2xpZGVyczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMocnVucywgcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykifX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJdLF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHRkLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKGIsCmQsZixoKXtkPWRbZl07aWYoIV8uaXNOdW1iZXIoZCkpcmV0dXJuIiI7Yj1iW2ZdO2lmKCFiKXJldHVybiIiO2I9YltkXVtoXTtpZigic3RlcCI9PT1oKXJldHVybmBzdGVwICR7Yn1gO2lmKCJyZWxhdGl2ZSI9PT1oKXJldHVybiAxPmI/YCR7KDFFMypiKS50b0ZpeGVkKDIpfSBtc2A6YCR7Yi50b0ZpeGVkKDIpfSBzYDtpZigid2FsbF90aW1lIj09PWgpcmV0dXJuKG5ldyBEYXRlKDFFMypiKSkudG9TdHJpbmcoKTt0aHJvdyBFcnJvcihgVGhlIGRpc3BsYXkgdHlwZSBvZiAke2h9IGlzIG5vdCByZWNvZ25pemVkLmApO30sX3NsaWRlclZhbHVlQ2hhbmdlZChiKXtjb25zdCBkPWIudGFyZ2V0LmRhdGFzZXQucnVuLGY9Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWUsaD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtpc05hTihmKT9kZWxldGUgaFtkXTpoW2RdPWIudGFyZ2V0LmltbWVkaWF0ZVZhbHVlO3RoaXMuX3J1blRvU3RlcEluZGV4PWh9LF9jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKGIsCmQpe3JldHVybihiPWJbZF0pJiZiLmxlbmd0aD9iLmxlbmd0aC0xOjB9LF91cGRhdGVTdGVwc0Zvck5ld1J1bnMoYil7Y29uc3QgZD1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtfLmZvck93bihiLChmLGgpPT57Xy5pc051bWJlcihkW2hdKXx8KGRbaF09Zi5sZW5ndGgtMSl9KTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1kfSxfZ2V0U3RlcChiLGQpe3JldHVybiB0aGlzLl9ydW5Ub1N0ZXBJbmRleD90aGlzLl9ydW5Ub1N0ZXBJbmRleFtkXTowfSxfY29tcHV0ZVJ1blRvU3RlcChiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oZCwoaCxrKT0+e2NvbnN0IHI9YltrXTtyJiYoZltrXT1yW2hdLnN0ZXApfSk7cmV0dXJuIGZ9LF9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntyZWxvYWRPblJlYWR5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyhfdGFnVG9SdW5Ub0RhdGEpIn0sX3RhZ1RvUnVuVG9EYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3JlbGV2YW50U2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKF9zZWxlY3RlZFJ1bnMsIF9ydW5Ub1RhZ0luZm8pIn0sX3J1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSwKX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+Yi50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBkYy5SZXF1ZXN0TWFuYWdlcn0sX3N0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9LHJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj0KZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57aWYoIV8uaXNFcXVhbChkLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+Xy5rZXlzKGgpKTtmPWRjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWRDYXJkcygpe18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtcHItY3VydmUtY2FyZCIpLGI9PntiLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTtyZXR1cm4ga2MuY2F0ZWdvcml6ZVRhZ3MoYixkLGYpfSxfY29tcHV0ZUNvbG9yRm9yUnVuKGIpe3JldHVybiB0ZC5ydW5zQ29sb3JTY2FsZShiKX0sCl9jb21wdXRlUmVsZXZhbnRTZWxlY3RlZFJ1bnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9LF90YWdNZXRhZGF0YShiLGQsZil7Y29uc3QgaD17fTtkLmZvckVhY2goaz0+e2hba109YltrXVtmXX0pO2Q9Zi5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gcmYuYWdncmVnYXRlVGFnSW5mbyhoLGQpfSxfY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKGIpe3JldHVybiBkPT57dGhpcy5zZXQoIl90YWdUb1J1blRvRGF0YSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl90YWdUb1J1blRvRGF0YSx7W2JdOmR9KSl9fSxfY29tcHV0ZVJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMoYil7Y29uc3QgZD17fTtmb3IodmFyIGYgb2YgT2JqZWN0LmVudHJpZXMoYikpe2NvbnN0IFtoLGtdPWY7Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmVudHJpZXMoaykpe2NvbnN0IFtsXT1yO2lmKG51bGw9PWRbbF18fGg8ZFtsXSlkW2xdPWh9fWY9e307Zm9yKGNvbnN0IGggb2YgT2JqZWN0LmVudHJpZXMoZCkpe2NvbnN0IFtrLApyXT1oO3tjb25zdCBsPWJbcl1ba107ZltrXT1sLm1hcChwPT4oe3N0ZXA6cC5zdGVwLHdhbGxfdGltZTpwLndhbGxfdGltZSxyZWxhdGl2ZTpwLndhbGxfdGltZS1sWzBdLndhbGxfdGltZX0pKX19cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQvdGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19pbnN0YWxsQ29tbWFuZDp7dHlwZTpTdHJpbmcscmVhZE9ubHk6ITAsdmFsdWU6InBpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkLXBsdWdpbi1wcm9maWxlIn19LF9jb3B5SW5zdGFsbENvbW1hbmQoKXtjb25zdCBiPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe2NvbnN0IGQ9KCk9PldiKGZ1bmN0aW9uKigpe2IuJC5jb21tYW5kVGV4dGFyZWEuc2VsZWN0KCk7dHJ5e3lpZWxkIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGIuX2luc3RhbGxDb21tYW5kKX1jYXRjaChmKXtpZighZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QoKX19KTt0cnl7eWllbGQgZCgpLGIuJC5jb3BpZWRNZXNzYWdlLmlubmVyVGV4dD0iQ29waWVkLiJ9Y2F0Y2goZil7Yi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJGYWlsZWQgdG8gY29weSB0byBjbGlwYm9hcmQuIn19KX0sCl9yZW1vdmVDb3BpZWRNZXNzYWdlKCl7dGhpcy4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSIifX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9wbHVnaW4tZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBsdWdpbi1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF91c2VOYXRpdmVCYWNrZHJvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb3Blbk5vVGVuc29yRmxvd0RpYWxvZygpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93IiwnVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3Blbk9sZFRlbnNvckZsb3dEaWFsb2coYil7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3cgIisKYiwiVG8gZW5hYmxlIHRoaXMgcGx1Z2luIGluIFRlbnNvckJvYXJkLCBpbnN0YWxsIFRlbnNvckZsb3cgIitiKycgb3IgZ3JlYXRlciB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsYik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixkKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LF9jb21wdXRlSGlkZGVuKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksZD1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGIpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixkLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZj1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1mLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhmLGgpe2YmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYisiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFmO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksaCl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChmLGgpezA9PWY/dGhpcy5fY2xlYXIoKTowPT1oJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj1kYy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYiwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZCksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9ZH10aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGQpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxkKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGQsZil7MD09ZD90aGlzLl9jbGVhcigpOjA9PWYmJnRoaXMuX2xvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLAp2YWx1ZToxMCxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYKIXRoaXMuX2NvbnRyb2xzX2Rpc2FibGVkKXt2YXIgYj1bdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PQp0aGlzLl9yZWNvcmRUZXh0Pyh0aGlzLnNldCgiX3JlY29yZFRleHQiLCJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkYy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX0sCnJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPWRjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9pcy1hY3RpdmUiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e3RoaXMuc2V0KCJfaXNfYWN0aXZlIixkLmlzX2FjdGl2ZSk7dGhpcy5zZXQoIl9jb250cm9sc19kaXNhYmxlZCIsIWQuaXNfY29uZmlnX3dyaXRhYmxlKX0pfX19KTtwZS5yZWdpc3RlckRhc2hib2FyZCgpfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tc3BsaXQtbGF5b3V0L3ZhYWRpbi1zcGxpdC1sYXlvdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLXNwbGl0LWxheW91dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7dmVydGljYWw6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LF9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzOlN0cmluZyxfcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzOlN0cmluZ30sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXModGhpcy5fcHJvY2Vzc0NoaWxkcmVuKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcil9LF9wcm9jZXNzQ2hpbGRyZW46ZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiLmNsYXNzTGlzdC5jb250YWlucygic3BsaXR0ZXItaGFuZGxlIik/CihQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJoYW5kbGUiKSwhMSk6ITB9KS5mb3JFYWNoKGZ1bmN0aW9uKGIsZCl7MD09PWQ/KHRoaXMuX3ByaW1hcnlDaGlsZD1iLFBvbHltZXIuZG9tKGIpLnNldEF0dHJpYnV0ZSgic2xvdCIsInByaW1hcnkiKSk6MT09ZD8odGhpcy5fc2Vjb25kYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJzZWNvbmRhcnkiKSk6UG9seW1lci5kb20oYikucmVtb3ZlQXR0cmlidXRlKCJzbG90Iil9LmJpbmQodGhpcykpfSxfc2V0RmxleEJhc2lzOmZ1bmN0aW9uKGIsZCxmKXtkPU1hdGgubWF4KDAsTWF0aC5taW4oZCxmKSk7MD09PWQmJihkPTFFLTYpO2Iuc3R5bGUuZmxleD0iMSAxICIrZCsicHgifSxfb25IYW5kbGVUcmFjazpmdW5jdGlvbihiKXtpZih0aGlzLl9wcmltYXJ5Q2hpbGQmJnRoaXMuX3NlY29uZGFyeUNoaWxkKXt2YXIgZD10aGlzLnZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7InN0YXJ0Ij09PQpiLmRldGFpbC5zdGF0ZT8odGhpcy5fc3RhcnRTaXplPXtjb250YWluZXI6dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXS10aGlzLiQuc3BsaXR0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0scHJpbWFyeTp0aGlzLl9wcmltYXJ5Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0sc2Vjb25kYXJ5OnRoaXMuX3NlY29uZGFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdfSx0aGlzLl9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzPXRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzLHRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzLHRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIix0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIik6KGQ9dGhpcy52ZXJ0aWNhbD9iLmRldGFpbC5keToKYi5kZXRhaWwuZHgsdGhpcy5fc2V0RmxleEJhc2lzKHRoaXMuX3ByaW1hcnlDaGlsZCx0aGlzLl9zdGFydFNpemUucHJpbWFyeStkLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9zZWNvbmRhcnlDaGlsZCx0aGlzLl9zdGFydFNpemUuc2Vjb25kYXJ5LWQsdGhpcy5fc3RhcnRTaXplLmNvbnRhaW5lciksdGhpcy5ub3RpZnlSZXNpemUoKSwiZW5kIj09PWIuZGV0YWlsLnN0YXRlJiYoZGVsZXRlIHRoaXMuX3N0YXJ0U2l6ZSx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9wcmV2aW91c1ByaW1hcnlQb2ludGVyRXZlbnRzLHRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzKSl9fSxfcHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcXVlcnktcGFuZS90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1xdWVyeS1wYW5lIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NoZW1hOntocGFyYW1Db2x1bW5zOltdLG1ldHJpY0NvbHVtbnM6W119LGNvbHVtbnNWaXNpYmlsaXR5OltdLHZpc2libGVTY2hlbWE6e2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfX0pLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sc2Vzc2lvbkdyb3Vwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10scmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksCnZhbHVlOigpPT5be3ZhbHVlOiJTVEFUVVNfVU5LTk9XTiIsZGlzcGxheU5hbWU6IlVua25vd24iLGFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX1NVQ0NFU1MiLGRpc3BsYXlOYW1lOiJTdWNjZXNzIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYj0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWJ9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgZGMuQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsCnZhbHVlOnt2YWx1ZToiMTAwIixpbnZhbGlkOiExfX0sX3BhZ2VOdW1iZXJJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxIixpbnZhbGlkOiExfX0sX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nLF9zZXNzaW9uR3JvdXBzUmVxdWVzdDpPYmplY3R9LG9ic2VydmVyczpbIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyhiYWNrZW5kLCBleHBlcmltZW50TmFtZSkiLCJfdXBkYXRlQ29uZmlndXJhdGlvbihfaHBhcmFtcy4qLCBfbWV0cmljcy4qKSJdLHJlbG9hZCgpe3RoaXMuX3F1ZXJ5U2VydmVyKCl9LF9jc3ZVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwiY3N2Iil9LF9qc29uVXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQsImpzb24iKX0sX2xhdGV4VXJsKGIsZCl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChiLApkLCJsYXRleCIpfSxfZG93bmxvYWREYXRhVXJsKGIsZCxmKXtyZXR1cm4gdGhpcy5iYWNrZW5kLmdldERvd25sb2FkVXJsKGYsYixkLmNvbHVtbnNWaXNpYmlsaXR5KX0sX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKCl7Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzO2IuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5iYWNrZW5kKXx8Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmV4cGVyaW1lbnROYW1lKXx8dGhpcy5iYWNrZW5kLmdldEV4cGVyaW1lbnQoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWV9KS50aGVuKGQ9PntfLmlzRXF1YWwoZCx0aGlzLl9leHBlcmltZW50KXx8KHRoaXMuc2V0KCJfZXhwZXJpbWVudCIsZCksdGhpcy5fY29tcHV0ZUhQYXJhbXMoKSx0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KS5maW5hbGx5KCgpPT57dGhpcy5fY29tcHV0ZURhdGFGb3VuZCgpfSl9LApfY29tcHV0ZURhdGFGb3VuZCgpe2NvbnN0IGI9ISEodGhpcy5fZXhwZXJpbWVudCYmdGhpcy5fZXhwZXJpbWVudC5ocGFyYW1JbmZvcyYmMDx0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmxlbmd0aCYmdGhpcy5fZXhwZXJpbWVudC5tZXRyaWNJbmZvcyYmMDx0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmxlbmd0aCk7dGhpcy5zZXQoImRhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zIixiKTt0aGlzLnNldCgiZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMiLCFiKX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGQsZik9Pntjb25zdCBoPXtpbmZvOmQsZGlzcGxheWVkOjU+ZixmaWx0ZXI6e319O2guaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8oaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssCmNoZWNrZWQ6ITB9KX0pKToiREFUQV9UWVBFX0JPT0wiPT09aC5pbmZvLnR5cGU/aC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W3t2YWx1ZTohMSxjaGVja2VkOiEwfSx7dmFsdWU6ITAsY2hlY2tlZDohMH1dOiJEQVRBX1RZUEVfRkxPQVQ2NCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5pbnRlcnZhbD17bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixoLmluZm8udHlwZSk7Yi5wdXNoKGgpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixiKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYj1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGQsZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LAptYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fX0sZGlzcGxheWVkOjU+Zn0pfSk7dGhpcy5zZXQoIl9tZXRyaWNzIixiKX0sX2NvbXB1dGVTY2hlbWEoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz97aHBhcmFtQ29sdW1uczp0aGlzLl9ocGFyYW1zLm1hcChiPT4oe2hwYXJhbUluZm86Yi5pbmZvfSkpLG1ldHJpY0NvbHVtbnM6dGhpcy5fbWV0cmljcy5tYXAoYj0+KHttZXRyaWNJbmZvOmIuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJgp0aGlzLl9tZXRyaWNzP3RoaXMuX2hwYXJhbXMubWFwKGI9PmIuZGlzcGxheWVkKS5jb25jYXQodGhpcy5fbWV0cmljcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpKTpbXX0sX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl7aWYoIXRoaXMuX2hwYXJhbXN8fCF0aGlzLl9tZXRyaWNzKXJldHVybntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX07Y29uc3QgYj10aGlzLl9ocGFyYW1zLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyksZD10aGlzLl9tZXRyaWNzLmZpbHRlcihmPT5mLmRpc3BsYXllZCkubWFwKGY9PmYuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmIsbWV0cmljSW5mb3M6ZH19LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe2lmKHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3MpcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7dmFsdWU6YiwKY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7aWYobnVsbCE9PWIpcmV0dXJuIHRoaXMuc2V0KCJfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QiLGIpLHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbEFsbCgpLHRoaXMuYmFja2VuZC5saXN0U2Vzc2lvbkdyb3VwcyhiKX0sCl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPWYuZ2V0KG0rIi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249K247Y29uc3QgcT1OdW1iZXIuaXNJbnRlZ2VyKG4pJiYwPG47Zi5zZXQobSsiLmludmFsaWQiLCFxKTtoPWgmJnE7cmV0dXJuIHE/bjpudWxsfQpjb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHI9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD1tLmZpbHRlci5yZWdleHA7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiaHBhcmFtLmZpbHRlciB3aXRoIG5vIGRvbWFpbkRpc2NyZXRlLCBpbnRlcnZhbCBvciByZWdleHAgcHJvcGVydGllcyBzZXQ6ICVzIiwKbSksbnVsbDtyLnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3IucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHIpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDtyW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoiT1JERVJfREVTQyJ9Y29uc3QgbD1kKCJfcGFnZU51bWJlcklucHV0IikscD1kKCJfcGFnZVNpemVJbnB1dCIpO3JldHVybiBoP3tleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLGFsbG93ZWRTdGF0dXNlczprLApjb2xQYXJhbXM6cixzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuIGtbcl19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHI9dGhpcy5oZWFkZXI7ciYmKGZba10mJiFmW2hdPyhyLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0scikpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgcj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQpyLmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChyLmxlZnQrci53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayxyPTA7az1mW3JdO3IrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSxyPWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2ZvcihyPW4vaztyPGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHIrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgdz10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHI9KG0tcCkvaztyPGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmdytoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSkscis9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtY2VsbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW46T2JqZWN0LGV4cGFuZGVkOkJvb2xlYW4sZmxleEdyb3c6TnVtYmVyLGNvbFNwYW46TnVtYmVyLGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saGlkZGVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpbnN0YW5jZTpPYmplY3QsaW5kZXg6TnVtYmVyLGl0ZW06T2JqZWN0LHNlbGVjdGVkOkJvb2xlYW4sdGVtcGxhdGU6T2JqZWN0LHRhcmdldDpPYmplY3Qsd2lkdGg6U3RyaW5nLG9yZGVyOk51bWJlcixyZW9yZGVyU3RhdHVzOnt0eXBlOlN0cmluZyxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9jaGlsZENvbHVtbnM6QXJyYXksX2NlbGxDb250ZW50Ok9iamVjdCxfaW5zZXJ0aW9uUG9pbnQ6T2JqZWN0LApfdGVtcGxhdGl6ZXI6T2JqZWN0fSxvYnNlcnZlcnM6Il9jb2x1bW5DaGFuZ2VkKGNvbHVtbik7X2NlbGxBdHRhY2hlZChjb2x1bW4sIGlzQXR0YWNoZWQpO19leHBhbmRlZENoYW5nZWQoZXhwYW5kZWQsIGluc3RhbmNlKTtfZmxleEdyb3dDaGFuZ2VkKGZsZXhHcm93KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBpbnN0YW5jZSk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGluc3RhbmNlKTtfaW5zdGFuY2VDaGFuZ2VkKGluc3RhbmNlLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGluc3RhbmNlKTtfdG9nZ2xlQ29udGVudChpc0F0dGFjaGVkLCBfY2VsbENvbnRlbnQsIF9pbnNlcnRpb25Qb2ludCk7X3RvZ2dsZUluc3RhbmNlKGlzQXR0YWNoZWQsIF90ZW1wbGF0aXplciwgaW5zdGFuY2UpO193aWR0aENoYW5nZWQod2lkdGgpO19vcmRlckNoYW5nZWQob3JkZXIpO192aXNpYmxlQ2hpbGRDb2x1bW5zQ2hhbmdlZChfdmlzaWJsZUNoaWxkQ29sdW1ucyk7X2NoaWxkQ29sdW1uc0NoYW5nZWQoX2NoaWxkQ29sdW1ucykiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jZWxsIik7ITE9PT1Qb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyYmKHRoaXMuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSx0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkIikpfSxfY29sdW1uQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmZsZXhHcm93PWQuZmxleEdyb3c7dGhpcy5mcm96ZW49ZC5mcm96ZW47dGhpcy5sYXN0RnJvemVuPWQuX2xhc3RGcm96ZW47dGhpcy5oZWFkZXJUZW1wbGF0ZT1kLmhlYWRlclRlbXBsYXRlO3RoaXMuZm9vdGVyVGVtcGxhdGU9ZC5mb290ZXJUZW1wbGF0ZTt0aGlzLnRlbXBsYXRlPWQudGVtcGxhdGU7dGhpcy53aWR0aD1kLndpZHRoO3RoaXMuaGlkZGVuPWQuaGlkZGVuO3RoaXMucmVzaXphYmxlPWQucmVzaXphYmxlO3RoaXMuX2NoaWxkQ29sdW1ucz1kLl9jaGlsZENvbHVtbnM7dGhpcy5vcmRlcj1kLl9vcmRlcjtkLmNvbFNwYW4mJih0aGlzLmNvbFNwYW49CmQuY29sU3Bhbik7dGhpcy5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSxfY2VsbEF0dGFjaGVkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGY/dGhpcy5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fHRoaXMudW5saXN0ZW4oZCwicHJvcGVydHktY2hhbmdlZCIsIl9jb2x1bW5Qcm9wQ2hhbmdlZCIpfSkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQ9PXRoaXMuY29sdW1uJiYodGhpc1tkLmRldGFpbC5wYXRoXT1kLmRldGFpbC52YWx1ZSl9LF9leHBhbmRlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX2V4cGFuZGVkX189ZCxmLmV4cGFuZGVkPWQpfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUuZmxleEdyb3c9CmR9LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5pbmRleD1kKX0sX2l0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLl9fc2VsZWN0ZWRfXz1kLGYuc2VsZWN0ZWQ9ZCl9LF9jaGlsZENvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuY29sU3Bhbj1kLmxlbmd0aH0sX3RvZ2dsZUNvbnRlbnQ6ZnVuY3Rpb24oZCxmLGgpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJnZvaWQgMCE9PWgmJihkPyhQb2x5bWVyLmRvbShmKS5wYXJlbnROb2RlIT09dGhpcy50YXJnZXQmJlBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5hcHBlbmRDaGlsZChmKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChoKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8UG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PQp0aGlzLnRhcmdldHx8UG9seW1lci5kb20odGhpcy50YXJnZXQpLnJlbW92ZUNoaWxkKGYpfSkpfSxfdG9nZ2xlSW5zdGFuY2U6ZnVuY3Rpb24oZCxmLGgpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJnZvaWQgMCE9PWgmJihkP2YuYWRkSW5zdGFuY2UoaCk6Zi5yZW1vdmVJbnN0YW5jZShoKSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5zdHlsZS53aWR0aD1kfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUub3JkZXI9ZH0sX3RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmluc3RhbmNlPWQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKTt0aGlzLl90ZW1wbGF0aXplcj1kLnRlbXBsYXRpemVyfSxfaW5zdGFuY2VDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKHRoaXMuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuX2NlbGxDb250ZW50PXRoaXMuX2NlbGxDb250ZW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiKSwKZD0idmFhZGluLWdyaWQtY2VsbC1jb250ZW50LSIrKHZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXg9dmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleCsxfHwwKSx0aGlzLl9jZWxsQ29udGVudC5pbm5lckhUTUw9IiIsUG9seW1lci5kb20odGhpcy5fY2VsbENvbnRlbnQpLmFwcGVuZENoaWxkKHRoaXMuaW5zdGFuY2Uucm9vdCksdGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJpZCIsZCksUG9seW1lci5FbGVtZW50Pyh0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoInNsb3QiLGQpLHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzbG90IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJuYW1lIixkKSk6KHRoaXMuX2luc2VydGlvblBvaW50PXRoaXMuX2luc2VydGlvblBvaW50fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjb250ZW50IiksdGhpcy5faW5zZXJ0aW9uUG9pbnQuc2V0QXR0cmlidXRlKCJzZWxlY3QiLAoiIyIrZCkpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl90ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpIl0sX2NlbGxDbGljazpmdW5jdGlvbihkKXtkLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOnRoaXMuaW5zdGFuY2V9KX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiLHByb3BlcnRpZXM6e2hlYWRlclRlbXBsYXRlOk9iamVjdCxyZXNpemFibGU6Qm9vbGVhbixjb2x1bW5SZXNpemluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2hlYWRlclRlbXBsYXRlQ2hhbmdlZChoZWFkZXJUZW1wbGF0ZSkiLCJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIiwKIl9yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiXSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplIixtb3VzZW1vdmU6Il9lbmFibGVEcmFnIixtb3VzZW91dDoiX2Rpc2FibGVEcmFnIix0b3VjaHN0YXJ0OiJfb25Ub3VjaFN0YXJ0Iix0b3VjaG1vdmU6Il9vblRvdWNoTW92ZSIsdG91Y2hlbmQ6Il9vblRvdWNoRW5kIixjb250ZXh0bWVudToiX29uQ29udGV4dE1lbnUifSxfb25Db250ZXh0TWVudTpmdW5jdGlvbihkKXt0aGlzLl9yZW9yZGVyR2hvc3QmJmQucHJldmVudERlZmF1bHQoKX0sX29uVG91Y2hTdGFydDpmdW5jdGlvbihkKXtkLnRhcmdldCE9PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmdGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJih0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyLmJpbmQodGhpcyxkKSwxMDApKX0sX3N0YXJ0UmVvcmRlcjpmdW5jdGlvbihkKXt0aGlzLl9yZW9yZGVyR2hvc3Q9CnRoaXMuX2dldEdob3N0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiO3ZhciBmPW5ldyBDdXN0b21FdmVudCgiZHJhZ3N0YXJ0Iix7YnViYmxlczohMH0pO3RoaXMuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQoZik7dGhpcy5fcmVvcmRlclhZPXt4OmQudG91Y2hlc1swXS5jbGllbnRYLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCx5OmQudG91Y2hlc1swXS5jbGllbnRZLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGQudG91Y2hlc1swXS5jbGllbnRYLGQudG91Y2hlc1swXS5jbGllbnRZKX0sX29uVG91Y2hNb3ZlOmZ1bmN0aW9uKGQpe2lmKHRoaXMuX3Jlb3JkZXJHaG9zdCl7ZC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBmPW5ldyBDdXN0b21FdmVudCgiZHJhZ292ZXIiLHtidWJibGVzOiEwfSk7Zi5jbGllbnRYPWQudG91Y2hlc1swXS5jbGllbnRYO2YuY2xpZW50WT0KZC50b3VjaGVzWzBdLmNsaWVudFk7dmFyIGg9dGhpcy5fY29udGVudEZyb21Qb2ludChmLmNsaWVudFgsZi5jbGllbnRZKTtoJiZoLmRpc3BhdGNoRXZlbnQoZik7dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9ZWxzZSBjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCl9LF91cGRhdGVHaG9zdFBvc2l0aW9uOmZ1bmN0aW9uKGQsZil7ZC09dGhpcy5fcmVvcmRlclhZLng7Zj1mLXRoaXMuX3Jlb3JkZXJYWS55LTUwO3ZhciBoPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0fHwwKSxrPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3B8fDApLHI9dGhpcy5fcmVvcmRlckdob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS5sZWZ0PWgtKHIubGVmdC1kKSsicHgiO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50b3A9CmstKHIudG9wLWYpKyJweCJ9LF9vblRvdWNoRW5kOmZ1bmN0aW9uKGQpe2NsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KTt0aGlzLl9yZW9yZGVyR2hvc3QmJihkLnByZXZlbnREZWZhdWx0KCksZD1uZXcgQ3VzdG9tRXZlbnQoImRyYWdlbmQiLHtidWJibGVzOiEwfSksdGhpcy5kaXNwYXRjaEV2ZW50KGQpLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuX3Jlb3JkZXJHaG9zdD1udWxsKX0sX2NvbnRlbnRGcm9tUG9pbnQ6ZnVuY3Rpb24oZCxmKXtpZihQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyl7dmFyIGg9dGhpcy50YXJnZXQuJC5zY3JvbGxlcjtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITApO2Q9dGhpcy5kb21Ib3N0LnJvb3QuZWxlbWVudEZyb21Qb2ludChkLGYpO2gudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMSk7aWYoZCYmZC5nZXRDb250ZW50Q2hpbGRyZW4pcmV0dXJuIGQuZ2V0Q29udGVudENoaWxkcmVuKFBvbHltZXIuRWxlbWVudD8KInNsb3QiOiJjb250ZW50IilbMF19ZWxzZSByZXR1cm4gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChkLGYpfSxfZ2V0R2hvc3Q6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLnRhcmdldC4kLnNjcm9sbGVyLiQucmVvcmRlcmdob3N0O2QuaW5uZXJUZXh0PXRoaXMuX2NlbGxDb250ZW50LmlubmVyVGV4dDt2YXIgZj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jZWxsQ29udGVudCk7ImJveFNpemluZyBkaXNwbGF5IHdpZHRoIGhlaWdodCBiYWNrZ3JvdW5kIGFsaWduSXRlbXMgcGFkZGluZyBib3JkZXIgZmxleC1kaXJlY3Rpb24gb3ZlcmZsb3ciLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihoKXtkLnN0eWxlW2hdPWZbaF19LHRoaXMpO3JldHVybiBkfSxfZW5hYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT10aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmIXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpfSxfZGlzYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9CiExfSxfY2FuY2VsTW91c2VEb3duT25SZXNpemU6ZnVuY3Rpb24oZCl7ZC50YXJnZXQ9PT10aGlzLl9yZXNpemVIYW5kbGUmJmQucHJldmVudERlZmF1bHQoKX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZD8odGhpcy5fcmVzaXplSGFuZGxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuX3Jlc2l6ZUhhbmRsZS5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSIpLHRoaXMubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpOnRoaXMuX3Jlc2l6ZUhhbmRsZSYmKHRoaXMudW5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSl9LF9vblRyYWNrOmZ1bmN0aW9uKGQpe3RoaXMuY29sdW1uUmVzaXppbmc9CiEwO3ZhciBmPXRoaXMuY29sdW1uOyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09Zi5sb2NhbE5hbWUmJihmPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGYuX2NoaWxkQ29sdW1ucywwKS5zb3J0KGZ1bmN0aW9uKHIsbCl7cmV0dXJuIHIuX29yZGVyLWwuX29yZGVyfSkuZmlsdGVyKGZ1bmN0aW9uKHIpe3JldHVybiFyLmhpZGRlbn0pLnBvcCgpKTt2YXIgaD10aGlzLl9nZXRIZWFkZXJDZWxsQnlDb2x1bW4oZik7aWYoaC5vZmZzZXRXaWR0aCl7dmFyIGs9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaC5fY2VsbENvbnRlbnQpO2Yud2lkdGg9TWF0aC5tYXgoMTArcGFyc2VJbnQoay5wYWRkaW5nTGVmdCkrcGFyc2VJbnQoay5wYWRkaW5nUmlnaHQpLGgub2Zmc2V0V2lkdGgrZC5kZXRhaWwueC1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KSsicHgiO2YuZmxleEdyb3c9MH1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIikpLnNvcnQoZnVuY3Rpb24ociwKbCl7cmV0dXJuIHIuY29sdW1uLl9vcmRlci1sLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKHIsbCxwKXtsPHAuaW5kZXhPZihoKSYmKHIuY29sdW1uLndpZHRoPXIub2Zmc2V0V2lkdGgrInB4IixyLmNvbHVtbi5mbGV4R3Jvdz0wKX0pO3RoaXMuY29sdW1uUmVzaXppbmcmJiJlbmQiPT09ZC5kZXRhaWwuc3RhdGUmJih0aGlzLmNvbHVtblJlc2l6aW5nPSExKTt0aGlzLmZpcmUoImNvbHVtbi1yZXNpemluZyIpfSxfZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uOmZ1bmN0aW9uKGQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGYpe3JldHVybiBmLmNvbHVtbj09PWR9KVswXX0sX2hlYWRlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihkKXt2b2lkIDAhPT0KZCYmKG51bGw9PT1kfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihkLGYpe2YmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIixwcm9wZXJ0aWVzOntmb290ZXJUZW1wbGF0ZTpPYmplY3R9LGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZChmb290ZXJUZW1wbGF0ZSkiLAoiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSJdLF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09ZCYmKG51bGw9PT1kfHwhdGhpcy5faXNDb2x1bW5Sb3cmJiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiIT09dGhpcy5jb2x1bW4ubG9jYWxOYW1lPyh0aGlzLmluc3RhbmNlPXtyb290OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfSx0aGlzLl9pc0VtcHR5PSEwKToodGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCksdGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcix0aGlzLl9pc0VtcHR5PSExKSl9LF9pc0VtcHR5Q2hhbmdlZDpmdW5jdGlvbihkLGYpe2YmJnRoaXMuZmlyZSgiY2VsbC1lbXB0eS1jaGFuZ2VkIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyLWNlbGwiLGJlaGF2aW9yczpbYl19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtc2l6ZXIiLHByb3BlcnRpZXM6e2NvbHVtblRyZWU6QXJyYXksdG9wOk51bWJlcixfY29sdW1uczpBcnJheX0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUpIiwiX3RvcENoYW5nZWQodG9wKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9jb2x1bW5zPWJbYi5sZW5ndGgtMV19LF90b3BDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudG9wPWIrInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1vdXRlci1zY3JvbGxlciIscHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3Njcm9sbFRhcmdldENoYW5nZWQifSxwYXNzdGhyb3VnaDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMH19LGxpc3RlbmVyczp7c2Nyb2xsOiJfc3luY1Njcm9sbFRhcmdldCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKTt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPSJ0b3VjaCJ9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpfSxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJnRoaXMudW5saXN0ZW4oZCwic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIik7dGhpcy5saXN0ZW4oYiwKInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpfSxfb25Nb3VzZU1vdmU6ZnVuY3Rpb24oYil7dGhpcy5wYXNzdGhyb3VnaD1iLm9mZnNldFk8PXRoaXMuY2xpZW50SGVpZ2h0JiZiLm9mZnNldFg8PXRoaXMuY2xpZW50V2lkdGh9LF9zeW5jT3V0ZXJTY3JvbGxlcjpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXR8fCh0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMCx0aGlzLnNjcm9sbFRvcD10aGlzLmRvbUhvc3QuX3Njcm9sbFRvcCx0aGlzLnNjcm9sbExlZnQ9dGhpcy5kb21Ib3N0Ll9zY3JvbGxMZWZ0KTt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSExfSxfc3luY1Njcm9sbFRhcmdldDpmdW5jdGlvbigpe3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyfHwodGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbExlZnQsCnRoaXMuZG9tSG9zdC5fc2Nyb2xsSGFuZGxlcigpKTt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcj0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJncmlkY2VsbCJ9LHByb3BlcnRpZXM6e2FjdGl2ZVRhcmdldDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hY3RpdmVUYXJnZXRDaGFuZ2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcHJpbWFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5wcmltYXJ5Iik7dGhpcy5fc2Vjb25kYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnNlY29uZGFyeSIpO2lmKFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdylQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9zZWNvbmRhcnkpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3ByaW1hcnkpfSxmb2N1czpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWQhPT10aGlzLl9wcmltYXJ5P3RoaXMuX3ByaW1hcnkuZm9jdXMoKToKdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCl9LF9vbkJhaXRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2VkPWIudGFyZ2V0O3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtZ2FpbmVkIiksdGhpcy5fcHJpbWFyeS50YWJJbmRleD0tMSl9LF9vbkJhaXRCbHVyOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1sb3N0IiksdGhpcy5fcHJpbWFyeS50YWJJbmRleD0wKX0sX2FjdGl2ZVRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYiksdGhpcy5fcHJpbWFyeS5mb2N1cygpKTsKdGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfSxfcmVhbm5vdW5jZTpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5Iix0aGlzLmFjdGl2ZVRhcmdldCksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5Iix0aGlzLmFjdGl2ZVRhcmdldCksdGhpcy5fcHJpbWFyeS5mb2N1cygpKTt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtcm93Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sY29sdW1uczpBcnJheSxpbmRleDpOdW1iZXIsY2VsbHM6e3ZhbHVlOltdfSx0YXJnZXQ6T2JqZWN0LGV4cGFuZGVkOnt2YWx1ZTohMX0sZm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saXRlbTpPYmplY3Qsc2VsZWN0ZWQ6e3JlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3Jvd0RldGFpbHNDZWxsOk9iamVjdCxyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0fSxvYnNlcnZlcnM6Il9jb2x1bW5zQ2hhbmdlZChjb2x1bW5zLCB0YXJnZXQpO19pbmRleENoYW5nZWQoaW5kZXgsIGNlbGxzKTtfaXRlbUNoYW5nZWQoaXRlbSwgY2VsbHMpO19pdGVtQ2hhbmdlZEZvckRldGFpbHMoaXRlbSwgX3Jvd0RldGFpbHNDZWxsKTtfcm93RGV0YWlsc0NoYW5nZWQoZXhwYW5kZWQsIHJvd0RldGFpbHNUZW1wbGF0ZSwgdGFyZ2V0KTtfcm93RGV0YWlsc0NlbGxJbmRleENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCBpbmRleCk7X3Jvd0RldGFpbHNDZWxsQ2hhbmdlZChfcm93RGV0YWlsc0NlbGwsIHRhcmdldCk7X3NlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZCwgY2VsbHMpO19zZWxlY3RlZENoYW5nZWRGb3JEZXRhaWxzKHNlbGVjdGVkLCBfcm93RGV0YWlsc0NlbGwpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtcm93Iik7ITE9PT1Qb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyYmKHRoaXMuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSx0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkIikpfSxpdGVyYXRlQ2VsbHM6ZnVuY3Rpb24oZCl7dGhpcy5jZWxscy5mb3JFYWNoKGQpO3RoaXMuX3Jvd0RldGFpbHNDZWxsJiZkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKX0sX3Jvd0RldGFpbHNDaGFuZ2VkOmZ1bmN0aW9uKGQsZixoKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oKXtpZihkKXt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIik7ay5zZXRBdHRyaWJ1dGUoImRldGFpbHNjZWxsIiwhMCk7ay5mcm96ZW49ITA7ay50YXJnZXQ9aDtrLnRlbXBsYXRlPWY7ay50b2dnbGVBdHRyaWJ1dGUoImxhc3Rjb2x1bW4iLCEwKTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGspOwpQb2x5bWVyLmRvbS5mbHVzaCgpO3RoaXMuX3Jvd0RldGFpbHNDZWxsPWt9ZWxzZSB0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5fcm93RGV0YWlsc0NlbGwpLHRoaXMuX3Jvd0RldGFpbHNDZWxsPW51bGwpO3RoaXMuaXRlcmF0ZUNlbGxzKGZ1bmN0aW9uKHIpe3IuZXhwYW5kZWQ9ZH0pO3RoaXMudGFyZ2V0LiQuc2Nyb2xsZXIuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpfX0sX3VwZGF0ZVJvd1Zpc2liaWxpdHk6ZnVuY3Rpb24oKXt0aGlzLmhpZGRlbj10aGlzLmNlbGxzLmV2ZXJ5KGZ1bmN0aW9uKGQpe3JldHVybiBkLl9pc0VtcHR5fSl9LF9yb3dEZXRhaWxzQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLiQuc2Nyb2xsZXIuX3VwZGF0ZSgpfSxfcm93RGV0YWlsc0NlbGxJbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZD8oZC5pbmRleD0KZixQb2x5bWVyLmRvbS5mbHVzaCgpLHRoaXMudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCkpOnRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT0iIil9LHVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX3Jvd0RldGFpbHNDZWxsJiYodGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0Ll9vYnNlcnZlciYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoJiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXIuZmx1c2goKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPXRoaXMuX3Jvd0RldGFpbHNDZWxsLnN0eWxlLmhlaWdodD10aGlzLl9yb3dEZXRhaWxzQ2VsbC5jbGllbnRIZWlnaHQrInB4Iil9LF9jb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0iIjt2YXIgaD1bXTtkLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHI9CiJfIit0aGlzLmlzLnJlcGxhY2UoLy0vZywiXyIpKyJfY2VsbHMiO3I9a1tyXT1rW3JdfHxbXTt2YXIgbD1yLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4hUG9seW1lci5kb20obSkucGFyZW50Tm9kZX0pWzBdO2lmKCFsKXtsPXRoaXMuX2NyZWF0ZUNlbGwoKTt2YXIgcD1BcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKHRoaXMudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoImRvbS1yZXBlYXQiKSxmdW5jdGlvbihtKXtyZXR1cm4hbS5yZXN0YW1wfSk7KHA9cHx8InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciPT09dGhpcy5pc3x8InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciPT09dGhpcy5pcyl8fHIucHVzaChsKX1sLmluZGV4PXRoaXMuaW5kZXg7bC50YXJnZXQ9dGhpcy50YXJnZXQ7bC5faXNDb2x1bW5Sb3c9dGhpcy5faXNDb2x1bW5Sb3c7bC5jb2x1bW49aztsLmV4cGFuZGVkPXRoaXMuZXhwYW5kZWQ7UG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQobCk7aC5wdXNoKGwpfS5iaW5kKHRoaXMpKTsKdGhpcy5jZWxscz1ofX0sX2luZGV4Q2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLmluZGV4PWR9KX0sX2l0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi5mb3JFYWNoKGZ1bmN0aW9uKGgpe2guaXRlbT1kfSl9LF9pdGVtQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5pdGVtPWQpfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi5mb3JFYWNoKGZ1bmN0aW9uKGgpe2guc2VsZWN0ZWQ9ZH0pfSxfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlsczpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYmJihmLnNlbGVjdGVkPWQpfSx1cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7dGhpcy5jZWxscy5zbGljZSgwKS5zb3J0KGZ1bmN0aW9uKGQsCmYpe3JldHVybiBkLmNvbHVtbi5fb3JkZXItZi5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbihkLGYsaCl7ZC50b2dnbGVBdHRyaWJ1dGUoImxhc3Rjb2x1bW4iLGY9PT1oLmxlbmd0aC0xKX0pfX07UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLXJvdyIsYmVoYXZpb3JzOltiXSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1jZWxsIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciLGJlaGF2aW9yczpbYl0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVJvd1Zpc2liaWxpdHkoY29sdW1ucykiXSxsaXN0ZW5lcnM6eyJjZWxsLWVtcHR5LWNoYW5nZWQiOiJfdXBkYXRlUm93VmlzaWJpbGl0eSJ9LF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIil9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciLApiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Sb3dEZXRhaWxzQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2V4cGFuZGVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQifSxvYnNlcnZlcnM6WyJfZXhwYW5kZWRJdGVtc0NoYW5nZWQoZXhwYW5kZWRJdGVtcy4qLCBkYXRhUHJvdmlkZXIpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQoX3Jvd0RldGFpbHNUZW1wbGF0ZSkiXSxfZXhwYW5kZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fZmx1c2hJdGVtc0RlYm91bmNlcigpLHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcyYmdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZil7Zi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGYuaXRlbSl9LmJpbmQodGhpcykpKX0sCl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtkLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7ZC5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH07UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChkKTtkLnRlbXBsYXRlPWI7Yi50ZW1wbGF0aXplcj1kfSxfaXNFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5leHBhbmRlZEl0ZW1zJiYtMSE9PXRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpfSxleHBhbmRJdGVtOmZ1bmN0aW9uKGIpe3RoaXMuX2lzRXhwYW5kZWQoYil8fHRoaXMucHVzaCgiZXhwYW5kZWRJdGVtcyIsYil9LGNvbGxhcHNlSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpJiZ0aGlzLnNwbGljZSgiZXhwYW5kZWRJdGVtcyIsdGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYiksMSl9LApfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZDpmdW5jdGlvbihiKXsiZXhwYW5kZWQiPT09Yi5kZXRhaWwucHJvcCYmKGIuZGV0YWlsLnZhbHVlP3RoaXMuZXhwYW5kSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pOnRoaXMuY29sbGFwc2VJdGVtKGIuZGV0YWlsLmluc3QuaXRlbSksYi5zdG9wUHJvcGFnYXRpb24oKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkRhdGFQcm92aWRlckJlaGF2aW9yPXtsaXN0ZW5lcnM6eyJpdGVtLWNoYW5nZWQiOiJfdGVtcGxhdGVJdGVtQ2hhbmdlZCJ9LHByb3BlcnRpZXM6e3BhZ2VTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxvYnNlcnZlcjoiX3BhZ2VTaXplQ2hhbmdlZCJ9LGRhdGFQcm92aWRlcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YVByb3ZpZGVyQ2hhbmdlZCJ9LF9sb2FkaW5nOkJvb2xlYW4sX2NhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX3BlbmRpbmdSZXF1ZXN0czp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19fSxfdGVtcGxhdGVJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5pdGVtO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5jaGlsZHJlbixmdW5jdGlvbihmKXtmLml0ZW09PT1kJiZmLml0ZXJhdGVDZWxscyhmdW5jdGlvbihoKXtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9CiEwO2guaW5zdGFuY2Uubm90aWZ5UGF0aCgiaXRlbS4iK2IuZGV0YWlsLnBhdGgsYi5kZXRhaWwudmFsdWUpO2guX3RlbXBsYXRpemVyLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudD0hMX0pfSl9LF9nZXRDYWNoZWRJdGVtOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX2dldFBhZ2VGb3JJbmRleChiKSxmPXRoaXMuX2NhY2hlJiZ0aGlzLl9jYWNoZVtkXTtyZXR1cm4gZj9mW2ItZCp0aGlzLnBhZ2VTaXplXTpudWxsfSxfZ2V0SXRlbTpmdW5jdGlvbihiLGQpe3RoaXMuX3VwZGF0ZUl0ZW0oZCx0aGlzLl9nZXRDYWNoZWRJdGVtKGIpKTt0aGlzLl9lYWdlcmx5TG9hZFBhZ2VzKCk7dmFyIGY9dGhpcy5fdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXMoKTswPGYubGVuZ3RoJiYodGhpcy5fbG9hZGluZz0hMCx0aGlzLmRlYm91bmNlKCJsb2FkIixmdW5jdGlvbigpe2YuZm9yRWFjaChmdW5jdGlvbihoKXt0aGlzLl9sb2FkUGFnZShoKX0uYmluZCh0aGlzKSl9LDEwMCkpfSxfY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gdm9pZCAwIT09CnRoaXMuX2NhY2hlJiZ2b2lkIDAhPT10aGlzLl9jYWNoZVtiXX0uYmluZCh0aGlzKSl9LF91bmNhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX2NhY2hlJiZ2b2lkIDA9PT10aGlzLl9jYWNoZVtiXX0uYmluZCh0aGlzKSl9LF9lYWdlcmx5TG9hZFBhZ2VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuc2xpY2UoMCk7aWYoMDxiLmxlbmd0aCl7Yi5zb3J0KGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY+aH0pO3ZhciBkPU1hdGgubWluKGJbYi5sZW5ndGgtMV0rMSxNYXRoLm1heCgwLE1hdGguZmxvb3IodGhpcy5zaXplL3RoaXMucGFnZVNpemUpLTEpKTt0aGlzLl9sb2FkUGFnZShNYXRoLm1heCgwLGJbMF0tMSkpO3RoaXMuX2xvYWRQYWdlKGQpfX0sX3BhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVyblt0aGlzLl9nZXRQYWdlRm9ySW5kZXgodGhpcy4kLnNjcm9sbGVyLmZpcnN0VmlzaWJsZUluZGV4Kwp0aGlzLiQuc2Nyb2xsZXIuX3ZpZHhPZmZzZXQpXS5jb25jYXQodGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5pbmRleH0pLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZ2V0UGFnZUZvckluZGV4KGIuaW5kZXgpfS5iaW5kKHRoaXMpKSkucmVkdWNlKGZ1bmN0aW9uKGIsZCl7LTE9PT1iLmluZGV4T2YoZCkmJmIucHVzaChkKTtyZXR1cm4gYn0sW10pfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oYixkKXtmb3IodmFyIGY9MDtmPHRoaXMucGFnZVNpemU7ZisrKXt2YXIgaD10aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxJbmRleFRvSXRlbVtiKnRoaXMucGFnZVNpemUrZl07aCYmKHRoaXMuX3VwZGF0ZUl0ZW0oaCxkW2ZdKSx0aGlzLmRlYm91bmNlKCJ1cGRhdGUtaGVpZ2h0cyIsZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZU1ldHJpY3MoKTt0aGlzLiQuc2Nyb2xsZXIuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpfSwKMSkpfX0sX2xvYWRQYWdlOmZ1bmN0aW9uKGIsZCl7ZD1kfHx0aGlzLl91cGRhdGVJdGVtcy5iaW5kKHRoaXMpO2lmKCF0aGlzLl9jYWNoZVtiXSYmIXRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXSYmdGhpcy5kYXRhUHJvdmlkZXIpe3RoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXT0hMDt2YXIgZj17cGFnZTpiLHBhZ2VTaXplOnRoaXMucGFnZVNpemUsc29ydE9yZGVyczp0aGlzLl9tYXBTb3J0ZXJzKCksZmlsdGVyczp0aGlzLl9tYXBGaWx0ZXJzKCl9O3RoaXMuZGF0YVByb3ZpZGVyKGYsZnVuY3Rpb24oaCl7dGhpcy5fY2FjaGVbYl09aDtkZWxldGUgdGhpcy5fcGVuZGluZ1JlcXVlc3RzW2JdO2QoYixoKTt0aGlzLl9sb2FkaW5nPTA8dGhpcy5fcGVuZGluZ1JlcXVlc3RzLmxlbmd0aDt0aGlzLmRlYm91bmNlKCJjaGVjay1zaXplIix0aGlzLl9jaGVja1NpemUsMkUzKX0uYmluZCh0aGlzKSl9fSxfZ2V0UGFnZUZvckluZGV4OmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmZsb29yKGIvdGhpcy5wYWdlU2l6ZSl9LApjbGVhckNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2FjaGU9e307dGhpcy5fcGVuZGluZ1JlcXVlc3RzPXt9O3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhJiZ0aGlzLiQuc2Nyb2xsZXIuX3VwZGF0ZSgpO3RoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKX0sX2ZsdXNoSXRlbXNEZWJvdW5jZXI6ZnVuY3Rpb24oKXt0aGlzLmZsdXNoRGVib3VuY2VyKCJsb2FkIil9LF9wYWdlU2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1kJiZiIT09ZCYmdGhpcy5jbGVhckNhY2hlKCl9LF9jaGVja1NpemU6ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLnNpemUmJmNvbnNvbGUud2FybignVGhlIFx4M2N2YWFkaW4tZ3JpZFx4M2UgbmVlZHMgYSB2YWx1ZSBmb3IgInNpemUiIHByb3BlcnR5IGluIG9yZGVyIHRvIGRpc3BsYXkgcm93cy4nKX0sX2RhdGFQcm92aWRlckNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1kJiZ0aGlzLmNsZWFyQ2FjaGUoKTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YXx8Cih0aGlzLl9sb2FkaW5nPSEwLHRoaXMuX2xvYWRQYWdlKDAsZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YT0hMH0uYmluZCh0aGlzKSkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVDb2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7c2l6ZTpOdW1iZXIsY29sdW1uVHJlZTpBcnJheSxiaW5kRGF0YTpGdW5jdGlvbixyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LGNvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxzY3JvbGxiYXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYi5zdHlsZS53aWR0aD0iMTAwcHgiO2Iuc3R5bGUuaGVpZ2h0PSIxMDBweCI7Yi5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYik7dmFyIGQ9Yi5vZmZzZXRXaWR0aC1iLmNsaWVudFdpZHRoO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGR9fSx0YXJnZXQ6T2JqZWN0LGhhc0RhdGE6Qm9vbGVhbn0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiLCJfc2l6ZUNoYW5nZWQoc2l6ZSwgYmluZERhdGEsIGhhc0RhdGEpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQocm93RGV0YWlsc1RlbXBsYXRlLCBfcGh5c2ljYWxJdGVtcywgX3BoeXNpY2FsQ291bnRWYWwpIl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsCmFuaW1hdGlvbmVuZDoiX29uQW5pbWF0aW9uRW5kIiwiY29sdW1uLXJlc2l6aW5nIjoiX29uQ29sdW1uUmVzaXplIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQ9dGhpcy4kfHx7fTt0aGlzLiQuaGVhZGVyPXRoaXMuZG9tSG9zdC4kLmhlYWRlcjt0aGlzLiQuaXRlbXM9dGhpcy5kb21Ib3N0LiQuaXRlbXM7dGhpcy4kLmZvb3Rlcj10aGlzLmRvbUhvc3QuJC5mb290ZXJ9LF9vbkNvbHVtblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW2NvbHVtbi1yZXNpemluZ10iKSk7dGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKGIpey9hcHBlYXIvLnRlc3QoYi5hbmltYXRpb25OYW1lKSYmKHRoaXMuX3JlbmRlcigpLHRoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKSxiLnN0b3BQcm9wYWdhdGlvbigpKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGIpeyJoZWFkZXJUZW1wbGF0ZSI9PT0KYi5kZXRhaWwucGF0aCYmdGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLCEwLHRoaXMuJC5oZWFkZXIpOyJmb290ZXJUZW1wbGF0ZSI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmZvb3Rlcik7L2Zyb3plbnxoaWRkZW4vLnRlc3QoYi5kZXRhaWwucGF0aCkmJnRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOyJoaWRkZW4iPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX2hpZGVPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiYhZH0sX2hpZGVUYWJsZU92ZXJmbG93OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIDA9PT1iJiZkfSxfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLGZ1bmN0aW9uKGgpe2gucm93RGV0YWlsc1RlbXBsYXRlPQpifSl9LF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihiLGQsZil7dm9pZCAwIT09YiYmZCYmdm9pZCAwIT09ZiYmKFBvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLHRoaXMuX3VwZGF0ZSksdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCksdGhpcy5faGFzVGVtcGxhdGVzQ2hhbmdlZChiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5jb2x1bW5zPWJbYi5sZW5ndGgtMV19KSx0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpLFBvbHltZXIuZG9tLmZsdXNoKHRoaXMpLHRoaXMuX3VwZGF0ZUxhc3RDb2x1bW4oKSl9LF91cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGZ1bmN0aW9uKGIpe2IudXBkYXRlTGFzdENvbHVtbigpfSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxTaXplcyYmClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcy4kLmhlYWRlcixmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3NTeW5jKCk7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXgmJnRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCl9LmJpbmQodGhpcykpfSxfdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCsicHgiLGQ9dGhpcy4kLmZvb3Rlci5jbGllbnRIZWlnaHQrInB4IjtbdGhpcy4kLm91dGVyc2l6ZXIsdGhpcy4kLmZpeGVkc2l6ZXIsdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yuc3R5bGUuYm9yZGVyVG9wV2lkdGg9YjtmLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPQpkfSl9LF9oYXNUZW1wbGF0ZXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPSExLGY9ITE7Yi5mb3JFYWNoKGZ1bmN0aW9uKGgpe3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oayl7ZD1kfHxrLmhlYWRlclRlbXBsYXRlO2Y9Znx8ay5mb290ZXJUZW1wbGF0ZX0pfSk7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGQsdGhpcy4kLmhlYWRlcik7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGYsdGhpcy4kLmZvb3Rlcil9LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZD1BcnJheShiKSxmPTA7ZjxiO2YrKyl7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtcm93Iik7aC50YXJnZXQ9dGhpcy5kb21Ib3N0O2RbZl09aDtoLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIik7UG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5hcHBlbmRDaGlsZChoKX1yZXR1cm4gZH0sX3NpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsCmQsZil7aWYodm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdm9pZCAwIT09Zil7dmFyIGg9dGhpcy5fc2Nyb2xsVG9wLGs9dGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl92aWR4T2Zmc2V0O3RoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbihiLDFFNSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fdmlkeE9mZnNldD0wO3RoaXMuX3BoeXNpY2FsSXRlbXN8fCh0aGlzLl9waHlzaWNhbENvdW50PU1hdGgubWF4KDEsTWF0aC5taW4oMjUsdGhpcy5fdmlydHVhbENvdW50KSksdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9jcmVhdGVQb29sKHRoaXMuX3BoeXNpY2FsQ291bnQpLHRoaXMuX3BoeXNpY2FsU2l6ZXM9QXJyYXkodGhpcy5fcGh5c2ljYWxDb3VudCkpO3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy5fZGVib3VuY2VUZW1wbGF0ZShmdW5jdGlvbigpe3RoaXMuX3JlbmRlcigpOwp0aGlzLl92aWV3cG9ydEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleChNYXRoLm1pbihrLHRoaXMuc2l6ZSkpLHRoaXMuX3Njcm9sbFRvcD1oLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLmZsdXNoRGVib3VuY2VyKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciKSl9KX19LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oYil7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtPXRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbXx8e307dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGQsZil7ZD10aGlzLl9waHlzaWNhbEl0ZW1zW2RdO2QuaW5kZXgmJmRlbGV0ZSB0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF07ZC5pbmRleD1mK3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtW2QuaW5kZXhdPWQ7ZC50b2dnbGVBdHRyaWJ1dGUoIm9kZCIsZC5pbmRleCUyKTtkLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdHJvdyIsZC5pbmRleD09PXRoaXMuc2l6ZS0xKTtkLnRvZ2dsZUF0dHJpYnV0ZSgiaGlkZGVuIiwKZC5pbmRleD49dGhpcy5zaXplKTt0aGlzLmJpbmREYXRhKGQuaW5kZXgsZCl9LGIpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxTaXplcyYmKHRoaXMuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihiKXtiLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpfSksdGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtcmVzaXppbmciLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LmJpbmQodGhpcyksMSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpzZi5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXRkLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2F4ZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxKXtyZXR1cm4gbnVsbCE9PXEuc291cmNlRXZlbnR9bGV0IGs7KGZ1bmN0aW9uKHEpe3EuTElORUFSPSJMSU5FQVIiO3EuTE9HPSJMT0ciO3EuUVVBTlRJTEU9IlFVQU5USUxFIjtxLk5PTl9OVU1FUklDPSJOT05fTlVNRVJJQyJ9KShrPWYuU2NhbGVUeXBlfHwoZi5TY2FsZVR5cGU9e30pKTtjbGFzcyBye2lzUGFzc2luZygpe3JldHVybiEwfX1jbGFzcyBse2NvbnN0cnVjdG9yKHEsdSx3LEEpe3RoaXMuX2xvd2VyPXE7dGhpcy5fdXBwZXI9dTt0aGlzLl9sb3dlck9wZW49dzt0aGlzLl91cHBlck9wZW49QX1pc1Bhc3NpbmcocSl7cmV0dXJuIHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlcixxLCF0aGlzLl9sb3dlck9wZW4pJiZ0aGlzLl9iZWZvcmUocSx0aGlzLl91cHBlciwhdGhpcy5fdXBwZXJPcGVuKX1fYmVmb3JlKHEsdSx3KXtyZXR1cm4gdz9xPD11OnE8dX19Y2xhc3MgcHtjb25zdHJ1Y3RvcihxKXt0aGlzLl9kb21haW5TZXQ9CnF9aXNQYXNzaW5nKHEpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCh1PT51PT09cSl9fWNsYXNzIG17Y29uc3RydWN0b3IocSx1LHcsQSl7dGhpcy5fc3ZnUHJvcHM9cTt0aGlzLl9zY2hlbWE9dTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9dzt0aGlzLl9jb2xJbmRleD1BO3RoaXMuX2lzRGlzcGxheWVkPSExO3RoaXMuX3NjYWxlVHlwZT10aGlzLl95U2NhbGU9bnVsbDt0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbihxKXt0aGlzLl9icnVzaFNlbGVjdGlvbj1xO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLAp0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfXNldERvbWFpbkFuZFNjYWxlKHEsdSl7dGhpcy5fc2NhbGVUeXBlPXU7dGhpcy5feVNjYWxlPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jcmVhdGVBeGlzU2NhbGUocS5zbGljZSgpLHRoaXMuX3N2Z1Byb3BzLmhlaWdodCx0aGlzLnNjYWxlVHlwZSgpKTt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSx0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfWJydXNoRmlsdGVyKCl7cmV0dXJuIHRoaXMuX2JydXNoRmlsdGVyfXVwZGF0ZURPTShxKXt2YXIgdT1kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSgpKTt0aGlzLnNjYWxlVHlwZSgpPT09ay5RVUFOVElMRSYmKHU9dS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjZnIikpKTt2YXIgdz1kMy5zZWxlY3QocSk7dy5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKdy5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzIiwhMCkuY2FsbCh1KS5hcHBlbmQoInRleHQiKS5jbGFzc2VkKCJheGlzLXRpdGxlIiwhMCkuc3R5bGUoImN1cnNvciIsIm1vdmUiKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ5IiwtOSkudGV4dChBPT5iLmhwYXJhbXMudXRpbHMuc2NoZW1hQ29sdW1uTmFtZSh0aGlzLl9zY2hlbWEsQSkpO3cuY2FsbChkMy5kcmFnKCkub24oInN0YXJ0IiwoKT0+e3Euc2V0QXR0cmlidXRlKCJpcy1kcmFnZ2luZyIsIiIpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdTdGFydCh0aGlzLmNvbEluZGV4KCkpfSkub24oImRyYWciLCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGQzLmV2ZW50LngpKS5vbigiZW5kIiwoKT0+e3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdFbmQoKTtxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciKX0pKTt1PWQzLmJydXNoWSgpLmV4dGVudChbWy04LDBdLApbOCx0aGlzLl9zdmdQcm9wcy5oZWlnaHQrMV1dKS5vbigic3RhcnQiLCgpPT57aChkMy5ldmVudCkmJihxLnNldEF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSl9KS5vbigiYnJ1c2giLCgpPT57aWYoaChkMy5ldmVudCkpdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZW5kIiwoKT0+e2goZDMuZXZlbnQpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSkscS5yZW1vdmVBdHRyaWJ1dGUoImlzLWJydXNoaW5nIikpfSk7dz1kMy5zZWxlY3QocSkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYnJ1c2giLCEwKTt3LmNhbGwodSk7dS5tb3ZlKHcsdGhpcy5icnVzaFNlbGVjdGlvbigpKX1zZXREaXNwbGF5ZWQocSl7dGhpcy5faXNEaXNwbGF5ZWQ9cX1fYnVpbGRCcnVzaEZpbHRlcihxLAp1LHcpe2lmKG51bGw9PT1xKXJldHVybiBuZXcgcjtpZihudWxsPT09dSlyZXR1cm4gY29uc29sZS5lcnJvcigiU2NhbGUgdHlwZSBpcyBudWxsLCBidXQgYnJ1c2hTZWxlY3Rpb24gaXNuJ3Q6ICIscSksbmV3IHI7c3dpdGNoKHUpe2Nhc2Ugay5MSU5FQVI6Y2FzZSBrLkxPRzp7Y29uc3QgW0EseV09Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMSl9Y2FzZSBrLlFVQU5USUxFOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSk7cmV0dXJuIG5ldyBsKEEseSwhMSwhMCl9Y2FzZSBrLk5PTl9OVU1FUklDOnJldHVybiBuZXcgcChiLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucG9pbnRTY2FsZUludmVyc2VJbWFnZSh3LHFbMF0scVsxXSkpfWNvbnNvbGUuZXJyb3IoIlVua25vd24gc2NhbGUgdHlwZTogIiwKdSk7cmV0dXJuIG5ldyByfX1mLkF4aXM9bTtjbGFzcyBue2NvbnN0cnVjdG9yKHEsdSx3KXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2F4ZXM9dGhpcy5fY3JlYXRlQXhlcyh3KTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucz1kMy5zY2FsZVBvaW50KCkucmFuZ2UoWzEsdGhpcy5fc3ZnUHJvcHMud2lkdGgtMV0pLnBhZGRpbmcoLjUpO3RoaXMuX2RyYWdnZWRBeGlzPW51bGw7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuYXhpcy1wYXJlbnQiKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCIuYXhpcy1wYXJlbnQiKX11cGRhdGVBeGVzKHEsdSl7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc3Qgdz1uZXcgU2V0O3EuY29sdW1ucy5mb3JFYWNoKHk9Pntjb25zdCB4PXkuYWJzb2x1dGVJbmRleDtsZXQgQz10aGlzLl9heGVzW3hdO0Muc2V0RGlzcGxheWVkKCEwKTsKY29uc3QgRz11Lm1hcChEPT5iLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxELHgpKTtDLnNldERvbWFpbkFuZFNjYWxlKEcseS5zY2FsZSk7dy5hZGQoeCl9KTt0aGlzLl9heGVzLmZvckVhY2goeT0+e3cuaGFzKHkuY29sSW5kZXgoKSl8fHkuc2V0RGlzcGxheWVkKCExKX0pO3RoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHcpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20odykseT0+eSk7dGhpcy5fcGFyZW50c1NlbC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcy1wYXJlbnQiLCEwKS5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTtjb25zdCBBPXRoaXM7dGhpcy5fcGFyZW50c1NlbC5jYWxsKHk9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh5KSkuZWFjaChmdW5jdGlvbih5KXtBLl9heGVzW3ldLnVwZGF0ZURPTSh0aGlzKX0pfW1hcFZpc2libGVBeGVzKHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAodT0+CnEodGhpcy5nZXRBeGlzUG9zaXRpb24odSksdGhpcy5fYXhlc1t1XSkpfWFsbFZpc2libGVBeGVzU2F0aXNmeShxKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZXZlcnkodT0+cSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHEpe3JldHVybiB0aGlzLl9heGVzW3FdfWRyYWdTdGFydChxKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3FdLmlzRGlzcGxheWVkKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbcV07dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKX1kcmFnKHEpe3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249cT1NYXRoLm1pbihNYXRoLm1heChxLDApLHRoaXMuX3N2Z1Byb3BzLndpZHRoKTtxPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpOwpxLnNvcnQoKHUsdyk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHcpKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4ocSk7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpfWRyYWdFbmQoKXtjb25zb2xlLmFzc2VydCh0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249bnVsbDt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKSl9aXNBeGlzRHJhZ2dpbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzfWdldEF4aXNQb3NpdGlvbihxKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzJiZ0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpPT09cT90aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uOnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfV91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhxKXt2YXIgdT0KdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKHc9PnEuaGFzKHcpKTt1PUFycmF5LmZyb20obmV3IFNldChbLi4udSwuLi5BcnJheS5mcm9tKHEpXSkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbih1KX1fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHEpe3EuYXR0cigidHJhbnNmb3JtIix1PT5iLmhwYXJhbXMudXRpbHMudHJhbnNsYXRlU3RyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpKSl9X2NyZWF0ZUF4ZXMocSl7cmV0dXJuIGQzLnJhbmdlKGIuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKHRoaXMuX3NjaGVtYSkpLm1hcCh1PT5uZXcgbSh0aGlzLl9zdmdQcm9wcyx0aGlzLl9zY2hlbWEscSx1KSl9fWYuQXhlc0NvbGxlY3Rpb249bn0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihsKXtsW2wuRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7bFtsLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoaD1mLkxpbmVUeXBlfHwoZi5MaW5lVHlwZT17fSkpO2NsYXNzIGt7Y29uc3RydWN0b3IobCl7dm9pZCAwPT09bCYmKGw9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1sLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWx9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8obCl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/bC5pc051bGwoKTpsLmlzTnVsbCgpPyExOmwuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Zi5TZXNzaW9uR3JvdXBIYW5kbGU9aztjbGFzcyBye2NvbnN0cnVjdG9yKGwscCxtKXt0aGlzLl9zdmdQcm9wcz1sO3RoaXMuX3NjaGVtYT1wO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW07dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGs7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGs7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGwpe3JldHVybiBudWxsPT09bHx8dm9pZCAwPT09bD9uZXcgazpuZXcgayh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihwPT5wLm5hbWU9PT1sLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGwscD0wKXsobD09PWguRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24ocCkuYXR0cigiZCIsbT0+dGhpcy5fcGF0aERBdHRyaWJ1dGUobSkpO2w9PT1oLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgbT10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihuKXttLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxuKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGw9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKHAsbSk9Pm0uYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IobCwKcCxtKXtsPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsbCl9cmVkcmF3KGwscCxtLG4pe2NvbnN0IHE9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHU9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1sO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHUpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoaC5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKHAsbSxuKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgayl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobCl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQpsO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChsLHApe2NvbnN0IG09dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMobj0+bik7bD1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCksbSxbbCxwXSk7cmV0dXJuIG51bGw9PT1sP25ldyBrOm5ldyBrKGQzLnNlbGVjdChsKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGwscCxtKXtpZihudWxsPT09bClyZXR1cm4oKT0+InJlZCI7Y29uc3Qgbj1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihiLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxsKSkucmFuZ2UoW3AsbV0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcT0+Cm4oYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscSxsKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24obCl7bD1sLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxwPT5wLm5hbWUpO2wuZXhpdCgpLnJlbW92ZSgpO3JldHVybiBsLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2UobCl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShsLHApe2wuY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhwKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMobCl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChwLG0pPT5bcCxtLnlTY2FsZSgpKGIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGwsbS5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUobCl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhsKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19Zi5MaW5lc0NvbGxlY3Rpb249cn0pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2ludGVyYWN0aW9uX21hbmFnZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7Y2xhc3MgaHtjb25zdHJ1Y3RvcihyLGwpe3RoaXMuc3ZnPWQzLnNlbGVjdChyKTtyPTEwMCpsKzIwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtyfSAkezI0MH1gKTt0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKTt0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixyKyJweCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKTt0aGlzLndpZHRoPXItMTAtMTA7dGhpcy5oZWlnaHQ9MjAwO3RoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIoMTAsMzApKX19Zi5TVkdQcm9wZXJ0aWVzPWg7Y2xhc3Mga3tjb25zdHJ1Y3RvcihyLGwscCxtKXt0aGlzLl9zdmdQcm9wcz1yO3RoaXMuX3NjaGVtYT1sO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1wO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPQptO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBmLkF4ZXNDb2xsZWN0aW9uKHIsbCx0aGlzKTt0aGlzLl9saW5lc0NvbGxlY3Rpb249bmV3IGYuTGluZXNDb2xsZWN0aW9uKHIsbCx0aGlzLl9heGVzQ29sbGVjdGlvbik7dGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCk9PnRoaXMub25DbGljaygpKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLCgpPT57Y29uc3QgW24scV09ZDMubW91c2UodGhpcy5fc3ZnUHJvcHMuc3ZnRy5ub2RlKCkpO3RoaXMub25Nb3VzZU1vdmVkKG4scSl9KS5vbigibW91c2VsZWF2ZSIsKCk9PnRoaXMub25Nb3VzZUxlYXZlKCkpfW9uRHJhZ1N0YXJ0KHIpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdTdGFydChyKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpfW9uRHJhZyhyKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKHIpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCl9b25EcmFnRW5kKCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ0VuZCgpOwp0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkxpbmVUeXBlLkZPUkVHUk9VTkQsNTAwKTt3aW5kb3cuc2V0VGltZW91dCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuQkFDS0dST1VORCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnNob3dCYWNrZ3JvdW5kTGluZXMoKX0sNTAwKX1vbkJydXNoQ2hhbmdlZChyKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5nZXRBeGlzRm9yQ29sSW5kZXgocikuc2V0QnJ1c2hTZWxlY3Rpb24oZDMuZXZlbnQuc2VsZWN0aW9uKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZChyLGwpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHIsbCkpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8Cih0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IobnVsbCkpfW9uQ2xpY2soKXt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCk9PT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT90aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3IGYuU2Vzc2lvbkdyb3VwSGFuZGxlKTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKTt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChyLApsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi51cGRhdGVBeGVzKHIsbCk7Y29uc3QgcD10aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCksbT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KGwsdm9pZCAwIT09ci5jb2xvckJ5Q29sdW1uSW5kZXg/ci5jb2x1bW5zW3IuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4Om51bGwsci5taW5Db2xvcixyLm1heENvbG9yKTtwLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpO20uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpfHwKdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfXNjaGVtYSgpe3JldHVybiB0aGlzLl9zY2hlbWF9fWYuSW50ZXJhY3Rpb25NYW5hZ2VyPWt9KShkLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoZC5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0scmVkcmF3Q291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF92YWxpZFNlc3Npb25Hcm91cHM6QXJyYXksX2ludGVyYWN0aW9uTWFuYWdlcjpPYmplY3R9LG9ic2VydmVyczpbIl9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChvcHRpb25zLiosIHNlc3Npb25Hcm91cHMuKikiXSxfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtpZih0aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxXLEVhLHZhLHlhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1XLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXlhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtXLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eWEmJiJMT0ciIT09eWF8fFcudGlja3MoRWEpO2thLmNhbGwoVyk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHIoa2EsVyl7cmV0dXJuIExbV10oeC5fY29sVmFsdWUoa2EsVykpfWZ1bmN0aW9uIGwoa2EsVyl7cmV0dXJuIEpbV10oeC5fbWV0cmljVmFsdWUoa2EsVykpfWZ1bmN0aW9uIHAoa2EsVyl7Y29uc3QgRWE9W107WFtrYV1bV10uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChSLm5vZGVzKCkpO3coKXx8KGthPW4oeC5fYnJ1c2hlZENlbGxJbmRleCx4Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFc9PiFaLmhhcyhXKSkpKS5hdHRyKCJmaWxsIixOKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFc9PiFrYS5oYXMoVykpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsVyl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09Vyk7Y29uc3QgW0VhLHZhXT1rYSx5YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChmYVtFYV1bdmFdLFdbMF1bMF0sV1swXVsxXSxXWzFdWzBdLFdbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3lhLmFkZChGYSl9KX0pO3JldHVybiB5YX1mdW5jdGlvbiBxKGthKXtjb25zdCBXPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09V3x8dSgpJiZrYT09PW9hLm5vZGUoKSYmXy5pc0VxdWFsKFcseC5fYnJ1c2hTZWxlY3Rpb24pfHwoeC5fYnJ1c2hTZWxlY3Rpb249VyxudWxsIT09Vz8ob2E9ZDMuc2VsZWN0KGthKSx4Ll9icnVzaGVkQ2VsbEluZGV4PW9hLmRhdHVtKCkpOihvYT1udWxsLHguX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT14Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09eC5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24gdygpe3JldHVybiF1KCl8fHguX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09eC5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHguX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09eC5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsVyxFYSx2YSx5YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGZhW2thXVtXXSxFYSx2YSx5YSwoeGEsU2EpPT57Wi5oYXMoeGEpJiZTYTxBYSYmKHhhPWQzLnNlbGVjdCh4YSkuZGF0dW0oKSxBYT1TYSxGYT14YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChhYS5nZXQoRmEpKX1jb25zdCB5PXRmLmhwYXJhbXMudXRpbHMseD10aGlzO2lmKHRoaXMuc2Vzc2lvbkdyb3VwcyYmMCE9dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aCYmdGhpcy52aXNpYmxlU2NoZW1hJiYwIT10aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoKXt2YXIgQz1kMy5yYW5nZSh5Lm51bVZpc2libGVDb2x1bW5zKHgudmlzaWJsZVNjaGVtYSkpLEc9ZDMucmFuZ2UoeS5udW1WaXNpYmxlTWV0cmljcyh4LnZpc2libGVTY2hlbWEpKSxEPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihDKS5yYW5nZShbODUsCnRoaXMud2lkdGgtMS01XSkucGFkZGluZ0lubmVyKC4xKSxCPWQzLnNjYWxlQmFuZCgpLmRvbWFpbihHKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLEg9RC5iYW5kd2lkdGgoKSxLPUIuYmFuZHdpZHRoKCksTD1DLm1hcChrYT0+eC5fY2VsbFNjYWxlKGthLFswLEgtMV0pKSxKPUcubWFwKGthPT54Ll9jZWxsU2NhbGUoa2EreS5udW1WaXNpYmxlSFBhcmFtcyh4LnZpc2libGVTY2hlbWEpLFtLLTEsMF0pKSxPPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKEMpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIoRChrYSksMCkpO08uYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixiKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLEgrMTApLmF0dHIoImhlaWdodCIseC5oZWlnaHQtMjUpOwpPLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIseC5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixIKS5hdHRyKCJoZWlnaHQiLDI1KTtPLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrYihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNCb3R0b20oTFtrYV0pLnRpY2tTaXplKHguaGVpZ2h0LTUwKSxILDQwLHgub3B0aW9ucy5jb2x1bW5zW2thXS5zY2FsZSl9KTtPLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrZChrYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLEgvMikuYXR0cigieSIseC5oZWlnaHQtMS0xMi41KS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHgudmlzaWJsZVNjaGVtYSwKa2EpKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh4LnZpc2libGVTY2hlbWEsa2EpKTtPPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi55LWF4aXMiKS5kYXRhKEcpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIixrYT0+eS50cmFuc2xhdGVTdHIoeC53aWR0aC0xLEIoa2EpKSk7Ty5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGYpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0oeC53aWR0aC00MC0xKSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIix4LndpZHRoLTQwKS5hdHRyKCJoZWlnaHQiLEsrMTApO08uYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHgud2lkdGgtMSkpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IixLKTtPLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsa2E9PiJ1cmwoIyIrCmYoa2EpKyIpIikuZWFjaChmdW5jdGlvbihrYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoayxkMy5heGlzTGVmdChKW2thXSkudGlja1NpemUoeC53aWR0aC04MCksSywyMCx4Lm9wdGlvbnMuY29sdW1uc1trYSt5Lm51bVZpc2libGVIUGFyYW1zKHgudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pO08uYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitoKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsLSh4LndpZHRoLTIwLTEpKS5hdHRyKCJ5IixLLzIpLmF0dHIoInRyYW5zZm9ybSIseS5yb3RhdGVTdHIoLSh4LndpZHRoLTIwLTEpLEsvMikpLnRleHQoa2E9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQoa2E9PnkubWV0cmljTmFtZSh4LnZpc2libGVTY2hlbWEubWV0cmljSW5mb3Nba2FdKSk7Ck89dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKGQzLmNyb3NzKEMsRykpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKFtrYSxXXSk9PnkudHJhbnNsYXRlU3RyKEQoa2EpLEIoVykpKTtPLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZyYW1lIiwhMCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsSCsxMCkuYXR0cigiaGVpZ2h0IixLKzEwKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIFM9bnVsbDt2b2lkIDAhPT14Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4JiYoUz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbih0aGlzLl9jb2xFeHRlbnQodGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLnJhbmdlKFt0aGlzLm9wdGlvbnMubWluQ29sb3IsdGhpcy5vcHRpb25zLm1heENvbG9yXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpKTsKdmFyIE49dm9pZCAwPT09eC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleD8oKT0+InJlZCI6KHtzZXNzaW9uR3JvdXA6a2F9KT0+Uyh0aGlzLl9jb2xWYWx1ZShrYSx4Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSksW1IsWCxhYV09ZnVuY3Rpb24oa2EsVyl7Y29uc3QgRWE9a2Euc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKChbeWEsQWFdKT0+eC5zZXNzaW9uR3JvdXBzLmZpbHRlcihGYT0+dm9pZCAwIT09eC5fY29sVmFsdWUoRmEseWEpJiZ2b2lkIDAhPT14Ll9tZXRyaWNWYWx1ZShGYSxBYSkpLm1hcChGYT0+KHtjb2w6eWEsbWV0cmljOkFhLHNlc3Npb25Hcm91cDpGYSx4OnIoRmEseWEpLHk6bChGYSxBYSksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKHt4OnlhfSk9PnlhKS5hdHRyKCJjeSIsKHt5OnlhfSk9PnlhKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIiwKVyksdmE9bmV3IE1hcDt4LnNlc3Npb25Hcm91cHMuZm9yRWFjaCh5YT0+e3ZhLnNldCh5YSxbXSl9KTtFYS5lYWNoKGZ1bmN0aW9uKHlhKXt2YS5nZXQoeWEuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpfSk7RWEuZWFjaCh5YT0+e2NvbnN0IEFhPXZhLmdldCh5YS5zZXNzaW9uR3JvdXApO3lhLnNlc3Npb25Hcm91cE1hcmtlcnM9bmV3IFNldChBYSl9KTtrYT1DLm1hcCh5YT0+Ry5tYXAoQWE9PkVhLmZpbHRlcihGYT0+RmEuY29sPT15YSYmRmEubWV0cmljPT1BYSkpKTtyZXR1cm5bRWEsa2EsdmFdfShPLmFwcGVuZCgiZyIpLE4pLGZhPUMubWFwKGthPT5HLm1hcChXPT5wKGthLFcpKSksb2E9bnVsbDt1KCkmJihvYT1PLmZpbHRlcihrYT0+Xy5pc0VxdWFsKGthLHguX2JydXNoZWRDZWxsSW5kZXgpKSxjb25zb2xlLmFzc2VydCgxPT1vYS5zaXplKCksb2EpKTt2YXIgWj1uZXcgU2V0KFIubm9kZXMoKSk7bSgpO3ZhciBjYT1kMy5icnVzaCgpLmV4dGVudChbWy00LC00XSxbSC0xKzUtCjEsSy0xKzUtMV1dKS5vbigic3RhcnQiLGZ1bmN0aW9uKCl7dSgpJiZvYS5ub2RlKCkhPXRoaXMmJmNhLm1vdmUob2EsbnVsbCk7cSh0aGlzKX0pLm9uKCJicnVzaCIsZnVuY3Rpb24oKXtxKHRoaXMpfSkub24oImVuZCIsZnVuY3Rpb24oKXtxKHRoaXMpfSk7Ty5jYWxsKGNhKTt1KCkmJmNhLm1vdmUob2EseC5fYnJ1c2hTZWxlY3Rpb24pO3ZhciBqYT1udWxsLGJhPW51bGw7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJihiYT1kMy5zZWxlY3RBbGwoYWEuZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Ty5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWphPT09YmE/bnVsbDpqYTtrYSE9PWJhJiYobnVsbCE9PWJhJiZiYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxiYT1rYSxudWxsIT09YmEmJmJhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1iYT9udWxsOmJhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp4Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsV10pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxXLEVhLHZhLDIwKTtqYSE9PWthJiYobnVsbCE9PWphJiZqYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGphPWthLG51bGwhPT1qYT8oamEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGphLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6eC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09amEmJihqYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGphPW51bGwseC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcChyPT5kWzBdK2sqcik7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAocj0+dGhpcy5fY29sVmFsdWUocixiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtbWFpbi90Zi1ocGFyYW1zLW1haW4uaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1tYWluIixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxfY29uZmlndXJhdGlvbjpPYmplY3QsX3Nlc3Npb25Hcm91cHM6QXJyYXksX2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zOkJvb2xlYW4sX2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zOkJvb2xlYW59LHJlbG9hZCgpe3RoaXMuJFsicXVlcnktcGFuZSJdLnJlbG9hZCgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZGFzaGJvYXJkL3RmLWhwYXJhbXMtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfYmFja2VuZDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB0Zi5ocGFyYW1zLkJhY2tlbmQoZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhwYXJhbXMiLCIiKSxuZXcgZGMuUmVxdWVzdE1hbmFnZXIsISEod2luZG93LlRFTlNPUkJPQVJEX0VOVnx8e30pLklOX0NPTEFCKX19LHJlbG9hZCgpe3RoaXMuJFsiaHBhcmFtcy1tYWluIl0ucmVsb2FkKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL21lc2gtbG9hZGVyLmpzCihmdW5jdGlvbihiKXtQb2x5bWVyKHtpczoidGYtbWVzaC1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxzYW1wbGU6TnVtYmVyLG9mU2FtcGxlczpOdW1iZXIsc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyx2YWx1ZToiYWxsIn0sYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWVzaFZpZXdlcjp7dHlwZTpPYmplY3R9LF9kYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0fSxfY29sb3JTY2FsZUZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+dGQucnVuc0NvbG9yU2NhbGV9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sbm90aWZ5OiEwfSxfc3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LApfbWVzaFZpZXdlckF0dGFjaGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfaXNNZXNoTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCBhY3RpdmUsIF9kYXRhUHJvdmlkZXIsIF9tZXNoVmlld2VyKSIsIl91cGRhdGVTY2VuZShfY3VycmVudFN0ZXAuKiwgX21lc2hWaWV3ZXIpIiwiX2RlYm91bmNlZEZldGNoTWVzaChfY3VycmVudFN0ZXApIiwiX3VwZGF0ZVZpZXcoc2VsZWN0ZWRWaWV3KSJdLF9jb21wdXRlUnVuQ29sb3I6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihkKX0sCmF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGF0YVByb3ZpZGVyPW5ldyBiLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyKHRoaXMucmVxdWVzdE1hbmFnZXIpO2NvbnN0IGQ9bmV3IGIuTWVzaFZpZXdlcih0aGlzLl9ydW5Db2xvcik7ZC5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmVVcGRhdGVTY2VuZSIsdGhpcy5fdXBkYXRlQ2FudmFzU2l6ZS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoImNhbWVyYVBvc2l0aW9uQ2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpO3RoaXMuX21lc2hWaWV3ZXI9ZH0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2RhdGFQcm92aWRlciYmKHRoaXMuc2V0KCJfaXNNZXNoTG9hZGluZyIsITApLHRoaXMuX2RhdGFQcm92aWRlci5yZWxvYWQodGhpcy5ydW4sdGhpcy50YWcsdGhpcy5zYW1wbGUpLnRoZW4oZD0+e2QmJih0aGlzLnNldCgiX3N0ZXBzIixkKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsCmQubGVuZ3RoLTEpKX0pLmNhdGNoKGQ9PntpZighZHx8IWQuY29kZXx8ZC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IEVycm9yKGR8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iKTt9KSl9LF91cGRhdGVTY2VuZTpmdW5jdGlvbigpe2NvbnN0IGQ9dGhpcy5fY3VycmVudFN0ZXA7ZCYmZC5tZXNoJiYodGhpcy5fbWVzaFZpZXdlci51cGRhdGVTY2VuZShkLHRoaXMpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWR8fCh0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ9ITApLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZHx8KHRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLl9tZXNoVmlld2VyLmdldFJlbmRlcmVyKCkuZG9tRWxlbWVudCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkPSEwKSl9LF9kZWJvdW5jZWRGZXRjaE1lc2goKXt0aGlzLmRlYm91bmNlKCJmZXRjaE1lc2giLCgpPT50aGlzLl9tYXliZUZldGNoTWVzaCgpLAoxMDApfSxfbWF5YmVGZXRjaE1lc2goKXtjb25zdCBkPXRoaXM7cmV0dXJuIFdiKGZ1bmN0aW9uKigpe2NvbnN0IGY9ZC5fY3VycmVudFN0ZXA7aWYoZiYmIWYubWVzaCYmIWYubWVzaEZldGNoaW5nKXtmLm1lc2hGZXRjaGluZz0hMDtkLl9pc01lc2hMb2FkaW5nPSEwO3RyeXtjb25zdCBoPXlpZWxkIGQuX2RhdGFQcm92aWRlci5mZXRjaERhdGEoZixkLnJ1bixkLnRhZyxkLnNhbXBsZSk7Zi5tZXNoPWhbMF07ZC5ub3RpZnlQYXRoKCJfY3VycmVudFN0ZXAubWVzaCIpfWNhdGNoKGgpe2lmKCFofHwhaC5jb2RlfHxoLmNvZGUhPWIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQpdGhyb3cgaD1ofHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIixFcnJvcihoKTt9ZmluYWxseXtkLl9pc01lc2hMb2FkaW5nPSExLGYubWVzaEZldGNoaW5nPSExfX19KX0sX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2U6ZnVuY3Rpb24oKXtpZih0aGlzLl9tZXNoVmlld2VyLmlzUmVhZHkoKSl7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJjYW1lcmEtcG9zaXRpb24tY2hhbmdlIiwKe2RldGFpbDp0aGlzLl9tZXNoVmlld2VyLmdldENhbWVyYVBvc2l0aW9uKCl9KTt0aGlzLmRpc3BhdGNoRXZlbnQoZCl9fSxzZXRDYW1lcmFWaWV3cG9pbnQ6ZnVuY3Rpb24oZCxmLGgpe3RoaXMuX21lc2hWaWV3ZXIuc2V0Q2FtZXJhVmlld3BvaW50KGQsZixoKX0sX3VwZGF0ZUNhbnZhc1NpemU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMub2Zmc2V0V2lkdGgsZj10aGlzLiQkKCIudGYtbWVzaC1sb2FkZXItaGVhZGVyIikub2Zmc2V0SGVpZ2h0O3RoaXMuX21lc2hWaWV3ZXIuc2V0Q2FudmFzU2l6ZSh7d2lkdGg6ZCxoZWlnaHQ6ZC1mfSl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUNhbnZhc1NpemUoKTt0aGlzLmlzQ29ubmVjdGVkJiZ0aGlzLl9tZXNoVmlld2VyLmRyYXcoKX0sX2hhc0F0TGVhc3RPbmVTdGVwOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMDxkLmxlbmd0aH0sX2hhc011bHRpcGxlU3RlcHM6ZnVuY3Rpb24oZCl7cmV0dXJuISFkJiYxPGQubGVuZ3RofSxfY29tcHV0ZUN1cnJlbnRTdGVwOmZ1bmN0aW9uKGQsCmYpe3JldHVybiBkW2ZdfHxudWxsfSxfY29tcHV0ZVN0ZXBWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gZD9kLnN0ZXA6MH0sX2NvbXB1dGVDdXJyZW50V2FsbFRpbWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/SGguZm9ybWF0RGF0ZShkLndhbGxfdGltZSk6IiJ9LF9nZXRNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oZCl7cmV0dXJuIGQubGVuZ3RoLTF9LF9nZXRTYW1wbGVUZXh0OmZ1bmN0aW9uKGQpe3JldHVybiBTdHJpbmcoZCsxKX0sX2hhc011bHRpcGxlU2FtcGxlczpmdW5jdGlvbihkKXtyZXR1cm4gMTxkfSxfdXBkYXRlVmlldzpmdW5jdGlvbihkKXt0aGlzLl9tZXNoVmlld2VyJiYiYWxsIj09ZCYmdGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKX0sdG9Mb2NhbGVTdHJpbmdfOmZ1bmN0aW9uKGQpe3JldHVybiBkLnRvTG9jYWxlU3RyaW5nKCl9fSl9KShmbHx8KGZsPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWVzaC1kYXNoYm9hcmQvdGYtbWVzaC1kYXNoYm9hcmQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoibWVzaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e3JlbG9hZE9uUmVhZHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6Ii4qIn0sX3NlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiJhbGwifSxfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfSwKX2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1tZXNoLWxvYWRlciIpfSxfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9ZGMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+CntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj1kYy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgocil7Y29uc3QgbD1iW3IucnVuXVtyLnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSxyLHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIscj0+T2JqZWN0LmtleXMocikpO3JldHVybiBrYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAocj0+T2JqZWN0LmFzc2lnbih7fSxyLHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sCnIuaXRlbXMubWFwKGgpKX0pKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocGV8fChwZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgdG49e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcGUuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpwZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpiZC5nZXRTdHJpbmcoYmQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGRjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPXRuLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtiZC5zZXRTdHJpbmcoYmQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYoYmQuc2V0U3RyaW5nKGJkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1iZC5nZXRTdHJpbmcoYmQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7Z2wuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXt4Yy5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTtkYy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPWRjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj1kYy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO2JkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocGUuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXBlLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGRjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcGUuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXBlLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1wZS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7ZGMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLGRjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLGRjLnJ1bnNTdG9yZS5yZWZyZXNoKCksZGMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1zZC5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZzZC5zZXRMaW1pdChiKX19KTsKLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjMuNiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4KICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKICovCi8vTm90IHVzaW5nIHN0cmljdDogdW5ldmVuIHN0cmljdCBzdXBwb3J0IGluIGJyb3dzZXJzLCAjMzkyLCBhbmQgY2F1c2VzCi8vcHJvYmxlbXMgd2l0aCByZXF1aXJlanMuZXhlYygpL3RyYW5zcGlsZXIgcGx1Z2lucyB0aGF0IG1heSBub3QgYmUgc3RyaWN0LgovKmpzbGludCByZWdleHA6IHRydWUsIG5vbWVuOiB0cnVlLCBzbG9wcHk6IHRydWUgKi8KLypnbG9iYWwgd2luZG93LCBuYXZpZ2F0b3IsIGRvY3VtZW50LCBpbXBvcnRTY3JpcHRzLCBzZXRUaW1lb3V0LCBvcGVyYSAqLwoKdmFyIHJlcXVpcmVqcywgcmVxdWlyZSwgZGVmaW5lOwooZnVuY3Rpb24gKGdsb2JhbCwgc2V0VGltZW91dCkgewogICAgdmFyIHJlcSwgcywgaGVhZCwgYmFzZUVsZW1lbnQsIGRhdGFNYWluLCBzcmMsCiAgICAgICAgaW50ZXJhY3RpdmVTY3JpcHQsIGN1cnJlbnRseUFkZGluZ1NjcmlwdCwgbWFpblNjcmlwdCwgc3ViUGF0aCwKICAgICAgICB2ZXJzaW9uID0gJzIuMy42JywKICAgICAgICBjb21tZW50UmVnRXhwID0gL1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIC8vQ291bGQgbWF0Y2ggc29tZXRoaW5nIGxpa2UgJykvL2NvbW1lbnQnLCBkbyBub3QgbG9zZSB0aGUgcHJlZml4IHRvIGNvbW1lbnQuCiAgICBmdW5jdGlvbiBjb21tZW50UmVwbGFjZShtYXRjaCwgc2luZ2xlUHJlZml4KSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVByZWZpeCB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBcnJheShpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheS4gSWYgdGhlIGZ1bmMgcmV0dXJucwogICAgICogYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaChhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGJhY2t3YXJkcy4gSWYgdGhlIGZ1bmMKICAgICAqIHJldHVybnMgYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFJldmVyc2UoYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gYXJ5Lmxlbmd0aCAtIDE7IGkgPiAtMTsgaSAtPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFzUHJvcChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBwcm9wKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPd24ob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc1Byb3Aob2JqLCBwcm9wKSAmJiBvYmpbcHJvcF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDeWNsZXMgb3ZlciBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhbmQgY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaAogICAgICogcHJvcGVydHkgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLCB0aGVuIHRoZQogICAgICogaXRlcmF0aW9uIGlzIHN0b3BwZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hQcm9wKG9iaiwgZnVuYykgewogICAgICAgIHZhciBwcm9wOwogICAgICAgIGZvciAocHJvcCBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKGhhc1Byb3Aob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmMob2JqW3Byb3BdLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2ltcGxlIGZ1bmN0aW9uIHRvIG1peCBpbiBwcm9wZXJ0aWVzIGZyb20gc291cmNlIGludG8gdGFyZ2V0LAogICAgICogYnV0IG9ubHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKSB7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBlYWNoUHJvcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8ICFoYXNQcm9wKHRhcmdldCwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFN0cmluZ01peGluICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmICFpc0Z1bmN0aW9uKHZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHRhcmdldFtwcm9wXSwgdmFsdWUsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy9TaW1pbGFyIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBidXQgdGhlICd0aGlzJyBvYmplY3QgaXMgc3BlY2lmaWVkCiAgICAvL2ZpcnN0LCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gcmVhZC9maWd1cmUgb3V0IHdoYXQgJ3RoaXMnIHdpbGwgYmUuCiAgICBmdW5jdGlvbiBiaW5kKG9iaiwgZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2NyaXB0cygpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycikgewogICAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICAvL0FsbG93IGdldHRpbmcgYSBnbG9iYWwgdGhhdCBpcyBleHByZXNzZWQgaW4KICAgIC8vZG90IG5vdGF0aW9uLCBsaWtlICdhLmIuYycuCiAgICBmdW5jdGlvbiBnZXRHbG9iYWwodmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBnbG9iYWw7CiAgICAgICAgZWFjaCh2YWx1ZS5zcGxpdCgnLicpLCBmdW5jdGlvbiAocGFydCkgewogICAgICAgICAgICBnID0gZ1twYXJ0XTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gZXJyb3Igd2l0aCBhIHBvaW50ZXIgdG8gYW4gVVJMIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgZXJyb3IgSUQgdGhhdCBtYXBzIHRvIGFuIElEIG9uIGEgd2ViIHBhZ2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBodW1hbiByZWFkYWJsZSBlcnJvci4KICAgICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIHRoZSBvcmlnaW5hbCBlcnJvciwgaWYgdGhlcmUgaXMgb25lLgogICAgICoKICAgICAqIEByZXR1cm5zIHtFcnJvcn0KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUVycm9yKGlkLCBtc2csIGVyciwgcmVxdWlyZU1vZHVsZXMpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgKyAnXG5odHRwczovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCMnICsgaWQpOwogICAgICAgIGUucmVxdWlyZVR5cGUgPSBpZDsKICAgICAgICBlLnJlcXVpcmVNb2R1bGVzID0gcmVxdWlyZU1vZHVsZXM7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICBlLm9yaWdpbmFsRXJyb3IgPSBlcnI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vSWYgYSBkZWZpbmUgaXMgYWxyZWFkeSBpbiBwbGF5IHZpYSBhbm90aGVyIEFNRCBsb2FkZXIsCiAgICAgICAgLy9kbyBub3Qgb3ZlcndyaXRlLgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXF1aXJlanMpKSB7CiAgICAgICAgICAgIC8vRG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyByZXF1aXJlanMgaW5zdGFuY2UuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2ZnID0gcmVxdWlyZWpzOwogICAgICAgIHJlcXVpcmVqcyA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvL0FsbG93IGZvciBhIHJlcXVpcmUgY29uZmlnIG9iamVjdAogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNGdW5jdGlvbihyZXF1aXJlKSkgewogICAgICAgIC8vYXNzdW1lIGl0IGlzIGEgY29uZmlnIG9iamVjdC4KICAgICAgICBjZmcgPSByZXF1aXJlOwogICAgICAgIHJlcXVpcmUgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3Q29udGV4dChjb250ZXh0TmFtZSkgewogICAgICAgIHZhciBpbkNoZWNrTG9hZGVkLCBNb2R1bGUsIGNvbnRleHQsIGhhbmRsZXJzLAogICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCwKICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgLy9EZWZhdWx0cy4gRG8gbm90IHNldCBhIGRlZmF1bHQgZm9yIG1hcAogICAgICAgICAgICAgICAgLy9jb25maWcgdG8gc3BlZWQgdXAgbm9ybWFsaXplKCksIHdoaWNoCiAgICAgICAgICAgICAgICAvL3dpbGwgcnVuIGZhc3RlciBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAgICAgd2FpdFNlY29uZHM6IDcsCiAgICAgICAgICAgICAgICBiYXNlVXJsOiAnLi8nLAogICAgICAgICAgICAgICAgcGF0aHM6IHt9LAogICAgICAgICAgICAgICAgYnVuZGxlczoge30sCiAgICAgICAgICAgICAgICBwa2dzOiB7fSwKICAgICAgICAgICAgICAgIHNoaW06IHt9LAogICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdpc3RyeSA9IHt9LAogICAgICAgICAgICAvL3JlZ2lzdHJ5IG9mIGp1c3QgZW5hYmxlZCBtb2R1bGVzLCB0byBzcGVlZAogICAgICAgICAgICAvL2N5Y2xlIGJyZWFraW5nIGNvZGUgd2hlbiBsb3RzIG9mIG1vZHVsZXMKICAgICAgICAgICAgLy9hcmUgcmVnaXN0ZXJlZCwgYnV0IG5vdCBhY3RpdmF0ZWQuCiAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeSA9IHt9LAogICAgICAgICAgICB1bmRlZkV2ZW50cyA9IHt9LAogICAgICAgICAgICBkZWZRdWV1ZSA9IFtdLAogICAgICAgICAgICBkZWZpbmVkID0ge30sCiAgICAgICAgICAgIHVybEZldGNoZWQgPSB7fSwKICAgICAgICAgICAgYnVuZGxlc01hcCA9IHt9LAogICAgICAgICAgICByZXF1aXJlQ291bnRlciA9IDEsCiAgICAgICAgICAgIHVubm9ybWFsaXplZENvdW50ZXIgPSAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLgogICAgICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWUKICAgICAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcywKICAgICAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LAogICAgICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuCiAgICAgICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHsKICAgICAgICAgICAgdmFyIGksIHBhcnQ7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07CiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLAogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXkKICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2gKICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludAogICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT09IDEgJiYgYXJ5WzJdID09PSAnLi4nKSB8fCBhcnlbaSAtIDFdID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0bwogICAgICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmUKICAgICAgICAgKiB0by4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwIGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSB2YWx1ZS4gU2hvdWxkCiAgICAgICAgICogb25seSBiZSBkb25lIGlmIHRoaXMgbm9ybWFsaXphdGlvbiBpcyBmb3IgYSBkZXBlbmRlbmN5IElELgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG5vcm1hbGl6ZWQgbmFtZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSwgYXBwbHlNYXApIHsKICAgICAgICAgICAgdmFyIHBrZ01haW4sIG1hcFZhbHVlLCBuYW1lUGFydHMsIGksIGosIG5hbWVTZWdtZW50LCBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICBmb3VuZE1hcCwgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBub3JtYWxpemVkQmFzZVBhcnRzLAogICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gKGJhc2VOYW1lICYmIGJhc2VOYW1lLnNwbGl0KCcvJykpLAogICAgICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCwKICAgICAgICAgICAgICAgIHN0YXJNYXAgPSBtYXAgJiYgbWFwWycqJ107CgogICAgICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxOwoKICAgICAgICAgICAgICAgIC8vIElmIHdhbnRpbmcgbm9kZSBJRCBjb21wYXRpYmlsaXR5LCBzdHJpcCAuanMgZnJvbSBlbmQKICAgICAgICAgICAgICAgIC8vIG9mIElEcy4gSGF2ZSB0byBkbyB0aGlzIGhlcmUsIGFuZCBub3QgaW4gbmFtZVRvVXJsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG5vZGUgYWxsb3dzIGVpdGhlciAuanMgb3Igbm9uIC5qcyB0byBtYXAKICAgICAgICAgICAgICAgIC8vIHRvIHNhbWUgZmlsZS4KICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVbbGFzdEluZGV4XSA9IG5hbWVbbGFzdEluZGV4XS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCAnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggYSAnLicgc28gbmVlZCB0aGUgYmFzZU5hbWUKICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdLmNoYXJBdCgwKSA9PT0gJy4nICYmIGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgIC8vQ29udmVydCBiYXNlTmFtZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCwKICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgLiBtYXRjaGVzIHRoYXQgJ2RpcmVjdG9yeScgYW5kIG5vdCBuYW1lIG9mIHRoZSBiYXNlTmFtZSdzCiAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgYmFzZU5hbWUgb2YgJ29uZS90d28vdGhyZWUnLCBtYXBzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8nb25lL3R3by90aHJlZS5qcycsIGJ1dCB3ZSB3YW50IHRoZSBkaXJlY3RvcnksICdvbmUvdHdvJyBmb3IKICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZEJhc2VQYXJ0cy5jb25jYXQobmFtZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJpbURvdHMobmFtZSk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5qb2luKCcvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vQXBwbHkgbWFwIGNvbmZpZyBpZiBhdmFpbGFibGUuCiAgICAgICAgICAgIGlmIChhcHBseU1hcCAmJiBtYXAgJiYgKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSkgewogICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLycpOwoKICAgICAgICAgICAgICAgIG91dGVyTG9vcDogZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwLCBiYXNlUGFydHMuc2xpY2UoMCwgaikuam9pbignLycpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIHNlZ21lbnQgaGFzIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IGdldE93bihtYXBWYWx1ZSwgbmFtZVNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoLCB1cGRhdGUgbmFtZSB0byB0aGUgbmV3IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IG1hcFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhIHN0YXIgbWFwIG1hdGNoLCBidXQganVzdCBob2xkIG9uIHRvIGl0LAogICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBzaG9ydGVyIHNlZ21lbnQgbWF0Y2ggbGF0ZXIgaW4gYSBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgIC8vY29uZmlnLCB0aGVuIGZhdm9yIG92ZXIgdGhpcyBzdGFyIG1hcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU3Rhck1hcCAmJiBzdGFyTWFwICYmIGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gZ2V0T3duKHN0YXJNYXAsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhckkgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTWFwICYmIGZvdW5kU3Rhck1hcCkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwID0gZm91bmRTdGFyTWFwOwogICAgICAgICAgICAgICAgICAgIGZvdW5kSSA9IHN0YXJJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hcCkgewogICAgICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIHBvaW50cyB0byBhIHBhY2thZ2UncyBuYW1lLCB1c2UKICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgbWFpbiBpbnN0ZWFkLgogICAgICAgICAgICBwa2dNYWluID0gZ2V0T3duKGNvbmZpZy5wa2dzLCBuYW1lKTsKCiAgICAgICAgICAgIHJldHVybiBwa2dNYWluID8gcGtnTWFpbiA6IG5hbWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVTY3JpcHQobmFtZSkgewogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICBlYWNoKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpID09PSBuYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpID09PSBjb250ZXh0LmNvbnRleHROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGhGYWxsYmFjayhpZCkgewogICAgICAgICAgICB2YXIgcGF0aENvbmZpZyA9IGdldE93bihjb25maWcucGF0aHMsIGlkKTsKICAgICAgICAgICAgaWYgKHBhdGhDb25maWcgJiYgaXNBcnJheShwYXRoQ29uZmlnKSAmJiBwYXRoQ29uZmlnLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vUG9wIG9mZiB0aGUgZmlyc3QgYXJyYXkgdmFsdWUsIHNpbmNlIGl0IGZhaWxlZCwgYW5kCiAgICAgICAgICAgICAgICAvL3JldHJ5CiAgICAgICAgICAgICAgICBwYXRoQ29uZmlnLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUudW5kZWYoaWQpOwoKICAgICAgICAgICAgICAgIC8vQ3VzdG9tIHJlcXVpcmUgdGhhdCBkb2VzIG5vdCBkbyBtYXAgdHJhbnNsYXRpb24sIHNpbmNlCiAgICAgICAgICAgICAgICAvL0lEIGlzICJhYnNvbHV0ZSIsIGFscmVhZHkgbWFwcGVkL3Jlc29sdmVkLgogICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZShudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgc2tpcE1hcDogdHJ1ZQogICAgICAgICAgICAgICAgfSkoW2lkXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdCiAgICAgICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lCiAgICAgICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LgogICAgICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHsKICAgICAgICAgICAgdmFyIHByZWZpeCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG1vZHVsZSBtYXBwaW5nIHRoYXQgaW5jbHVkZXMgcGx1Z2luIHByZWZpeCwgbW9kdWxlCiAgICAgICAgICogbmFtZSwgYW5kIHBhdGguIElmIHBhcmVudE1vZHVsZU1hcCBpcyBwcm92aWRlZCBpdCB3aWxsCiAgICAgICAgICogYWxzbyBub3JtYWxpemUgdGhlIG5hbWUgdmlhIHJlcXVpcmUubm9ybWFsaXplKCkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyZW50TW9kdWxlTWFwXSBwYXJlbnQgbW9kdWxlIG1hcAogICAgICAgICAqIGZvciB0aGUgbW9kdWxlIG5hbWUsIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBuYW1lcy4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTm9ybWFsaXplZDogaXMgdGhlIElEIGFscmVhZHkgbm9ybWFsaXplZC4KICAgICAgICAgKiBUaGlzIGlzIHRydWUgaWYgdGhpcyBjYWxsIGlzIGRvbmUgZm9yIGEgZGVmaW5lKCkgbW9kdWxlIElELgogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlNYXA6IGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSBJRC4KICAgICAgICAgKiBTaG91bGQgb25seSBiZSB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIGRlcGVuZGVuY3kuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ha2VNb2R1bGVNYXAobmFtZSwgcGFyZW50TW9kdWxlTWFwLCBpc05vcm1hbGl6ZWQsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciB1cmwsIHBsdWdpbk1vZHVsZSwgc3VmZml4LCBuYW1lUGFydHMsCiAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsLAogICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE1vZHVsZU1hcCA/IHBhcmVudE1vZHVsZU1hcC5uYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZSA9IG5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZSA9IHRydWUsCiAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9ICcnOwoKICAgICAgICAgICAgLy9JZiBubyBuYW1lLCB0aGVuIGl0IG1lYW5zIGl0IGlzIGEgcmVxdWlyZSBjYWxsLCBnZW5lcmF0ZSBhbgogICAgICAgICAgICAvL2ludGVybmFsIG5hbWUuCiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAnX0ByJyArIChyZXF1aXJlQ291bnRlciArPSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobmFtZSk7CiAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IG5vcm1hbGl6ZShwcmVmaXgsIHBhcmVudE5hbWUsIGFwcGx5TWFwKTsKICAgICAgICAgICAgICAgIHBsdWdpbk1vZHVsZSA9IGdldE93bihkZWZpbmVkLCBwcmVmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FjY291bnQgZm9yIHJlbGF0aXZlIHBhdGhzIGlmIHRoZXJlIGlzIGEgYmFzZSBuYW1lLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoYXQgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci4gSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBkbyBpdCBmb3IgZGVmaW5lKCknZCAgbW9kdWxlcy4gcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlaXIgY2FsbGJhY2tzICgjNjk5KS4gSG93ZXZlciBpZiBhIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbkVycm9yIGlzIHNldCwgdXNlIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZXZlbnRzLmVycm9yICYmIHRoaXMubWFwLmlzRGVmaW5lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGNvbnRleHQuZXhlY0NiKGlkLCBmYWN0b3J5LCBkZXBFeHBvcnRzLCBleHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTWFwID0gdGhpcy5tYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gdGhpcy5tYXAuaXNEZWZpbmUgPyBbdGhpcy5tYXAuaWRdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKCh0aGlzLmVycm9yID0gZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgbGl0ZXJhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGZhY3Rvcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0cyA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgIXRoaXMuaWdub3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW2lkXSA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5vblJlc291cmNlTG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNMb2FkTWFwcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvYWRNYXBzLnB1c2goZGVwTWFwLm5vcm1hbGl6ZWRNYXAgfHwgZGVwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25SZXNvdXJjZUxvYWQoY29udGV4dCwgdGhpcy5tYXAsIHJlc0xvYWRNYXBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiB1cAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0ZpbmlzaGVkIHRoZSBkZWZpbmUgc3RhZ2UuIEFsbG93IGNhbGxpbmcgY2hlY2sgYWdhaW4KICAgICAgICAgICAgICAgICAgICAvL3RvIGFsbG93IGRlZmluZSBub3RpZmljYXRpb25zIGJlbG93IGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvL2N5Y2xlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmaW5lZCAmJiAhdGhpcy5kZWZpbmVFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVmaW5lZCcsIHRoaXMuZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdENvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwLAogICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkLAogICAgICAgICAgICAgICAgICAgIC8vTWFwIGFscmVhZHkgbm9ybWFsaXplZCB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbk1hcCA9IG1ha2VNb2R1bGVNYXAobWFwLnByZWZpeCk7CgogICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGlzIHBsdWdpbiwgc28gaXQKICAgICAgICAgICAgICAgIC8vY2FuIGJlIHRyYWNlZCBmb3IgY3ljbGVzLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gocGx1Z2luTWFwKTsKCiAgICAgICAgICAgICAgICBvbihwbHVnaW5NYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWQsIG5vcm1hbGl6ZWRNYXAsIG5vcm1hbGl6ZWRNb2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlkID0gZ2V0T3duKGJ1bmRsZXNNYXAsIHRoaXMubWFwLmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSB0aGlzLm1hcC5wYXJlbnRNYXAgPyB0aGlzLm1hcC5wYXJlbnRNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobWFwLnBhcmVudE1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9JZiBjdXJyZW50IG1hcCBpcyBub3Qgbm9ybWFsaXplZCwgd2FpdCBmb3IgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplZCBuYW1lIHRvIGxvYWQgaW5zdGVhZCBvZiBjb250aW51aW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC51bm5vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIGlmIHRoZSBwbHVnaW4gYWxsb3dzIGl0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlZml4IGFuZCBuYW1lIHNob3VsZCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQsIG5vIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXBwbHlpbmcgbWFwIGNvbmZpZyBhZ2FpbiBlaXRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXggKyAnIScgKyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYXJlbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbihub3JtYWxpemVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLm5vcm1hbGl6ZWRNYXAgPSBub3JtYWxpemVkTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBub3JtYWxpemVkTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRNb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKG5vcm1hbGl6ZWRNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2Qub24oJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2QuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSWYgYSBwYXRocyBjb25maWcsIHRoZW4ganVzdCBsb2FkIHRoYXQgZmlsZSBpbnN0ZWFkIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZXNvbHZlIHRoZSBwbHVnaW4sIGFzIGl0IGlzIGJ1aWx0IGludG8gdGhhdCBwYXRocyBsYXllci4KICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAudXJsID0gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGJpbmQodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGxvYWQuZXJyb3IgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGVtcCB1bm5vcm1hbGl6ZWQgbW9kdWxlcyBmb3IgdGhpcyBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHJlc29sdmVkIG90aGVyd2lzZSBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLm1hcC5pZC5pbmRleE9mKGlkICsgJ191bm5vcm1hbGl6ZWQnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuUmVnaXN0cnkobW9kLm1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL0FsbG93IHBsdWdpbnMgdG8gbG9hZCBvdGhlciBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlCiAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0IG9yIGhvdyB0byAnY29tcGxldGUnIHRoZSBsb2FkLgogICAgICAgICAgICAgICAgICAgIGxvYWQuZnJvbVRleHQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh0ZXh0LCB0ZXh0QWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtYXAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1hcCA9IG1ha2VNb2R1bGVNYXAobW9kdWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmFjdGl2ZSA9IHVzZUludGVyYWN0aXZlOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9BcyBvZiAyLjEuMCwgc3VwcG9ydCBqdXN0IHBhc3NpbmcgdGhlIHRleHQsIHRvIHJlaW5mb3JjZQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb21UZXh0IG9ubHkgYmVpbmcgY2FsbGVkIG9uY2UgcGVyIHJlc291cmNlLiBTdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgb2xkIHN0eWxlIG9mIHBhc3NpbmcgbW9kdWxlTmFtZSBidXQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgbW9kdWxlTmFtZSBpbiBmYXZvciBvZiB0aGUgaW50ZXJuYWwgcmVmLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRBbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgaW50ZXJhY3RpdmUgc2NyaXB0IG1hdGNoaW5nIGZvciBJRSBmb3IgYW55IGRlZmluZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGxzIGluIHRoZSB0ZXh0LCB0aGVuIHR1cm4gaXQgYmFjayBvbiBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJpbWUgdGhlIHN5c3RlbSBieSBjcmVhdGluZyBhIG1vZHVsZSBpbnN0YW5jZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy9pdC4KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1vZHVsZU1hcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1RyYW5zZmVyIGFueSBjb25maWcgdG8gdGhpcyBvdGhlciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbmZpZy5jb25maWcsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbmZpZ1ttb2R1bGVOYW1lXSA9IGNvbmZpZy5jb25maWdbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignZnJvbXRleHRldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21UZXh0IGV2YWwgZm9yICcgKyBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBmYWlsZWQ6ICcgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IGFub255bW91cyBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCB0aGUgdmFsdWUgb2YgdGhhdCBtb2R1bGUgdG8gdGhlIHZhbHVlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZShbbW9kdWxlTmFtZV0sIGxvYWQpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL1VzZSBwYXJlbnROYW1lIGhlcmUgc2luY2UgdGhlIHBsdWdpbidzIG5hbWUgaXMgbm90IHJlbGlhYmxlLAogICAgICAgICAgICAgICAgICAgIC8vY291bGQgYmUgc29tZSB3ZWlyZCBzdHJpbmcgd2l0aCBubyBwYXRoIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8KICAgICAgICAgICAgICAgICAgICAvL3JlZmVyZW5jZSB0aGUgcGFyZW50TmFtZSdzIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQobWFwLm5hbWUsIGxvY2FsUmVxdWlyZSwgbG9hZCwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzW3BsdWdpbk1hcC5pZF0gPSBwbHVnaW5NYXA7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeVt0aGlzLm1hcC5pZF0gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL1NldCBmbGFnIG1lbnRpb25pbmcgdGhhdCB0aGUgbW9kdWxlIGlzIGVuYWJsaW5nLAogICAgICAgICAgICAgICAgLy9zbyB0aGF0IGltbWVkaWF0ZSBjYWxscyB0byB0aGUgZGVmaW5lZCBjYWxsYmFja3MKICAgICAgICAgICAgICAgIC8vZm9yIGRlcGVuZGVuY2llcyBkbyBub3QgdHJpZ2dlciBpbmFkdmVydGVudCBsb2FkCiAgICAgICAgICAgICAgICAvL3dpdGggdGhlIGRlcENvdW50IHN0aWxsIGJlaW5nIHplcm8uCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1vZCwgaGFuZGxlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBNYXAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVwZW5kZW5jeSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkZXBNYXAKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgd2lyZWQgdXAgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcC5pc0RlZmluZSA/IHRoaXMubWFwIDogdGhpcy5tYXAucGFyZW50TWFwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5za2lwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzW2ldID0gZGVwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldE93bihoYW5kbGVycywgZGVwTWFwLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBoYW5kbGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50ICs9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5kZWZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRGVwKGksIGRlcEV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcnJiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgdGhpcy5lcnJiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdCBlcnJiYWNrIG9uIHRoaXMgbW9kdWxlLCBidXQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGlzIGxpc3RlbmluZyBmb3IgZXJyb3JzLCBzbyBiZSBzdXJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uKGRlcE1hcCwgJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWQgPSBkZXBNYXAuaWQ7CiAgICAgICAgICAgICAgICAgICAgbW9kID0gcmVnaXN0cnlbaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL1NraXAgc3BlY2lhbCBtb2R1bGVzIGxpa2UgJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnCiAgICAgICAgICAgICAgICAgICAgLy9BbHNvLCBkb24ndCBjYWxsIGVuYWJsZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjYXNlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoaGFuZGxlcnMsIGlkKSAmJiBtb2QgJiYgIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5hYmxlKGRlcE1hcCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIC8vRW5hYmxlIGVhY2ggcGx1Z2luIHRoYXQgaXMgdXNlZCBpbgogICAgICAgICAgICAgICAgLy9hIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2hQcm9wKHRoaXMucGx1Z2luTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgcGx1Z2luTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgb246IGZ1bmN0aW9uIChuYW1lLCBjYikgewogICAgICAgICAgICAgICAgdmFyIGNicyA9IHRoaXMuZXZlbnRzW25hbWVdOwogICAgICAgICAgICAgICAgaWYgKCFjYnMpIHsKICAgICAgICAgICAgICAgICAgICBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2JzLnB1c2goY2IpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKG5hbWUsIGV2dCkgewogICAgICAgICAgICAgICAgZWFjaCh0aGlzLmV2ZW50c1tuYW1lXSwgZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoZXZ0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAvL05vdyB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIHdhcyB0cmlnZ2VyZWQsIHJlbW92ZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGxpc3RlbmVycywgc2luY2UgdGhpcyBicm9rZW4gTW9kdWxlIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgLy9jYW4gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNhbGxHZXRNb2R1bGUoYXJncykgewogICAgICAgICAgICAvL1NraXAgbW9kdWxlcyBhbHJlYWR5IGRlZmluZWQuCiAgICAgICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBhcmdzWzBdKSkgewogICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAoYXJnc1swXSwgbnVsbCwgdHJ1ZSkpLmluaXQoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGZ1bmMsIG5hbWUsIGllTmFtZSkgewogICAgICAgICAgICAvL0Zhdm9yIGRldGFjaEV2ZW50IGJlY2F1c2Ugb2YgSUU5CiAgICAgICAgICAgIC8vaXNzdWUsIHNlZSBhdHRhY2hFdmVudC9hZGRFdmVudExpc3RlbmVyIGNvbW1lbnQgZWxzZXdoZXJlCiAgICAgICAgICAgIC8vaW4gdGhpcyBmaWxlLgogICAgICAgICAgICBpZiAobm9kZS5kZXRhY2hFdmVudCAmJiAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgICAgIC8vdXNlZnVsIHRvIGtub3cuCiAgICAgICAgICAgICAgICBpZiAoaWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2hFdmVudChpZU5hbWUsIGZ1bmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQgZnJvbSBhIHNjcmlwdCBub2RlLCBnZXQgdGhlIHJlcXVpcmVqcyBpbmZvIGZyb20gaXQsCiAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBub2RlLgogICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dAogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2NyaXB0RGF0YShldnQpIHsKICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAvL2FsbCBvbGQgYnJvd3NlcnMgd2lsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG9uZSB3YXMgZWFzeSBlbm91Z2gKICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgdmFyIG5vZGUgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb25jZSBoZXJlLgogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgJ2xvYWQnLCAnb25yZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNvbnRleHQub25TY3JpcHRFcnJvciwgJ2Vycm9yJyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgIGlkOiBub2RlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW50YWtlRGVmaW5lcygpIHsKICAgICAgICAgICAgdmFyIGFyZ3M7CgogICAgICAgICAgICAvL0FueSBkZWZpbmVkIG1vZHVsZXMgaW4gdGhlIGdsb2JhbCBxdWV1ZSwgaW50YWtlIHRoZW0gbm93LgogICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgIC8vTWFrZSBzdXJlIGFueSByZW1haW5pbmcgZGVmUXVldWUgaXRlbXMgZ2V0IHByb3Blcmx5IHByb2Nlc3NlZC4KICAgICAgICAgICAgd2hpbGUgKGRlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignbWlzbWF0Y2gnLCAnTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vYXJncyBhcmUgaWQsIGRlcHMsIGZhY3RvcnkuIFNob3VsZCBiZSBub3JtYWxpemVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lKCkgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwID0ge307CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWU6IGNvbnRleHROYW1lLAogICAgICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksCiAgICAgICAgICAgIGRlZmluZWQ6IGRlZmluZWQsCiAgICAgICAgICAgIHVybEZldGNoZWQ6IHVybEZldGNoZWQsCiAgICAgICAgICAgIGRlZlF1ZXVlOiBkZWZRdWV1ZSwKICAgICAgICAgICAgZGVmUXVldWVNYXA6IHt9LAogICAgICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICAgICAgbWFrZU1vZHVsZU1hcDogbWFrZU1vZHVsZU1hcCwKICAgICAgICAgICAgbmV4dFRpY2s6IHJlcS5uZXh0VGljaywKICAgICAgICAgICAgb25FcnJvcjogb25FcnJvciwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGV4dC4KICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWcgb2JqZWN0IHRvIGludGVncmF0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKGNmZykgewogICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIGJhc2VVcmwgZW5kcyBpbiBhIHNsYXNoLgogICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsLmNoYXJBdChjZmcuYmFzZVVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsICs9ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29udmVydCBvbGQgc3R5bGUgdXJsQXJncyBzdHJpbmcgdG8gYSBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2ZnLnVybEFyZ3MgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBjZmcudXJsQXJnczsKICAgICAgICAgICAgICAgICAgICBjZmcudXJsQXJncyA9IGZ1bmN0aW9uKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TYXZlIG9mZiB0aGUgcGF0aHMgc2luY2UgdGhleSByZXF1aXJlIHNwZWNpYWwgcHJvY2Vzc2luZywKICAgICAgICAgICAgICAgIC8vdGhleSBhcmUgYWRkaXRpdmUuCiAgICAgICAgICAgICAgICB2YXIgc2hpbSA9IGNvbmZpZy5zaGltLAogICAgICAgICAgICAgICAgICAgIG9ianMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2Jqc1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4oY29uZmlnW3Byb3BdLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9SZXZlcnNlIG1hcCB0aGUgYnVuZGxlcwogICAgICAgICAgICAgICAgaWYgKGNmZy5idW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLmJ1bmRsZXMsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzTWFwW3ZdID0gcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9NZXJnZSBzaGltCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnNoaW0pIHsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChjZmcuc2hpbSwgZnVuY3Rpb24gKHZhbHVlLCBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZS5leHBvcnRzIHx8IHZhbHVlLmluaXQpICYmICF2YWx1ZS5leHBvcnRzRm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cG9ydHNGbiA9IGNvbnRleHQubWFrZVNoaW1FeHBvcnRzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzaGltW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaGltID0gc2hpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0FkanVzdCBwYWNrYWdlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaChjZmcucGFja2FnZXMsIGZ1bmN0aW9uIChwa2dPYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uLCBuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGtnT2JqID0gdHlwZW9mIHBrZ09iaiA9PT0gJ3N0cmluZycgPyB7bmFtZTogcGtnT2JqfSA6IHBrZ09iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwa2dPYmoubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBwa2dPYmoubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW25hbWVdID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgcG9pbnRlciB0byBtYWluIG1vZHVsZSBJRCBmb3IgcGtnIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGxlYWRpbmcgZG90IGluIG1haW4sIHNvIG1haW4gcGF0aHMgYXJlIG5vcm1hbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgLmpzLCBzaW5jZSBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAvL2VudnMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnM6IHNvbWUgdXNlIGEgbW9kdWxlIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc29tZSB1c2UgYSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wa2dzW25hbWVdID0gcGtnT2JqLm5hbWUgKyAnLycgKyAocGtnT2JqLm1haW4gfHwgJ21haW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGFueSAid2FpdGluZyB0byBleGVjdXRlIiBtb2R1bGVzIGluIHRoZSByZWdpc3RyeSwKICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtYXBzIGZvciB0aGVtLCBzaW5jZSB0aGVpciBpbmZvLCBsaWtlIFVSTHMgdG8gbG9hZCwKICAgICAgICAgICAgICAgIC8vbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kLCBpZCkgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbW9kdWxlIGFscmVhZHkgaGFzIGluaXQgY2FsbGVkLCBzaW5jZSBpdCBpcyB0b28KICAgICAgICAgICAgICAgICAgICAvL2xhdGUgdG8gbW9kaWZ5IHRoZW0sIGFuZCBpZ25vcmUgdW5ub3JtYWxpemVkIG9uZXMKICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgYXJlIHRyYW5zaWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgIW1vZC5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5tYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL0lmIGEgZGVwcyBhcnJheSBvciBhIGNvbmZpZyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZW4gY2FsbAogICAgICAgICAgICAgICAgLy9yZXF1aXJlIHdpdGggdGhvc2UgYXJncy4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXF1aXJlIGlzIGRlZmluZWQgYXMgYQogICAgICAgICAgICAgICAgLy9jb25maWcgb2JqZWN0IGJlZm9yZSByZXF1aXJlLmpzIGlzIGxvYWRlZC4KICAgICAgICAgICAgICAgIGlmIChjZmcuZGVwcyB8fCBjZmcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUoY2ZnLmRlcHMgfHwgW10sIGNmZy5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWtlU2hpbUV4cG9ydHM6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB2YWx1ZS5pbml0LmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAodmFsdWUuZXhwb3J0cyAmJiBnZXRHbG9iYWwodmFsdWUuZXhwb3J0cykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVJlcXVpcmU6IGZ1bmN0aW9uIChyZWxNYXAsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxvY2FsUmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCwgbWFwLCByZXF1aXJlTW9kOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVCdWlsZENhbGxiYWNrICYmIGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLl9fcmVxdWlyZUpzQnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3JlcXVpcmVhcmdzJywgJ0ludmFsaWQgcmVxdWlyZSBjYWxsJyksIGVycmJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHJlcXVpcmV8ZXhwb3J0c3xtb2R1bGUgYXJlIHJlcXVlc3RlZCwgZ2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlIGZvciB0aGVtIGZyb20gdGhlIHNwZWNpYWwgaGFuZGxlcnMuIENhdmVhdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG9ubHkgd29ya3Mgd2hpbGUgbW9kdWxlIGlzIGJlaW5nIGRlZmluZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxNYXAgJiYgaGFzUHJvcChoYW5kbGVycywgZGVwcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyc1tkZXBzXShyZWdpc3RyeVtyZWxNYXAuaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cyBhY2Nlc3MgdG8gb25lIG1vZHVsZS4gSWYgcmVxdWlyZS5nZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdmFpbGFibGUgKGFzIGluIHRoZSBOb2RlIGFkYXB0ZXIpLCBwcmVmZXIgdGhhdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5nZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXEuZ2V0KGNvbnRleHQsIGRlcHMsIHJlbE1hcCwgbG9jYWxSZXF1aXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbW9kdWxlIG5hbWUsIGlmIGl0IGNvbnRhaW5zIC4gb3IgLi4KICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbWFrZU1vZHVsZU1hcChkZXBzLCByZWxNYXAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vdGxvYWRlZCcsICdNb2R1bGUgbmFtZSAiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCBmb3IgY29udGV4dDogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsTWFwID8gJycgOiAnLiBVc2UgcmVxdWlyZShbXSknKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vR3JhYiBkZWZpbmVzIHdhaXRpbmcgaW4gdGhlIGdsb2JhbCBxdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vTWFyayBhbGwgdGhlIGRlcGVuZGVuY2llcyBhcyBuZWVkaW5nIHRvIGJlIGxvYWRlZC4KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Tb21lIGRlZmluZXMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCwgY29sbGVjdCB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kID0gZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAobnVsbCwgcmVsTWFwKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3JlIGlmIG1hcCBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbCBmb3IgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLnNraXBNYXAgPSBvcHRpb25zLnNraXBNYXA7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLmluaXQoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxSZXF1aXJlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1peGluKGxvY2FsUmVxdWlyZSwgewogICAgICAgICAgICAgICAgICAgIGlzQnJvd3NlcjogaXNCcm93c2VyLAoKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0cyBhIG1vZHVsZSBuYW1lICsgLmV4dGVuc2lvbiBpbnRvIGFuIFVSTCBwYXRoLgogICAgICAgICAgICAgICAgICAgICAqICpSZXF1aXJlcyogdGhlIHVzZSBvZiBhIG1vZHVsZSBuYW1lLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICogcGxhaW4gVVJMcyBsaWtlIG5hbWVUb1VybC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0b1VybDogZnVuY3Rpb24gKG1vZHVsZU5hbWVQbHVzRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1vZHVsZU5hbWVQbHVzRXh0Lmxhc3RJbmRleE9mKCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3BsaXQoJy8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVsYXRpdmUgPSBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudCA9PT0gJy4uJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSGF2ZSBhIGZpbGUgZXh0ZW5zaW9uIGFsaWFzLCBhbmQgaXQgaXMgbm90IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL2RvdHMgZnJvbSBhIHJlbGF0aXZlIHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgKCFpc1JlbGF0aXZlIHx8IGluZGV4ID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZyhpbmRleCwgbW9kdWxlTmFtZVBsdXNFeHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVQbHVzRXh0ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZShtb2R1bGVOYW1lUGx1c0V4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsTWFwICYmIHJlbE1hcC5pZCwgdHJ1ZSksIGV4dCwgIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIGRlZmluZWQ6IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJvcChkZWZpbmVkLCBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgaWQpIHx8IGhhc1Byb3AocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL09ubHkgYWxsb3cgdW5kZWYgb24gdG9wIGxldmVsIHJlcXVpcmUgY2FsbHMKICAgICAgICAgICAgICAgIGlmICghcmVsTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXF1aXJlLnVuZGVmID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCBhbnkgd2FpdGluZyBkZWZpbmUoKSBjYWxscyB0byB0aGlzIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZml4IGZvciAjNDA4CiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1ha2VNb2R1bGVNYXAoaWQsIHJlbE1hcCwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC51bmRlZmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2NyaXB0KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybEZldGNoZWRbbWFwLnVybF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1bmRlZkV2ZW50c1tpZF07CgogICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHF1ZXVlZCBkZWZpbmVzIHRvby4gR28gYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gYXJyYXkgc28gdGhhdCB0aGUgc3BsaWNlcyBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzIHVwIHRoZSBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hSZXZlcnNlKGRlZlF1ZXVlLCBmdW5jdGlvbihhcmdzLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hvbGQgb24gdG8gbGlzdGVuZXJzIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vZHVsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBhIGRpZmZlcmVudCBjb25maWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZFdmVudHNbaWRdID0gbW9kLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgdG8gZW5hYmxlIGEgbW9kdWxlIGlmIGl0IGlzIHN0aWxsIGluIHRoZSByZWdpc3RyeQogICAgICAgICAgICAgKiBhd2FpdGluZyBlbmFibGVtZW50LiBBIHNlY29uZCBhcmcsIHBhcmVudCwgdGhlIHBhcmVudCBtb2R1bGUsCiAgICAgICAgICAgICAqIGlzIHBhc3NlZCBpbiBmb3IgY29udGV4dCwgd2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5CiAgICAgICAgICAgICAqIHRoZSBvcHRpbWl6ZXIuIE5vdCBzaG93biBoZXJlIHRvIGtlZXAgY29kZSBjb21wYWN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBkZXBNYXAuaWQpOwogICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShkZXBNYXApLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGVudmlyb25tZW50IGFkYXB0ZXJzIHRvIGNvbXBsZXRlIGEgbG9hZCBldmVudC4KICAgICAgICAgICAgICogQSBsb2FkIGV2ZW50IGNvdWxkIGJlIGEgc2NyaXB0IGxvYWQgb3IganVzdCBhIGxvYWQgcGFzcyBmcm9tIGEgc3luY2hyb25vdXMKICAgICAgICAgICAgICogbG9hZCBjYWxsLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHBvdGVudGlhbGx5IGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29tcGxldGVMb2FkOiBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgdmFyIGZvdW5kLCBhcmdzLCBtb2QsCiAgICAgICAgICAgICAgICAgICAgc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbW9kdWxlTmFtZSkgfHwge30sCiAgICAgICAgICAgICAgICAgICAgc2hFeHBvcnRzID0gc2hpbS5leHBvcnRzOwoKICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGVmUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gbW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbHJlYWR5IGZvdW5kIGFuIGFub255bW91cyBtb2R1bGUgYW5kIGJvdW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gdGhpcyBuYW1lLCB0aGVuIHRoaXMgaXMgc29tZSBvdGhlciBhbm9uIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAvL3dhaXRpbmcgZm9yIGl0cyBjb21wbGV0ZUxvYWQgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09PSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgbWF0Y2hpbmcgZGVmaW5lIGNhbGwgZm9yIHRoaXMgc2NyaXB0IQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsR2V0TW9kdWxlKGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vRG8gdGhpcyBhZnRlciB0aGUgY3ljbGUgb2YgY2FsbEdldE1vZHVsZSBpbiBjYXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIC8vb2YgdGhvc2UgY2FsbHMvaW5pdCBjYWxscyBjaGFuZ2VzIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAhaGFzUHJvcChkZWZpbmVkLCBtb2R1bGVOYW1lKSAmJiBtb2QgJiYgIW1vZC5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVuZm9yY2VEZWZpbmUgJiYgKCFzaEV4cG9ydHMgfHwgIWdldEdsb2JhbChzaEV4cG9ydHMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vZGVmaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGRlZmluZSBjYWxsIGZvciAnICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL0Egc2NyaXB0IHRoYXQgZG9lcyBub3QgY2FsbCBkZWZpbmUoKSwgc28ganVzdCBzaW11bGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBjYWxsIGZvciBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShbbW9kdWxlTmFtZSwgKHNoaW0uZGVwcyB8fCBbXSksIHNoaW0uZXhwb3J0c0ZuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSB0byBhIGZpbGUgcGF0aC4gU3VwcG9ydHMgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICogbW9kdWxlTmFtZSBtYXkgYWN0dWFsbHkgYmUganVzdCBhbiBVUkwuCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpdCAqKmRvZXMgbm90KiogY2FsbCBub3JtYWxpemUgb24gdGhlIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAqIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZC4gVGhpcyBpcyBhbgogICAgICAgICAgICAgKiBpbnRlcm5hbCBBUEksIG5vdCBhIHB1YmxpYyBvbmUuIFVzZSB0b1VybCBmb3IgdGhlIHB1YmxpYyBBUEkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lVG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCBleHQsIHNraXBFeHQpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRocywgc3ltcywgaSwgcGFyZW50TW9kdWxlLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCwgYnVuZGxlSWQsCiAgICAgICAgICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHBrZ01haW4pIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gcGtnTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCBtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQsIGV4dCwgc2tpcEV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9JZiBhIGNvbG9uIGlzIGluIHRoZSBVUkwsIGl0IGluZGljYXRlcyBhIHByb3RvY29sIGlzIHVzZWQgYW5kIGl0IGlzIGp1c3QKICAgICAgICAgICAgICAgIC8vYW4gVVJMIHRvIGEgZmlsZSwgb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCwgY29udGFpbnMgYSBxdWVyeSBhcmcgKGkuZS4gPykKICAgICAgICAgICAgICAgIC8vb3IgZW5kcyB3aXRoIC5qcywgdGhlbiBhc3N1bWUgdGhlIHVzZXIgbWVhbnQgdG8gdXNlIGFuIHVybCBhbmQgbm90IGEgbW9kdWxlIGlkLgogICAgICAgICAgICAgICAgLy9UaGUgc2xhc2ggaXMgaW1wb3J0YW50IGZvciBwcm90b2NvbC1sZXNzIFVSTHMgYXMgd2VsbCBhcyBmdWxsIHBhdGhzLgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgcGxhaW4gcGF0aCwgbm90IG1vZHVsZSBuYW1lIGxvb2t1cCwgc28ganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgLy9BZGQgZXh0ZW5zaW9uIGlmIGl0IGlzIGluY2x1ZGVkLiBUaGlzIGlzIGEgYml0IHdvbmt5LCBvbmx5IG5vbi0uanMgdGhpbmdzIHBhc3MKICAgICAgICAgICAgICAgICAgICAvL2FuIGV4dGVuc2lvbiwgdGhpcyBtZXRob2QgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmV3b3JrZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gbW9kdWxlTmFtZSArIChleHQgfHwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aC4KICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGNvbmZpZy5wYXRoczsKCiAgICAgICAgICAgICAgICAgICAgc3ltcyA9IG1vZHVsZU5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIG1vZHVsZSBuYW1lIHNlZ21lbnQsIHNlZSBpZiB0aGVyZSBpcyBhIHBhdGgKICAgICAgICAgICAgICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIGl0LiBTdGFydCB3aXRoIG1vc3Qgc3BlY2lmaWMgbmFtZQogICAgICAgICAgICAgICAgICAgIC8vYW5kIHdvcmsgdXAgZnJvbSBpdC4KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzeW1zLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2R1bGUgPSBzeW1zLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBnZXRPd24ocGF0aHMsIHBhcmVudE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGFuIGFycmF5LCBpdCBtZWFucyB0aGVyZSBhcmUgYSBmZXcgY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHRoZSBvbmUgdGhhdCBpcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJlbnRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXJlbnRQYXRoWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5zcGxpY2UoMCwgaSwgcGFyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSBwYXRoIHBhcnRzIHRvZ2V0aGVyLCB0aGVuIGZpZ3VyZSBvdXQgaWYgYmFzZVVybCBpcyBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gc3ltcy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9IChleHQgfHwgKC9eZGF0YVw6fF5ibG9iXDp8XD8vLnRlc3QodXJsKSB8fCBza2lwRXh0ID8gJycgOiAnLmpzJykpOwogICAgICAgICAgICAgICAgICAgIHVybCA9ICh1cmwuY2hhckF0KDApID09PSAnLycgfHwgdXJsLm1hdGNoKC9eW1x3XCtcLlwtXSs6LykgPyAnJyA6IGNvbmZpZy5iYXNlVXJsKSArIHVybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnVybEFyZ3MgJiYgIS9eYmxvYlw6Ly50ZXN0KHVybCkgPwogICAgICAgICAgICAgICAgICAgICAgIHVybCArIGNvbmZpZy51cmxBcmdzKG1vZHVsZU5hbWUsIHVybCkgOiB1cmw7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0RlbGVnYXRlcyB0byByZXEubG9hZC4gQnJva2VuIG91dCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAgIC8vYWxsb3cgb3ZlcnJpZGluZyBpbiB0aGUgb3B0aW1pemVyLgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoaWQsIHVybCkgewogICAgICAgICAgICAgICAgcmVxLmxvYWQoY29udGV4dCwgaWQsIHVybCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXhlY3V0ZXMgYSBtb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb24uIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgKiBzb2xlbHkgdG8gYWxsb3cgdGhlIGJ1aWxkIHN5c3RlbSB0byBzZXF1ZW5jZSB0aGUgZmlsZXMgaW4gdGhlIGJ1aWx0CiAgICAgICAgICAgICAqIGxheWVyIGluIHRoZSByaWdodCBzZXF1ZW5jZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV4ZWNDYjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBhcmdzLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoZXhwb3J0cywgYXJncyk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogY2FsbGJhY2sgZm9yIHNjcmlwdCBsb2FkcywgdXNlZCB0byBjaGVjayBzdGF0dXMgb2YgbG9hZGluZy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZ0IHRoZSBldmVudCBmcm9tIHRoZSBicm93c2VyIGZvciB0aGUgc2NyaXB0CiAgICAgICAgICAgICAqIHRoYXQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0TG9hZDogZnVuY3Rpb24gKGV2dCkgewogICAgICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgICAgICAvL3RvIHN1cHBvcnQgYW5kIHN0aWxsIG1ha2VzIHNlbnNlLgogICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlID09PSAnbG9hZCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWR5UmVnRXhwLnRlc3QoKGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50KS5yZWFkeVN0YXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IGludGVyYWN0aXZlIHNjcmlwdCBzbyBhIHNjcmlwdCBub2RlIGlzIG5vdCBoZWxkIG9udG8gZm9yCiAgICAgICAgICAgICAgICAgICAgLy90byBsb25nLgogICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG91dCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChkYXRhLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igc2NyaXB0IGVycm9ycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0RXJyb3I6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZ2V0U2NyaXB0RGF0YShldnQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNQYXRoRmFsbGJhY2soZGF0YS5pZCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX0ByJykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godmFsdWUuZGVwTWFwcywgZnVuY3Rpb24oZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcE1hcC5pZCA9PT0gZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVpcmVqcy9yZXF1aXJlanMvaXNzdWVzLzE4NwogICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgY2FuIE5PVCBmaW5kIFtuYXRpdmUgY29kZV0gdGhlbiBpdCBtdXN0IE5PVCBuYXRpdmVseSBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgLy9pbiBJRTgsIG5vZGUuYXR0YWNoRXZlbnQgZG9lcyBub3QgaGF2ZSB0b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgLy9Ob3RlIHRoZSB0ZXN0IGZvciAiW25hdGl2ZSBjb2RlIiB3aXRoIG5vIGNsb3NpbmcgYnJhY2UsIHNlZToKICAgICAgICAgICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8yNzMKICAgICAgICAgICAgICAgICAgICAhKG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcgJiYgbm9kZS5hdHRhY2hFdmVudC50b1N0cmluZygpLmluZGV4T2YoJ1tuYXRpdmUgY29kZScpIDwgMCkgJiYKICAgICAgICAgICAgICAgICAgICAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSUUgKGF0IGxlYXN0IDYtOCkgZG8gbm90IGZpcmUKICAgICAgICAgICAgICAgIC8vc2NyaXB0IG9ubG9hZCByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCwgc28KICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRpZSB0aGUgYW5vbnltb3VzIGRlZmluZSBjYWxsIHRvIGEgbmFtZS4KICAgICAgICAgICAgICAgIC8vSG93ZXZlciwgSUUgcmVwb3J0cyB0aGUgc2NyaXB0IGFzIGJlaW5nIGluICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgIC8vcmVhZHlTdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVmaW5lIGNhbGwuCiAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IHRydWU7CgogICAgICAgICAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgY29udGV4dC5vblNjcmlwdExvYWQpOwogICAgICAgICAgICAgICAgLy9JdCB3b3VsZCBiZSBncmVhdCB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBoZXJlIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAvLzQwNHMgaW4gSUU5Ky4gSG93ZXZlciwgb25yZWFkeXN0YXRlY2hhbmdlIHdpbGwgZmlyZSBiZWZvcmUKICAgICAgICAgICAgICAgIC8vdGhlIGVycm9yIGhhbmRsZXIsIHNvIHRoYXQgZG9lcyBub3QgaGVscC4gSWYgYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy9pcyB1c2VkLCB0aGVuIElFIHdpbGwgZmlyZSBlcnJvciBiZWZvcmUgbG9hZCwgYnV0IHdlIGNhbm5vdAogICAgICAgICAgICAgICAgLy91c2UgdGhhdCBwYXRod2F5IGdpdmVuIHRoZSBjb25uZWN0Lm1pY3Jvc29mdC5jb20gaXNzdWUKICAgICAgICAgICAgICAgIC8vbWVudGlvbmVkIGFib3ZlIGFib3V0IG5vdCBkb2luZyB0aGUgJ3NjcmlwdCBleGVjdXRlLAogICAgICAgICAgICAgICAgLy90aGVuIGZpcmUgdGhlIHNjcmlwdCBsb2FkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBleGVjdXRlCiAgICAgICAgICAgICAgICAvL25leHQgc2NyaXB0JyB0aGF0IG90aGVyIGJyb3dzZXJzIGRvLgogICAgICAgICAgICAgICAgLy9CZXN0IGhvcGU6IElFMTAgZml4ZXMgdGhlIGlzc3VlcywKICAgICAgICAgICAgICAgIC8vYW5kIHRoZW4gZGVzdHJveXMgYWxsIGluc3RhbGxzIG9mIElFIDYtOS4KICAgICAgICAgICAgICAgIC8vbm9kZS5hdHRhY2hFdmVudCgnb25lcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvciwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwoKICAgICAgICAgICAgLy9DYWxsaW5nIG9uTm9kZUNyZWF0ZWQgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgaGF2ZSBiZWVuCiAgICAgICAgICAgIC8vc2V0LCBidXQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbiB0aGUgRE9NLgogICAgICAgICAgICBpZiAoY29uZmlnLm9uTm9kZUNyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5vbk5vZGVDcmVhdGVkKG5vZGUsIGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Gb3Igc29tZSBjYWNoZSBjYXNlcyBpbiBJRSA2LTgsIHRoZSBzY3JpcHQgZXhlY3V0ZXMgYmVmb3JlIHRoZSBlbmQKICAgICAgICAgICAgLy9vZiB0aGUgYXBwZW5kQ2hpbGQgZXhlY3V0aW9uLCBzbyB0byB0aWUgYW4gYW5vbnltb3VzIGRlZmluZQogICAgICAgICAgICAvL2NhbGwgdG8gdGhlIG1vZHVsZSBuYW1lICh3aGljaCBpcyBzdG9yZWQgb24gdGhlIG5vZGUpLCBob2xkIG9uCiAgICAgICAgICAgIC8vdG8gYSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCBidXQgY2xlYXIgYWZ0ZXIgdGhlIERPTSBpbnNlcnRpb24uCiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUobm9kZSwgYmFzZUVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBudWxsOwoKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChpc1dlYldvcmtlcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy9JbiBhIHdlYiB3b3JrZXIsIHVzZSBpbXBvcnRTY3JpcHRzLiBUaGlzIGlzIG5vdCBhIHZlcnkKICAgICAgICAgICAgICAgIC8vZWZmaWNpZW50IHVzZSBvZiBpbXBvcnRTY3JpcHRzLCBpbXBvcnRTY3JpcHRzIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICAgICAgICAgIC8vaXRzIHNjcmlwdCBpcyBkb3dubG9hZGVkIGFuZCBldmFsdWF0ZWQuIEhvd2V2ZXIsIGlmIHdlYiB3b3JrZXJzCiAgICAgICAgICAgICAgICAvL2FyZSBpbiBwbGF5LCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGJ1aWxkIGhhcyBiZWVuIGRvbmUgc28KICAgICAgICAgICAgICAgIC8vdGhhdCBvbmx5IG9uZSBzY3JpcHQgbmVlZHMgdG8gYmUgbG9hZGVkIGFueXdheS4gVGhpcyBtYXkgbmVlZAogICAgICAgICAgICAgICAgLy90byBiZSByZWV2YWx1YXRlZCBpZiBvdGhlciB1c2UgY2FzZXMgYmVjb21lIGNvbW1vbi4KCiAgICAgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgZXZlbnQgbG9vcCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBXZWJLaXQKICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSB3b3JrZXIgZ2V0cyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciBjYWxsaW5nCiAgICAgICAgICAgICAgICAvLyBpbXBvcnRTY3JpcHRzKCk6IGh0dHBzOi8vd2Via2l0Lm9yZy9iLzE1MzMxNwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHt9LCAwKTsKICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHModXJsKTsKCiAgICAgICAgICAgICAgICAvL0FjY291bnQgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKG1ha2VFcnJvcignaW1wb3J0c2NyaXB0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydFNjcmlwdHMgZmFpbGVkIGZvciAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSArICcgYXQgJyArIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpIHsKICAgICAgICBpZiAoaW50ZXJhY3RpdmVTY3JpcHQgJiYgaW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICAgICAgfQoKICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyYWN0aXZlU2NyaXB0ID0gc2NyaXB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgIH0KCiAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIHNjcmlwdCBhdHRyaWJ1dGUsIHdoaWNoIGNvdWxkIGFsc28gYWRqdXN0IHRoZSBiYXNlVXJsLgogICAgaWYgKGlzQnJvd3NlciAmJiAhY2ZnLnNraXBEYXRhTWFpbikgewogICAgICAgIC8vRmlndXJlIG91dCBiYXNlVXJsLiBHZXQgaXQgZnJvbSB0aGUgc2NyaXB0IHRhZyB3aXRoIHJlcXVpcmUuanMgaW4gaXQuCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIC8vU2V0IHRoZSAnaGVhZCcgd2hlcmUgd2UgY2FuIGFwcGVuZCBjaGlsZHJlbiBieQogICAgICAgICAgICAvL3VzaW5nIHRoZSBzY3JpcHQncyBwYXJlbnQuCiAgICAgICAgICAgIGlmICghaGVhZCkgewogICAgICAgICAgICAgICAgaGVhZCA9IHNjcmlwdC5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIGF0dHJpYnV0ZSB0byBzZXQgbWFpbiBzY3JpcHQgZm9yIHRoZSBwYWdlCiAgICAgICAgICAgIC8vdG8gbG9hZC4gSWYgaXQgaXMgdGhlcmUsIHRoZSBwYXRoIHRvIGRhdGEgbWFpbiBiZWNvbWVzIHRoZQogICAgICAgICAgICAvL2Jhc2VVcmwsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAgICAgZGF0YU1haW4gPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdkYXRhLW1haW4nKTsKICAgICAgICAgICAgaWYgKGRhdGFNYWluKSB7CiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIGRhdGFNYWluIGluIGNhc2UgaXQgaXMgYSBwYXRoIChpLmUuIGNvbnRhaW5zICc/JykKICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKCiAgICAgICAgICAgICAgICAvL1NldCBmaW5hbCBiYXNlVXJsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGFuIGV4cGxpY2l0IG9uZSwKICAgICAgICAgICAgICAgIC8vYnV0IG9ubHkgZG8gc28gaWYgdGhlIGRhdGEtbWFpbiB2YWx1ZSBpcyBub3QgYSBsb2FkZXIgcGx1Z2luCiAgICAgICAgICAgICAgICAvL21vZHVsZSBJRC4KICAgICAgICAgICAgICAgIGlmICghY2ZnLmJhc2VVcmwgJiYgbWFpblNjcmlwdC5pbmRleE9mKCchJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG9mZiB0aGUgZGlyZWN0b3J5IG9mIGRhdGEtbWFpbiBmb3IgdXNlIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vYmFzZVVybC4KICAgICAgICAgICAgICAgICAgICBzcmMgPSBtYWluU2NyaXB0LnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IHNyYy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gc3JjLmxlbmd0aCA/IHNyYy5qb2luKCcvJykgICsgJy8nIDogJy4vJzsKCiAgICAgICAgICAgICAgICAgICAgY2ZnLmJhc2VVcmwgPSBzdWJQYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU3RyaXAgb2ZmIGFueSB0cmFpbGluZyAuanMgc2luY2UgbWFpblNjcmlwdCBpcyBub3cKICAgICAgICAgICAgICAgIC8vbGlrZSBhIG1vZHVsZSBuYW1lLgogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IG1haW5TY3JpcHQucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwoKICAgICAgICAgICAgICAgIC8vSWYgbWFpblNjcmlwdCBpcyBzdGlsbCBhIHBhdGgsIGZhbGwgYmFjayB0byBkYXRhTWFpbgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1haW5TY3JpcHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vUHV0IHRoZSBkYXRhLW1haW4gc2NyaXB0IGluIHRoZSBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgY2ZnLmRlcHMgPSBjZmcuZGVwcyA/IGNmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KSA6IFttYWluU2NyaXB0XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkZWZpbml0aW9ucyBvZiBtb2R1bGVzLiBEaWZmZXJzIGZyb20KICAgICAqIHJlcXVpcmUoKSBpbiB0aGF0IGEgc3RyaW5nIGZvciB0aGUgbW9kdWxlIHNob3VsZCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsCiAgICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQgc2hvdWxkCiAgICAgKiByZXR1cm4gYSB2YWx1ZSB0byBkZWZpbmUgdGhlIG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCdzCiAgICAgKiBuYW1lLgogICAgICovCiAgICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJhY2spIHsKICAgICAgICB2YXIgbm9kZSwgY29udGV4dDsKCiAgICAgICAgLy9BbGxvdyBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vVGhpcyBtb2R1bGUgbWF5IG5vdCBoYXZlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghaXNBcnJheShkZXBzKSkgewogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBuYW1lLCBhbmQgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgdGhlbiBmaWd1cmUgb3V0IGlmIGl0IGEKICAgICAgICAvL0NvbW1vbkpTIHRoaW5nIHdpdGggZGVwZW5kZW5jaWVzLgogICAgICAgIGlmICghZGVwcyAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIC8vUmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHN0cmluZywKICAgICAgICAgICAgLy9sb29rIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgcHVsbCB0aGVtIGludG8gdGhlIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgLy9idXQgb25seSBpZiB0aGVyZSBhcmUgZnVuY3Rpb24gYXJncy4KICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbW1lbnRSZWdFeHAsIGNvbW1lbnRSZXBsYWNlKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsIGZ1bmN0aW9uIChtYXRjaCwgZGVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgQ29tbW9uSlMgdGhpbmcgZXZlbiB3aXRob3V0IHJlcXVpcmUgY2FsbHMsIGJ1dCBzdGlsbAogICAgICAgICAgICAgICAgLy9jb3VsZCB1c2UgZXhwb3J0cywgYW5kIG1vZHVsZS4gQXZvaWQgZG9pbmcgZXhwb3J0cyBhbmQgbW9kdWxlCiAgICAgICAgICAgICAgICAvL3dvcmsgdGhvdWdoIGlmIGl0IGp1c3QgbmVlZHMgcmVxdWlyZS4KICAgICAgICAgICAgICAgIC8vUkVRVUlSRVMgdGhlIGZ1bmN0aW9uIHRvIGV4cGVjdCB0aGUgQ29tbW9uSlMgdmFyaWFibGVzIGluIHRoZQogICAgICAgICAgICAgICAgLy9vcmRlciBsaXN0ZWQgYmVsb3cuCiAgICAgICAgICAgICAgICBkZXBzID0gKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IFsncmVxdWlyZSddIDogWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10pLmNvbmNhdChkZXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9JZiBpbiBJRSA2LTggYW5kIGhpdCBhbiBhbm9ueW1vdXMgZGVmaW5lKCkgY2FsbCwgZG8gdGhlIGludGVyYWN0aXZlCiAgICAgICAgLy93b3JrLgogICAgICAgIGlmICh1c2VJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICBub2RlID0gY3VycmVudGx5QWRkaW5nU2NyaXB0IHx8IGdldEludGVyYWN0aXZlU2NyaXB0KCk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW25vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVjb250ZXh0JyldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL0Fsd2F5cyBzYXZlIG9mZiBldmFsdWF0aW5nIHRoZSBkZWYgY2FsbCB1bnRpbCB0aGUgc2NyaXB0IG9ubG9hZCBoYW5kbGVyLgogICAgICAgIC8vVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9kdWxlcyB0byBiZSBpbiBhIGZpbGUgd2l0aG91dCBwcmVtYXR1cmVseQogICAgICAgIC8vdHJhY2luZyBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvd3MgZm9yIGFub255bW91cyBtb2R1bGUgc3VwcG9ydCwKICAgICAgICAvL3doZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3Qga25vd24gdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgZXZlbnQKICAgICAgICAvL29jY3Vycy4gSWYgbm8gY29udGV4dCwgdXNlIHRoZSBnbG9iYWwgcXVldWUsIGFuZCBnZXQgaXQgcHJvY2Vzc2VkCiAgICAgICAgLy9pbiB0aGUgb25zY3JpcHQgbG9hZCBjYWxsYmFjay4KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbbmFtZV0gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZWZpbmUuYW1kID0gewogICAgICAgIGpRdWVyeTogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHRoZSB0ZXh0LiBOb3JtYWxseSBqdXN0IHVzZXMgZXZhbCwgYnV0IGNhbiBiZSBtb2RpZmllZAogICAgICogdG8gdXNlIGEgYmV0dGVyLCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjYWxsLiBPbmx5IHVzZWQgZm9yIHRyYW5zcGlsaW5nCiAgICAgKiBsb2FkZXIgcGx1Z2lucywgbm90IGZvciBwbGFpbiBKUyBtb2R1bGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIHRleHQgdG8gZXhlY3V0ZS9ldmFsdWF0ZS4KICAgICAqLwogICAgcmVxLmV4ZWMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICByZXR1cm4gZXZhbCh0ZXh0KTsKICAgIH07CgogICAgLy9TZXQgdXAgd2l0aCBjb25maWcgaW5mby4KICAgIHJlcShjZmcpOwp9KHRoaXMsICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KSkpOwoKZnVuY3Rpb24gaXNGdW5jdGlvbih4KSB7CiAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7Cn0KCmxldCBfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3MgPSBmYWxzZTsKY29uc3QgY29uZmlnID0gewogICAgUHJvbWlzZTogdW5kZWZpbmVkLAogICAgc2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdERVBSRUNBVEVEISBSeEpTIHdhcyBzZXQgdG8gdXNlIGRlcHJlY2F0ZWQgc3luY2hyb25vdXMgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IgYnkgY29kZSBhdDogXG4nICsgZXJyb3Iuc3RhY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3MpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1J4SlM6IEJhY2sgdG8gYSBiZXR0ZXIgZXJyb3IgYmVoYXZpb3IuIFRoYW5rIHlvdS4gPDMnKTsKICAgICAgICB9CiAgICAgICAgX2VuYWJsZV9zdXBlcl9ncm9zc19tb2RlX3RoYXRfd2lsbF9jYXVzZV9iYWRfdGhpbmdzID0gdmFsdWU7CiAgICB9LAogICAgZ2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcoKSB7CiAgICAgICAgcmV0dXJuIF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5nczsKICAgIH0sCn07CgpmdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZXJyKSB7CiAgICBzZXRUaW1lb3V0KCgpID0+IHsgdGhyb3cgZXJyOyB9LCAwKTsKfQoKY29uc3QgZW1wdHkgPSB7CiAgICBjbG9zZWQ6IHRydWUsCiAgICBuZXh0KHZhbHVlKSB7IH0sCiAgICBlcnJvcihlcnIpIHsKICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgfQogICAgfSwKICAgIGNvbXBsZXRlKCkgeyB9Cn07Cgpjb25zdCBpc0FycmF5ID0gKCgpID0+IEFycmF5LmlzQXJyYXkgfHwgKCh4KSA9PiB4ICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicpKSgpOwoKZnVuY3Rpb24gaXNPYmplY3QoeCkgewogICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09ICdvYmplY3QnOwp9Cgpjb25zdCBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbCA9ICgoKSA9PiB7CiAgICBmdW5jdGlvbiBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbChlcnJvcnMpIHsKICAgICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9ycyA/CiAgICAgICAgICAgIGAke2Vycm9ycy5sZW5ndGh9IGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246CiR7ZXJyb3JzLm1hcCgoZXJyLCBpKSA9PiBgJHtpICsgMX0pICR7ZXJyLnRvU3RyaW5nKCl9YCkuam9pbignXG4gICcpfWAgOiAnJzsKICAgICAgICB0aGlzLm5hbWUgPSAnVW5zdWJzY3JpcHRpb25FcnJvcic7CiAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICByZXR1cm4gVW5zdWJzY3JpcHRpb25FcnJvckltcGw7Cn0pKCk7CmNvbnN0IFVuc3Vic2NyaXB0aW9uRXJyb3IgPSBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbDsKCmNsYXNzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3Rvcih1bnN1YnNjcmliZSkgewogICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fcGFyZW50T3JQYXJlbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gbnVsbDsKICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSB1bnN1YnNjcmliZTsKICAgICAgICB9CiAgICB9CiAgICB1bnN1YnNjcmliZSgpIHsKICAgICAgICBsZXQgZXJyb3JzOwogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCB7IF9wYXJlbnRPclBhcmVudHMsIF91bnN1YnNjcmliZSwgX3N1YnNjcmlwdGlvbnMgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX3BhcmVudE9yUGFyZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG51bGw7CiAgICAgICAgaWYgKF9wYXJlbnRPclBhcmVudHMgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgX3BhcmVudE9yUGFyZW50cy5yZW1vdmUodGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKF9wYXJlbnRPclBhcmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IF9wYXJlbnRPclBhcmVudHMubGVuZ3RoOyArK2luZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBfcGFyZW50T3JQYXJlbnRzW2luZGV4XTsKICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmUodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzRnVuY3Rpb24oX3Vuc3Vic2NyaWJlKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgX3Vuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGVycm9ycyA9IGUgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yID8gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGUuZXJyb3JzKSA6IFtlXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNBcnJheShfc3Vic2NyaXB0aW9ucykpIHsKICAgICAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgICAgIGxldCBsZW4gPSBfc3Vic2NyaXB0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdWIgPSBfc3Vic2NyaXB0aW9uc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3Qoc3ViKSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVW5zdWJzY3JpcHRpb25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChmbGF0dGVuVW5zdWJzY3JpcHRpb25FcnJvcnMoZS5lcnJvcnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3Vic2NyaXB0aW9uRXJyb3IoZXJyb3JzKTsKICAgICAgICB9CiAgICB9CiAgICBhZGQodGVhcmRvd24pIHsKICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGVhcmRvd247CiAgICAgICAgaWYgKCF0ZWFyZG93bikgewogICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHR5cGVvZiB0ZWFyZG93bikgewogICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKHRlYXJkb3duKTsKICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT09IHRoaXMgfHwgc3Vic2NyaXB0aW9uLmNsb3NlZCB8fCB0eXBlb2Ygc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCEoc3Vic2NyaXB0aW9uIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLl9zdWJzY3JpcHRpb25zID0gW3RtcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdGVhcmRvd24gJyArIHRlYXJkb3duICsgJyBhZGRlZCB0byBTdWJzY3JpcHRpb24uJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGV0IHsgX3BhcmVudE9yUGFyZW50cyB9ID0gc3Vic2NyaXB0aW9uOwogICAgICAgIGlmIChfcGFyZW50T3JQYXJlbnRzID09PSBudWxsKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5fcGFyZW50T3JQYXJlbnRzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX3BhcmVudE9yUGFyZW50cyBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICBpZiAoX3BhcmVudE9yUGFyZW50cyA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJzY3JpcHRpb24uX3BhcmVudE9yUGFyZW50cyA9IFtfcGFyZW50T3JQYXJlbnRzLCB0aGlzXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX3BhcmVudE9yUGFyZW50cy5pbmRleE9mKHRoaXMpID09PSAtMSkgewogICAgICAgICAgICBfcGFyZW50T3JQYXJlbnRzLnB1c2godGhpcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uczsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW3N1YnNjcmlwdGlvbl07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgIH0KICAgIHJlbW92ZShzdWJzY3JpcHRpb24pIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uczsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykgewogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25JbmRleCA9IHN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uSW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShzdWJzY3JpcHRpb25JbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KU3Vic2NyaXB0aW9uLkVNUFRZID0gKGZ1bmN0aW9uIChlbXB0eSkgewogICAgZW1wdHkuY2xvc2VkID0gdHJ1ZTsKICAgIHJldHVybiBlbXB0eTsKfShuZXcgU3Vic2NyaXB0aW9uKCkpKTsKZnVuY3Rpb24gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGVycm9ycykgewogICAgcmV0dXJuIGVycm9ycy5yZWR1Y2UoKGVycnMsIGVycikgPT4gZXJycy5jb25jYXQoKGVyciBpbnN0YW5jZW9mIFVuc3Vic2NyaXB0aW9uRXJyb3IpID8gZXJyLmVycm9ycyA6IGVyciksIFtdKTsKfQoKY29uc3QgcnhTdWJzY3JpYmVyID0gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicKICAgID8gU3ltYm9sKCdyeFN1YnNjcmliZXInKQogICAgOiAnQEByeFN1YnNjcmliZXJfJyArIE1hdGgucmFuZG9tKCkpKCk7CgpjbGFzcyBTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuc3luY0Vycm9yVmFsdWUgPSBudWxsOwogICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3duID0gZmFsc2U7CiAgICAgICAgdGhpcy5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZW1wdHk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbk9yTmV4dCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBlbXB0eTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25Pck5leHQgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGRlc3RpbmF0aW9uT3JOZXh0LnN5bmNFcnJvclRocm93YWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uT3JOZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbk9yTmV4dC5hZGQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3dhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBbcnhTdWJzY3JpYmVyXSgpIHsgcmV0dXJuIHRoaXM7IH0KICAgIHN0YXRpYyBjcmVhdGUobmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBTdWJzY3JpYmVyKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgc3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjsKICAgIH0KICAgIG5leHQodmFsdWUpIHsKICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIHRoaXMuX25leHQodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICBzdXBlci51bnN1YnNjcmliZSgpOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgIH0KICAgIF91bnN1YnNjcmliZUFuZFJlY3ljbGUoKSB7CiAgICAgICAgY29uc3QgeyBfcGFyZW50T3JQYXJlbnRzIH0gPSB0aGlzOwogICAgICAgIHRoaXMuX3BhcmVudE9yUGFyZW50cyA9IG51bGw7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9wYXJlbnRPclBhcmVudHMgPSBfcGFyZW50T3JQYXJlbnRzOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQp9CmNsYXNzIFNhZmVTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihfcGFyZW50U3Vic2NyaWJlciwgb2JzZXJ2ZXJPck5leHQsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGFyZW50U3Vic2NyaWJlciA9IF9wYXJlbnRTdWJzY3JpYmVyOwogICAgICAgIGxldCBuZXh0OwogICAgICAgIGxldCBjb250ZXh0ID0gdGhpczsKICAgICAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkpIHsKICAgICAgICAgICAgbmV4dCA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkgewogICAgICAgICAgICBuZXh0ID0gb2JzZXJ2ZXJPck5leHQubmV4dDsKICAgICAgICAgICAgZXJyb3IgPSBvYnNlcnZlck9yTmV4dC5lcnJvcjsKICAgICAgICAgICAgY29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZTsKICAgICAgICAgICAgaWYgKG9ic2VydmVyT3JOZXh0ICE9PSBlbXB0eSkgewogICAgICAgICAgICAgICAgY29udGV4dCA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpOwogICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dC51bnN1YnNjcmliZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZChjb250ZXh0LnVuc3Vic2NyaWJlLmJpbmQoY29udGV4dCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC51bnN1YnNjcmliZSA9IHRoaXMudW5zdWJzY3JpYmUuYmluZCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgICAgICB0aGlzLl9uZXh0ID0gbmV4dDsKICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yOwogICAgICAgIHRoaXMuX2NvbXBsZXRlID0gY29tcGxldGU7CiAgICB9CiAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCAmJiB0aGlzLl9uZXh0KSB7CiAgICAgICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgICAgIGlmICghY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgfHwgIV9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIodGhpcy5fbmV4dCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnRTdWJzY3JpYmVyLCB0aGlzLl9uZXh0LCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgY29uc3QgeyB1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nIH0gPSBjb25maWc7CiAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcikgewogICAgICAgICAgICAgICAgaWYgKCF1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nIHx8ICFfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JVbnN1Yih0aGlzLl9lcnJvciwgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgdGhpcy5fZXJyb3IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JUaHJvd2FibGUpIHsKICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIGlmICh1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgICAgIF9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclZhbHVlID0gZXJyOwogICAgICAgICAgICAgICAgICAgIF9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkQ29tcGxldGUgPSAoKSA9PiB0aGlzLl9jb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpOwogICAgICAgICAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3RyeU9yVW5zdWIod3JhcHBlZENvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgd3JhcHBlZENvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBfX3RyeU9yVW5zdWIoZm4sIHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm4uY2FsbCh0aGlzLl9jb250ZXh0LCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgX190cnlPclNldEVycm9yKHBhcmVudCwgZm4sIHZhbHVlKSB7CiAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjYWxsJyk7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGZuLmNhbGwodGhpcy5fY29udGV4dCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclZhbHVlID0gZXJyOwogICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7CiAgICAgICAgdGhpcy5fcGFyZW50U3Vic2NyaWJlciA9IG51bGw7CiAgICAgICAgX3BhcmVudFN1YnNjcmliZXIudW5zdWJzY3JpYmUoKTsKICAgIH0KfQoKZnVuY3Rpb24gY2FuUmVwb3J0RXJyb3Iob2JzZXJ2ZXIpIHsKICAgIHdoaWxlIChvYnNlcnZlcikgewogICAgICAgIGNvbnN0IHsgY2xvc2VkLCBkZXN0aW5hdGlvbiwgaXNTdG9wcGVkIH0gPSBvYnNlcnZlcjsKICAgICAgICBpZiAoY2xvc2VkIHx8IGlzU3RvcHBlZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICBvYnNlcnZlciA9IGRlc3RpbmF0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiB0b1N1YnNjcmliZXIobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgaWYgKG5leHRPck9ic2VydmVyKSB7CiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyIGluc3RhbmNlb2YgU3Vic2NyaWJlcikgewogICAgICAgICAgICByZXR1cm4gbmV4dE9yT2JzZXJ2ZXI7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0T3JPYnNlcnZlcltyeFN1YnNjcmliZXJdKSB7CiAgICAgICAgICAgIHJldHVybiBuZXh0T3JPYnNlcnZlcltyeFN1YnNjcmliZXJdKCk7CiAgICAgICAgfQogICAgfQogICAgaWYgKCFuZXh0T3JPYnNlcnZlciAmJiAhZXJyb3IgJiYgIWNvbXBsZXRlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpYmVyKGVtcHR5KTsKICAgIH0KICAgIHJldHVybiBuZXcgU3Vic2NyaWJlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKTsKfQoKY29uc3Qgb2JzZXJ2YWJsZSA9ICgoKSA9PiB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5vYnNlcnZhYmxlIHx8ICdAQG9ic2VydmFibGUnKSgpOwoKZnVuY3Rpb24gaWRlbnRpdHkoeCkgewogICAgcmV0dXJuIHg7Cn0KCmZ1bmN0aW9uIHBpcGVGcm9tQXJyYXkoZm5zKSB7CiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgIH0KICAgIGlmIChmbnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgcmV0dXJuIGZuc1swXTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkgewogICAgICAgIHJldHVybiBmbnMucmVkdWNlKChwcmV2LCBmbikgPT4gZm4ocHJldiksIGlucHV0KTsKICAgIH07Cn0KCmNsYXNzIE9ic2VydmFibGUgewogICAgY29uc3RydWN0b3Ioc3Vic2NyaWJlKSB7CiAgICAgICAgdGhpcy5faXNTY2FsYXIgPSBmYWxzZTsKICAgICAgICBpZiAoc3Vic2NyaWJlKSB7CiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSA9IHN1YnNjcmliZTsKICAgICAgICB9CiAgICB9CiAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIG9ic2VydmFibGUub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTsKICAgIH0KICAgIHN1YnNjcmliZShvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3QgeyBvcGVyYXRvciB9ID0gdGhpczsKICAgICAgICBjb25zdCBzaW5rID0gdG9TdWJzY3JpYmVyKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpOwogICAgICAgIGlmIChvcGVyYXRvcikgewogICAgICAgICAgICBzaW5rLmFkZChvcGVyYXRvci5jYWxsKHNpbmssIHRoaXMuc291cmNlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzaW5rLmFkZCh0aGlzLnNvdXJjZSB8fCAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgIXNpbmsuc3luY0Vycm9yVGhyb3dhYmxlKSA/CiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUoc2luaykgOgogICAgICAgICAgICAgICAgdGhpcy5fdHJ5U3Vic2NyaWJlKHNpbmspKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbmZpZy51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICAgICAgICAgIGlmIChzaW5rLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChzaW5rLnN5bmNFcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgIHRocm93IHNpbmsuc3luY0Vycm9yVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNpbms7CiAgICB9CiAgICBfdHJ5U3Vic2NyaWJlKHNpbmspIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKHNpbmspOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JUaHJvd24gPSB0cnVlOwogICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JWYWx1ZSA9IGVycjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2FuUmVwb3J0RXJyb3Ioc2luaykpIHsKICAgICAgICAgICAgICAgIHNpbmsuZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yRWFjaChuZXh0LCBwcm9taXNlQ3RvcikgewogICAgICAgIHByb21pc2VDdG9yID0gZ2V0UHJvbWlzZUN0b3IocHJvbWlzZUN0b3IpOwogICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9uOwogICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSgodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHJlamVjdCwgcmVzb2x2ZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCB7IHNvdXJjZSB9ID0gdGhpczsKICAgICAgICByZXR1cm4gc291cmNlICYmIHNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICBbb2JzZXJ2YWJsZV0oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBwaXBlKC4uLm9wZXJhdGlvbnMpIHsKICAgICAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwaXBlRnJvbUFycmF5KG9wZXJhdGlvbnMpKHRoaXMpOwogICAgfQogICAgdG9Qcm9taXNlKHByb21pc2VDdG9yKSB7CiAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7CiAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGxldCB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoKHgpID0+IHZhbHVlID0geCwgKGVycikgPT4gcmVqZWN0KGVyciksICgpID0+IHJlc29sdmUodmFsdWUpKTsKICAgICAgICB9KTsKICAgIH0KfQpPYnNlcnZhYmxlLmNyZWF0ZSA9IChzdWJzY3JpYmUpID0+IHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmUpOwp9OwpmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogICAgaWYgKCFwcm9taXNlQ3RvcikgewogICAgICAgIHByb21pc2VDdG9yID0gIFByb21pc2U7CiAgICB9CiAgICBpZiAoIXByb21pc2VDdG9yKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBQcm9taXNlIGltcGwgZm91bmQnKTsKICAgIH0KICAgIHJldHVybiBwcm9taXNlQ3RvcjsKfQoKY29uc3QgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsID0gKCgpID0+IHsKICAgIGZ1bmN0aW9uIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbCgpIHsKICAgICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMubWVzc2FnZSA9ICdvYmplY3QgdW5zdWJzY3JpYmVkJzsKICAgICAgICB0aGlzLm5hbWUgPSAnT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3InOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgIHJldHVybiBPYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGw7Cn0pKCk7CmNvbnN0IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yID0gT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsOwoKY2xhc3MgU3ViamVjdFN1YnNjcmlwdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzdWJqZWN0LCBzdWJzY3JpYmVyKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgICAgIHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7CiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0OwogICAgICAgIGNvbnN0IG9ic2VydmVycyA9IHN1YmplY3Qub2JzZXJ2ZXJzOwogICAgICAgIHRoaXMuc3ViamVjdCA9IG51bGw7CiAgICAgICAgaWYgKCFvYnNlcnZlcnMgfHwgb2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCB8fCBzdWJqZWN0LmlzU3RvcHBlZCB8fCBzdWJqZWN0LmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1YnNjcmliZXJJbmRleCA9IG9ic2VydmVycy5pbmRleE9mKHRoaXMuc3Vic2NyaWJlcik7CiAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgb2JzZXJ2ZXJzLnNwbGljZShzdWJzY3JpYmVySW5kZXgsIDEpOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgU3ViamVjdFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgIH0KfQpjbGFzcyBTdWJqZWN0IGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gW107CiAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICB0aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgIH0KICAgIFtyeFN1YnNjcmliZXJdKCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmliZXIodGhpcyk7CiAgICB9CiAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpOwogICAgICAgIHN1YmplY3Qub3BlcmF0b3IgPSBvcGVyYXRvcjsKICAgICAgICByZXR1cm4gc3ViamVjdDsKICAgIH0KICAgIG5leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmVycy5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgY29weVtpXS5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVycm9yKGVycikgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgdGhpcy50aHJvd25FcnJvciA9IGVycjsKICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2ZXJzLmxlbmd0aDsKICAgICAgICBjb25zdCBjb3B5ID0gb2JzZXJ2ZXJzLnNsaWNlKCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBjb3B5W2ldLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7CiAgICB9CiAgICBjb21wbGV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICBjb25zdCB7IG9ic2VydmVycyB9ID0gdGhpczsKICAgICAgICBjb25zdCBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvcHlbaV0uY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsOwogICAgfQogICAgX3RyeVN1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLl90cnlTdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfQogICAgfQogICAgX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmhhc0Vycm9yKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhpcy50aHJvd25FcnJvcik7CiAgICAgICAgICAgIHJldHVybiBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbih0aGlzLCBzdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICB9CiAgICBhc09ic2VydmFibGUoKSB7CiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgb2JzZXJ2YWJsZS5zb3VyY2UgPSB0aGlzOwogICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgfQp9ClN1YmplY3QuY3JlYXRlID0gKGRlc3RpbmF0aW9uLCBzb3VyY2UpID0+IHsKICAgIHJldHVybiBuZXcgQW5vbnltb3VzU3ViamVjdChkZXN0aW5hdGlvbiwgc291cmNlKTsKfTsKY2xhc3MgQW5vbnltb3VzU3ViamVjdCBleHRlbmRzIFN1YmplY3QgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNvdXJjZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXM7CiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLm5leHQpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgZXJyb3IoZXJyKSB7CiAgICAgICAgY29uc3QgeyBkZXN0aW5hdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXM7CiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRlc3RpbmF0aW9uLmNvbXBsZXRlKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCB7IHNvdXJjZSB9ID0gdGhpczsKICAgICAgICBpZiAoc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gcmVmQ291bnQoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gcmVmQ291bnRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgUmVmQ291bnRPcGVyYXRvcihzb3VyY2UpKTsKICAgIH07Cn0KY2xhc3MgUmVmQ291bnRPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihjb25uZWN0YWJsZSkgewogICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgY29uc3QgeyBjb25uZWN0YWJsZSB9ID0gdGhpczsKICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQrKzsKICAgICAgICBjb25zdCByZWZDb3VudGVyID0gbmV3IFJlZkNvdW50U3Vic2NyaWJlcihzdWJzY3JpYmVyLCBjb25uZWN0YWJsZSk7CiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc291cmNlLnN1YnNjcmliZShyZWZDb3VudGVyKTsKICAgICAgICBpZiAoIXJlZkNvdW50ZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHJlZkNvdW50ZXIuY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLmNvbm5lY3QoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgIH0KfQpjbGFzcyBSZWZDb3VudFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7CiAgICB9CiAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgY29uc3QgeyBjb25uZWN0YWJsZSB9ID0gdGhpczsKICAgICAgICBpZiAoIWNvbm5lY3RhYmxlKSB7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7CiAgICAgICAgY29uc3QgcmVmQ291bnQgPSBjb25uZWN0YWJsZS5fcmVmQ291bnQ7CiAgICAgICAgaWYgKHJlZkNvdW50IDw9IDApIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQgPSByZWZDb3VudCAtIDE7CiAgICAgICAgaWYgKHJlZkNvdW50ID4gMSkgewogICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgY29ubmVjdGlvbiB9ID0gdGhpczsKICAgICAgICBjb25zdCBzaGFyZWRDb25uZWN0aW9uID0gY29ubmVjdGFibGUuX2Nvbm5lY3Rpb247CiAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICBpZiAoc2hhcmVkQ29ubmVjdGlvbiAmJiAoIWNvbm5lY3Rpb24gfHwgc2hhcmVkQ29ubmVjdGlvbiA9PT0gY29ubmVjdGlvbikpIHsKICAgICAgICAgICAgc2hhcmVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgQ29ubmVjdGFibGVPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHN1YmplY3RGYWN0b3J5KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB0aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgdGhpcy5fcmVmQ291bnQgPSAwOwogICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSBmYWxzZTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIHJldHVybiB0aGlzLmdldFN1YmplY3QoKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICB9CiAgICBnZXRTdWJqZWN0KCkgewogICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0OwogICAgICAgIGlmICghc3ViamVjdCB8fCBzdWJqZWN0LmlzU3RvcHBlZCkgewogICAgICAgICAgICB0aGlzLl9zdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fc3ViamVjdDsKICAgIH0KICAgIGNvbm5lY3QoKSB7CiAgICAgICAgbGV0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uOwogICAgICAgIGlmICghY29ubmVjdGlvbikgewogICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgIGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBjb25uZWN0aW9uLmFkZCh0aGlzLnNvdXJjZQogICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXcgQ29ubmVjdGFibGVTdWJzY3JpYmVyKHRoaXMuZ2V0U3ViamVjdCgpLCB0aGlzKSkpOwogICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgIH0KICAgIHJlZkNvdW50KCkgewogICAgICAgIHJldHVybiByZWZDb3VudCgpKHRoaXMpOwogICAgfQp9CmNvbnN0IGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgPSAoKCkgPT4gewogICAgY29uc3QgY29ubmVjdGFibGVQcm90byA9IENvbm5lY3RhYmxlT2JzZXJ2YWJsZS5wcm90b3R5cGU7CiAgICByZXR1cm4gewogICAgICAgIG9wZXJhdG9yOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgX3JlZkNvdW50OiB7IHZhbHVlOiAwLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9zdWJqZWN0OiB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9jb25uZWN0aW9uOiB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIF9zdWJzY3JpYmU6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uX3N1YnNjcmliZSB9LAogICAgICAgIF9pc0NvbXBsZXRlOiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLl9pc0NvbXBsZXRlLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgIGdldFN1YmplY3Q6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uZ2V0U3ViamVjdCB9LAogICAgICAgIGNvbm5lY3Q6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uY29ubmVjdCB9LAogICAgICAgIHJlZkNvdW50OiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLnJlZkNvdW50IH0KICAgIH07Cn0pKCk7CmNsYXNzIENvbm5lY3RhYmxlU3Vic2NyaWJlciBleHRlbmRzIFN1YmplY3RTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7CiAgICB9CiAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTsKICAgICAgICBzdXBlci5fZXJyb3IoZXJyKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmNvbm5lY3RhYmxlLl9pc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgICAgIHN1cGVyLl9jb21wbGV0ZSgpOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gdGhpcy5jb25uZWN0YWJsZTsKICAgICAgICBpZiAoY29ubmVjdGFibGUpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5fY29ubmVjdGlvbjsKICAgICAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gMDsKICAgICAgICAgICAgY29ubmVjdGFibGUuX3N1YmplY3QgPSBudWxsOwogICAgICAgICAgICBjb25uZWN0YWJsZS5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGdyb3VwQnkoa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IEdyb3VwQnlPcGVyYXRvcihrZXlTZWxlY3RvciwgZWxlbWVudFNlbGVjdG9yLCBkdXJhdGlvblNlbGVjdG9yLCBzdWJqZWN0U2VsZWN0b3IpKTsKfQpjbGFzcyBHcm91cEJ5T3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yID0gZWxlbWVudFNlbGVjdG9yOwogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgdGhpcy5zdWJqZWN0U2VsZWN0b3IgPSBzdWJqZWN0U2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBHcm91cEJ5U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmtleVNlbGVjdG9yLCB0aGlzLmVsZW1lbnRTZWxlY3RvciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yLCB0aGlzLnN1YmplY3RTZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIEdyb3VwQnlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwga2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjsKICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RvciA9IGVsZW1lbnRTZWxlY3RvcjsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgICAgIHRoaXMuc3ViamVjdFNlbGVjdG9yID0gc3ViamVjdFNlbGVjdG9yOwogICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDsKICAgICAgICB0aGlzLmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUgPSBmYWxzZTsKICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IGtleTsKICAgICAgICB0cnkgewogICAgICAgICAgICBrZXkgPSB0aGlzLmtleVNlbGVjdG9yKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZ3JvdXAodmFsdWUsIGtleSk7CiAgICB9CiAgICBfZ3JvdXAodmFsdWUsIGtleSkgewogICAgICAgIGxldCBncm91cHMgPSB0aGlzLmdyb3VwczsKICAgICAgICBpZiAoIWdyb3VwcykgewogICAgICAgICAgICBncm91cHMgPSB0aGlzLmdyb3VwcyA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgbGV0IGdyb3VwID0gZ3JvdXBzLmdldChrZXkpOwogICAgICAgIGxldCBlbGVtZW50OwogICAgICAgIGlmICh0aGlzLmVsZW1lbnRTZWxlY3RvcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudFNlbGVjdG9yKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFncm91cCkgewogICAgICAgICAgICBncm91cCA9ICh0aGlzLnN1YmplY3RTZWxlY3RvciA/IHRoaXMuc3ViamVjdFNlbGVjdG9yKCkgOiBuZXcgU3ViamVjdCgpKTsKICAgICAgICAgICAgZ3JvdXBzLnNldChrZXksIGdyb3VwKTsKICAgICAgICAgICAgY29uc3QgZ3JvdXBlZE9ic2VydmFibGUgPSBuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCwgdGhpcyk7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChncm91cGVkT2JzZXJ2YWJsZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmR1cmF0aW9uU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbjsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uU2VsZWN0b3IobmV3IEdyb3VwZWRPYnNlcnZhYmxlKGtleSwgZ3JvdXApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5hZGQoZHVyYXRpb24uc3Vic2NyaWJlKG5ldyBHcm91cER1cmF0aW9uU3Vic2NyaWJlcihrZXksIGdyb3VwLCB0aGlzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZ3JvdXAuY2xvc2VkKSB7CiAgICAgICAgICAgIGdyb3VwLm5leHQoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzOwogICAgICAgIGlmIChncm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgIGdyb3VwLmVycm9yKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzOwogICAgICAgIGlmIChncm91cHMpIHsKICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgIGdyb3VwLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgcmVtb3ZlR3JvdXAoa2V5KSB7CiAgICAgICAgdGhpcy5ncm91cHMuZGVsZXRlKGtleSk7CiAgICB9CiAgICB1bnN1YnNjcmliZSgpIHsKICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRoaXMuYXR0ZW1wdGVkVG9VbnN1YnNjcmliZSA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICBzdXBlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmNsYXNzIEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihrZXksIGdyb3VwLCBwYXJlbnQpIHsKICAgICAgICBzdXBlcihncm91cCk7CiAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwogICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICB9CiAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgY29uc3QgeyBwYXJlbnQsIGtleSB9ID0gdGhpczsKICAgICAgICB0aGlzLmtleSA9IHRoaXMucGFyZW50ID0gbnVsbDsKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVHcm91cChrZXkpOwogICAgICAgIH0KICAgIH0KfQpjbGFzcyBHcm91cGVkT2JzZXJ2YWJsZSBleHRlbmRzIE9ic2VydmFibGUgewogICAgY29uc3RydWN0b3Ioa2V5LCBncm91cFN1YmplY3QsIHJlZkNvdW50U3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmtleSA9IGtleTsKICAgICAgICB0aGlzLmdyb3VwU3ViamVjdCA9IGdyb3VwU3ViamVjdDsKICAgICAgICB0aGlzLnJlZkNvdW50U3Vic2NyaXB0aW9uID0gcmVmQ291bnRTdWJzY3JpcHRpb247CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgY29uc3QgeyByZWZDb3VudFN1YnNjcmlwdGlvbiwgZ3JvdXBTdWJqZWN0IH0gPSB0aGlzOwogICAgICAgIGlmIChyZWZDb3VudFN1YnNjcmlwdGlvbiAmJiAhcmVmQ291bnRTdWJzY3JpcHRpb24uY2xvc2VkKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQobmV3IElubmVyUmVmQ291bnRTdWJzY3JpcHRpb24ocmVmQ291bnRTdWJzY3JpcHRpb24pKTsKICAgICAgICB9CiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChncm91cFN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpKTsKICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgfQp9CmNsYXNzIElubmVyUmVmQ291bnRTdWJzY3JpcHRpb24gZXh0ZW5kcyBTdWJzY3JpcHRpb24gewogICAgY29uc3RydWN0b3IocGFyZW50KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICBwYXJlbnQuY291bnQrKzsKICAgIH0KICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50OwogICAgICAgIGlmICghcGFyZW50LmNsb3NlZCAmJiAhdGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgc3VwZXIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgcGFyZW50LmNvdW50IC09IDE7CiAgICAgICAgICAgIGlmIChwYXJlbnQuY291bnQgPT09IDAgJiYgcGFyZW50LmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgICAgIHBhcmVudC51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpjbGFzcyBCZWhhdmlvclN1YmplY3QgZXh0ZW5kcyBTdWJqZWN0IHsKICAgIGNvbnN0cnVjdG9yKF92YWx1ZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICB9CiAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1cGVyLl9zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodGhpcy5fdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgfQogICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzRXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgdGhpcy50aHJvd25FcnJvcjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIHN1cGVyLm5leHQodGhpcy5fdmFsdWUgPSB2YWx1ZSk7CiAgICB9Cn0KCmNsYXNzIEFjdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcigpOwogICAgfQogICAgc2NoZWR1bGUoc3RhdGUsIGRlbGF5ID0gMCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfQp9CgpjbGFzcyBBc3luY0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcihzY2hlZHVsZXIsIHdvcmspOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICB9CiAgICBzY2hlZHVsZShzdGF0ZSwgZGVsYXkgPSAwKSB7CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmlkOwogICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTsKICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CiAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQgfHwgdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIHJldHVybiBzZXRJbnRlcnZhbChzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHRoaXMpLCBkZWxheSk7CiAgICB9CiAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoZGVsYXkgIT09IG51bGwgJiYgdGhpcy5kZWxheSA9PT0gZGVsYXkgJiYgdGhpcy5wZW5kaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpOwogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBleGVjdXRlKHN0YXRlLCBkZWxheSkgewogICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkpOwogICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMucGVuZGluZyA9PT0gZmFsc2UgJiYgdGhpcy5pZCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLnJlY3ljbGVBc3luY0lkKHRoaXMuc2NoZWR1bGVyLCB0aGlzLmlkLCBudWxsKTsKICAgICAgICB9CiAgICB9CiAgICBfZXhlY3V0ZShzdGF0ZSwgZGVsYXkpIHsKICAgICAgICBsZXQgZXJyb3JlZCA9IGZhbHNlOwogICAgICAgIGxldCBlcnJvclZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMud29yayhzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGVycm9yZWQgPSB0cnVlOwogICAgICAgICAgICBlcnJvclZhbHVlID0gISFlICYmIGUgfHwgbmV3IEVycm9yKGUpOwogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3JlZCkgewogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHJldHVybiBlcnJvclZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVyID0gdGhpcy5zY2hlZHVsZXI7CiAgICAgICAgY29uc3QgYWN0aW9ucyA9IHNjaGVkdWxlci5hY3Rpb25zOwogICAgICAgIGNvbnN0IGluZGV4ID0gYWN0aW9ucy5pbmRleE9mKHRoaXMpOwogICAgICAgIHRoaXMud29yayA9IG51bGw7CiAgICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7CiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBudWxsOwogICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIH0KICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZWxheSA9IG51bGw7CiAgICB9Cn0KCmNsYXNzIFF1ZXVlQWN0aW9uIGV4dGVuZHMgQXN5bmNBY3Rpb24gewogICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgc3VwZXIoc2NoZWR1bGVyLCB3b3JrKTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLndvcmsgPSB3b3JrOwogICAgfQogICAgc2NoZWR1bGUoc3RhdGUsIGRlbGF5ID0gMCkgewogICAgICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICBleGVjdXRlKHN0YXRlLCBkZWxheSkgewogICAgICAgIHJldHVybiAoZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkKSA/CiAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUoc3RhdGUsIGRlbGF5KSA6CiAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGUoc3RhdGUsIGRlbGF5KTsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIGlmICgoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB8fCAoZGVsYXkgPT09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2hlZHVsZXIuZmx1c2godGhpcyk7CiAgICB9Cn0KCmNsYXNzIFNjaGVkdWxlciB7CiAgICBjb25zdHJ1Y3RvcihTY2hlZHVsZXJBY3Rpb24sIG5vdyA9IFNjaGVkdWxlci5ub3cpIHsKICAgICAgICB0aGlzLlNjaGVkdWxlckFjdGlvbiA9IFNjaGVkdWxlckFjdGlvbjsKICAgICAgICB0aGlzLm5vdyA9IG5vdzsKICAgIH0KICAgIHNjaGVkdWxlKHdvcmssIGRlbGF5ID0gMCwgc3RhdGUpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuU2NoZWR1bGVyQWN0aW9uKHRoaXMsIHdvcmspLnNjaGVkdWxlKHN0YXRlLCBkZWxheSk7CiAgICB9Cn0KU2NoZWR1bGVyLm5vdyA9ICgpID0+IERhdGUubm93KCk7CgpjbGFzcyBBc3luY1NjaGVkdWxlciBleHRlbmRzIFNjaGVkdWxlciB7CiAgICBjb25zdHJ1Y3RvcihTY2hlZHVsZXJBY3Rpb24sIG5vdyA9IFNjaGVkdWxlci5ub3cpIHsKICAgICAgICBzdXBlcihTY2hlZHVsZXJBY3Rpb24sICgpID0+IHsKICAgICAgICAgICAgaWYgKEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICYmIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICE9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUubm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm93KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmFjdGlvbnMgPSBbXTsKICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwogICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgfQogICAgc2NoZWR1bGUod29yaywgZGVsYXkgPSAwLCBzdGF0ZSkgewogICAgICAgIGlmIChBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAmJiBBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAhPT0gdGhpcykgewogICAgICAgICAgICByZXR1cm4gQXN5bmNTY2hlZHVsZXIuZGVsZWdhdGUuc2NoZWR1bGUod29yaywgZGVsYXksIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5zY2hlZHVsZSh3b3JrLCBkZWxheSwgc3RhdGUpOwogICAgICAgIH0KICAgIH0KICAgIGZsdXNoKGFjdGlvbikgewogICAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpczsKICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IGVycm9yOwogICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpOwogICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHdoaWxlIChhY3Rpb24gPSBhY3Rpb25zLnNoaWZ0KCkpIHsKICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgIH0KfQoKY2xhc3MgUXVldWVTY2hlZHVsZXIgZXh0ZW5kcyBBc3luY1NjaGVkdWxlciB7Cn0KCmNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlU2NoZWR1bGVyKFF1ZXVlQWN0aW9uKTsKCmNvbnN0IEVNUFRZID0gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpOwpmdW5jdGlvbiBlbXB0eSQxKHNjaGVkdWxlcikgewogICAgcmV0dXJuIHNjaGVkdWxlciA/IGVtcHR5U2NoZWR1bGVkKHNjaGVkdWxlcikgOiBFTVBUWTsKfQpmdW5jdGlvbiBlbXB0eVNjaGVkdWxlZChzY2hlZHVsZXIpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpKTsKfQoKZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc2NoZWR1bGUgPT09ICdmdW5jdGlvbic7Cn0KCmNvbnN0IHN1YnNjcmliZVRvQXJyYXkgPSAoYXJyYXkpID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuICYmICFzdWJzY3JpYmVyLmNsb3NlZDsgaSsrKSB7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGFycmF5W2ldKTsKICAgIH0KICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKfTsKCmZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gewogICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoaSA9PT0gaW5wdXQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2krK10pOwogICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHRoaXMuc2NoZWR1bGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHN1YjsKICAgIH0pOwp9CgpmdW5jdGlvbiBmcm9tQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG9BcnJheShpbnB1dCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9Cn0KCmZ1bmN0aW9uIG9mKC4uLmFyZ3MpIHsKICAgIGxldCBzY2hlZHVsZXIgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgIGFyZ3MucG9wKCk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoYXJncywgc2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBmcm9tQXJyYXkoYXJncyk7CiAgICB9Cn0KCmZ1bmN0aW9uIHRocm93RXJyb3IoZXJyb3IsIHNjaGVkdWxlcikgewogICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzdWJzY3JpYmVyLmVycm9yKGVycm9yKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiBzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gsIDAsIHsgZXJyb3IsIHN1YnNjcmliZXIgfSkpOwogICAgfQp9CmZ1bmN0aW9uIGRpc3BhdGNoKHsgZXJyb3IsIHN1YnNjcmliZXIgfSkgewogICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7Cn0KCnZhciBOb3RpZmljYXRpb25LaW5kOwooZnVuY3Rpb24gKE5vdGlmaWNhdGlvbktpbmQpIHsKICAgIE5vdGlmaWNhdGlvbktpbmRbIk5FWFQiXSA9ICJOIjsKICAgIE5vdGlmaWNhdGlvbktpbmRbIkVSUk9SIl0gPSAiRSI7CiAgICBOb3RpZmljYXRpb25LaW5kWyJDT01QTEVURSJdID0gIkMiOwp9KShOb3RpZmljYXRpb25LaW5kIHx8IChOb3RpZmljYXRpb25LaW5kID0ge30pKTsKY2xhc3MgTm90aWZpY2F0aW9uIHsKICAgIGNvbnN0cnVjdG9yKGtpbmQsIHZhbHVlLCBlcnJvcikgewogICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0ga2luZCA9PT0gJ04nOwogICAgfQogICAgb2JzZXJ2ZShvYnNlcnZlcikgewogICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7CiAgICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLm5leHQgJiYgb2JzZXJ2ZXIubmV4dCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IgJiYgb2JzZXJ2ZXIuZXJyb3IodGhpcy5lcnJvcik7CiAgICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlICYmIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgZG8obmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgY29uc3Qga2luZCA9IHRoaXMua2luZDsKICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCAmJiBuZXh0KHRoaXMudmFsdWUpOwogICAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciAmJiBlcnJvcih0aGlzLmVycm9yKTsKICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxldGUgJiYgY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBhY2NlcHQobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciAmJiB0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIubmV4dCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vYnNlcnZlKG5leHRPck9ic2VydmVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpOwogICAgICAgIH0KICAgIH0KICAgIHRvT2JzZXJ2YWJsZSgpIHsKICAgICAgICBjb25zdCBraW5kID0gdGhpcy5raW5kOwogICAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnZhbHVlKTsKICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcih0aGlzLmVycm9yKTsKICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHkkMSgpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgbm90aWZpY2F0aW9uIGtpbmQgdmFsdWUnKTsKICAgIH0KICAgIHN0YXRpYyBjcmVhdGVOZXh0KHZhbHVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24oJ04nLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOb3RpZmljYXRpb24udW5kZWZpbmVkVmFsdWVOb3RpZmljYXRpb247CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlRXJyb3IoZXJyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb24oJ0UnLCB1bmRlZmluZWQsIGVycik7CiAgICB9CiAgICBzdGF0aWMgY3JlYXRlQ29tcGxldGUoKSB7CiAgICAgICAgcmV0dXJuIE5vdGlmaWNhdGlvbi5jb21wbGV0ZU5vdGlmaWNhdGlvbjsKICAgIH0KfQpOb3RpZmljYXRpb24uY29tcGxldGVOb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKCdDJyk7Ck5vdGlmaWNhdGlvbi51bmRlZmluZWRWYWx1ZU5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oJ04nLCB1bmRlZmluZWQpOwoKZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gb2JzZXJ2ZU9uT3BlcmF0b3JGdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IE9ic2VydmVPbk9wZXJhdG9yKHNjaGVkdWxlciwgZGVsYXkpKTsKICAgIH07Cn0KY2xhc3MgT2JzZXJ2ZU9uT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCBkZWxheSA9IDApIHsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLmRlbGF5ID0gZGVsYXk7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBPYnNlcnZlT25TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuc2NoZWR1bGVyLCB0aGlzLmRlbGF5KSk7CiAgICB9Cn0KY2xhc3MgT2JzZXJ2ZU9uU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgIH0KICAgIHN0YXRpYyBkaXNwYXRjaChhcmcpIHsKICAgICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24gfSA9IGFyZzsKICAgICAgICBub3RpZmljYXRpb24ub2JzZXJ2ZShkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgc2NoZWR1bGVNZXNzYWdlKG5vdGlmaWNhdGlvbikgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQodGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoT2JzZXJ2ZU9uU3Vic2NyaWJlci5kaXNwYXRjaCwgdGhpcy5kZWxheSwgbmV3IE9ic2VydmVPbk1lc3NhZ2Uobm90aWZpY2F0aW9uLCB0aGlzLmRlc3RpbmF0aW9uKSkpOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIHRoaXMuc2NoZWR1bGVNZXNzYWdlKE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5zY2hlZHVsZU1lc3NhZ2UoTm90aWZpY2F0aW9uLmNyZWF0ZUNvbXBsZXRlKCkpOwogICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgIH0KfQpjbGFzcyBPYnNlcnZlT25NZXNzYWdlIHsKICAgIGNvbnN0cnVjdG9yKG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24pIHsKICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbiA9IG5vdGlmaWNhdGlvbjsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CiAgICB9Cn0KCmNsYXNzIFJlcGxheVN1YmplY3QgZXh0ZW5kcyBTdWJqZWN0IHsKICAgIGNvbnN0cnVjdG9yKGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHNjaGVkdWxlcikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107CiAgICAgICAgdGhpcy5faW5maW5pdGVUaW1lV2luZG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemUgPCAxID8gMSA6IGJ1ZmZlclNpemU7CiAgICAgICAgdGhpcy5fd2luZG93VGltZSA9IHdpbmRvd1RpbWUgPCAxID8gMSA6IHdpbmRvd1RpbWU7CiAgICAgICAgaWYgKHdpbmRvd1RpbWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgICAgICB0aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3cgPSB0cnVlOwogICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRJbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRUaW1lV2luZG93OwogICAgICAgIH0KICAgIH0KICAgIG5leHRJbmZpbml0ZVRpbWVXaW5kb3codmFsdWUpIHsKICAgICAgICBjb25zdCBfZXZlbnRzID0gdGhpcy5fZXZlbnRzOwogICAgICAgIF9ldmVudHMucHVzaCh2YWx1ZSk7CiAgICAgICAgaWYgKF9ldmVudHMubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkgewogICAgICAgICAgICBfZXZlbnRzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgfQogICAgbmV4dFRpbWVXaW5kb3codmFsdWUpIHsKICAgICAgICB0aGlzLl9ldmVudHMucHVzaChuZXcgUmVwbGF5RXZlbnQodGhpcy5fZ2V0Tm93KCksIHZhbHVlKSk7CiAgICAgICAgdGhpcy5fdHJpbUJ1ZmZlclRoZW5HZXRFdmVudHMoKTsKICAgICAgICBzdXBlci5uZXh0KHZhbHVlKTsKICAgIH0KICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgIGNvbnN0IF9pbmZpbml0ZVRpbWVXaW5kb3cgPSB0aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgY29uc3QgX2V2ZW50cyA9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyB0aGlzLl9ldmVudHMgOiB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpOwogICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgIGNvbnN0IGxlbiA9IF9ldmVudHMubGVuZ3RoOwogICAgICAgIGxldCBzdWJzY3JpcHRpb247CiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCB8fCB0aGlzLmhhc0Vycm9yKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0U3Vic2NyaXB0aW9uKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHN1YnNjcmliZXIgPSBuZXcgT2JzZXJ2ZU9uU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzY2hlZHVsZXIpKTsKICAgICAgICB9CiAgICAgICAgaWYgKF9pbmZpbml0ZVRpbWVXaW5kb3cpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikgewogICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKHRoaXMudGhyb3duRXJyb3IpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICB9CiAgICBfZ2V0Tm93KCkgewogICAgICAgIHJldHVybiAodGhpcy5zY2hlZHVsZXIgfHwgcXVldWUpLm5vdygpOwogICAgfQogICAgX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzKCkgewogICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2dldE5vdygpOwogICAgICAgIGNvbnN0IF9idWZmZXJTaXplID0gdGhpcy5fYnVmZmVyU2l6ZTsKICAgICAgICBjb25zdCBfd2luZG93VGltZSA9IHRoaXMuX3dpbmRvd1RpbWU7CiAgICAgICAgY29uc3QgX2V2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICBjb25zdCBldmVudHNDb3VudCA9IF9ldmVudHMubGVuZ3RoOwogICAgICAgIGxldCBzcGxpY2VDb3VudCA9IDA7CiAgICAgICAgd2hpbGUgKHNwbGljZUNvdW50IDwgZXZlbnRzQ291bnQpIHsKICAgICAgICAgICAgaWYgKChub3cgLSBfZXZlbnRzW3NwbGljZUNvdW50XS50aW1lKSA8IF93aW5kb3dUaW1lKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzcGxpY2VDb3VudCsrOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnRzQ291bnQgPiBfYnVmZmVyU2l6ZSkgewogICAgICAgICAgICBzcGxpY2VDb3VudCA9IE1hdGgubWF4KHNwbGljZUNvdW50LCBldmVudHNDb3VudCAtIF9idWZmZXJTaXplKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNwbGljZUNvdW50ID4gMCkgewogICAgICAgICAgICBfZXZlbnRzLnNwbGljZSgwLCBzcGxpY2VDb3VudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfZXZlbnRzOwogICAgfQp9CmNsYXNzIFJlcGxheUV2ZW50IHsKICAgIGNvbnN0cnVjdG9yKHRpbWUsIHZhbHVlKSB7CiAgICAgICAgdGhpcy50aW1lID0gdGltZTsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICB9Cn0KCmxldCBuZXh0SGFuZGxlID0gMTsKY29uc3QgUkVTT0xWRUQgPSAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpKCk7CmNvbnN0IGFjdGl2ZUhhbmRsZXMgPSB7fTsKZnVuY3Rpb24gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSkgewogICAgaWYgKGhhbmRsZSBpbiBhY3RpdmVIYW5kbGVzKSB7CiAgICAgICAgZGVsZXRlIGFjdGl2ZUhhbmRsZXNbaGFuZGxlXTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQpjb25zdCBJbW1lZGlhdGUgPSB7CiAgICBzZXRJbW1lZGlhdGUoY2IpIHsKICAgICAgICBjb25zdCBoYW5kbGUgPSBuZXh0SGFuZGxlKys7CiAgICAgICAgYWN0aXZlSGFuZGxlc1toYW5kbGVdID0gdHJ1ZTsKICAgICAgICBSRVNPTFZFRC50aGVuKCgpID0+IGZpbmRBbmRDbGVhckhhbmRsZShoYW5kbGUpICYmIGNiKCkpOwogICAgICAgIHJldHVybiBoYW5kbGU7CiAgICB9LAogICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7CiAgICAgICAgZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSk7CiAgICB9LAp9OwoKY2xhc3MgQXNhcEFjdGlvbiBleHRlbmRzIEFzeW5jQWN0aW9uIHsKICAgIGNvbnN0cnVjdG9yKHNjaGVkdWxlciwgd29yaykgewogICAgICAgIHN1cGVyKHNjaGVkdWxlciwgd29yayk7CiAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgdGhpcy53b3JrID0gd29yazsKICAgIH0KICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgIGlmIChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGVyLmFjdGlvbnMucHVzaCh0aGlzKTsKICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlZCB8fCAoc2NoZWR1bGVyLnNjaGVkdWxlZCA9IEltbWVkaWF0ZS5zZXRJbW1lZGlhdGUoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCBudWxsKSkpOwogICAgfQogICAgcmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkgPSAwKSB7CiAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlY3ljbGVBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVkdWxlci5hY3Rpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBJbW1lZGlhdGUuY2xlYXJJbW1lZGlhdGUoaWQpOwogICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQp9CgpjbGFzcyBBc2FwU2NoZWR1bGVyIGV4dGVuZHMgQXN5bmNTY2hlZHVsZXIgewogICAgZmx1c2goYWN0aW9uKSB7CiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpczsKICAgICAgICBsZXQgZXJyb3I7CiAgICAgICAgbGV0IGluZGV4ID0gLTE7CiAgICAgICAgbGV0IGNvdW50ID0gYWN0aW9ucy5sZW5ndGg7CiAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IGFjdGlvbnMuc2hpZnQoKTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpOwogICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpIHsKICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgIH0KfQoKY29uc3QgYXNhcCA9IG5ldyBBc2FwU2NoZWR1bGVyKEFzYXBBY3Rpb24pOwoKY29uc3QgYXN5bmMgPSBuZXcgQXN5bmNTY2hlZHVsZXIoQXN5bmNBY3Rpb24pOwoKY2xhc3MgQW5pbWF0aW9uRnJhbWVBY3Rpb24gZXh0ZW5kcyBBc3luY0FjdGlvbiB7CiAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICBzdXBlcihzY2hlZHVsZXIsIHdvcmspOwogICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICB9CiAgICByZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZWQgfHwgKHNjaGVkdWxlci5zY2hlZHVsZWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gc2NoZWR1bGVyLmZsdXNoKG51bGwpKSk7CiAgICB9CiAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICBpZiAoKGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ID4gMCkgfHwgKGRlbGF5ID09PSBudWxsICYmIHRoaXMuZGVsYXkgPiAwKSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NoZWR1bGVyLmFjdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTsKICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KfQoKY2xhc3MgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIgZXh0ZW5kcyBBc3luY1NjaGVkdWxlciB7CiAgICBmbHVzaChhY3Rpb24pIHsKICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzOwogICAgICAgIGxldCBlcnJvcjsKICAgICAgICBsZXQgaW5kZXggPSAtMTsKICAgICAgICBsZXQgY291bnQgPSBhY3Rpb25zLmxlbmd0aDsKICAgICAgICBhY3Rpb24gPSBhY3Rpb24gfHwgYWN0aW9ucy5zaGlmdCgpOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSk7CiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSkgewogICAgICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgfQp9Cgpjb25zdCBhbmltYXRpb25GcmFtZSA9IG5ldyBBbmltYXRpb25GcmFtZVNjaGVkdWxlcihBbmltYXRpb25GcmFtZUFjdGlvbik7CgpmdW5jdGlvbiBub29wKCkgeyB9CgpmdW5jdGlvbiBpc09ic2VydmFibGUob2JqKSB7CiAgICByZXR1cm4gISFvYmogJiYgKG9iaiBpbnN0YW5jZW9mIE9ic2VydmFibGUgfHwgKHR5cGVvZiBvYmoubGlmdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykpOwp9Cgpjb25zdCBBcmd1bWVudE91dE9mUmFuZ2VFcnJvckltcGwgPSAoKCkgPT4gewogICAgZnVuY3Rpb24gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsKCkgewogICAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy5tZXNzYWdlID0gJ2FyZ3VtZW50IG91dCBvZiByYW5nZSc7CiAgICAgICAgdGhpcy5uYW1lID0gJ0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJzsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICByZXR1cm4gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsOwp9KSgpOwpjb25zdCBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbDsKCmZ1bmN0aW9uIG1hcChwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWFwT3BlcmF0aW9uKHNvdXJjZSkgewogICAgICAgIGlmICh0eXBlb2YgcHJvamVjdCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Jyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWFwT3BlcmF0b3IocHJvamVjdCwgdGhpc0FyZykpOwogICAgfTsKfQpjbGFzcyBNYXBPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpOwogICAgfQp9CmNsYXNzIE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcm9qZWN0LCB0aGlzQXJnKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZyB8fCB0aGlzOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdC5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuY291bnQrKyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChyZXN1bHQpOwogICAgfQp9CgpjbGFzcyBPdXRlclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7CiAgICB9CiAgICBub3RpZnlFcnJvcihlcnJvciwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycm9yKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpjbGFzcyBJbm5lclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5vdXRlclZhbHVlID0gb3V0ZXJWYWx1ZTsKICAgICAgICB0aGlzLm91dGVySW5kZXggPSBvdXRlckluZGV4OwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlOZXh0KHRoaXMub3V0ZXJWYWx1ZSwgdmFsdWUsIHRoaXMub3V0ZXJJbmRleCwgdGhpcy5pbmRleCsrLCB0aGlzKTsKICAgIH0KICAgIF9lcnJvcihlcnJvcikgewogICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUVycm9yKGVycm9yLCB0aGlzKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5Q29tcGxldGUodGhpcyk7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQp9Cgpjb25zdCBzdWJzY3JpYmVUb1Byb21pc2UgPSAocHJvbWlzZSkgPT4gKHN1YnNjcmliZXIpID0+IHsKICAgIHByb21pc2UudGhlbigodmFsdWUpID0+IHsKICAgICAgICBpZiAoIXN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9LCAoZXJyKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycikpCiAgICAgICAgLnRoZW4obnVsbCwgaG9zdFJlcG9ydEVycm9yKTsKICAgIHJldHVybiBzdWJzY3JpYmVyOwp9OwoKZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7CiAgICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCAhU3ltYm9sLml0ZXJhdG9yKSB7CiAgICAgICAgcmV0dXJuICdAQGl0ZXJhdG9yJzsKICAgIH0KICAgIHJldHVybiBTeW1ib2wuaXRlcmF0b3I7Cn0KY29uc3QgaXRlcmF0b3IgPSBnZXRTeW1ib2xJdGVyYXRvcigpOwoKY29uc3Qgc3Vic2NyaWJlVG9JdGVyYWJsZSA9IChpdGVyYWJsZSkgPT4gKHN1YnNjcmliZXIpID0+IHsKICAgIGNvbnN0IGl0ZXJhdG9yJDEgPSBpdGVyYWJsZVtpdGVyYXRvcl0oKTsKICAgIGRvIHsKICAgICAgICBjb25zdCBpdGVtID0gaXRlcmF0b3IkMS5uZXh0KCk7CiAgICAgICAgaWYgKGl0ZW0uZG9uZSkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpYmVyLm5leHQoaXRlbS52YWx1ZSk7CiAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0gd2hpbGUgKHRydWUpOwogICAgaWYgKHR5cGVvZiBpdGVyYXRvciQxLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHN1YnNjcmliZXIuYWRkKCgpID0+IHsKICAgICAgICAgICAgaWYgKGl0ZXJhdG9yJDEucmV0dXJuKSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvciQxLnJldHVybigpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaWJlcjsKfTsKCmNvbnN0IHN1YnNjcmliZVRvT2JzZXJ2YWJsZSA9IChvYmopID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICBjb25zdCBvYnMgPSBvYmpbb2JzZXJ2YWJsZV0oKTsKICAgIGlmICh0eXBlb2Ygb2JzLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gb2JzLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0KfTsKCmNvbnN0IGlzQXJyYXlMaWtlID0gKCh4KSA9PiB4ICYmIHR5cGVvZiB4Lmxlbmd0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHggIT09ICdmdW5jdGlvbicpOwoKZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7CiAgICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuc3Vic2NyaWJlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nOwp9Cgpjb25zdCBzdWJzY3JpYmVUbyA9IChyZXN1bHQpID0+IHsKICAgIGlmICghIXJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0W29ic2VydmFibGVdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvT2JzZXJ2YWJsZShyZXN1bHQpOwogICAgfQogICAgZWxzZSBpZiAoaXNBcnJheUxpa2UocmVzdWx0KSkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVUb0FycmF5KHJlc3VsdCk7CiAgICB9CiAgICBlbHNlIGlmIChpc1Byb21pc2UocmVzdWx0KSkgewogICAgICAgIHJldHVybiBzdWJzY3JpYmVUb1Byb21pc2UocmVzdWx0KTsKICAgIH0KICAgIGVsc2UgaWYgKCEhcmVzdWx0ICYmIHR5cGVvZiByZXN1bHRbaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvSXRlcmFibGUocmVzdWx0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGNvbnN0IHZhbHVlID0gaXNPYmplY3QocmVzdWx0KSA/ICdhbiBpbnZhbGlkIG9iamVjdCcgOiBgJyR7cmVzdWx0fSdgOwogICAgICAgIGNvbnN0IG1zZyA9IGBZb3UgcHJvdmlkZWQgJHt2YWx1ZX0gd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLmAKICAgICAgICAgICAgKyAnIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBBcnJheSwgb3IgSXRlcmFibGUuJzsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG1zZyk7CiAgICB9Cn07CgpmdW5jdGlvbiBzdWJzY3JpYmVUb1Jlc3VsdChvdXRlclN1YnNjcmliZXIsIHJlc3VsdCwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcihvdXRlclN1YnNjcmliZXIsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpKSB7CiAgICBpZiAoaW5uZXJTdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkgewogICAgICAgIHJldHVybiByZXN1bHQuc3Vic2NyaWJlKGlubmVyU3Vic2NyaWJlcik7CiAgICB9CiAgICByZXR1cm4gc3Vic2NyaWJlVG8ocmVzdWx0KShpbm5lclN1YnNjcmliZXIpOwp9Cgpjb25zdCBOT05FID0ge307CmZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoLi4ub2JzZXJ2YWJsZXMpIHsKICAgIGxldCByZXN1bHRTZWxlY3RvciA9IG51bGw7CiAgICBsZXQgc2NoZWR1bGVyID0gbnVsbDsKICAgIGlmIChpc1NjaGVkdWxlcihvYnNlcnZhYmxlc1tvYnNlcnZhYmxlcy5sZW5ndGggLSAxXSkpIHsKICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgIH0KICAgIGlmICh0eXBlb2Ygb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXN1bHRTZWxlY3RvciA9IG9ic2VydmFibGVzLnBvcCgpOwogICAgfQogICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG9ic2VydmFibGVzWzBdKSkgewogICAgICAgIG9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXNbMF07CiAgICB9CiAgICByZXR1cm4gZnJvbUFycmF5KG9ic2VydmFibGVzLCBzY2hlZHVsZXIpLmxpZnQobmV3IENvbWJpbmVMYXRlc3RPcGVyYXRvcihyZXN1bHRTZWxlY3RvcikpOwp9CmNsYXNzIENvbWJpbmVMYXRlc3RPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucmVzdWx0U2VsZWN0b3IpKTsKICAgIH0KfQpjbGFzcyBDb21iaW5lTGF0ZXN0U3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yOwogICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICB0aGlzLnZhbHVlcyA9IFtdOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSBbXTsKICAgIH0KICAgIF9uZXh0KG9ic2VydmFibGUpIHsKICAgICAgICB0aGlzLnZhbHVlcy5wdXNoKE5PTkUpOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2YWJsZXMubGVuZ3RoOwogICAgICAgIGlmIChsZW4gPT09IDApIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBsZW47CiAgICAgICAgICAgIHRoaXMudG9SZXNwb25kID0gbGVuOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07CiAgICAgICAgICAgICAgICB0aGlzLmFkZChzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBvYnNlcnZhYmxlLCBvYnNlcnZhYmxlLCBpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSh1bnVzZWQpIHsKICAgICAgICBpZiAoKHRoaXMuYWN0aXZlIC09IDEpID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgY29uc3Qgb2xkVmFsID0gdmFsdWVzW291dGVySW5kZXhdOwogICAgICAgIGNvbnN0IHRvUmVzcG9uZCA9ICF0aGlzLnRvUmVzcG9uZAogICAgICAgICAgICA/IDAKICAgICAgICAgICAgOiBvbGRWYWwgPT09IE5PTkUgPyAtLXRoaXMudG9SZXNwb25kIDogdGhpcy50b1Jlc3BvbmQ7CiAgICAgICAgdmFsdWVzW291dGVySW5kZXhdID0gaW5uZXJWYWx1ZTsKICAgICAgICBpZiAodG9SZXNwb25kID09PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cnlSZXN1bHRTZWxlY3Rvcih2YWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlcy5zbGljZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIF90cnlSZXN1bHRTZWxlY3Rvcih2YWx1ZXMpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucmVzdWx0U2VsZWN0b3IuYXBwbHkodGhpcywgdmFsdWVzKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCmZ1bmN0aW9uIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQxID0gaW5wdXRbb2JzZXJ2YWJsZV0oKTsKICAgICAgICAgICAgc3ViLmFkZChvYnNlcnZhYmxlJDEuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQodmFsdWUpIHsgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gc3Vic2NyaWJlci5uZXh0KHZhbHVlKSkpOyB9LAogICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7IHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkpOyB9LAogICAgICAgICAgICAgICAgY29tcGxldGUoKSB7IHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuY29tcGxldGUoKSkpOyB9LAogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBzdWI7CiAgICB9KTsKfQoKZnVuY3Rpb24gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gaW5wdXQudGhlbih2YWx1ZSA9PiB7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sIGVyciA9PiB7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkpOwogICAgICAgIH0pKSk7CiAgICAgICAgcmV0dXJuIHN1YjsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgIGlmICghaW5wdXQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsJyk7CiAgICB9CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgIGxldCBpdGVyYXRvciQxOwogICAgICAgIHN1Yi5hZGQoKCkgPT4gewogICAgICAgICAgICBpZiAoaXRlcmF0b3IkMSAmJiB0eXBlb2YgaXRlcmF0b3IkMS5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yJDEucmV0dXJuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiB7CiAgICAgICAgICAgIGl0ZXJhdG9yJDEgPSBpbnB1dFtpdGVyYXRvcl0oKTsKICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHZhbHVlOwogICAgICAgICAgICAgICAgbGV0IGRvbmU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yJDEubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIGRvbmUgPSByZXN1bHQuZG9uZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gc3ViOwogICAgfSk7Cn0KCmZ1bmN0aW9uIGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpIHsKICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbb2JzZXJ2YWJsZV0gPT09ICdmdW5jdGlvbic7Cn0KCmZ1bmN0aW9uIGlzSXRlcmFibGUoaW5wdXQpIHsKICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nOwp9CgpmdW5jdGlvbiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcikgewogICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICBpZiAoaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlT2JzZXJ2YWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKGlucHV0KSkgewogICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVQcm9taXNlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc0FycmF5TGlrZShpbnB1dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzSXRlcmFibGUoaW5wdXQpIHx8IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlSXRlcmFibGUoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigoaW5wdXQgIT09IG51bGwgJiYgdHlwZW9mIGlucHV0IHx8IGlucHV0KSArICcgaXMgbm90IG9ic2VydmFibGUnKTsKfQoKZnVuY3Rpb24gZnJvbShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICBpZiAoIXNjaGVkdWxlcikgewogICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIGlucHV0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG8oaW5wdXQpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcik7CiAgICB9Cn0KCmZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICBpZiAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5waXBlKG1lcmdlTWFwKChhLCBpKSA9PiBmcm9tKHByb2plY3QoYSwgaSkpLnBpcGUobWFwKChiLCBpaSkgPT4gcmVzdWx0U2VsZWN0b3IoYSwgYiwgaSwgaWkpKSksIGNvbmN1cnJlbnQpKTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ251bWJlcicpIHsKICAgICAgICBjb25jdXJyZW50ID0gcmVzdWx0U2VsZWN0b3I7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IE1lcmdlTWFwT3BlcmF0b3IocHJvamVjdCwgY29uY3VycmVudCkpOwp9CmNsYXNzIE1lcmdlTWFwT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJvamVjdCwgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDsKICAgIH0KICAgIGNhbGwob2JzZXJ2ZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZU1hcFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJvamVjdCwgdGhpcy5jb25jdXJyZW50KSk7CiAgICB9Cn0KY2xhc3MgTWVyZ2VNYXBTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcm9qZWN0LCBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDsKICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuYnVmZmVyID0gW107CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5hY3RpdmUgPCB0aGlzLmNvbmN1cnJlbnQpIHsKICAgICAgICAgICAgdGhpcy5fdHJ5TmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBfdHJ5TmV4dCh2YWx1ZSkgewogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4Kys7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0KHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuYWN0aXZlKys7CiAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpOwogICAgfQogICAgX2lubmVyU3ViKGlzaCwgdmFsdWUsIGluZGV4KSB7CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGlzaCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgaWYgKGlubmVyU3Vic2NyaXB0aW9uICE9PSBpbm5lclN1YnNjcmliZXIpIHsKICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGlubmVyU3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGlubmVyVmFsdWUpOwogICAgfQogICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICB0aGlzLnJlbW92ZShpbm5lclN1Yik7CiAgICAgICAgdGhpcy5hY3RpdmUtLTsKICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fbmV4dChidWZmZXIuc2hpZnQoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlID09PSAwICYmIHRoaXMuaGFzQ29tcGxldGVkKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIG1lcmdlQWxsKGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHsKICAgIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7Cn0KCmZ1bmN0aW9uIGNvbmNhdEFsbCgpIHsKICAgIHJldHVybiBtZXJnZUFsbCgxKTsKfQoKZnVuY3Rpb24gY29uY2F0KC4uLm9ic2VydmFibGVzKSB7CiAgICByZXR1cm4gY29uY2F0QWxsKCkob2YoLi4ub2JzZXJ2YWJsZXMpKTsKfQoKZnVuY3Rpb24gZGVmZXIob2JzZXJ2YWJsZUZhY3RvcnkpIHsKICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBsZXQgaW5wdXQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW5wdXQgPSBvYnNlcnZhYmxlRmFjdG9yeSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc291cmNlID0gaW5wdXQgPyBmcm9tKGlucHV0KSA6IGVtcHR5JDEoKTsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBmb3JrSm9pbiguLi5zb3VyY2VzKSB7CiAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDEpIHsKICAgICAgICBjb25zdCBmaXJzdCA9IHNvdXJjZXNbMF07CiAgICAgICAgaWYgKGlzQXJyYXkoZmlyc3QpKSB7CiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKGZpcnN0LCBudWxsKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzT2JqZWN0KGZpcnN0KSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZmlyc3QpID09PSBPYmplY3QucHJvdG90eXBlKSB7CiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaXJzdCk7CiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKGtleXMubWFwKGtleSA9PiBmaXJzdFtrZXldKSwga2V5cyk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBzb3VyY2VzW3NvdXJjZXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjb25zdCByZXN1bHRTZWxlY3RvciA9IHNvdXJjZXMucG9wKCk7CiAgICAgICAgc291cmNlcyA9IChzb3VyY2VzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KHNvdXJjZXNbMF0pKSA/IHNvdXJjZXNbMF0gOiBzb3VyY2VzOwogICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKHNvdXJjZXMsIG51bGwpLnBpcGUobWFwKChhcmdzKSA9PiByZXN1bHRTZWxlY3RvciguLi5hcmdzKSkpOwogICAgfQogICAgcmV0dXJuIGZvcmtKb2luSW50ZXJuYWwoc291cmNlcywgbnVsbCk7Cn0KZnVuY3Rpb24gZm9ya0pvaW5JbnRlcm5hbChzb3VyY2VzLCBrZXlzKSB7CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3QgbGVuID0gc291cmNlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdmFsdWVzID0gbmV3IEFycmF5KGxlbik7CiAgICAgICAgbGV0IGNvbXBsZXRlZCA9IDA7CiAgICAgICAgbGV0IGVtaXR0ZWQgPSAwOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZnJvbShzb3VyY2VzW2ldKTsKICAgICAgICAgICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHNvdXJjZS5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgbmV4dDogdmFsdWUgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghaGFzVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4gc3Vic2NyaWJlci5lcnJvcihlcnIpLAogICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09PSBsZW4gfHwgIWhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0dGVkID09PSBsZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChrZXlzID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXksIGkpID0+IChyZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0KSwge30pIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zLCByZXN1bHRTZWxlY3RvcikgewogICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHsKICAgICAgICByZXN1bHRTZWxlY3RvciA9IG9wdGlvbnM7CiAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgICAgIHJldHVybiBmcm9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIG9wdGlvbnMpLnBpcGUobWFwKGFyZ3MgPT4gaXNBcnJheShhcmdzKSA/IHJlc3VsdFNlbGVjdG9yKC4uLmFyZ3MpIDogcmVzdWx0U2VsZWN0b3IoYXJncykpKTsKICAgIH0KICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGUpIHsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0dXBTdWJzY3JpcHRpb24odGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpOwogICAgfSk7Cn0KZnVuY3Rpb24gc2V0dXBTdWJzY3JpcHRpb24oc291cmNlT2JqLCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpIHsKICAgIGxldCB1bnN1YnNjcmliZTsKICAgIGlmIChpc0V2ZW50VGFyZ2V0KHNvdXJjZU9iaikpIHsKICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VPYmo7CiAgICAgICAgc291cmNlT2JqLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTsKICAgICAgICB1bnN1YnNjcmliZSA9ICgpID0+IHNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucyk7CiAgICB9CiAgICBlbHNlIGlmIChpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHNvdXJjZU9iaikpIHsKICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VPYmo7CiAgICAgICAgc291cmNlT2JqLm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgdW5zdWJzY3JpYmUgPSAoKSA9PiBzb3VyY2Uub2ZmKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICBlbHNlIGlmIChpc05vZGVTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopKSB7CiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlT2JqOwogICAgICAgIHNvdXJjZU9iai5hZGRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4gc291cmNlLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICBlbHNlIGlmIChzb3VyY2VPYmogJiYgc291cmNlT2JqLmxlbmd0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzb3VyY2VPYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgc2V0dXBTdWJzY3JpcHRpb24oc291cmNlT2JqW2ldLCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZXZlbnQgdGFyZ2V0Jyk7CiAgICB9CiAgICBzdWJzY3JpYmVyLmFkZCh1bnN1YnNjcmliZSk7Cn0KZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIoc291cmNlT2JqKSB7CiAgICByZXR1cm4gc291cmNlT2JqICYmIHR5cGVvZiBzb3VyY2VPYmouYWRkTGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNvdXJjZU9iai5yZW1vdmVMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJzsKfQpmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHNvdXJjZU9iaikgewogICAgcmV0dXJuIHNvdXJjZU9iaiAmJiB0eXBlb2Ygc291cmNlT2JqLm9uID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzb3VyY2VPYmoub2ZmID09PSAnZnVuY3Rpb24nOwp9CmZ1bmN0aW9uIGlzRXZlbnRUYXJnZXQoc291cmNlT2JqKSB7CiAgICByZXR1cm4gc291cmNlT2JqICYmIHR5cGVvZiBzb3VyY2VPYmouYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbic7Cn0KCmZ1bmN0aW9uIGlzTnVtZXJpYyh2YWwpIHsKICAgIHJldHVybiAhaXNBcnJheSh2YWwpICYmICh2YWwgLSBwYXJzZUZsb2F0KHZhbCkgKyAxKSA+PSAwOwp9CgpmdW5jdGlvbiBpbnRlcnZhbChwZXJpb2QgPSAwLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgaWYgKCFpc051bWVyaWMocGVyaW9kKSB8fCBwZXJpb2QgPCAwKSB7CiAgICAgICAgcGVyaW9kID0gMDsKICAgIH0KICAgIGlmICghc2NoZWR1bGVyIHx8IHR5cGVvZiBzY2hlZHVsZXIuc2NoZWR1bGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBzY2hlZHVsZXIgPSBhc3luYzsKICAgIH0KICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICBzdWJzY3JpYmVyLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gkMSwgcGVyaW9kLCB7IHN1YnNjcmliZXIsIGNvdW50ZXI6IDAsIHBlcmlvZCB9KSk7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7CiAgICB9KTsKfQpmdW5jdGlvbiBkaXNwYXRjaCQxKHN0YXRlKSB7CiAgICBjb25zdCB7IHN1YnNjcmliZXIsIGNvdW50ZXIsIHBlcmlvZCB9ID0gc3RhdGU7CiAgICBzdWJzY3JpYmVyLm5leHQoY291bnRlcik7CiAgICB0aGlzLnNjaGVkdWxlKHsgc3Vic2NyaWJlciwgY291bnRlcjogY291bnRlciArIDEsIHBlcmlvZCB9LCBwZXJpb2QpOwp9CgpmdW5jdGlvbiBtZXJnZSguLi5vYnNlcnZhYmxlcykgewogICAgbGV0IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICBsZXQgc2NoZWR1bGVyID0gbnVsbDsKICAgIGxldCBsYXN0ID0gb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIobGFzdCkpIHsKICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICBpZiAob2JzZXJ2YWJsZXMubGVuZ3RoID4gMSAmJiB0eXBlb2Ygb2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV0gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGNvbmN1cnJlbnQgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2YgbGFzdCA9PT0gJ251bWJlcicpIHsKICAgICAgICBjb25jdXJyZW50ID0gb2JzZXJ2YWJsZXMucG9wKCk7CiAgICB9CiAgICBpZiAoc2NoZWR1bGVyID09PSBudWxsICYmIG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBvYnNlcnZhYmxlc1swXSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZXNbMF07CiAgICB9CiAgICByZXR1cm4gbWVyZ2VBbGwoY29uY3VycmVudCkoZnJvbUFycmF5KG9ic2VydmFibGVzLCBzY2hlZHVsZXIpKTsKfQoKZnVuY3Rpb24gZmlsdGVyKHByZWRpY2F0ZSwgdGhpc0FyZykgewogICAgcmV0dXJuIGZ1bmN0aW9uIGZpbHRlck9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBGaWx0ZXJPcGVyYXRvcihwcmVkaWNhdGUsIHRoaXNBcmcpKTsKICAgIH07Cn0KY2xhc3MgRmlsdGVyT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZzsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbHRlclN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcmVkaWNhdGUsIHRoaXMudGhpc0FyZykpOwogICAgfQp9CmNsYXNzIEZpbHRlclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwcmVkaWNhdGUsIHRoaXNBcmcpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgdGhpcy50aGlzQXJnID0gdGhpc0FyZzsKICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZywgdmFsdWUsIHRoaXMuY291bnQrKyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIHRpbWVyKGR1ZVRpbWUgPSAwLCBwZXJpb2RPclNjaGVkdWxlciwgc2NoZWR1bGVyKSB7CiAgICBsZXQgcGVyaW9kID0gLTE7CiAgICBpZiAoaXNOdW1lcmljKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgIHBlcmlvZCA9IE51bWJlcihwZXJpb2RPclNjaGVkdWxlcikgPCAxICYmIDEgfHwgTnVtYmVyKHBlcmlvZE9yU2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzU2NoZWR1bGVyKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgIHNjaGVkdWxlciA9IHBlcmlvZE9yU2NoZWR1bGVyOwogICAgfQogICAgaWYgKCFpc1NjaGVkdWxlcihzY2hlZHVsZXIpKSB7CiAgICAgICAgc2NoZWR1bGVyID0gYXN5bmM7CiAgICB9CiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgY29uc3QgZHVlID0gaXNOdW1lcmljKGR1ZVRpbWUpCiAgICAgICAgICAgID8gZHVlVGltZQogICAgICAgICAgICA6ICgrZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSk7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaCQyLCBkdWUsIHsKICAgICAgICAgICAgaW5kZXg6IDAsIHBlcmlvZCwgc3Vic2NyaWJlcgogICAgICAgIH0pOwogICAgfSk7Cn0KZnVuY3Rpb24gZGlzcGF0Y2gkMihzdGF0ZSkgewogICAgY29uc3QgeyBpbmRleCwgcGVyaW9kLCBzdWJzY3JpYmVyIH0gPSBzdGF0ZTsKICAgIHN1YnNjcmliZXIubmV4dChpbmRleCk7CiAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIGlmIChwZXJpb2QgPT09IC0xKSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgIH0KICAgIHN0YXRlLmluZGV4ID0gaW5kZXggKyAxOwogICAgdGhpcy5zY2hlZHVsZShzdGF0ZSwgcGVyaW9kKTsKfQoKZnVuY3Rpb24gemlwKC4uLm9ic2VydmFibGVzKSB7CiAgICBjb25zdCByZXN1bHRTZWxlY3RvciA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdOwogICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIG9ic2VydmFibGVzLnBvcCgpOwogICAgfQogICAgcmV0dXJuIGZyb21BcnJheShvYnNlcnZhYmxlcywgdW5kZWZpbmVkKS5saWZ0KG5ldyBaaXBPcGVyYXRvcihyZXN1bHRTZWxlY3RvcikpOwp9CmNsYXNzIFppcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgWmlwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnJlc3VsdFNlbGVjdG9yKSk7CiAgICB9Cn0KY2xhc3MgWmlwU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHJlc3VsdFNlbGVjdG9yLCB2YWx1ZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuaXRlcmF0b3JzID0gW107CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSAodHlwZW9mIHJlc3VsdFNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSA/IHJlc3VsdFNlbGVjdG9yIDogbnVsbDsKICAgICAgICB0aGlzLnZhbHVlcyA9IHZhbHVlczsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7CiAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIGl0ZXJhdG9ycy5wdXNoKG5ldyBTdGF0aWNBcnJheUl0ZXJhdG9yKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZVtpdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgaXRlcmF0b3JzLnB1c2gobmV3IFN0YXRpY0l0ZXJhdG9yKHZhbHVlW2l0ZXJhdG9yXSgpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgWmlwQnVmZmVySXRlcmF0b3IodGhpcy5kZXN0aW5hdGlvbiwgdGhpcywgdmFsdWUpKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgY29uc3QgaXRlcmF0b3JzID0gdGhpcy5pdGVyYXRvcnM7CiAgICAgICAgY29uc3QgbGVuID0gaXRlcmF0b3JzLmxlbmd0aDsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5hY3RpdmUgPSBsZW47CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBpdGVyYXRvcnNbaV07CiAgICAgICAgICAgIGlmIChpdGVyYXRvci5zdGlsbFVuc3Vic2NyaWJlZCkgewogICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGl0ZXJhdG9yLnN1YnNjcmliZShpdGVyYXRvciwgaSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUtLTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeUluYWN0aXZlKCkgewogICAgICAgIHRoaXMuYWN0aXZlLS07CiAgICAgICAgaWYgKHRoaXMuYWN0aXZlID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBjaGVja0l0ZXJhdG9ycygpIHsKICAgICAgICBjb25zdCBpdGVyYXRvcnMgPSB0aGlzLml0ZXJhdG9yczsKICAgICAgICBjb25zdCBsZW4gPSBpdGVyYXRvcnMubGVuZ3RoOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvci5oYXNWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXRlcmF0b3IuaGFzVmFsdWUoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBzaG91bGRDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIGNvbnN0IGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc0NvbXBsZXRlZCgpKSB7CiAgICAgICAgICAgICAgICBzaG91bGRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7CiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFyZ3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yZXN1bHRTZWxlY3RvcikgewogICAgICAgICAgICB0aGlzLl90cnlyZXN1bHRTZWxlY3RvcihhcmdzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoYXJncyk7CiAgICAgICAgfQogICAgICAgIGlmIChzaG91bGRDb21wbGV0ZSkgewogICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIF90cnlyZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlc3VsdFNlbGVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgIH0KfQpjbGFzcyBTdGF0aWNJdGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihpdGVyYXRvcikgewogICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKICAgICAgICB0aGlzLm5leHRSZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICB9CiAgICBoYXNWYWx1ZSgpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0OwogICAgICAgIHRoaXMubmV4dFJlc3VsdCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IHRoaXMubmV4dFJlc3VsdDsKICAgICAgICByZXR1cm4gbmV4dFJlc3VsdCAmJiBuZXh0UmVzdWx0LmRvbmU7CiAgICB9Cn0KY2xhc3MgU3RhdGljQXJyYXlJdGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihhcnJheSkgewogICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5sZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICB9CiAgICBbaXRlcmF0b3JdKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IGkgPSB0aGlzLmluZGV4Kys7CiAgICAgICAgY29uc3QgYXJyYXkgPSB0aGlzLmFycmF5OwogICAgICAgIHJldHVybiBpIDwgdGhpcy5sZW5ndGggPyB7IHZhbHVlOiBhcnJheVtpXSwgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTsKICAgIH0KICAgIGhhc1ZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuaW5kZXg7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoID09PSB0aGlzLmluZGV4OwogICAgfQp9CmNsYXNzIFppcEJ1ZmZlckl0ZXJhdG9yIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBwYXJlbnQsIG9ic2VydmFibGUpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5vYnNlcnZhYmxlID0gb2JzZXJ2YWJsZTsKICAgICAgICB0aGlzLnN0aWxsVW5zdWJzY3JpYmVkID0gdHJ1ZTsKICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdOwogICAgICAgIHRoaXMuaXNDb21wbGV0ZSA9IGZhbHNlOwogICAgfQogICAgW2l0ZXJhdG9yXSgpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIG5leHQoKSB7CiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0NvbXBsZXRlKSB7CiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogYnVmZmVyLnNoaWZ0KCksIGRvbmU6IGZhbHNlIH07CiAgICAgICAgfQogICAgfQogICAgaGFzVmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCA+IDA7CiAgICB9CiAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzQ29tcGxldGU7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0aGlzLmlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlJbmFjdGl2ZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKGlubmVyVmFsdWUpOwogICAgICAgIHRoaXMucGFyZW50LmNoZWNrSXRlcmF0b3JzKCk7CiAgICB9CiAgICBzdWJzY3JpYmUodmFsdWUsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHRoaXMub2JzZXJ2YWJsZSwgdGhpcywgaW5kZXgpOwogICAgfQp9CgpmdW5jdGlvbiBhdWRpdChkdXJhdGlvblNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gYXVkaXRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgQXVkaXRPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9Owp9CmNsYXNzIEF1ZGl0T3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBBdWRpdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9Cn0KY2xhc3MgQXVkaXRTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBkdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkgewogICAgICAgICAgICBsZXQgZHVyYXRpb247CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IGR1cmF0aW9uU2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGR1cmF0aW9uU2VsZWN0b3IodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgICAgIGlmICghaW5uZXJTdWJzY3JpcHRpb24gfHwgaW5uZXJTdWJzY3JpcHRpb24uY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMudGhyb3R0bGVkID0gaW5uZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xlYXJUaHJvdHRsZSgpIHsKICAgICAgICBjb25zdCB7IHZhbHVlLCBoYXNWYWx1ZSwgdGhyb3R0bGVkIH0gPSB0aGlzOwogICAgICAgIGlmICh0aHJvdHRsZWQpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhyb3R0bGVkKTsKICAgICAgICAgICAgdGhpcy50aHJvdHRsZWQgPSBudWxsOwogICAgICAgICAgICB0aHJvdHRsZWQudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4KSB7CiAgICAgICAgdGhpcy5jbGVhclRocm90dGxlKCk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTsKICAgIH0KfQoKZnVuY3Rpb24gYXVkaXRUaW1lKGR1cmF0aW9uLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgcmV0dXJuIGF1ZGl0KCgpID0+IHRpbWVyKGR1cmF0aW9uLCBzY2hlZHVsZXIpKTsKfQoKZnVuY3Rpb24gY2F0Y2hFcnJvcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIGNhdGNoRXJyb3JPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIGNvbnN0IG9wZXJhdG9yID0gbmV3IENhdGNoT3BlcmF0b3Ioc2VsZWN0b3IpOwogICAgICAgIGNvbnN0IGNhdWdodCA9IHNvdXJjZS5saWZ0KG9wZXJhdG9yKTsKICAgICAgICByZXR1cm4gKG9wZXJhdG9yLmNhdWdodCA9IGNhdWdodCk7CiAgICB9Owp9CmNsYXNzIENhdGNoT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc2VsZWN0b3IpIHsKICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBDYXRjaFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5zZWxlY3RvciwgdGhpcy5jYXVnaHQpKTsKICAgIH0KfQpjbGFzcyBDYXRjaFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNlbGVjdG9yLCBjYXVnaHQpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yOwogICAgICAgIHRoaXMuY2F1Z2h0ID0gY2F1Z2h0OwogICAgfQogICAgZXJyb3IoZXJyKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zZWxlY3RvcihlcnIsIHRoaXMuY2F1Z2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyMikgewogICAgICAgICAgICAgICAgc3VwZXIuZXJyb3IoZXJyMik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCk7CiAgICAgICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaWJlciA9IG5ldyBJbm5lclN1YnNjcmliZXIodGhpcywgdW5kZWZpbmVkLCB1bmRlZmluZWQpOwogICAgICAgICAgICB0aGlzLmFkZChpbm5lclN1YnNjcmliZXIpOwogICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZChpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGNvbmNhdE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgcmV0dXJuIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCAxKTsKfQoKZnVuY3Rpb24gZGVib3VuY2UoZHVyYXRpb25TZWxlY3RvcikgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBEZWJvdW5jZU9wZXJhdG9yKGR1cmF0aW9uU2VsZWN0b3IpKTsKfQpjbGFzcyBEZWJvdW5jZU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGR1cmF0aW9uU2VsZWN0b3IpIHsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVib3VuY2VTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuZHVyYXRpb25TZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERlYm91bmNlU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kdXJhdGlvblNlbGVjdG9yLmNhbGwodGhpcywgdmFsdWUpOwogICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cnlOZXh0KHZhbHVlLCByZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0aGlzLmVtaXRWYWx1ZSgpOwogICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgIH0KICAgIF90cnlOZXh0KHZhbHVlLCBkdXJhdGlvbikgewogICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uOwogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLnJlbW92ZShzdWJzY3JpcHRpb24pOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAmJiAhc3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgICAgIHRoaXMuZW1pdFZhbHVlKCk7CiAgICB9CiAgICBlbWl0VmFsdWUoKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlOwogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmR1cmF0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICBzdXBlci5fbmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBkZWJvdW5jZVRpbWUoZHVlVGltZSwgc2NoZWR1bGVyID0gYXN5bmMpIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGVib3VuY2VUaW1lT3BlcmF0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSk7Cn0KY2xhc3MgRGVib3VuY2VUaW1lT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgICAgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IERlYm91bmNlVGltZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdWVUaW1lLCB0aGlzLnNjaGVkdWxlcikpOwogICAgfQp9CmNsYXNzIERlYm91bmNlVGltZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5kdWVUaW1lID0gZHVlVGltZTsKICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICB0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOwogICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCk7CiAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICB0aGlzLmFkZCh0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCwgdGhpcy5kdWVUaW1lLCB0aGlzKSk7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5kZWJvdW5jZWROZXh0KCk7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgZGVib3VuY2VkTmV4dCgpIHsKICAgICAgICB0aGlzLmNsZWFyRGVib3VuY2UoKTsKICAgICAgICBpZiAodGhpcy5oYXNWYWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChsYXN0VmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGNsZWFyRGVib3VuY2UoKSB7CiAgICAgICAgY29uc3QgZGVib3VuY2VkU3Vic2NyaXB0aW9uID0gdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb247CiAgICAgICAgaWYgKGRlYm91bmNlZFN1YnNjcmlwdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZShkZWJvdW5jZWRTdWJzY3JpcHRpb24pOwogICAgICAgICAgICBkZWJvdW5jZWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgIH0KfQpmdW5jdGlvbiBkaXNwYXRjaE5leHQoc3Vic2NyaWJlcikgewogICAgc3Vic2NyaWJlci5kZWJvdW5jZWROZXh0KCk7Cn0KCmZ1bmN0aW9uIGRlbGF5V2hlbihkZWxheUR1cmF0aW9uU2VsZWN0b3IsIHN1YnNjcmlwdGlvbkRlbGF5KSB7CiAgICBpZiAoc3Vic2NyaXB0aW9uRGVsYXkpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gbmV3IFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZShzb3VyY2UsIHN1YnNjcmlwdGlvbkRlbGF5KQogICAgICAgICAgICAubGlmdChuZXcgRGVsYXlXaGVuT3BlcmF0b3IoZGVsYXlEdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IERlbGF5V2hlbk9wZXJhdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwp9CmNsYXNzIERlbGF5V2hlbk9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yID0gZGVsYXlEdXJhdGlvblNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVsYXlXaGVuU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERlbGF5V2hlblN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGRlbGF5RHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3RvcjsKICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMgPSBbXTsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgIH0KICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQob3V0ZXJWYWx1ZSk7CiAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oaW5uZXJTdWIpOwogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgIH0KICAgIG5vdGlmeUVycm9yKGVycm9yLCBpbm5lclN1YikgewogICAgICAgIHRoaXMuX2Vycm9yKGVycm9yKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpbm5lclN1Yik7CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4Kys7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGVsYXlOb3RpZmllciA9IHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgIGlmIChkZWxheU5vdGlmaWVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRyeURlbGF5KGRlbGF5Tm90aWZpZXIsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICByZW1vdmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uSWR4ID0gdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5pbmRleE9mKHN1YnNjcmlwdGlvbik7CiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbklkeCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5zcGxpY2Uoc3Vic2NyaXB0aW9uSWR4LCAxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5vdXRlclZhbHVlOwogICAgfQogICAgdHJ5RGVsYXkoZGVsYXlOb3RpZmllciwgdmFsdWUpIHsKICAgICAgICBjb25zdCBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIGRlbGF5Tm90aWZpZXIsIHZhbHVlKTsKICAgICAgICBpZiAobm90aWZpZXJTdWJzY3JpcHRpb24gJiYgIW5vdGlmaWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMucHVzaChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgfQogICAgfQogICAgdHJ5Q29tcGxldGUoKSB7CiAgICAgICAgaWYgKHRoaXMuY29tcGxldGVkICYmIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9Cn0KY2xhc3MgU3Vic2NyaXB0aW9uRGVsYXlPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHN1YnNjcmlwdGlvbkRlbGF5KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkRlbGF5ID0gc3Vic2NyaXB0aW9uRGVsYXk7CiAgICB9CiAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbkRlbGF5LnN1YnNjcmliZShuZXcgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuc291cmNlKSk7CiAgICB9Cn0KY2xhc3MgU3Vic2NyaXB0aW9uRGVsYXlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHNvdXJjZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpYmVkID0gZmFsc2U7CiAgICB9CiAgICBfbmV4dCh1bnVzZWQpIHsKICAgICAgICB0aGlzLnN1YnNjcmliZVRvU291cmNlKCk7CiAgICB9CiAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMucGFyZW50LmVycm9yKGVycik7CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIHRoaXMuc3Vic2NyaWJlVG9Tb3VyY2UoKTsKICAgIH0KICAgIHN1YnNjcmliZVRvU291cmNlKCkgewogICAgICAgIGlmICghdGhpcy5zb3VyY2VTdWJzY3JpYmVkKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlU3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKHRoaXMucGFyZW50KTsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIGRlbWF0ZXJpYWxpemUoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gZGVtYXRlcmlhbGl6ZU9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBEZU1hdGVyaWFsaXplT3BlcmF0b3IoKSk7CiAgICB9Owp9CmNsYXNzIERlTWF0ZXJpYWxpemVPcGVyYXRvciB7CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZU1hdGVyaWFsaXplU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7CiAgICB9Cn0KY2xhc3MgRGVNYXRlcmlhbGl6ZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICB2YWx1ZS5vYnNlcnZlKHRoaXMuZGVzdGluYXRpb24pOwogICAgfQp9CgpmdW5jdGlvbiBkaXN0aW5jdFVudGlsQ2hhbmdlZChjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBEaXN0aW5jdFVudGlsQ2hhbmdlZE9wZXJhdG9yKGNvbXBhcmUsIGtleVNlbGVjdG9yKSk7Cn0KY2xhc3MgRGlzdGluY3RVbnRpbENoYW5nZWRPcGVyYXRvciB7CiAgICBjb25zdHJ1Y3Rvcihjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgICAgIHRoaXMuY29tcGFyZSA9IGNvbXBhcmU7CiAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY29tcGFyZSwgdGhpcy5rZXlTZWxlY3RvcikpOwogICAgfQp9CmNsYXNzIERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGNvbXBhcmUsIGtleVNlbGVjdG9yKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjsKICAgICAgICB0aGlzLmhhc0tleSA9IGZhbHNlOwogICAgICAgIGlmICh0eXBlb2YgY29tcGFyZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBhcmUoeCwgeSkgewogICAgICAgIHJldHVybiB4ID09PSB5OwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQga2V5OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsga2V5U2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgIGtleSA9IGtleVNlbGVjdG9yID8ga2V5U2VsZWN0b3IodmFsdWUpIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlOwogICAgICAgIGlmICh0aGlzLmhhc0tleSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgeyBjb21wYXJlIH0gPSB0aGlzOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZSh0aGlzLmtleSwga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmhhc0tleSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gdGFrZShjb3VudCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHsKICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGVtcHR5JDEoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgVGFrZU9wZXJhdG9yKGNvdW50KSk7CiAgICAgICAgfQogICAgfTsKfQpjbGFzcyBUYWtlT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IodG90YWwpIHsKICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgaWYgKHRoaXMudG90YWwgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFcnJvcjsKICAgICAgICB9CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnRvdGFsKSk7CiAgICB9Cn0KY2xhc3MgVGFrZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCB0b3RhbCkgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbDsKICAgICAgICBjb25zdCBjb3VudCA9ICsrdGhpcy5jb3VudDsKICAgICAgICBpZiAoY291bnQgPD0gdG90YWwpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgaWYgKGNvdW50ID09PSB0b3RhbCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBleGhhdXN0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICBpZiAocmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUoZXhoYXVzdE1hcCgoYSwgaSkgPT4gZnJvbShwcm9qZWN0KGEsIGkpKS5waXBlKG1hcCgoYiwgaWkpID0+IHJlc3VsdFNlbGVjdG9yKGEsIGIsIGksIGlpKSkpKSk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IEV4aGF1c3RNYXBPcGVyYXRvcihwcm9qZWN0KSk7Cn0KY2xhc3MgRXhoYXVzdE1hcE9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKHByb2plY3QpIHsKICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRXhoYXVzdE1hcFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5wcm9qZWN0KSk7CiAgICB9Cn0KY2xhc3MgRXhoYXVzdE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByb2plY3QpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlOwogICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgdGhpcy5pbmRleCA9IDA7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIGlmICghdGhpcy5oYXNTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgdGhpcy50cnlOZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICB0cnlOZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QodmFsdWUsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSB0cnVlOwogICAgICAgIHRoaXMuX2lubmVyU3ViKHJlc3VsdCwgdmFsdWUsIGluZGV4KTsKICAgIH0KICAgIF9pbm5lclN1YihyZXN1bHQsIHZhbHVlLCBpbmRleCkgewogICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaWJlciA9IG5ldyBJbm5lclN1YnNjcmliZXIodGhpcywgdmFsdWUsIGluZGV4KTsKICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgZGVzdGluYXRpb24uYWRkKGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXN1bHQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBpbm5lclN1YnNjcmliZXIpOwogICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgfQogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgIH0KICAgIG5vdGlmeUVycm9yKGVycikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgIGRlc3RpbmF0aW9uLnJlbW92ZShpbm5lclN1Yik7CiAgICAgICAgdGhpcy5oYXNTdWJzY3JpcHRpb24gPSBmYWxzZTsKICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gZmluYWxpemUoY2FsbGJhY2spIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRmluYWxseU9wZXJhdG9yKGNhbGxiYWNrKSk7Cn0KY2xhc3MgRmluYWxseU9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRmluYWxseVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5jYWxsYmFjaykpOwogICAgfQp9CmNsYXNzIEZpbmFsbHlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgY2FsbGJhY2spIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5hZGQobmV3IFN1YnNjcmlwdGlvbihjYWxsYmFjaykpOwogICAgfQp9CgpmdW5jdGlvbiBpZ25vcmVFbGVtZW50cygpIHsKICAgIHJldHVybiBmdW5jdGlvbiBpZ25vcmVFbGVtZW50c09wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBJZ25vcmVFbGVtZW50c09wZXJhdG9yKCkpOwogICAgfTsKfQpjbGFzcyBJZ25vcmVFbGVtZW50c09wZXJhdG9yIHsKICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IElnbm9yZUVsZW1lbnRzU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7CiAgICB9Cn0KY2xhc3MgSWdub3JlRWxlbWVudHNTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICBfbmV4dCh1bnVzZWQpIHsKICAgIH0KfQoKZnVuY3Rpb24gbWF0ZXJpYWxpemUoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gbWF0ZXJpYWxpemVPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWF0ZXJpYWxpemVPcGVyYXRvcigpKTsKICAgIH07Cn0KY2xhc3MgTWF0ZXJpYWxpemVPcGVyYXRvciB7CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNYXRlcmlhbGl6ZVN1YnNjcmliZXIoc3Vic2NyaWJlcikpOwogICAgfQp9CmNsYXNzIE1hdGVyaWFsaXplU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24pIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICB9CiAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgfQogICAgX2Vycm9yKGVycikgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpKTsKICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQogICAgX2NvbXBsZXRlKCkgewogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KE5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpKTsKICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpmdW5jdGlvbiBzY2FuKGFjY3VtdWxhdG9yLCBzZWVkKSB7CiAgICBsZXQgaGFzU2VlZCA9IGZhbHNlOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMikgewogICAgICAgIGhhc1NlZWQgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uIHNjYW5PcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgU2Nhbk9wZXJhdG9yKGFjY3VtdWxhdG9yLCBzZWVkLCBoYXNTZWVkKSk7CiAgICB9Owp9CmNsYXNzIFNjYW5PcGVyYXRvciB7CiAgICBjb25zdHJ1Y3RvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCA9IGZhbHNlKSB7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwogICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7CiAgICAgICAgdGhpcy5oYXNTZWVkID0gaGFzU2VlZDsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNjYW5TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYWNjdW11bGF0b3IsIHRoaXMuc2VlZCwgdGhpcy5oYXNTZWVkKSk7CiAgICB9Cn0KY2xhc3MgU2NhblN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBhY2N1bXVsYXRvciwgX3NlZWQsIGhhc1NlZWQpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwogICAgICAgIHRoaXMuX3NlZWQgPSBfc2VlZDsKICAgICAgICB0aGlzLmhhc1NlZWQgPSBoYXNTZWVkOwogICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgfQogICAgZ2V0IHNlZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlZWQ7CiAgICB9CiAgICBzZXQgc2VlZCh2YWx1ZSkgewogICAgICAgIHRoaXMuaGFzU2VlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fc2VlZCA9IHZhbHVlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAoIXRoaXMuaGFzU2VlZCkgewogICAgICAgICAgICB0aGlzLnNlZWQgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cnlOZXh0KHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBfdHJ5TmV4dCh2YWx1ZSkgewogICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrOwogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5hY2N1bXVsYXRvcih0aGlzLnNlZWQsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlZWQgPSByZXN1bHQ7CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCmZ1bmN0aW9uIG11bHRpY2FzdChzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeSwgc2VsZWN0b3IpIHsKICAgIHJldHVybiBmdW5jdGlvbiBtdWx0aWNhc3RPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIGxldCBzdWJqZWN0RmFjdG9yeTsKICAgICAgICBpZiAodHlwZW9mIHN1YmplY3RPclN1YmplY3RGYWN0b3J5ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHN1YmplY3RGYWN0b3J5ID0gc3ViamVjdE9yU3ViamVjdEZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdWJqZWN0RmFjdG9yeSA9IGZ1bmN0aW9uIHN1YmplY3RGYWN0b3J5KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3RPclN1YmplY3RGYWN0b3J5OwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTXVsdGljYXN0T3BlcmF0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gT2JqZWN0LmNyZWF0ZShzb3VyY2UsIGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IpOwogICAgICAgIGNvbm5lY3RhYmxlLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICBjb25uZWN0YWJsZS5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5OwogICAgICAgIHJldHVybiBjb25uZWN0YWJsZTsKICAgIH07Cn0KY2xhc3MgTXVsdGljYXN0T3BlcmF0b3IgewogICAgY29uc3RydWN0b3Ioc3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7CiAgICAgICAgdGhpcy5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5OwogICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgY29uc3QgeyBzZWxlY3RvciB9ID0gdGhpczsKICAgICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0RmFjdG9yeSgpOwogICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGVjdG9yKHN1YmplY3QpLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHNvdXJjZS5zdWJzY3JpYmUoc3ViamVjdCkpOwogICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICB9Cn0KCmZ1bmN0aW9uIHBhaXJ3aXNlKCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBQYWlyd2lzZU9wZXJhdG9yKCkpOwp9CmNsYXNzIFBhaXJ3aXNlT3BlcmF0b3IgewogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUGFpcndpc2VTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTsKICAgIH0KfQpjbGFzcyBQYWlyd2lzZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMuaGFzUHJldiA9IGZhbHNlOwogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBsZXQgcGFpcjsKICAgICAgICBpZiAodGhpcy5oYXNQcmV2KSB7CiAgICAgICAgICAgIHBhaXIgPSBbdGhpcy5wcmV2LCB2YWx1ZV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmhhc1ByZXYgPSB0cnVlOwogICAgICAgIH0KICAgICAgICB0aGlzLnByZXYgPSB2YWx1ZTsKICAgICAgICBpZiAocGFpcikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocGFpcik7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBwbHVjayguLi5wcm9wZXJ0aWVzKSB7CiAgICBjb25zdCBsZW5ndGggPSBwcm9wZXJ0aWVzLmxlbmd0aDsKICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuJyk7CiAgICB9CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gbWFwKHBsdWNrZXIocHJvcGVydGllcywgbGVuZ3RoKSkoc291cmNlKTsKfQpmdW5jdGlvbiBwbHVja2VyKHByb3BzLCBsZW5ndGgpIHsKICAgIGNvbnN0IG1hcHBlciA9ICh4KSA9PiB7CiAgICAgICAgbGV0IGN1cnJlbnRQcm9wID0geDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHAgPSBjdXJyZW50UHJvcFtwcm9wc1tpXV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wID0gcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9wOwogICAgfTsKICAgIHJldHVybiBtYXBwZXI7Cn0KCmZ1bmN0aW9uIHJlcGVhdFdoZW4obm90aWZpZXIpIHsKICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgUmVwZWF0V2hlbk9wZXJhdG9yKG5vdGlmaWVyKSk7Cn0KY2xhc3MgUmVwZWF0V2hlbk9wZXJhdG9yIHsKICAgIGNvbnN0cnVjdG9yKG5vdGlmaWVyKSB7CiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVwZWF0V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllciwgc291cmNlKSk7CiAgICB9Cn0KY2xhc3MgUmVwZWF0V2hlblN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG5vdGlmaWVyLCBzb3VyY2UpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgIHRoaXMuc291cmNlSXNCZWluZ1N1YnNjcmliZWRUbyA9IHRydWU7CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy5zb3VyY2VJc0JlaW5nU3Vic2NyaWJlZFRvID0gdHJ1ZTsKICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUodGhpcyk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZShpbm5lclN1YikgewogICAgICAgIGlmICh0aGlzLnNvdXJjZUlzQmVpbmdTdWJzY3JpYmVkVG8gPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIGNvbXBsZXRlKCkgewogICAgICAgIHRoaXMuc291cmNlSXNCZWluZ1N1YnNjcmliZWRUbyA9IGZhbHNlOwogICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnJldHJpZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9SZXRyaWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gfHwgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCk7CiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5uZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIGNvbnN0IHsgbm90aWZpY2F0aW9ucywgcmV0cmllc1N1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAobm90aWZpY2F0aW9ucykgewogICAgICAgICAgICBub3RpZmljYXRpb25zLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChyZXRyaWVzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHJldHJpZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXRyaWVzID0gbnVsbDsKICAgIH0KICAgIF91bnN1YnNjcmliZUFuZFJlY3ljbGUoKSB7CiAgICAgICAgY29uc3QgeyBfdW5zdWJzY3JpYmUgfSA9IHRoaXM7CiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUgPSBudWxsOwogICAgICAgIHN1cGVyLl91bnN1YnNjcmliZUFuZFJlY3ljbGUoKTsKICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IF91bnN1YnNjcmliZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIHN1YnNjcmliZVRvUmV0cmllcygpIHsKICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIGxldCByZXRyaWVzOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsgbm90aWZpZXIgfSA9IHRoaXM7CiAgICAgICAgICAgIHJldHJpZXMgPSBub3RpZmllcih0aGlzLm5vdGlmaWNhdGlvbnMpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXRyaWVzID0gcmV0cmllczsKICAgICAgICB0aGlzLnJldHJpZXNTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCByZXRyaWVzKTsKICAgIH0KfQoKZnVuY3Rpb24gc2hhcmVTdWJqZWN0RmFjdG9yeSgpIHsKICAgIHJldHVybiBuZXcgU3ViamVjdCgpOwp9CmZ1bmN0aW9uIHNoYXJlKCkgewogICAgcmV0dXJuIChzb3VyY2UpID0+IHJlZkNvdW50KCkobXVsdGljYXN0KHNoYXJlU3ViamVjdEZhY3RvcnkpKHNvdXJjZSkpOwp9CgpmdW5jdGlvbiBzaGFyZVJlcGxheShjb25maWdPckJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcikgewogICAgbGV0IGNvbmZpZzsKICAgIGlmIChjb25maWdPckJ1ZmZlclNpemUgJiYgdHlwZW9mIGNvbmZpZ09yQnVmZmVyU2l6ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBjb25maWcgPSBjb25maWdPckJ1ZmZlclNpemU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjb25maWcgPSB7CiAgICAgICAgICAgIGJ1ZmZlclNpemU6IGNvbmZpZ09yQnVmZmVyU2l6ZSwKICAgICAgICAgICAgd2luZG93VGltZSwKICAgICAgICAgICAgcmVmQ291bnQ6IGZhbHNlLAogICAgICAgICAgICBzY2hlZHVsZXIKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KHNoYXJlUmVwbGF5T3BlcmF0b3IoY29uZmlnKSk7Cn0KZnVuY3Rpb24gc2hhcmVSZXBsYXlPcGVyYXRvcih7IGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHJlZkNvdW50OiB1c2VSZWZDb3VudCwgc2NoZWR1bGVyIH0pIHsKICAgIGxldCBzdWJqZWN0OwogICAgbGV0IHJlZkNvdW50ID0gMDsKICAgIGxldCBzdWJzY3JpcHRpb247CiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTsKICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7CiAgICByZXR1cm4gZnVuY3Rpb24gc2hhcmVSZXBsYXlPcGVyYXRpb24oc291cmNlKSB7CiAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICBpZiAoIXN1YmplY3QgfHwgaGFzRXJyb3IpIHsKICAgICAgICAgICAgaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcik7CiAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHNvdXJjZS5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSkgeyBzdWJqZWN0Lm5leHQodmFsdWUpOyB9LAogICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHN1YmplY3QuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb21wbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGlubmVyU3ViID0gc3ViamVjdC5zdWJzY3JpYmUodGhpcyk7CiAgICAgICAgdGhpcy5hZGQoKCkgPT4gewogICAgICAgICAgICByZWZDb3VudC0tOwogICAgICAgICAgICBpbm5lclN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uICYmICFpc0NvbXBsZXRlICYmIHVzZVJlZkNvdW50ICYmIHJlZkNvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHN1YmplY3QgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07Cn0KCmZ1bmN0aW9uIHN0YXJ0V2l0aCguLi5hcnJheSkgewogICAgY29uc3Qgc2NoZWR1bGVyID0gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07CiAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgIGFycmF5LnBvcCgpOwogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBjb25jYXQoYXJyYXksIHNvdXJjZSwgc2NoZWR1bGVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBjb25jYXQoYXJyYXksIHNvdXJjZSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHN3aXRjaE1hcChwcm9qZWN0LCByZXN1bHRTZWxlY3RvcikgewogICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UucGlwZShzd2l0Y2hNYXAoKGEsIGkpID0+IGZyb20ocHJvamVjdChhLCBpKSkucGlwZShtYXAoKGIsIGlpKSA9PiByZXN1bHRTZWxlY3RvcihhLCBiLCBpLCBpaSkpKSkpOwogICAgfQogICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBTd2l0Y2hNYXBPcGVyYXRvcihwcm9qZWN0KSk7Cn0KY2xhc3MgU3dpdGNoTWFwT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IocHJvamVjdCkgewogICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBTd2l0Y2hNYXBTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucHJvamVjdCkpOwogICAgfQp9CmNsYXNzIFN3aXRjaE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByb2plY3QpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QodmFsdWUsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyb3IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2lubmVyU3ViKHJlc3VsdCwgdmFsdWUsIGluZGV4KTsKICAgIH0KICAgIF9pbm5lclN1YihyZXN1bHQsIHZhbHVlLCBpbmRleCkgewogICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaXB0aW9uID0gdGhpcy5pbm5lclN1YnNjcmlwdGlvbjsKICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgaW5uZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgcmVzdWx0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICBpZiAodGhpcy5pbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZCh0aGlzLmlubmVyU3Vic2NyaXB0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBfY29tcGxldGUoKSB7CiAgICAgICAgY29uc3QgeyBpbm5lclN1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICBpZiAoIWlubmVyU3Vic2NyaXB0aW9uIHx8IGlubmVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICBzdXBlci5fY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgfQogICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgIHRoaXMuaW5uZXJTdWJzY3JpcHRpb24gPSBudWxsOwogICAgfQogICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgZGVzdGluYXRpb24ucmVtb3ZlKGlubmVyU3ViKTsKICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgc3VwZXIuX2NvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgIH0KfQoKZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IFRha2VVbnRpbE9wZXJhdG9yKG5vdGlmaWVyKSk7Cn0KY2xhc3MgVGFrZVVudGlsT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Iobm90aWZpZXIpIHsKICAgICAgICB0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7CiAgICB9CiAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgIGNvbnN0IHRha2VVbnRpbFN1YnNjcmliZXIgPSBuZXcgVGFrZVVudGlsU3Vic2NyaWJlcihzdWJzY3JpYmVyKTsKICAgICAgICBjb25zdCBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRha2VVbnRpbFN1YnNjcmliZXIsIHRoaXMubm90aWZpZXIpOwogICAgICAgIGlmIChub3RpZmllclN1YnNjcmlwdGlvbiAmJiAhdGFrZVVudGlsU3Vic2NyaWJlci5zZWVuVmFsdWUpIHsKICAgICAgICAgICAgdGFrZVVudGlsU3Vic2NyaWJlci5hZGQobm90aWZpZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZSh0YWtlVW50aWxTdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRha2VVbnRpbFN1YnNjcmliZXI7CiAgICB9Cn0KY2xhc3MgVGFrZVVudGlsU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbikgewogICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICB0aGlzLnNlZW5WYWx1ZSA9IGZhbHNlOwogICAgfQogICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgIHRoaXMuc2VlblZhbHVlID0gdHJ1ZTsKICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICB9CiAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgIH0KfQoKZnVuY3Rpb24gdGFwKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpIHsKICAgIHJldHVybiBmdW5jdGlvbiB0YXBPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgRG9PcGVyYXRvcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSk7CiAgICB9Owp9CmNsYXNzIERvT3BlcmF0b3IgewogICAgY29uc3RydWN0b3IobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHRoaXMubmV4dE9yT2JzZXJ2ZXIgPSBuZXh0T3JPYnNlcnZlcjsKICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CiAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOwogICAgfQogICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgVGFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm5leHRPck9ic2VydmVyLCB0aGlzLmVycm9yLCB0aGlzLmNvbXBsZXRlKSk7CiAgICB9Cn0KY2xhc3MgVGFwU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgdGhpcy5fdGFwTmV4dCA9IG5vb3A7CiAgICAgICAgdGhpcy5fdGFwRXJyb3IgPSBub29wOwogICAgICAgIHRoaXMuX3RhcENvbXBsZXRlID0gbm9vcDsKICAgICAgICB0aGlzLl90YXBFcnJvciA9IGVycm9yIHx8IG5vb3A7CiAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBjb21wbGV0ZSB8fCBub29wOwogICAgICAgIGlmIChpc0Z1bmN0aW9uKG9ic2VydmVyT3JOZXh0KSkgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fdGFwTmV4dCA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYnNlcnZlck9yTmV4dCkgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgICAgICAgIHRoaXMuX3RhcE5leHQgPSBvYnNlcnZlck9yTmV4dC5uZXh0IHx8IG5vb3A7CiAgICAgICAgICAgIHRoaXMuX3RhcEVycm9yID0gb2JzZXJ2ZXJPck5leHQuZXJyb3IgfHwgbm9vcDsKICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSB8fCBub29wOwogICAgICAgIH0KICAgIH0KICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5fdGFwTmV4dC5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgIH0KICAgIF9lcnJvcihlcnIpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl90YXBFcnJvci5jYWxsKHRoaXMuX2NvbnRleHQsIGVycik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgIH0KICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl90YXBDb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgfQp9CgpmdW5jdGlvbiB3aXRoTGF0ZXN0RnJvbSguLi5hcmdzKSB7CiAgICByZXR1cm4gKHNvdXJjZSkgPT4gewogICAgICAgIGxldCBwcm9qZWN0OwogICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHByb2plY3QgPSBhcmdzLnBvcCgpOwogICAgICAgIH0KICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IGFyZ3M7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBXaXRoTGF0ZXN0RnJvbU9wZXJhdG9yKG9ic2VydmFibGVzLCBwcm9qZWN0KSk7CiAgICB9Owp9CmNsYXNzIFdpdGhMYXRlc3RGcm9tT3BlcmF0b3IgewogICAgY29uc3RydWN0b3Iob2JzZXJ2YWJsZXMsIHByb2plY3QpIHsKICAgICAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7CiAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgIH0KICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFdpdGhMYXRlc3RGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLm9ic2VydmFibGVzLCB0aGlzLnByb2plY3QpKTsKICAgIH0KfQpjbGFzcyBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG9ic2VydmFibGVzLCBwcm9qZWN0KSB7CiAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIHRoaXMub2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlczsKICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgICAgIHRoaXMudG9SZXNwb25kID0gW107CiAgICAgICAgY29uc3QgbGVuID0gb2JzZXJ2YWJsZXMubGVuZ3RoOwogICAgICAgIHRoaXMudmFsdWVzID0gbmV3IEFycmF5KGxlbik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICB0aGlzLnRvUmVzcG9uZC5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGxldCBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07CiAgICAgICAgICAgIHRoaXMuYWRkKHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIG9ic2VydmFibGUsIG9ic2VydmFibGUsIGkpKTsKICAgICAgICB9CiAgICB9CiAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgdGhpcy52YWx1ZXNbb3V0ZXJJbmRleF0gPSBpbm5lclZhbHVlOwogICAgICAgIGNvbnN0IHRvUmVzcG9uZCA9IHRoaXMudG9SZXNwb25kOwogICAgICAgIGlmICh0b1Jlc3BvbmQubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRvUmVzcG9uZC5pbmRleE9mKG91dGVySW5kZXgpOwogICAgICAgICAgICBpZiAoZm91bmQgIT09IC0xKSB7CiAgICAgICAgICAgICAgICB0b1Jlc3BvbmQuc3BsaWNlKGZvdW5kLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgfQogICAgX25leHQodmFsdWUpIHsKICAgICAgICBpZiAodGhpcy50b1Jlc3BvbmQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbdmFsdWUsIC4uLnRoaXMudmFsdWVzXTsKICAgICAgICAgICAgaWYgKHRoaXMucHJvamVjdCkgewogICAgICAgICAgICAgICAgdGhpcy5fdHJ5UHJvamVjdChhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIF90cnlQcm9qZWN0KGFyZ3MpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdC5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHJlc3VsdCk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMgogKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICogTGljZW5zZTogTUlUCiAqLwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogQ29udmluY2UgY2xvc3VyZSBjb21waWxlciB0aGF0IHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGhhcyBubyBzaWRlLWVmZmVjdHMuCiAqCiAqIENsb3N1cmUgY29tcGlsZXIgYWx3YXlzIGFzc3VtZXMgdGhhdCBgdG9TdHJpbmdgIGhhcyBubyBzaWRlLWVmZmVjdHMuIFdlIHVzZSB0aGlzIHF1aXJrIHRvCiAqIGFsbG93IHVzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBidXQgaGF2ZSBjbG9zdXJlIGNvbXBpbGVyIG1hcmsgdGhlIGNhbGwgYXMgbm8tc2lkZS1lZmZlY3RzLgogKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGZvciB0aGUgYG5vU2lkZUVmZmVjdHNgIGZ1bmN0aW9uIGJlIGFzc2lnbmVkCiAqIHRvIHNvbWV0aGluZyB3aGljaCBpcyByZXRhaW5lZCBvdGhlcndpc2UgdGhlIGNhbGwgdG8gYG5vU2lkZUVmZmVjdHNgIHdpbGwgYmUgcmVtb3ZlZCBieSBjbG9zdXJlCiAqIGNvbXBpbGVyLgogKi8KZnVuY3Rpb24gbm9TaWRlRWZmZWN0cyhmbikgewogICAgcmV0dXJuIHsgdG9TdHJpbmc6IGZuIH0udG9TdHJpbmcoKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBBTk5PVEFUSU9OUyA9ICdfX2Fubm90YXRpb25zX18nOwpjb25zdCBQQVJBTUVURVJTID0gJ19fcGFyYW1ldGVyc19fJzsKY29uc3QgUFJPUF9NRVRBREFUQSA9ICdfX3Byb3BfX21ldGFkYXRhX18nOwovKioKICogQHN1cHByZXNzIHtnbG9iYWxUaGlzfQogKi8KZnVuY3Rpb24gbWFrZURlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nLCB0eXBlRm4pIHsKICAgIHJldHVybiBub1NpZGVFZmZlY3RzKCgpID0+IHsKICAgICAgICBjb25zdCBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpOwogICAgICAgIGZ1bmN0aW9uIERlY29yYXRvckZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERlY29yYXRvckZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIG1ldGFDdG9yLmNhbGwodGhpcywgLi4uYXJncyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVEZWNvcmF0b3IoY2xzKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZUZuKQogICAgICAgICAgICAgICAgICAgIHR5cGVGbihjbHMsIC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgdGhlIHByb3BlcnR5IGlzIGNvcGllZCBkdXJpbmcgc3ViY2xhc3NpbmcuCiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IGNscy5oYXNPd25Qcm9wZXJ0eShBTk5PVEFUSU9OUykgPwogICAgICAgICAgICAgICAgICAgIGNsc1tBTk5PVEFUSU9OU10gOgogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIEFOTk9UQVRJT05TLCB7IHZhbHVlOiBbXSB9KVtBTk5PVEFUSU9OU107CiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7CiAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFByb2Nlc3NpbmcpCiAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb2Nlc3NpbmcoY2xzKTsKICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnRDbGFzcykgewogICAgICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTsKICAgICAgICB9CiAgICAgICAgRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWUgPSBuYW1lOwogICAgICAgIERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IERlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgcmV0dXJuIERlY29yYXRvckZhY3Rvcnk7CiAgICB9KTsKfQpmdW5jdGlvbiBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gY3RvciguLi5hcmdzKSB7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BzKC4uLmFyZ3MpOwogICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHZhbHVlcykgewogICAgICAgICAgICAgICAgdGhpc1twcm9wTmFtZV0gPSB2YWx1ZXNbcHJvcE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKfQpmdW5jdGlvbiBtYWtlUGFyYW1EZWNvcmF0b3IobmFtZSwgcHJvcHMsIHBhcmVudENsYXNzKSB7CiAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgY29uc3QgbWV0YUN0b3IgPSBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKTsKICAgICAgICBmdW5jdGlvbiBQYXJhbURlY29yYXRvckZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkgewogICAgICAgICAgICAgICAgbWV0YUN0b3IuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgUGFyYW1EZWNvcmF0b3JGYWN0b3J5KC4uLmFyZ3MpOwogICAgICAgICAgICBQYXJhbURlY29yYXRvci5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3RhbmNlOwogICAgICAgICAgICByZXR1cm4gUGFyYW1EZWNvcmF0b3I7CiAgICAgICAgICAgIGZ1bmN0aW9uIFBhcmFtRGVjb3JhdG9yKGNscywgdW51c2VkS2V5LCBpbmRleCkgewogICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgLy8gcHJldmVudHMgdGhlIHByb3BlcnR5IGlzIGNvcGllZCBkdXJpbmcgc3ViY2xhc3NpbmcuCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gY2xzLmhhc093blByb3BlcnR5KFBBUkFNRVRFUlMpID8KICAgICAgICAgICAgICAgICAgICBjbHNbUEFSQU1FVEVSU10gOgogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIFBBUkFNRVRFUlMsIHsgdmFsdWU6IFtdIH0pW1BBUkFNRVRFUlNdOwogICAgICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgZ2FwcyBpZiBzb21lIGluIGJldHdlZW4gcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBhbm5vdGF0aW9ucy4KICAgICAgICAgICAgICAgIC8vIHdlIHBhZCB3aXRoIG51bGxzLgogICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKHBhcmFtZXRlcnNbaW5kZXhdID0gcGFyYW1ldGVyc1tpbmRleF0gfHwgW10pLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTsKICAgICAgICAgICAgICAgIHJldHVybiBjbHM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7CiAgICAgICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWUgPSBuYW1lOwogICAgICAgIFBhcmFtRGVjb3JhdG9yRmFjdG9yeS5hbm5vdGF0aW9uQ2xzID0gUGFyYW1EZWNvcmF0b3JGYWN0b3J5OwogICAgICAgIHJldHVybiBQYXJhbURlY29yYXRvckZhY3Rvcnk7CiAgICB9KTsKfQpmdW5jdGlvbiBtYWtlUHJvcERlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nKSB7CiAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgY29uc3QgbWV0YUN0b3IgPSBtYWtlTWV0YWRhdGFDdG9yKHByb3BzKTsKICAgICAgICBmdW5jdGlvbiBQcm9wRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvcERlY29yYXRvckZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIG1ldGFDdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ySW5zdGFuY2UgPSBuZXcgUHJvcERlY29yYXRvckZhY3RvcnkoLi4uYXJncyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3IodGFyZ2V0LCBuYW1lKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRhcmdldC5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgIC8vIFVzZSBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgaW1wb3J0YW50IHNpbmNlIGl0IGNyZWF0ZXMgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgd2hpY2gKICAgICAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLgogICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KFBST1BfTUVUQURBVEEpID8KICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcltQUk9QX01FVEFEQVRBXSA6CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCBQUk9QX01FVEFEQVRBLCB7IHZhbHVlOiB7fSB9KVtQUk9QX01FVEFEQVRBXTsKICAgICAgICAgICAgICAgIG1ldGFbbmFtZV0gPSBtZXRhLmhhc093blByb3BlcnR5KG5hbWUpICYmIG1ldGFbbmFtZV0gfHwgW107CiAgICAgICAgICAgICAgICBtZXRhW25hbWVdLnVuc2hpZnQoZGVjb3JhdG9ySW5zdGFuY2UpOwogICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9jZXNzaW5nKQogICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9jZXNzaW5nKHRhcmdldCwgbmFtZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFByb3BEZWNvcmF0b3I7CiAgICAgICAgfQogICAgICAgIGlmIChwYXJlbnRDbGFzcykgewogICAgICAgICAgICBQcm9wRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICAgIFByb3BEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7CiAgICAgICAgUHJvcERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IFByb3BEZWNvcmF0b3JGYWN0b3J5OwogICAgICAgIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTsKICAgIH0pOwp9Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybUwID0gLyoqCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHJldHVybiB7P30KICovCih0b2tlbikgPT4gKHsgdG9rZW4gfSk7Ci8qKgogKiBJbmplY3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSW5qZWN0ID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdJbmplY3QnLCAoybUwKSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIE9wdGlvbmFsIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE9wdGlvbmFsID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdPcHRpb25hbCcpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0Ci8qKgogKiBTZWxmIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFNlbGYgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ1NlbGYnKTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogU2tpcFNlbGYgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU2tpcFNlbGYgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ1NraXBTZWxmJyk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIEhvc3QgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSG9zdCA9IG1ha2VQYXJhbURlY29yYXRvcignSG9zdCcpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1MSA9IC8qKgogKiBAcGFyYW0gez89fSBhdHRyaWJ1dGVOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYXR0cmlidXRlTmFtZSkgPT4gKHsgYXR0cmlidXRlTmFtZSB9KTsKLyoqCiAqIEF0dHJpYnV0ZSBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBdHRyaWJ1dGUgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ0F0dHJpYnV0ZScsICjJtTEpKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEluamVjdGlvbiBmbGFncyBmb3IgREkuCiAqCiAqIEBwdWJsaWNBcGkKICovCnZhciBJbmplY3RGbGFnczsKKGZ1bmN0aW9uIChJbmplY3RGbGFncykgewogICAgLy8gVE9ETyhhbHhodWIpOiBtYWtlIHRoaXMgJ2NvbnN0JyB3aGVuIG5nYyBubyBsb25nZXIgd3JpdGVzIGV4cG9ydHMgb2YgaXQgaW50byBuZ2ZhY3RvcnkgZmlsZXMuCiAgICAvKiogQ2hlY2sgc2VsZiBhbmQgY2hlY2sgcGFyZW50IGluamVjdG9yIGlmIG5lZWRlZCAqLwogICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIkRlZmF1bHQiXSA9IDBdID0gIkRlZmF1bHQiOwogICAgLyoqCiAgICAgKiBTcGVjaWZpZXMgdGhhdCBhbiBpbmplY3RvciBzaG91bGQgcmV0cmlldmUgYSBkZXBlbmRlbmN5IGZyb20gYW55IGluamVjdG9yIHVudGlsIHJlYWNoaW5nIHRoZQogICAgICogaG9zdCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudC4gKE9ubHkgdXNlZCB3aXRoIEVsZW1lbnQgSW5qZWN0b3IpCiAgICAgKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJIb3N0Il0gPSAxXSA9ICJIb3N0IjsKICAgIC8qKiBEb24ndCBhc2NlbmQgdG8gYW5jZXN0b3JzIG9mIHRoZSBub2RlIHJlcXVlc3RpbmcgaW5qZWN0aW9uLiAqLwogICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIlNlbGYiXSA9IDJdID0gIlNlbGYiOwogICAgLyoqIFNraXAgdGhlIG5vZGUgdGhhdCBpcyByZXF1ZXN0aW5nIGluamVjdGlvbi4gKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJTa2lwU2VsZiJdID0gNF0gPSAiU2tpcFNlbGYiOwogICAgLyoqIEluamVjdCBgZGVmYXVsdFZhbHVlYCBpbnN0ZWFkIGlmIHRva2VuIG5vdCBmb3VuZC4gKi8KICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJPcHRpb25hbCJdID0gOF0gPSAiT3B0aW9uYWwiOwp9KShJbmplY3RGbGFncyB8fCAoSW5qZWN0RmxhZ3MgPSB7fSkpOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkgewogICAgZm9yIChsZXQga2V5IGluIG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkgewogICAgICAgIGlmIChvYmpXaXRoUHJvcGVydHlUb0V4dHJhY3Rba2V5XSA9PT0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSkgewogICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgIH0KICAgIH0KICAgIHRocm93IEVycm9yKCdDb3VsZCBub3QgZmluZCByZW5hbWVkIHByb3BlcnR5IG9uIHRhcmdldCBvYmplY3QuJyk7Cn0KLyoqCiAqIFNldHMgcHJvcGVydGllcyBvbiBhIHRhcmdldCBvYmplY3QgZnJvbSBhIHNvdXJjZSBvYmplY3QsIGJ1dCBvbmx5IGlmCiAqIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhlIHRhcmdldCBvYmplY3QuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBzZXQgcHJvcGVydGllcyBvbgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHByb3BlcnR5IGtleXMgYW5kIHZhbHVlcyB0byBzZXQKICovCmZ1bmN0aW9uIGZpbGxQcm9wZXJ0aWVzKHRhcmdldCwgc291cmNlKSB7CiAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHsKICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBDb25zdHJ1Y3QgYW4gYEluamVjdGFibGVEZWZgIHdoaWNoIGRlZmluZXMgaG93IGEgdG9rZW4gd2lsbCBiZSBjb25zdHJ1Y3RlZCBieSB0aGUgREkgc3lzdGVtLCBhbmQKICogaW4gd2hpY2ggaW5qZWN0b3JzIChpZiBhbnkpIGl0IHdpbGwgYmUgYXZhaWxhYmxlLgogKgogKiBUaGlzIHNob3VsZCBiZSBhc3NpZ25lZCB0byBhIHN0YXRpYyBgybVwcm92YCBmaWVsZCBvbiBhIHR5cGUsIHdoaWNoIHdpbGwgdGhlbiBiZSBhbgogKiBgSW5qZWN0YWJsZVR5cGVgLgogKgogKiBPcHRpb25zOgogKiAqIGBwcm92aWRlZEluYCBkZXRlcm1pbmVzIHdoaWNoIGluamVjdG9ycyB3aWxsIGluY2x1ZGUgdGhlIGluamVjdGFibGUsIGJ5IGVpdGhlciBhc3NvY2lhdGluZyBpdAogKiAgIHdpdGggYW4gYEBOZ01vZHVsZWAgb3Igb3RoZXIgYEluamVjdG9yVHlwZWAsIG9yIGJ5IHNwZWNpZnlpbmcgdGhhdCB0aGlzIGluamVjdGFibGUgc2hvdWxkIGJlCiAqICAgcHJvdmlkZWQgaW4gdGhlIGAncm9vdCdgIGluamVjdG9yLCB3aGljaCB3aWxsIGJlIHRoZSBhcHBsaWNhdGlvbi1sZXZlbCBpbmplY3RvciBpbiBtb3N0IGFwcHMuCiAqICogYGZhY3RvcnlgIGdpdmVzIHRoZSB6ZXJvIGFyZ3VtZW50IGZ1bmN0aW9uIHdoaWNoIHdpbGwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBpbmplY3RhYmxlLgogKiAgIFRoZSBmYWN0b3J5IGNhbiBjYWxsIGBpbmplY3RgIHRvIGFjY2VzcyB0aGUgYEluamVjdG9yYCBhbmQgcmVxdWVzdCBpbmplY3Rpb24gb2YgZGVwZW5kZW5jaWVzLgogKgogKiBAY29kZUdlbkFwaQogKi8KZnVuY3Rpb24gybXJtWRlZmluZUluamVjdGFibGUob3B0cykgewogICAgcmV0dXJuIHsKICAgICAgICB0b2tlbjogb3B0cy50b2tlbiwKICAgICAgICBwcm92aWRlZEluOiBvcHRzLnByb3ZpZGVkSW4gfHwgbnVsbCwKICAgICAgICBmYWN0b3J5OiBvcHRzLmZhY3RvcnksCiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgIH07Cn0KLyoqCiAqIENvbnN0cnVjdCBhbiBgSW5qZWN0b3JEZWZgIHdoaWNoIGNvbmZpZ3VyZXMgYW4gaW5qZWN0b3IuCiAqCiAqIFRoaXMgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGEgc3RhdGljIGluamVjdG9yIGRlZiAoYMm1aW5qYCkgZmllbGQgb24gYSB0eXBlLCB3aGljaCB3aWxsIHRoZW4gYmUgYW4KICogYEluamVjdG9yVHlwZWAuCiAqCiAqIE9wdGlvbnM6CiAqCiAqICogYGZhY3RvcnlgOiBhbiBgSW5qZWN0b3JUeXBlYCBpcyBhbiBpbnN0YW50aWFibGUgdHlwZSwgc28gYSB6ZXJvIGFyZ3VtZW50IGBmYWN0b3J5YCBmdW5jdGlvbiB0bwogKiAgIGNyZWF0ZSB0aGUgdHlwZSBtdXN0IGJlIHByb3ZpZGVkLiBJZiB0aGF0IGZhY3RvcnkgZnVuY3Rpb24gbmVlZHMgdG8gaW5qZWN0IGFyZ3VtZW50cywgaXQgY2FuCiAqICAgdXNlIHRoZSBgaW5qZWN0YCBmdW5jdGlvbi4KICogKiBgcHJvdmlkZXJzYDogYW4gb3B0aW9uYWwgYXJyYXkgb2YgcHJvdmlkZXJzIHRvIGFkZCB0byB0aGUgaW5qZWN0b3IuIEVhY2ggcHJvdmlkZXIgbXVzdAogKiAgIGVpdGhlciBoYXZlIGEgZmFjdG9yeSBvciBwb2ludCB0byBhIHR5cGUgd2hpY2ggaGFzIGEgYMm1cHJvdmAgc3RhdGljIHByb3BlcnR5ICh0aGUKICogICB0eXBlIG11c3QgYmUgYW4gYEluamVjdGFibGVUeXBlYCkuCiAqICogYGltcG9ydHNgOiBhbiBvcHRpb25hbCBhcnJheSBvZiBpbXBvcnRzIG9mIG90aGVyIGBJbmplY3RvclR5cGVgcyBvciBgSW5qZWN0b3JUeXBlV2l0aE1vZHVsZWBzCiAqICAgd2hvc2UgcHJvdmlkZXJzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgaW5qZWN0b3IuIExvY2FsbHkgcHJvdmlkZWQgdHlwZXMgd2lsbCBvdmVycmlkZQogKiAgIHByb3ZpZGVycyBmcm9tIGltcG9ydHMuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVJbmplY3RvcihvcHRpb25zKSB7CiAgICByZXR1cm4gewogICAgICAgIGZhY3Rvcnk6IG9wdGlvbnMuZmFjdG9yeSwKICAgICAgICBwcm92aWRlcnM6IG9wdGlvbnMucHJvdmlkZXJzIHx8IFtdLAogICAgICAgIGltcG9ydHM6IG9wdGlvbnMuaW1wb3J0cyB8fCBbXSwKICAgIH07Cn0KLyoqCiAqIFJlYWQgdGhlIGluamVjdGFibGUgZGVmIChgybVwcm92YCkgZm9yIGB0eXBlYCBpbiBhIHdheSB3aGljaCBpcyBpbW11bmUgdG8gYWNjaWRlbnRhbGx5IHJlYWRpbmcKICogaW5oZXJpdGVkIHZhbHVlLgogKgogKiBAcGFyYW0gdHlwZSBBIHR5cGUgd2hpY2ggbWF5IGhhdmUgaXRzIG93biAobm9uLWluaGVyaXRlZCkgYMm1cHJvdmAuCiAqLwpmdW5jdGlvbiBnZXRJbmplY3RhYmxlRGVmKHR5cGUpIHsKICAgIHJldHVybiBnZXRPd25EZWZpbml0aW9uKHR5cGUsIHR5cGVbTkdfUFJPVl9ERUZdKSB8fAogICAgICAgIGdldE93bkRlZmluaXRpb24odHlwZSwgdHlwZVtOR19JTkpFQ1RBQkxFX0RFRl0pOwp9Ci8qKgogKiBSZXR1cm4gYGRlZmAgb25seSBpZiBpdCBpcyBkZWZpbmVkIGRpcmVjdGx5IG9uIGB0eXBlYCBhbmQgaXMgbm90IGluaGVyaXRlZCBmcm9tIGEgYmFzZQogKiBjbGFzcyBvZiBgdHlwZWAuCiAqCiAqIFRoZSBmdW5jdGlvbiBgT2JqZWN0Lmhhc093blByb3BlcnR5YCBpcyBub3Qgc3VmZmljaWVudCB0byBkaXN0aW5ndWlzaCB0aGlzIGNhc2UgYmVjYXVzZSBpbiBvbGRlcgogKiBicm93c2VycyAoZS5nLiBJRTEwKSBzdGF0aWMgcHJvcGVydHkgaW5oZXJpdGFuY2UgaXMgaW1wbGVtZW50ZWQgYnkgY29weWluZyB0aGUgcHJvcGVydGllcy4KICoKICogSW5zdGVhZCwgdGhlIGRlZmluaXRpb24ncyBgdG9rZW5gIGlzIGNvbXBhcmVkIHRvIHRoZSBgdHlwZWAsIGFuZCBpZiB0aGV5IGRvbid0IG1hdGNoIHRoZW4gdGhlCiAqIHByb3BlcnR5IHdhcyBub3QgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCB3YXMgbGlrZWx5IGluaGVyaXRlZC4gVGhlIGRlZmluaXRpb24KICogaXMgb25seSByZXR1cm5lZCBpZiB0aGUgYHR5cGVgIG1hdGNoZXMgdGhlIGBkZWYudG9rZW5gLgogKi8KZnVuY3Rpb24gZ2V0T3duRGVmaW5pdGlvbih0eXBlLCBkZWYpIHsKICAgIHJldHVybiBkZWYgJiYgZGVmLnRva2VuID09PSB0eXBlID8gZGVmIDogbnVsbDsKfQovKioKICogUmVhZCB0aGUgaW5qZWN0YWJsZSBkZWYgKGDJtXByb3ZgKSBmb3IgYHR5cGVgIG9yIHJlYWQgdGhlIGDJtXByb3ZgIGZyb20gb25lIG9mIGl0cyBhbmNlc3RvcnMuCiAqCiAqIEBwYXJhbSB0eXBlIEEgdHlwZSB3aGljaCBtYXkgaGF2ZSBgybVwcm92YCwgdmlhIGluaGVyaXRhbmNlLgogKgogKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdjEwLCB3aGVyZSBhbiBlcnJvciB3aWxsIG9jY3VyIGluIHRoZSBzY2VuYXJpbyBpZiB3ZSBmaW5kIHRoZQogKiBgybVwcm92YCBvbiBhbiBhbmNlc3RvciBvbmx5LgogKi8KZnVuY3Rpb24gZ2V0SW5oZXJpdGVkSW5qZWN0YWJsZURlZih0eXBlKSB7CiAgICAvLyBTZWUgYGppdC9pbmplY3RhYmxlLnRzI2NvbXBpbGVJbmplY3RhYmxlYCBmb3IgY29udGV4dCBvbiBOR19QUk9WX0RFRl9GQUxMQkFDSy4KICAgIGNvbnN0IGRlZiA9IHR5cGUgJiYKICAgICAgICAodHlwZVtOR19QUk9WX0RFRl0gfHwgdHlwZVtOR19JTkpFQ1RBQkxFX0RFRl0gfHwKICAgICAgICAgICAgKHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdICYmIHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdKCkpKTsKICAgIGlmIChkZWYpIHsKICAgICAgICBjb25zdCB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHR5cGUpOwogICAgICAgIC8vIFRPRE8oRlctMTMwNyk6IFJlLWFkZCBuZ0Rldk1vZGUgd2hlbiBjbG9zdXJlIGNhbiBoYW5kbGUgaXQKICAgICAgICAvLyBuZ0Rldk1vZGUgJiYKICAgICAgICBjb25zb2xlLndhcm4oYERFUFJFQ0FURUQ6IERJIGlzIGluc3RhbnRpYXRpbmcgYSB0b2tlbiAiJHt0eXBlTmFtZX0iIHRoYXQgaW5oZXJpdHMgaXRzIEBJbmplY3RhYmxlIGRlY29yYXRvciBidXQgZG9lcyBub3QgcHJvdmlkZSBvbmUgaXRzZWxmLlxuYCArCiAgICAgICAgICAgIGBUaGlzIHdpbGwgYmVjb21lIGFuIGVycm9yIGluIHYxMC4gUGxlYXNlIGFkZCBASW5qZWN0YWJsZSgpIHRvIHRoZSAiJHt0eXBlTmFtZX0iIGNsYXNzLmApOwogICAgICAgIHJldHVybiBkZWY7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQovKiogR2V0cyB0aGUgbmFtZSBvZiBhIHR5cGUsIGFjY291bnRpbmcgZm9yIHNvbWUgY3Jvc3MtYnJvd3NlciBkaWZmZXJlbmNlcy4gKi8KZnVuY3Rpb24gZ2V0VHlwZU5hbWUodHlwZSkgewogICAgLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lYCBiZWhhdmVzIGRpZmZlcmVudGx5IGJldHdlZW4gSUUgYW5kIG90aGVyIGJyb3dzZXJzLiBJbiBtb3N0IGJyb3dzZXJzCiAgICAvLyBpdCdsbCBhbHdheXMgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBpdHNlbGYsIG5vIG1hdHRlciBob3cgbWFueSBvdGhlciBmdW5jdGlvbnMgaXQKICAgIC8vIGluaGVyaXRzIGZyb20uIE9uIElFIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgaXRzIG93biBgbmFtZWAgcHJvcGVydHksIGJ1dCBpdCB0YWtlcyBpdCBmcm9tCiAgICAvLyB0aGUgbG93ZXN0IGxldmVsIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uIEUuZy4gaWYgd2UgaGF2ZSBgY2xhc3MgRm9vIGV4dGVuZHMgUGFyZW50YCBtb3N0CiAgICAvLyBicm93c2VycyB3aWxsIGV2YWx1YXRlIGBGb28ubmFtZWAgdG8gYEZvb2Agd2hpbGUgSUUgd2lsbCByZXR1cm4gYFBhcmVudGAuIFdlIHdvcmsgYXJvdW5kCiAgICAvLyB0aGUgaXNzdWUgYnkgY29udmVydGluZyB0aGUgZnVuY3Rpb24gdG8gYSBzdHJpbmcgYW5kIHBhcnNpbmcgaXRzIG5hbWUgb3V0IHRoYXQgd2F5IHZpYSBhIHJlZ2V4LgogICAgaWYgKHR5cGUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkgewogICAgICAgIHJldHVybiB0eXBlLm5hbWU7CiAgICB9CiAgICBjb25zdCBtYXRjaCA9ICgnJyArIHR5cGUpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKTsKICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/ICcnIDogbWF0Y2hbMV07Cn0KLyoqCiAqIFJlYWQgdGhlIGluamVjdG9yIGRlZiB0eXBlIGluIGEgd2F5IHdoaWNoIGlzIGltbXVuZSB0byBhY2NpZGVudGFsbHkgcmVhZGluZyBpbmhlcml0ZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB0eXBlIHR5cGUgd2hpY2ggbWF5IGhhdmUgYW4gaW5qZWN0b3IgZGVmIChgybVpbmpgKQogKi8KZnVuY3Rpb24gZ2V0SW5qZWN0b3JEZWYodHlwZSkgewogICAgcmV0dXJuIHR5cGUgJiYgKHR5cGUuaGFzT3duUHJvcGVydHkoTkdfSU5KX0RFRikgfHwgdHlwZS5oYXNPd25Qcm9wZXJ0eShOR19JTkpFQ1RPUl9ERUYpKSA/CiAgICAgICAgdHlwZVtOR19JTkpfREVGXSA6CiAgICAgICAgbnVsbDsKfQpjb25zdCBOR19QUk9WX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXByb3Y6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CmNvbnN0IE5HX0lOSl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVpbmo6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAovLyB3aGljaCB3aWxsIGJyZWFrIGluaGVyaXRpbmcgdGhlIGluamVjdGFibGUgZGVmaW5pdGlvbiBmcm9tIGEgZ3JhbmRwYXJlbnQgdGhyb3VnaCBhbgovLyB1bmRlY29yYXRlZCBwYXJlbnQgY2xhc3MuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IGRlZmluaW5nIGEgZmFsbGJhY2sgbWV0aG9kIHdoaWNoIHdpbGwgYmUKLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSBhIHByb2JsZW0gaW4gSklUIG1vZGUsIGJlY2F1c2UgaW4KLy8gQU9UIFR5cGVTY3JpcHQgc2VlbXMgdG8gaGF2ZSBhIHdvcmthcm91bmQgZm9yIHN0YXRpYyBwcm9wZXJ0aWVzLiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhbgovLyB1bmRlY29yYXRlZCBwYXJlbnQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiB2MTAsIHRoaXMgY2FuIHNhZmVseSBiZSByZW1vdmVkLgpjb25zdCBOR19QUk9WX0RFRl9GQUxMQkFDSyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXByb3ZGYWxsYmFjazogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLy8gV2UgbmVlZCB0byBrZWVwIHRoZXNlIGFyb3VuZCBzbyB3ZSBjYW4gcmVhZCBvZmYgb2xkIGRlZnMgaWYgbmV3IGRlZnMgYXJlIHVuYXZhaWxhYmxlCmNvbnN0IE5HX0lOSkVDVEFCTEVfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0YWJsZURlZjogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKY29uc3QgTkdfSU5KRUNUT1JfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0b3JEZWY6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCmZ1bmN0aW9uIHN0cmluZ2lmeSh0b2tlbikgewogICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gdG9rZW47CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHsKICAgICAgICByZXR1cm4gJ1snICsgdG9rZW4ubWFwKHN0cmluZ2lmeSkuam9pbignLCAnKSArICddJzsKICAgIH0KICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuICcnICsgdG9rZW47CiAgICB9CiAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHsKICAgICAgICByZXR1cm4gYCR7dG9rZW4ub3ZlcnJpZGRlbk5hbWV9YDsKICAgIH0KICAgIGlmICh0b2tlbi5uYW1lKSB7CiAgICAgICAgcmV0dXJuIGAke3Rva2VuLm5hbWV9YDsKICAgIH0KICAgIGNvbnN0IHJlcyA9IHRva2VuLnRvU3RyaW5nKCk7CiAgICBpZiAocmVzID09IG51bGwpIHsKICAgICAgICByZXR1cm4gJycgKyByZXM7CiAgICB9CiAgICBjb25zdCBuZXdMaW5lSW5kZXggPSByZXMuaW5kZXhPZignXG4nKTsKICAgIHJldHVybiBuZXdMaW5lSW5kZXggPT09IC0xID8gcmVzIDogcmVzLnN1YnN0cmluZygwLCBuZXdMaW5lSW5kZXgpOwp9Ci8qKgogKiBDb25jYXRlbmF0ZXMgdHdvIHN0cmluZ3Mgd2l0aCBzZXBhcmF0b3IsIGFsbG9jYXRpbmcgbmV3IHN0cmluZ3Mgb25seSB3aGVuIG5lY2Vzc2FyeS4KICoKICogQHBhcmFtIGJlZm9yZSBiZWZvcmUgc3RyaW5nLgogKiBAcGFyYW0gc2VwYXJhdG9yIHNlcGFyYXRvciBzdHJpbmcuCiAqIEBwYXJhbSBhZnRlciBhZnRlciBzdHJpbmcuCiAqIEByZXR1cm5zIGNvbmNhdGVuYXRlZCBzdHJpbmcuCiAqLwpmdW5jdGlvbiBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKGJlZm9yZSwgYWZ0ZXIpIHsKICAgIHJldHVybiAoYmVmb3JlID09IG51bGwgfHwgYmVmb3JlID09PSAnJykgPwogICAgICAgIChhZnRlciA9PT0gbnVsbCA/ICcnIDogYWZ0ZXIpIDoKICAgICAgICAoKGFmdGVyID09IG51bGwgfHwgYWZ0ZXIgPT09ICcnKSA/IGJlZm9yZSA6IGJlZm9yZSArICcgJyArIGFmdGVyKTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9fZm9yd2FyZF9yZWZfXyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBfX2ZvcndhcmRfcmVmX186IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKgogKiBBbGxvd3MgdG8gcmVmZXIgdG8gcmVmZXJlbmNlcyB3aGljaCBhcmUgbm90IHlldCBkZWZpbmVkLgogKgogKiBGb3IgaW5zdGFuY2UsIGBmb3J3YXJkUmVmYCBpcyB1c2VkIHdoZW4gdGhlIGB0b2tlbmAgd2hpY2ggd2UgbmVlZCB0byByZWZlciB0byBmb3IgdGhlIHB1cnBvc2VzIG9mCiAqIERJIGlzIGRlY2xhcmVkLCBidXQgbm90IHlldCBkZWZpbmVkLiBJdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGUgYHRva2VuYCB3aGljaCB3ZSB1c2Ugd2hlbiBjcmVhdGluZwogKiBhIHF1ZXJ5IGlzIG5vdCB5ZXQgZGVmaW5lZC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZl9zcGVjLnRzIHJlZ2lvbj0nZm9yd2FyZF9yZWYnfQogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGZvcndhcmRSZWZGbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9yd2FyZFJlZihmb3J3YXJkUmVmRm4pIHsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZm9yd2FyZFJlZkZuKSkpLl9fZm9yd2FyZF9yZWZfXyA9IGZvcndhcmRSZWY7CiAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGZvcndhcmRSZWZGbikpKS50b1N0cmluZyA9ICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gc3RyaW5naWZ5KHRoaXMoKSk7CiAgICB9KTsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChmb3J3YXJkUmVmRm4pKSkpKTsKfQovKioKICogTGF6aWx5IHJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIHZhbHVlIGZyb20gYSBmb3J3YXJkUmVmLgogKgogKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2ZvcndhcmRfcmVmL2ZvcndhcmRfcmVmX3NwZWMudHMgcmVnaW9uPSdyZXNvbHZlX2ZvcndhcmRfcmVmJ30KICoKICogQHNlZSBgZm9yd2FyZFJlZmAKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZih0eXBlKSB7CiAgICByZXR1cm4gaXNGb3J3YXJkUmVmKHR5cGUpID8gdHlwZSgpIDogdHlwZTsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyB3cmFwcGVkIGJ5IGEgYGZvcndhcmRSZWZgLgogKiBAcGFyYW0gez99IGZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0ZvcndhcmRSZWYoZm4pIHsKICAgIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgZm4uaGFzT3duUHJvcGVydHkoX19mb3J3YXJkX3JlZl9fKSAmJgogICAgICAgIGZuLl9fZm9yd2FyZF9yZWZfXyA9PT0gZm9yd2FyZFJlZjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBfX2dsb2JhbFRoaXMgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpczsKY29uc3QgX193aW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c7CmNvbnN0IF9fc2VsZiA9IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmCiAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiYgc2VsZjsKY29uc3QgX19nbG9iYWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWw7Ci8vIEFsd2F5cyB1c2UgX19nbG9iYWxUaGlzIGlmIGF2YWlsYWJsZSwgd2hpY2ggaXMgdGhlIHNwZWMtZGVmaW5lZCBnbG9iYWwgdmFyaWFibGUgYWNyb3NzIGFsbAovLyBlbnZpcm9ubWVudHMsIHRoZW4gZmFsbGJhY2sgdG8gX19nbG9iYWwgZmlyc3QsIGJlY2F1c2UgaW4gTm9kZSB0ZXN0cyBib3RoIF9fZ2xvYmFsIGFuZAovLyBfX3dpbmRvdyBtYXkgYmUgZGVmaW5lZCBhbmQgX2dsb2JhbCBzaG91bGQgYmUgX19nbG9iYWwgaW4gdGhhdCBjYXNlLgpjb25zdCBfZ2xvYmFsID0gX19nbG9iYWxUaGlzIHx8IF9fZ2xvYmFsIHx8IF9fd2luZG93IHx8IF9fc2VsZjsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KdmFyIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZTsKKGZ1bmN0aW9uIChSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUpIHsKICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbIlRva2VuIl0gPSAwXSA9ICJUb2tlbiI7CiAgICBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlWyJBdHRyaWJ1dGUiXSA9IDFdID0gIkF0dHJpYnV0ZSI7CiAgICBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlWyJDaGFuZ2VEZXRlY3RvclJlZiJdID0gMl0gPSAiQ2hhbmdlRGV0ZWN0b3JSZWYiOwogICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVsiSW52YWxpZCJdID0gM10gPSAiSW52YWxpZCI7Cn0pKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSB8fCAoUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlID0ge30pKTsKdmFyIFIzRmFjdG9yeVRhcmdldDsKKGZ1bmN0aW9uIChSM0ZhY3RvcnlUYXJnZXQpIHsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkRpcmVjdGl2ZSJdID0gMF0gPSAiRGlyZWN0aXZlIjsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkNvbXBvbmVudCJdID0gMV0gPSAiQ29tcG9uZW50IjsKICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkluamVjdGFibGUiXSA9IDJdID0gIkluamVjdGFibGUiOwogICAgUjNGYWN0b3J5VGFyZ2V0W1IzRmFjdG9yeVRhcmdldFsiUGlwZSJdID0gM10gPSAiUGlwZSI7CiAgICBSM0ZhY3RvcnlUYXJnZXRbUjNGYWN0b3J5VGFyZ2V0WyJOZ01vZHVsZSJdID0gNF0gPSAiTmdNb2R1bGUiOwp9KShSM0ZhY3RvcnlUYXJnZXQgfHwgKFIzRmFjdG9yeVRhcmdldCA9IHt9KSk7CnZhciBWaWV3RW5jYXBzdWxhdGlvbjsKKGZ1bmN0aW9uIChWaWV3RW5jYXBzdWxhdGlvbikgewogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIkVtdWxhdGVkIl0gPSAwXSA9ICJFbXVsYXRlZCI7CiAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvblsiTmF0aXZlIl0gPSAxXSA9ICJOYXRpdmUiOwogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIk5vbmUiXSA9IDJdID0gIk5vbmUiOwogICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIlNoYWRvd0RvbSJdID0gM10gPSAiU2hhZG93RG9tIjsKfSkoVmlld0VuY2Fwc3VsYXRpb24gfHwgKFZpZXdFbmNhcHN1bGF0aW9uID0ge30pKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KZnVuY3Rpb24gZ2V0Q29tcGlsZXJGYWNhZGUoKSB7CiAgICBjb25zdCBnbG9iYWxOZyA9IF9nbG9iYWxbJ25nJ107CiAgICBpZiAoIWdsb2JhbE5nIHx8ICFnbG9iYWxOZy7JtWNvbXBpbGVyRmFjYWRlKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmd1bGFyIEpJVCBjb21waWxhdGlvbiBmYWlsZWQ6ICdAYW5ndWxhci9jb21waWxlcicgbm90IGxvYWRlZCFcbmAgKwogICAgICAgICAgICBgICAtIEpJVCBjb21waWxhdGlvbiBpcyBkaXNjb3VyYWdlZCBmb3IgcHJvZHVjdGlvbiB1c2UtY2FzZXMhIENvbnNpZGVyIEFPVCBtb2RlIGluc3RlYWQuXG5gICsKICAgICAgICAgICAgYCAgLSBEaWQgeW91IGJvb3RzdHJhcCB1c2luZyAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJyBvciAnQGFuZ3VsYXIvcGxhdGZvcm0tc2VydmVyJz9cbmAgKwogICAgICAgICAgICBgICAtIEFsdGVybmF0aXZlbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0ICJAYW5ndWxhci9jb21waWxlciI7JyBiZWZvcmUgYm9vdHN0cmFwcGluZy5gKTsKICAgIH0KICAgIHJldHVybiBnbG9iYWxOZy7JtWNvbXBpbGVyRmFjYWRlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ZpZWxkcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX0NPTVBfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IMm1Y21wOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX0RJUl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVkaXI6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfUElQRV9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVwaXBlOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX01PRF9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVtb2Q6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfTE9DX0lEX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWxvYzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOR19GQUNUT1JZX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWZhYzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKLy8gVE9ETyhtaXNrbyk6IFRoaXMgaXMgd3JvbmcuIFRoZSBOR19FTEVNRU5UX0lEIHNob3VsZCBuZXZlciBiZSBtaW5pZmllZC4KLyoqCiAqIElmIGEgZGlyZWN0aXZlIGlzIGRpUHVibGljLCBibG9vbUFkZCBzZXRzIGEgcHJvcGVydHkgb24gdGhlIHR5cGUgd2l0aCB0aGlzIGNvbnN0YW50IGFzCiAqIHRoZSBrZXkgYW5kIHRoZSBkaXJlY3RpdmUncyB1bmlxdWUgSUQgYXMgdGhlIHZhbHVlLiBUaGlzIGFsbG93cyB1cyB0byBtYXAgZGlyZWN0aXZlcyB0byB0aGVpcgogKiBibG9vbSBmaWx0ZXIgYml0IGZvciBESS4KICogQHR5cGUgez99CiAqLwpjb25zdCBOR19FTEVNRU5UX0lEID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IF9fTkdfRUxFTUVOVF9JRF9fOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBuZ0Rldk1vZGVSZXNldFBlcmZDb3VudGVycygpIHsKICAgIGNvbnN0IGxvY2F0aW9uU3RyaW5nID0gdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyA/IGxvY2F0aW9uLnRvU3RyaW5nKCkgOiAnJzsKICAgIGNvbnN0IG5ld0NvdW50ZXJzID0gewogICAgICAgIG5hbWVkQ29uc3RydWN0b3JzOiBsb2NhdGlvblN0cmluZy5pbmRleE9mKCduZ0Rldk1vZGU9bmFtZWRDb25zdHJ1Y3RvcnMnKSAhPSAtMSwKICAgICAgICBmaXJzdENyZWF0ZVBhc3M6IDAsCiAgICAgICAgdE5vZGU6IDAsCiAgICAgICAgdFZpZXc6IDAsCiAgICAgICAgcmVuZGVyZXJDcmVhdGVUZXh0Tm9kZTogMCwKICAgICAgICByZW5kZXJlclNldFRleHQ6IDAsCiAgICAgICAgcmVuZGVyZXJDcmVhdGVFbGVtZW50OiAwLAogICAgICAgIHJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcjogMCwKICAgICAgICByZW5kZXJlclNldEF0dHJpYnV0ZTogMCwKICAgICAgICByZW5kZXJlclJlbW92ZUF0dHJpYnV0ZTogMCwKICAgICAgICByZW5kZXJlclNldFByb3BlcnR5OiAwLAogICAgICAgIHJlbmRlcmVyU2V0Q2xhc3NOYW1lOiAwLAogICAgICAgIHJlbmRlcmVyQWRkQ2xhc3M6IDAsCiAgICAgICAgcmVuZGVyZXJSZW1vdmVDbGFzczogMCwKICAgICAgICByZW5kZXJlclNldFN0eWxlOiAwLAogICAgICAgIHJlbmRlcmVyUmVtb3ZlU3R5bGU6IDAsCiAgICAgICAgcmVuZGVyZXJEZXN0cm95OiAwLAogICAgICAgIHJlbmRlcmVyRGVzdHJveU5vZGU6IDAsCiAgICAgICAgcmVuZGVyZXJNb3ZlTm9kZTogMCwKICAgICAgICByZW5kZXJlclJlbW92ZU5vZGU6IDAsCiAgICAgICAgcmVuZGVyZXJBcHBlbmRDaGlsZDogMCwKICAgICAgICByZW5kZXJlckluc2VydEJlZm9yZTogMCwKICAgICAgICByZW5kZXJlckNyZWF0ZUNvbW1lbnQ6IDAsCiAgICB9OwogICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nRGV2TW9kZSBhcyBbJ25nRGV2TW9kZSddIGZvciBjbG9zdXJlLgogICAgY29uc3QgYWxsb3dOZ0Rldk1vZGVUcnVlID0gbG9jYXRpb25TdHJpbmcuaW5kZXhPZignbmdEZXZNb2RlPWZhbHNlJykgPT09IC0xOwogICAgX2dsb2JhbFsnbmdEZXZNb2RlJ10gPSBhbGxvd05nRGV2TW9kZVRydWUgJiYgbmV3Q291bnRlcnM7CiAgICByZXR1cm4gbmV3Q291bnRlcnM7Cn0KLyoqCiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgYG5nRGV2TW9kZWAgaGFzIGJlZW4gc2V0LiBJZiB5ZXMsCiAqIHRoZW4gd2UgaG9ub3IgaXQsIG90aGVyd2lzZSB3ZSBkZWZhdWx0IHRvIGRldiBtb2RlIHdpdGggYWRkaXRpb25hbCBjaGVja3MuCiAqCiAqIFRoZSBpZGVhIGlzIHRoYXQgdW5sZXNzIHdlIGFyZSBkb2luZyBwcm9kdWN0aW9uIGJ1aWxkIHdoZXJlIHdlIGV4cGxpY2l0bHkKICogc2V0IGBuZ0Rldk1vZGUgPT0gZmFsc2VgIHdlIHNob3VsZCBiZSBoZWxwaW5nIHRoZSBkZXZlbG9wZXIgYnkgcHJvdmlkaW5nCiAqIGFzIG11Y2ggZWFybHkgd2FybmluZyBhbmQgZXJyb3JzIGFzIHBvc3NpYmxlLgogKgogKiBgybXJtWRlZmluZUNvbXBvbmVudGAgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZSBhbnkgY29tcG9uZW50IHRlbXBsYXRlIGZ1bmN0aW9ucwogKiAoYW5kIHRodXMgSXZ5IGluc3RydWN0aW9ucyksIHNvIGEgc2luZ2xlIGluaXRpYWxpemF0aW9uIHRoZXJlIGlzIHN1ZmZpY2llbnQgdG8gZW5zdXJlIG5nRGV2TW9kZQogKiBpcyBkZWZpbmVkIGZvciB0aGUgZW50aXJlIGluc3RydWN0aW9uIHNldC4KICoKICogV2hlbiB1c2luZyBjaGVja2luZyBgbmdEZXZNb2RlYCBvbiB0b3BsZXZlbCwgYWx3YXlzIGluaXQgaXQgYmVmb3JlIHJlZmVyZW5jaW5nIGl0CiAqIChlLmcuIGAoKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiYgaW5pdE5nRGV2TW9kZSgpKWApLCBvdGhlcndpc2UgeW91IGNhbgogKiAgZ2V0IGEgYFJlZmVyZW5jZUVycm9yYCBsaWtlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMxNTk1LgogKgogKiBEZXRhaWxzIG9uIHBvc3NpYmxlIHZhbHVlcyBmb3IgYG5nRGV2TW9kZWAgY2FuIGJlIGZvdW5kIG9uIGl0cyBkb2NzdHJpbmcuCiAqCiAqIE5PVEU6CiAqIC0gY2hhbmdlcyB0byB0aGUgYG5nRGV2TW9kZWAgbmFtZSBtdXN0IGJlIHN5bmNlZCB3aXRoIGBjb21waWxlci1jbGkvc3JjL3Rvb2xpbmcudHNgLgogKi8KZnVuY3Rpb24gaW5pdE5nRGV2TW9kZSgpIHsKICAgIC8vIFRoZSBiZWxvdyBjaGVja3MgYXJlIHRvIGVuc3VyZSB0aGF0IGNhbGxpbmcgYGluaXROZ0Rldk1vZGVgIG11bHRpcGxlIHRpbWVzIGRvZXMgbm90CiAgICAvLyByZXNldCB0aGUgY291bnRlcnMuCiAgICAvLyBJZiB0aGUgYG5nRGV2TW9kZWAgaXMgbm90IGFuIG9iamVjdCwgdGhlbiBpdCBtZWFucyB3ZSBoYXZlIG5vdCBjcmVhdGVkIHRoZSBwZXJmIGNvdW50ZXJzCiAgICAvLyB5ZXQuCiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7CiAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgIT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZVJlc2V0UGVyZkNvdW50ZXJzKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAhIW5nRGV2TW9kZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaW5qZWN0aW9uX3Rva2VuLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDcmVhdGVzIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIERJIFByb3ZpZGVyLgogKgogKiBVc2UgYW4gYEluamVjdGlvblRva2VuYCB3aGVuZXZlciB0aGUgdHlwZSB5b3UgYXJlIGluamVjdGluZyBpcyBub3QgcmVpZmllZCAoZG9lcyBub3QgaGF2ZSBhCiAqIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24pIHN1Y2ggYXMgd2hlbiBpbmplY3RpbmcgYW4gaW50ZXJmYWNlLCBjYWxsYWJsZSB0eXBlLCBhcnJheSBvcgogKiBwYXJhbWV0ZXJpemVkIHR5cGUuCiAqCiAqIGBJbmplY3Rpb25Ub2tlbmAgaXMgcGFyYW1ldGVyaXplZCBvbiBgVGAgd2hpY2ggaXMgdGhlIHR5cGUgb2Ygb2JqZWN0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYnkKICogdGhlIGBJbmplY3RvcmAuIFRoaXMgcHJvdmlkZXMgYWRkaXRpb25hbCBsZXZlbCBvZiB0eXBlIHNhZmV0eS4KICoKICogYGBgCiAqIGludGVyZmFjZSBNeUludGVyZmFjZSB7Li4ufQogKiB2YXIgbXlJbnRlcmZhY2UgPSBpbmplY3Rvci5nZXQobmV3IEluamVjdGlvblRva2VuPE15SW50ZXJmYWNlPignU29tZVRva2VuJykpOwogKiAvLyBteUludGVyZmFjZSBpcyBpbmZlcnJlZCB0byBiZSBNeUludGVyZmFjZS4KICogYGBgCiAqCiAqIFdoZW4gY3JlYXRpbmcgYW4gYEluamVjdGlvblRva2VuYCwgeW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIHJldHVybnMKICogKHBvc3NpYmx5IGJ5IGNyZWF0aW5nKSBhIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlcml6ZWQgdHlwZSBgVGAuIFRoaXMgc2V0cyB1cCB0aGUKICogYEluamVjdGlvblRva2VuYCB1c2luZyB0aGlzIGZhY3RvcnkgYXMgYSBwcm92aWRlciBhcyBpZiBpdCB3YXMgZGVmaW5lZCBleHBsaWNpdGx5IGluIHRoZQogKiBhcHBsaWNhdGlvbidzIHJvb3QgaW5qZWN0b3IuIElmIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLCB3aGljaCB0YWtlcyB6ZXJvIGFyZ3VtZW50cywgbmVlZHMgdG8gaW5qZWN0CiAqIGRlcGVuZGVuY2llcywgaXQgY2FuIGRvIHNvIHVzaW5nIHRoZSBgaW5qZWN0YCBmdW5jdGlvbi4gU2VlIGJlbG93IGZvciBhbiBleGFtcGxlLgogKgogKiBBZGRpdGlvbmFsbHksIGlmIGEgYGZhY3RvcnlgIGlzIHNwZWNpZmllZCB5b3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgYHByb3ZpZGVkSW5gIG9wdGlvbiwgd2hpY2gKICogb3ZlcnJpZGVzIHRoZSBhYm92ZSBiZWhhdmlvciBhbmQgbWFya3MgdGhlIHRva2VuIGFzIGJlbG9uZ2luZyB0byBhIHBhcnRpY3VsYXIgYFxATmdNb2R1bGVgLiBBcwogKiBtZW50aW9uZWQgYWJvdmUsIGAncm9vdCdgIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBgcHJvdmlkZWRJbmAuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgQmFzaWMgRXhhbXBsZQogKgogKiAjIyMgUGxhaW4gSW5qZWN0aW9uVG9rZW4KICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdJbmplY3Rpb25Ub2tlbid9CiAqCiAqICMjIyBUcmVlLXNoYWthYmxlIEluamVjdGlvblRva2VuCiAqCiAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0nU2hha2FibGVJbmplY3Rpb25Ub2tlbid9CiAqCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBJbmplY3Rpb25Ub2tlbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2Rlc2MKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAqLwogICAgY29uc3RydWN0b3IoX2Rlc2MsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLl9kZXNjID0gX2Rlc2M7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMubmdNZXRhZGF0YU5hbWUgPSAnSW5qZWN0aW9uVG9rZW4nOwogICAgICAgIHRoaXMuybVwcm92ID0gdW5kZWZpbmVkOwogICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBoYWNrIHRvIGFzc2lnbiBfX05HX0VMRU1FTlRfSURfXyB0byB0aGlzIGluc3RhbmNlLgogICAgICAgICAgICAvLyBfX05HX0VMRU1FTlRfSURfXyBpcyBVc2VkIGJ5IEl2eSB0byBkZXRlcm1pbmUgYmxvb20gZmlsdGVyIGlkLgogICAgICAgICAgICAvLyBXZSBhcmUgdXNpbmcgaXQgdG8gYXNzaWduIGAtMWAgd2hpY2ggaXMgdXNlZCB0byBpZGVudGlmeSBgSW5qZWN0b3JgLgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuX19OR19FTEVNRU5UX0lEX18gPSBvcHRpb25zOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdGhpcy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICAgICAgICAgICAgICB0b2tlbjogdGhpcywKICAgICAgICAgICAgICAgIHByb3ZpZGVkSW46IG9wdGlvbnMucHJvdmlkZWRJbiB8fCAncm9vdCcsCiAgICAgICAgICAgICAgICBmYWN0b3J5OiBvcHRpb25zLmZhY3RvcnksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIGBJbmplY3Rpb25Ub2tlbiAke3RoaXMuX2Rlc2N9YDsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaW5qZWN0b3JfY29tcGF0aWJpbGl0eS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gSW5qZWN0aW9uVG9rZW4gdGhhdCBnZXRzIHRoZSBjdXJyZW50IGBJbmplY3RvcmAgZm9yIGBjcmVhdGVJbmplY3RvcigpYC1zdHlsZSBpbmplY3RvcnMuCiAqCiAqIFJlcXVlc3RpbmcgdGhpcyB0b2tlbiBpbnN0ZWFkIG9mIGBJbmplY3RvcmAgYWxsb3dzIGBTdGF0aWNJbmplY3RvcmAgdG8gYmUgdHJlZS1zaGFrZW4gZnJvbSBhCiAqIHByb2plY3QuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSU5KRUNUT1IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0lOSkVDVE9SJywgKC8qKiBAdHlwZSB7P30gKi8gKC0xKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IF9USFJPV19JRl9OT1RfRk9VTkQgPSB7fTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBUSFJPV19JRl9OT1RfRk9VTkQgPSBfVEhST1dfSUZfTk9UX0ZPVU5EOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX1RFTVBfVE9LRU5fUEFUSCA9ICduZ1RlbXBUb2tlblBhdGgnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5HX1RPS0VOX1BBVEggPSAnbmdUb2tlblBhdGgnOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5FV19MSU5FID0gL1xuL2dtOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5PX05FV19MSU5FID0gJ8m1JzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTT1VSQ0UgPSAnX19zb3VyY2UnOwpjb25zdCDJtTAkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVVNFX1ZBTFVFID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IHByb3ZpZGU6IFN0cmluZywgdXNlVmFsdWU6IMm1MCQxIH0pOwovKioKICogQ3VycmVudCBpbmplY3RvciB2YWx1ZSB1c2VkIGJ5IGBpbmplY3RgLgogKiAtIGB1bmRlZmluZWRgOiBpdCBpcyBhbiBlcnJvciB0byBjYWxsIGBpbmplY3RgCiAqIC0gYG51bGxgOiBgaW5qZWN0YCBjYW4gYmUgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbmplY3RvciAobGltcC1tb2RlKS4KICogLSBJbmplY3RvciBpbnN0YW5jZTogVXNlIHRoZSBpbmplY3RvciBmb3IgcmVzb2x1dGlvbi4KICogQHR5cGUgez99CiAqLwpsZXQgX2N1cnJlbnRJbmplY3RvciA9IHVuZGVmaW5lZDsKLyoqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEN1cnJlbnRJbmplY3RvcihpbmplY3RvcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWVyID0gX2N1cnJlbnRJbmplY3RvcjsKICAgIF9jdXJyZW50SW5qZWN0b3IgPSBpbmplY3RvcjsKICAgIHJldHVybiBmb3JtZXI7Cn0KLyoqCiAqIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0LgogKgogKiBCeSBkZWZhdWx0LCBpdCBpcyBgaW5qZWN0SW5qZWN0b3JPbmx5YCwgd2hpY2ggbWFrZXMgaXQgYEluamVjdG9yYC1vbmx5IGF3YXJlLiBJdCBjYW4gYmUgY2hhbmdlZAogKiB0byBgZGlyZWN0aXZlSW5qZWN0YCwgd2hpY2ggYnJpbmdzIGluIHRoZSBgTm9kZUluamVjdG9yYCBzeXN0ZW0gb2YgaXZ5LiBJdCBpcyBkZXNpZ25lZCB0aGlzCiAqIHdheSBmb3IgdHdvIHJlYXNvbnM6CiAqICAxLiBgSW5qZWN0b3JgIHNob3VsZCBub3QgZGVwZW5kIG9uIGl2eSBsb2dpYy4KICogIDIuIFRvIG1haW50YWluIHRyZWUgc2hha2UtYWJpbGl0eSB3ZSBkb24ndCB3YW50IHRvIGJyaW5nIGluIHVubmVjZXNzYXJ5IGNvZGUuCiAqIEB0eXBlIHs/fQogKi8KbGV0IF9pbmplY3RJbXBsZW1lbnRhdGlvbjsKLyoqCiAqIFNldHMgdGhlIGN1cnJlbnQgaW5qZWN0IGltcGxlbWVudGF0aW9uLgogKiBAcGFyYW0gez99IGltcGwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEluamVjdEltcGxlbWVudGF0aW9uKGltcGwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzID0gX2luamVjdEltcGxlbWVudGF0aW9uOwogICAgX2luamVjdEltcGxlbWVudGF0aW9uID0gaW1wbDsKICAgIHJldHVybiBwcmV2aW91czsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez89fSBmbGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5qZWN0SW5qZWN0b3JPbmx5KHRva2VuLCBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQpIHsKICAgIGlmIChfY3VycmVudEluamVjdG9yID09PSB1bmRlZmluZWQpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdCgpIG11c3QgYmUgY2FsbGVkIGZyb20gYW4gaW5qZWN0aW9uIGNvbnRleHRgKTsKICAgIH0KICAgIGVsc2UgaWYgKF9jdXJyZW50SW5qZWN0b3IgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCB1bmRlZmluZWQsIGZsYWdzKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBfY3VycmVudEluamVjdG9yLmdldCh0b2tlbiwgZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCA/IG51bGwgOiB1bmRlZmluZWQsIGZsYWdzKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez89fSBmbGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWluamVjdCh0b2tlbiwgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICByZXR1cm4gKF9pbmplY3RJbXBsZW1lbnRhdGlvbiB8fCBpbmplY3RJbmplY3Rvck9ubHkpKHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKSwgZmxhZ3MpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGEgZmFjdG9yeSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgYQogKiBwYXJ0aWN1bGFyIGNsYXNzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFsbG93cyB0aGUgYWN0dWFsIGVycm9yIG1lc3NhZ2UgdG8gYmUgb3B0aW1pemVkIGF3YXkgd2hlbiBuZ0Rldk1vZGUgaXMgdHVybmVkCiAqIG9mZiwgc2F2aW5nIGJ5dGVzIG9mIGdlbmVyYXRlZCBjb2RlIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBhIGdvb2QgZXhwZXJpZW5jZSBpbiBkZXYgbW9kZS4KICoKICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdCBtZW50aW9uZWQgaGVyZSwgYnV0IHdpbGwgYmUgaW4gdGhlIGdlbmVyYXRlZCBmYWN0b3J5IGZ1bmN0aW9uIG5hbWUKICogYW5kIHRodXMgaW4gdGhlIHN0YWNrIHRyYWNlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWludmFsaWRGYWN0b3J5RGVwKGluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtc2cgPSBuZ0Rldk1vZGUgPwogICAgICAgIGBUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQW5ndWxhciBEZXBlbmRlbmN5IEluamVjdGlvbiBiZWNhdXNlIGl0cyBkZXBlbmRlbmN5IGF0IGluZGV4ICR7aW5kZXh9IG9mIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcyBpbnZhbGlkLgpUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGRlcGVuZGVuY3kgdHlwZSBpcyBhIHByaW1pdGl2ZSBsaWtlIGEgc3RyaW5nIG9yIGlmIGFuIGFuY2VzdG9yIG9mIHRoaXMgY2xhc3MgaXMgbWlzc2luZyBhbiBBbmd1bGFyIGRlY29yYXRvci4KClBsZWFzZSBjaGVjayB0aGF0IDEpIHRoZSB0eXBlIGZvciB0aGUgcGFyYW1ldGVyIGF0IGluZGV4ICR7aW5kZXh9IGlzIGNvcnJlY3QgYW5kIDIpIHRoZSBjb3JyZWN0IEFuZ3VsYXIgZGVjb3JhdG9ycyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBjbGFzcyBhbmQgaXRzIGFuY2VzdG9ycy5gIDoKICAgICAgICAnaW52YWxpZCc7CiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQovKioKICogSW5qZWN0cyBhIHRva2VuIGZyb20gdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5qZWN0b3IuCiAqCiAqIE11c3QgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIGZhY3RvcnkgZnVuY3Rpb24gc3VjaCBhcyBvbmUgZGVmaW5lZCBmb3IgYW4KICogYEluamVjdGlvblRva2VuYC4gVGhyb3dzIGFuIGVycm9yIGlmIG5vdCBjYWxsZWQgZnJvbSBzdWNoIGEgY29udGV4dC4KICoKICogV2l0aGluIHN1Y2ggYSBmYWN0b3J5IGZ1bmN0aW9uLCB1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIHJlcXVlc3QgaW5qZWN0aW9uIG9mIGEgZGVwZW5kZW5jeQogKiBpcyBmYXN0ZXIgYW5kIG1vcmUgdHlwZS1zYWZlIHRoYW4gcHJvdmlkaW5nIGFuIGFkZGl0aW9uYWwgYXJyYXkgb2YgZGVwZW5kZW5jaWVzCiAqIChhcyBoYXMgYmVlbiBjb21tb24gd2l0aCBgdXNlRmFjdG9yeWAgcHJvdmlkZXJzKS4KICoKICogXEBwYXJhbSB0b2tlbiBUaGUgaW5qZWN0aW9uIHRva2VuIGZvciB0aGUgZGVwZW5kZW5jeSB0byBiZSBpbmplY3RlZC4KICogXEBwYXJhbSBmbGFncyBPcHRpb25hbCBmbGFncyB0aGF0IGNvbnRyb2wgaG93IGluamVjdGlvbiBpcyBleGVjdXRlZC4KICogVGhlIGZsYWdzIGNvcnJlc3BvbmQgdG8gaW5qZWN0aW9uIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKICogcGFyYW1ldGVyIGRlY29yYXRvcnMgYFxASG9zdGAsIGBcQFNlbGZgLCBgXEBTa2lwU2VmYCwgYW5kIGBcQE9wdGlvbmFsYC4KICogXEByZXR1cm4gVHJ1ZSBpZiBpbmplY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgbnVsbCBvdGhlcndpc2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgRXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J1NoYWthYmxlSW5qZWN0aW9uVG9rZW4nfQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IGluamVjdCA9IMm1ybVpbmplY3Q7Ci8qKgogKiBJbmplY3RzIGByb290YCB0b2tlbnMgaW4gbGltcCBtb2RlLgogKgogKiBJZiBubyBpbmplY3RvciBleGlzdHMsIHdlIGNhbiBzdGlsbCBpbmplY3QgdHJlZS1zaGFrYWJsZSBwcm92aWRlcnMgd2hpY2ggaGF2ZSBgcHJvdmlkZWRJbmAgc2V0IHRvCiAqIGAicm9vdCJgLiBUaGlzIGlzIGtub3duIGFzIHRoZSBsaW1wIG1vZGUgaW5qZWN0aW9uLiBJbiBzdWNoIGNhc2UgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKICogYEluamVjdGFibGVEZWZgLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRva2VuCiAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZQogKiBAcGFyYW0gez99IGZsYWdzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RSb290TGltcE1vZGUodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmplY3RhYmxlRGVmID0gZ2V0SW5qZWN0YWJsZURlZih0b2tlbik7CiAgICBpZiAoaW5qZWN0YWJsZURlZiAmJiBpbmplY3RhYmxlRGVmLnByb3ZpZGVkSW4gPT0gJ3Jvb3QnKSB7CiAgICAgICAgcmV0dXJuIGluamVjdGFibGVEZWYudmFsdWUgPT09IHVuZGVmaW5lZCA/IGluamVjdGFibGVEZWYudmFsdWUgPSBpbmplY3RhYmxlRGVmLmZhY3RvcnkoKSA6CiAgICAgICAgICAgIGluamVjdGFibGVEZWYudmFsdWU7CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChub3RGb3VuZFZhbHVlICE9PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEluamVjdG9yOiBOT1RfRk9VTkQgWyR7c3RyaW5naWZ5KHRva2VuKX1dYCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluamVjdEFyZ3ModHlwZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFyZ3MgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXJnID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZXNbaV0pOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHsKICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGFycmF5IG11c3QgaGF2ZSBhcmd1bWVudHMuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHlwZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0OwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyZy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGFyZ1tqXTsKICAgICAgICAgICAgICAgIGlmIChtZXRhIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgbWV0YS5uZ01ldGFkYXRhTmFtZSA9PT0gJ09wdGlvbmFsJyB8fCBtZXRhID09PSBPcHRpb25hbCkgewogICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEluamVjdEZsYWdzLk9wdGlvbmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTa2lwU2VsZicgfHwgbWV0YSA9PT0gU2tpcFNlbGYpIHsKICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBJbmplY3RGbGFncy5Ta2lwU2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTZWxmJyB8fCBtZXRhID09PSBTZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSW5qZWN0RmxhZ3MuU2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBJbmplY3QgfHwgbWV0YSA9PT0gSW5qZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IG1ldGEudG9rZW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gbWV0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcmdzLnB1c2goybXJtWluamVjdCgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBmbGFncykpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYXJncy5wdXNoKMm1ybVpbmplY3QoYXJnKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGFyZ3M7Cn0KY2xhc3MgTnVsbEluamVjdG9yIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlID0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgPT09IFRIUk9XX0lGX05PVF9GT1VORCkgewogICAgICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgYmVoaW5kOiBXaXRoIGRldiB0b29scyBvcGVuIHRoZSBkZWJ1Z2dlciB3aWxsIHN0b3AgaGVyZS4gVGhlcmUgaXMgbm8KICAgICAgICAgICAgLy8gcmVhc29uIHdoeSBjb3JyZWN0bHkgd3JpdHRlbiBhcHBsaWNhdGlvbiBzaG91bGQgY2F1c2UgdGhpcyBleGNlcHRpb24uCiAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiB1bmNvbW1lbnQgdGhlIG5leHQgbGluZSBvbmNlIGBuZ0Rldk1vZGVgIHdvcmtzIHdpdGggY2xvc3VyZS4KICAgICAgICAgICAgLy8gaWYgKG5nRGV2TW9kZSkgZGVidWdnZXI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYE51bGxJbmplY3RvckVycm9yOiBObyBwcm92aWRlciBmb3IgJHtzdHJpbmdpZnkodG9rZW4pfSFgKTsKICAgICAgICAgICAgZXJyb3IubmFtZSA9ICdOdWxsSW5qZWN0b3JFcnJvcic7CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBlCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHBhcmFtIHs/fSBpbmplY3RvckVycm9yTmFtZQogKiBAcGFyYW0gez99IHNvdXJjZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2F0Y2hJbmplY3RvckVycm9yKGUsIHRva2VuLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0b2tlblBhdGggPSBlW05HX1RFTVBfVE9LRU5fUEFUSF07CiAgICBpZiAodG9rZW5bU09VUkNFXSkgewogICAgICAgIHRva2VuUGF0aC51bnNoaWZ0KHRva2VuW1NPVVJDRV0pOwogICAgfQogICAgZS5tZXNzYWdlID0gZm9ybWF0RXJyb3IoJ1xuJyArIGUubWVzc2FnZSwgdG9rZW5QYXRoLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKTsKICAgIGVbTkdfVE9LRU5fUEFUSF0gPSB0b2tlblBhdGg7CiAgICBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBudWxsOwogICAgdGhyb3cgZTsKfQovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEBwYXJhbSB7P30gb2JqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JFcnJvck5hbWUKICogQHBhcmFtIHs/PX0gc291cmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JtYXRFcnJvcih0ZXh0LCBvYmosIGluamVjdG9yRXJyb3JOYW1lLCBzb3VyY2UgPSBudWxsKSB7CiAgICB0ZXh0ID0gdGV4dCAmJiB0ZXh0LmNoYXJBdCgwKSA9PT0gJ1xuJyAmJiB0ZXh0LmNoYXJBdCgxKSA9PSBOT19ORVdfTElORSA/IHRleHQuc3Vic3RyKDIpIDogdGV4dDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjb250ZXh0ID0gc3RyaW5naWZ5KG9iaik7CiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgICAgY29udGV4dCA9IG9iai5tYXAoc3RyaW5naWZ5KS5qb2luKCcgLT4gJyk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFydHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gb2JqW2tleV07CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKGtleSArICc6JyArICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogc3RyaW5naWZ5KHZhbHVlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnRleHQgPSBgeyR7cGFydHMuam9pbignLCAnKX19YDsKICAgIH0KICAgIHJldHVybiBgJHtpbmplY3RvckVycm9yTmFtZX0ke3NvdXJjZSA/ICcoJyArIHNvdXJjZSArICcpJyA6ICcnfVske2NvbnRleHR9XTogJHt0ZXh0LnJlcGxhY2UoTkVXX0xJTkUsICdcbiAgJyl9YDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L2Vudmlyb25tZW50LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIG1hcHBpbmcgb2YgdGhlIFxAYW5ndWxhci9jb3JlIEFQSSBzdXJmYWNlIHVzZWQgaW4gZ2VuZXJhdGVkIGV4cHJlc3Npb25zIHRvIHRoZSBhY3R1YWwgc3ltYm9scy4KICoKICogVGhpcyBzaG91bGQgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggdGhlIHB1YmxpYyBleHBvcnRzIG9mIFxAYW5ndWxhci9jb3JlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IGFuZ3VsYXJDb3JlRGlFbnYgPSB7CiAgICAnybXJtWRlZmluZUluamVjdGFibGUnOiDJtcm1ZGVmaW5lSW5qZWN0YWJsZSwKICAgICfJtcm1ZGVmaW5lSW5qZWN0b3InOiDJtcm1ZGVmaW5lSW5qZWN0b3IsCiAgICAnybXJtWluamVjdCc6IMm1ybVpbmplY3QsCiAgICAnybXJtWdldEZhY3RvcnlPZic6IGdldEZhY3RvcnlPZiwKICAgICfJtcm1aW52YWxpZEZhY3RvcnlEZXAnOiDJtcm1aW52YWxpZEZhY3RvcnlEZXAsCn07Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEZhY3RvcnlPZih0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0eXBlQW55ID0gKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKTsKICAgIGlmIChpc0ZvcndhcmRSZWYodHlwZSkpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEZhY3RvcnlPZihyZXNvbHZlRm9yd2FyZFJlZih0eXBlQW55KSk7CiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5ID8gZmFjdG9yeSgpIDogbnVsbDsKICAgICAgICB9KSkpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9IGdldEluamVjdGFibGVEZWYodHlwZUFueSkgfHwgZ2V0SW5qZWN0b3JEZWYodHlwZUFueSk7CiAgICBpZiAoIWRlZiB8fCBkZWYuZmFjdG9yeSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICByZXR1cm4gZGVmLmZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGFuIE5nTW9kdWxlIGNyZWF0ZWQgdmlhIGEge1xAbGluayBOZ01vZHVsZUZhY3Rvcnl9LgogKgogKiBgTmdNb2R1bGVSZWZgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTmdNb2R1bGUgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpcwogKiBOZ01vZHVsZSBJbnN0YW5jZS4KICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBOZ01vZHVsZVJlZiB7Cn0KLyoqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdNb2R1bGVGYWN0b3J5IHsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBhc3NlcnROdW1iZXIoYWN0dWFsLCBtc2cpIHsKICAgIGlmICghKHR5cGVvZiBhY3R1YWwgPT09ICdudW1iZXInKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIHR5cGVvZiBhY3R1YWwsICdudW1iZXInLCAnPT09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0TnVtYmVySW5SYW5nZShhY3R1YWwsIG1pbkluY2x1c2l2ZSwgbWF4SW5jbHVzaXZlKSB7CiAgICBhc3NlcnROdW1iZXIoYWN0dWFsLCAnRXhwZWN0ZWQgYSBudW1iZXInKTsKICAgIGFzc2VydExlc3NUaGFuT3JFcXVhbChhY3R1YWwsIG1heEluY2x1c2l2ZSwgJ0V4cGVjdGVkIG51bWJlciB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8nKTsKICAgIGFzc2VydEdyZWF0ZXJUaGFuT3JFcXVhbChhY3R1YWwsIG1pbkluY2x1c2l2ZSwgJ0V4cGVjdGVkIG51bWJlciB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8nKTsKfQpmdW5jdGlvbiBhc3NlcnRTdHJpbmcoYWN0dWFsLCBtc2cpIHsKICAgIGlmICghKHR5cGVvZiBhY3R1YWwgPT09ICdzdHJpbmcnKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhY3R1YWwsICdzdHJpbmcnLCAnPT09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgPT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz09Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0Tm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgIT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJyE9Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0U2FtZShhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgIGlmICghKGFjdHVhbCA9PT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz09PScpOwogICAgfQp9CmZ1bmN0aW9uIGFzc2VydE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgIT09IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICchPT0nKTsKICAgIH0KfQpmdW5jdGlvbiBhc3NlcnRMZXNzVGhhbihhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgIGlmICghKGFjdHVhbCA8IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc8Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0TGVzc1RoYW5PckVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgaWYgKCEoYWN0dWFsIDw9IGV4cGVjdGVkKSkgewogICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc8PScpOwogICAgfQp9CmZ1bmN0aW9uIGFzc2VydEdyZWF0ZXJUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgaWYgKCEoYWN0dWFsID4gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz4nKTsKICAgIH0KfQpmdW5jdGlvbiBhc3NlcnRHcmVhdGVyVGhhbk9yRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICBpZiAoIShhY3R1YWwgPj0gZXhwZWN0ZWQpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz49Jyk7CiAgICB9Cn0KZnVuY3Rpb24gYXNzZXJ0RGVmaW5lZChhY3R1YWwsIG1zZykgewogICAgaWYgKGFjdHVhbCA9PSBudWxsKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBudWxsLCAnIT0nKTsKICAgIH0KfQpmdW5jdGlvbiB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCBjb21wYXJpc29uKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoYEFTU0VSVElPTiBFUlJPUjogJHttc2d9YCArCiAgICAgICAgKGNvbXBhcmlzb24gPT0gbnVsbCA/ICcnIDogYCBbRXhwZWN0ZWQ9PiAke2V4cGVjdGVkfSAke2NvbXBhcmlzb259ICR7YWN0dWFsfSA8PUFjdHVhbF1gKSk7Cn0KZnVuY3Rpb24gYXNzZXJ0RG9tTm9kZShub2RlKSB7CiAgICAvLyBJZiB3ZSdyZSBpbiBhIHdvcmtlciwgYE5vZGVgIHdpbGwgbm90IGJlIGRlZmluZWQuCiAgICBhc3NlcnRFcXVhbCgodHlwZW9mIE5vZGUgIT09ICd1bmRlZmluZWQnICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB8fAogICAgICAgICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPSBudWxsICYmCiAgICAgICAgICAgIG5vZGUuY29uc3RydWN0b3IubmFtZSA9PT0gJ1dlYldvcmtlclJlbmRlck5vZGUnKSwgdHJ1ZSwgYFRoZSBwcm92aWRlZCB2YWx1ZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgRE9NIE5vZGUgYnV0IGdvdCAke3N0cmluZ2lmeShub2RlKX1gKTsKfQpmdW5jdGlvbiBhc3NlcnREYXRhSW5SYW5nZShhcnIsIGluZGV4KSB7CiAgICBjb25zdCBtYXhMZW4gPSBhcnIgPyBhcnIubGVuZ3RoIDogMDsKICAgIGFzc2VydExlc3NUaGFuKGluZGV4LCBtYXhMZW4sIGBJbmRleCBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gJHttYXhMZW59IGJ1dCBnb3QgJHtpbmRleH1gKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogRXF1aXZhbGVudCB0byBFUzYgc3ByZWFkLCBhZGQgZWFjaCBpdGVtIHRvIGFuIGFycmF5LgogKgogKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGFkZAogKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byB3aGljaCB5b3Ugd2FudCB0byBhZGQgdGhlIGl0ZW1zCiAqLwpmdW5jdGlvbiBhZGRBbGxUb0FycmF5KGl0ZW1zLCBhcnIpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcnIucHVzaChpdGVtc1tpXSk7CiAgICB9Cn0KLyoqCiAqIEZsYXR0ZW5zIGFuIGFycmF5LgogKi8KZnVuY3Rpb24gZmxhdHRlbihsaXN0LCBkc3QpIHsKICAgIGlmIChkc3QgPT09IHVuZGVmaW5lZCkKICAgICAgICBkc3QgPSBsaXN0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7CiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW5saW5lIGl0LgogICAgICAgICAgICBpZiAoZHN0ID09PSBsaXN0KSB7CiAgICAgICAgICAgICAgICAvLyBPdXIgYXNzdW1wdGlvbiB0aGF0IHRoZSBsaXN0IHdhcyBhbHJlYWR5IGZsYXQgd2FzIHdyb25nIGFuZAogICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjbG9uZSBmbGF0IHNpbmNlIHdlIG5lZWQgdG8gd3JpdGUgdG8gaXQuCiAgICAgICAgICAgICAgICBkc3QgPSBsaXN0LnNsaWNlKDAsIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZsYXR0ZW4oaXRlbSwgZHN0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZHN0ICE9PSBsaXN0KSB7CiAgICAgICAgICAgIGRzdC5wdXNoKGl0ZW0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBkc3Q7Cn0KZnVuY3Rpb24gZGVlcEZvckVhY2goaW5wdXQsIGZuKSB7CiAgICBpbnB1dC5mb3JFYWNoKHZhbHVlID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gZGVlcEZvckVhY2godmFsdWUsIGZuKSA6IGZuKHZhbHVlKSk7Cn0KZnVuY3Rpb24gYWRkVG9BcnJheShhcnIsIGluZGV4LCB2YWx1ZSkgewogICAgLy8gcGVyZjogYXJyYXkucHVzaCBpcyBmYXN0ZXIgdGhhbiBhcnJheS5zcGxpY2UhCiAgICBpZiAoaW5kZXggPj0gYXJyLmxlbmd0aCkgewogICAgICAgIGFyci5wdXNoKHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIHZhbHVlKTsKICAgIH0KfQpmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXkoYXJyLCBpbmRleCkgewogICAgLy8gcGVyZjogYXJyYXkucG9wIGlzIGZhc3RlciB0aGFuIGFycmF5LnNwbGljZSEKICAgIGlmIChpbmRleCA+PSBhcnIubGVuZ3RoIC0gMSkgewogICAgICAgIHJldHVybiBhcnIucG9wKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlbMF07CiAgICB9Cn0KZnVuY3Rpb24gbmV3QXJyYXkoc2l6ZSwgdmFsdWUpIHsKICAgIGNvbnN0IGxpc3QgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgbGlzdC5wdXNoKHZhbHVlKTsKICAgIH0KICAgIHJldHVybiBsaXN0Owp9Ci8qKgogKiBTYW1lIGFzIGBBcnJheS5zcGxpY2UyKGluZGV4LCAwLCB2YWx1ZTEsIHZhbHVlMilgIGJ1dCBmYXN0ZXIuCiAqCiAqIGBBcnJheS5zcGxpY2UoKWAgaXMgbm90IGZhc3QgYmVjYXVzZSBpdCBoYXMgdG8gYWxsb2NhdGUgYW4gYXJyYXkgZm9yIHRoZSBlbGVtZW50cyB3aGljaCB3ZXJlCiAqIHJlbW92ZWQuIFRoaXMgY2F1c2VzIG1lbW9yeSBwcmVzc3VyZSBhbmQgc2xvd3MgZG93biBjb2RlIHdoZW4gbW9zdCBvZiB0aGUgdGltZSB3ZSBkb24ndAogKiBjYXJlIGFib3V0IHRoZSBkZWxldGVkIGl0ZW1zIGFycmF5LgogKgogKiBAcGFyYW0gYXJyYXkgQXJyYXkgdG8gc3BsaWNlLgogKiBAcGFyYW0gaW5kZXggSW5kZXggaW4gYXJyYXkgd2hlcmUgdGhlIGB2YWx1ZWAgc2hvdWxkIGJlIGFkZGVkLgogKiBAcGFyYW0gdmFsdWUxIFZhbHVlIHRvIGFkZCB0byBhcnJheS4KICogQHBhcmFtIHZhbHVlMiBWYWx1ZSB0byBhZGQgdG8gYXJyYXkuCiAqLwpmdW5jdGlvbiBhcnJheUluc2VydDIoYXJyYXksIGluZGV4LCB2YWx1ZTEsIHZhbHVlMikgewogICAgbmdEZXZNb2RlICYmIGFzc2VydExlc3NUaGFuT3JFcXVhbChpbmRleCwgYXJyYXkubGVuZ3RoLCAnQ2FuXCd0IGluc2VydCBwYXN0IGFycmF5IGVuZC4nKTsKICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGg7CiAgICBpZiAoZW5kID09IGluZGV4KSB7CiAgICAgICAgLy8gaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCiAgICAgICAgYXJyYXkucHVzaCh2YWx1ZTEsIHZhbHVlMik7CiAgICB9CiAgICBlbHNlIGlmIChlbmQgPT09IDEpIHsKICAgICAgICAvLyBjb3JuZXIgY2FzZSB3aGVuIHdlIGhhdmUgbGVzcyBpdGVtcyBpbiBhcnJheSB0aGFuIHdlIGhhdmUgaXRlbXMgdG8gaW5zZXJ0LgogICAgICAgIGFycmF5LnB1c2godmFsdWUyLCBhcnJheVswXSk7CiAgICAgICAgYXJyYXlbMF0gPSB2YWx1ZTE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBlbmQtLTsKICAgICAgICBhcnJheS5wdXNoKGFycmF5W2VuZCAtIDFdLCBhcnJheVtlbmRdKTsKICAgICAgICB3aGlsZSAoZW5kID4gaW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbmQgPSBlbmQgLSAyOwogICAgICAgICAgICBhcnJheVtlbmRdID0gYXJyYXlbcHJldmlvdXNFbmRdOwogICAgICAgICAgICBlbmQtLTsKICAgICAgICB9CiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWUxOwogICAgICAgIGFycmF5W2luZGV4ICsgMV0gPSB2YWx1ZTI7CiAgICB9Cn0KLyoqCiAqIFNldCBhIGB2YWx1ZWAgZm9yIGEgYGtleWAuCiAqCiAqIEBwYXJhbSBrZXlWYWx1ZUFycmF5IHRvIG1vZGlmeS4KICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZSBvciBjcmVhdGUuCiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0IGZvciBhIGBrZXlgLgogKiBAcmV0dXJucyBpbmRleCAoYWx3YXlzIGV2ZW4pIG9mIHdoZXJlIHRoZSB2YWx1ZSB2YXMgc2V0LgogKi8KZnVuY3Rpb24ga2V5VmFsdWVBcnJheVNldChrZXlWYWx1ZUFycmF5LCBrZXksIHZhbHVlKSB7CiAgICBsZXQgaW5kZXggPSBrZXlWYWx1ZUFycmF5SW5kZXhPZihrZXlWYWx1ZUFycmF5LCBrZXkpOwogICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAvLyBpZiB3ZSBmb3VuZCBpdCBzZXQgaXQuCiAgICAgICAga2V5VmFsdWVBcnJheVtpbmRleCB8IDFdID0gdmFsdWU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBpbmRleCA9IH5pbmRleDsKICAgICAgICBhcnJheUluc2VydDIoa2V5VmFsdWVBcnJheSwgaW5kZXgsIGtleSwgdmFsdWUpOwogICAgfQogICAgcmV0dXJuIGluZGV4Owp9Ci8qKgogKiBSZXRyaWV2ZSBhIGB2YWx1ZWAgZm9yIGEgYGtleWAgKG9uIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4pCiAqCiAqIEBwYXJhbSBrZXlWYWx1ZUFycmF5IHRvIHNlYXJjaC4KICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZS4KICogQHJldHVybiBUaGUgYHZhbHVlYCBzdG9yZWQgYXQgdGhlIGBrZXlgIGxvY2F0aW9uIG9yIGB1bmRlZmluZWQgaWYgbm90IGZvdW5kLgogKi8KZnVuY3Rpb24ga2V5VmFsdWVBcnJheUdldChrZXlWYWx1ZUFycmF5LCBrZXkpIHsKICAgIGNvbnN0IGluZGV4ID0ga2V5VmFsdWVBcnJheUluZGV4T2Yoa2V5VmFsdWVBcnJheSwga2V5KTsKICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgLy8gaWYgd2UgZm91bmQgaXQgcmV0cmlldmUgaXQuCiAgICAgICAgcmV0dXJuIGtleVZhbHVlQXJyYXlbaW5kZXggfCAxXTsKICAgIH0KICAgIHJldHVybiB1bmRlZmluZWQ7Cn0KLyoqCiAqIFJldHJpZXZlIGEgYGtleWAgaW5kZXggdmFsdWUgaW4gdGhlIGFycmF5IG9yIGAtMWAgaWYgbm90IGZvdW5kLgogKgogKiBAcGFyYW0ga2V5VmFsdWVBcnJheSB0byBzZWFyY2guCiAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBsb2NhdGUuCiAqIEByZXR1cm5zIGluZGV4IG9mIHdoZXJlIHRoZSBrZXkgaXMgKG9yIHNob3VsZCBoYXZlIGJlZW4uKQogKiAgIC0gcG9zaXRpdmUgKGV2ZW4pIGluZGV4IGlmIGtleSBmb3VuZC4KICogICAtIG5lZ2F0aXZlIGluZGV4IGlmIGtleSBub3QgZm91bmQuIChgfmluZGV4YCAoZXZlbikgdG8gZ2V0IHRoZSBpbmRleCB3aGVyZSBpdCBzaG91bGQgaGF2ZQogKiAgICAgYmVlbiBpbnNlcnRlZC4pCiAqLwpmdW5jdGlvbiBrZXlWYWx1ZUFycmF5SW5kZXhPZihrZXlWYWx1ZUFycmF5LCBrZXkpIHsKICAgIHJldHVybiBfYXJyYXlJbmRleE9mU29ydGVkKGtleVZhbHVlQXJyYXksIGtleSwgMSk7Cn0KLyoqCiAqIElOVEVSTkFMOiBHZXQgYW4gaW5kZXggb2YgYW4gYHZhbHVlYCBpbiBhIHNvcnRlZCBgYXJyYXlgIGJ5IGdyb3VwaW5nIHNlYXJjaCBieSBgc2hpZnRgLgogKgogKiBOT1RFOgogKiAtIFRoaXMgdXNlcyBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSBmb3IgZmFzdCByZW1vdmFscy4KICoKICogQHBhcmFtIGFycmF5IEEgc29ydGVkIGFycmF5IHRvIGJpbmFyeSBzZWFyY2guCiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gbG9vayBmb3IuCiAqIEBwYXJhbSBzaGlmdCBncm91cGluZyBzaGlmdC4KICogICAtIGAwYCBtZWFucyBsb29rIGF0IGV2ZXJ5IGxvY2F0aW9uCiAqICAgLSBgMWAgbWVhbnMgb25seSBsb29rIGF0IGV2ZXJ5IG90aGVyIChldmVuKSBsb2NhdGlvbiAodGhlIG9kZCBsb2NhdGlvbnMgYXJlIHRvIGJlIGlnbm9yZWQgYXMKICogICAgICAgICB0aGV5IGFyZSB2YWx1ZXMuKQogKiBAcmV0dXJucyBpbmRleCBvZiB0aGUgdmFsdWUuCiAqICAgLSBwb3NpdGl2ZSBpbmRleCBpZiB2YWx1ZSBmb3VuZC4KICogICAtIG5lZ2F0aXZlIGluZGV4IGlmIHZhbHVlIG5vdCBmb3VuZC4gKGB+aW5kZXhgIHRvIGdldCB0aGUgdmFsdWUgd2hlcmUgaXQgc2hvdWxkIGhhdmUgYmVlbgogKiBpbnNlcnRlZCkKICovCmZ1bmN0aW9uIF9hcnJheUluZGV4T2ZTb3J0ZWQoYXJyYXksIHZhbHVlLCBzaGlmdCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKEFycmF5LmlzQXJyYXkoYXJyYXkpLCB0cnVlLCAnRXhwZWN0aW5nIGFuIGFycmF5Jyk7CiAgICBsZXQgc3RhcnQgPSAwOwogICAgbGV0IGVuZCA9IGFycmF5Lmxlbmd0aCA+PiBzaGlmdDsKICAgIHdoaWxlIChlbmQgIT09IHN0YXJ0KSB7CiAgICAgICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyAoKGVuZCAtIHN0YXJ0KSA+PiAxKTsgLy8gZmluZCB0aGUgbWlkZGxlLgogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJheVttaWRkbGUgPDwgc2hpZnRdOwogICAgICAgIGlmICh2YWx1ZSA9PT0gY3VycmVudCkgewogICAgICAgICAgICByZXR1cm4gKG1pZGRsZSA8PCBzaGlmdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPiB2YWx1ZSkgewogICAgICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7IC8vIFdlIGFscmVhZHkgc2VhcmNoZWQgbWlkZGxlIHNvIG1ha2UgaXQgbm9uLWluY2x1c2l2ZSBieSBhZGRpbmcgMQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB+KGVuZCA8PCBzaGlmdCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24vY29uc3RhbnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gewogICAgLyoqCiAgICAgKiBVc2UgdGhlIGBDaGVja09uY2VgIHN0cmF0ZWd5LCBtZWFuaW5nIHRoYXQgYXV0b21hdGljIGNoYW5nZSBkZXRlY3Rpb24gaXMgZGVhY3RpdmF0ZWQKICAgICAqIHVudGlsIHJlYWN0aXZhdGVkIGJ5IHNldHRpbmcgdGhlIHN0cmF0ZWd5IHRvIGBEZWZhdWx0YCAoYENoZWNrQWx3YXlzYCkuCiAgICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNhbiBzdGlsbCBiZSBleHBsaWNpdGx5IGludm9rZWQuCiAgICAgKiBUaGlzIHN0cmF0ZWd5IGFwcGxpZXMgdG8gYWxsIGNoaWxkIGRpcmVjdGl2ZXMgYW5kIGNhbm5vdCBiZSBvdmVycmlkZGVuLgogICAgICovCiAgICBPblB1c2g6IDAsCiAgICAvKioKICAgICAqIFVzZSB0aGUgZGVmYXVsdCBgQ2hlY2tBbHdheXNgIHN0cmF0ZWd5LCBpbiB3aGljaCBjaGFuZ2UgZGV0ZWN0aW9uIGlzIGF1dG9tYXRpYyB1bnRpbAogICAgICogZXhwbGljaXRseSBkZWFjdGl2YXRlZC4KICAgICAqLwogICAgRGVmYXVsdDogMSwKfTsKQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lbQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXSA9ICdPblB1c2gnOwpDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XSA9ICdEZWZhdWx0JzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL3ZpZXcudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgVmlld0VuY2Fwc3VsYXRpb24kMSA9IHsKICAgIC8qKgogICAgICogRW11bGF0ZSBgTmF0aXZlYCBzY29waW5nIG9mIHN0eWxlcyBieSBhZGRpbmcgYW4gYXR0cmlidXRlIGNvbnRhaW5pbmcgc3Vycm9nYXRlIGlkIHRvIHRoZSBIb3N0CiAgICAgKiBFbGVtZW50IGFuZCBwcmUtcHJvY2Vzc2luZyB0aGUgc3R5bGUgcnVsZXMgcHJvdmlkZWQgdmlhIHtAbGluayBDb21wb25lbnQjc3R5bGVzIHN0eWxlc30gb3IKICAgICAqIHtAbGluayBDb21wb25lbnQjc3R5bGVVcmxzIHN0eWxlVXJsc30sIGFuZCBhZGRpbmcgdGhlIG5ldyBIb3N0IEVsZW1lbnQgYXR0cmlidXRlIHRvIGFsbAogICAgICogc2VsZWN0b3JzLgogICAgICoKICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uLgogICAgICovCiAgICBFbXVsYXRlZDogMCwKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgdjYuMS4wIC0gdXNlIHtWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb219IGluc3RlYWQuCiAgICAgKiBVc2UgdGhlIG5hdGl2ZSBlbmNhcHN1bGF0aW9uIG1lY2hhbmlzbSBvZiB0aGUgcmVuZGVyZXIuCiAgICAgKgogICAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyB0aGUgZGVwcmVjYXRlZCBbU2hhZG93IERPTQogICAgICogdjBdKGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvc2hhZG93LykgYW5kCiAgICAgKiBjcmVhdGluZyBhIFNoYWRvd1Jvb3QgZm9yIENvbXBvbmVudCdzIEhvc3QgRWxlbWVudC4KICAgICAqLwogICAgTmF0aXZlOiAxLAogICAgLyoqCiAgICAgKiBEb24ndCBwcm92aWRlIGFueSB0ZW1wbGF0ZSBvciBzdHlsZSBlbmNhcHN1bGF0aW9uLgogICAgICovCiAgICBOb25lOiAyLAogICAgLyoqCiAgICAgKiBVc2UgU2hhZG93IERPTSB0byBlbmNhcHN1bGF0ZSBzdHlsZXMuCiAgICAgKgogICAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyBtb2Rlcm4gW1NoYWRvdwogICAgICogRE9NXShodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL3NoYWRvdy8pIGFuZAogICAgICogY3JlYXRpbmcgYSBTaGFkb3dSb290IGZvciBDb21wb25lbnQncyBIb3N0IEVsZW1lbnQuCiAgICAgKi8KICAgIFNoYWRvd0RvbTogMywKfTsKVmlld0VuY2Fwc3VsYXRpb24kMVtWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkXSA9ICdFbXVsYXRlZCc7ClZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5OYXRpdmVdID0gJ05hdGl2ZSc7ClZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5Ob25lXSA9ICdOb25lJzsKVmlld0VuY2Fwc3VsYXRpb24kMVtWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbV0gPSAnU2hhZG93RG9tJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZW1wdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRoaXMgZmlsZSBjb250YWlucyByZXVzZWFibGUgImVtcHR5IiBzeW1ib2xzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdCByZXR1cm4gdmFsdWVzCiAqIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgcmVuZGVyaW5nIGNvZGUuIEJlY2F1c2UgdGhlIHNhbWUgc3ltYm9scyBhcmUgcmV0dXJuZWQsIHRoaXMKICogYWxsb3dzIGZvciBpZGVudGl0eSBjaGVja3MgYWdhaW5zdCB0aGVzZSB2YWx1ZXMgdG8gYmUgY29uc2lzdGVudGx5IHVzZWQgYnkgdGhlIGZyYW1ld29yawogKiBjb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVNUFRZX09CSiA9IHt9OwovKiogQHR5cGUgez99ICovCmNvbnN0IEVNUFRZX0FSUkFZID0gW107Ci8vIGZyZWV6aW5nIHRoZSB2YWx1ZXMgcHJldmVudHMgYW55IGNvZGUgZnJvbSBhY2NpZGVudGFsbHkgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMgaW4KaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0Rldk1vZGUgd2lsbCBiZSBzZXQgdG8gZmFsc2UKICAgIC8vIHdoZW4gb3B0aW1pemluZyBjb2RlIGFuZCB0aGUgd2hvbGUgaWYgc3RhdGVtZW50IHdpbGwgYmUgZHJvcHBlZC4KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfT0JKKTsKICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfQVJSQVkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RlZmluaXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgX3JlbmRlckNvbXBDb3VudCA9IDA7Ci8qKgogKiBDcmVhdGUgYSBjb21wb25lbnQgZGVmaW5pdGlvbiBvYmplY3QuCiAqCiAqCiAqICMgRXhhbXBsZQogKiBgYGAKICogY2xhc3MgTXlEaXJlY3RpdmUgewogKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyCiAqICAgLy8gW1N5bWJvbF0gc3ludGF4IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBieSBUeXBlU2NyaXB0IHVudGlsIHYyLjcKICogICBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogKiAgICAgLi4uCiAqICAgfSk7CiAqIH0KICogYGBgCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZmluaXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbikgewogICAgcmV0dXJuIG5vU2lkZUVmZmVjdHMoKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gewogICAgICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiDJtcm1ZGVmaW5lQ29tcG9uZW50LgogICAgICAgIC8vIFNlZSB0aGUgYGluaXROZ0Rldk1vZGVgIGRvY3N0cmluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHR5cGUgPSBjb21wb25lbnREZWZpbml0aW9uLnR5cGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHR5cGVQcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVjbGFyZWRJbnB1dHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gewogICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICBwcm92aWRlcnNSZXNvbHZlcjogbnVsbCwKICAgICAgICAgICAgZGVjbHM6IGNvbXBvbmVudERlZmluaXRpb24uZGVjbHMsCiAgICAgICAgICAgIHZhcnM6IGNvbXBvbmVudERlZmluaXRpb24udmFycywKICAgICAgICAgICAgZmFjdG9yeTogbnVsbCwKICAgICAgICAgICAgdGVtcGxhdGU6IGNvbXBvbmVudERlZmluaXRpb24udGVtcGxhdGUgfHwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgY29uc3RzOiBjb21wb25lbnREZWZpbml0aW9uLmNvbnN0cyB8fCBudWxsLAogICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IGNvbXBvbmVudERlZmluaXRpb24ubmdDb250ZW50U2VsZWN0b3JzLAogICAgICAgICAgICBob3N0QmluZGluZ3M6IGNvbXBvbmVudERlZmluaXRpb24uaG9zdEJpbmRpbmdzIHx8IG51bGwsCiAgICAgICAgICAgIGhvc3RWYXJzOiBjb21wb25lbnREZWZpbml0aW9uLmhvc3RWYXJzIHx8IDAsCiAgICAgICAgICAgIGhvc3RBdHRyczogY29tcG9uZW50RGVmaW5pdGlvbi5ob3N0QXR0cnMgfHwgbnVsbCwKICAgICAgICAgICAgY29udGVudFF1ZXJpZXM6IGNvbXBvbmVudERlZmluaXRpb24uY29udGVudFF1ZXJpZXMgfHwgbnVsbCwKICAgICAgICAgICAgZGVjbGFyZWRJbnB1dHM6IGRlY2xhcmVkSW5wdXRzLAogICAgICAgICAgICBpbnB1dHM6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIC8vIGFzc2lnbmVkIGluIG5vU2lkZUVmZmVjdHMKICAgICAgICAgICAgb3V0cHV0czogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgLy8gYXNzaWduZWQgaW4gbm9TaWRlRWZmZWN0cwogICAgICAgICAgICBleHBvcnRBczogY29tcG9uZW50RGVmaW5pdGlvbi5leHBvcnRBcyB8fCBudWxsLAogICAgICAgICAgICBvbkNoYW5nZXM6IG51bGwsCiAgICAgICAgICAgIG9uSW5pdDogdHlwZVByb3RvdHlwZS5uZ09uSW5pdCB8fCBudWxsLAogICAgICAgICAgICBkb0NoZWNrOiB0eXBlUHJvdG90eXBlLm5nRG9DaGVjayB8fCBudWxsLAogICAgICAgICAgICBhZnRlckNvbnRlbnRJbml0OiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50SW5pdCB8fCBudWxsLAogICAgICAgICAgICBhZnRlckNvbnRlbnRDaGVja2VkOiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCB8fCBudWxsLAogICAgICAgICAgICBhZnRlclZpZXdJbml0OiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJWaWV3SW5pdCB8fCBudWxsLAogICAgICAgICAgICBhZnRlclZpZXdDaGVja2VkOiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJWaWV3Q2hlY2tlZCB8fCBudWxsLAogICAgICAgICAgICBvbkRlc3Ryb3k6IHR5cGVQcm90b3R5cGUubmdPbkRlc3Ryb3kgfHwgbnVsbCwKICAgICAgICAgICAgb25QdXNoOiBjb21wb25lbnREZWZpbml0aW9uLmNoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICBkaXJlY3RpdmVEZWZzOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgIHBpcGVEZWZzOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgIHNlbGVjdG9yczogY29tcG9uZW50RGVmaW5pdGlvbi5zZWxlY3RvcnMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgIHZpZXdRdWVyeTogY29tcG9uZW50RGVmaW5pdGlvbi52aWV3UXVlcnkgfHwgbnVsbCwKICAgICAgICAgICAgZmVhdHVyZXM6ICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnREZWZpbml0aW9uLmZlYXR1cmVzKSkgfHwgbnVsbCwKICAgICAgICAgICAgZGF0YTogY29tcG9uZW50RGVmaW5pdGlvbi5kYXRhIHx8IHt9LAogICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogY29udmVydCBWaWV3RW5jYXBzdWxhdGlvbiBpbnRvIGNvbnN0IGVudW0gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbgogICAgICAgICAgICAvLyB0aGUgbmV4dCBsaW5lLiBBbHNvIGBOb25lYCBzaG91bGQgYmUgMCBub3QgMi4KICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogY29tcG9uZW50RGVmaW5pdGlvbi5lbmNhcHN1bGF0aW9uIHx8IFZpZXdFbmNhcHN1bGF0aW9uJDEuRW11bGF0ZWQsCiAgICAgICAgICAgIGlkOiAnYycsCiAgICAgICAgICAgIHN0eWxlczogY29tcG9uZW50RGVmaW5pdGlvbi5zdHlsZXMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgIF86ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIHNldElucHV0OiBudWxsLAogICAgICAgICAgICBzY2hlbWFzOiBjb21wb25lbnREZWZpbml0aW9uLnNjaGVtYXMgfHwgbnVsbCwKICAgICAgICAgICAgdFZpZXc6IG51bGwsCiAgICAgICAgfTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlVHlwZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50RGVmaW5pdGlvbi5kaXJlY3RpdmVzKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjb21wb25lbnREZWZpbml0aW9uLmZlYXR1cmVzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwaXBlVHlwZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50RGVmaW5pdGlvbi5waXBlcykpOwogICAgICAgIGRlZi5pZCArPSBfcmVuZGVyQ29tcENvdW50Kys7CiAgICAgICAgZGVmLmlucHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLmlucHV0cywgZGVjbGFyZWRJbnB1dHMpLAogICAgICAgICAgICBkZWYub3V0cHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLm91dHB1dHMpLAogICAgICAgICAgICBmZWF0dXJlICYmIGZlYXR1cmUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmbikgPT4gZm4oZGVmKSkpOwogICAgICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gZGlyZWN0aXZlVHlwZXMgPwogICAgICAgICAgICAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAodHlwZW9mIGRpcmVjdGl2ZVR5cGVzID09PSAnZnVuY3Rpb24nID8gZGlyZWN0aXZlVHlwZXMoKSA6IGRpcmVjdGl2ZVR5cGVzKQogICAgICAgICAgICAgICAgLm1hcChleHRyYWN0RGlyZWN0aXZlRGVmKSkgOgogICAgICAgICAgICBudWxsOwogICAgICAgIGRlZi5waXBlRGVmcyA9IHBpcGVUeXBlcyA/CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+ICh0eXBlb2YgcGlwZVR5cGVzID09PSAnZnVuY3Rpb24nID8gcGlwZVR5cGVzKCkgOiBwaXBlVHlwZXMpLm1hcChleHRyYWN0UGlwZURlZikpIDoKICAgICAgICAgICAgbnVsbDsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwogICAgfSkpOwp9Ci8qKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlcwogKiBAcGFyYW0gez99IHBpcGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c2V0Q29tcG9uZW50U2NvcGUodHlwZSwgZGlyZWN0aXZlcywgcGlwZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZS7JtWNtcCkpKTsKICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gZGlyZWN0aXZlcy5tYXAoZXh0cmFjdERpcmVjdGl2ZURlZikpOwogICAgZGVmLnBpcGVEZWZzID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gcGlwZXMubWFwKGV4dHJhY3RQaXBlRGVmKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdERpcmVjdGl2ZURlZih0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWYgPSBnZXRDb21wb25lbnREZWYodHlwZSkgfHwgZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgaWYgKG5nRGV2TW9kZSAmJiAhZGVmKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHt0eXBlLm5hbWV9JyBpcyBuZWl0aGVyICdDb21wb25lbnRUeXBlJyBvciAnRGlyZWN0aXZlVHlwZScuYCk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dHJhY3RQaXBlRGVmKHR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlZiA9IGdldFBpcGVEZWYodHlwZSk7CiAgICBpZiAobmdEZXZNb2RlICYmICFkZWYpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3R5cGUubmFtZX0nIGlzIG5vdCBhICdQaXBlVHlwZScuYCk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgYXV0b1JlZ2lzdGVyTW9kdWxlQnlJZCA9IHt9OwovKioKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZGVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZGVmaW5lTmdNb2R1bGUoZGVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXMgPSB7CiAgICAgICAgdHlwZTogZGVmLnR5cGUsCiAgICAgICAgYm9vdHN0cmFwOiBkZWYuYm9vdHN0cmFwIHx8IEVNUFRZX0FSUkFZLAogICAgICAgIGRlY2xhcmF0aW9uczogZGVmLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBpbXBvcnRzOiBkZWYuaW1wb3J0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBleHBvcnRzOiBkZWYuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICB0cmFuc2l0aXZlQ29tcGlsZVNjb3BlczogbnVsbCwKICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLAogICAgICAgIGlkOiBkZWYuaWQgfHwgbnVsbCwKICAgIH07CiAgICBpZiAoZGVmLmlkICE9IG51bGwpIHsKICAgICAgICBub1NpZGVFZmZlY3RzKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgYXV0b1JlZ2lzdGVyTW9kdWxlQnlJZFsoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLmlkKSldID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChkZWYudHlwZSkpKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZXMpKTsKfQovKioKICogQWRkcyB0aGUgbW9kdWxlIG1ldGFkYXRhIHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGNvbXB1dGUgdGhlIG1vZHVsZSdzIHRyYW5zaXRpdmUgc2NvcGUgdG8gYW4KICogZXhpc3RpbmcgbW9kdWxlIGRlZmluaXRpb24uCiAqCiAqIFNjb3BlIG1ldGFkYXRhIG9mIG1vZHVsZXMgaXMgbm90IHVzZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMsIHNvIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gY2FuIGJlCiAqIG1hcmtlZCBwdXJlIHRvIHRyZWUtc2hha2UgaXQgZnJvbSB0aGUgYnVuZGxlLCBhbGxvd2luZyBmb3IgYWxsIHJlZmVyZW5jZWQgZGVjbGFyYXRpb25zCiAqIHRvIGJlY29tZSBlbGlnaWJsZSBmb3IgdHJlZS1zaGFraW5nIGFzIHdlbGwuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBzY29wZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXNldE5nTW9kdWxlU2NvcGUodHlwZSwgc2NvcGUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobm9TaWRlRWZmZWN0cygoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYodHlwZSwgdHJ1ZSk7CiAgICAgICAgbmdNb2R1bGVEZWYuZGVjbGFyYXRpb25zID0gc2NvcGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZOwogICAgICAgIG5nTW9kdWxlRGVmLmltcG9ydHMgPSBzY29wZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZOwogICAgICAgIG5nTW9kdWxlRGVmLmV4cG9ydHMgPSBzY29wZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZOwogICAgfSkpKSk7Cn0KLyoqCiAqIEludmVydHMgYW4gaW5wdXRzIG9yIG91dHB1dHMgbG9va3VwIHN1Y2ggdGhhdCB0aGUga2V5cywgd2hpY2ggd2VyZSB0aGUKICogbWluaWZpZWQga2V5cywgYXJlIHBhcnQgb2YgdGhlIHZhbHVlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIHBhcnNlZCBzbyB0aGF0CiAqIHRoZSBwdWJsaWNOYW1lIG9mIHRoZSBwcm9wZXJ0eSBpcyB0aGUgbmV3IGtleQogKgogKiBlLmcuIGZvcgogKgogKiBgYGAKICogY2xhc3MgQ29tcCB7CiAqIFxASW5wdXQoKQogKiAgIHByb3BOYW1lMTogc3RyaW5nOwogKgogKiBcQElucHV0KCdwdWJsaWNOYW1lMicpCiAqICAgZGVjbGFyZWRQcm9wTmFtZTI6IG51bWJlcjsKICogfQogKiBgYGAKICoKICogd2lsbCBiZSBzZXJpYWxpemVkIGFzCiAqCiAqIGBgYAogKiB7CiAqICAgcHJvcE5hbWUxOiAncHJvcE5hbWUxJywKICogICBkZWNsYXJlZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLAogKiB9CiAqIGBgYAogKgogKiB3aGljaCBpcyB0aGFuIHRyYW5zbGF0ZWQgYnkgdGhlIG1pbmlmaWVyIGFzOgogKgogKiBgYGAKICogewogKiAgIG1pbmlmaWVkUHJvcE5hbWUxOiAncHJvcE5hbWUxJywKICogICBtaW5pZmllZFByb3BOYW1lMjogWydwdWJsaWNOYW1lMicsICdkZWNsYXJlZFByb3BOYW1lMiddLAogKiB9CiAqIGBgYAogKgogKiBiZWNvbWVzOiAocHVibGljIG5hbWUgPT4gbWluaWZpZWROYW1lKQogKgogKiBgYGAKICogewogKiAgJ3Byb3BOYW1lMSc6ICdtaW5pZmllZFByb3BOYW1lMScsCiAqICAncHVibGljTmFtZTInOiAnbWluaWZpZWRQcm9wTmFtZTInLAogKiB9CiAqIGBgYAogKgogKiBPcHRpb25hbGx5IHRoZSBmdW5jdGlvbiBjYW4gdGFrZSBgc2Vjb25kYXJ5YCB3aGljaCB3aWxsIHJlc3VsdCBpbjogKHB1YmxpYyBuYW1lID0+IGRlY2xhcmVkIG5hbWUpCiAqCiAqIGBgYAogKiB7CiAqICAncHJvcE5hbWUxJzogJ3Byb3BOYW1lMScsCiAqICAncHVibGljTmFtZTInOiAnZGVjbGFyZWRQcm9wTmFtZTInLAogKiB9CiAqIGBgYAogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez89fSBvYmoKICogQHBhcmFtIHs/PX0gc2Vjb25kYXJ5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZlcnRPYmplY3Qob2JqLCBzZWNvbmRhcnkpIHsKICAgIGlmIChvYmogPT0gbnVsbCkKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKEVNUFRZX09CSikpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3TG9va3VwID0ge307CiAgICBmb3IgKGNvbnN0IG1pbmlmaWVkS2V5IGluIG9iaikgewogICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobWluaWZpZWRLZXkpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHB1YmxpY05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAob2JqW21pbmlmaWVkS2V5XSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZWNsYXJlZE5hbWUgPSBwdWJsaWNOYW1lOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwdWJsaWNOYW1lKSkgewogICAgICAgICAgICAgICAgZGVjbGFyZWROYW1lID0gcHVibGljTmFtZVsxXTsKICAgICAgICAgICAgICAgIHB1YmxpY05hbWUgPSBwdWJsaWNOYW1lWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld0xvb2t1cFtwdWJsaWNOYW1lXSA9IG1pbmlmaWVkS2V5OwogICAgICAgICAgICBpZiAoc2Vjb25kYXJ5KSB7CiAgICAgICAgICAgICAgICAoc2Vjb25kYXJ5W3B1YmxpY05hbWVdID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmVkTmFtZSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXdMb29rdXA7Cn0KLyoqCiAqIENyZWF0ZSBhIGRpcmVjdGl2ZSBkZWZpbml0aW9uIG9iamVjdC4KICoKICogIyBFeGFtcGxlCiAqIGBgYHRzCiAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICogICAvLyBHZW5lcmF0ZWQgYnkgQW5ndWxhciBUZW1wbGF0ZSBDb21waWxlcgogKiAgIC8vIFtTeW1ib2xdIHN5bnRheCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYnkgVHlwZVNjcmlwdCB1bnRpbCB2Mi43CiAqICAgc3RhdGljIMm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7CiAqICAgICAuLi4KICogICB9KTsKICogfQogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgybXJtWRlZmluZURpcmVjdGl2ZSA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoybXJtWRlZmluZUNvbXBvbmVudCkpKSk7Ci8qKgogKiBDcmVhdGUgYSBwaXBlIGRlZmluaXRpb24gb2JqZWN0LgogKgogKiAjIEV4YW1wbGUKICogYGBgCiAqIGNsYXNzIE15UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0gewogKiAgIC8vIEdlbmVyYXRlZCBieSBBbmd1bGFyIFRlbXBsYXRlIENvbXBpbGVyCiAqICAgc3RhdGljIMm1cGlwZSA9IGRlZmluZVBpcGUoewogKiAgICAgLi4uCiAqICAgfSk7CiAqIH0KICogYGBgCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHBpcGVEZWYgUGlwZSBkZWZpbml0aW9uIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkZWZpbmVQaXBlKHBpcGVEZWYpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgdHlwZTogcGlwZURlZi50eXBlLAogICAgICAgIG5hbWU6IHBpcGVEZWYubmFtZSwKICAgICAgICBmYWN0b3J5OiBudWxsLAogICAgICAgIHB1cmU6IHBpcGVEZWYucHVyZSAhPT0gZmFsc2UsCiAgICAgICAgb25EZXN0cm95OiBwaXBlRGVmLnR5cGUucHJvdG90eXBlLm5nT25EZXN0cm95IHx8IG51bGwKICAgIH0pKSkpKTsKfQovKioKICogVGhlIGZvbGxvd2luZyBnZXR0ZXIgbWV0aG9kcyByZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbiBmb3JtIHRoZSB0eXBlLiBDdXJyZW50bHkgdGhlIHJldHJpZXZhbAogKiBob25vcnMgaW5oZXJpdGFuY2UsIGJ1dCBpbiB0aGUgZnV0dXJlIHdlIG1heSBjaGFuZ2UgdGhlIHJ1bGUgdG8gcmVxdWlyZSB0aGF0IGRlZmluaXRpb25zIGFyZQogKiBleHBsaWNpdC4gVGhpcyB3b3VsZCByZXF1aXJlIHNvbWUgc29ydCBvZiBtaWdyYXRpb24gc3RyYXRlZ3kuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHsKICAgIHJldHVybiB0eXBlW05HX0NPTVBfREVGXSB8fCBudWxsOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERpcmVjdGl2ZURlZih0eXBlKSB7CiAgICByZXR1cm4gdHlwZVtOR19ESVJfREVGXSB8fCBudWxsOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBpcGVEZWYodHlwZSkgewogICAgcmV0dXJuIHR5cGVbTkdfUElQRV9ERUZdIHx8IG51bGw7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez89fSB0aHJvd05vdEZvdW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRGYWN0b3J5RGVmKHR5cGUsIHRocm93Tm90Rm91bmQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGhhc0ZhY3RvcnlEZWYgPSB0eXBlLmhhc093blByb3BlcnR5KE5HX0ZBQ1RPUllfREVGKTsKICAgIGlmICghaGFzRmFjdG9yeURlZiAmJiB0aHJvd05vdEZvdW5kID09PSB0cnVlICYmIG5nRGV2TW9kZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cmluZ2lmeSh0eXBlKX0gZG9lcyBub3QgaGF2ZSAnybVmYWMnIHByb3BlcnR5LmApOwogICAgfQogICAgcmV0dXJuIGhhc0ZhY3RvcnlEZWYgPyB0eXBlW05HX0ZBQ1RPUllfREVGXSA6IG51bGw7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez89fSB0aHJvd05vdEZvdW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROZ01vZHVsZURlZih0eXBlLCB0aHJvd05vdEZvdW5kKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZ01vZHVsZURlZiA9IHR5cGVbTkdfTU9EX0RFRl0gfHwgbnVsbDsKICAgIGlmICghbmdNb2R1bGVEZWYgJiYgdGhyb3dOb3RGb3VuZCA9PT0gdHJ1ZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVHlwZSAke3N0cmluZ2lmeSh0eXBlKX0gZG9lcyBub3QgaGF2ZSAnybVtb2QnIHByb3BlcnR5LmApOwogICAgfQogICAgcmV0dXJuIG5nTW9kdWxlRGVmOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5nTG9jYWxlSWREZWYodHlwZSkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpKVtOR19MT0NfSURfREVGXSB8fCBudWxsOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExWaWV3IGluZGljZXMgdG8gaGVscCB1cyBsb29rIHVwIExWaWV3IG1lbWJlcnMKLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVtZW1iZXIgdGhlIHNwZWNpZmljIGluZGljZXMuCi8vIFVnbGlmeSB3aWxsIGlubGluZSB0aGVzZSB3aGVuIG1pbmlmeWluZyBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYSBjb3N0LgovKiogQHR5cGUgez99ICovCmNvbnN0IEhPU1QgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRWSUVXID0gMTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGTEFHUyA9IDI7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUEFSRU5UID0gMzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBORVhUID0gNDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBRVUVSSUVTID0gNTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBUX0hPU1QgPSA2OwovKiogQHR5cGUgez99ICovCmNvbnN0IENMRUFOVVAgPSA3OwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTlRFWFQgPSA4OwovKiogQHR5cGUgez99ICovCmNvbnN0IElOSkVDVE9SJDEgPSA5OwovKiogQHR5cGUgez99ICovCmNvbnN0IFJFTkRFUkVSX0ZBQ1RPUlkgPSAxMDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBSRU5ERVJFUiA9IDExOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNBTklUSVpFUiA9IDEyOwovKiogQHR5cGUgez99ICovCmNvbnN0IENISUxEX0hFQUQgPSAxMzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDSElMRF9UQUlMID0gMTQ7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDTEFSQVRJT05fVklFVyA9IDE1OwovKiogQHR5cGUgez99ICovCmNvbnN0IERFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXID0gMTY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDTEFSQVRJT05fTENPTlRBSU5FUiA9IDE3OwovKiogQHR5cGUgez99ICovCmNvbnN0IFBSRU9SREVSX0hPT0tfRkxBR1MgPSAxODsKLyoqCiAqIFNpemUgb2YgTFZpZXcncyBoZWFkZXIuIE5lY2Vzc2FyeSB0byBhZGp1c3QgZm9yIGl0IHdoZW4gc2V0dGluZyBzbG90cy4KICogQHR5cGUgez99CiAqLwpjb25zdCBIRUFERVJfT0ZGU0VUID0gMTk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBTcGVjaWFsIGxvY2F0aW9uIHdoaWNoIGFsbG93cyBlYXN5IGlkZW50aWZpY2F0aW9uIG9mIHR5cGUuIElmIHdlIGhhdmUgYW4gYXJyYXkgd2hpY2ggd2FzCiAqIHJldHJpZXZlZCBmcm9tIHRoZSBgTFZpZXdgIGFuZCB0aGF0IGFycmF5IGhhcyBgdHJ1ZWAgYXQgYFRZUEVgIGxvY2F0aW9uLCB3ZSBrbm93IGl0IGlzCiAqIGBMQ29udGFpbmVyYC4KICogQHR5cGUgez99CiAqLwpjb25zdCBUWVBFID0gMTsKLyoqCiAqIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExDb250YWluZXIgaW5kaWNlcyB0byBoZWxwIHVzIGxvb2sgdXAgTENvbnRhaW5lciBtZW1iZXJzCiAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlbWVtYmVyIHRoZSBzcGVjaWZpYyBpbmRpY2VzLgogKiBVZ2xpZnkgd2lsbCBpbmxpbmUgdGhlc2Ugd2hlbiBtaW5pZnlpbmcgc28gdGhlcmUgc2hvdWxkbid0IGJlIGEgY29zdC4KICogQHR5cGUgez99CiAqLwpjb25zdCBBQ1RJVkVfSU5ERVggPSAyOwovLyBQQVJFTlQgYW5kIE5FWFQgYXJlIGluZGljZXMgMyBhbmQgNAovLyBBcyB3ZSBhbHJlYWR5IGhhdmUgdGhlc2UgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSB0aGVtLgovKiogQHR5cGUgez99ICovCmNvbnN0IE1PVkVEX1ZJRVdTID0gNTsKLy8gVF9IT1NUIGlzIGluZGV4IDYKLy8gV2UgYWxyZWFkeSBoYXZlIHRoaXMgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSBpdC4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOQVRJVkUgPSA3OwovKiogQHR5cGUgez99ICovCmNvbnN0IFZJRVdfUkVGUyA9IDg7Ci8qKgogKiBTaXplIG9mIExDb250YWluZXIncyBoZWFkZXIuIFJlcHJlc2VudHMgdGhlIGluZGV4IGFmdGVyIHdoaWNoIGFsbCB2aWV3cyBpbiB0aGUKICogY29udGFpbmVyIHdpbGwgYmUgaW5zZXJ0ZWQuIFdlIG5lZWQgdG8ga2VlcCBhIHJlY29yZCBvZiBjdXJyZW50IHZpZXdzIHNvIHdlIGtub3cKICogd2hpY2ggdmlld3MgYXJlIGFscmVhZHkgaW4gdGhlIERPTSAoYW5kIGRvbid0IG5lZWQgdG8gYmUgcmUtYWRkZWQpIGFuZCBzbyB3ZSBjYW4KICogcmVtb3ZlIHZpZXdzIGZyb20gdGhlIERPTSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciByZXF1aXJlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBDT05UQUlORVJfSEVBREVSX09GRlNFVCA9IDk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvdHlwZV9jaGVja3MudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRydWUgaWYgYHZhbHVlYCBpcyBgTFZpZXdgLgogKiBAcGFyYW0gez99IHZhbHVlIHdyYXBwZWQgdmFsdWUgb2YgYFJOb2RlYCwgYExWaWV3YCwgYExDb250YWluZXJgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0xWaWV3KHZhbHVlKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlW1RZUEVdID09PSAnb2JqZWN0JzsKfQovKioKICogVHJ1ZSBpZiBgdmFsdWVgIGlzIGBMQ29udGFpbmVyYC4KICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNMQ29udGFpbmVyKHZhbHVlKSB7CiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbVFlQRV0gPT09IHRydWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29udGVudFF1ZXJ5SG9zdCh0Tm9kZSkgewogICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDggLyogaGFzQ29udGVudFF1ZXJ5ICovKSAhPT0gMDsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNDb21wb25lbnRIb3N0KHROb2RlKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pID09PSAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNEaXJlY3RpdmVIb3N0KHROb2RlKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMSAvKiBpc0RpcmVjdGl2ZUhvc3QgKi8pID09PSAxIC8qIGlzRGlyZWN0aXZlSG9zdCAqLzsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkZWYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29tcG9uZW50RGVmKGRlZikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSkpLnRlbXBsYXRlICE9PSBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNSb290Vmlldyh0YXJnZXQpIHsKICAgIHJldHVybiAodGFyZ2V0W0ZMQUdTXSAmIDUxMiAvKiBJc1Jvb3QgKi8pICE9PSAwOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2Fzc2VydC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBbQXNzZXJ0IGZ1bmN0aW9ucyBkbyBub3QgY29uc3RyYWludCB0eXBlIHdoZW4gdGhleSBhcmUgZ3VhcmRlZCBieSBhIHRydXRoeQovLyBleHByZXNzaW9uLl0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNzI5NSkKLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0VE5vZGVGb3JMVmlldyh0Tm9kZSwgbFZpZXcpIHsKICAgIHROb2RlLmhhc093blByb3BlcnR5KCd0Vmlld18nKSAmJgogICAgICAgIGFzc2VydEVxdWFsKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSkpKSkudFZpZXdfLCBsVmlld1tUVklFV10sICdUaGlzIFROb2RlIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIExWaWV3LicpOwp9Ci8qKgogKiBAcGFyYW0gez99IGFjdHVhbAogKiBAcGFyYW0gez89fSBtc2cKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydENvbXBvbmVudFR5cGUoYWN0dWFsLCBtc2cgPSAnVHlwZSBwYXNzZWQgaW4gaXMgbm90IENvbXBvbmVudFR5cGUsIGl0IGRvZXMgbm90IGhhdmUgXCfJtWNtcFwnIHByb3BlcnR5LicpIHsKICAgIGlmICghZ2V0Q29tcG9uZW50RGVmKGFjdHVhbCkpIHsKICAgICAgICB0aHJvd0Vycm9yJDEobXNnKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBhY3R1YWwKICogQHBhcmFtIHs/PX0gbXNnCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROZ01vZHVsZVR5cGUoYWN0dWFsLCBtc2cgPSAnVHlwZSBwYXNzZWQgaW4gaXMgbm90IE5nTW9kdWxlVHlwZSwgaXQgZG9lcyBub3QgaGF2ZSBcJ8m1bW9kXCcgcHJvcGVydHkuJykgewogICAgaWYgKCFnZXROZ01vZHVsZURlZihhY3R1YWwpKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKG1zZyk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydEhhc1BhcmVudCh0Tm9kZSkgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgZXhpc3QhJyk7CiAgICBhc3NlcnREZWZpbmVkKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLnBhcmVudCwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgaGF2ZSBhIHBhcmVudCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyT3JVbmRlZmluZWQodmFsdWUpIHsKICAgIHZhbHVlICYmIGFzc2VydEVxdWFsKGlzTENvbnRhaW5lcih2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTENvbnRhaW5lciBvciB1bmRlZmluZWQgb3IgbnVsbCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyKHZhbHVlKSB7CiAgICBhc3NlcnREZWZpbmVkKHZhbHVlLCAnTENvbnRhaW5lciBtdXN0IGJlIGRlZmluZWQnKTsKICAgIGFzc2VydEVxdWFsKGlzTENvbnRhaW5lcih2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTENvbnRhaW5lcicpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMVmlld09yVW5kZWZpbmVkKHZhbHVlKSB7CiAgICB2YWx1ZSAmJiBhc3NlcnRFcXVhbChpc0xWaWV3KHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMVmlldyBvciB1bmRlZmluZWQgb3IgbnVsbCcpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRMVmlldyh2YWx1ZSkgewogICAgYXNzZXJ0RGVmaW5lZCh2YWx1ZSwgJ0xWaWV3IG11c3QgYmUgZGVmaW5lZCcpOwogICAgYXNzZXJ0RXF1YWwoaXNMVmlldyh2YWx1ZSksIHRydWUsICdFeHBlY3RpbmcgTFZpZXcnKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez89fSBlcnJNZXNzYWdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcsIGVyck1lc3NhZ2UpIHsKICAgIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcywgdHJ1ZSwgZXJyTWVzc2FnZSB8fCAnU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIGZpcnN0IGNyZWF0ZSBwYXNzLicpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7Pz19IGVyck1lc3NhZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFzc2VydEZpcnN0VXBkYXRlUGFzcyh0VmlldywgZXJyTWVzc2FnZSkgewogICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RVcGRhdGVQYXNzLCB0cnVlLCBlcnJNZXNzYWdlIHx8ICdTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdXBkYXRlIHBhc3MuJyk7Cn0KLyoqCiAqIFRoaXMgaXMgYSBiYXNpYyBzYW5pdHkgY2hlY2sgdGhhdCBhbiBvYmplY3QgaXMgcHJvYmFibHkgYSBkaXJlY3RpdmUgZGVmLiBEaXJlY3RpdmVEZWYgaXMKICogYW4gaW50ZXJmYWNlLCBzbyB3ZSBjYW4ndCBkbyBhIGRpcmVjdCBpbnN0YW5jZW9mIGNoZWNrLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IG9iagogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0RGlyZWN0aXZlRGVmKG9iaikgewogICAgaWYgKG9iai50eXBlID09PSB1bmRlZmluZWQgfHwgb2JqLnNlbGVjdG9ycyA9PSB1bmRlZmluZWQgfHwgb2JqLmlucHV0cyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3dFcnJvciQxKGBFeHBlY3RlZCBhIERpcmVjdGl2ZURlZi9Db21wb25lbnREZWYgYW5kIHRoaXMgb2JqZWN0IGRvZXMgbm90IHNlZW0gdG8gaGF2ZSB0aGUgZXhwZWN0ZWQgc2hhcGUuYCk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvbmFtZXNwYWNlcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTUFUSF9NTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoTUwvJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9jb250ZXh0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgcHJvcGVydHkgd2lsbCBiZSBtb25rZXktcGF0Y2hlZCBvbiBlbGVtZW50cywgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcwogKiBAdHlwZSB7P30KICovCmNvbnN0IE1PTktFWV9QQVRDSF9LRVlfTkFNRSA9ICdfX25nQ29udGV4dF9fJzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9kb2N1bWVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBNb3N0IG9mIHRoZSB1c2Ugb2YgYGRvY3VtZW50YCBpbiBBbmd1bGFyIGlzIGZyb20gd2l0aGluIHRoZSBESSBzeXN0ZW0gc28gaXQgaXMgcG9zc2libGUgdG8gc2ltcGx5CiAqIGluamVjdCB0aGUgYERPQ1VNRU5UYCB0b2tlbiBhbmQgYXJlIGRvbmUuCiAqCiAqIEl2eSBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZG9lcyBub3QgcmVseSB1cG9uIHRoZSBESSBhbmQgbXVzdCBnZXQgaG9sZCBvZiB0aGUgZG9jdW1lbnQgc29tZSBvdGhlcgogKiB3YXkuCiAqCiAqIFRoZSBzb2x1dGlvbiBpcyB0byBkZWZpbmUgYGdldERvY3VtZW50KClgIGFuZCBgc2V0RG9jdW1lbnQoKWAgdG9wLWxldmVsIGZ1bmN0aW9ucyBmb3IgaXZ5LgogKiBXaGVyZXZlciBpdnkgbmVlZHMgdGhlIGdsb2JhbCBkb2N1bWVudCwgaXQgY2FsbHMgYGdldERvY3VtZW50KClgIGluc3RlYWQuCiAqCiAqIFdoZW4gcnVubmluZyBpdnkgb3V0c2lkZSBvZiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIGBzZXREb2N1bWVudCgpYCB0bwogKiB0ZWxsIGl2eSB3aGF0IHRoZSBnbG9iYWwgYGRvY3VtZW50YCBpcy4KICoKICogQW5ndWxhciBkb2VzIHRoaXMgZm9yIHVzIGluIGVhY2ggb2YgdGhlIHN0YW5kYXJkIHBsYXRmb3JtcyAoYEJyb3dzZXJgLCBgU2VydmVyYCwgYW5kIGBXZWJXb3JrZXJgKQogKiBieSBjYWxsaW5nIGBzZXREb2N1bWVudCgpYCB3aGVuIHByb3ZpZGluZyB0aGUgYERPQ1VNRU5UYCB0b2tlbi4KICogQHR5cGUgez99CiAqLwpsZXQgRE9DVU1FTlQgPSB1bmRlZmluZWQ7Ci8qKgogKiBUZWxsIGl2eSB3aGF0IHRoZSBgZG9jdW1lbnRgIGlzIGZvciB0aGlzIHBsYXRmb3JtLgogKgogKiBJdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBjYWxsIHRoaXMgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgbm90IGEgYnJvd3Nlci4KICoKICogQHBhcmFtIHs/fSBkb2N1bWVudCBUaGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgaW4gdGhpcyBlbnZpcm9ubWVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldERvY3VtZW50KGRvY3VtZW50KSB7CiAgICBET0NVTUVOVCA9IGRvY3VtZW50Owp9Ci8qKgogKiBBY2Nlc3MgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGBkb2N1bWVudGAgZm9yIHRoaXMgcGxhdGZvcm0uCiAqCiAqIEl2eSBjYWxscyB0aGlzIHdoZW5ldmVyIGl0IG5lZWRzIHRvIGFjY2VzcyB0aGUgYGRvY3VtZW50YCBvYmplY3QuCiAqIEZvciBleGFtcGxlIHRvIGNyZWF0ZSB0aGUgcmVuZGVyZXIgb3IgdG8gZG8gc2FuaXRpemF0aW9uLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7CiAgICBpZiAoRE9DVU1FTlQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBET0NVTUVOVDsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CiAgICB9CiAgICAvLyBObyAiZG9jdW1lbnQiIGNhbiBiZSBmb3VuZC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgYXJlIHJ1bm5pbmcgaXZ5IG91dHNpZGUgQW5ndWxhciBhbmQKICAgIC8vIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIG5vdCBhIGJyb3dzZXIuIFNpbmNlIHRoaXMgaXMgbm90IGEgc3VwcG9ydGVkIHNjZW5hcmlvIGF0IHRoZSBtb21lbnQKICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaW4gQW5ndWxhciBhcHBzLgogICAgLy8gT25jZSB3ZSBzdXBwb3J0IHJ1bm5pbmcgaXZ5IG91dHNpZGUgb2YgQW5ndWxhciB3ZSB3aWxsIG5lZWQgdG8gcHVibGlzaCBgc2V0RG9jdW1lbnQoKWAgYXMgYQogICAgLy8gcHVibGljIEFQSS4gTWVhbndoaWxlIHdlIGp1c3QgcmV0dXJuIGB1bmRlZmluZWRgIGFuZCBsZXQgdGhlIGFwcGxpY2F0aW9uIGZhaWwuCiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHVuZGVmaW5lZCkpOwp9Ci8qKgogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGByZW5kZXJlcmAgaXMgYSBgUHJvY2VkdXJhbFJlbmRlcmVyM2AKICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpIHsKICAgIHJldHVybiAhISgoKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSkpLmxpc3Rlbik7Cn0KY29uc3QgybUwJDIgPSAvKioKICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogKiBAcGFyYW0gez99IHJlbmRlcmVyVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KKGhvc3RFbGVtZW50LCByZW5kZXJlclR5cGUpID0+IHsKICAgIHJldHVybiBnZXREb2N1bWVudCgpOwp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IGRvbVJlbmRlcmVyRmFjdG9yeTMgPSB7CiAgICBjcmVhdGVSZW5kZXJlcjogKMm1MCQyKQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL3ZpZXdfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEZvciBlZmZpY2llbmN5IHJlYXNvbnMgd2Ugb2Z0ZW4gcHV0IHNldmVyYWwgZGlmZmVyZW50IGRhdGEgdHlwZXMgKGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCkKICogaW4gc2FtZSBsb2NhdGlvbiBpbiBgTFZpZXdgLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmUtYWxsb2NhdGUgc3BhY2UgZm9yIGl0CiAqIGJlY2F1c2UgdGhlIHN0b3JhZ2UgaXMgc3BhcnNlLiBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggc3VjaCBkYXRhIHR5cGVzLgogKgogKiBIb3cgZG8gd2Uga25vdyB3aGF0IGlzIHN0b3JlZCBhdCBhIGdpdmVuIGxvY2F0aW9uIGluIGBMVmlld2AuCiAqIC0gYEFycmF5LmlzQXJyYXkodmFsdWUpID09PSBmYWxzZWAgPT4gYFJOb2RlYCAoVGhlIG5vcm1hbCBzdG9yYWdlIHZhbHVlKQogKiAtIGBBcnJheS5pc0FycmF5KHZhbHVlKSA9PT0gdHJ1ZWAgPT4gdGhlbiB0aGUgYHZhbHVlWzBdYCByZXByZXNlbnRzIHRoZSB3cmFwcGVkIHZhbHVlLgogKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ29iamVjdCdgID0+IGBMVmlld2AKICogICAgICAtIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYSBjb21wb25lbnQgYXQgYSBnaXZlbiBsb2NhdGlvbgogKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gdHJ1ZWAgPT4gYExDb250YWluZXJgCiAqICAgICAgLSBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGBMQ29udGFpbmVyYCBiaW5kaW5nIGF0IGEgZ2l2ZW4gbG9jYXRpb24uCiAqCiAqCiAqIE5PVEU6IGl0IGlzIGFzc3VtZWQgdGhhdCBgQXJyYXkuaXNBcnJheWAgYW5kIGB0eXBlb2ZgIG9wZXJhdGlvbnMgYXJlIHZlcnkgZWZmaWNpZW50LgogKi8KLyoqCiAqIFJldHVybnMgYFJOb2RlYC4KICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdW53cmFwUk5vZGUodmFsdWUpIHsKICAgIHdoaWxlIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgIHZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlW0hPU1RdKSk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7Cn0KLyoqCiAqIFJldHVybnMgYExWaWV3YCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLgogKiBAcGFyYW0gez99IHZhbHVlIHdyYXBwZWQgdmFsdWUgb2YgYFJOb2RlYCwgYExWaWV3YCwgYExDb250YWluZXJgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bndyYXBMVmlldyh2YWx1ZSkgewogICAgd2hpbGUgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBzYW1lIGFzIGBpc0xWaWV3KClgIGJ1dCB3ZSBkb24ndCBjYWxsIGF0IGFzIHdlIGRvbid0IHdhbnQgdG8gY2FsbAogICAgICAgIC8vIGBBcnJheS5pc0FycmF5KClgIHR3aWNlIGFuZCBnaXZlIEpJVGVyIG1vcmUgd29yayBmb3IgaW5saW5pbmcuCiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gJ29iamVjdCcpCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICB2YWx1ZSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZVtIT1NUXSkpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIFJldHJpZXZlcyBhbiBlbGVtZW50IHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGB2aWV3RGF0YWAsIGJ5IHVud3JhcHBpbmcKICogZnJvbSBhbnkgY29udGFpbmVycywgY29tcG9uZW50IHZpZXdzLCBvciBzdHlsZSBjb250ZXh0cy4KICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldykgewogICAgcmV0dXJuIHVud3JhcFJOb2RlKGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF0pOwp9Ci8qKgogKiBSZXRyaWV2ZSBhbiBgUk5vZGVgIGZvciBhIGdpdmVuIGBUTm9kZWAgYW5kIGBMVmlld2AuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyBpbiBkZXYgbW9kZSB0byByZXRyaWV2ZSBhIG5vbi1udWxsIGBSTm9kZWAuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIHROb2RlLmluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGUgPSB1bndyYXBSTm9kZShsVmlld1t0Tm9kZS5pbmRleF0pOwogICAgbmdEZXZNb2RlICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihsVmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobm9kZSk7CiAgICByZXR1cm4gbm9kZTsKfQovKioKICogUmV0cmlldmUgYW4gYFJOb2RlYCBvciBgbnVsbGAgZm9yIGEgZ2l2ZW4gYFROb2RlYCBhbmQgYExWaWV3YC4KICoKICogU29tZSBgVE5vZGVgcyBkb24ndCBoYXZlIGFzc29jaWF0ZWQgYFJOb2RlYHMuIEZvciBleGFtcGxlIGBQcm9qZWN0aW9uYAogKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5hdGl2ZUJ5VE5vZGVPck51bGwodE5vZGUsIGxWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleCA9IHROb2RlLmluZGV4OwogICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGUgPSB1bndyYXBSTm9kZShsVmlld1tpbmRleF0pOwogICAgICAgIG5nRGV2TW9kZSAmJiBub2RlICE9PSBudWxsICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihsVmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobm9kZSk7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUTm9kZSh0VmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsICd3cm9uZyBpbmRleCBmb3IgVE5vZGUnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbihpbmRleCwgdFZpZXcuZGF0YS5sZW5ndGgsICd3cm9uZyBpbmRleCBmb3IgVE5vZGUnKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdKSk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gYW55IGBMVmlld2Agb3IgYFREYXRhYC4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB2aWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGxvYWQodmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZSh2aWV3LCBpbmRleCArIEhFQURFUl9PRkZTRVQpOwogICAgcmV0dXJuIHZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTsKfQovKioKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/fSBob3N0VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KG5vZGVJbmRleCwgaG9zdFZpZXcpIHsKICAgIC8vIENvdWxkIGJlIGFuIExWaWV3IG9yIGFuIExDb250YWluZXIuIElmIExDb250YWluZXIsIHVud3JhcCB0byBmaW5kIExWaWV3LgogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGhvc3RWaWV3LCBub2RlSW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gaG9zdFZpZXdbbm9kZUluZGV4XTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gaXNMVmlldyhzbG90VmFsdWUpID8gc2xvdFZhbHVlIDogc2xvdFZhbHVlW0hPU1RdOwogICAgcmV0dXJuIGxWaWV3Owp9Ci8qKgogKiBSZXR1cm5zIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgZGF0YSBwcmVzZW50IG9uIHRoZSB0YXJnZXQgKHdoaWNoIGNvdWxkIGJlCiAqIGEgY29tcG9uZW50LCBkaXJlY3RpdmUgb3IgYSBET00gbm9kZSkuCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0YXJnZXQsICdUYXJnZXQgZXhwZWN0ZWQnKTsKICAgIHJldHVybiB0YXJnZXRbTU9OS0VZX1BBVENIX0tFWV9OQU1FXSB8fCBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHRhcmdldAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZFBhdGNoZWRMVmlldyh0YXJnZXQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZhbHVlID0gcmVhZFBhdGNoZWREYXRhKHRhcmdldCk7CiAgICBpZiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkubFZpZXc7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiB2aWV3IGlzIGluIGNyZWF0aW9uIG1vZGUKICogQHBhcmFtIHs/fSB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0NyZWF0aW9uTW9kZSh2aWV3KSB7CiAgICByZXR1cm4gKHZpZXdbRkxBR1NdICYgNCAvKiBDcmVhdGlvbk1vZGUgKi8pID09PSA0IC8qIENyZWF0aW9uTW9kZSAqLzsKfQovKioKICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS4KICoKICogTm90ZTogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2aWV3IHNob3VsZCBiZSBjaGVja2VkLCBub3Qgd2hldGhlciBpdCdzIGluc2VydGVkCiAqIGludG8gYSBjb250YWluZXIuIEZvciB0aGF0LCB5b3UnbGwgd2FudCBgdmlld0F0dGFjaGVkVG9Db250YWluZXJgIGJlbG93LgogKiBAcGFyYW0gez99IHZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZpZXdBdHRhY2hlZFRvQ2hhbmdlRGV0ZWN0b3IodmlldykgewogICAgcmV0dXJuICh2aWV3W0ZMQUdTXSAmIDEyOCAvKiBBdHRhY2hlZCAqLykgPT09IDEyOCAvKiBBdHRhY2hlZCAqLzsKfQovKioKICogUmV0dXJucyBhIGJvb2xlYW4gZm9yIHdoZXRoZXIgdGhlIHZpZXcgaXMgYXR0YWNoZWQgdG8gYSBjb250YWluZXIuCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmlld0F0dGFjaGVkVG9Db250YWluZXIodmlldykgewogICAgcmV0dXJuIGlzTENvbnRhaW5lcih2aWV3W1BBUkVOVF0pOwp9Ci8qKgogKiBSZXR1cm5zIGEgY29uc3RhbnQgZnJvbSBgVENvbnN0YW50c2AgaW5zdGFuY2UuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gY29uc3RzCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnN0YW50KGNvbnN0cywgaW5kZXgpIHsKICAgIHJldHVybiBjb25zdHMgPT09IG51bGwgfHwgaW5kZXggPT0gbnVsbCA/IG51bGwgOiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnN0c1tpbmRleF0pKSkpOwp9Ci8qKgogKiBSZXNldHMgdGhlIHByZS1vcmRlciBob29rIGZsYWdzIG9mIHRoZSB2aWV3LgogKiBAcGFyYW0gez99IGxWaWV3IHRoZSBMVmlldyBvbiB3aGljaCB0aGUgZmxhZ3MgYXJlIHJlc2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KSB7CiAgICBsVmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA9IDA7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TENvbnRhaW5lckFjdGl2ZUluZGV4KGxDb250YWluZXIpIHsKICAgIHJldHVybiBsQ29udGFpbmVyW0FDVElWRV9JTkRFWF0gPj4gMSAvKiBTSElGVCAqLzsKfQovKioKICogQHBhcmFtIHs/fSBsQ29udGFpbmVyCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyLCBpbmRleCkgewogICAgbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdID0gaW5kZXggPDwgMSAvKiBTSElGVCAqLzsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IGluc3RydWN0aW9uU3RhdGUgPSB7CiAgICBsRnJhbWU6IGNyZWF0ZUxGcmFtZShudWxsKSwKICAgIGJpbmRpbmdzRW5hYmxlZDogdHJ1ZSwKICAgIGNoZWNrTm9DaGFuZ2VzTW9kZTogZmFsc2UsCn07Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RWxlbWVudERlcHRoQ291bnQoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuZWxlbWVudERlcHRoQ291bnQ7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmNyZWFzZUVsZW1lbnREZXB0aENvdW50KCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuZWxlbWVudERlcHRoQ291bnQrKzsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKSB7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudC0tOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZ3NFbmFibGVkKCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUuYmluZGluZ3NFbmFibGVkOwp9Ci8qKgogKiBFbmFibGVzIGRpcmVjdGl2ZSBtYXRjaGluZyBvbiBlbGVtZW50cy4KICoKICogICogRXhhbXBsZToKICogYGBgCiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT4KICogICBTaG91bGQgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlLgogKiA8L215LWNvbXA+CiAqIDxkaXYgbmdOb25CaW5kYWJsZT4KICogICA8IS0tIMm1ybVkaXNhYmxlQmluZGluZ3MoKSAtLT4KICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAqICAgICBTaG91bGQgbm90IG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZSBiZWNhdXNlIHdlIGFyZSBpbiBuZ05vbkJpbmRhYmxlLgogKiAgIDwvbXktY29tcD4KICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWVuYWJsZUJpbmRpbmdzKCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5iaW5kaW5nc0VuYWJsZWQgPSB0cnVlOwp9Ci8qKgogKiBEaXNhYmxlcyBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gZWxlbWVudC4KICoKICogICogRXhhbXBsZToKICogYGBgCiAqIDxteS1jb21wIG15LWRpcmVjdGl2ZT4KICogICBTaG91bGQgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlLgogKiA8L215LWNvbXA+CiAqIDxkaXYgbmdOb25CaW5kYWJsZT4KICogICA8IS0tIMm1ybVkaXNhYmxlQmluZGluZ3MoKSAtLT4KICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAqICAgICBTaG91bGQgbm90IG1hdGNoIGNvbXBvbmVudCAvIGRpcmVjdGl2ZSBiZWNhdXNlIHdlIGFyZSBpbiBuZ05vbkJpbmRhYmxlLgogKiAgIDwvbXktY29tcD4KICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWRpc2FibGVCaW5kaW5ncygpIHsKICAgIGluc3RydWN0aW9uU3RhdGUuYmluZGluZ3NFbmFibGVkID0gZmFsc2U7Cn0KLyoqCiAqIFJldHVybiB0aGUgY3VycmVudCBgTFZpZXdgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TFZpZXcoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUubFZpZXc7Cn0KLyoqCiAqIFJldHVybiB0aGUgY3VycmVudCBgVFZpZXdgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFZpZXcoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUudFZpZXc7Cn0KLyoqCiAqIFJlc3RvcmVzIGBjb250ZXh0Vmlld0RhdGFgIHRvIHRoZSBnaXZlbiBPcGFxdWVWaWV3U3RhdGUgaW5zdGFuY2UuCiAqCiAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZ2V0Q3VycmVudFZpZXcoKSBpbnN0cnVjdGlvbiB0byBzYXZlIGEgc25hcHNob3QKICogb2YgdGhlIGN1cnJlbnQgdmlldyBhbmQgcmVzdG9yZSBpdCB3aGVuIGxpc3RlbmVycyBhcmUgaW52b2tlZC4gVGhpcyBhbGxvd3MKICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdmlld1RvUmVzdG9yZSBUaGUgT3BhcXVlVmlld1N0YXRlIGluc3RhbmNlIHRvIHJlc3RvcmUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cmVzdG9yZVZpZXcodmlld1RvUmVzdG9yZSkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY29udGV4dExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh2aWV3VG9SZXN0b3JlKSkpKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5wcmV2aW91c09yUGFyZW50VE5vZGU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBpc1BhcmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHROb2RlLCBpc1BhcmVudCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUucHJldmlvdXNPclBhcmVudFROb2RlID0gdE5vZGU7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5pc1BhcmVudCA9IGlzUGFyZW50Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0SXNQYXJlbnQoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuaXNQYXJlbnQ7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJc05vdFBhcmVudCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmlzUGFyZW50ID0gZmFsc2U7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJc1BhcmVudCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmlzUGFyZW50ID0gdHJ1ZTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnRleHRMVmlldygpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jb250ZXh0TFZpZXc7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSB7CiAgICAvLyBUT0RPKG1pc2tvKTogcmVtb3ZlIHRoaXMgZnJvbSB0aGUgTFZpZXcgc2luY2UgaXQgaXMgbmdEZXZNb2RlPXRydWUgbW9kZSBvbmx5LgogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUuY2hlY2tOb0NoYW5nZXNNb2RlOwp9Ci8qKgogKiBAcGFyYW0gez99IG1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldENoZWNrTm9DaGFuZ2VzTW9kZShtb2RlKSB7CiAgICBpbnN0cnVjdGlvblN0YXRlLmNoZWNrTm9DaGFuZ2VzTW9kZSA9IG1vZGU7Cn0KLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEJpbmRpbmdSb290KCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSBsRnJhbWUuYmluZGluZ1Jvb3RJbmRleDsKICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICBpbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4ID0gbEZyYW1lLnRWaWV3LmJpbmRpbmdTdGFydEluZGV4OwogICAgfQogICAgcmV0dXJuIGluZGV4Owp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZ0luZGV4KCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleDsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0QmluZGluZ0luZGV4KHZhbHVlKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuYmluZGluZ0luZGV4ID0gdmFsdWU7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuZXh0QmluZGluZ0luZGV4KCkgewogICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleCsrOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvdW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoY291bnQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBsRnJhbWUuYmluZGluZ0luZGV4OwogICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nSW5kZXggKyBjb3VudDsKICAgIHJldHVybiBpbmRleDsKfQovKioKICogU2V0IGEgbmV3IGJpbmRpbmcgcm9vdCBpbmRleCBzbyB0aGF0IGhvc3QgdGVtcGxhdGUgZnVuY3Rpb25zIGNhbiBleGVjdXRlLgogKgogKiBCaW5kaW5ncyBpbnNpZGUgdGhlIGhvc3QgdGVtcGxhdGUgYXJlIDAgaW5kZXguIEJ1dCBiZWNhdXNlIHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZQogKiBob3cgbWFueSBob3N0IGJpbmRpbmdzIHdlIGhhdmUgd2UgY2FuJ3QgcHJlLWNvbXB1dGUgdGhlbS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGFsbAogKiAwIGluZGV4IGFuZCB3ZSBqdXN0IHNoaWZ0IHRoZSByb290IHNvIHRoYXQgdGhleSBtYXRjaCBuZXh0IGF2YWlsYWJsZSBsb2NhdGlvbiBpbiB0aGUgTFZpZXcuCiAqCiAqIEBwYXJhbSB7P30gYmluZGluZ1Jvb3RJbmRleCBSb290IGluZGV4IGZvciBgaG9zdEJpbmRpbmdzYAogKiBAcGFyYW0gez99IGN1cnJlbnREaXJlY3RpdmVJbmRleCBgVERhdGFbY3VycmVudERpcmVjdGl2ZUluZGV4XWAgd2lsbCBwb2ludCB0byB0aGUgY3VycmVudCBkaXJlY3RpdmUKICogICAgICAgIHdob3NlIGBob3N0QmluZGluZ3NgIGFyZSBiZWluZyBwcm9jZXNzZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRCaW5kaW5nUm9vdEZvckhvc3RCaW5kaW5ncyhiaW5kaW5nUm9vdEluZGV4LCBjdXJyZW50RGlyZWN0aXZlSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4ID0gYmluZGluZ1Jvb3RJbmRleDsKICAgIGxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXggPSBjdXJyZW50RGlyZWN0aXZlSW5kZXg7Cn0KLyoqCiAqIFdoZW4gaG9zdCBiaW5kaW5nIGlzIGV4ZWN1dGluZyB0aGlzIHBvaW50cyB0byB0aGUgZGlyZWN0aXZlIGluZGV4LgogKiBgVFZpZXcuZGF0YVtnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKV1gIGlzIGBEaXJlY3RpdmVEZWZgCiAqIGBMVmlld1tnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKV1gIGlzIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEN1cnJlbnREaXJlY3RpdmVJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXg7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDdXJyZW50UXVlcnlJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleDsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0Q3VycmVudFF1ZXJ5SW5kZXgodmFsdWUpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnRRdWVyeUluZGV4ID0gdmFsdWU7Cn0KLyoqCiAqIFRoaXMgaXMgYSBsaWdodCB3ZWlnaHQgdmVyc2lvbiBvZiB0aGUgYGVudGVyVmlld2Agd2hpY2ggaXMgbmVlZGVkIGJ5IHRoZSBESSBzeXN0ZW0uCiAqIEBwYXJhbSB7P30gbmV3VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbnRlckRJKG5ld1ZpZXcsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXdPclVuZGVmaW5lZChuZXdWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld0xGcmFtZSA9IGFsbG9jTEZyYW1lKCk7CiAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZSA9IG5ld0xGcmFtZTsKICAgIG5ld0xGcmFtZS5wcmV2aW91c09yUGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKTsKICAgIG5ld0xGcmFtZS5sVmlldyA9IG5ld1ZpZXc7Cn0KLyoqCiAqIFN3YXAgdGhlIGN1cnJlbnQgbFZpZXcgd2l0aCBhIG5ldyBsVmlldy4KICoKICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugc3RvcmUgdGhlIGxWaWV3IGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG1vZHVsZS4KICogVGhpcyB3YXkgd2UgbWluaW1pemUgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRvIHJlYWQuIFdoZW5ldmVyIGEgbmV3IHZpZXcKICogaXMgZW50ZXJlZCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBsVmlldyBmb3IgbGF0ZXIsIGFuZCB3aGVuIHRoZSB2aWV3IGlzCiAqIGV4aXRlZCB0aGUgc3RhdGUgaGFzIHRvIGJlIHJlc3RvcmVkCiAqCiAqIEBwYXJhbSB7P30gbmV3VmlldyBOZXcgbFZpZXcgdG8gYmVjb21lIGFjdGl2ZQogKiBAcGFyYW0gez99IHROb2RlIEVsZW1lbnQgdG8gd2hpY2ggdGhlIFZpZXcgaXMgYSBjaGlsZCBvZgogKiBAcmV0dXJuIHs/fSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbFZpZXc7CiAqLwpmdW5jdGlvbiBlbnRlclZpZXcobmV3VmlldywgdE5vZGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlld09yVW5kZWZpbmVkKG5ld1ZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmV3TEZyYW1lID0gYWxsb2NMRnJhbWUoKTsKICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuaXNQYXJlbnQsIHRydWUsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUubFZpZXcsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUudFZpZXcsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuc2VsZWN0ZWRJbmRleCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5lbGVtZW50RGVwdGhDb3VudCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXgsIC0xLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgYXNzZXJ0RXF1YWwobmV3TEZyYW1lLmN1cnJlbnROYW1lc3BhY2UsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuY3VycmVudFNhbml0aXplciwgbnVsbCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5iaW5kaW5nUm9vdEluZGV4LCAtMSwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50UXVlcnlJbmRleCwgMCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBuZXdWaWV3W1RWSUVXXTsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lID0gbmV3TEZyYW1lOwogICAgbmV3TEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwogICAgbmV3TEZyYW1lLmxWaWV3ID0gbmV3VmlldzsKICAgIG5ld0xGcmFtZS50VmlldyA9IHRWaWV3OwogICAgbmV3TEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChuZXdWaWV3KSk7CiAgICBuZXdMRnJhbWUuYmluZGluZ0luZGV4ID0gdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXg7Cn0KLyoqCiAqIEFsbG9jYXRlcyBuZXh0IGZyZWUgTEZyYW1lLiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJldXNlIHRoZSBgTEZyYW1lYHMgdG8gbG93ZXIgbWVtb3J5IHByZXNzdXJlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb2NMRnJhbWUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50TEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjaGlsZExGcmFtZSA9IGN1cnJlbnRMRnJhbWUgPT09IG51bGwgPyBudWxsIDogY3VycmVudExGcmFtZS5jaGlsZDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5ld0xGcmFtZSA9IGNoaWxkTEZyYW1lID09PSBudWxsID8gY3JlYXRlTEZyYW1lKGN1cnJlbnRMRnJhbWUpIDogY2hpbGRMRnJhbWU7CiAgICByZXR1cm4gbmV3TEZyYW1lOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTEZyYW1lKHBhcmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gewogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZTogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAvLwogICAgICAgIGlzUGFyZW50OiB0cnVlLAogICAgICAgIC8vCiAgICAgICAgbFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgLy8KICAgICAgICB0VmlldzogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAvLwogICAgICAgIHNlbGVjdGVkSW5kZXg6IDAsCiAgICAgICAgLy8KICAgICAgICBjb250ZXh0TFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgLy8KICAgICAgICBlbGVtZW50RGVwdGhDb3VudDogMCwKICAgICAgICAvLwogICAgICAgIGN1cnJlbnROYW1lc3BhY2U6IG51bGwsCiAgICAgICAgLy8KICAgICAgICBjdXJyZW50U2FuaXRpemVyOiBudWxsLAogICAgICAgIC8vCiAgICAgICAgY3VycmVudERpcmVjdGl2ZUluZGV4OiAtMSwKICAgICAgICAvLwogICAgICAgIGJpbmRpbmdSb290SW5kZXg6IC0xLAogICAgICAgIC8vCiAgICAgICAgYmluZGluZ0luZGV4OiAtMSwKICAgICAgICAvLwogICAgICAgIGN1cnJlbnRRdWVyeUluZGV4OiAwLAogICAgICAgIC8vCiAgICAgICAgcGFyZW50OiAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50KSksCiAgICAgICAgLy8KICAgICAgICBjaGlsZDogbnVsbCwKICAgIH07CiAgICBwYXJlbnQgIT09IG51bGwgJiYgKHBhcmVudC5jaGlsZCA9IGxGcmFtZSk7IC8vIGxpbmsgdGhlIG5ldyBMRnJhbWUgZm9yIHJldXNlLgogICAgcmV0dXJuIGxGcmFtZTsKfQovKioKICogQSBsaWdodHdlaWdodCB2ZXJzaW9uIG9mIGxlYXZlIHdoaWNoIGlzIHVzZWQgd2l0aCBESS4KICoKICogVGhpcyBmdW5jdGlvbiBvbmx5IHJlc2V0cyBgcHJldmlvdXNPclBhcmVudFROb2RlYCBhbmQgYExWaWV3YCBhcyB0aG9zZSBhcmUgdGhlIG9ubHkgcHJvcGVydGllcwogKiB1c2VkIHdpdGggREkgKGBlbnRlckRJKClgKS4KICoKICogTk9URTogVGhpcyBmdW5jdGlvbiBpcyByZWV4cG9ydGVkIGFzIGBsZWF2ZURJYC4gSG93ZXZlciBgbGVhdmVESWAgaGFzIHJldHVybiB0eXBlIG9mIGB2b2lkYCB3aGVyZQogKiBhcyBgbGVhdmVWaWV3TGlnaHRgIGhhcyBgTEZyYW1lYC4gVGhpcyBpcyBzbyB0aGF0IGBsZWF2ZVZpZXdMaWdodGAgY2FuIGJlIHVzZWQgaW4gYGxlYXZlVmlld2AuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBsZWF2ZVZpZXdMaWdodCgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG9sZExGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUgPSBvbGRMRnJhbWUucGFyZW50OwogICAgb2xkTEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICBvbGRMRnJhbWUubFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgcmV0dXJuIG9sZExGcmFtZTsKfQovKioKICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YgdGhlIGBsZWF2ZVZpZXdgIHdoaWNoIGlzIG5lZWRlZCBieSB0aGUgREkgc3lzdGVtLgogKgogKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGFsaWFzIHNvIHRoYXQgd2UgY2FuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gdG8gaGF2ZSBgdm9pZGAKICogcmV0dXJuIHR5cGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgbGVhdmVESSA9IGxlYXZlVmlld0xpZ2h0OwovKioKICogTGVhdmUgdGhlIGN1cnJlbnQgYExWaWV3YAogKgogKiBUaGlzIHBvcHMgdGhlIGBMRnJhbWVgIHdpdGggdGhlIGFzc29jaWF0ZWQgYExWaWV3YCBmcm9tIHRoZSBzdGFjay4KICoKICogSU1QT1JUQU5UOiBXZSBtdXN0IHplcm8gb3V0IHRoZSBgTEZyYW1lYCB2YWx1ZXMgaGVyZSBvdGhlcndpc2UgdGhleSB3aWxsIGJlIHJldGFpbmVkLiBUaGlzIGlzCiAqIGJlY2F1c2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2UgZG9uJ3QgcmVsZWFzZSBgTEZyYW1lYCBidXQgcmF0aGVyIGtlZXAgaXQgZm9yIG5leHQgdXNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbGVhdmVWaWV3KCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2xkTEZyYW1lID0gbGVhdmVWaWV3TGlnaHQoKTsKICAgIG9sZExGcmFtZS5pc1BhcmVudCA9IHRydWU7CiAgICBvbGRMRnJhbWUudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgb2xkTEZyYW1lLnNlbGVjdGVkSW5kZXggPSAwOwogICAgb2xkTEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICBvbGRMRnJhbWUuZWxlbWVudERlcHRoQ291bnQgPSAwOwogICAgb2xkTEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleCA9IC0xOwogICAgb2xkTEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBudWxsOwogICAgb2xkTEZyYW1lLmN1cnJlbnRTYW5pdGl6ZXIgPSBudWxsOwogICAgb2xkTEZyYW1lLmJpbmRpbmdSb290SW5kZXggPSAtMTsKICAgIG9sZExGcmFtZS5iaW5kaW5nSW5kZXggPSAtMTsKICAgIG9sZExGcmFtZS5jdXJyZW50UXVlcnlJbmRleCA9IDA7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbGV2ZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5leHRDb250ZXh0SW1wbChsZXZlbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dExWaWV3ID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY29udGV4dExWaWV3ID0KICAgICAgICB3YWxrVXBWaWV3cyhsZXZlbCwgKC8qKiBAdHlwZSB7P30gKi8gKGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmNvbnRleHRMVmlldykpKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGV4dExWaWV3W0NPTlRFWFRdKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmVzdGluZ0xldmVsCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdhbGtVcFZpZXdzKG5lc3RpbmdMZXZlbCwgY3VycmVudFZpZXcpIHsKICAgIHdoaWxlIChuZXN0aW5nTGV2ZWwgPiAwKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydERlZmluZWQoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10sICdEZWNsYXJhdGlvbiB2aWV3IHNob3VsZCBiZSBkZWZpbmVkIGlmIG5lc3RpbmcgbGV2ZWwgaXMgZ3JlYXRlciB0aGFuIDAuJyk7CiAgICAgICAgY3VycmVudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10pKTsKICAgICAgICBuZXN0aW5nTGV2ZWwtLTsKICAgIH0KICAgIHJldHVybiBjdXJyZW50VmlldzsKfQovKioKICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQgaW5kZXguCiAqCiAqIFVzZWQgd2l0aCB7XEBsaW5rIHByb3BlcnR5fSBpbnN0cnVjdGlvbiAoYW5kIG1vcmUgaW4gdGhlIGZ1dHVyZSkgdG8gaWRlbnRpZnkgdGhlIGluZGV4IGluIHRoZQogKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRJbmRleCgpIHsKICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5zZWxlY3RlZEluZGV4Owp9Ci8qKgogKiBTZXRzIHRoZSBtb3N0IHJlY2VudCBpbmRleCBwYXNzZWQgdG8ge1xAbGluayBzZWxlY3R9CiAqCiAqIFVzZWQgd2l0aCB7XEBsaW5rIHByb3BlcnR5fSBpbnN0cnVjdGlvbiAoYW5kIG1vcmUgaW4gdGhlIGZ1dHVyZSkgdG8gaWRlbnRpZnkgdGhlIGluZGV4IGluIHRoZQogKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLgogKgogKiAoTm90ZSB0aGF0IGlmIGFuICJleGl0IGZ1bmN0aW9uIiB3YXMgc2V0IGVhcmxpZXIgKHZpYSBgc2V0RWxlbWVudEV4aXRGbigpYCkgdGhlbiB0aGF0IHdpbGwgYmUKICogcnVuIGlmIGFuZCB3aGVuIHRoZSBwcm92aWRlZCBgaW5kZXhgIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGVkIGluZGV4IHZhbHVlLikKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0U2VsZWN0ZWRJbmRleChpbmRleCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuc2VsZWN0ZWRJbmRleCA9IGluZGV4Owp9Ci8qKgogKiBHZXRzIHRoZSBgdE5vZGVgIHRoYXQgcmVwcmVzZW50cyBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFNlbGVjdGVkVE5vZGUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsRnJhbWUgPSBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZTsKICAgIHJldHVybiBnZXRUTm9kZShsRnJhbWUudFZpZXcsIGxGcmFtZS5zZWxlY3RlZEluZGV4KTsKfQovKioKICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnYCBpbiBnbG9iYWwgc3RhdGUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtW5hbWVzcGFjZVNWRygpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBTVkdfTkFNRVNQQUNFOwp9Ci8qKgogKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYCdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nYCBpbiBnbG9iYWwgc3RhdGUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtW5hbWVzcGFjZU1hdGhNTCgpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBNQVRIX01MX05BTUVTUEFDRTsKfQovKioKICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGBudWxsYCwgd2hpY2ggZm9yY2VzIGVsZW1lbnQgY3JlYXRpb24gdG8gdXNlCiAqIGBjcmVhdGVFbGVtZW50YCByYXRoZXIgdGhhbiBgY3JlYXRlRWxlbWVudE5TYC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1bmFtZXNwYWNlSFRNTCgpIHsKICAgIG5hbWVzcGFjZUhUTUxJbnRlcm5hbCgpOwp9Ci8qKgogKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYG51bGxgLCB3aGljaCBmb3JjZXMgZWxlbWVudCBjcmVhdGlvbiB0byB1c2UKICogYGNyZWF0ZUVsZW1lbnRgIHJhdGhlciB0aGFuIGBjcmVhdGVFbGVtZW50TlNgLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmFtZXNwYWNlSFRNTEludGVybmFsKCkgewogICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZSA9IG51bGw7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYW1lc3BhY2UoKSB7CiAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZTsKfQovKioKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldEN1cnJlbnRTdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpIHsKICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnRTYW5pdGl6ZXIgPSBzYW5pdGl6ZXI7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVTYW5pdGl6ZXIoKSB7CiAgICAvLyBUT0RPKG1pc2tvKTogVGhpcyBzaG91bGQgdGhyb3cgd2hlbiB0aGVyZSBpcyBubyBMVmlldywgYnV0IGl0IHR1cm5zIG91dCB3ZSBjYW4gZ2V0IGhlcmUgZnJvbQogICAgLy8gYE5vZGVTdHlsZURlYnVnYCBoZW5jZSB3ZSByZXR1cm4gYG51bGxgLiBUaGlzIHNob3VsZCBiZSBmaXhlZAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICByZXR1cm4gbEZyYW1lID09PSBudWxsID8gbnVsbCA6IGxGcmFtZS5jdXJyZW50U2FuaXRpemVyOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2hvb2tzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZGRzIGFsbCBkaXJlY3RpdmUgbGlmZWN5Y2xlIGhvb2tzIGZyb20gdGhlIGdpdmVuIGBEaXJlY3RpdmVEZWZgIHRvIHRoZSBnaXZlbiBgVFZpZXdgLgogKgogKiBNdXN0IGJlIHJ1biAqb25seSogb24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MuCiAqCiAqIFNldHMgdXAgdGhlIHByZS1vcmRlciBob29rcyBvbiB0aGUgcHJvdmlkZWQgYHRWaWV3YCwKICogc2VlIHtcQGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS4KICoKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBUaGUgaW5kZXggb2YgdGhlIGRpcmVjdGl2ZSBpbiBMVmlldwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZURlZiBUaGUgZGVmaW5pdGlvbiBjb250YWluaW5nIHRoZSBob29rcyB0byBzZXR1cCBpbiB0VmlldwogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBjdXJyZW50IFRWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWdpc3RlclByZU9yZGVySG9va3MoZGlyZWN0aXZlSW5kZXgsIGRpcmVjdGl2ZURlZiwgdFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgY29uc3QgeyBvbkNoYW5nZXMsIG9uSW5pdCwgZG9DaGVjayB9ID0gZGlyZWN0aXZlRGVmOwogICAgaWYgKG9uQ2hhbmdlcykgewogICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBvbkNoYW5nZXMpOwogICAgICAgICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgfHwgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyA9IFtdKSkucHVzaChkaXJlY3RpdmVJbmRleCwgb25DaGFuZ2VzKTsKICAgIH0KICAgIGlmIChvbkluaXQpIHsKICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCgtZGlyZWN0aXZlSW5kZXgsIG9uSW5pdCk7CiAgICB9CiAgICBpZiAoZG9DaGVjaykgewogICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBkb0NoZWNrKTsKICAgICAgICAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgPSBbXSkpLnB1c2goZGlyZWN0aXZlSW5kZXgsIGRvQ2hlY2spOwogICAgfQp9Ci8qKgogKgogKiBMb29wcyB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIG9uIHRoZSBwcm92aWRlZCBgdE5vZGVgIGFuZCBxdWV1ZXMgaG9va3MgdG8gYmUKICogcnVuIHRoYXQgYXJlIG5vdCBpbml0aWFsaXphdGlvbiBob29rcy4KICoKICogU2hvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBgZWxlbWVudEVuZCgpYCBhbmQgc2ltaWxhciB0bwogKiBwcmVzZXJ2ZSBob29rIGV4ZWN1dGlvbiBvcmRlci4gQ29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kgaG9va3MgZm9yIHByb2plY3RlZAogKiBjb21wb25lbnRzIGFuZCBkaXJlY3RpdmVzIG11c3QgYmUgY2FsbGVkICpiZWZvcmUqIHRoZWlyIGhvc3RzLgogKgogKiBTZXRzIHVwIHRoZSBjb250ZW50LCB2aWV3LCBhbmQgZGVzdHJveSBob29rcyBvbiB0aGUgcHJvdmlkZWQgYHRWaWV3YCwKICogc2VlIHtcQGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS4KICoKICogTk9URTogVGhpcyBkb2VzIG5vdCBzZXQgdXAgYG9uQ2hhbmdlc2AsIGBvbkluaXRgIG9yIGBkb0NoZWNrYCwgdGhvc2UgYXJlIHNldCB1cAogKiBzZXBhcmF0ZWx5IGF0IGBlbGVtZW50U3RhcnRgLgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBjdXJyZW50IFRWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIFROb2RlIHdob3NlIGRpcmVjdGl2ZXMgYXJlIHRvIGJlIHNlYXJjaGVkIGZvciBob29rcyB0byBxdWV1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgdE5vZGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgLy8gSXQncyBuZWNlc3NhcnkgdG8gbG9vcCB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIGF0IGVsZW1lbnRFbmQoKSAocmF0aGVyIHRoYW4gcHJvY2Vzc2luZyBpbgogICAgLy8gZGlyZWN0aXZlQ3JlYXRlKSBzbyB3ZSBjYW4gcHJlc2VydmUgdGhlIGN1cnJlbnQgaG9vayBvcmRlci4gQ29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kKICAgIC8vIGhvb2tzIGZvciBwcm9qZWN0ZWQgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB0aGVpciBob3N0cy4KICAgIGZvciAobGV0IGkgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydCwgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaV0pKTsKICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudEluaXQpIHsKICAgICAgICAgICAgKHRWaWV3LmNvbnRlbnRIb29rcyB8fCAodFZpZXcuY29udGVudEhvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50SW5pdCk7CiAgICAgICAgfQogICAgICAgIGlmIChkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50Q2hlY2tlZCkgewogICAgICAgICAgICAodFZpZXcuY29udGVudEhvb2tzIHx8ICh0Vmlldy5jb250ZW50SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpOwogICAgICAgICAgICAodFZpZXcuY29udGVudENoZWNrSG9va3MgfHwgKHRWaWV3LmNvbnRlbnRDaGVja0hvb2tzID0gW10pKQogICAgICAgICAgICAgICAgLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpOwogICAgICAgIH0KICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyVmlld0luaXQpIHsKICAgICAgICAgICAgKHRWaWV3LnZpZXdIb29rcyB8fCAodFZpZXcudmlld0hvb2tzID0gW10pKS5wdXNoKC1pLCBkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3SW5pdCk7CiAgICAgICAgfQogICAgICAgIGlmIChkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3Q2hlY2tlZCkgewogICAgICAgICAgICAodFZpZXcudmlld0hvb2tzIHx8ICh0Vmlldy52aWV3SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpOwogICAgICAgICAgICAodFZpZXcudmlld0NoZWNrSG9va3MgfHwgKHRWaWV3LnZpZXdDaGVja0hvb2tzID0gW10pKS5wdXNoKGksIGRpcmVjdGl2ZURlZi5hZnRlclZpZXdDaGVja2VkKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5vbkRlc3Ryb3kgIT0gbnVsbCkgewogICAgICAgICAgICAodFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLm9uRGVzdHJveSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBFeGVjdXRpbmcgaG9va3MgcmVxdWlyZXMgY29tcGxleCBsb2dpYyBhcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aCAyIGNvbnN0cmFpbnRzLgogKgogKiAxLiBJbml0IGhvb2tzIChuZ09uSW5pdCwgbmdBZnRlckNvbnRlbnRJbml0LCBuZ0FmdGVyVmlld0luaXQpIG11c3QgYWxsIGJlIGV4ZWN1dGVkIG9uY2UgYW5kIG9ubHkKICogb25jZSwgYWNyb3NzIG1hbnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuIFRoaXMgbXVzdCBiZSB0cnVlIGV2ZW4gaWYgc29tZSBob29rcyB0aHJvdywgb3IgaWYKICogc29tZSByZWN1cnNpdmVseSB0cmlnZ2VyIGEgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS4KICogVG8gc29sdmUgdGhhdCwgaXQgaXMgcmVxdWlyZWQgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5pdCBob29rcy4KICogVGhpcyBpcyBkb25lIGJ5IHN0b3JpbmcgYW5kIG1haW50YWluaW5nIGZsYWdzIGluIHRoZSB2aWV3OiB0aGUge0BsaW5rIEluaXRQaGFzZVN0YXRlfSwKICogYW5kIHRoZSBpbmRleCB3aXRoaW4gdGhhdCBwaGFzZS4gVGhleSBjYW4gYmUgc2VlbiBhcyBhIGN1cnNvciBpbiB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKICogW1tvbkluaXQxLCBvbkluaXQyXSwgW2FmdGVyQ29udGVudEluaXQxXSwgW2FmdGVyVmlld0luaXQxLCBhZnRlclZpZXdJbml0MiwgYWZ0ZXJWaWV3SW5pdDNdXQogKiBUaGV5IGFyZSBhcmUgc3RvcmVkIGFzIGZsYWdzIGluIExWaWV3W0ZMQUdTXS4KICoKICogMi4gUHJlLW9yZGVyIGhvb2tzIGNhbiBiZSBleGVjdXRlZCBpbiBiYXRjaGVzLCBiZWNhdXNlIG9mIHRoZSBzZWxlY3QgaW5zdHJ1Y3Rpb24uCiAqIFRvIGJlIGFibGUgdG8gcGF1c2UgYW5kIHJlc3VtZSB0aGVpciBleGVjdXRpb24sIHdlIGFsc28gbmVlZCBzb21lIHN0YXRlIGFib3V0IHRoZSBob29rJ3MgYXJyYXkKICogdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQ6CiAqIC0gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhvb2sgdG8gYmUgZXhlY3V0ZWQKICogLSB0aGUgbnVtYmVyIG9mIGluaXQgaG9va3MgYWxyZWFkeSBmb3VuZCBpbiB0aGUgcHJvY2Vzc2VkIHBhcnQgb2YgdGhlICBhcnJheQogKiBUaGV5IGFyZSBhcmUgc3RvcmVkIGFzIGZsYWdzIGluIExWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdLgogKi8KLyoqCiAqIEV4ZWN1dGVzIHByZS1vcmRlciBjaGVjayBob29rcyAoIE9uQ2hhbmdlcywgRG9DaGFuZ2VzKSBnaXZlbiBhIHZpZXcgd2hlcmUgYWxsIHRoZSBpbml0IGhvb2tzIHdlcmUKICogZXhlY3V0ZWQgb25jZS4gVGhpcyBpcyBhIGxpZ2h0IHZlcnNpb24gb2YgZXhlY3V0ZUluaXRBbmRDaGVja1ByZU9yZGVySG9va3Mgd2hlcmUgd2UgY2FuIHNraXAgcmVhZAogKiAvIHdyaXRlIG9mIHRoZSBpbml0LWhvb2tzIHJlbGF0ZWQgZmxhZ3MuCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHdoZXJlIGhvb2tzIGFyZSBkZWZpbmVkCiAqIEBwYXJhbSB7P30gaG9va3MgSG9va3MgdG8gYmUgcnVuCiAqIEBwYXJhbSB7Pz19IG5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAqIC0gdW5kZWZpbmVkOiBhbGwgaG9va3MgZnJvbSB0aGUgYXJyYXkgc2hvdWxkIGJlIGV4ZWN1dGVkIChwb3N0LW9yZGVyIGNhc2UpCiAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlbgogKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlcgogKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBob29rcywgbm9kZUluZGV4KSB7CiAgICBjYWxsSG9va3MobFZpZXcsIGhvb2tzLCAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLywgbm9kZUluZGV4KTsKfQovKioKICogRXhlY3V0ZXMgcG9zdC1vcmRlciBpbml0IGFuZCBjaGVjayBob29rcyAob25lIG9mIEFmdGVyQ29udGVudEluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsCiAqIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQpIGdpdmVuIGEgdmlldyB3aGVyZSB0aGVyZSBhcmUgcGVuZGluZyBpbml0IGhvb2tzIHRvIGJlIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB3aGVyZSBob29rcyBhcmUgZGVmaW5lZAogKiBAcGFyYW0gez99IGhvb2tzIEhvb2tzIHRvIGJlIHJ1bgogKiBAcGFyYW0gez99IGluaXRQaGFzZSBBIHBoYXNlIGZvciB3aGljaCBob29rcyBzaG91bGQgYmUgcnVuCiAqIEBwYXJhbSB7Pz19IG5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAqIC0gdW5kZWZpbmVkOiBhbGwgaG9va3MgZnJvbSB0aGUgYXJyYXkgc2hvdWxkIGJlIGV4ZWN1dGVkIChwb3N0LW9yZGVyIGNhc2UpCiAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlbgogKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogKiAtIG51bWJlcjogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoYXQgbm9kZSBpbmRleCBleGNsdXNpdmUgKHByZS1vcmRlcgogKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgaG9va3MsIGluaXRQaGFzZSwgbm9kZUluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbChpbml0UGhhc2UsIDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovLCAnSW5pdCBwcmUtb3JkZXIgaG9va3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UnKTsKICAgIGlmICgobFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHsKICAgICAgICBjYWxsSG9va3MobFZpZXcsIGhvb2tzLCBpbml0UGhhc2UsIG5vZGVJbmRleCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbml0UGhhc2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluY3JlbWVudEluaXRQaGFzZUZsYWdzKGxWaWV3LCBpbml0UGhhc2UpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKGluaXRQaGFzZSwgMyAvKiBJbml0UGhhc2VDb21wbGV0ZWQgKi8sICdJbml0IGhvb2tzIHBoYXNlIHNob3VsZCBub3QgYmUgaW5jcmVtZW50ZWQgYWZ0ZXIgYWxsIGluaXQgaG9va3MgaGF2ZSBiZWVuIHJ1bi4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmbGFncyA9IGxWaWV3W0ZMQUdTXTsKICAgIGlmICgoZmxhZ3MgJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IGluaXRQaGFzZSkgewogICAgICAgIGZsYWdzICY9IDEwMjMgLyogSW5kZXhXaXRoaW5Jbml0UGhhc2VSZXNldCAqLzsKICAgICAgICBmbGFncyArPSAxIC8qIEluaXRQaGFzZVN0YXRlSW5jcmVtZW50ZXIgKi87CiAgICAgICAgbFZpZXdbRkxBR1NdID0gZmxhZ3M7CiAgICB9Cn0KLyoqCiAqIENhbGxzIGxpZmVjeWNsZSBob29rcyB3aXRoIHRoZWlyIGNvbnRleHRzLCBza2lwcGluZyBpbml0IGhvb2tzIGlmIGl0J3Mgbm90CiAqIHRoZSBmaXJzdCBMVmlldyBwYXNzCiAqCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcgVGhlIGN1cnJlbnQgdmlldwogKiBAcGFyYW0gez99IGFyciBUaGUgYXJyYXkgaW4gd2hpY2ggdGhlIGhvb2tzIGFyZSBmb3VuZAogKiBAcGFyYW0gez99IGluaXRQaGFzZQogKiBAcGFyYW0gez99IGN1cnJlbnROb2RlSW5kZXggMyBjYXNlcyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlOgogKiAtIHVuZGVmaW5lZDogYWxsIGhvb2tzIGZyb20gdGhlIGFycmF5IHNob3VsZCBiZSBleGVjdXRlZCAocG9zdC1vcmRlciBjYXNlKQogKiAtIG51bGw6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBhcnJheSAocHJlLW9yZGVyIGNhc2UsIHdoZW4KICogZmx1c2hpbmcgdGhlIHJlbWFpbmluZyBob29rcykKICogLSBudW1iZXI6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGF0IG5vZGUgaW5kZXggZXhjbHVzaXZlIChwcmUtb3JkZXIKICogY2FzZSwgd2hlbiBleGVjdXRpbmcgc2VsZWN0KG51bWJlcikpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjYWxsSG9va3MoY3VycmVudFZpZXcsIGFyciwgaW5pdFBoYXNlLCBjdXJyZW50Tm9kZUluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbChnZXRDaGVja05vQ2hhbmdlc01vZGUoKSwgZmFsc2UsICdIb29rcyBzaG91bGQgbmV2ZXIgYmUgcnVuIGluIHRoZSBjaGVjayBubyBjaGFuZ2VzIG1vZGUuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzdGFydEluZGV4ID0gY3VycmVudE5vZGVJbmRleCAhPT0gdW5kZWZpbmVkID8KICAgICAgICAoY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gJiA2NTUzNSAvKiBJbmRleE9mVGhlTmV4dFByZU9yZGVySG9va01hc2tNYXNrICovKSA6CiAgICAgICAgMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVJbmRleExpbWl0ID0gY3VycmVudE5vZGVJbmRleCAhPSBudWxsID8gY3VycmVudE5vZGVJbmRleCA6IC0xOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGxhc3ROb2RlSW5kZXhGb3VuZCA9IDA7CiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob29rID0gKC8qKiBAdHlwZSB7P30gKi8gKGFycltpICsgMV0pKTsKICAgICAgICBpZiAodHlwZW9mIGhvb2sgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGxhc3ROb2RlSW5kZXhGb3VuZCA9ICgvKiogQHR5cGUgez99ICovIChhcnJbaV0pKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlSW5kZXggIT0gbnVsbCAmJiBsYXN0Tm9kZUluZGV4Rm91bmQgPj0gY3VycmVudE5vZGVJbmRleCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNJbml0SG9vayA9IGFycltpXSA8IDA7CiAgICAgICAgICAgIGlmIChpc0luaXRIb29rKQogICAgICAgICAgICAgICAgY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gKz0gNjU1MzYgLyogTnVtYmVyT2ZJbml0SG9va3NDYWxsZWRJbmNyZW1lbnRlciAqLzsKICAgICAgICAgICAgaWYgKGxhc3ROb2RlSW5kZXhGb3VuZCA8IG5vZGVJbmRleExpbWl0IHx8IG5vZGVJbmRleExpbWl0ID09IC0xKSB7CiAgICAgICAgICAgICAgICBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpOwogICAgICAgICAgICAgICAgY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gPQogICAgICAgICAgICAgICAgICAgIChjdXJyZW50Vmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSAmIDQyOTQ5MDE3NjAgLyogTnVtYmVyT2ZJbml0SG9va3NDYWxsZWRNYXNrICovKSArIGkgKwogICAgICAgICAgICAgICAgICAgICAgICAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEV4ZWN1dGUgb25lIGhvb2sgYWdhaW5zdCB0aGUgY3VycmVudCBgTFZpZXdgLgogKgogKiBAcGFyYW0gez99IGN1cnJlbnRWaWV3IFRoZSBjdXJyZW50IHZpZXcKICogQHBhcmFtIHs/fSBpbml0UGhhc2UKICogQHBhcmFtIHs/fSBhcnIgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBob29rcyBhcmUgZm91bmQKICogQHBhcmFtIHs/fSBpIFRoZSBjdXJyZW50IGluZGV4IHdpdGhpbiB0aGUgaG9vayBkYXRhIGFycmF5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzSW5pdEhvb2sgPSBhcnJbaV0gPCAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaG9vayA9ICgvKiogQHR5cGUgez99ICovIChhcnJbaSArIDFdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXJlY3RpdmVJbmRleCA9IGlzSW5pdEhvb2sgPyAtYXJyW2ldIDogKC8qKiBAdHlwZSB7P30gKi8gKGFycltpXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlID0gY3VycmVudFZpZXdbZGlyZWN0aXZlSW5kZXhdOwogICAgaWYgKGlzSW5pdEhvb2spIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXhXaXRoaW50SW5pdFBoYXNlID0gY3VycmVudFZpZXdbRkxBR1NdID4+IDEwIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlU2hpZnQgKi87CiAgICAgICAgLy8gVGhlIGluaXQgcGhhc2Ugc3RhdGUgbXVzdCBiZSBhbHdheXMgY2hlY2tlZCBoZXJlIGFzIGl0IG1heSBoYXZlIGJlZW4gcmVjdXJzaXZlbHkKICAgICAgICAvLyB1cGRhdGVkCiAgICAgICAgaWYgKGluZGV4V2l0aGludEluaXRQaGFzZSA8CiAgICAgICAgICAgIChjdXJyZW50Vmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA+PiAxNiAvKiBOdW1iZXJPZkluaXRIb29rc0NhbGxlZFNoaWZ0ICovKSAmJgogICAgICAgICAgICAoY3VycmVudFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHsKICAgICAgICAgICAgY3VycmVudFZpZXdbRkxBR1NdICs9IDEwMjQgLyogSW5kZXhXaXRoaW5Jbml0UGhhc2VJbmNyZW1lbnRlciAqLzsKICAgICAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9pbmplY3Rvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVE5PREUgPSA4OwovKiogQHR5cGUgez99ICovCmNvbnN0IFBBUkVOVF9JTkpFQ1RPUiA9IDg7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5KRUNUT1JfQkxPT01fUEFSRU5UX1NJWkUgPSA5OwovKiogQHR5cGUgez99ICovCmNvbnN0IE5PX1BBUkVOVF9JTkpFQ1RPUiA9ICgvKiogQHR5cGUgez99ICovICgtMSkpOwovKioKICogRWFjaCBpbmplY3RvciBpcyBzYXZlZCBpbiA5IGNvbnRpZ3VvdXMgc2xvdHMgaW4gYExWaWV3YCBhbmQgOSBjb250aWd1b3VzIHNsb3RzIGluCiAqIGBUVmlldy5kYXRhYC4gVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbm9kZSdzIHRva2VucyAod2hpY2gKICogY2FuIGJlIHNoYXJlZCBpbiBgVFZpZXdgKSBhcyB3ZWxsIGFzIHRoZSB0b2tlbnMgb2YgaXRzIGFuY2VzdG9yIG5vZGVzICh3aGljaCBjYW5ub3QgYmUKICogc2hhcmVkLCBzbyB0aGV5IGxpdmUgaW4gYExWaWV3YCkuCiAqCiAqIEVhY2ggb2YgdGhlc2Ugc2xvdHMgKGFzaWRlIGZyb20gdGhlIGxhc3Qgc2xvdCkgY29udGFpbnMgYSBibG9vbSBmaWx0ZXIuIFRoaXMgYmxvb20gZmlsdGVyCiAqIGRldGVybWluZXMgd2hldGhlciBhIGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUgb24gdGhlIGFzc29jaWF0ZWQgbm9kZSBvciBub3QuIFRoaXMgcHJldmVudHMgdXMKICogZnJvbSBzZWFyY2hpbmcgdGhlIGRpcmVjdGl2ZXMgYXJyYXkgYXQgdGhpcyBsZXZlbCB1bmxlc3MgaXQncyBwcm9iYWJsZSB0aGUgZGlyZWN0aXZlIGlzIGluIGl0LgogKgogKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jsb29tX2ZpbHRlciBmb3IgbW9yZSBhYm91dCBibG9vbSBmaWx0ZXJzLgogKgogKiBCZWNhdXNlIGFsbCBpbmplY3RvcnMgaGF2ZSBiZWVuIGZsYXR0ZW5lZCBpbnRvIGBMVmlld2AgYW5kIGBUVmlld0RhdGFgLCB0aGV5IGNhbm5vdCB0eXBlZAogKiB1c2luZyBpbnRlcmZhY2VzIGFzIHRoZXkgd2VyZSBwcmV2aW91c2x5LiBUaGUgc3RhcnQgaW5kZXggb2YgZWFjaCBgTEluamVjdG9yYCBhbmQgYFRJbmplY3RvcmAKICogd2lsbCBkaWZmZXIgYmFzZWQgb24gd2hlcmUgaXQgaXMgZmxhdHRlbmVkIGludG8gdGhlIG1haW4gYXJyYXksIHNvIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGtub3cKICogdGhlIGluZGljZXMgYWhlYWQgb2YgdGltZSBhbmQgc2F2ZSB0aGVpciB0eXBlcyBoZXJlLiBUaGUgaW50ZXJmYWNlcyBhcmUgc3RpbGwgaW5jbHVkZWQgaGVyZQogKiBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KICoKICogZXhwb3J0IGludGVyZmFjZSBMSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAwLTMxICAoSURzIGFyZSAlIEJMT09NX1NJWkUpCiAqICAgIFswXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDMyLTYzCiAqICAgIFsxXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDY0LTk1CiAqICAgIFsyXTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDk2LTEyNwogKiAgICBbM106IG51bWJlcjsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxMjgtMTU5CiAqICAgIFs0XTogbnVtYmVyOwogKgogKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE2MCAtIDE5MQogKiAgICBbNV06IG51bWJlcjsKICoKICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAxOTIgLSAyMjMKICogICAgWzZdOiBudW1iZXI7CiAqCiAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMjI0IC0gMjU1CiAqICAgIFs3XTogbnVtYmVyOwogKgogKiAgICAvLyBXZSBuZWVkIHRvIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmplY3RvcidzIHBhcmVudCBzbyBESSBjYW4ga2VlcCBsb29raW5nIHVwCiAqICAgIC8vIHRoZSBpbmplY3RvciB0cmVlIHVudGlsIGl0IGZpbmRzIHRoZSBkZXBlbmRlbmN5IGl0J3MgbG9va2luZyBmb3IuCiAqICAgIFtQQVJFTlRfSU5KRUNUT1JdOiBudW1iZXI7CiAqIH0KICoKICogZXhwb3J0IGludGVyZmFjZSBUSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMC0zMSAgKElEcyBhcmUgJSBCTE9PTV9TSVpFKQogKiAgICBbMF06IG51bWJlcjsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMzItNjMKICogICAgWzFdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDY0LTk1CiAqICAgIFsyXTogbnVtYmVyOwogKgogKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyA5Ni0xMjcKICogICAgWzNdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDEyOC0xNTkKICogICAgWzRdOiBudW1iZXI7CiAqCiAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE2MCAtIDE5MQogKiAgICBbNV06IG51bWJlcjsKICoKICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTkyIC0gMjIzCiAqICAgIFs2XTogbnVtYmVyOwogKgogKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAyMjQgLSAyNTUKICogICAgWzddOiBudW1iZXI7CiAqCiAqICAgIC8vIE5lY2Vzc2FyeSB0byBmaW5kIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBhIHBhcnRpY3VsYXIgbm9kZS4KICogICAgW1ROT0RFXTogVEVsZW1lbnROb2RlfFRFbGVtZW50Q29udGFpbmVyTm9kZXxUQ29udGFpbmVyTm9kZTsKICogIH0KICovCi8qKgogKiBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgaW5qZWN0b3JzIGluIHRoZSBOb2RlSW5qZWN0b3IuCiAqCiAqIFRoaXMgZmFjdG9yeSBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGNhbiByZXNvbHZlIGBtdWx0aWAgZmFjdG9yaWVzIGFzIHdlbGwuCiAqCiAqIE5PVEU6IFNvbWUgb2YgdGhlIGZpZWxkcyBhcmUgb3B0aW9uYWwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIGNsYXNzIGhhcyB0d28gaGlkZGVuIGNsYXNzZXMuCiAqIC0gT25lIHdpdGhvdXQgYG11bHRpYCBzdXBwb3J0IChtb3N0IGNvbW1vbikKICogLSBPbmUgd2l0aCBgbXVsdGlgIHZhbHVlcywgKHJhcmUpLgogKgogKiBTaW5jZSBWTXMgY2FuIGNhY2hlIHVwIHRvIDQgaW5saW5lIGhpZGRlbiBjbGFzc2VzIHRoaXMgaXMgT0suCiAqCiAqIC0gU2luZ2xlIGZhY3Rvcnk6IE9ubHkgYHJlc29sdmluZ2AgYW5kIGBmYWN0b3J5YCBpcyBkZWZpbmVkLgogKiAtIGBwcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXggPSAtMWAuCiAqIC0gYHZpZXdQcm92aWRlcnNgIGZhY3Rvcnk6IGBjb21wb25lbnRQcm92aWRlcnNgIGlzIGEgbnVtYmVyIGFuZCBgaW5kZXhgIHBvaW50cyB0byBgcHJvdmlkZXJzYC4KICovCmNsYXNzIE5vZGVJbmplY3RvckZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0SW1wbGVtZW50YXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IoZmFjdG9yeSwgCiAgICAvKioKICAgICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIHRva2VuIGlzIGRlY2xhcmVkIGluIGB2aWV3UHJvdmlkZXJzYCAob3IgaWYgaXQgaXMgY29tcG9uZW50KS4KICAgICAqLwogICAgaXNWaWV3UHJvdmlkZXIsIGluamVjdEltcGxlbWVudGF0aW9uKSB7CiAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAvKioKICAgICAgICAgKiBNYXJrZXIgc2V0IHRvIHRydWUgZHVyaW5nIGZhY3RvcnkgaW52b2NhdGlvbiB0byBzZWUgaWYgd2UgZ2V0IGludG8gcmVjdXJzaXZlIGxvb3AuCiAgICAgICAgICogUmVjdXJzaXZlIGxvb3AgY2F1c2VzIGFuIGVycm9yIHRvIGJlIGRpc3BsYXllZC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlc29sdmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycyA9IGlzVmlld1Byb3ZpZGVyOwogICAgICAgIHRoaXMuaW5qZWN0SW1wbCA9IGluamVjdEltcGxlbWVudGF0aW9uOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG9iagogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNGYWN0b3J5KG9iaikgewogICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE5vZGVJbmplY3RvckZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvbm9kZV9hc3NlcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROb2RlVHlwZSh0Tm9kZSwgdHlwZSkgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3Nob3VsZCBiZSBjYWxsZWQgd2l0aCBhIFROb2RlJyk7CiAgICBhc3NlcnRFcXVhbCh0Tm9kZS50eXBlLCB0eXBlLCBgc2hvdWxkIGJlIGEgJHt0eXBlTmFtZSh0eXBlKX1gKTsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gey4uLj99IHR5cGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAuLi50eXBlcykgewogICAgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ3Nob3VsZCBiZSBjYWxsZWQgd2l0aCBhIFROb2RlJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3VuZCA9IHR5cGVzLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0eXBlID0+IHROb2RlLnR5cGUgPT09IHR5cGUpKTsKICAgIGFzc2VydEVxdWFsKGZvdW5kLCB0cnVlLCBgU2hvdWxkIGJlIG9uZSBvZiAke3R5cGVzLm1hcCh0eXBlTmFtZSkuam9pbignLCAnKX0gYnV0IGdvdCAke3R5cGVOYW1lKHROb2RlLnR5cGUpfWApOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHR5cGVOYW1lKHR5cGUpIHsKICAgIGlmICh0eXBlID09IDEgLyogUHJvamVjdGlvbiAqLykKICAgICAgICByZXR1cm4gJ1Byb2plY3Rpb24nOwogICAgaWYgKHR5cGUgPT0gMCAvKiBDb250YWluZXIgKi8pCiAgICAgICAgcmV0dXJuICdDb250YWluZXInOwogICAgaWYgKHR5cGUgPT0gNSAvKiBJY3VDb250YWluZXIgKi8pCiAgICAgICAgcmV0dXJuICdJY3VDb250YWluZXInOwogICAgaWYgKHR5cGUgPT0gMiAvKiBWaWV3ICovKQogICAgICAgIHJldHVybiAnVmlldyc7CiAgICBpZiAodHlwZSA9PSAzIC8qIEVsZW1lbnQgKi8pCiAgICAgICAgcmV0dXJuICdFbGVtZW50JzsKICAgIGlmICh0eXBlID09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLykKICAgICAgICByZXR1cm4gJ0VsZW1lbnRDb250YWluZXInOwogICAgcmV0dXJuICc8dW5rbm93bj4nOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3V0aWwvYXR0cnNfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFzc2lnbnMgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gdGhlIHByb3ZpZGVkIGVsZW1lbnQgdmlhIHRoZSBpbmZlcnJlZCByZW5kZXJlci4KICoKICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHR3byBmb3JtcyBvZiBhdHRyaWJ1dGUgZW50cmllczoKICoKICogZGVmYXVsdDogKGtleSwgdmFsdWUpOgogKiAgYXR0cnMgPSBba2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTJdCiAqCiAqIG5hbWVzcGFjZWQ6IChOQU1FU1BBQ0VfTUFSS0VSLCB1cmksIG5hbWUsIHZhbHVlKQogKiAgYXR0cnMgPSBbTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZSwgTkFNRVNQQUNFX01BUktFUiwgdXJpLCBuYW1lLCB2YWx1ZV0KICoKICogVGhlIGBhdHRyc2AgYXJyYXkgY2FuIGNvbnRhaW4gYSBtaXggb2YgYm90aCB0aGUgZGVmYXVsdCBhbmQgbmFtZXNwYWNlZCBlbnRyaWVzLgogKiBUaGUgImRlZmF1bHQiIHZhbHVlcyBhcmUgc2V0IHdpdGhvdXQgYSBtYXJrZXIsIGJ1dCBpZiB0aGUgZnVuY3Rpb24gY29tZXMgYWNyb3NzCiAqIGEgbWFya2VyIHZhbHVlIHRoZW4gaXQgd2lsbCBhdHRlbXB0IHRvIHNldCBhIG5hbWVzcGFjZWQgdmFsdWUuIElmIHRoZSBtYXJrZXIgaXMKICogbm90IG9mIGEgbmFtZXNwYWNlZCB2YWx1ZSB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHF1aXQgYW5kIHJldHVybiB0aGUgaW5kZXggdmFsdWUKICogd2hlcmUgaXQgc3RvcHBlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiBvZiB0aGUgYXR0cnMgYXJyYXkuCiAqCiAqIFNlZSBbQXR0cmlidXRlTWFya2VyXSB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIG5hbWVzcGFjZSBtYXJrZXIgdmFsdWUgaXMuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIGluc3RydWN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYXNzaWduaW5nIHN0eWxlIGFuZCBjbGFzcyB2YWx1ZXMgdG8KICogYW4gZWxlbWVudC4gU2VlIGBlbGVtZW50U3RhcnRgIGFuZCBgZWxlbWVudEhvc3RBdHRyc2AgdG8gbGVhcm4gaG93IHN0eWxpbmcgdmFsdWVzCiAqIGFyZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgVGhlIHJlbmRlcmVyIHRvIGJlIHVzZWQKICogQHBhcmFtIHs/fSBuYXRpdmUgVGhlIGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGFzc2lnbmVkIHRvCiAqIEBwYXJhbSB7P30gYXR0cnMgVGhlIGF0dHJpYnV0ZSBhcnJheSBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBlbGVtZW50CiAqIEByZXR1cm4gez99IHRoZSBpbmRleCB2YWx1ZSB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkIGluIHRoZSBhdHRyaWJ1dGVzIGFycmF5CiAqLwpmdW5jdGlvbiBzZXRVcEF0dHJpYnV0ZXMocmVuZGVyZXIsIG5hdGl2ZSwgYXR0cnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzUHJvYyA9IGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgLy8gb25seSBuYW1lc3BhY2VzIGFyZSBzdXBwb3J0ZWQuIE90aGVyIHZhbHVlIHR5cGVzIChzdWNoIGFzIHN0eWxlL2NsYXNzCiAgICAgICAgICAgIC8vIGVudHJpZXMpIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZnVuY3Rpb24uCiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHdlIGp1c3QgbGFuZGVkIG9uIHRoZSBtYXJrZXIgdmFsdWUgLi4uIHRoZXJlZm9yZQogICAgICAgICAgICAvLyB3ZSBzaG91bGQgc2tpcCB0byB0aGUgbmV4dCBlbnRyeQogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlVVJJID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJzW2krK10pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0clZhbCA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKzsKICAgICAgICAgICAgaXNQcm9jID8KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsIGF0dHJWYWwsIG5hbWVzcGFjZVVSSSkgOgogICAgICAgICAgICAgICAgbmF0aXZlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gYXR0ck5hbWUgaXMgc3RyaW5nOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0clZhbCA9IGF0dHJzWysraV07CiAgICAgICAgICAgIC8vIFN0YW5kYXJkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldEF0dHJpYnV0ZSsrOwogICAgICAgICAgICBpZiAoaXNBbmltYXRpb25Qcm9wKGF0dHJOYW1lKSkgewogICAgICAgICAgICAgICAgaWYgKGlzUHJvYykgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0UHJvcGVydHkobmF0aXZlLCBhdHRyTmFtZSwgYXR0clZhbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpc1Byb2MgPwogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0QXR0cmlidXRlKG5hdGl2ZSwgYXR0ck5hbWUsICgvKiogQHR5cGUgez99ICovIChhdHRyVmFsKSkpIDoKICAgICAgICAgICAgICAgICAgICBuYXRpdmUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0clZhbCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQogICAgLy8gYW5vdGhlciBwaWVjZSBvZiBjb2RlIG1heSBpdGVyYXRlIG92ZXIgdGhlIHNhbWUgYXR0cmlidXRlcyBhcnJheS4gVGhlcmVmb3JlCiAgICAvLyBpdCBtYXkgYmUgaGVscGZ1bCB0byByZXR1cm4gdGhlIGV4YWN0IHNwb3Qgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgYXJyYXkgZXhpdGVkCiAgICAvLyB3aGV0aGVyIGJ5IHJ1bm5pbmcgaW50byBhbiB1bnN1cHBvcnRlZCBtYXJrZXIgb3IgaWYgYWxsIHRoZSBzdGF0aWMgdmFsdWVzIHdlcmUKICAgIC8vIGl0ZXJhdGVkIG92ZXIuCiAgICByZXR1cm4gaTsKfQovKioKICogVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG1hcmtlciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcKICogYXR0cmlidXRlIHZhbHVlcyBpbiBhIGBUQXR0cmlidXRlc2AgYXJyYXkgYXJlIG9ubHkgdGhlIG5hbWVzIG9mIGF0dHJpYnV0ZXMsCiAqIGFuZCBub3QgbmFtZS12YWx1ZSBwYWlycy4KICogQHBhcmFtIHs/fSBtYXJrZXIgVGhlIGF0dHJpYnV0ZSBtYXJrZXIgdG8gdGVzdC4KICogQHJldHVybiB7P30gdHJ1ZSBpZiB0aGUgbWFya2VyIGlzIGEgIm5hbWUtb25seSIgbWFya2VyIChlLmcuIGBCaW5kaW5nc2AsIGBUZW1wbGF0ZWAgb3IgYEkxOG5gKS4KICovCmZ1bmN0aW9uIGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobWFya2VyKSB7CiAgICByZXR1cm4gbWFya2VyID09PSAzIC8qIEJpbmRpbmdzICovIHx8IG1hcmtlciA9PT0gNCAvKiBUZW1wbGF0ZSAqLyB8fAogICAgICAgIG1hcmtlciA9PT0gNiAvKiBJMThuICovOwp9Ci8qKgogKiBAcGFyYW0gez99IG5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQW5pbWF0aW9uUHJvcChuYW1lKSB7CiAgICAvLyBQZXJmIG5vdGU6IGFjY2Vzc2luZyBjaGFyQ29kZUF0IHRvIGNoZWNrIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgc3RyaW5nIGlzIGZhc3RlciBhcwogICAgLy8gY29tcGFyZWQgdG8gYWNjZXNzaW5nIGEgY2hhcmFjdGVyIGF0IGluZGV4IDAgKGV4LiBuYW1lWzBdKS4gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKICAgIC8vIGNoYXJDb2RlQXQgZG9lc24ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gcmV0dXJuIGEgc3Vic3RyaW5nLgogICAgcmV0dXJuIG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gNjQgLyogQVRfU0lHTiAqLzsKfQovKioKICogTWVyZ2VzIGBzcmNgIGBUQXR0cmlidXRlc2AgaW50byBgZHN0YCBgVEF0dHJpYnV0ZXNgIHJlbW92aW5nIGFueSBkdXBsaWNhdGVzIGluIHRoZSBwcm9jZXNzLgogKgogKiBUaGlzIG1lcmdlIGZ1bmN0aW9uIGtlZXBzIHRoZSBvcmRlciBvZiBhdHRycyBzYW1lLgogKgogKiBAcGFyYW0gez99IGRzdCBMb2NhdGlvbiBvZiB3aGVyZSB0aGUgbWVyZ2VkIGBUQXR0cmlidXRlc2Agc2hvdWxkIGVuZCB1cC4KICogQHBhcmFtIHs/fSBzcmMgYFRBdHRyaWJ1dGVzYCB3aGljaCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gYGRzdGAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1lcmdlSG9zdEF0dHJzKGRzdCwgc3JjKSB7CiAgICBpZiAoc3JjID09PSBudWxsIHx8IHNyYy5sZW5ndGggPT09IDApIDsKICAgIGVsc2UgaWYgKGRzdCA9PT0gbnVsbCB8fCBkc3QubGVuZ3RoID09PSAwKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBzb3VyY2UsIGJ1dCBkc3QgaXMgZW1wdHksIGp1c3QgbWFrZSBhIGNvcHkuCiAgICAgICAgZHN0ID0gc3JjLnNsaWNlKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNyY01hcmtlciA9IC0xIC8qIEltcGxpY2l0QXR0cmlidXRlcyAqLzsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzcmNbaV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHNyY01hcmtlciA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3JjTWFya2VyID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjTWFya2VyID09PSAtMSAvKiBJbXBsaWNpdEF0dHJpYnV0ZXMgKi8gfHwKICAgICAgICAgICAgICAgICAgICBzcmNNYXJrZXIgPT09IDIgLyogU3R5bGVzICovKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGNvbnN1bWUgYGtleTFgIGFuZCBgdmFsdWVgIG9ubHkuCiAgICAgICAgICAgICAgICAgICAgbWVyZ2VIb3N0QXR0cmlidXRlKGRzdCwgc3JjTWFya2VyLCAoLyoqIEB0eXBlIHs/fSAqLyAoaXRlbSkpLCBudWxsLCAoLyoqIEB0eXBlIHs/fSAqLyAoc3JjWysraV0pKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBDYXNlIHdoZXJlIHdlIGhhdmUgdG8gY29uc3VtZSBga2V5MWAgb25seS4KICAgICAgICAgICAgICAgICAgICBtZXJnZUhvc3RBdHRyaWJ1dGUoZHN0LCBzcmNNYXJrZXIsICgvKiogQHR5cGUgez99ICovIChpdGVtKSksIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGRzdDsKfQovKioKICogQXBwZW5kIGBrZXlgL2B2YWx1ZWAgdG8gZXhpc3RpbmcgYFRBdHRyaWJ1dGVzYCB0YWtpbmcgcmVnaW9uIG1hcmtlciBhbmQgZHVwbGljYXRlcyBpbnRvIGFjY291bnQuCiAqCiAqIEBwYXJhbSB7P30gZHN0IGBUQXR0cmlidXRlc2AgdG8gYXBwZW5kIHRvLgogKiBAcGFyYW0gez99IG1hcmtlciBSZWdpb24gd2hlcmUgdGhlIGBrZXlgL2B2YWx1ZWAgc2hvdWxkIGJlIGFkZGVkLgogKiBAcGFyYW0gez99IGtleTEgS2V5IHRvIGFkZCB0byBgVEF0dHJpYnV0ZXNgCiAqIEBwYXJhbSB7P30ga2V5MiBLZXkgdG8gYWRkIHRvIGBUQXR0cmlidXRlc2AgKGluIGNhc2Ugb2YgYEF0dHJpYnV0ZU1hcmtlci5OYW1lc3BhY2VVUklgKQogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIHRvIGFkZCBvciB0byBvdmVyd3JpdGUgdG8gYFRBdHRyaWJ1dGVzYCBPbmx5IHVzZWQgaWYgYG1hcmtlcmAgaXMgbm90IENsYXNzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cmlidXRlKGRzdCwgbWFya2VyLCBrZXkxLCBrZXkyLCB2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSAwOwogICAgLy8gQXNzdW1lIHRoYXQgbmV3IG1hcmtlcnMgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZW5kLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hcmtlckluc2VydFBvc2l0aW9uID0gZHN0Lmxlbmd0aDsKICAgIC8vIHNjYW4gdW50aWwgY29ycmVjdCB0eXBlLgogICAgaWYgKG1hcmtlciA9PT0gLTEgLyogSW1wbGljaXRBdHRyaWJ1dGVzICovKSB7CiAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdoaWxlIChpIDwgZHN0Lmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRzdFZhbHVlID0gZHN0W2krK107CiAgICAgICAgICAgIGlmICh0eXBlb2YgZHN0VmFsdWUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBpZiAoZHN0VmFsdWUgPT09IG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlckluc2VydFBvc2l0aW9uID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RWYWx1ZSA+IG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2F2ZSB0aGlzIGFzIHdlIHdhbnQgdGhlIG1hcmtlcnMgdG8gYmUgaW5zZXJ0ZWQgaW4gc3BlY2lmaWMgb3JkZXIuCiAgICAgICAgICAgICAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIHNlYXJjaCB1bnRpbCB5b3UgZmluZCBwbGFjZSBvZiBpbnNlcnRpb24KICAgIHdoaWxlIChpIDwgZHN0Lmxlbmd0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtID0gZHN0W2ldOwogICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgLy8gc2luY2UgYGlgIHN0YXJ0ZWQgYXMgdGhlIGluZGV4IGFmdGVyIHRoZSBtYXJrZXIsIHdlIGRpZCBub3QgZmluZCBpdCBpZiB3ZSBhcmUgYXQgdGhlIG5leHQKICAgICAgICAgICAgLy8gbWFya2VyCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpdGVtID09PSBrZXkxKSB7CiAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBzYW1lIHRva2VuCiAgICAgICAgICAgIGlmIChrZXkyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBkc3RbaSArIDFdID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoa2V5MiA9PT0gZHN0W2kgKyAxXSkgewogICAgICAgICAgICAgICAgZHN0W2kgKyAyXSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEluY3JlbWVudCBjb3VudGVyLgogICAgICAgIGkrKzsKICAgICAgICBpZiAoa2V5MiAhPT0gbnVsbCkKICAgICAgICAgICAgaSsrOwogICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgaSsrOwogICAgfQogICAgLy8gaW5zZXJ0IGF0IGxvY2F0aW9uLgogICAgaWYgKG1hcmtlckluc2VydFBvc2l0aW9uICE9PSAtMSkgewogICAgICAgIGRzdC5zcGxpY2UobWFya2VySW5zZXJ0UG9zaXRpb24sIDAsIG1hcmtlcik7CiAgICAgICAgaSA9IG1hcmtlckluc2VydFBvc2l0aW9uICsgMTsKICAgIH0KICAgIGRzdC5zcGxpY2UoaSsrLCAwLCBrZXkxKTsKICAgIGlmIChrZXkyICE9PSBudWxsKSB7CiAgICAgICAgZHN0LnNwbGljZShpKyssIDAsIGtleTIpOwogICAgfQogICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgZHN0LnNwbGljZShpKyssIDAsIHZhbHVlKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2luamVjdG9yX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vLyBQYXJlbnQgSW5qZWN0b3IgVXRpbHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8qKgogKiBAcGFyYW0gez99IHBhcmVudExvY2F0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2NhdGlvbikgewogICAgcmV0dXJuIHBhcmVudExvY2F0aW9uICE9PSBOT19QQVJFTlRfSU5KRUNUT1I7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jYXRpb24pIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChwYXJlbnRMb2NhdGlvbikpKSkpICYgMzI3NjcgLyogSW5qZWN0b3JJbmRleE1hc2sgKi87Cn0KLyoqCiAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChwYXJlbnRMb2NhdGlvbikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudExvY2F0aW9uKSkpKSkgPj4gMTYgLyogVmlld09mZnNldFNoaWZ0ICovOwp9Ci8qKgogKiBVbndyYXBzIGEgcGFyZW50IGluamVjdG9yIGxvY2F0aW9uIG51bWJlciB0byBmaW5kIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGluamVjdG9yLAogKiB0aGVuIHdhbGtzIHVwIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgdW50aWwgdGhlIHZpZXcgaXMgZm91bmQgdGhhdCBjb250YWlucyB0aGUgcGFyZW50CiAqIGluamVjdG9yLgogKgogKiBAcGFyYW0gez99IGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGluamVjdG9yLCB3aGljaCBjb250YWlucyB0aGUgdmlldyBvZmZzZXQKICogQHBhcmFtIHs/fSBzdGFydFZpZXcgVGhlIExWaWV3IGluc3RhbmNlIGZyb20gd2hpY2ggdG8gc3RhcnQgd2Fsa2luZyB1cCB0aGUgdmlldyB0cmVlCiAqIEByZXR1cm4gez99IFRoZSBMVmlldyBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXJlbnQgaW5qZWN0b3IKICovCmZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9yVmlldyhsb2NhdGlvbiwgc3RhcnRWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50VmlldyA9IHN0YXJ0VmlldzsKICAgIC8vIEZvciBtb3N0IGNhc2VzLCB0aGUgcGFyZW50IGluamVjdG9yIGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9zdCBub2RlIChlLmcuIGZvciBjb21wb25lbnQKICAgIC8vIG9yIGNvbnRhaW5lciksIGJ1dCB3ZSBtdXN0IGtlZXAgdGhlIGxvb3AgaGVyZSB0byBzdXBwb3J0IHRoZSByYXJlciBjYXNlIG9mIGRlZXBseSBuZXN0ZWQKICAgIC8vIDxuZy10ZW1wbGF0ZT4gdGFncyBvciBpbmxpbmUgdmlld3MsIHdoZXJlIHRoZSBwYXJlbnQgaW5qZWN0b3IgbWlnaHQgbGl2ZSBtYW55IHZpZXdzCiAgICAvLyBhYm92ZSB0aGUgY2hpbGQgaW5qZWN0b3IuCiAgICB3aGlsZSAodmlld09mZnNldCA+IDApIHsKICAgICAgICBwYXJlbnRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFZpZXdbREVDTEFSQVRJT05fVklFV10pKTsKICAgICAgICB2aWV3T2Zmc2V0LS07CiAgICB9CiAgICByZXR1cm4gcGFyZW50VmlldzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL21pc2NfdXRpbHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVzZWQgZm9yIHN0cmluZ2lmeSByZW5kZXIgb3V0cHV0IGluIEl2eS4KICogSW1wb3J0YW50ISBUaGlzIGZ1bmN0aW9uIGlzIHZlcnkgcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGFuZCB3ZSBzaG91bGQKICogYmUgZXh0cmEgY2FyZWZ1bCBub3QgdG8gaW50cm9kdWNlIG1lZ2Ftb3JwaGljIHJlYWRzIGluIGl0LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW5kZXJTdHJpbmdpZnkodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgIHJldHVybiAnJzsKICAgIHJldHVybiAnJyArIHZhbHVlOwp9Ci8qKgogKiBVc2VkIHRvIHN0cmluZ2lmeSBhIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBpbiBhbiBlcnJvciBtZXNzYWdlLgogKiBJbXBvcnRhbnQhIFRoaXMgZnVuY3Rpb24gY29udGFpbnMgYSBtZWdhbW9ycGhpYyByZWFkIGFuZCBzaG91bGQgb25seSBiZQogKiB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Rm9yRXJyb3IodmFsdWUpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpCiAgICAgICAgcmV0dXJuIHZhbHVlLm5hbWUgfHwgdmFsdWUudG9TdHJpbmcoKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICByZXR1cm4gdmFsdWUudHlwZS5uYW1lIHx8IHZhbHVlLnR5cGUudG9TdHJpbmcoKTsKICAgIH0KICAgIHJldHVybiByZW5kZXJTdHJpbmdpZnkodmFsdWUpOwp9CmNvbnN0IMm1MCQzID0gLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAvLyBicm93c2VyIG9ubHkKICAgIHNldFRpbWVvdXQgLy8gZXZlcnl0aGluZyBlbHNlCikKICAgIC5iaW5kKF9nbG9iYWwpOwovKiogQHR5cGUgez99ICovCmNvbnN0IGRlZmF1bHRTY2hlZHVsZXIgPSAoKMm1MCQzKSkoKTsKLyoqCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVyZXNvbHZlV2luZG93KGVsZW1lbnQpIHsKICAgIHJldHVybiB7IG5hbWU6ICd3aW5kb3cnLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB9Owp9Ci8qKgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cmVzb2x2ZURvY3VtZW50KGVsZW1lbnQpIHsKICAgIHJldHVybiB7IG5hbWU6ICdkb2N1bWVudCcsIHRhcmdldDogZWxlbWVudC5vd25lckRvY3VtZW50IH07Cn0KLyoqCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVyZXNvbHZlQm9keShlbGVtZW50KSB7CiAgICByZXR1cm4geyBuYW1lOiAnYm9keScsIHRhcmdldDogZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHkgfTsKfQovKioKICogVGhlIHNwZWNpYWwgZGVsaW1pdGVyIHdlIHVzZSB0byBzZXBhcmF0ZSBwcm9wZXJ0eSBuYW1lcywgcHJlZml4ZXMsIGFuZCBzdWZmaXhlcwogKiBpbiBwcm9wZXJ0eSBiaW5kaW5nIG1ldGFkYXRhLiBTZWUgc3RvcmVCaW5kaW5nTWV0YWRhdGEoKS4KICoKICogV2UgaW50ZW50aW9uYWxseSB1c2UgdGhlIFVuaWNvZGUgIlJFUExBQ0VNRU5UIENIQVJBQ1RFUiIgKFUrRkZGRCkgYXMgYSBkZWxpbWl0ZXIKICogYmVjYXVzZSBpdCBpcyBhIHZlcnkgdW5jb21tb24gY2hhcmFjdGVyIHRoYXQgaXMgdW5saWtlbHkgdG8gYmUgcGFydCBvZiBhIHVzZXIncwogKiBwcm9wZXJ0eSBuYW1lcyBvciBpbnRlcnBvbGF0aW9uIHN0cmluZ3MuIElmIGl0IGlzIGluIGZhY3QgdXNlZCBpbiBhIHByb3BlcnR5CiAqIGJpbmRpbmcsIERlYnVnRWxlbWVudC5wcm9wZXJ0aWVzIHdpbGwgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhhdAogKiBiaW5kaW5nLiBIb3dldmVyLCB0aGVyZSBzaG91bGQgYmUgbm8gcnVudGltZSBlZmZlY3QgZm9yIHJlYWwgYXBwbGljYXRpb25zLgogKgogKiBUaGlzIGNoYXJhY3RlciBpcyB0eXBpY2FsbHkgcmVuZGVyZWQgYXMgYSBxdWVzdGlvbiBtYXJrIGluc2lkZSBvZiBhIGRpYW1vbmQuCiAqIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGVjaWFsc18oVW5pY29kZV9ibG9jaykKICoKICogQHR5cGUgez99CiAqLwpjb25zdCBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiA9IGDvv71gOwovKioKICogVW53cmFwIGEgdmFsdWUgd2hpY2ggbWlnaHQgYmUgYmVoaW5kIGEgY2xvc3VyZSAoZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gcmVhc29ucykuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1heWJlVW53cmFwRm4odmFsdWUpIHsKICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlKCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERlZmluZXMgaWYgdGhlIGNhbGwgdG8gYGluamVjdGAgc2hvdWxkIGluY2x1ZGUgYHZpZXdQcm92aWRlcnNgIGluIGl0cyByZXNvbHV0aW9uLgogKgogKiBUaGlzIGlzIHNldCB0byB0cnVlIHdoZW4gd2UgdHJ5IHRvIGluc3RhbnRpYXRlIGEgY29tcG9uZW50LiBUaGlzIHZhbHVlIGlzIHJlc2V0IGluCiAqIGBnZXROb2RlSW5qZWN0YWJsZWAgdG8gYSB2YWx1ZSB3aGljaCBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBsb2NhdGlvbiBvZiB0aGUgdG9rZW4gYWJvdXQgdG8gYmUKICogaW5zdGFudGlhdGVkLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBpZiB3ZSBhcmUgaW5qZWN0aW5nIGEgdG9rZW4gd2hpY2ggd2FzIGRlY2xhcmVkIG91dHNpZGUgb2YKICogYHZpZXdQcm92aWRlcnNgIHdlIGRvbid0IGFjY2lkZW50YWxseSBwdWxsIGB2aWV3UHJvdmlkZXJzYCBpbi4KICoKICogRXhhbXBsZToKICoKICogYGBgCiAqIFxASW5qZWN0YWJsZSgpCiAqIGNsYXNzIE15U2VydmljZSB7CiAqICAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBTdHJpbmcpIHt9CiAqIH0KICoKICogXEBDb21wb25lbnQoewogKiAgIHByb3ZpZGVyczogWwogKiAgICAgTXlTZXJ2aWNlLAogKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICdwcm92aWRlcnMnIH0KICogICBdCiAqICAgdmlld1Byb3ZpZGVyczogWwogKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICd2aWV3UHJvdmlkZXJzJ30KICogICBdCiAqIH0pCiAqIGNsYXNzIE15Q29tcG9uZW50IHsKICogICBjb25zdHJ1Y3RvcihteVNlcnZpY2U6IE15U2VydmljZSwgdmFsdWU6IFN0cmluZykgewogKiAgICAgLy8gV2UgZXhwZWN0IHRoYXQgQ29tcG9uZW50IGNhbiBzZWUgaW50byBgdmlld1Byb3ZpZGVyc2AuCiAqICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ3ZpZXdQcm92aWRlcnMnKTsKICogICAgIC8vIGBNeVNlcnZpY2VgIHdhcyBub3QgZGVjbGFyZWQgaW4gYHZpZXdQcm92aWRlcnNgIGhlbmNlIGl0IGNhbid0IHNlZSBpdC4KICogICAgIGV4cGVjdChteVNlcnZpY2UudmFsdWUpLnRvRXF1YWwoJ3Byb3ZpZGVycycpOwogKiAgIH0KICogfQogKgogKiBgYGAKICogQHR5cGUgez99CiAqLwpsZXQgaW5jbHVkZVZpZXdQcm92aWRlcnMgPSB0cnVlOwovKioKICogQHBhcmFtIHs/fSB2CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRJbmNsdWRlVmlld1Byb3ZpZGVycyh2KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbGRWYWx1ZSA9IGluY2x1ZGVWaWV3UHJvdmlkZXJzOwogICAgaW5jbHVkZVZpZXdQcm92aWRlcnMgPSB2OwogICAgcmV0dXJuIG9sZFZhbHVlOwp9Ci8qKgogKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIGVhY2ggYmxvb20gZmlsdGVyICh1c2VkIGJ5IERJKS4gVGhlIGxhcmdlciB0aGlzIG51bWJlciwgdGhlIGZld2VyCiAqIGRpcmVjdGl2ZXMgdGhhdCB3aWxsIHNoYXJlIHNsb3RzLCBhbmQgdGh1cywgdGhlIGZld2VyIGZhbHNlIHBvc2l0aXZlcyB3aGVuIGNoZWNraW5nIGZvcgogKiB0aGUgZXhpc3RlbmNlIG9mIGEgZGlyZWN0aXZlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEJMT09NX1NJWkUgPSAyNTY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQkxPT01fTUFTSyA9IEJMT09NX1NJWkUgLSAxOwovKioKICogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIGRpcmVjdGl2ZXMuCiAqIEB0eXBlIHs/fQogKi8KbGV0IG5leHROZ0VsZW1lbnRJZCA9IDA7Ci8qKgogKiBSZWdpc3RlcnMgdGhpcyBkaXJlY3RpdmUgYXMgcHJlc2VudCBpbiBpdHMgbm9kZSdzIGluamVjdG9yIGJ5IGZsaXBwaW5nIHRoZSBkaXJlY3RpdmUncwogKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuCiAqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JJbmRleCBUaGUgaW5kZXggb2YgdGhlIG5vZGUgaW5qZWN0b3Igd2hlcmUgdGhpcyB0b2tlbiBzaG91bGQgYmUgcmVnaXN0ZXJlZAogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBUVmlldyBmb3IgdGhlIGluamVjdG9yJ3MgYmxvb20gZmlsdGVycwogKiBAcGFyYW0gez99IHR5cGUgVGhlIGRpcmVjdGl2ZSB0b2tlbiB0byByZWdpc3RlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmxvb21BZGQoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHR5cGUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbCh0Vmlldy5maXJzdENyZWF0ZVBhc3MsIHRydWUsICdleHBlY3RlZCBmaXJzdENyZWF0ZVBhc3MgdG8gYmUgdHJ1ZScpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlkID0gdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnID8gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpW05HX0VMRU1FTlRfSURdIDogdHlwZS5jaGFyQ29kZUF0KDApIHx8IDA7CiAgICAvLyBTZXQgYSB1bmlxdWUgSUQgb24gdGhlIGRpcmVjdGl2ZSB0eXBlLCBzbyBpZiBzb21ldGhpbmcgdHJpZXMgdG8gaW5qZWN0IHRoZSBkaXJlY3RpdmUsCiAgICAvLyB3ZSBjYW4gZWFzaWx5IHJldHJpZXZlIHRoZSBJRCBhbmQgaGFzaCBpdCBpbnRvIHRoZSBibG9vbSBiaXQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgaWQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSlbTkdfRUxFTUVOVF9JRF0gPSBuZXh0TmdFbGVtZW50SWQrKzsKICAgIH0KICAgIC8vIFdlIG9ubHkgaGF2ZSBCTE9PTV9TSVpFICgyNTYpIHNsb3RzIGluIG91ciBibG9vbSBmaWx0ZXIgKDggYnVja2V0cyAqIDMyIGJpdHMgZWFjaCksCiAgICAvLyBzbyBhbGwgdW5pcXVlIElEcyBtdXN0IGJlIG1vZHVsby1lZCBpbnRvIGEgbnVtYmVyIGZyb20gMCAtIDI1NSB0byBmaXQgaW50byB0aGUgZmlsdGVyLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmxvb21CaXQgPSBpZCAmIEJMT09NX01BU0s7CiAgICAvLyBDcmVhdGUgYSBtYXNrIHRoYXQgdGFyZ2V0cyB0aGUgc3BlY2lmaWMgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlLgogICAgLy8gSlMgYml0IG9wZXJhdGlvbnMgYXJlIDMyIGJpdHMsIHNvIHRoaXMgd2lsbCBiZSBhIG51bWJlciBiZXR3ZWVuIDJeMCBhbmQgMl4zMSwgY29ycmVzcG9uZGluZwogICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1hc2sgPSAxIDw8IGJsb29tQml0OwogICAgLy8gVXNlIHRoZSByYXcgYmxvb21CaXQgbnVtYmVyIHRvIGRldGVybWluZSB3aGljaCBibG9vbSBmaWx0ZXIgYnVja2V0IHdlIHNob3VsZCBjaGVjawogICAgLy8gZS5nOiBiZjAgPSBbMCAtIDMxXSwgYmYxID0gWzMyIC0gNjNdLCBiZjIgPSBbNjQgLSA5NV0sIGJmMyA9IFs5NiAtIDEyN10sIGV0YwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYjcgPSBibG9vbUJpdCAmIDB4ODA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiNiA9IGJsb29tQml0ICYgMHg0MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI1ID0gYmxvb21CaXQgJiAweDIwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YSkpOwogICAgaWYgKGI3KSB7CiAgICAgICAgYjYgPyAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDddIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA2XSB8PSBtYXNrKSkgOgogICAgICAgICAgICAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDVdIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA0XSB8PSBtYXNrKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBiNiA/IChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgM10gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleCArIDJdIHw9IG1hc2spKSA6CiAgICAgICAgICAgIChiNSA/ICh0RGF0YVtpbmplY3RvckluZGV4ICsgMV0gfD0gbWFzaykgOiAodERhdGFbaW5qZWN0b3JJbmRleF0gfD0gbWFzaykpOwogICAgfQp9Ci8qKgogKiBDcmVhdGVzIChvciBnZXRzIGFuIGV4aXN0aW5nKSBpbmplY3RvciBmb3IgYSBnaXZlbiBlbGVtZW50IG9yIGNvbnRhaW5lci4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBmb3Igd2hpY2ggYW4gaW5qZWN0b3Igc2hvdWxkIGJlIHJldHJpZXZlZCAvIGNyZWF0ZWQuCiAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVmlldyB3aGVyZSB0aGUgbm9kZSBpcyBzdG9yZWQKICogQHJldHVybiB7P30gTm9kZSBpbmplY3RvcgogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCBob3N0VmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXhpc3RpbmdJbmplY3RvckluZGV4ID0gZ2V0SW5qZWN0b3JJbmRleCh0Tm9kZSwgaG9zdFZpZXcpOwogICAgaWYgKGV4aXN0aW5nSW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICByZXR1cm4gZXhpc3RpbmdJbmplY3RvckluZGV4OwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBob3N0Vmlld1tUVklFV107CiAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgdE5vZGUuaW5qZWN0b3JJbmRleCA9IGhvc3RWaWV3Lmxlbmd0aDsKICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5kYXRhLCB0Tm9kZSk7IC8vIGZvdW5kYXRpb24gZm9yIG5vZGUgYmxvb20KICAgICAgICBpbnNlcnRCbG9vbShob3N0VmlldywgbnVsbCk7IC8vIGZvdW5kYXRpb24gZm9yIGN1bXVsYXRpdmUgYmxvb20KICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5ibHVlcHJpbnQsIG51bGwpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50TG9jID0gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgaG9zdFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0b3JJbmRleCA9IHROb2RlLmluamVjdG9ySW5kZXg7CiAgICAvLyBJZiBhIHBhcmVudCBpbmplY3RvciBjYW4ndCBiZSBmb3VuZCwgaXRzIGxvY2F0aW9uIGlzIHNldCB0byAtMS4KICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgYSBjdW11bGF0aXZlIGJsb29tCiAgICBpZiAoaGFzUGFyZW50SW5qZWN0b3IocGFyZW50TG9jKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50TFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jLCBob3N0Vmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50TFZpZXdbVFZJRVddLmRhdGEpKTsKICAgICAgICAvLyBDcmVhdGVzIGEgY3VtdWxhdGl2ZSBibG9vbSBmaWx0ZXIgdGhhdCBtZXJnZXMgdGhlIHBhcmVudCdzIGJsb29tIGZpbHRlcgogICAgICAgIC8vIGFuZCBpdHMgb3duIGN1bXVsYXRpdmUgYmxvb20gKHdoaWNoIGNvbnRhaW5zIHRva2VucyBmb3IgYWxsIGFuY2VzdG9ycykKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICAgICBob3N0Vmlld1tpbmplY3RvckluZGV4ICsgaV0gPSBwYXJlbnRMVmlld1twYXJlbnRJbmRleCArIGldIHwgcGFyZW50RGF0YVtwYXJlbnRJbmRleCArIGldOwogICAgICAgIH0KICAgIH0KICAgIGhvc3RWaWV3W2luamVjdG9ySW5kZXggKyBQQVJFTlRfSU5KRUNUT1JdID0gcGFyZW50TG9jOwogICAgcmV0dXJuIGluamVjdG9ySW5kZXg7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYXJyCiAqIEBwYXJhbSB7P30gZm9vdGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnNlcnRCbG9vbShhcnIsIGZvb3RlcikgewogICAgYXJyLnB1c2goMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZm9vdGVyKTsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGhvc3RWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRJbmplY3RvckluZGV4KHROb2RlLCBob3N0VmlldykgewogICAgaWYgKHROb2RlLmluamVjdG9ySW5kZXggPT09IC0xIHx8CiAgICAgICAgLy8gSWYgdGhlIGluamVjdG9yIGluZGV4IGlzIHRoZSBzYW1lIGFzIGl0cyBwYXJlbnQncyBpbmplY3RvciBpbmRleCwgdGhlbiB0aGUgaW5kZXggaGFzIGJlZW4KICAgICAgICAvLyBjb3BpZWQgZG93biBmcm9tIHRoZSBwYXJlbnQgbm9kZS4gTm8gaW5qZWN0b3IgaGFzIGJlZW4gY3JlYXRlZCB5ZXQgb24gdGhpcyBub2RlLgogICAgICAgICh0Tm9kZS5wYXJlbnQgJiYgdE5vZGUucGFyZW50LmluamVjdG9ySW5kZXggPT09IHROb2RlLmluamVjdG9ySW5kZXgpIHx8CiAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHRoZSBpbmplY3RvciBpbmRleCBtaWdodCBleGlzdCBidXQgdGhlIHBhcmVudCB2YWx1ZXMKICAgICAgICAvLyBtaWdodCBub3QgaGF2ZSBiZWVuIGNhbGN1bGF0ZWQgeWV0IGZvciB0aGlzIGluc3RhbmNlCiAgICAgICAgaG9zdFZpZXdbdE5vZGUuaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl0gPT0gbnVsbCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiB0Tm9kZS5pbmplY3RvckluZGV4OwogICAgfQp9Ci8qKgogKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIHBhcmVudCBpbmplY3Rvciwgd2l0aCBhIHZpZXcgb2Zmc2V0IGlmIGFwcGxpY2FibGUuIFVzZWQgdG8gc2V0IHRoZQogKiBwYXJlbnQgaW5qZWN0b3IgaW5pdGlhbGx5LgogKgogKiBSZXR1cm5zIGEgY29tYmluYXRpb24gb2YgbnVtYmVyIG9mIGBWaWV3RGF0YWAgd2UgaGF2ZSB0byBnbyB1cCBhbmQgaW5kZXggaW4gdGhhdCBgVmlld2RhdGFgCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvckxvY2F0aW9uKHROb2RlLCB2aWV3KSB7CiAgICBpZiAodE5vZGUucGFyZW50ICYmIHROb2RlLnBhcmVudC5pbmplY3RvckluZGV4ICE9PSAtMSkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUucGFyZW50LmluamVjdG9ySW5kZXgpKTsgLy8gVmlld09mZnNldCBpcyAwCiAgICB9CiAgICAvLyBGb3IgbW9zdCBjYXNlcywgdGhlIHBhcmVudCBpbmplY3RvciBpbmRleCBjYW4gYmUgZm91bmQgb24gdGhlIGhvc3Qgbm9kZSAoZS5nLiBmb3IgY29tcG9uZW50CiAgICAvLyBvciBjb250YWluZXIpLCBzbyB0aGlzIGxvb3Agd2lsbCBiZSBza2lwcGVkLCBidXQgd2UgbXVzdCBrZWVwIHRoZSBsb29wIGhlcmUgdG8gc3VwcG9ydAogICAgLy8gdGhlIHJhcmVyIGNhc2Ugb2YgZGVlcGx5IG5lc3RlZCA8bmctdGVtcGxhdGU+IHRhZ3Mgb3IgaW5saW5lIHZpZXdzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGhvc3RUTm9kZSA9IHZpZXdbVF9IT1NUXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3T2Zmc2V0ID0gMTsKICAgIHdoaWxlIChob3N0VE5vZGUgJiYgaG9zdFROb2RlLmluamVjdG9ySW5kZXggPT09IC0xKSB7CiAgICAgICAgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh2aWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSk7CiAgICAgICAgaG9zdFROb2RlID0gdmlldyA/IHZpZXdbVF9IT1NUXSA6IG51bGw7CiAgICAgICAgdmlld09mZnNldCsrOwogICAgfQogICAgcmV0dXJuIGhvc3RUTm9kZSA/CiAgICAgICAgaG9zdFROb2RlLmluamVjdG9ySW5kZXggfCAodmlld09mZnNldCA8PCAxNiAvKiBWaWV3T2Zmc2V0U2hpZnQgKi8pIDoKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoLTEpKTsKfQovKioKICogTWFrZXMgYSB0eXBlIG9yIGFuIGluamVjdGlvbiB0b2tlbiBwdWJsaWMgdG8gdGhlIERJIHN5c3RlbSBieSBhZGRpbmcgaXQgdG8gYW4KICogaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuCiAqCiAqIEBwYXJhbSB7P30gaW5qZWN0b3JJbmRleAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdG9rZW4gVGhlIHR5cGUgb3IgdGhlIGluamVjdGlvbiB0b2tlbiB0byBiZSBtYWRlIHB1YmxpYwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGlQdWJsaWNJbkluamVjdG9yKGluamVjdG9ySW5kZXgsIHRWaWV3LCB0b2tlbikgewogICAgYmxvb21BZGQoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHRva2VuKTsKfQovKioKICogSW5qZWN0IHN0YXRpYyBhdHRyaWJ1dGUgdmFsdWUgaW50byBkaXJlY3RpdmUgY29uc3RydWN0b3IuCiAqCiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2l0aCBgZmFjdG9yeWAgZnVuY3Rpb25zIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYXMgcGFydCBvZgogKiBgZGVmaW5lRGlyZWN0aXZlYCBvciBgZGVmaW5lQ29tcG9uZW50YC4gVGhlIG1ldGhvZCByZXRyaWV2ZXMgdGhlIHN0YXRpYyB2YWx1ZQogKiBvZiBhbiBhdHRyaWJ1dGUuIChEeW5hbWljIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgc2luY2UgdGhleSBhcmUgbm90IHJlc29sdmVkCiAqICBhdCB0aGUgdGltZSBvZiBpbmplY3Rpb24gYW5kIGNhbiBjaGFuZ2Ugb3ZlciB0aW1lLikKICoKICogIyBFeGFtcGxlCiAqIEdpdmVuOgogKiBgYGAKICogXEBDb21wb25lbnQoLi4uKQogKiBjbGFzcyBNeUNvbXBvbmVudCB7CiAqICAgY29uc3RydWN0b3IoXEBBdHRyaWJ1dGUoJ3RpdGxlJykgdGl0bGU6IHN0cmluZykgeyAuLi4gfQogKiB9CiAqIGBgYAogKiBXaGVuIGluc3RhbnRpYXRlZCB3aXRoCiAqIGBgYAogKiA8bXktY29tcG9uZW50IHRpdGxlPSJIZWxsbyI+PC9teS1jb21wb25lbnQ+CiAqIGBgYAogKgogKiBUaGVuIGZhY3RvcnkgbWV0aG9kIGdlbmVyYXRlZCBpczoKICogYGBgCiAqIE15Q29tcG9uZW50Lsm1Y21wID0gZGVmaW5lQ29tcG9uZW50KHsKICogICBmYWN0b3J5OiAoKSA9PiBuZXcgTXlDb21wb25lbnQoaW5qZWN0QXR0cmlidXRlKCd0aXRsZScpKQogKiAgIC4uLgogKiB9KQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGF0dHJOYW1lVG9JbmplY3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluamVjdEF0dHJpYnV0ZUltcGwodE5vZGUsIGF0dHJOYW1lVG9JbmplY3QpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ2V4cGVjdGluZyB0Tm9kZScpOwogICAgaWYgKGF0dHJOYW1lVG9JbmplY3QgPT09ICdjbGFzcycpIHsKICAgICAgICByZXR1cm4gdE5vZGUuY2xhc3NlczsKICAgIH0KICAgIGlmIChhdHRyTmFtZVRvSW5qZWN0ID09PSAnc3R5bGUnKSB7CiAgICAgICAgcmV0dXJuIHROb2RlLnN0eWxlczsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICBpZiAoYXR0cnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cnNMZW5ndGggPSBhdHRycy5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpID0gMDsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyc1tpXTsKICAgICAgICAgICAgLy8gSWYgd2UgaGl0IGEgYEJpbmRpbmdzYCBvciBgVGVtcGxhdGVgIG1hcmtlciB0aGVuIHdlIGFyZSBkb25lLgogICAgICAgICAgICBpZiAoaXNOYW1lT25seUF0dHJpYnV0ZU1hcmtlcih2YWx1ZSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gU2tpcCBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgewogICAgICAgICAgICAgICAgLy8gd2Ugc2tpcCB0aGUgbmV4dCB0d28gdmFsdWVzCiAgICAgICAgICAgICAgICAvLyBhcyBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMgbG9va3MgbGlrZQogICAgICAgICAgICAgICAgLy8gWy4uLiwgQXR0cmlidXRlTWFya2VyLk5hbWVzcGFjZVVSSSwgJ2h0dHA6Ly9zb21ldXJpLmNvbS90ZXN0JywgJ3Rlc3Q6ZXhpc3QnLAogICAgICAgICAgICAgICAgLy8gJ2V4aXN0VmFsdWUnLCAuLi5dCiAgICAgICAgICAgICAgICBpID0gaSArIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgLy8gU2tpcCB0byB0aGUgZmlyc3QgdmFsdWUgb2YgdGhlIG1hcmtlZCBhdHRyaWJ1dGUuCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGF0dHJzTGVuZ3RoICYmIHR5cGVvZiBhdHRyc1tpXSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IGF0dHJOYW1lVG9JbmplY3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaSArIDFdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpID0gaSArIDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gdG9rZW4gZnJvbSB0aGUgTm9kZUluamVjdG9ycyA9PiBNb2R1bGVJbmplY3Rvci4KICoKICogTG9vayBmb3IgdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgdG9rZW4gYnkgd2Fsa2luZyB1cCB0aGUgbm9kZSBpbmplY3RvciB0cmVlIGFuZCB0aGVuCiAqIHRoZSBtb2R1bGUgaW5qZWN0b3IgdHJlZS4KICoKICogVGhpcyBmdW5jdGlvbiBwYXRjaGVzIGB0b2tlbmAgd2l0aCBgX19OR19FTEVNRU5UX0lEX19gIHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBmb3IgdGhlIGJsb29tCiAqIGZpbHRlci4gTmVnYXRpdmUgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3Igc3BlY2lhbCBvYmplY3RzLgogKiAgIC0gYC0xYCBpcyByZXNlcnZlZCBmb3IgaW5qZWN0aW5nIGBJbmplY3RvcmAgKGltcGxlbWVudGVkIGJ5IGBOb2RlSW5qZWN0b3JgKQogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHROb2RlIFRoZSBOb2RlIHdoZXJlIHRoZSBzZWFyY2ggZm9yIHRoZSBpbmplY3RvciBzaG91bGQgc3RhcnQKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgYExWaWV3YCB0aGF0IGNvbnRhaW5zIHRoZSBgdE5vZGVgCiAqIEBwYXJhbSB7P30gdG9rZW4gVGhlIHRva2VuIHRvIGxvb2sgZm9yCiAqIEBwYXJhbSB7Pz19IGZsYWdzIEluamVjdGlvbiBmbGFncwogKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gd2hlbiB0aGUgaW5qZWN0aW9uIGZsYWdzIGlzIGBJbmplY3RGbGFncy5PcHRpb25hbGAKICogQHJldHVybiB7P30gdGhlIHZhbHVlIGZyb20gdGhlIGluamVjdG9yLCBgbnVsbGAgd2hlbiBub3QgZm91bmQsIG9yIGBub3RGb3VuZFZhbHVlYCBpZiBwcm92aWRlZAogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHROb2RlLCBsVmlldywgdG9rZW4sIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCwgbm90Rm91bmRWYWx1ZSkgewogICAgaWYgKHROb2RlICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsb29tSGFzaCA9IGJsb29tSGFzaEJpdE9yRmFjdG9yeSh0b2tlbik7CiAgICAgICAgLy8gSWYgdGhlIElEIHN0b3JlZCBoZXJlIGlzIGEgZnVuY3Rpb24sIHRoaXMgaXMgYSBzcGVjaWFsIG9iamVjdCBsaWtlIEVsZW1lbnRSZWYgb3IgVGVtcGxhdGVSZWYKICAgICAgICAvLyBzbyBqdXN0IGNhbGwgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGl0LgogICAgICAgIGlmICh0eXBlb2YgYmxvb21IYXNoID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGVudGVyREkobFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYmxvb21IYXNoKCk7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwcm92aWRlciBmb3IgJHtzdHJpbmdpZnlGb3JFcnJvcih0b2tlbil9IWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgbGVhdmVESSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBibG9vbUhhc2ggPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgaWYgKGJsb29tSGFzaCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIGAtMWAgaXMgYSBzcGVjaWFsIHZhbHVlIHVzZWQgdG8gaWRlbnRpZnkgYEluamVjdG9yYCB0eXBlcy4KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobmV3IE5vZGVJbmplY3Rvcih0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIHRva2VuIGhhcyBhIGJsb29tIGhhc2gsIHRoZW4gaXQgaXMgYSB0b2tlbiB3aGljaCBjb3VsZCBiZSBpbiBOb2RlSW5qZWN0b3IuCiAgICAgICAgICAgIC8vIEEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBpbmplY3RvciBUVmlldyB0aGF0IHdhcyBmb3VuZCB3aGlsZSBjbGltYmluZyB0aGUgZWxlbWVudAogICAgICAgICAgICAvLyBpbmplY3RvciB0cmVlLiBUaGlzIGlzIHVzZWQgdG8ga25vdyBpZiB2aWV3UHJvdmlkZXJzIGNhbiBiZSBhY2Nlc3NlZCBvbiB0aGUgY3VycmVudAogICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJldmlvdXNUVmlldyA9IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGluamVjdG9ySW5kZXggPSBnZXRJbmplY3RvckluZGV4KHROb2RlLCBsVmlldyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcmVudExvY2F0aW9uID0gTk9fUEFSRU5UX0lOSkVDVE9SOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBob3N0VEVsZW1lbnROb2RlID0gZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ID8gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddW1RfSE9TVF0gOiBudWxsOwogICAgICAgICAgICAvLyBJZiB3ZSBzaG91bGQgc2tpcCB0aGlzIGluamVjdG9yLCBvciBpZiB0aGVyZSBpcyBubyBpbmplY3RvciBvbiB0aGlzIG5vZGUsIHN0YXJ0IGJ5CiAgICAgICAgICAgIC8vIHNlYXJjaGluZwogICAgICAgICAgICAvLyB0aGUgcGFyZW50IGluamVjdG9yLgogICAgICAgICAgICBpZiAoaW5qZWN0b3JJbmRleCA9PT0gLTEgfHwgZmxhZ3MgJiBJbmplY3RGbGFncy5Ta2lwU2VsZikgewogICAgICAgICAgICAgICAgcGFyZW50TG9jYXRpb24gPSBpbmplY3RvckluZGV4ID09PSAtMSA/IGdldFBhcmVudEluamVjdG9yTG9jYXRpb24odE5vZGUsIGxWaWV3KSA6CiAgICAgICAgICAgICAgICAgICAgbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07CiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNlYXJjaFBhcmVudChmbGFncywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgaW5qZWN0b3JJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IGxWaWV3W1RWSUVXXTsKICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgbFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jYXRpb24sIGxWaWV3KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaW5qZWN0b3IgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgcG90ZW50aWFsIG1hdGNoIG9yIHVudGlsIHdlIGtub3cgdGhlcmUKICAgICAgICAgICAgLy8gKmlzbid0KiBhIG1hdGNoLgogICAgICAgICAgICB3aGlsZSAoaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBhcmVudExvY2F0aW9uID0gbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07CiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgY3VycmVudCBpbmplY3Rvci4gSWYgaXQgbWF0Y2hlcywgc2VlIGlmIGl0IGNvbnRhaW5zIHRva2VuLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBpZiAoYmxvb21IYXNUb2tlbihibG9vbUhhc2gsIGluamVjdG9ySW5kZXgsIHRWaWV3LmRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbiBpbmplY3RvciB3aGljaCAqbWF5KiBjb250YWluIHRoZSB0b2tlbiwgc28gd2Ugc3RlcCB0aHJvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGluamVjdG9yJ3MgY29ycmVzcG9uZGluZyBub2RlIHRvIGdldAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnN0YW5jZS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBzZWFyY2hUb2tlbnNPbkluamVjdG9yKGluamVjdG9ySW5kZXgsIGxWaWV3LCB0b2tlbiwgcHJldmlvdXNUVmlldywgZmxhZ3MsIGhvc3RURWxlbWVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSAhPT0gTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2VhcmNoUGFyZW50KGZsYWdzLCBsVmlld1tUVklFV10uZGF0YVtpbmplY3RvckluZGV4ICsgVE5PREVdID09PSBob3N0VEVsZW1lbnROb2RlKSAmJgogICAgICAgICAgICAgICAgICAgIGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCBsVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmIHdhc24ndCBmb3VuZCBhbnl3aGVyZSBvbiB0aGlzIG5vZGUsIHNvIGl0IHdhcyBhIGZhbHNlIHBvc2l0aXZlLgogICAgICAgICAgICAgICAgICAgIC8vIFRyYXZlcnNlIHVwIHRoZSB0cmVlIGFuZCBjb250aW51ZSBzZWFyY2hpbmcuCiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IHRWaWV3OwogICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSBnZXRQYXJlbnRJbmplY3RvckluZGV4KHBhcmVudExvY2F0aW9uKTsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9IGdldFBhcmVudEluamVjdG9yVmlldyhwYXJlbnRMb2NhdGlvbiwgbFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2Ugc2hvdWxkIG5vdCBzZWFyY2ggcGFyZW50IE9SIElmIHRoZSBhbmNlc3RvciBibG9vbSBmaWx0ZXIgdmFsdWUgZG9lcyBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlIHdlIGNhbiBnaXZlIHVwIG9uIHRyYXZlcnNpbmcgdXAgdG8gZmluZCB0aGUgc3BlY2lmaWMKICAgICAgICAgICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCAmJiBub3RGb3VuZFZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBUaGlzIG11c3QgYmUgc2V0IG9yIHRoZSBOdWxsSW5qZWN0b3Igd2lsbCB0aHJvdyBmb3Igb3B0aW9uYWwgZGVwcwogICAgICAgIG5vdEZvdW5kVmFsdWUgPSBudWxsOwogICAgfQogICAgaWYgKChmbGFncyAmIChJbmplY3RGbGFncy5TZWxmIHwgSW5qZWN0RmxhZ3MuSG9zdCkpID09PSAwKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vZHVsZUluamVjdG9yID0gbFZpZXdbSU5KRUNUT1IkMV07CiAgICAgICAgLy8gc3dpdGNoIHRvIGBpbmplY3RJbmplY3Rvck9ubHlgIGltcGxlbWVudGF0aW9uIGZvciBtb2R1bGUgaW5qZWN0b3IsIHNpbmNlIG1vZHVsZSBpbmplY3RvcgogICAgICAgIC8vIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gQ29tcG9uZW50L0RpcmVjdGl2ZSBESSBzY29wZSAodGhhdCBtYXkgaGFwcGVuIHRocm91Z2gKICAgICAgICAvLyBgZGlyZWN0aXZlSW5qZWN0YCBpbXBsZW1lbnRhdGlvbikKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbiA9IHNldEluamVjdEltcGxlbWVudGF0aW9uKHVuZGVmaW5lZCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKG1vZHVsZUluamVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlSW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbmplY3RSb290TGltcE1vZGUodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkgewogICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlSW5qZWN0b3I6IE5PVF9GT1VORCBbJHtzdHJpbmdpZnlGb3JFcnJvcih0b2tlbil9XWApOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTk9UX0ZPVU5EID0ge307Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGluamVjdG9ySW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRva2VuCiAqIEBwYXJhbSB7P30gcHJldmlvdXNUVmlldwogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaG9zdFRFbGVtZW50Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2VhcmNoVG9rZW5zT25JbmplY3RvcihpbmplY3RvckluZGV4LCBsVmlldywgdG9rZW4sIHByZXZpb3VzVFZpZXcsIGZsYWdzLCBob3N0VEVsZW1lbnROb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50VFZpZXcgPSBsVmlld1tUVklFV107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50VFZpZXcuZGF0YVtpbmplY3RvckluZGV4ICsgVE5PREVdKSk7CiAgICAvLyBGaXJzdCwgd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdmlldyBwcm92aWRlcnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBzdGFydGluZyBlbGVtZW50LgogICAgLy8gVGhlcmUgYXJlIHR3byBwb3NzaWJpdGllcwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2FuQWNjZXNzVmlld1Byb3ZpZGVycyA9IHByZXZpb3VzVFZpZXcgPT0gbnVsbCA/CiAgICAgICAgLy8gMSkgVGhpcyBpcyB0aGUgZmlyc3QgaW52b2NhdGlvbiBgcHJldmlvdXNUVmlldyA9PSBudWxsYCB3aGljaCBtZWFucyB0aGF0IHdlIGFyZSBhdCB0aGUKICAgICAgICAvLyBgVE5vZGVgIG9mIHdoZXJlIGluamVjdG9yIGlzIHN0YXJ0aW5nIHRvIGxvb2suIEluIHN1Y2ggYSBjYXNlIHRoZSBvbmx5IHRpbWUgd2UgYXJlIGFsbG93ZWQKICAgICAgICAvLyB0byBsb29rIGludG8gdGhlIFZpZXdQcm92aWRlcnMgaXMgaWY6CiAgICAgICAgLy8gLSB3ZSBhcmUgb24gYSBjb21wb25lbnQKICAgICAgICAvLyAtIEFORCB0aGUgaW5qZWN0b3Igc2V0IGBpbmNsdWRlVmlld1Byb3ZpZGVyc2AgdG8gdHJ1ZSAoaW1wbHlpbmcgdGhhdCB0aGUgdG9rZW4gY2FuIHNlZQogICAgICAgIC8vIFZpZXdQcm92aWRlcnMgYmVjYXVzZSBpdCBpcyB0aGUgQ29tcG9uZW50IG9yIGEgU2VydmljZSB3aGljaCBpdHNlbGYgd2FzIGRlY2xhcmVkIGluCiAgICAgICAgLy8gVmlld1Byb3ZpZGVycykKICAgICAgICAoaXNDb21wb25lbnRIb3N0KHROb2RlKSAmJiBpbmNsdWRlVmlld1Byb3ZpZGVycykgOgogICAgICAgIC8vIDIpIGBwcmV2aW91c1RWaWV3ICE9IG51bGxgIHdoaWNoIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB3YWxraW5nIGFjcm9zcyB0aGUgcGFyZW50IG5vZGVzLgogICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIHdlIGFyZSBvbmx5IGFsbG93ZWQgdG8gbG9vayBpbnRvIHRoZSBWaWV3UHJvdmlkZXJzIGlmOgogICAgICAgIC8vIC0gV2UganVzdCBjcm9zc2VkIGZyb20gY2hpbGQgVmlldyB0byBQYXJlbnQgVmlldyBgcHJldmlvdXNUVmlldyAhPSBjdXJyZW50VFZpZXdgCiAgICAgICAgLy8gLSBBTkQgdGhlIHBhcmVudCBUTm9kZSBpcyBhbiBFbGVtZW50LgogICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBqdXN0IGNhbWUgZnJvbSB0aGUgQ29tcG9uZW50J3MgVmlldyBhbmQgdGhlcmVmb3JlIGFyZSBhbGxvd2VkIHRvIHNlZQogICAgICAgIC8vIGludG8gdGhlIFZpZXdQcm92aWRlcnMuCiAgICAgICAgKHByZXZpb3VzVFZpZXcgIT0gY3VycmVudFRWaWV3ICYmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pKTsKICAgIC8vIFRoaXMgc3BlY2lhbCBjYXNlIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhIEBob3N0IG9uIHRoZSBpbmplY3QgYW5kIHdoZW4gd2UgYXJlIHNlYXJjaGluZwogICAgLy8gb24gdGhlIGhvc3QgZWxlbWVudCBub2RlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaXNIb3N0U3BlY2lhbENhc2UgPSAoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0KSAmJiBob3N0VEVsZW1lbnROb2RlID09PSB0Tm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluamVjdGFibGVJZHggPSBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCBjdXJyZW50VFZpZXcsIHRva2VuLCBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzLCBpc0hvc3RTcGVjaWFsQ2FzZSk7CiAgICBpZiAoaW5qZWN0YWJsZUlkeCAhPT0gbnVsbCkgewogICAgICAgIHJldHVybiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgY3VycmVudFRWaWV3LCBpbmplY3RhYmxlSWR4LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gTk9UX0ZPVU5EOwogICAgfQp9Ci8qKgogKiBTZWFyY2hlcyBmb3IgdGhlIGdpdmVuIHRva2VuIGFtb25nIHRoZSBub2RlJ3MgZGlyZWN0aXZlcyBhbmQgcHJvdmlkZXJzLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHROb2RlIFROb2RlIG9uIHdoaWNoIGRpcmVjdGl2ZXMgYXJlIHByZXNlbnQuCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIHRWaWV3IHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZwogKiBAcGFyYW0gez99IHRva2VuIFByb3ZpZGVyIHRva2VuIG9yIHR5cGUgb2YgYSBkaXJlY3RpdmUgdG8gbG9vayBmb3IuCiAqIEBwYXJhbSB7P30gY2FuQWNjZXNzVmlld1Byb3ZpZGVycyBXaGV0aGVyIHZpZXcgcHJvdmlkZXJzIHNob3VsZCBiZSBjb25zaWRlcmVkLgogKiBAcGFyYW0gez99IGlzSG9zdFNwZWNpYWxDYXNlIFdoZXRoZXIgdGhlIGhvc3Qgc3BlY2lhbCBjYXNlIGFwcGxpZXMuCiAqIEByZXR1cm4gez99IEluZGV4IG9mIGEgZm91bmQgZGlyZWN0aXZlIG9yIHByb3ZpZGVyLCBvciBudWxsIHdoZW4gbm9uZSBmb3VuZC4KICovCmZ1bmN0aW9uIGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIHRWaWV3LCB0b2tlbiwgY2FuQWNjZXNzVmlld1Byb3ZpZGVycywgaXNIb3N0U3BlY2lhbENhc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVQcm92aWRlckluZGV4ZXMgPSB0Tm9kZS5wcm92aWRlckluZGV4ZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0SW5qZWN0YWJsZXMgPSB0Vmlldy5kYXRhOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0YWJsZXNTdGFydCA9IG5vZGVQcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZXNTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlRW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3B0Vmlld1Byb3ZpZGVyc0NvdW50ID0gbm9kZVByb3ZpZGVySW5kZXhlcyA+PiAxNiAvKiBDcHRWaWV3UHJvdmlkZXJzQ291bnRTaGlmdCAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0aW5nSW5kZXggPSBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzID8gaW5qZWN0YWJsZXNTdGFydCA6IGluamVjdGFibGVzU3RhcnQgKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQ7CiAgICAvLyBXaGVuIHRoZSBob3N0IHNwZWNpYWwgY2FzZSBhcHBsaWVzLCBvbmx5IHRoZSB2aWV3UHJvdmlkZXJzIGFuZCB0aGUgY29tcG9uZW50IGFyZSB2aXNpYmxlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmRJbmRleCA9IGlzSG9zdFNwZWNpYWxDYXNlID8gaW5qZWN0YWJsZXNTdGFydCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCA6IGRpcmVjdGl2ZUVuZDsKICAgIGZvciAobGV0IGkgPSBzdGFydGluZ0luZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm92aWRlclRva2VuT3JEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodEluamVjdGFibGVzW2ldKSk7CiAgICAgICAgaWYgKGkgPCBkaXJlY3RpdmVzU3RhcnQgJiYgdG9rZW4gPT09IHByb3ZpZGVyVG9rZW5PckRlZiB8fAogICAgICAgICAgICBpID49IGRpcmVjdGl2ZXNTdGFydCAmJiAoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyVG9rZW5PckRlZikpKS50eXBlID09PSB0b2tlbikgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXNIb3N0U3BlY2lhbENhc2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRJbmplY3RhYmxlc1tkaXJlY3RpdmVzU3RhcnRdKSk7CiAgICAgICAgaWYgKGRpckRlZiAmJiBpc0NvbXBvbmVudERlZihkaXJEZWYpICYmIGRpckRlZi50eXBlID09PSB0b2tlbikgewogICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlc1N0YXJ0OwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBSZXRyaWV2ZSBvciBpbnN0YW50aWF0ZSB0aGUgaW5qZWN0YWJsZSBmcm9tIHRoZSBgTFZpZXdgIGF0IHBhcnRpY3VsYXIgYGluZGV4YC4KICoKICogVGhpcyBmdW5jdGlvbiBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGluc3RhbnRpYXRlZCBhbmQgaWYgc28gcmV0dXJucyB0aGUKICogY2FjaGVkIGBpbmplY3RhYmxlYC4gT3RoZXJ3aXNlIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgdmFsdWUgaXMgc3RpbGwgYSBmYWN0b3J5IGl0CiAqIGluc3RhbnRpYXRlcyB0aGUgYGluamVjdGFibGVgIGFuZCBjYWNoZXMgdGhlIHZhbHVlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgdFZpZXcsIGluZGV4LCB0Tm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZhbHVlID0gbFZpZXdbaW5kZXhdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgaWYgKGlzRmFjdG9yeSh2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHZhbHVlOwogICAgICAgIGlmIChmYWN0b3J5LnJlc29sdmluZykgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIGRlcCBmb3IgJHtzdHJpbmdpZnlGb3JFcnJvcih0RGF0YVtpbmRleF0pfWApOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyA9IHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKGZhY3RvcnkuY2FuU2VlVmlld1Byb3ZpZGVycyk7CiAgICAgICAgZmFjdG9yeS5yZXNvbHZpbmcgPSB0cnVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbjsKICAgICAgICBpZiAoZmFjdG9yeS5pbmplY3RJbXBsKSB7CiAgICAgICAgICAgIHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihmYWN0b3J5LmluamVjdEltcGwpOwogICAgICAgIH0KICAgICAgICBlbnRlckRJKGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFsdWUgPSBsVmlld1tpbmRleF0gPSBmYWN0b3J5LmZhY3RvcnkodW5kZWZpbmVkLCB0RGF0YSwgbFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgLy8gVGhpcyBjb2RlIHBhdGggaXMgaGl0IGZvciBib3RoIGRpcmVjdGl2ZXMgYW5kIHByb3ZpZGVycy4KICAgICAgICAgICAgLy8gRm9yIHBlcmYgcmVhc29ucywgd2Ugd2FudCB0byBhdm9pZCBzZWFyY2hpbmcgZm9yIGhvb2tzIG9uIHByb3ZpZGVycy4KICAgICAgICAgICAgLy8gSXQgZG9lcyBubyBoYXJtIHRvIHRyeSAodGhlIGhvb2tzIGp1c3Qgd29uJ3QgZXhpc3QpLCBidXQgdGhlIGV4dHJhCiAgICAgICAgICAgIC8vIGNoZWNrcyBhcmUgdW5uZWNlc3NhcnkgYW5kIHRoaXMgaXMgYSBob3QgcGF0aC4gU28gd2UgY2hlY2sgdG8gc2VlCiAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRleCBvZiB0aGUgZGVwZW5kZW5jeSBpcyBpbiB0aGUgZGlyZWN0aXZlIHJhbmdlIGZvciB0aGlzCiAgICAgICAgICAgIC8vIHROb2RlLiBJZiBpdCdzIG5vdCwgd2Uga25vdyBpdCdzIGEgcHJvdmlkZXIgYW5kIHNraXAgaG9vayByZWdpc3RyYXRpb24uCiAgICAgICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYgaW5kZXggPj0gdE5vZGUuZGlyZWN0aXZlU3RhcnQpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREaXJlY3RpdmVEZWYodERhdGFbaW5kZXhdKTsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlT3JkZXJIb29rcyhpbmRleCwgKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4XSkpLCB0Vmlldyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChmYWN0b3J5LmluamVjdEltcGwpCiAgICAgICAgICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICAgICAgc2V0SW5jbHVkZVZpZXdQcm92aWRlcnMocHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyk7CiAgICAgICAgICAgIGZhY3RvcnkucmVzb2x2aW5nID0gZmFsc2U7CiAgICAgICAgICAgIGxlYXZlREkoKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KLyoqCiAqIFJldHVybnMgdGhlIGJpdCBpbiBhbiBpbmplY3RvcidzIGJsb29tIGZpbHRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdAogKiB0aGUgZGlyZWN0aXZlIG1pZ2h0IGJlIHByb3ZpZGVkIGJ5IHRoZSBpbmplY3Rvci4KICoKICogV2hlbiBhIGRpcmVjdGl2ZSBpcyBwdWJsaWMsIGl0IGlzIGFkZGVkIHRvIHRoZSBibG9vbSBmaWx0ZXIgYW5kIGdpdmVuIGEgdW5pcXVlIElEIHRoYXQgY2FuIGJlCiAqIHJldHJpZXZlZCBvbiB0aGUgVHlwZS4gV2hlbiB0aGUgZGlyZWN0aXZlIGlzbid0IHB1YmxpYyBvciB0aGUgdG9rZW4gaXMgbm90IGEgZGlyZWN0aXZlIGBudWxsYAogKiBpcyByZXR1cm5lZCBhcyB0aGUgbm9kZSBpbmplY3RvciBjYW4gbm90IHBvc3NpYmx5IHByb3ZpZGUgdGhhdCB0b2tlbi4KICoKICogQHBhcmFtIHs/fSB0b2tlbiB0aGUgaW5qZWN0aW9uIHRva2VuCiAqIEByZXR1cm4gez99IHRoZSBtYXRjaGluZyBiaXQgdG8gY2hlY2sgaW4gdGhlIGJsb29tIGZpbHRlciBvciBgbnVsbGAgaWYgdGhlIHRva2VuIGlzIG5vdCBrbm93bi4KICogICBXaGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBuZWdhdGl2ZSB0aGVuIGl0IHJlcHJlc2VudHMgc3BlY2lhbCB2YWx1ZXMgc3VjaCBhcyBgSW5qZWN0b3JgLgogKi8KZnVuY3Rpb24gYmxvb21IYXNoQml0T3JGYWN0b3J5KHRva2VuKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0b2tlbiwgJ3Rva2VuIG11c3QgYmUgZGVmaW5lZCcpOwogICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gdG9rZW4uY2hhckNvZGVBdCgwKSB8fCAwOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdG9rZW5JZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSlbTkdfRUxFTUVOVF9JRF07CiAgICAvLyBOZWdhdGl2ZSB0b2tlbiBJRHMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgb2JqZWN0cyBzdWNoIGFzIGBJbmplY3RvcmAKICAgIHJldHVybiAodHlwZW9mIHRva2VuSWQgPT09ICdudW1iZXInICYmIHRva2VuSWQgPiAwKSA/IHRva2VuSWQgJiBCTE9PTV9NQVNLIDogdG9rZW5JZDsKfQovKioKICogQHBhcmFtIHs/fSBibG9vbUhhc2gKICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4CiAqIEBwYXJhbSB7P30gaW5qZWN0b3JWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBibG9vbUhhc1Rva2VuKGJsb29tSGFzaCwgaW5qZWN0b3JJbmRleCwgaW5qZWN0b3JWaWV3KSB7CiAgICAvLyBDcmVhdGUgYSBtYXNrIHRoYXQgdGFyZ2V0cyB0aGUgc3BlY2lmaWMgYml0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0aXZlIHdlJ3JlIGxvb2tpbmcgZm9yLgogICAgLy8gSlMgYml0IG9wZXJhdGlvbnMgYXJlIDMyIGJpdHMsIHNvIHRoaXMgd2lsbCBiZSBhIG51bWJlciBiZXR3ZWVuIDJeMCBhbmQgMl4zMSwgY29ycmVzcG9uZGluZwogICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1hc2sgPSAxIDw8IGJsb29tSGFzaDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI3ID0gYmxvb21IYXNoICYgMHg4MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI2ID0gYmxvb21IYXNoICYgMHg0MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGI1ID0gYmxvb21IYXNoICYgMHgyMDsKICAgIC8vIE91ciBibG9vbSBmaWx0ZXIgc2l6ZSBpcyAyNTYgYml0cywgd2hpY2ggaXMgZWlnaHQgMzItYml0IGJsb29tIGZpbHRlciBidWNrZXRzOgogICAgLy8gYmYwID0gWzAgLSAzMV0sIGJmMSA9IFszMiAtIDYzXSwgYmYyID0gWzY0IC0gOTVdLCBiZjMgPSBbOTYgLSAxMjddLCBldGMuCiAgICAvLyBHZXQgdGhlIGJsb29tIGZpbHRlciB2YWx1ZSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBidWNrZXQgYmFzZWQgb24gdGhlIGRpcmVjdGl2ZSdzIGJsb29tQml0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZhbHVlOwogICAgaWYgKGI3KSB7CiAgICAgICAgdmFsdWUgPSBiNiA/IChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgN10gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDZdKSA6CiAgICAgICAgICAgIChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgNV0gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDRdKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHZhbHVlID0gYjYgPyAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDNdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyAyXSkgOgogICAgICAgICAgICAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDFdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXhdKTsKICAgIH0KICAgIC8vIElmIHRoZSBibG9vbSBmaWx0ZXIgdmFsdWUgaGFzIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlJ3MgYmxvb21CaXQgZmxpcHBlZCBvbiwKICAgIC8vIHRoaXMgaW5qZWN0b3IgaXMgYSBwb3RlbnRpYWwgbWF0Y2guCiAgICByZXR1cm4gISEodmFsdWUgJiBtYXNrKTsKfQovKioKICogUmV0dXJucyB0cnVlIGlmIGZsYWdzIHByZXZlbnQgcGFyZW50IGluamVjdG9yIGZyb20gYmVpbmcgc2VhcmNoZWQgZm9yIHRva2VucwogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaXNGaXJzdEhvc3RUTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2hvdWxkU2VhcmNoUGFyZW50KGZsYWdzLCBpc0ZpcnN0SG9zdFROb2RlKSB7CiAgICByZXR1cm4gIShmbGFncyAmIEluamVjdEZsYWdzLlNlbGYpICYmICEoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ICYmIGlzRmlyc3RIb3N0VE5vZGUpOwp9CmNsYXNzIE5vZGVJbmplY3RvciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ROb2RlCiAgICAgKiBAcGFyYW0gez99IF9sVmlldwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfdE5vZGUsIF9sVmlldykgewogICAgICAgIHRoaXMuX3ROb2RlID0gX3ROb2RlOwogICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICByZXR1cm4gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHRoaXMuX3ROb2RlLCB0aGlzLl9sVmlldywgdG9rZW4sIHVuZGVmaW5lZCwgbm90Rm91bmRWYWx1ZSk7CiAgICB9Cn0KLyoqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVnZXRGYWN0b3J5T2YodHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdHlwZUFueSA9ICgvKiogQHR5cGUgez99ICovICh0eXBlKSk7CiAgICBpZiAoaXNGb3J3YXJkUmVmKHR5cGUpKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSDJtcm1Z2V0RmFjdG9yeU9mKHJlc29sdmVGb3J3YXJkUmVmKHR5cGVBbnkpKTsKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkgPyBmYWN0b3J5KCkgOiBudWxsOwogICAgICAgIH0pKSkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZhY3RvcnkgPSBnZXRGYWN0b3J5RGVmKHR5cGVBbnkpOwogICAgaWYgKGZhY3RvcnkgPT09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5qZWN0b3JEZWYgPSBnZXRJbmplY3RvckRlZih0eXBlQW55KTsKICAgICAgICBmYWN0b3J5ID0gaW5qZWN0b3JEZWYgJiYgaW5qZWN0b3JEZWYuZmFjdG9yeTsKICAgIH0KICAgIHJldHVybiBmYWN0b3J5IHx8IG51bGw7Cn0KLyoqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KHR5cGUpIHsKICAgIHJldHVybiBub1NpZGVFZmZlY3RzKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHR5cGUucHJvdG90eXBlKS5jb25zdHJ1Y3RvcikpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmYWN0b3J5ID0gKCgvKiogQHR5cGUgez99ICovIChwcm90bykpKVtOR19GQUNUT1JZX0RFRl0gfHwgybXJtWdldEZhY3RvcnlPZihwcm90byk7CiAgICAgICAgaWYgKGZhY3RvcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBmYWN0b3J5IGRlZmluZWQuIEVpdGhlciB0aGlzIHdhcyBpbXByb3BlciB1c2FnZSBvZiBpbmhlcml0YW5jZQogICAgICAgICAgICAvLyAobm8gQW5ndWxhciBkZWNvcmF0b3Igb24gdGhlIHN1cGVyY2xhc3MpIG9yIHRoZXJlIGlzIG5vIGNvbnN0cnVjdG9yIGF0IGFsbAogICAgICAgICAgICAvLyBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uIFNpbmNlIHRoZSB0d28gY2FzZXMgY2Fubm90IGJlIGRpc3Rpbmd1aXNoZWQsIHRoZQogICAgICAgICAgICAvLyBsYXR0ZXIgaGFzIHRvIGJlIGFzc3VtZWQuCiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHQpID0+IG5ldyB0KCkpOwogICAgICAgIH0KICAgIH0pKTsKfQpjb25zdCBFUlJPUl9ERUJVR19DT05URVhUID0gJ25nRGVidWdDb250ZXh0JzsKY29uc3QgRVJST1JfT1JJR0lOQUxfRVJST1IgPSAnbmdPcmlnaW5hbEVycm9yJzsKY29uc3QgRVJST1JfTE9HR0VSID0gJ25nRXJyb3JMb2dnZXInOwpmdW5jdGlvbiB3cmFwcGVkRXJyb3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikgewogICAgY29uc3QgbXNnID0gYCR7bWVzc2FnZX0gY2F1c2VkIGJ5OiAke29yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZSA6IG9yaWdpbmFsRXJyb3J9YDsKICAgIGNvbnN0IGVycm9yID0gRXJyb3IobXNnKTsKICAgIGVycm9yW0VSUk9SX09SSUdJTkFMX0VSUk9SXSA9IG9yaWdpbmFsRXJyb3I7CiAgICByZXR1cm4gZXJyb3I7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERlYnVnQ29udGV4dChlcnJvcikgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoZXJyb3IpKSlbRVJST1JfREVCVUdfQ09OVEVYVF07Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE9yaWdpbmFsRXJyb3IoZXJyb3IpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX09SSUdJTkFMX0VSUk9SXTsKfQovKioKICogQHBhcmFtIHs/fSBlcnJvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RXJyb3JMb2dnZXIoZXJyb3IpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX0xPR0dFUl0gfHwgZGVmYXVsdEVycm9yTG9nZ2VyOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbnNvbGUKICogQHBhcmFtIHsuLi4/fSB2YWx1ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRFcnJvckxvZ2dlcihjb25zb2xlLCAuLi52YWx1ZXMpIHsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS5lcnJvcikpKSguLi52YWx1ZXMpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9lcnJvcl9oYW5kbGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBQcm92aWRlcyBhIGhvb2sgZm9yIGNlbnRyYWxpemVkIGV4Y2VwdGlvbiBoYW5kbGluZy4KICoKICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYEVycm9ySGFuZGxlcmAgcHJpbnRzIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBgY29uc29sZWAuIFRvCiAqIGludGVyY2VwdCBlcnJvciBoYW5kbGluZywgd3JpdGUgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCByZXBsYWNlcyB0aGlzIGRlZmF1bHQgYXMKICogYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgCiAqIGNsYXNzIE15RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKICogICBoYW5kbGVFcnJvcihlcnJvcikgewogKiAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGV4Y2VwdGlvbgogKiAgIH0KICogfQogKgogKiBcQE5nTW9kdWxlKHsKICogICBwcm92aWRlcnM6IFt7cHJvdmlkZTogRXJyb3JIYW5kbGVyLCB1c2VDbGFzczogTXlFcnJvckhhbmRsZXJ9XQogKiB9KQogKiBjbGFzcyBNeU1vZHVsZSB7fQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEVycm9ySGFuZGxlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fY29uc29sZSA9IGNvbnNvbGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGhhbmRsZUVycm9yKGVycm9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSB0aGlzLl9maW5kT3JpZ2luYWxFcnJvcihlcnJvcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9maW5kQ29udGV4dChlcnJvcik7CiAgICAgICAgLy8gTm90ZTogQnJvd3NlciBjb25zb2xlcyBzaG93IHRoZSBwbGFjZSBmcm9tIHdoZXJlIGNvbnNvbGUuZXJyb3Igd2FzIGNhbGxlZC4KICAgICAgICAvLyBXZSBjYW4gdXNlIHRoaXMgdG8gZ2l2ZSB1c2VycyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JMb2dnZXIgPSBnZXRFcnJvckxvZ2dlcihlcnJvcik7CiAgICAgICAgZXJyb3JMb2dnZXIodGhpcy5fY29uc29sZSwgYEVSUk9SYCwgZXJyb3IpOwogICAgICAgIGlmIChvcmlnaW5hbEVycm9yKSB7CiAgICAgICAgICAgIGVycm9yTG9nZ2VyKHRoaXMuX2NvbnNvbGUsIGBPUklHSU5BTCBFUlJPUmAsIG9yaWdpbmFsRXJyb3IpOwogICAgICAgIH0KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBlcnJvckxvZ2dlcih0aGlzLl9jb25zb2xlLCAnRVJST1IgQ09OVEVYVCcsIGNvbnRleHQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2ZpbmRDb250ZXh0KGVycm9yKSB7CiAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiBnZXREZWJ1Z0NvbnRleHQoZXJyb3IpID8gZ2V0RGVidWdDb250ZXh0KGVycm9yKSA6CiAgICAgICAgICAgICAgICB0aGlzLl9maW5kQ29udGV4dChnZXRPcmlnaW5hbEVycm9yKGVycm9yKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZmluZE9yaWdpbmFsRXJyb3IoZXJyb3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGUgPSBnZXRPcmlnaW5hbEVycm9yKGVycm9yKTsKICAgICAgICB3aGlsZSAoZSAmJiBnZXRPcmlnaW5hbEVycm9yKGUpKSB7CiAgICAgICAgICAgIGUgPSBnZXRPcmlnaW5hbEVycm9yKGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KfQovKioKICogRGVmaW5lcyBhIHNjaGVtYSB0aGF0IGFsbG93cyBhbiBOZ01vZHVsZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmc6CiAqIC0gTm9uLUFuZ3VsYXIgZWxlbWVudHMgbmFtZWQgd2l0aCBkYXNoIGNhc2UgKGAtYCkuCiAqIC0gRWxlbWVudCBwcm9wZXJ0aWVzIG5hbWVkIHdpdGggZGFzaCBjYXNlIChgLWApLgogKiBEYXNoIGNhc2UgaXMgdGhlIG5hbWluZyBjb252ZW50aW9uIGZvciBjdXN0b20gZWxlbWVudHMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSA9IHsKICAgIG5hbWU6ICdjdXN0b20tZWxlbWVudHMnCn07Ci8qKgogKiBEZWZpbmVzIGEgc2NoZW1hIHRoYXQgYWxsb3dzIGFueSBwcm9wZXJ0eSBvbiBhbnkgZWxlbWVudC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBOT19FUlJPUlNfU0NIRU1BID0gewogICAgbmFtZTogJ25vLWVycm9ycy1zY2hlbWEnCn07Ci8qKgogKiBAYWJzdHJhY3QKICovCmNsYXNzIFNhZmVWYWx1ZUltcGwgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHkKICAgICAqLwogICAgY29uc3RydWN0b3IoY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkgewogICAgICAgIHRoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSA9IGNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiBgU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzogJHt0aGlzLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHl9YCArCiAgICAgICAgICAgIGAgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYDsKICAgIH0KfQpjbGFzcyBTYWZlSHRtbEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJIVE1MIiAvKiBIdG1sICovOwogICAgfQp9CmNsYXNzIFNhZmVTdHlsZUltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJTdHlsZSIgLyogU3R5bGUgKi87CiAgICB9Cn0KY2xhc3MgU2FmZVNjcmlwdEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJTY3JpcHQiIC8qIFNjcmlwdCAqLzsKICAgIH0KfQpjbGFzcyBTYWZlVXJsSW1wbCBleHRlbmRzIFNhZmVWYWx1ZUltcGwgewogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUeXBlTmFtZSgpIHsKICAgICAgICByZXR1cm4gIlVSTCIgLyogVXJsICovOwogICAgfQp9CmNsYXNzIFNhZmVSZXNvdXJjZVVybEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi87CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2FmZVZhbHVlSW1wbCA/ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkpKSkgOgogICAgICAgICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgdHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWN0dWFsVHlwZSA9IGdldFNhbml0aXphdGlvbkJ5cGFzc1R5cGUodmFsdWUpOwogICAgaWYgKGFjdHVhbFR5cGUgIT0gbnVsbCAmJiBhY3R1YWxUeXBlICE9PSB0eXBlKSB7CiAgICAgICAgLy8gQWxsb3cgUmVzb3VyY2VVUkxzIGluIFVSTCBjb250ZXh0cywgdGhleSBhcmUgc3RyaWN0bHkgbW9yZSB0cnVzdGVkLgogICAgICAgIGlmIChhY3R1YWxUeXBlID09PSAiUmVzb3VyY2VVUkwiIC8qIFJlc291cmNlVXJsICovICYmIHR5cGUgPT09ICJVUkwiIC8qIFVybCAqLykKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHt0eXBlfSwgZ290IGEgJHthY3R1YWxUeXBlfSAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKTsKICAgIH0KICAgIHJldHVybiBhY3R1YWxUeXBlID09PSB0eXBlOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTYW5pdGl6YXRpb25CeXBhc3NUeXBlKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTYWZlVmFsdWVJbXBsICYmICgvKiogQHR5cGUgez99ICovICh2YWx1ZS5nZXRUeXBlTmFtZSgpKSkgfHwgbnVsbDsKfQovKioKICogTWFyayBgaHRtbGAgc3RyaW5nIGFzIHRydXN0ZWQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgaHRtbFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogKgogKiBAcGFyYW0gez99IHRydXN0ZWRIdG1sIGBodG1sYCBzdHJpbmcgd2hpY2ggbmVlZHMgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLgogKiBAcmV0dXJuIHs/fSBhIGBodG1sYCB3aGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICovCmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0SHRtbCh0cnVzdGVkSHRtbCkgewogICAgcmV0dXJuIG5ldyBTYWZlSHRtbEltcGwodHJ1c3RlZEh0bWwpOwp9Ci8qKgogKiBNYXJrIGBzdHlsZWAgc3RyaW5nIGFzIHRydXN0ZWQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgc3R5bGVTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICoKICogQHBhcmFtIHs/fSB0cnVzdGVkU3R5bGUgYHN0eWxlYCBzdHJpbmcgd2hpY2ggbmVlZHMgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLgogKiBAcmV0dXJuIHs/fSBhIGBzdHlsZWAgaGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICovCmZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U3R5bGUodHJ1c3RlZFN0eWxlKSB7CiAgICByZXR1cm4gbmV3IFNhZmVTdHlsZUltcGwodHJ1c3RlZFN0eWxlKTsKfQovKioKICogTWFyayBgc2NyaXB0YCBzdHJpbmcgYXMgdHJ1c3RlZC4KICoKICogVGhpcyBmdW5jdGlvbiB3cmFwcyB0aGUgdHJ1c3RlZCBzdHJpbmcgaW4gYFN0cmluZ2AgYW5kIGJyYW5kcyBpdCBpbiBhIHdheSB3aGljaCBtYWtlcyBpdAogKiByZWNvZ25pemFibGUgdG8ge1xAbGluayBzY3JpcHRTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICoKICogQHBhcmFtIHs/fSB0cnVzdGVkU2NyaXB0IGBzY3JpcHRgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqIEByZXR1cm4gez99IGEgYHNjcmlwdGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFNjcmlwdCh0cnVzdGVkU2NyaXB0KSB7CiAgICByZXR1cm4gbmV3IFNhZmVTY3JpcHRJbXBsKHRydXN0ZWRTY3JpcHQpOwp9Ci8qKgogKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0CiAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHVybFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogKgogKiBAcGFyYW0gez99IHRydXN0ZWRVcmwgYHVybGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICogQHJldHVybiB7P30gYSBgdXJsYCAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybCh0cnVzdGVkVXJsKSB7CiAgICByZXR1cm4gbmV3IFNhZmVVcmxJbXBsKHRydXN0ZWRVcmwpOwp9Ci8qKgogKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0CiAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHJlc291cmNlVXJsU2FuaXRpemVyfSB0byBiZSB0cnVzdGVkIGltcGxpY2l0bHkuCiAqCiAqIEBwYXJhbSB7P30gdHJ1c3RlZFJlc291cmNlVXJsIGB1cmxgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqIEByZXR1cm4gez99IGEgYHVybGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAqLwpmdW5jdGlvbiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFJlc291cmNlVXJsKHRydXN0ZWRSZXNvdXJjZVVybCkgewogICAgcmV0dXJuIG5ldyBTYWZlUmVzb3VyY2VVcmxJbXBsKHRydXN0ZWRSZXNvdXJjZVVybCk7Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGNvbnRyb2wgaWYgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIHBpcGVsaW5lIHNob3VsZCBiZSBgVmlld0VuZ2luZWAgb3IgYEl2eWAuCiAqCiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gYW5kIGRlYnVnIHRlc3RzIHdpdGggZWl0aGVyIEl2eSBvciBWaWV3IEVuZ2luZSAobGVnYWN5KSwKICogcGxlYXNlIHNlZSBbQkFaRUwubWRdKC4vZG9jcy9CQVpFTC5tZCkuCiAqLwpsZXQgX2Rldk1vZGUgPSB0cnVlOwpsZXQgX3J1bk1vZGVMb2NrZWQgPSBmYWxzZTsKLyoqCiAqIFJldHVybnMgd2hldGhlciBBbmd1bGFyIGlzIGluIGRldmVsb3BtZW50IG1vZGUuIEFmdGVyIGNhbGxlZCBvbmNlLAogKiB0aGUgdmFsdWUgaXMgbG9ja2VkIGFuZCB3b24ndCBjaGFuZ2UgYW55IG1vcmUuCiAqCiAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdHJ1ZSwgdW5sZXNzIGEgdXNlciBjYWxscyBgZW5hYmxlUHJvZE1vZGVgIGJlZm9yZSBjYWxsaW5nIHRoaXMuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIGlzRGV2TW9kZSgpIHsKICAgIF9ydW5Nb2RlTG9ja2VkID0gdHJ1ZTsKICAgIHJldHVybiBfZGV2TW9kZTsKfQovKioKICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyCiAqIGNoZWNrcyB3aXRoaW4gdGhlIGZyYW1ld29yay4KICoKICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzCiAqIGRvZXMgbm90IHJlc3VsdCBpbiBhZGRpdGlvbmFsIGNoYW5nZXMgdG8gYW55IGJpbmRpbmdzIChhbHNvIGtub3duIGFzCiAqIHVuaWRpcmVjdGlvbmFsIGRhdGEgZmxvdykuCiAqCiAqIEBwdWJsaWNBcGkKICovCmZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkgewogICAgaWYgKF9ydW5Nb2RlTG9ja2VkKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4nKTsKICAgIH0KICAgIF9kZXZNb2RlID0gZmFsc2U7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3Nhbml0aXphdGlvbi9pbmVydF9ib2R5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoaXMgaGVscGVyIGNsYXNzIGlzIHVzZWQgdG8gZ2V0IGhvbGQgb2YgYW4gaW5lcnQgdHJlZSBvZiBET00gZWxlbWVudHMgY29udGFpbmluZyBkaXJ0eSBIVE1MCiAqIHRoYXQgbmVlZHMgc2FuaXRpemluZy4KICogRGVwZW5kaW5nIHVwb24gYnJvd3NlciBzdXBwb3J0IHdlIG11c3QgdXNlIG9uZSBvZiB0aHJlZSBzdHJhdGVnaWVzIGZvciBkb2luZyB0aGlzLgogKiBTdXBwb3J0OiBTYWZhcmkgMTAueCAtPiBYSFIgc3RyYXRlZ3kKICogU3VwcG9ydDogRmlyZWZveCAtPiBEb21QYXJzZXIgc3RyYXRlZ3kKICogRGVmYXVsdDogSW5lcnREb2N1bWVudCBzdHJhdGVneQogKi8KY2xhc3MgSW5lcnRCb2R5SGVscGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWZhdWx0RG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRlZmF1bHREb2MpIHsKICAgICAgICB0aGlzLmRlZmF1bHREb2MgPSBkZWZhdWx0RG9jOwogICAgICAgIHRoaXMuaW5lcnREb2N1bWVudCA9IHRoaXMuZGVmYXVsdERvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3Nhbml0aXphdGlvbi1pbmVydCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5ib2R5OwogICAgICAgIGlmIChpbmVydEJvZHlFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gdXN1YWxseSB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgYm9keSBlbGVtZW50IGluIHRoZSBkb2N1bWVudCwgYnV0IElFIGRvZXNuJ3QgaGF2ZSBhbnksIHNvCiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIG9uZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmVydEh0bWwgPSB0aGlzLmluZXJ0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHRtbCcpOwogICAgICAgICAgICB0aGlzLmluZXJ0RG9jdW1lbnQuYXBwZW5kQ2hpbGQoaW5lcnRIdG1sKTsKICAgICAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7CiAgICAgICAgICAgIGluZXJ0SHRtbC5hcHBlbmRDaGlsZChpbmVydEJvZHlFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUwgPSAnPHN2Zz48ZyBvbmxvYWQ9InRoaXMucGFyZW50Tm9kZS5yZW1vdmUoKSI+PC9nPjwvc3ZnPic7CiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiAhaW5lcnRCb2R5RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKSkgewogICAgICAgICAgICAvLyBXZSBqdXN0IGhpdCB0aGUgU2FmYXJpIDEwLjEgYnVnIC0gd2hpY2ggYWxsb3dzIEpTIHRvIHJ1biBpbnNpZGUgdGhlIFNWRyBHIGVsZW1lbnQKICAgICAgICAgICAgLy8gc28gdXNlIHRoZSBYSFIgc3RyYXRlZ3kuCiAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9YSFI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUwgPSAnPHN2Zz48cD48c3R5bGU+PGltZyBzcmM9Ijwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpLy8iPic7CiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiBpbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZyBpbWcnKSkgewogICAgICAgICAgICAvLyBXZSBqdXN0IGhpdCB0aGUgRmlyZWZveCBidWcgLSB3aGljaCBwcmV2ZW50cyB0aGUgaW5uZXIgaW1nIEpTIGZyb20gYmVpbmcgc2FuaXRpemVkCiAgICAgICAgICAgIC8vIHNvIHVzZSB0aGUgRE9NUGFyc2VyIHN0cmF0ZWd5LCBpZiBpdCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgIC8vIElmIHRoZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSB0aGVuIHdlIGFyZSBub3QgaW4gRmlyZWZveCAoU2VydmVyL1dlYldvcmtlcj8pIHNvIHdlCiAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCBzdHJhdGVneSBiZWxvdy4KICAgICAgICAgICAgaWYgKGlzRE9NUGFyc2VyQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9ET01QYXJzZXI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTm9uZSBvZiB0aGUgYnVncyB3ZXJlIGhpdCBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byB1c2UgdGhlIGRlZmF1bHQgSW5lcnREb2N1bWVudCBzdHJhdGVneQogICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9JbmVydERvY3VtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBVc2UgWEhSIHRvIGNyZWF0ZSBhbmQgZmlsbCBhbiBpbmVydCBib2R5IGVsZW1lbnQgKG9uIFNhZmFyaSAxMC4xKQogICAgICogU2VlCiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9ibG9iL2E5OTJkM2E3NTAzMWNiOGJiMDMyZTVlYTgzOTliYTk3MmJkZjlhNjUvc3JjL3B1cmlmeS5qcyNMNDM5LUw0NDkKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGh0bWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEluZXJ0Qm9keUVsZW1lbnRfWEhSKGh0bWwpIHsKICAgICAgICAvLyBXZSBhZGQgdGhlc2UgZXh0cmEgZWxlbWVudHMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvbnRlbnQgaXMgcGFyc2VkIGFzIGV4cGVjdGVkCiAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGUKICAgICAgICAvLyBgPGhlYWQ+YCB0YWcuCiAgICAgICAgaHRtbCA9ICc8Ym9keT48cmVtb3ZlPjwvcmVtb3ZlPicgKyBodG1sICsgJzwvYm9keT4nOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGh0bWwgPSBlbmNvZGVVUkkoaHRtbCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnOwogICAgICAgIHhoci5vcGVuKCdHRVQnLCAnZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCwnICsgaHRtbCwgZmFsc2UpOwogICAgICAgIHhoci5zZW5kKHVuZGVmaW5lZCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJvZHkgPSB4aHIucmVzcG9uc2UuYm9keTsKICAgICAgICBib2R5LnJlbW92ZUNoaWxkKCgvKiogQHR5cGUgez99ICovIChib2R5LmZpcnN0Q2hpbGQpKSk7CiAgICAgICAgcmV0dXJuIGJvZHk7CiAgICB9CiAgICAvKioKICAgICAqIFVzZSBET01QYXJzZXIgdG8gY3JlYXRlIGFuZCBmaWxsIGFuIGluZXJ0IGJvZHkgZWxlbWVudCAob24gRmlyZWZveCkKICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9yZWxlYXNlcy90YWcvMC42LjcKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlcihodG1sKSB7CiAgICAgICAgLy8gV2UgYWRkIHRoZXNlIGV4dHJhIGVsZW1lbnRzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXN0IG9mIHRoZSBjb250ZW50IGlzIHBhcnNlZCBhcyBleHBlY3RlZAogICAgICAgIC8vIGUuZy4gbGVhZGluZyB3aGl0ZXNwYWNlIGlzIG1haW50YWluZWQgYW5kIHRhZ3MgbGlrZSBgPG1ldGE+YCBkbyBub3QgZ2V0IGhvaXN0ZWQgdG8gdGhlCiAgICAgICAgLy8gYDxoZWFkPmAgdGFnLgogICAgICAgIGh0bWwgPSAnPGJvZHk+PHJlbW92ZT48L3JlbW92ZT4nICsgaHRtbCArICc8L2JvZHk+JzsKICAgICAgICB0cnkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSAoLyoqIEB0eXBlIHs/fSAqLyAobmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93KSkpLkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJykuYm9keSkpOwogICAgICAgICAgICBib2R5LnJlbW92ZUNoaWxkKCgvKiogQHR5cGUgez99ICovIChib2R5LmZpcnN0Q2hpbGQpKSk7CiAgICAgICAgICAgIHJldHVybiBib2R5OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVc2UgYW4gSFRNTDUgYHRlbXBsYXRlYCBlbGVtZW50LCBpZiBzdXBwb3J0ZWQsIG9yIGFuIGluZXJ0IGJvZHkgZWxlbWVudCBjcmVhdGVkIHZpYQogICAgICogYGNyZWF0ZUh0bWxEb2N1bWVudGAgdG8gY3JlYXRlIGFuZCBmaWxsIGFuIGluZXJ0IERPTSBlbGVtZW50LgogICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzYW5lIHN0cmF0ZWd5IHRvIHVzZSBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCByZXF1aXJlIG9uZSBvZiB0aGUgc3BlY2lhbGlzZWQKICAgICAqIHN0cmF0ZWdpZXMgYWJvdmUuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRJbmVydEJvZHlFbGVtZW50X0luZXJ0RG9jdW1lbnQoaHRtbCkgewogICAgICAgIC8vIFByZWZlciB1c2luZyA8dGVtcGxhdGU+IGVsZW1lbnQgaWYgc3VwcG9ydGVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0ZW1wbGF0ZUVsID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKCdjb250ZW50JyBpbiB0ZW1wbGF0ZUVsKSB7CiAgICAgICAgICAgIHRlbXBsYXRlRWwuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRWw7CiAgICAgICAgfQogICAgICAgIC8vIE5vdGUgdGhhdCBwcmV2aW91c2x5IHdlIHVzZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UgYHRoaXMuaW5lcnREb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IGh0bWxgCiAgICAgICAgLy8gYW5kIHdlIHJldHVybmVkIHRoZSBpbmVydCBgYm9keWAgbm9kZS4gVGhpcyB3YXMgY2hhbmdlZCwgYmVjYXVzZSBJRSBzZWVtcyB0byB0cmVhdCBzZXR0aW5nCiAgICAgICAgLy8gYGlubmVySFRNTGAgb24gYW4gaW5zZXJ0ZWQgZWxlbWVudCBkaWZmZXJlbnRseSwgY29tcGFyZWQgdG8gb25lIHRoYXQgaGFzbid0IGJlZW4gaW5zZXJ0ZWQKICAgICAgICAvLyB5ZXQuIEluIHBhcnRpY3VsYXIsIElFIGFwcGVhcnMgdG8gc3BsaXQgc29tZSBvZiB0aGUgdGV4dCBpbnRvIG11bHRpcGxlIHRleHQgbm9kZXMgcmF0aGVyCiAgICAgICAgLy8gdGhhbiBrZWVwaW5nIHRoZW0gaW4gYSBzaW5nbGUgb25lIHdoaWNoIGVuZHMgdXAgbWVzc2luZyB3aXRoIEl2eSdzIGkxOG4gcGFyc2luZyBmdXJ0aGVyCiAgICAgICAgLy8gZG93biB0aGUgbGluZS4gVGhpcyBoYXMgYmVlbiB3b3JrZWQgYXJvdW5kIGJ5IGNyZWF0aW5nIGEgbmV3IGluZXJ0IGBib2R5YCBhbmQgdXNpbmcgaXQgYXMKICAgICAgICAvLyB0aGUgcm9vdCBub2RlIGluIHdoaWNoIHdlIGluc2VydCB0aGUgSFRNTC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5lcnRCb2R5ID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTsKICAgICAgICBpbmVydEJvZHkuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHkKICAgICAgICAvLyBzdHJpcCBjdXN0b20tbmFtZXNwYWNlZCBhdHRyaWJ1dGVzIG9uIElFPD0xMQogICAgICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVmYXVsdERvYykpKS5kb2N1bWVudE1vZGUpIHsKICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoaW5lcnRCb2R5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZXJ0Qm9keTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBJRTktMTEgY29tZXMgYWNyb3NzIGFuIHVua25vd24gbmFtZXNwYWNlZCBhdHRyaWJ1dGUgZS5nLiAneGxpbms6Zm9vJyBpdCBhZGRzICd4bWxuczpuczEnCiAgICAgKiBhdHRyaWJ1dGUgdG8gZGVjbGFyZSBuczEgbmFtZXNwYWNlIGFuZCBwcmVmaXhlcyB0aGUgYXR0cmlidXRlIHdpdGggJ25zMScgKGUuZy4KICAgICAqICduczE6eGxpbms6Zm9vJykuCiAgICAgKgogICAgICogVGhpcyBpcyB1bmRlc2lyYWJsZSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGFsbG93IGFueSBvZiB0aGVzZSBjdXN0b20gYXR0cmlidXRlcy4gVGhpcyBtZXRob2QKICAgICAqIHN0cmlwcyB0aGVtIGFsbC4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdHJpcEN1c3RvbU5zQXR0cnMoZWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxBdHRycyA9IGVsLmF0dHJpYnV0ZXM7CiAgICAgICAgLy8gbG9vcCBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCByZW1vdmFscy4KICAgICAgICBmb3IgKGxldCBpID0gZWxBdHRycy5sZW5ndGggLSAxOyAwIDwgaTsgaS0tKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0cmliID0gZWxBdHRycy5pdGVtKGkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJpYikpLm5hbWU7CiAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ3htbG5zOm5zMScgfHwgYXR0ck5hbWUuaW5kZXhPZignbnMxOicpID09PSAwKSB7CiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY2hpbGROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsLmZpcnN0Q2hpbGQpKTsKICAgICAgICB3aGlsZSAoY2hpbGROb2RlKSB7CiAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKQogICAgICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkTm9kZSkpKTsKICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgIH0KfQovKioKICogV2UgbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgRE9NUGFyc2VyIGV4aXN0cyBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuCiAqIFRoZSB0cnktY2F0Y2ggaXMgYmVjYXVzZSwgb24gc29tZSBicm93c2VycywgdHJ5aW5nIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5CiAqIG9uIHdpbmRvdyBjYW4gYWN0dWFsbHkgdGhyb3cgYW4gZXJyb3IuCiAqCiAqIEBzdXBwcmVzcyB7dXNlbGVzc0NvZGV9CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0RPTVBhcnNlckF2YWlsYWJsZSgpIHsKICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuRE9NUGFyc2VyOwogICAgfQogICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBwYXR0ZXJuIHRoYXQgcmVjb2duaXplcyBhIGNvbW1vbmx5IHVzZWZ1bCBzdWJzZXQgb2YgVVJMcyB0aGF0IGFyZSBzYWZlLgogKgogKiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGEgc3Vic2V0IG9mIFVSTHMgdGhhdCB3aWxsIG5vdCBjYXVzZSBzY3JpcHQKICogZXhlY3V0aW9uIGlmIHVzZWQgaW4gVVJMIGNvbnRleHQgd2l0aGluIGEgSFRNTCBkb2N1bWVudC4gU3BlY2lmaWNhbGx5LCB0aGlzCiAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGlmIChjb21tZW50IGZyb20gaGVyZSBvbiBhbmQgcmVnZXggY29waWVkIGZyb20KICogU295J3MgRXNjYXBpbmdDb252ZW50aW9ucyk6CiAqICgxKSBFaXRoZXIgYW4gYWxsb3dlZCBwcm90b2NvbCAoaHR0cCwgaHR0cHMsIG1haWx0byBvciBmdHApLgogKiAoMikgb3Igbm8gcHJvdG9jb2wuICBBIHByb3RvY29sIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjb2xvbi4gVGhlIGJlbG93CiAqICAgICBhbGxvd3MgdGhhdCBieSBhbGxvd2luZyBjb2xvbnMgb25seSBhZnRlciBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgWy8/I10uCiAqICAgICBBIGNvbG9uIGFmdGVyIGEgaGFzaCAoIykgbXVzdCBiZSBpbiB0aGUgZnJhZ21lbnQuCiAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSAoPykgbXVzdCBiZSBpbiBhIHF1ZXJ5LgogKiAgICAgT3RoZXJ3aXNlLCBhIGNvbG9uIGFmdGVyIGEgc2luZ2xlIHNvbGlkdXMgKC8pIG11c3QgYmUgaW4gYSBwYXRoLgogKiAgICAgT3RoZXJ3aXNlLCBhIGNvbG9uIGFmdGVyIGEgZG91YmxlIHNvbGlkdXMgKC8vKSBtdXN0IGJlIGluIHRoZSBhdXRob3JpdHkKICogICAgIChiZWZvcmUgcG9ydCkuCiAqCiAqIFRoZSBwYXR0ZXJuIGRpc2FsbG93cyAmLCB1c2VkIGluIEhUTUwgZW50aXR5IGRlY2xhcmF0aW9ucyBiZWZvcmUKICogb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIFsvPyNdLiBUaGlzIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIHVzZWQgaW4gdGhlCiAqIHByb3RvY29sIG5hbWUsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4sIGUuZy4gImgmIzExNjt0cCIgZm9yICJodHRwIi4KICogSXQgYWxzbyBkaXNhbGxvd3MgSFRNTCBlbnRpdGllcyBpbiB0aGUgZmlyc3QgcGF0aCBwYXJ0IG9mIGEgcmVsYXRpdmUgcGF0aCwKICogZS5nLiAiZm9vJmx0O2Jhci9iYXoiLiAgT3VyIGV4aXN0aW5nIGVzY2FwaW5nIGZ1bmN0aW9ucyBzaG91bGQgbm90IHByb2R1Y2UKICogdGhhdC4gTW9yZSBpbXBvcnRhbnRseSwgaXQgZGlzYWxsb3dzIG1hc2tpbmcgb2YgYSBjb2xvbiwKICogZS5nLiAiamF2YXNjcmlwdCYjNTg7Li4uIi4KICoKICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgU0FGRV9VUkxfUEFUVEVSTiA9IC9eKD86KD86aHR0cHM/fG1haWx0b3xmdHB8dGVsfGZpbGUpOnxbXiY6Lz8jXSooPzpbLz8jXXwkKSkvZ2k7Ci8qKgogKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcL10rPSokL2k7Ci8qKgogKiBAcGFyYW0gez99IHVybAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3Nhbml0aXplVXJsKHVybCkgewogICAgdXJsID0gU3RyaW5nKHVybCk7CiAgICBpZiAodXJsLm1hdGNoKFNBRkVfVVJMX1BBVFRFUk4pIHx8IHVybC5tYXRjaChEQVRBX1VSTF9QQVRURVJOKSkKICAgICAgICByZXR1cm4gdXJsOwogICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBzYW5pdGl6aW5nIHVuc2FmZSBVUkwgdmFsdWUgJHt1cmx9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOwogICAgfQogICAgcmV0dXJuICd1bnNhZmU6JyArIHVybDsKfQovKioKICogQHBhcmFtIHs/fSBzcmNzZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNhbml0aXplU3Jjc2V0KHNyY3NldCkgewogICAgc3Jjc2V0ID0gU3RyaW5nKHNyY3NldCk7CiAgICByZXR1cm4gc3Jjc2V0LnNwbGl0KCcsJykubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gc3Jjc2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3Jjc2V0KSA9PiBfc2FuaXRpemVVcmwoc3Jjc2V0LnRyaW0oKSkpKS5qb2luKCcsICcpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vaHRtbF9zYW5pdGl6ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdGFncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGFnU2V0KHRhZ3MpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IHt9OwogICAgZm9yIChjb25zdCB0IG9mIHRhZ3Muc3BsaXQoJywnKSkKICAgICAgICByZXNbdF0gPSB0cnVlOwogICAgcmV0dXJuIHJlczsKfQovKioKICogQHBhcmFtIHsuLi4/fSBzZXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtZXJnZSQxKC4uLnNldHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IHt9OwogICAgZm9yIChjb25zdCBzIG9mIHNldHMpIHsKICAgICAgICBmb3IgKGNvbnN0IHYgaW4gcykgewogICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eSh2KSkKICAgICAgICAgICAgICAgIHJlc1t2XSA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKfQovLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCi8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNzZW1hbnRpY3MKLy8gaHR0cDovL3NpbW9uLmh0bWw1Lm9yZy9odG1sLWVsZW1lbnRzCi8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1Ci8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCN2b2lkLWVsZW1lbnRzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgVk9JRF9FTEVNRU5UUyA9IHRhZ1NldCgnYXJlYSxicixjb2wsaHIsaW1nLHdicicpOwovLyBFbGVtZW50cyB0aGF0IHlvdSBjYW4sIGludGVudGlvbmFsbHksIGxlYXZlIG9wZW4gKGFuZCB3aGljaCBjbG9zZSB0aGVtc2VsdmVzKQovLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjb3B0aW9uYWwtdGFncwovKiogQHR5cGUgez99ICovCmNvbnN0IE9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMgPSB0YWdTZXQoJ2NvbGdyb3VwLGRkLGR0LGxpLHAsdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdHInKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyA9IHRhZ1NldCgncnAscnQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBPUFRJT05BTF9FTkRfVEFHX0VMRU1FTlRTID0gbWVyZ2UkMShPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUywgT1BUSU9OQUxfRU5EX1RBR19CTE9DS19FTEVNRU5UUyk7Ci8vIFNhZmUgQmxvY2sgRWxlbWVudHMgLSBIVE1MNQovKiogQHR5cGUgez99ICovCmNvbnN0IEJMT0NLX0VMRU1FTlRTID0gbWVyZ2UkMShPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTLCB0YWdTZXQoJ2FkZHJlc3MsYXJ0aWNsZSwnICsKICAgICdhc2lkZSxibG9ja3F1b3RlLGNhcHRpb24sY2VudGVyLGRlbCxkZXRhaWxzLGRpYWxvZyxkaXIsZGl2LGRsLGZpZ3VyZSxmaWdjYXB0aW9uLGZvb3RlcixoMSxoMixoMyxoNCxoNSwnICsKICAgICdoNixoZWFkZXIsaGdyb3VwLGhyLGlucyxtYWluLG1hcCxtZW51LG5hdixvbCxwcmUsc2VjdGlvbixzdW1tYXJ5LHRhYmxlLHVsJykpOwovLyBJbmxpbmUgRWxlbWVudHMgLSBIVE1MNQovKiogQHR5cGUgez99ICovCmNvbnN0IElOTElORV9FTEVNRU5UUyA9IG1lcmdlJDEoT1BUSU9OQUxfRU5EX1RBR19JTkxJTkVfRUxFTUVOVFMsIHRhZ1NldCgnYSxhYmJyLGFjcm9ueW0sYXVkaW8sYiwnICsKICAgICdiZGksYmRvLGJpZyxicixjaXRlLGNvZGUsZGVsLGRmbixlbSxmb250LGksaW1nLGlucyxrYmQsbGFiZWwsbWFwLG1hcmsscGljdHVyZSxxLHJ1YnkscnAscnQscywnICsKICAgICdzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvJykpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFZBTElEX0VMRU1FTlRTID0gbWVyZ2UkMShWT0lEX0VMRU1FTlRTLCBCTE9DS19FTEVNRU5UUywgSU5MSU5FX0VMRU1FTlRTLCBPUFRJT05BTF9FTkRfVEFHX0VMRU1FTlRTKTsKLy8gQXR0cmlidXRlcyB0aGF0IGhhdmUgaHJlZiBhbmQgaGVuY2UgbmVlZCB0byBiZSBzYW5pdGl6ZWQKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVUklfQVRUUlMgPSB0YWdTZXQoJ2JhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZicpOwovLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBzcGVjaWFsIGhyZWYgc2V0IGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1JDU0VUX0FUVFJTID0gdGFnU2V0KCdzcmNzZXQnKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBIVE1MX0FUVFJTID0gdGFnU2V0KCdhYmJyLGFjY2Vzc2tleSxhbGlnbixhbHQsYXV0b3BsYXksYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sJyArCiAgICAnY29tcGFjdCxjb250cm9scyxjb29yZHMsZGF0ZXRpbWUsZGVmYXVsdCxkaXIsZG93bmxvYWQsZmFjZSxoZWFkZXJzLGhlaWdodCxoaWRkZW4saHJlZmxhbmcsaHNwYWNlLCcgKwogICAgJ2lzbWFwLGl0ZW1zY29wZSxpdGVtcHJvcCxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9vcCxtZWRpYSxtdXRlZCxub2hyZWYsbm93cmFwLG9wZW4scHJlbG9hZCxyZWwscmV2LHJvbGUscm93cyxyb3dzcGFuLHJ1bGVzLCcgKwogICAgJ3Njb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNpemVzLHNwYW4sc3JjbGFuZyxzdGFydCxzdW1tYXJ5LHRhYmluZGV4LHRhcmdldCx0aXRsZSx0cmFuc2xhdGUsdHlwZSx1c2VtYXAsJyArCiAgICAndmFsaWduLHZhbHVlLHZzcGFjZSx3aWR0aCcpOwovLyBBY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXMgYXMgcGVyIFdBSS1BUklBIDEuMSAoVzNDIFdvcmtpbmcgRHJhZnQgMTQgRGVjZW1iZXIgMjAxOCkKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBBUklBX0FUVFJTID0gdGFnU2V0KCdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsYXJpYS1hdG9taWMsYXJpYS1hdXRvY29tcGxldGUsYXJpYS1idXN5LGFyaWEtY2hlY2tlZCxhcmlhLWNvbGNvdW50LGFyaWEtY29saW5kZXgsJyArCiAgICAnYXJpYS1jb2xzcGFuLGFyaWEtY29udHJvbHMsYXJpYS1jdXJyZW50LGFyaWEtZGVzY3JpYmVkYnksYXJpYS1kZXRhaWxzLGFyaWEtZGlzYWJsZWQsYXJpYS1kcm9wZWZmZWN0LCcgKwogICAgJ2FyaWEtZXJyb3JtZXNzYWdlLGFyaWEtZXhwYW5kZWQsYXJpYS1mbG93dG8sYXJpYS1ncmFiYmVkLGFyaWEtaGFzcG9wdXAsYXJpYS1oaWRkZW4sYXJpYS1pbnZhbGlkLCcgKwogICAgJ2FyaWEta2V5c2hvcnRjdXRzLGFyaWEtbGFiZWwsYXJpYS1sYWJlbGxlZGJ5LGFyaWEtbGV2ZWwsYXJpYS1saXZlLGFyaWEtbW9kYWwsYXJpYS1tdWx0aWxpbmUsJyArCiAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUsYXJpYS1vcmllbnRhdGlvbixhcmlhLW93bnMsYXJpYS1wbGFjZWhvbGRlcixhcmlhLXBvc2luc2V0LGFyaWEtcHJlc3NlZCxhcmlhLXJlYWRvbmx5LCcgKwogICAgJ2FyaWEtcmVsZXZhbnQsYXJpYS1yZXF1aXJlZCxhcmlhLXJvbGVkZXNjcmlwdGlvbixhcmlhLXJvd2NvdW50LGFyaWEtcm93aW5kZXgsYXJpYS1yb3dzcGFuLGFyaWEtc2VsZWN0ZWQsJyArCiAgICAnYXJpYS1zZXRzaXplLGFyaWEtc29ydCxhcmlhLXZhbHVlbWF4LGFyaWEtdmFsdWVtaW4sYXJpYS12YWx1ZW5vdyxhcmlhLXZhbHVldGV4dCcpOwovLyBOQjogVGhpcyBjdXJyZW50bHkgY29uc2Npb3VzbHkgZG9lc24ndCBzdXBwb3J0IFNWRy4gU1ZHIHNhbml0aXphdGlvbiBoYXMgaGFkIHNldmVyYWwgc2VjdXJpdHkKLy8gaXNzdWVzIGluIHRoZSBwYXN0LCBzbyBpdCBzZWVtcyBzYWZlciB0byBsZWF2ZSBpdCBvdXQgaWYgcG9zc2libGUuIElmIHN1cHBvcnQgZm9yIGJpbmRpbmcgU1ZHIHZpYQovLyBpbm5lckhUTUwgaXMgcmVxdWlyZWQsIFNWRyBhdHRyaWJ1dGVzIHNob3VsZCBiZSBhZGRlZCBoZXJlLgovLyBOQjogU2FuaXRpemF0aW9uIGRvZXMgbm90IGFsbG93IDxmb3JtPiBlbGVtZW50cyBvciBvdGhlciBhY3RpdmUgZWxlbWVudHMgKDxidXR0b24+IGV0YykuIFRob3NlCi8vIGNhbiBiZSBzYW5pdGl6ZWQsIGJ1dCB0aGV5IGluY3JlYXNlIHNlY3VyaXR5IHN1cmZhY2UgYXJlYSB3aXRob3V0IGEgbGVnaXRpbWF0ZSB1c2UgY2FzZSwgc28gdGhleQovLyBhcmUgbGVmdCBvdXQgaGVyZS4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBWQUxJRF9BVFRSUyA9IG1lcmdlJDEoVVJJX0FUVFJTLCBTUkNTRVRfQVRUUlMsIEhUTUxfQVRUUlMsIEFSSUFfQVRUUlMpOwovLyBFbGVtZW50cyB3aG9zZSBjb250ZW50IHNob3VsZCBub3QgYmUgdHJhdmVyc2VkL3ByZXNlcnZlZCwgaWYgdGhlIGVsZW1lbnRzIHRoZW1zZWx2ZXMgYXJlIGludmFsaWQuCi8vCi8vIFR5cGljYWxseSwgYDxpbnZhbGlkPlNvbWUgY29udGVudDwvaW52YWxpZD5gIHdvdWxkIHRyYXZlcnNlIChhbmQgaW4gdGhpcyBjYXNlIHByZXNlcnZlKQovLyBgU29tZSBjb250ZW50YCwgYnV0IHN0cmlwIGBpbnZhbGlkLWVsZW1lbnRgIG9wZW5pbmcvY2xvc2luZyB0YWdzLiBGb3Igc29tZSBlbGVtZW50cywgdGhvdWdoLCB3ZQovLyBkb24ndCB3YW50IHRvIHByZXNlcnZlIHRoZSBjb250ZW50LCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgZ29pbmcgdG8gYmUgcmVtb3ZlZC4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTS0lQX1RSQVZFUlNJTkdfQ09OVEVOVF9JRl9JTlZBTElEX0VMRU1FTlRTID0gdGFnU2V0KCdzY3JpcHQsc3R5bGUsdGVtcGxhdGUnKTsKLyoqCiAqIFNhbml0aXppbmdIdG1sU2VyaWFsaXplciBzZXJpYWxpemVzIGEgRE9NIGZyYWdtZW50LCBzdHJpcHBpbmcgb3V0IGFueSB1bnNhZmUgZWxlbWVudHMgYW5kIHVuc2FmZQogKiBhdHRyaWJ1dGVzLgogKi8KY2xhc3MgU2FuaXRpemluZ0h0bWxTZXJpYWxpemVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8vIEV4cGxpY2l0bHkgdHJhY2sgaWYgc29tZXRoaW5nIHdhcyBzdHJpcHBlZCwgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHdhcm5pbmcgb2Ygc2FuaXRpemF0aW9uIGp1c3QKICAgICAgICAvLyBiZWNhdXNlIGNoYXJhY3RlcnMgd2VyZSByZS1lbmNvZGVkLgogICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5idWYgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2FuaXRpemVDaGlsZHJlbihlbCkgewogICAgICAgIC8vIFRoaXMgY2Fubm90IHVzZSBhIFRyZWVXYWxrZXIsIGFzIGl0IGhhcyB0byBydW4gb24gQW5ndWxhcidzIHZhcmlvdXMgRE9NIGFkYXB0ZXJzLgogICAgICAgIC8vIEhvd2V2ZXIgdGhpcyBjb2RlIG5ldmVyIGFjY2Vzc2VzIHByb3BlcnRpZXMgb2ZmIG9mIGBkb2N1bWVudGAgYmVmb3JlIGRlbGV0aW5nIGl0cyBjb250ZW50cwogICAgICAgIC8vIGFnYWluLCBzbyBpdCBzaG91bGRuJ3QgYmUgdnVsbmVyYWJsZSB0byBET00gY2xvYmJlcmluZy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWwuZmlyc3RDaGlsZCkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdHJhdmVyc2VDb250ZW50ID0gdHJ1ZTsKICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICBpZiAoY3VycmVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgIHRyYXZlcnNlQ29udGVudCA9IHRoaXMuc3RhcnRFbGVtZW50KCgvKiogQHR5cGUgez99ICovIChjdXJyZW50KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNoYXJzKCgvKiogQHR5cGUgez99ICovIChjdXJyZW50Lm5vZGVWYWx1ZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFN0cmlwIG5vbi1lbGVtZW50LCBub24tdGV4dCBub2Rlcy4KICAgICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHJhdmVyc2VDb250ZW50ICYmIGN1cnJlbnQuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgY3VycmVudCA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50LmZpcnN0Q2hpbGQpKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIHRoZSBlbGVtZW50LiBXYWxrIHVwIGFuZCB0byB0aGUgcmlnaHQsIGNsb3NpbmcgdGFncyBhcyB3ZSBnby4KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Lm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kRWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gdGhpcy5jaGVja0Nsb2JiZXJlZEVsZW1lbnQoY3VycmVudCwgKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQubmV4dFNpYmxpbmcpKSk7CiAgICAgICAgICAgICAgICBpZiAobmV4dCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuY2hlY2tDbG9iYmVyZWRFbGVtZW50KGN1cnJlbnQsICgvKiogQHR5cGUgez99ICovIChjdXJyZW50LnBhcmVudE5vZGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLmpvaW4oJycpOwogICAgfQogICAgLyoqCiAgICAgKiBTYW5pdGl6ZXMgYW4gb3BlbmluZyBlbGVtZW50IHRhZyAoaWYgdmFsaWQpIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIGVsZW1lbnQncyBjb250ZW50cyBzaG91bGQKICAgICAqIGJlIHRyYXZlcnNlZC4gRWxlbWVudCBjb250ZW50IG11c3QgYWx3YXlzIGJlIHRyYXZlcnNlZCAoZXZlbiBpZiB0aGUgZWxlbWVudCBpdHNlbGYgaXMgbm90CiAgICAgKiB2YWxpZC9zYWZlKSwgdW5sZXNzIHRoZSBlbGVtZW50IGlzIG9uZSBvZiBgU0tJUF9UUkFWRVJTSU5HX0NPTlRFTlRfSUZfSU5WQUxJRF9FTEVNRU5UU2AuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCB0byBzYW5pdGl6ZS4KICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGVsZW1lbnQncyBjb250ZW50cyBzaG91bGQgYmUgdHJhdmVyc2VkLgogICAgICovCiAgICBzdGFydEVsZW1lbnQoZWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmICghVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkpIHsKICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gIVNLSVBfVFJBVkVSU0lOR19DT05URU5UX0lGX0lOVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYnVmLnB1c2goJzwnKTsKICAgICAgICB0aGlzLmJ1Zi5wdXNoKHRhZ05hbWUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbEF0dHJzID0gZWxlbWVudC5hdHRyaWJ1dGVzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsQXR0ciA9IGVsQXR0cnMuaXRlbShpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChlbEF0dHIpKS5uYW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxvd2VyID0gYXR0ck5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKCFWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlcikpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsQXR0cikpLnZhbHVlOwogICAgICAgICAgICAvLyBUT0RPKG1hcnRpbnByb2JzdCk6IFNwZWNpYWwgY2FzZSBpbWFnZSBVUklzIGZvciBkYXRhOmltYWdlLy4uLgogICAgICAgICAgICBpZiAoVVJJX0FUVFJTW2xvd2VyXSkKICAgICAgICAgICAgICAgIHZhbHVlID0gX3Nhbml0aXplVXJsKHZhbHVlKTsKICAgICAgICAgICAgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlcl0pCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNhbml0aXplU3Jjc2V0KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5idWYucHVzaCgnICcsIGF0dHJOYW1lLCAnPSInLCBlbmNvZGVFbnRpdGllcyh2YWx1ZSksICciJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW5kRWxlbWVudChjdXJyZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhZ05hbWUgPSBjdXJyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKFZBTElEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpICYmICFWT0lEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJzwvJyk7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2godGFnTmFtZSk7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGFycyhjaGFycykgewogICAgICAgIHRoaXMuYnVmLnB1c2goZW5jb2RlRW50aXRpZXMoY2hhcnMpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcGFyYW0gez99IG5leHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVja0Nsb2JiZXJlZEVsZW1lbnQobm9kZSwgbmV4dE5vZGUpIHsKICAgICAgICBpZiAobmV4dE5vZGUgJiYKICAgICAgICAgICAgKG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dE5vZGUpICYKICAgICAgICAgICAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogJHsoKC8qKiBAdHlwZSB7P30gKi8gKG5vZGUpKSkub3V0ZXJIVE1MfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV4dE5vZGU7CiAgICB9Cn0KLy8gUmVndWxhciBFeHByZXNzaW9ucyBmb3IgcGFyc2luZyB0YWdzIGFuZCBhdHRyaWJ1dGVzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1VSUk9HQVRFX1BBSVJfUkVHRVhQID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nOwovLyAhIHRvIH4gaXMgdGhlIEFTQ0lJIHJhbmdlLgovKiogQHR5cGUgez99ICovCmNvbnN0IE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQID0gLyhbXlwjLX4gfCFdKS9nOwovKioKICogRXNjYXBlcyBhbGwgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMsIHNvIHRoYXQgdGhlCiAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcgogKiBlbGVtZW50IHRleHQuCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGVuY29kZUVudGl0aWVzKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgIC5yZXBsYWNlKFNVUlJPR0FURV9QQUlSX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1hdGNoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhpID0gbWF0Y2guY2hhckNvZGVBdCgwKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG93ID0gbWF0Y2guY2hhckNvZGVBdCgxKTsKICAgICAgICByZXR1cm4gJyYjJyArICgoKGhpIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMCkgKyAnOyc7CiAgICB9KSkKICAgICAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1hdGNoKSB7CiAgICAgICAgcmV0dXJuICcmIycgKyBtYXRjaC5jaGFyQ29kZUF0KDApICsgJzsnOwogICAgfSkpCiAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKQogICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgaW5lcnRCb2R5SGVscGVyOwovKioKICogU2FuaXRpemVzIHRoZSBnaXZlbiB1bnNhZmUsIHVudHJ1c3RlZCBIVE1MIGZyYWdtZW50LCBhbmQgcmV0dXJucyBIVE1MIHRleHQgdGhhdCBpcyBzYWZlIHRvIGFkZCB0bwogKiB0aGUgRE9NIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC4KICogQHBhcmFtIHs/fSBkZWZhdWx0RG9jCiAqIEBwYXJhbSB7P30gdW5zYWZlSHRtbElucHV0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc2FuaXRpemVIdG1sKGRlZmF1bHREb2MsIHVuc2FmZUh0bWxJbnB1dCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGluZXJ0Qm9keUVsZW1lbnQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgICBpbmVydEJvZHlIZWxwZXIgPSBpbmVydEJvZHlIZWxwZXIgfHwgbmV3IEluZXJ0Qm9keUhlbHBlcihkZWZhdWx0RG9jKTsKICAgICAgICAvLyBNYWtlIHN1cmUgdW5zYWZlSHRtbCBpcyBhY3R1YWxseSBhIHN0cmluZyAoVHlwZVNjcmlwdCB0eXBlcyBhcmUgbm90IGVuZm9yY2VkIGF0IHJ1bnRpbWUpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdW5zYWZlSHRtbCA9IHVuc2FmZUh0bWxJbnB1dCA/IFN0cmluZyh1bnNhZmVIdG1sSW5wdXQpIDogJyc7CiAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgICAgIC8vIG1YU1MgcHJvdGVjdGlvbi4gUmVwZWF0ZWRseSBwYXJzZSB0aGUgZG9jdW1lbnQgdG8gbWFrZSBzdXJlIGl0IHN0YWJpbGl6ZXMsIHNvIHRoYXQgYSBicm93c2VyCiAgICAgICAgLy8gdHJ5aW5nIHRvIGF1dG8tY29ycmVjdCBpbmNvcnJlY3QgSFRNTCBjYW5ub3QgY2F1c2UgZm9ybWVybHkgaW5lcnQgSFRNTCB0byBiZWNvbWUgZGFuZ2Vyb3VzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbVhTU0F0dGVtcHRzID0gNTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcnNlZEh0bWwgPSB1bnNhZmVIdG1sOwogICAgICAgIGRvIHsKICAgICAgICAgICAgaWYgKG1YU1NBdHRlbXB0cyA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBpbnB1dCBpcyB1bnN0YWJsZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1YU1NBdHRlbXB0cy0tOwogICAgICAgICAgICB1bnNhZmVIdG1sID0gcGFyc2VkSHRtbDsKICAgICAgICAgICAgcGFyc2VkSHRtbCA9ICgvKiogQHR5cGUgez99ICovIChpbmVydEJvZHlFbGVtZW50KSkuaW5uZXJIVE1MOwogICAgICAgICAgICBpbmVydEJvZHlFbGVtZW50ID0gaW5lcnRCb2R5SGVscGVyLmdldEluZXJ0Qm9keUVsZW1lbnQodW5zYWZlSHRtbCk7CiAgICAgICAgfSB3aGlsZSAodW5zYWZlSHRtbCAhPT0gcGFyc2VkSHRtbCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNhbml0aXplciA9IG5ldyBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FmZUh0bWwgPSBzYW5pdGl6ZXIuc2FuaXRpemVDaGlsZHJlbigoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0VGVtcGxhdGVDb250ZW50KCgvKiogQHR5cGUgez99ICovIChpbmVydEJvZHlFbGVtZW50KSkpKSkgfHwgaW5lcnRCb2R5RWxlbWVudCk7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIHNhbml0aXplci5zYW5pdGl6ZWRTb21ldGhpbmcpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzYWZlSHRtbDsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIC8vIEluIGNhc2UgYW55dGhpbmcgZ29lcyB3cm9uZywgY2xlYXIgb3V0IGluZXJ0RWxlbWVudCB0byByZXNldCB0aGUgZW50aXJlIERPTSBzdHJ1Y3R1cmUuCiAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRUZW1wbGF0ZUNvbnRlbnQoaW5lcnRCb2R5RWxlbWVudCkgfHwgaW5lcnRCb2R5RWxlbWVudDsKICAgICAgICAgICAgd2hpbGUgKHBhcmVudC5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGVsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUZW1wbGF0ZUNvbnRlbnQoZWwpIHsKICAgIHJldHVybiAnY29udGVudCcgaW4gKCgvKiogQHR5cGUgez99ICovIChlbCkpKSAmJiBpc1RlbXBsYXRlRWxlbWVudChlbCkgPwogICAgICAgIGVsLmNvbnRlbnQgOgogICAgICAgIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzVGVtcGxhdGVFbGVtZW50KGVsKSB7CiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLm5vZGVOYW1lID09PSAnVEVNUExBVEUnOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vc2VjdXJpdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgU2VjdXJpdHlDb250ZXh0ID0gewogICAgTk9ORTogMCwKICAgIEhUTUw6IDEsCiAgICBTVFlMRTogMiwKICAgIFNDUklQVDogMywKICAgIFVSTDogNCwKICAgIFJFU09VUkNFX1VSTDogNSwKfTsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5OT05FXSA9ICdOT05FJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5IVE1MXSA9ICdIVE1MJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TVFlMRV0gPSAnU1RZTEUnOwpTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LlNDUklQVF0gPSAnU0NSSVBUJzsKU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5VUkxdID0gJ1VSTCc7ClNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMXSA9ICdSRVNPVVJDRV9VUkwnOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmVndWxhciBleHByZXNzaW9uIGZvciBzYWZlIHN0eWxlIHZhbHVlcy4KICoKICogUXVvdGVzICgiIGFuZCAnKSBhcmUgYWxsb3dlZCwgYnV0IGEgY2hlY2sgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSB0byBlbnN1cmUgdGhleSdyZSBiYWxhbmNlZC4KICoKICogJywnIGFsbG93cyBtdWx0aXBsZSB2YWx1ZXMgdG8gYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcHJvcGVydHkgKGUuZy4gYmFja2dyb3VuZC1hdHRhY2htZW50IG9yCiAqIGZvbnQtZmFtaWx5KSBhbmQgaGVuY2UgY291bGQgYWxsb3cgbXVsdGlwbGUgdmFsdWVzIHRvIGdldCBpbmplY3RlZCwgYnV0IHRoYXQgc2hvdWxkIHBvc2Ugbm8gcmlzawogKiBvZiBYU1MuCiAqCiAqIFRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGNoZWNrcyBvbmx5IGZvciBYU1Mgc2FmZXR5LCBub3QgZm9yIENTUyB2YWxpZGl0eS4KICoKICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnksIGFuZCBhdWdtZW50ZWQgZm9yCiAqIHRyYW5zZm9ybWF0aW9uIHZhbHVlcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBWQUxVRVMgPSAnWy0sLiJcJyVfISMgYS16QS1aMC05XSsnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRSQU5TRk9STUFUSU9OX0ZOUyA9ICcoPzptYXRyaXh8dHJhbnNsYXRlfHNjYWxlfHJvdGF0ZXxza2V3fHBlcnNwZWN0aXZlKSg/Olh8WXxafDNkKT8nOwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTE9SX0ZOUyA9ICcoPzpyZ2J8aHNsKWE/JzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBHUkFESUVOVFMgPSAnKD86cmVwZWF0aW5nLSk/KD86bGluZWFyfHJhZGlhbCktZ3JhZGllbnQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IENTUzNfRk5TID0gJyg/OmF0dHJ8Y2FsY3x2YXIpJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBGTl9BUkdTID0gJ1xcKFstMC05LiUsICNhLXpBLVpdK1xcKSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU0FGRV9TVFlMRV9WQUxVRSA9IG5ldyBSZWdFeHAoYF4oJHtWQUxVRVN9fGAgKwogICAgYCg/OiR7VFJBTlNGT1JNQVRJT05fRk5TfXwke0NPTE9SX0ZOU318JHtHUkFESUVOVFN9fCR7Q1NTM19GTlN9KWAgKwogICAgYCR7Rk5fQVJHU30pJGAsICdnJyk7Ci8qKgogKiBNYXRjaGVzIGEgYHVybCguLi4pYCB2YWx1ZSB3aXRoIGFuIGFyYml0cmFyeSBhcmd1bWVudCBhcyBsb25nIGFzIGl0IGRvZXMKICogbm90IGNvbnRhaW4gcGFyZW50aGVzZXMuCiAqCiAqIFRoZSBVUkwgdmFsdWUgc3RpbGwgbmVlZHMgdG8gYmUgc2FuaXRpemVkIHNlcGFyYXRlbHkuCiAqCiAqIGB1cmwoLi4uKWAgdmFsdWVzIGFyZSBhIHZlcnkgY29tbW9uIHVzZSBjYXNlLCBlLmcuIGZvciBgYmFja2dyb3VuZC1pbWFnZWAuIFdpdGggY2FyZWZ1bGx5IGNyYWZ0ZWQKICogQ1NTIHN0eWxlIHJ1bGVzLCBpdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYW4gaW5mb3JtYXRpb24gbGVhayB3aXRoIGB1cmxgIHZhbHVlcyBpbiBDU1MsIGUuZy4KICogYnkgb2JzZXJ2aW5nIHdoZXRoZXIgc2Nyb2xsIGJhcnMgYXJlIGRpc3BsYXllZCwgb3IgY2hhcmFjdGVyIHJhbmdlcyB1c2VkIGJ5IGEgZm9udCBmYWNlCiAqIGRlZmluaXRpb24uCiAqCiAqIEFuZ3VsYXIgb25seSBhbGxvd3MgYmluZGluZyBDU1MgdmFsdWVzIChhcyBvcHBvc2VkIHRvIGVudGlyZSBDU1MgcnVsZXMpLCBzbyBpdCBpcyB1bmxpa2VseSB0aGF0CiAqIGJpbmRpbmcgYSBVUkwgdmFsdWUgd2l0aG91dCBmdXJ0aGVyIGNvb3BlcmF0aW9uIGZyb20gdGhlIHBhZ2Ugd2lsbCBjYXVzZSBhbiBpbmZvcm1hdGlvbiBsZWFrLCBhbmQKICogaWYgc28sIGl0IGlzIGp1c3QgYSBsZWFrLCBub3QgYSBmdWxsIGJsb3duIFhTUyB2dWxuZXJhYmlsaXR5LgogKgogKiBHaXZlbiB0aGUgY29tbW9uIHVzZSBjYXNlLCBsb3cgbGlrZWxpaG9vZCBvZiBhdHRhY2sgdmVjdG9yLCBhbmQgbG93IGltcGFjdCBvZiBhbiBhdHRhY2ssIHRoaXMKICogY29kZSBpcyBwZXJtaXNzaXZlIGFuZCBhbGxvd3MgVVJMcyB0aGF0IHNhbml0aXplIG90aGVyd2lzZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBVUkxfUkUgPSAvXnVybFwoKFteKV0rKVwpJC87Ci8qKgogKiBDaGVja3MgdGhhdCBxdW90ZXMgKCIgYW5kICcpIGFyZSBwcm9wZXJseSBiYWxhbmNlZCBpbnNpZGUgYSBzdHJpbmcuIEFzc3VtZXMKICogdGhhdCBuZWl0aGVyIGVzY2FwZSAoXCkgbm9yIGFueSBvdGhlciBjaGFyYWN0ZXIgdGhhdCBjb3VsZCByZXN1bHQgaW4KICogYnJlYWtpbmcgb3V0IG9mIGEgc3RyaW5nIHBhcnNpbmcgY29udGV4dCBhcmUgYWxsb3dlZDsKICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNzdHJpbmctdG9rZW4tZGlhZ3JhbS4KICoKICogVGhpcyBjb2RlIHdhcyB0YWtlbiBmcm9tIHRoZSBDbG9zdXJlIHNhbml0aXphdGlvbiBsaWJyYXJ5LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNCYWxhbmNlZFF1b3Rlcyh2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG91dHNpZGVTaW5nbGUgPSB0cnVlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG91dHNpZGVEb3VibGUgPSB0cnVlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjID0gdmFsdWUuY2hhckF0KGkpOwogICAgICAgIGlmIChjID09PSAnXCcnICYmIG91dHNpZGVEb3VibGUpIHsKICAgICAgICAgICAgb3V0c2lkZVNpbmdsZSA9ICFvdXRzaWRlU2luZ2xlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09PSAnIicgJiYgb3V0c2lkZVNpbmdsZSkgewogICAgICAgICAgICBvdXRzaWRlRG91YmxlID0gIW91dHNpZGVEb3VibGU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHNpZGVTaW5nbGUgJiYgb3V0c2lkZURvdWJsZTsKfQovKioKICogU2FuaXRpemVzIHRoZSBnaXZlbiB1bnRydXN0ZWQgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlIChpLmUuIG5vdCBhbiBlbnRpcmUgb2JqZWN0LCBqdXN0IGEgc2luZ2xlCiAqIHZhbHVlKSBhbmQgcmV0dXJucyBhIHZhbHVlIHRoYXQgaXMgc2FmZSB0byB1c2UgaW4gYSBicm93c2VyIGVudmlyb25tZW50LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc2FuaXRpemVTdHlsZSh2YWx1ZSkgewogICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcuCiAgICBpZiAoIXZhbHVlKQogICAgICAgIHJldHVybiAnJzsKICAgIC8vIFNpbmdsZSB1cmwoLi4uKSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG9ubHkgZm9yIFVSTHMgdGhhdCBzYW5pdGl6ZSBjbGVhbmx5LiBTZWUgYWJvdmUgZm9yCiAgICAvLyByZWFzb25pbmcgYmVoaW5kIHRoaXMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cmxNYXRjaCA9IHZhbHVlLm1hdGNoKFVSTF9SRSk7CiAgICBpZiAoKHVybE1hdGNoICYmIF9zYW5pdGl6ZVVybCh1cmxNYXRjaFsxXSkgPT09IHVybE1hdGNoWzFdKSB8fAogICAgICAgIHZhbHVlLm1hdGNoKFNBRkVfU1RZTEVfVkFMVUUpICYmIGhhc0JhbGFuY2VkUXVvdGVzKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsgLy8gU2FmZSBzdHlsZSB2YWx1ZXMuCiAgICB9CiAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICBjb25zb2xlLndhcm4oYFdBUk5JTkc6IHNhbml0aXppbmcgdW5zYWZlIHN0eWxlIHZhbHVlICR7dmFsdWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS5gKTsKICAgIH0KICAgIHJldHVybiAndW5zYWZlJzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXphdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gYGh0bWxgIHNhbml0aXplciB3aGljaCBjb252ZXJ0cyB1bnRydXN0ZWQgYGh0bWxgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZwogKiBkYW5nZXJvdXMgY29udGVudC4KICoKICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgaHRtbGAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgdXJscyBhbmQKICogamF2YXNjcmlwdCkgYW5kIHJlbW92ZXMgaXQuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sfS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVIdG1sIHVudHJ1c3RlZCBgaHRtbGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgaHRtbGAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gZGlzcGxheSB0byB1c2VyLCBiZWNhdXNlIGFsbCBvZiB0aGUgZGFuZ2Vyb3VzIGphdmFzY3JpcHQKICogYW5kIHVybHMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAqCiAqLwpmdW5jdGlvbiDJtcm1c2FuaXRpemVIdG1sKHVuc2FmZUh0bWwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIHVuc2FmZUh0bWwpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlSHRtbCwgIkhUTUwiIC8qIEh0bWwgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVIdG1sKTsKICAgIH0KICAgIHJldHVybiBfc2FuaXRpemVIdG1sKGdldERvY3VtZW50KCksIHJlbmRlclN0cmluZ2lmeSh1bnNhZmVIdG1sKSk7Cn0KLyoqCiAqIEEgYHN0eWxlYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGBzdHlsZWAgKipzdHJpbmcqKiBpbnRvIHRydXN0ZWQgc3RyaW5nIGJ5IHJlbW92aW5nCiAqIGRhbmdlcm91cyBjb250ZW50LgogKgogKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGBzdHlsZWAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgdXJscyBhbmQKICogamF2YXNjcmlwdCkgYW5kIHJlbW92ZXMgaXQuCiAqCiAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZX0uCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gdW5zYWZlU3R5bGUgdW50cnVzdGVkIGBzdHlsZWAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgc3R5bGVgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGBzdHlsZWAgcHJvcGVydGllcywgYmVjYXVzZSBhbGwgb2YgdGhlCiAqIGRhbmdlcm91cyBqYXZhc2NyaXB0IGFuZCB1cmxzIGhhdmUgYmVlbiByZW1vdmVkLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplU3R5bGUodW5zYWZlU3R5bGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlNUWUxFLCB1bnNhZmVTdHlsZSkgfHwgJyc7CiAgICB9CiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh1bnNhZmVTdHlsZSwgIlN0eWxlIiAvKiBTdHlsZSAqLykpIHsKICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVN0eWxlKTsKICAgIH0KICAgIHJldHVybiBfc2FuaXRpemVTdHlsZShyZW5kZXJTdHJpbmdpZnkodW5zYWZlU3R5bGUpKTsKfQovKioKICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGB1cmxgICoqc3RyaW5nKiogaW50byB0cnVzdGVkIHN0cmluZyBieSByZW1vdmluZwogKiBkYW5nZXJvdXMKICogY29udGVudC4KICoKICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgdXJsYCBhbmQgbG9jYXRlcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY29udGVudCAoc3VjaCBhcyBqYXZhc2NyaXB0KSBhbmQKICogcmVtb3ZlcyBpdC4KICoKICogSXQgaXMgcG9zc2libGUgdG8gbWFyayBhIHN0cmluZyBhcyB0cnVzdGVkIGJ5IGNhbGxpbmcge1xAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybH0uCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gdW5zYWZlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuCiAqIEByZXR1cm4gez99IGB1cmxgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGBzcmNgIHByb3BlcnRpZXMgc3VjaCBhcyBgPGltZyBzcmM+YCwgYmVjYXVzZQogKiBhbGwgb2YgdGhlIGRhbmdlcm91cyBqYXZhc2NyaXB0IGhhcyBiZWVuIHJlbW92ZWQuCiAqCiAqLwpmdW5jdGlvbiDJtcm1c2FuaXRpemVVcmwodW5zYWZlVXJsKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzYW5pdGl6ZXIgPSBnZXRTYW5pdGl6ZXIoKTsKICAgIGlmIChzYW5pdGl6ZXIpIHsKICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5VUkwsIHVuc2FmZVVybCkgfHwgJyc7CiAgICB9CiAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh1bnNhZmVVcmwsICJVUkwiIC8qIFVybCAqLykpIHsKICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVVybCk7CiAgICB9CiAgICByZXR1cm4gX3Nhbml0aXplVXJsKHJlbmRlclN0cmluZ2lmeSh1bnNhZmVVcmwpKTsKfQovKioKICogQSBgdXJsYCBzYW5pdGl6ZXIgd2hpY2ggb25seSBsZXRzIHRydXN0ZWQgYHVybGBzIHRocm91Z2guCiAqCiAqIFRoaXMgcGFzc2VzIG9ubHkgYHVybGBzIG1hcmtlZCB0cnVzdGVkIGJ5IGNhbGxpbmcge1xAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFJlc291cmNlVXJsfS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVSZXNvdXJjZVVybCB1bnRydXN0ZWQgYHVybGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcmV0dXJuIHs/fSBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgc3JjYCBwcm9wZXJ0aWVzIHN1Y2ggYXMgYDxpbWcgc3JjPmAsIGJlY2F1c2UKICogb25seSB0cnVzdGVkIGB1cmxgcyBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplUmVzb3VyY2VVcmwodW5zYWZlUmVzb3VyY2VVcmwpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgaWYgKHNhbml0aXplcikgewogICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdW5zYWZlUmVzb3VyY2VVcmwpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlUmVzb3VyY2VVcmwsICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVSZXNvdXJjZVVybCk7CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpJyk7Cn0KLyoqCiAqIEEgYHNjcmlwdGAgc2FuaXRpemVyIHdoaWNoIG9ubHkgbGV0cyB0cnVzdGVkIGphdmFzY3JpcHQgdGhyb3VnaC4KICoKICogVGhpcyBwYXNzZXMgb25seSBgc2NyaXB0YHMgbWFya2VkIHRydXN0ZWQgYnkgY2FsbGluZyB7XEBsaW5rCiAqIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0fS4KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB1bnNhZmVTY3JpcHQgdW50cnVzdGVkIGBzY3JpcHRgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci4KICogQHJldHVybiB7P30gYHVybGAgc3RyaW5nIHdoaWNoIGlzIHNhZmUgdG8gYmluZCB0byB0aGUgYDxzY3JpcHQ+YCBlbGVtZW50IHN1Y2ggYXMgYDxpbWcgc3JjPmAsCiAqIGJlY2F1c2Ugb25seSB0cnVzdGVkIGBzY3JpcHRzYCBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplU2NyaXB0KHVuc2FmZVNjcmlwdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7CiAgICBpZiAoc2FuaXRpemVyKSB7CiAgICAgICAgcmV0dXJuIHNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuU0NSSVBULCB1bnNhZmVTY3JpcHQpIHx8ICcnOwogICAgfQogICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlU2NyaXB0LCAiU2NyaXB0IiAvKiBTY3JpcHQgKi8pKSB7CiAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVTY3JpcHQpOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Jyk7Cn0KLyoqCiAqIERldGVjdHMgd2hpY2ggc2FuaXRpemVyIHRvIHVzZSBmb3IgVVJMIHByb3BlcnR5LCBiYXNlZCBvbiB0YWcgbmFtZSBhbmQgcHJvcCBuYW1lLgogKgogKiBUaGUgcnVsZXMgYXJlIGJhc2VkIG9uIHRoZSBSRVNPVVJDRV9VUkwgY29udGV4dCBjb25maWcgZnJvbQogKiBgcGFja2FnZXMvY29tcGlsZXIvc3JjL3NjaGVtYS9kb21fc2VjdXJpdHlfc2NoZW1hLnRzYC4KICogSWYgdGFnIGFuZCBwcm9wIG5hbWVzIGRvbid0IG1hdGNoIFJlc291cmNlIFVSTCBzY2hlbWEsIHVzZSBVUkwgc2FuaXRpemVyLgogKiBAcGFyYW0gez99IHRhZwogKiBAcGFyYW0gez99IHByb3AKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFVybFNhbml0aXplcih0YWcsIHByb3ApIHsKICAgIGlmICgocHJvcCA9PT0gJ3NyYycgJiYKICAgICAgICAodGFnID09PSAnZW1iZWQnIHx8IHRhZyA9PT0gJ2ZyYW1lJyB8fCB0YWcgPT09ICdpZnJhbWUnIHx8IHRhZyA9PT0gJ21lZGlhJyB8fAogICAgICAgICAgICB0YWcgPT09ICdzY3JpcHQnKSkgfHwKICAgICAgICAocHJvcCA9PT0gJ2hyZWYnICYmICh0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdsaW5rJykpKSB7CiAgICAgICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsOwogICAgfQogICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVVybDsKfQovKioKICogU2FuaXRpemVzIFVSTCwgc2VsZWN0aW5nIHNhbml0aXplciBmdW5jdGlvbiBiYXNlZCBvbiB0YWcgYW5kIHByb3BlcnR5IG5hbWVzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gY2FzZSB3ZSBjYW4ndCBkZWZpbmUgc2VjdXJpdHkgY29udGV4dCBhdCBjb21waWxlIHRpbWUsIHdoZW4gb25seSBwcm9wCiAqIG5hbWUgaXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBnZW5lcmF0ZSBob3N0IGJpbmRpbmdzIGZvciBEaXJlY3RpdmVzL0NvbXBvbmVudHMuIFRoZQogKiBob3N0IGVsZW1lbnQgaXMgdW5rbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIGRlZmVyIGNhbGN1bGF0aW9uIG9mIHNwZWNpZmljIHNhbml0aXplciB0bwogKiBydW50aW1lLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHVuc2FmZVVybCB1bnRydXN0ZWQgYHVybGAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogKiBAcGFyYW0gez99IHRhZyB0YXJnZXQgZWxlbWVudCB0YWcgbmFtZS4KICogQHBhcmFtIHs/fSBwcm9wIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlLgogKiBAcmV0dXJuIHs/fSBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kLgogKgogKi8KZnVuY3Rpb24gybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCh1bnNhZmVVcmwsIHRhZywgcHJvcCkgewogICAgcmV0dXJuIGdldFVybFNhbml0aXplcih0YWcsIHByb3ApKHVuc2FmZVVybCk7Cn0KLyoqCiAqIFRoZSBkZWZhdWx0IHN0eWxlIHNhbml0aXplciB3aWxsIGhhbmRsZSBzYW5pdGl6YXRpb24gZm9yIHN0eWxlIHByb3BlcnRpZXMgYnkKICogc2FuaXRpemluZyBhbnkgQ1NTIHByb3BlcnR5IHRoYXQgY2FuIGluY2x1ZGUgYSBgdXJsYCB2YWx1ZSAodXN1YWxseSBpbWFnZS1iYXNlZCBwcm9wZXJ0aWVzKQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIgPSAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKioKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/PX0gbW9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKHByb3AsIHZhbHVlLCBtb2RlKSB7CiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBtb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZhY3QgdGhhdCBgU3R5bGVTYW5pdGl6ZUZuYCBzaG91bGQgbm90IGV4aXN0IG9uY2UgUFIjMzQ0ODAKICAgICAgICAvLyBsYW5kcy4gRm9yIG5vdyB0aGUgYFN0eWxlU2FuaXRpemVGbmAgYW5kIHNob3VsZCBhY3QgbGlrZSBgKHZhbHVlOiBhbnkpID0+IHN0cmluZ2AgYXMgYQogICAgICAgIC8vIHdvcmsgYXJvdW5kLgogICAgICAgIHJldHVybiDJtcm1c2FuaXRpemVTdHlsZShwcm9wKTsKICAgIH0KICAgIG1vZGUgPSBtb2RlIHx8IDMgLyogVmFsaWRhdGVBbmRTYW5pdGl6ZSAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkb1Nhbml0aXplVmFsdWUgPSB0cnVlOwogICAgaWYgKG1vZGUgJiAxIC8qIFZhbGlkYXRlUHJvcGVydHkgKi8pIHsKICAgICAgICBkb1Nhbml0aXplVmFsdWUgPSBzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihwcm9wKTsKICAgIH0KICAgIGlmIChtb2RlICYgMiAvKiBTYW5pdGl6ZU9ubHkgKi8pIHsKICAgICAgICByZXR1cm4gZG9TYW5pdGl6ZVZhbHVlID8gybXJtXNhbml0aXplU3R5bGUodmFsdWUpIDogdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBkb1Nhbml0aXplVmFsdWU7CiAgICB9Cn0pKSkpOwovKioKICogQHBhcmFtIHs/fSBwcm9wCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihwcm9wKSB7CiAgICByZXR1cm4gcHJvcCA9PT0gJ2JhY2tncm91bmQtaW1hZ2UnIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kSW1hZ2UnIHx8IHByb3AgPT09ICdiYWNrZ3JvdW5kJyB8fAogICAgICAgIHByb3AgPT09ICdib3JkZXItaW1hZ2UnIHx8IHByb3AgPT09ICdib3JkZXJJbWFnZScgfHwgcHJvcCA9PT0gJ2JvcmRlci1pbWFnZS1zb3VyY2UnIHx8CiAgICAgICAgcHJvcCA9PT0gJ2JvcmRlckltYWdlU291cmNlJyB8fCBwcm9wID09PSAnZmlsdGVyJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZScgfHwKICAgICAgICBwcm9wID09PSAnbGlzdFN0eWxlJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZS1pbWFnZScgfHwgcHJvcCA9PT0gJ2xpc3RTdHlsZUltYWdlJyB8fAogICAgICAgIHByb3AgPT09ICdjbGlwLXBhdGgnIHx8IHByb3AgPT09ICdjbGlwUGF0aCc7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmFsaWRhdGVBZ2FpbnN0RXZlbnRQcm9wZXJ0aWVzKG5hbWUpIHsKICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb24nKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtc2cgPSBgQmluZGluZyB0byBldmVudCBwcm9wZXJ0eSAnJHtuYW1lfScgaXMgZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucywgYCArCiAgICAgICAgICAgIGBwbGVhc2UgdXNlICgke25hbWUuc2xpY2UoMil9KT0uLi5gICsKICAgICAgICAgICAgYFxuSWYgJyR7bmFtZX0nIGlzIGEgZGlyZWN0aXZlIGlucHV0LCBtYWtlIHN1cmUgdGhlIGRpcmVjdGl2ZSBpcyBpbXBvcnRlZCBieSB0aGVgICsKICAgICAgICAgICAgYCBjdXJyZW50IG1vZHVsZS5gOwogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHZhbGlkYXRlQWdhaW5zdEV2ZW50QXR0cmlidXRlcyhuYW1lKSB7CiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ29uJykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbXNnID0gYEJpbmRpbmcgdG8gZXZlbnQgYXR0cmlidXRlICcke25hbWV9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBgICsKICAgICAgICAgICAgYHBsZWFzZSB1c2UgKCR7bmFtZS5zbGljZSgyKX0pPS4uLmA7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICB9Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRTYW5pdGl6ZXIoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICByZXR1cm4gbFZpZXcgJiYgbFZpZXdbU0FOSVRJWkVSXTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogVEhJUyBGSUxFIENPTlRBSU5TIENPREUgV0hJQ0ggU0hPVUxEIEJFIFRSRUUgU0hBS0VOIEFORCBORVZFUiBDQUxMRUQgRlJPTSBQUk9EVUNUSU9OIENPREUhISEKICovCi8qKgogKiBDcmVhdGVzIGFuIGBBcnJheWAgY29uc3RydWN0aW9uIHdpdGggYSBnaXZlbiBuYW1lLiBUaGlzIGlzIHVzZWZ1bCB3aGVuCiAqIGxvb2tpbmcgZm9yIG1lbW9yeSBjb25zdW1wdGlvbiB0byBzZWUgd2hhdCB0aW1lIG9mIGFycmF5IGl0IGlzLgogKgogKgogKiBAcGFyYW0gbmFtZSBOYW1lIHRvIGdpdmUgdG8gdGhlIGNvbnN0cnVjdG9yCiAqIEByZXR1cm5zIEEgc3ViY2xhc3Mgb2YgYEFycmF5YCBpZiBwb3NzaWJsZS4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluCiAqICAgICAgICAgIGVudmlyb25tZW50cyB3aGljaCBzdXBwb3J0IGBjbGFzc2AgY29uc3RydWN0LgogKi8KZnVuY3Rpb24gY3JlYXRlTmFtZWRBcnJheVR5cGUobmFtZSkgewogICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGluIHByb2QgbW9kZSwgc28gbGV0J3MgdmVyaWZ5IHRoYXQgaXMgdGhlIGNhc2UuCiAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyBpdCB0aGlzIHdheSBzbyB0aGF0IFR5cGVTY3JpcHQgZG9lcyBub3QgZG93bi1sZXZlbCB0aGUgYmVsb3cgY29kZS4KICAgICAgICAgICAgY29uc3QgRnVuY3Rpb25Db25zdHJ1Y3RvciA9IGNyZWF0ZU5hbWVkQXJyYXlUeXBlLmNvbnN0cnVjdG9yOwogICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbkNvbnN0cnVjdG9yKCdBcnJheScsIGByZXR1cm4gY2xhc3MgJHtuYW1lfSBleHRlbmRzIEFycmF5e31gKSkoQXJyYXkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAvLyBJZiBpdCBkb2VzIG5vdCB3b3JrIGp1c3QgZ2l2ZSB1cCBhbmQgZmFsbCBiYWNrIHRvIHJlZ3VsYXIgQXJyYXkuCiAgICAgICAgICAgIHJldHVybiBBcnJheTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvb2tzIGxpa2Ugd2UgYXJlIGluIFwncHJvZCBtb2RlXCcsIGJ1dCB3ZSBhcmUgY3JlYXRpbmcgYSBuYW1lZCBBcnJheSB0eXBlLCB3aGljaCBpcyB3cm9uZyEgQ2hlY2sgeW91ciBjb2RlJyk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KZnVuY3Rpb24gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShuYW1lKSB7CiAgICAvLyBBdHRyaWJ1dGUgbmFtZXMgd2l0aCBgJGAgKGVnIGB4LXkkYCkgYXJlIHZhbGlkIHBlciBzcGVjLCBidXQgdW5zdXBwb3J0ZWQgYnkgc29tZSBicm93c2VycwogICAgbmFtZSA9IGNhbWVsQ2FzZVRvRGFzaENhc2UobmFtZS5yZXBsYWNlKC9bJEBdL2csICdfJykpOwogICAgcmV0dXJuIGBuZy1yZWZsZWN0LSR7bmFtZX1gOwp9CmNvbnN0IENBTUVMX0NBU0VfUkVHRVhQID0gLyhbQS1aXSkvZzsKZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dCkgewogICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoQ0FNRUxfQ0FTRV9SRUdFWFAsICguLi5tKSA9PiAnLScgKyBtWzFdLnRvTG93ZXJDYXNlKCkpOwp9CmZ1bmN0aW9uIG5vcm1hbGl6ZURlYnVnQmluZGluZ1ZhbHVlKHZhbHVlKSB7CiAgICB0cnkgewogICAgICAgIC8vIExpbWl0IHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBhcyBvdGhlcndpc2UgdGhlIERPTSBqdXN0IGdldHMgcG9sbHV0ZWQuCiAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpLnNsaWNlKDAsIDMwKSA6IHZhbHVlOwogICAgfQogICAgY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gJ1tFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlJzsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9jb250ZXh0X2Rpc2NvdmVyeS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgYExDb250ZXh0YCBkYXRhIGZvciBhIGdpdmVuIERPTSBub2RlLCBkaXJlY3RpdmUgb3IgY29tcG9uZW50IGluc3RhbmNlLgogKgogKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZXhhbWluZSB0aGUgcHJvdmlkZWQgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCwgb3IgZGlyZWN0aXZlIGluc3RhbmNlXCdzCiAqIG1vbmtleS1wYXRjaGVkIHByb3BlcnR5IHRvIGRlcml2ZSB0aGUgYExDb250ZXh0YCBkYXRhLiBPbmNlIGNhbGxlZCB0aGVuIHRoZSBtb25rZXktcGF0Y2hlZAogKiB2YWx1ZSB3aWxsIGJlIHRoYXQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgYExDb250ZXh0YC4KICoKICogSWYgdGhlIG1vbmtleS1wYXRjaGVkIHZhbHVlIGlzIHRoZSBgTFZpZXdgIGluc3RhbmNlIHRoZW4gdGhlIGNvbnRleHQgdmFsdWUgZm9yIHRoYXQKICogdGFyZ2V0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIG1vbmtleS1wYXRjaCByZWZlcmVuY2Ugd2lsbCBiZSB1cGRhdGVkLiBUaGVyZWZvcmUgd2hlbiB0aGlzCiAqIGZ1bmN0aW9uIGlzIGNhbGxlZCBpdCBtYXkgbXV0YXRlIHRoZSBwcm92aWRlZCBlbGVtZW50XCdzLCBjb21wb25lbnRcJ3Mgb3IgYW55IG9mIHRoZSBhc3NvY2lhdGVkCiAqIGRpcmVjdGl2ZVwncyBtb25rZXktcGF0Y2ggdmFsdWVzLgogKgogKiBJZiB0aGUgbW9ua2V5LXBhdGNoIHZhbHVlIGlzIG5vdCBkZXRlY3RlZCB0aGVuIHRoZSBjb2RlIHdpbGwgd2FsayB1cCB0aGUgRE9NIHVudGlsIGFuIGVsZW1lbnQKICogaXMgZm91bmQgd2hpY2ggY29udGFpbnMgYSBtb25rZXktcGF0Y2ggcmVmZXJlbmNlLiBXaGVuIHRoYXQgb2NjdXJzIHRoZW4gdGhlIHByb3ZpZGVkIGVsZW1lbnQKICogd2lsbCBiZSB1cGRhdGVkIHdpdGggYSBuZXcgY29udGV4dCAod2hpY2ggaXMgdGhlbiByZXR1cm5lZCkuIElmIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgaXMgbm90CiAqIGRldGVjdGVkIGZvciBhIGNvbXBvbmVudC9kaXJlY3RpdmUgaW5zdGFuY2UgdGhlbiBpdCB3aWxsIHRocm93IGFuIGVycm9yIChhbGwgY29tcG9uZW50cyBhbmQKICogZGlyZWN0aXZlcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBtb25rZXktcGF0Y2hlZCBieSBpdnkpLgogKgogKiBAcGFyYW0gez99IHRhcmdldCBDb21wb25lbnQsIERpcmVjdGl2ZSBvciBET00gTm9kZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExDb250ZXh0KHRhcmdldCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1wVmFsdWUgPSByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KTsKICAgIGlmIChtcFZhbHVlKSB7CiAgICAgICAgLy8gb25seSB3aGVuIGl0J3MgYW4gYXJyYXkgaXMgaXQgY29uc2lkZXJlZCBhbiBMVmlldyBpbnN0YW5jZQogICAgICAgIC8vIC4uLiBvdGhlcndpc2UgaXQncyBhbiBhbHJlYWR5IGNvbnN0cnVjdGVkIExDb250ZXh0IGluc3RhbmNlCiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobXBWYWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChtcFZhbHVlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG5vZGVJbmRleDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkaXJlY3RpdmVzID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoaXNDb21wb25lbnRJbnN0YW5jZSh0YXJnZXQpKSB7CiAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCB0YXJnZXQpOwogICAgICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHByb3ZpZGVkIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kIGluIHRoZSBhcHBsaWNhdGlvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcG9uZW50ID0gdGFyZ2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGlyZWN0aXZlSW5zdGFuY2UodGFyZ2V0KSkgewogICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gZmluZFZpYURpcmVjdGl2ZShsVmlldywgdGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBkaXJlY3RpdmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYXBwbGljYXRpb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXMgPSBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgobm9kZUluZGV4LCBsVmlldywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbm9kZUluZGV4ID0gZmluZFZpYU5hdGl2ZUVsZW1lbnQobFZpZXcsICgvKiogQHR5cGUgez99ICovICh0YXJnZXQpKSk7CiAgICAgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdGhlIGdvYWwgaXMgbm90IHRvIGZpbGwgdGhlIGVudGlyZSBjb250ZXh0IGZ1bGwgb2YgZGF0YSBiZWNhdXNlIHRoZSBsb29rdXBzCiAgICAgICAgICAgIC8vIGFyZSBleHBlbnNpdmUuIEluc3RlYWQsIG9ubHkgdGhlIHRhcmdldCBkYXRhICh0aGUgZWxlbWVudCwgY29tcG9uZW50LCBjb250YWluZXIsIElDVQogICAgICAgICAgICAvLyBleHByZXNzaW9uIG9yIGRpcmVjdGl2ZSBkZXRhaWxzKSBhcmUgZmlsbGVkIGludG8gdGhlIGNvbnRleHQuIElmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwogICAgICAgICAgICAvLyB3aXRoIGRpZmZlcmVudCB0YXJnZXQgdmFsdWVzIHRoZW4gdGhlIG1pc3NpbmcgdGFyZ2V0IGRhdGEgd2lsbCBiZSBmaWxsZWQgaW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUobFZpZXdbbm9kZUluZGV4XSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdDdHggPSByZWFkUGF0Y2hlZERhdGEobmF0aXZlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gKGV4aXN0aW5nQ3R4ICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nQ3R4KSkgPwogICAgICAgICAgICAgICAgZXhpc3RpbmdDdHggOgogICAgICAgICAgICAgICAgY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgLy8gb25seSB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoCiAgICAgICAgICAgIGlmIChjb21wb25lbnQgJiYgY29udGV4dC5jb21wb25lbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29udGV4dC5jb21wb25lbnQsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoCiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVzICYmIGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGRpcmVjdGl2ZXNbaV0sIGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb250ZXh0Lm5hdGl2ZSwgY29udGV4dCk7CiAgICAgICAgICAgIG1wVmFsdWUgPSBjb250ZXh0OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0YXJnZXQpKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RG9tTm9kZShyRWxlbWVudCk7CiAgICAgICAgLy8gaWYgdGhlIGNvbnRleHQgaXMgbm90IGZvdW5kIHRoZW4gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cHdhcmRzIHVwIHRoZSBET00KICAgICAgICAvLyB0byBmaW5kIHRoZSBuZWFyZXN0IGVsZW1lbnQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIG1vbmtleSBwYXRjaGVkIHdpdGggZGF0YQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJFbGVtZW50KSk7CiAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IHJlYWRQYXRjaGVkRGF0YShwYXJlbnQpOwogICAgICAgICAgICBpZiAocGFyZW50Q29udGV4dCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGxWaWV3OwogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50Q29udGV4dCkpIHsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRDb250ZXh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsVmlldyA9IHBhcmVudENvbnRleHQubFZpZXc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyB0aGUgZWRnZSBvZiB0aGUgYXBwIHdhcyBhbHNvIHJlYWNoZWQgaGVyZSB0aHJvdWdoIGFub3RoZXIgbWVhbnMKICAgICAgICAgICAgICAgIC8vIChtYXliZSBiZWNhdXNlIHRoZSBET00gd2FzIGNoYW5nZWQgbWFudWFsbHkpLgogICAgICAgICAgICAgICAgaWYgKCFsVmlldykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgckVsZW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUobFZpZXdbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUxDb250ZXh0KGxWaWV3LCBpbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEobmF0aXZlLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBtcFZhbHVlID0gY29udGV4dDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1wVmFsdWUpKSkgfHwgbnVsbDsKfQovKioKICogQ3JlYXRlcyBhbiBlbXB0eSBpbnN0YW5jZSBvZiBhIGBMQ29udGV4dGAgY29udGV4dAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAqIEBwYXJhbSB7P30gbmF0aXZlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVMQ29udGV4dChsVmlldywgbm9kZUluZGV4LCBuYXRpdmUpIHsKICAgIHJldHVybiB7CiAgICAgICAgbFZpZXcsCiAgICAgICAgbm9kZUluZGV4LAogICAgICAgIG5hdGl2ZSwKICAgICAgICBjb21wb25lbnQ6IHVuZGVmaW5lZCwKICAgICAgICBkaXJlY3RpdmVzOiB1bmRlZmluZWQsCiAgICAgICAgbG9jYWxSZWZzOiB1bmRlZmluZWQsCiAgICB9Owp9Ci8qKgogKiBUYWtlcyBhIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmV0dXJucyB0aGUgdmlldyBmb3IgdGhhdCBjb21wb25lbnQuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50SW5zdGFuY2UKICogQHJldHVybiB7P30gVGhlIGNvbXBvbmVudCdzIHZpZXcKICovCmZ1bmN0aW9uIGdldENvbXBvbmVudFZpZXdCeUluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXcgPSByZWFkUGF0Y2hlZERhdGEoY29tcG9uZW50SW5zdGFuY2UpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHZpZXc7CiAgICBpZiAoQXJyYXkuaXNBcnJheShsVmlldykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gZmluZFZpYUNvbXBvbmVudChsVmlldywgY29tcG9uZW50SW5zdGFuY2UpOwogICAgICAgIHZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgobm9kZUluZGV4LCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVMQ29udGV4dChsVmlldywgbm9kZUluZGV4LCAoLyoqIEB0eXBlIHs/fSAqLyAodmlld1tIT1NUXSkpKTsKICAgICAgICBjb250ZXh0LmNvbXBvbmVudCA9IGNvbXBvbmVudEluc3RhbmNlOwogICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21wb25lbnRJbnN0YW5jZSwgY29udGV4dCk7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGNvbnRleHQubmF0aXZlLCBjb250ZXh0KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChsVmlldykpKSk7CiAgICAgICAgdmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7CiAgICB9CiAgICByZXR1cm4gdmlldzsKfQovKioKICogQXNzaWducyB0aGUgZ2l2ZW4gZGF0YSB0byB0aGUgZ2l2ZW4gdGFyZ2V0ICh3aGljaCBjb3VsZCBiZSBhIGNvbXBvbmVudCwKICogZGlyZWN0aXZlIG9yIERPTSBub2RlIGluc3RhbmNlKSB1c2luZyBtb25rZXktcGF0Y2hpbmcuCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEBwYXJhbSB7P30gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXR0YWNoUGF0Y2hEYXRhKHRhcmdldCwgZGF0YSkgewogICAgdGFyZ2V0W01PTktFWV9QQVRDSF9LRVlfTkFNRV0gPSBkYXRhOwp9Ci8qKgogKiBAcGFyYW0gez99IGluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0NvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IgJiYgaW5zdGFuY2UuY29uc3RydWN0b3IuybVjbXA7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRGlyZWN0aXZlSW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZS5jb25zdHJ1Y3RvciAmJiBpbnN0YW5jZS5jb25zdHJ1Y3Rvci7JtWRpcjsKfQovKioKICogTG9jYXRlcyB0aGUgZWxlbWVudCB3aXRoaW4gdGhlIGdpdmVuIExWaWV3IGFuZCByZXR1cm5zIHRoZSBtYXRjaGluZyBpbmRleAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgdGFyZ2V0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgIHdoaWxlICh0Tm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZU9yTnVsbCh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgaWYgKG5hdGl2ZSA9PT0gdGFyZ2V0KSB7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5pbmRleDsKICAgICAgICB9CiAgICAgICAgdE5vZGUgPSB0cmF2ZXJzZU5leHRFbGVtZW50KHROb2RlKTsKICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogTG9jYXRlcyB0aGUgbmV4dCB0Tm9kZSAoY2hpbGQsIHNpYmxpbmcgb3IgcGFyZW50KS4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSkgewogICAgaWYgKHROb2RlLmNoaWxkKSB7CiAgICAgICAgcmV0dXJuIHROb2RlLmNoaWxkOwogICAgfQogICAgZWxzZSBpZiAodE5vZGUubmV4dCkgewogICAgICAgIHJldHVybiB0Tm9kZS5uZXh0OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gTGV0J3MgdGFrZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiA8ZGl2PjxzcGFuPnRleHQ8L3NwYW4+PC9kaXY+PGNvbXBvbmVudC8+CiAgICAgICAgLy8gQWZ0ZXIgY2hlY2tpbmcgdGhlIHRleHQgbm9kZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBuZXh0IHBhcmVudCB0aGF0IGhhcyBhICJuZXh0IiBUTm9kZSwKICAgICAgICAvLyBpbiB0aGlzIGNhc2UgdGhlIHBhcmVudCBgZGl2YCwgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGUgY29tcG9uZW50LgogICAgICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgJiYgIXROb2RlLnBhcmVudC5uZXh0KSB7CiAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdE5vZGUucGFyZW50ICYmIHROb2RlLnBhcmVudC5uZXh0OwogICAgfQp9Ci8qKgogKiBMb2NhdGVzIHRoZSBjb21wb25lbnQgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudEluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCBjb21wb25lbnRJbnN0YW5jZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50SW5kaWNlcyA9IGxWaWV3W1RWSUVXXS5jb21wb25lbnRzOwogICAgaWYgKGNvbXBvbmVudEluZGljZXMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudEluZGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50Q29tcG9uZW50SW5kZXggPSBjb21wb25lbnRJbmRpY2VzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgoZWxlbWVudENvbXBvbmVudEluZGV4LCBsVmlldyk7CiAgICAgICAgICAgIGlmIChjb21wb25lbnRWaWV3W0NPTlRFWFRdID09PSBjb21wb25lbnRJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRDb21wb25lbnRJbmRleDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290Q29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChIRUFERVJfT0ZGU0VULCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50Vmlld1tDT05URVhUXTsKICAgICAgICBpZiAocm9vdENvbXBvbmVudCA9PT0gY29tcG9uZW50SW5zdGFuY2UpIHsKICAgICAgICAgICAgLy8gd2UgYXJlIGRlYWxpbmcgd2l0aCB0aGUgcm9vdCBlbGVtZW50IGhlcmUgdGhlcmVmb3JlIHdlIGtub3cgdGhhdCB0aGUKICAgICAgICAgICAgLy8gZWxlbWVudCBpcyB0aGUgdmVyeSBmaXJzdCBlbGVtZW50IGFmdGVyIHRoZSBIRUFERVIgZGF0YSBpbiB0aGUgbFZpZXcKICAgICAgICAgICAgcmV0dXJuIEhFQURFUl9PRkZTRVQ7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9Ci8qKgogKiBMb2NhdGVzIHRoZSBkaXJlY3RpdmUgd2l0aGluIHRoZSBnaXZlbiBMVmlldyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluc3RhbmNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kVmlhRGlyZWN0aXZlKGxWaWV3LCBkaXJlY3RpdmVJbnN0YW5jZSkgewogICAgLy8gaWYgYSBkaXJlY3RpdmUgaXMgbW9ua2V5IHBhdGNoZWQgdGhlbiBpdCB3aWxsIChieSBkZWZhdWx0KQogICAgLy8gaGF2ZSBhIHJlZmVyZW5jZSB0byB0aGUgTFZpZXcgb2YgdGhlIGN1cnJlbnQgdmlldy4gVGhlCiAgICAvLyBlbGVtZW50IGJvdW5kIHRvIHRoZSBkaXJlY3RpdmUgYmVpbmcgc2VhcmNoIGxpdmVzIHNvbWV3aGVyZQogICAgLy8gaW4gdGhlIHZpZXcgZGF0YS4gV2UgbG9vcCB0aHJvdWdoIHRoZSBub2RlcyBhbmQgY2hlY2sgdGhlaXIKICAgIC8vIGxpc3Qgb2YgZGlyZWN0aXZlcyBmb3IgdGhlIGluc3RhbmNlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHROb2RlID0gbFZpZXdbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICB3aGlsZSAodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlSW5kZXhTdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVJbmRleEVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICBmb3IgKGxldCBpID0gZGlyZWN0aXZlSW5kZXhTdGFydDsgaSA8IGRpcmVjdGl2ZUluZGV4RW5kOyBpKyspIHsKICAgICAgICAgICAgaWYgKGxWaWV3W2ldID09PSBkaXJlY3RpdmVJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHROb2RlLmluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHROb2RlID0gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSk7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KLyoqCiAqIFJldHVybnMgYSBsaXN0IG9mIGRpcmVjdGl2ZXMgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIHZpZXcgYmFzZWQgb24gdGhlCiAqIHByb3ZpZGVkIGxpc3Qgb2YgZGlyZWN0aXZlIGluZGV4IHZhbHVlcy4KICoKICogQHBhcmFtIHs/fSBub2RlSW5kZXggVGhlIG5vZGUgaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdGFyZ2V0IHZpZXcgZGF0YQogKiBAcGFyYW0gez99IGluY2x1ZGVDb21wb25lbnRzIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgY29tcG9uZW50cyBpbiByZXR1cm5lZCBkaXJlY3RpdmVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgobm9kZUluZGV4LCBsVmlldywgaW5jbHVkZUNvbXBvbmVudHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdGFydEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICBpZiAoZGlyZWN0aXZlU3RhcnRJbmRleCA9PSAwKQogICAgICAgIHJldHVybiBFTVBUWV9BUlJBWTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZUVuZEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgaWYgKCFpbmNsdWRlQ29tcG9uZW50cyAmJiB0Tm9kZS5mbGFncyAmIDIgLyogaXNDb21wb25lbnRIb3N0ICovKQogICAgICAgIGRpcmVjdGl2ZVN0YXJ0SW5kZXgrKzsKICAgIHJldHVybiBsVmlldy5zbGljZShkaXJlY3RpdmVTdGFydEluZGV4LCBkaXJlY3RpdmVFbmRJbmRleCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbXBvbmVudEF0Tm9kZUluZGV4KG5vZGVJbmRleCwgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdGFydEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICByZXR1cm4gdE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLyA/IGxWaWV3W2RpcmVjdGl2ZVN0YXJ0SW5kZXhdIDogbnVsbDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9lcnJvcnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENhbGxlZCB3aGVuIGRpcmVjdGl2ZXMgaW5qZWN0IGVhY2ggb3RoZXIgKGNyZWF0aW5nIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSkKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3IodG9rZW4pIHsKICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGluc3RhbnRpYXRlIGN5Y2xpYyBkZXBlbmRlbmN5ISAke3Rva2VufWApOwp9Ci8qKgogKiBDYWxsZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgY29tcG9uZW50IHNlbGVjdG9ycyB0aGF0IG1hdGNoIGEgZ2l2ZW4gbm9kZQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd011bHRpcGxlQ29tcG9uZW50RXJyb3IodE5vZGUpIHsKICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgY29tcG9uZW50cyBtYXRjaCBub2RlIHdpdGggdGFnbmFtZSAke3ROb2RlLnRhZ05hbWV9YCk7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWl4IG11bHRpIHByb3ZpZGVycyBhbmQgcmVndWxhciBwcm92aWRlcnNgKTsKfQovKioKICogQHBhcmFtIHs/PX0gbmdNb2R1bGVUeXBlCiAqIEBwYXJhbSB7Pz19IHByb3ZpZGVycwogKiBAcGFyYW0gez89fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGhyb3dJbnZhbGlkUHJvdmlkZXJFcnJvcihuZ01vZHVsZVR5cGUsIHByb3ZpZGVycywgcHJvdmlkZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ01vZHVsZURldGFpbCA9ICcnOwogICAgaWYgKG5nTW9kdWxlVHlwZSAmJiBwcm92aWRlcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXJEZXRhaWwgPSBwcm92aWRlcnMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHYgPT4gdiA9PSBwcm92aWRlciA/ICc/JyArIHByb3ZpZGVyICsgJz8nIDogJy4uLicpKTsKICAgICAgICBuZ01vZHVsZURldGFpbCA9CiAgICAgICAgICAgIGAgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBbJHtwcm92aWRlckRldGFpbC5qb2luKCcsICcpfV1gOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9J2AgKyBuZ01vZHVsZURldGFpbCk7Cn0KLyoqCiAqIFRocm93cyBhbiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVyQ2hlY2tlZCBlcnJvciBpZiBjaGVja05vQ2hhbmdlcyBtb2RlIGlzIG9uLgogKiBAcGFyYW0gez99IGNyZWF0aW9uTW9kZQogKiBAcGFyYW0gez99IG9sZFZhbHVlCiAqIEBwYXJhbSB7P30gY3VyclZhbHVlCiAqIEBwYXJhbSB7Pz19IHByb3BOYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0aHJvd0Vycm9ySWZOb0NoYW5nZXNNb2RlKGNyZWF0aW9uTW9kZSwgb2xkVmFsdWUsIGN1cnJWYWx1ZSwgcHJvcE5hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpZWxkID0gcHJvcE5hbWUgPyBgIGZvciAnJHtwcm9wTmFtZX0nYCA6ICcnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1zZyA9IGBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yOiBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLiBQcmV2aW91cyB2YWx1ZSR7ZmllbGR9OiAnJHtvbGRWYWx1ZX0nLiBDdXJyZW50IHZhbHVlOiAnJHtjdXJyVmFsdWV9Jy5gOwogICAgaWYgKGNyZWF0aW9uTW9kZSkgewogICAgICAgIG1zZyArPQogICAgICAgICAgICBgIEl0IHNlZW1zIGxpa2UgdGhlIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCBhZnRlciBpdHMgcGFyZW50IGFuZCBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGRpcnR5IGNoZWNrZWQuYCArCiAgICAgICAgICAgICAgICBgIEhhcyBpdCBiZWVuIGNyZWF0ZWQgaW4gYSBjaGFuZ2UgZGV0ZWN0aW9uIGhvb2s/YDsKICAgIH0KICAgIC8vIFRPRE86IGluY2x1ZGUgZGVidWcgY29udGV4dCwgc2VlIGB2aWV3RGVidWdFcnJvcmAgZnVuY3Rpb24gaW4KICAgIC8vIGBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L2Vycm9ycy50c2AgZm9yIHJlZmVyZW5jZS4KICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwp9Ci8qKgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcm9vdEluZGV4CiAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbkluZGV4CiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcGFyYW0gez99IGNoYW5nZWRWYWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29uc3RydWN0RGV0YWlsc0ZvckludGVycG9sYXRpb24obFZpZXcsIHJvb3RJbmRleCwgZXhwcmVzc2lvbkluZGV4LCBtZXRhLCBjaGFuZ2VkVmFsdWUpIHsKICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJlZml4LCAuLi5jaHVua3NdID0gbWV0YS5zcGxpdChJTlRFUlBPTEFUSU9OX0RFTElNSVRFUik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgb2xkVmFsdWUgPSBwcmVmaXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV3VmFsdWUgPSBwcmVmaXg7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rcy5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90SWR4ID0gcm9vdEluZGV4ICsgaTsKICAgICAgICBvbGRWYWx1ZSArPSBgJHtsVmlld1tzbG90SWR4XX0ke2NodW5rc1tpXX1gOwogICAgICAgIG5ld1ZhbHVlICs9IGAke3Nsb3RJZHggPT09IGV4cHJlc3Npb25JbmRleCA/IGNoYW5nZWRWYWx1ZSA6IGxWaWV3W3Nsb3RJZHhdfSR7Y2h1bmtzW2ldfWA7CiAgICB9CiAgICByZXR1cm4geyBwcm9wTmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlIH07Cn0KLyoqCiAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGV0YWlscyBmb3IgdGhlIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6CiAqIC0gcHJvcGVydHkgbmFtZSAoZm9yIHByb3BlcnR5IGJpbmRpbmdzIG9yIGludGVycG9sYXRpb25zKQogKiAtIG9sZCBhbmQgbmV3IHZhbHVlcywgZW5yaWNoZWQgdXNpbmcgaW5mb3JtYXRpb24gZnJvbSBtZXRhZGF0YQogKgogKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBtZXRhZGF0YSBzdG9yYWdlIGZvcm1hdCBjYW4gYmUgZm91bmQgaW4gYHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGFgCiAqIGZ1bmN0aW9uIGRlc2NyaXB0aW9uLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAqIEBwYXJhbSB7P30gb2xkVmFsdWUKICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbkNoYW5nZWRFcnJvckRldGFpbHMobFZpZXcsIGJpbmRpbmdJbmRleCwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0RGF0YSA9IGxWaWV3W1RWSUVXXS5kYXRhOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWV0YWRhdGEgPSB0RGF0YVtiaW5kaW5nSW5kZXhdOwogICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAvLyBtZXRhZGF0YSBmb3IgcHJvcGVydHkgaW50ZXJwb2xhdGlvbgogICAgICAgIGlmIChtZXRhZGF0YS5pbmRleE9mKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKSA+IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3REZXRhaWxzRm9ySW50ZXJwb2xhdGlvbihsVmlldywgYmluZGluZ0luZGV4LCBiaW5kaW5nSW5kZXgsIG1ldGFkYXRhLCBuZXdWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSBiaW5kaW5nCiAgICAgICAgcmV0dXJuIHsgcHJvcE5hbWU6IG1ldGFkYXRhLCBvbGRWYWx1ZSwgbmV3VmFsdWUgfTsKICAgIH0KICAgIC8vIG1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgY2hlY2sgaWYgdGhpcyBleHByZXNzaW9uIGlzIGEgcGFydCBvZiB0aGUKICAgIC8vIHByb3BlcnR5IGludGVycG9sYXRpb24gYnkgZ29pbmcgZnJvbSB0aGUgY3VycmVudCBiaW5kaW5nIGluZGV4IGxlZnQgYW5kIGxvb2sgZm9yIGEgc3RyaW5nIHRoYXQKICAgIC8vIGNvbnRhaW5zIElOVEVSUE9MQVRJT05fREVMSU1JVEVSLCB0aGUgbGF5b3V0IGluIHRWaWV3LmRhdGEgZm9yIHRoaXMgY2FzZSB3aWxsIGxvb2sgbGlrZSB0aGlzOgogICAgLy8gWy4uLiwgJ2lk77+9UHJlZml4IO+/vSBhbmQg77+9IHN1ZmZpeCcsIG51bGwsIG51bGwsIG51bGwsIC4uLl0KICAgIGlmIChtZXRhZGF0YSA9PT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaWR4ID0gYmluZGluZ0luZGV4IC0gMTsKICAgICAgICB3aGlsZSAodHlwZW9mIHREYXRhW2lkeF0gIT09ICdzdHJpbmcnICYmIHREYXRhW2lkeCArIDFdID09PSBudWxsKSB7CiAgICAgICAgICAgIGlkeC0tOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0YSA9IHREYXRhW2lkeF07CiAgICAgICAgaWYgKHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBtZXRhLm1hdGNoKG5ldyBSZWdFeHAoSU5URVJQT0xBVElPTl9ERUxJTUlURVIsICdnJykpOwogICAgICAgICAgICAvLyBmaXJzdCBpbnRlcnBvbGF0aW9uIGRlbGltaXRlciBzZXBhcmF0ZXMgcHJvcGVydHkgbmFtZSBmcm9tIGludGVycG9sYXRpb24gcGFydHMgKGluIGNhc2Ugb2YKICAgICAgICAgICAgLy8gcHJvcGVydHkgaW50ZXJwb2xhdGlvbnMpLCBzbyB3ZSBzdWJ0cmFjdCBvbmUgZnJvbSB0b3RhbCBudW1iZXIgb2YgZm91bmQgZGVsaW1pdGVycwogICAgICAgICAgICBpZiAobWF0Y2hlcyAmJiAobWF0Y2hlcy5sZW5ndGggLSAxKSA+IGJpbmRpbmdJbmRleCAtIGlkeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdERldGFpbHNGb3JJbnRlcnBvbGF0aW9uKGxWaWV3LCBpZHgsIGJpbmRpbmdJbmRleCwgbWV0YSwgbmV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgcHJvcE5hbWU6IHVuZGVmaW5lZCwgb2xkVmFsdWUsIG5ld1ZhbHVlIH07Cn0KLyoqCiAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgVE5vZGVgIGhhcyBhIGRpcmVjdGl2ZSB3aGljaCBoYXMgYFxASW5wdXQoKWAgZm9yIGBjbGFzc2AgYmluZGluZy4KICoKICogYGBgCiAqIDxkaXYgbXktZGlyIFtjbGFzc109ImV4cCI+PC9kaXY+CiAqIGBgYAogKiBhbmQKICogYGBgCiAqIFxARGlyZWN0aXZlKHsKICogfSkKICogY2xhc3MgTXlEaXJlY3RpdmUgewogKiBcQElucHV0KCkKICogICBjbGFzczogc3RyaW5nOwogKiB9CiAqIGBgYAogKgogKiBJbiB0aGUgYWJvdmUgY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJlY29uY2lsZWQgc3R5bGluZyBpbmZvcm1hdGlvbiBpbnRvIHRoZQogKiBkaXJlY3RpdmUncyBpbnB1dC4KICoKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzQ2xhc3NJbnB1dCh0Tm9kZSkgewogICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDE2IC8qIGhhc0NsYXNzSW5wdXQgKi8pICE9PSAwOwp9Ci8qKgogKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYFROb2RlYCBoYXMgYSBkaXJlY3RpdmUgd2hpY2ggaGFzIGBcQElucHV0KClgIGZvciBgc3R5bGVgIGJpbmRpbmcuCiAqCiAqIGBgYAogKiA8ZGl2IG15LWRpciBbc3R5bGVdPSJleHAiPjwvZGl2PgogKiBgYGAKICogYW5kCiAqIGBgYAogKiBcQERpcmVjdGl2ZSh7CiAqIH0pCiAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICogXEBJbnB1dCgpCiAqICAgY2xhc3M6IHN0cmluZzsKICogfQogKiBgYGAKICoKICogSW4gdGhlIGFib3ZlIGNhc2UgaXQgaXMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSByZWNvbmNpbGVkIHN0eWxpbmcgaW5mb3JtYXRpb24gaW50byB0aGUKICogZGlyZWN0aXZlJ3MgaW5wdXQuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1N0eWxlSW5wdXQodE5vZGUpIHsKICAgIHJldHVybiAodE5vZGUuZmxhZ3MgJiAzMiAvKiBoYXNTdHlsZUlucHV0ICovKSAhPT0gMDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nL2NsYXNzX2RpZmZlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyBhbiBpbmRleCBvZiBgY2xhc3NUb1NlYXJjaGAgaW4gYGNsYXNzTmFtZWAgdGFraW5nIHRva2VuIGJvdW5kYXJpZXMgaW50byBhY2NvdW50LgogKgogKiBgY2xhc3NJbmRleE9mKCdBQiBBJywgJ0EnLCAwKWAgd2lsbCBiZSAzIChub3QgMCBzaW5jZSBgQUIhPT1BYCkKICoKICogQHBhcmFtIHs/fSBjbGFzc05hbWUgQSBzdHJpbmcgY29udGFpbmluZyBjbGFzc2VzICh3aGl0ZXNwYWNlIHNlcGFyYXRlZCkKICogQHBhcmFtIHs/fSBjbGFzc1RvU2VhcmNoIEEgY2xhc3MgbmFtZSB0byBsb2NhdGUKICogQHBhcmFtIHs/fSBzdGFydGluZ0luZGV4IFN0YXJ0aW5nIGxvY2F0aW9uIG9mIHNlYXJjaAogKiBAcmV0dXJuIHs/fSBhbiBpbmRleCBvZiB0aGUgbG9jYXRlZCBjbGFzcyAob3IgLTEgaWYgbm90IGZvdW5kKQogKi8KZnVuY3Rpb24gY2xhc3NJbmRleE9mKGNsYXNzTmFtZSwgY2xhc3NUb1NlYXJjaCwgc3RhcnRpbmdJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdEVxdWFsKGNsYXNzVG9TZWFyY2gsICcnLCAnY2FuIG5vdCBsb29rIGZvciAiIiBzdHJpbmcuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZW5kID0gY2xhc3NOYW1lLmxlbmd0aDsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvdW5kSW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZihjbGFzc1RvU2VhcmNoLCBzdGFydGluZ0luZGV4KTsKICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4OwogICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAwIHx8IGNsYXNzTmFtZS5jaGFyQ29kZUF0KGZvdW5kSW5kZXggLSAxKSA8PSAzMiAvKiBTUEFDRSAqLykgewogICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBoYXMgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2xhc3NUb1NlYXJjaC5sZW5ndGg7CiAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICsgbGVuZ3RoID09PSBlbmQgfHwKICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5jaGFyQ29kZUF0KGZvdW5kSW5kZXggKyBsZW5ndGgpIDw9IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBoYXMgdHJhaWxpbmcgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRmFsc2UgcG9zaXRpdmUsIGtlZXAgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuCiAgICAgICAgc3RhcnRpbmdJbmRleCA9IGZvdW5kSW5kZXggKyAxOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfVEVNUExBVEVfU0VMRUNUT1IgPSAnbmctdGVtcGxhdGUnOwovKioKICogU2VhcmNoIHRoZSBgVEF0dHJpYnV0ZXNgIHRvIHNlZSBpZiBpdCBjb250YWlucyBgY3NzQ2xhc3NUb01hdGNoYCAoY2FzZSBpbnNlbnNpdGl2ZSkKICoKICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIHRvIHNlYXJjaCB0aHJvdWdoLgogKiBAcGFyYW0gez99IGNzc0NsYXNzVG9NYXRjaCBjbGFzcyB0byBtYXRjaCAobG93ZXJjYXNlKQogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbk1vZGUgV2hldGhlciBvciBub3QgY2xhc3MgbWF0Y2hpbmcgc2hvdWxkIGxvb2sgaW50byB0aGUgYXR0cmlidXRlIGBjbGFzc2AgaW4KICogICAgYWRkaXRpb24gdG8gdGhlIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0Nzc0NsYXNzTWF0Y2hpbmcoYXR0cnMsIGNzc0NsYXNzVG9NYXRjaCwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgLy8gVE9ETyhtaXNrbyk6IFRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBrbm93IGFib3V0IGBpc1Byb2plY3Rpb25Nb2RlYCBzZWVtcyBzdXNwZWN0LgogICAgLy8gSXQgaXMgc3RyYW5nZSB0byBtZSB0aGF0IHNvbWV0aW1lcyB0aGUgY2xhc3MgaW5mb3JtYXRpb24gY29tZXMgaW4gZm9ybSBvZiBgY2xhc3NgIGF0dHJpYnV0ZQogICAgLy8gYW5kIHNvbWV0aW1lcyBpbiBmb3JtIG9mIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuIFNvbWUgaW52ZXN0aWdhdGlvbiBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lCiAgICAvLyBpZiB0aGF0IGlzIHRoZSByaWdodCBiZWhhdmlvci4KICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGNzc0NsYXNzVG9NYXRjaCwgY3NzQ2xhc3NUb01hdGNoLnRvTG93ZXJDYXNlKCksICdDbGFzcyBuYW1lIGV4cGVjdGVkIHRvIGJlIGxvd2VyY2FzZS4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpdGVtID0gYXR0cnNbaSsrXTsKICAgICAgICBpZiAoaXNQcm9qZWN0aW9uTW9kZSAmJiBpdGVtID09PSAnY2xhc3MnKSB7CiAgICAgICAgICAgIGl0ZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaV0pKTsKICAgICAgICAgICAgaWYgKGNsYXNzSW5kZXhPZihpdGVtLnRvTG93ZXJDYXNlKCksIGNzc0NsYXNzVG9NYXRjaCwgMCkgIT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpdGVtID09PSAxIC8qIENsYXNzZXMgKi8pIHsKICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIGNsYXNzZXMgc2VjdGlvbi4gU3RhcnQgc2VhcmNoaW5nIGZvciB0aGUgY2xhc3MuCiAgICAgICAgICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoICYmIHR5cGVvZiAoaXRlbSA9IGF0dHJzW2krK10pID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAvLyB3aGlsZSB3ZSBoYXZlIHN0cmluZ3MKICAgICAgICAgICAgICAgIGlmIChpdGVtLnRvTG93ZXJDYXNlKCkgPT09IGNzc0NsYXNzVG9NYXRjaCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Ci8qKgogKiBGdW5jdGlvbiB0aGF0IGNoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gdE5vZGUgbWF0Y2hlcyB0YWctYmFzZWQgc2VsZWN0b3IgYW5kIGhhcyBhIHZhbGlkIHR5cGUuCiAqCiAqIE1hdGNoaW5nIGNhbiBiZSBwZXJmb3JtZWQgaW4gMiBtb2RlczogcHJvamVjdGlvbiBtb2RlICh3aGVuIHdlIHByb2plY3Qgbm9kZXMpIGFuZCByZWd1bGFyCiAqIGRpcmVjdGl2ZSBtYXRjaGluZyBtb2RlOgogKiAtIGluIHRoZSAiZGlyZWN0aXZlIG1hdGNoaW5nIiBtb2RlIHdlIGRvIF9ub3RfIHRha2UgVENvbnRhaW5lcidzIHRhZ05hbWUgaW50byBhY2NvdW50IGlmIGl0IGlzCiAqIGRpZmZlcmVudCBmcm9tIE5HX1RFTVBMQVRFX1NFTEVDVE9SICh2YWx1ZSBkaWZmZXJlbnQgZnJvbSBOR19URU1QTEFURV9TRUxFQ1RPUiBpbmRpY2F0ZXMgdGhhdCBhCiAqIHRhZyBuYW1lIHdhcyBleHRyYWN0ZWQgZnJvbSAqIHN5bnRheCBzbyB3ZSB3b3VsZCBtYXRjaCB0aGUgc2FtZSBkaXJlY3RpdmUgdHdpY2UpOwogKiAtIGluIHRoZSAicHJvamVjdGlvbiIgbW9kZSwgd2UgdXNlIGEgdGFnIG5hbWUgcG90ZW50aWFsbHkgZXh0cmFjdGVkIGZyb20gdGhlICogc3ludGF4IHByb2Nlc3NpbmcKICogKGFwcGxpY2FibGUgdG8gVE5vZGVUeXBlLkNvbnRhaW5lciBvbmx5KS4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGN1cnJlbnRTZWxlY3RvcgogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbk1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1RhZ0FuZFR5cGVNYXRjaCh0Tm9kZSwgY3VycmVudFNlbGVjdG9yLCBpc1Byb2plY3Rpb25Nb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0YWdOYW1lVG9Db21wYXJlID0gdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8gJiYgIWlzUHJvamVjdGlvbk1vZGUgPwogICAgICAgIE5HX1RFTVBMQVRFX1NFTEVDVE9SIDoKICAgICAgICB0Tm9kZS50YWdOYW1lOwogICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RvciA9PT0gdGFnTmFtZVRvQ29tcGFyZTsKfQovKioKICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRvIG1hdGNoIGFuIEl2eSBub2RlIHN0YXRpYyBkYXRhIGFnYWluc3QgYSBzaW1wbGUgQ1NTIHNlbGVjdG9yCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gdHJ5IG1hdGNoaW5nIGFnYWluc3QgdGhlIG5vZGUuCiAqIEBwYXJhbSB7P30gaXNQcm9qZWN0aW9uTW9kZSBpZiBgdHJ1ZWAgd2UgYXJlIG1hdGNoaW5nIGZvciBjb250ZW50IHByb2plY3Rpb24sIG90aGVyd2lzZSB3ZSBhcmUgZG9pbmcKICogZGlyZWN0aXZlIG1hdGNoaW5nLgogKiBAcmV0dXJuIHs/fSB0cnVlIGlmIG5vZGUgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuCiAqLwpmdW5jdGlvbiBpc05vZGVNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBzZWxlY3RvciwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoc2VsZWN0b3JbMF0sICdTZWxlY3RvciBzaG91bGQgaGF2ZSBhIHRhZyBuYW1lJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbW9kZSA9IDQgLyogRUxFTUVOVCAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVBdHRycyA9IHROb2RlLmF0dHJzIHx8IFtdOwogICAgLy8gRmluZCB0aGUgaW5kZXggb2YgZmlyc3QgYXR0cmlidXRlIHRoYXQgaGFzIG5vIHZhbHVlLCBvbmx5IGEgbmFtZS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWVPbmx5TWFya2VySWR4ID0gZ2V0TmFtZU9ubHlNYXJrZXJJbmRleChub2RlQXR0cnMpOwogICAgLy8gV2hlbiBwcm9jZXNzaW5nICI6bm90IiBzZWxlY3RvcnMsIHdlIHNraXAgdG8gdGhlIG5leHQgIjpub3QiIGlmIHRoZQogICAgLy8gY3VycmVudCBvbmUgZG9lc24ndCBtYXRjaAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNraXBUb05leHRTZWxlY3RvciA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rvci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50ID0gc2VsZWN0b3JbaV07CiAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50ID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBhIDpub3Qgc2VsZWN0b3IgYW5kIGl0IGhhc24ndCBmYWlsZWQsIHJldHVybiBmYWxzZQogICAgICAgICAgICBpZiAoIXNraXBUb05leHRTZWxlY3RvciAmJiAhaXNQb3NpdGl2ZShtb2RlKSAmJiAhaXNQb3NpdGl2ZShjdXJyZW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyB0byB0aGUgbmV4dCA6bm90KCkgYW5kIHRoaXMgbW9kZSBmbGFnIGlzIHBvc2l0aXZlLAogICAgICAgICAgICAvLyBpdCdzIGEgcGFydCBvZiB0aGUgY3VycmVudCA6bm90KCkgc2VsZWN0b3IsIGFuZCB3ZSBzaG91bGQga2VlcCBza2lwcGluZwogICAgICAgICAgICBpZiAoc2tpcFRvTmV4dFNlbGVjdG9yICYmIGlzUG9zaXRpdmUoY3VycmVudCkpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gZmFsc2U7CiAgICAgICAgICAgIG1vZGUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQpKSkgfCAobW9kZSAmIDEgLyogTk9UICovKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChza2lwVG9OZXh0U2VsZWN0b3IpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmIChtb2RlICYgNCAvKiBFTEVNRU5UICovKSB7CiAgICAgICAgICAgIG1vZGUgPSAyIC8qIEFUVFJJQlVURSAqLyB8IG1vZGUgJiAxIC8qIE5PVCAqLzsKICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09ICcnICYmICFoYXNUYWdBbmRUeXBlTWF0Y2godE5vZGUsIGN1cnJlbnQsIGlzUHJvamVjdGlvbk1vZGUpIHx8CiAgICAgICAgICAgICAgICBjdXJyZW50ID09PSAnJyAmJiBzZWxlY3Rvci5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JBdHRyVmFsdWUgPSBtb2RlICYgOCAvKiBDTEFTUyAqLyA/IGN1cnJlbnQgOiBzZWxlY3RvclsrK2ldOwogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1hdGNoaW5nIGFnYWluc3QgY2xhc3NlcyB3aGVuIGEgdE5vZGUgaGFzIGJlZW4gaW5zdGFudGlhdGVkIHdpdGgKICAgICAgICAgICAgLy8gY2xhc3MgYW5kIHN0eWxlIHZhbHVlcyBhcyBzZXBhcmF0ZSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuIFsndGl0bGUnLCBDTEFTUywgJ2ZvbyddKQogICAgICAgICAgICBpZiAoKG1vZGUgJiA4IC8qIENMQVNTICovKSAmJiB0Tm9kZS5hdHRycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCFpc0Nzc0NsYXNzTWF0Y2hpbmcodE5vZGUuYXR0cnMsICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvckF0dHJWYWx1ZSkpLCBpc1Byb2plY3Rpb25Nb2RlKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNJbmxpbmVUZW1wbGF0ZSA9IHROb2RlLnR5cGUgPT0gMCAvKiBDb250YWluZXIgKi8gJiYgdE5vZGUudGFnTmFtZSAhPT0gTkdfVEVNUExBVEVfU0VMRUNUT1I7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSAobW9kZSAmIDggLyogQ0xBU1MgKi8pID8gJ2NsYXNzJyA6IGN1cnJlbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXR0ckluZGV4SW5Ob2RlID0gZmluZEF0dHJJbmRleEluTm9kZShhdHRyTmFtZSwgbm9kZUF0dHJzLCBpc0lubGluZVRlbXBsYXRlLCBpc1Byb2plY3Rpb25Nb2RlKTsKICAgICAgICAgICAgaWYgKGF0dHJJbmRleEluTm9kZSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VsZWN0b3JBdHRyVmFsdWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgbm9kZUF0dHJWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChhdHRySW5kZXhJbk5vZGUgPiBuYW1lT25seU1hcmtlcklkeCkgewogICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbChub2RlQXR0cnNbYXR0ckluZGV4SW5Ob2RlXSwgMCAvKiBOYW1lc3BhY2VVUkkgKi8sICdXZSBkbyBub3QgbWF0Y2ggZGlyZWN0aXZlcyBvbiBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb3dlcmNhc2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBhYmxlIHRvIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0b3JzIHdpdGhvdXQgY2FzZS1zZW5zaXRpdml0eQogICAgICAgICAgICAgICAgICAgIC8vIChzZWxlY3RvcnMgYXJlIGFscmVhZHkgaW4gbG93ZXJjYXNlIHdoZW4gZ2VuZXJhdGVkKQogICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKG5vZGVBdHRyc1thdHRySW5kZXhJbk5vZGUgKyAxXSkpKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUFnYWluc3RDbGFzc05hbWUgPSBtb2RlICYgOCAvKiBDTEFTUyAqLyA/IG5vZGVBdHRyVmFsdWUgOiBudWxsOwogICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lICYmCiAgICAgICAgICAgICAgICAgICAgY2xhc3NJbmRleE9mKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JBdHRyVmFsdWUpKSwgMCkgIT09IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgbW9kZSAmIDIgLyogQVRUUklCVVRFICovICYmIHNlbGVjdG9yQXR0clZhbHVlICE9PSBub2RlQXR0clZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmUobW9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGlzUG9zaXRpdmUobW9kZSkgfHwgc2tpcFRvTmV4dFNlbGVjdG9yOwp9Ci8qKgogKiBAcGFyYW0gez99IG1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzUG9zaXRpdmUobW9kZSkgewogICAgcmV0dXJuIChtb2RlICYgMSAvKiBOT1QgKi8pID09PSAwOwp9Ci8qKgogKiBFeGFtaW5lcyB0aGUgYXR0cmlidXRlJ3MgZGVmaW5pdGlvbiBhcnJheSBmb3IgYSBub2RlIHRvIGZpbmQgdGhlIGluZGV4IG9mIHRoZQogKiBhdHRyaWJ1dGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBgbmFtZWAuCiAqCiAqIE5PVEU6IFRoaXMgd2lsbCBub3QgbWF0Y2ggbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLgogKgogKiBBdHRyaWJ1dGUgbWF0Y2hpbmcgZGVwZW5kcyB1cG9uIGBpc0lubGluZVRlbXBsYXRlYCBhbmQgYGlzUHJvamVjdGlvbk1vZGVgLgogKiBUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgd2hpY2ggdHlwZXMgb2YgYXR0cmlidXRlcyB3ZSBhdHRlbXB0IHRvIG1hdGNoOgogKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBNb2RlcyAgICAgICAgICAgICAgICAgICB8IE5vcm1hbCBBdHRyaWJ1dGVzIHwgQmluZGluZ3MgQXR0cmlidXRlcyB8IFRlbXBsYXRlIEF0dHJpYnV0ZXMgfCBJMThuCiAqIEF0dHJpYnV0ZXMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogSW5saW5lICsgUHJvamVjdGlvbiAgICAgfCBZRVMgICAgICAgICAgICAgICB8IFlFUyAgICAgICAgICAgICAgICAgfCBOTyAgICAgICAgICAgICAgICAgIHwgWUVTCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIElubGluZSArIERpcmVjdGl2ZSAgICAgIHwgTk8gICAgICAgICAgICAgICAgfCBOTyAgICAgICAgICAgICAgICAgIHwgWUVTICAgICAgICAgICAgICAgICB8IE5PCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIE5vbi1pbmxpbmUgKyBQcm9qZWN0aW9uIHwgWUVTICAgICAgICAgICAgICAgfCBZRVMgICAgICAgICAgICAgICAgIHwgTk8gICAgICAgICAgICAgICAgICB8IFlFUwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBOb24taW5saW5lICsgRGlyZWN0aXZlICB8IFlFUyAgICAgICAgICAgICAgIHwgWUVTICAgICAgICAgICAgICAgICB8IE5PICAgICAgICAgICAgICAgICAgfCBZRVMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogQHBhcmFtIHs/fSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gZmluZAogKiBAcGFyYW0gez99IGF0dHJzIHRoZSBhdHRyaWJ1dGUgYXJyYXkgdG8gZXhhbWluZQogKiBAcGFyYW0gez99IGlzSW5saW5lVGVtcGxhdGUgdHJ1ZSBpZiB0aGUgbm9kZSBiZWluZyBtYXRjaGVkIGlzIGFuIGlubGluZSB0ZW1wbGF0ZSAoZS5nLiBgKm5nRm9yYCkKICogcmF0aGVyIHRoYW4gYSBtYW51YWxseSBleHBhbmRlZCB0ZW1wbGF0ZSBub2RlIChlLmcgYDxuZy10ZW1wbGF0ZT5gKS4KICogQHBhcmFtIHs/fSBpc1Byb2plY3Rpb25Nb2RlIHRydWUgaWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgY29udGVudCBwcm9qZWN0aW9uIG90aGVyd2lzZSB3ZSBhcmUKICogbWF0Y2hpbmcgYWdhaW5zdCBkaXJlY3RpdmVzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmluZEF0dHJJbmRleEluTm9kZShuYW1lLCBhdHRycywgaXNJbmxpbmVUZW1wbGF0ZSwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgaWYgKGF0dHJzID09PSBudWxsKQogICAgICAgIHJldHVybiAtMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMDsKICAgIGlmIChpc1Byb2plY3Rpb25Nb2RlIHx8ICFpc0lubGluZVRlbXBsYXRlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBiaW5kaW5nc01vZGUgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heWJlQXR0ck5hbWUgPSBhdHRyc1tpXTsKICAgICAgICAgICAgaWYgKG1heWJlQXR0ck5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDMgLyogQmluZGluZ3MgKi8gfHwgbWF5YmVBdHRyTmFtZSA9PT0gNiAvKiBJMThuICovKSB7CiAgICAgICAgICAgICAgICBiaW5kaW5nc01vZGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDEgLyogQ2xhc3NlcyAqLyB8fCBtYXliZUF0dHJOYW1lID09PSAyIC8qIFN0eWxlcyAqLykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gYXR0cnNbKytpXTsKICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBza2lwIGNsYXNzZXMgaGVyZSBiZWNhdXNlIHdlIGhhdmUgYSBzZXBhcmF0ZSBtZWNoYW5pc20gZm9yCiAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBjbGFzc2VzIGluIHByb2plY3Rpb24gbW9kZS4KICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1srK2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gNCAvKiBUZW1wbGF0ZSAqLykgewogICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGNhcmUgYWJvdXQgVGVtcGxhdGUgYXR0cmlidXRlcyBpbiB0aGlzIHNjZW5hcmlvLgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobWF5YmVBdHRyTmFtZSA9PT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHdob2xlIG5hbWVzcGFjZWQgYXR0cmlidXRlIGFuZCB2YWx1ZS4gVGhpcyBpcyBieSBkZXNpZ24uCiAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbiBiaW5kaW5nIG1vZGUgdGhlcmUgYXJlIG9ubHkgbmFtZXMsIHJhdGhlciB0aGFuIG5hbWUtdmFsdWUgcGFpcnMuCiAgICAgICAgICAgIGkgKz0gYmluZGluZ3NNb2RlID8gMSA6IDI7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGRpZCBub3QgbWF0Y2ggdGhlIGF0dHJpYnV0ZQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBtYXRjaFRlbXBsYXRlQXR0cmlidXRlKGF0dHJzLCBuYW1lKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHNlbGVjdG9yCiAqIEBwYXJhbSB7Pz19IGlzUHJvamVjdGlvbk1vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzTm9kZU1hdGNoaW5nU2VsZWN0b3JMaXN0KHROb2RlLCBzZWxlY3RvciwgaXNQcm9qZWN0aW9uTW9kZSA9IGZhbHNlKSB7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGlzTm9kZU1hdGNoaW5nU2VsZWN0b3IodE5vZGUsIHNlbGVjdG9yW2ldLCBpc1Byb2plY3Rpb25Nb2RlKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFByb2plY3RBc0F0dHJWYWx1ZSh0Tm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZUF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICBpZiAobm9kZUF0dHJzICE9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdQcm9qZWN0QXNBdHRySWR4ID0gbm9kZUF0dHJzLmluZGV4T2YoNSAvKiBQcm9qZWN0QXMgKi8pOwogICAgICAgIC8vIG9ubHkgY2hlY2sgZm9yIG5nUHJvamVjdEFzIGluIGF0dHJpYnV0ZSBuYW1lcywgZG9uJ3QgYWNjaWRlbnRhbGx5IG1hdGNoIGF0dHJpYnV0ZSdzIHZhbHVlCiAgICAgICAgLy8gKGF0dHJpYnV0ZSBuYW1lcyBhcmUgc3RvcmVkIGF0IGV2ZW4gaW5kZXhlcykKICAgICAgICBpZiAoKG5nUHJvamVjdEFzQXR0cklkeCAmIDEpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobm9kZUF0dHJzW25nUHJvamVjdEFzQXR0cklkeCArIDFdKSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbm9kZUF0dHJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROYW1lT25seU1hcmtlckluZGV4KG5vZGVBdHRycykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlQXR0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9kZUF0dHIgPSBub2RlQXR0cnNbaV07CiAgICAgICAgaWYgKGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobm9kZUF0dHIpKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlQXR0cnMubGVuZ3RoOwp9Ci8qKgogKiBAcGFyYW0gez99IGF0dHJzCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0Y2hUZW1wbGF0ZUF0dHJpYnV0ZShhdHRycywgbmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSBhdHRycy5pbmRleE9mKDQgLyogVGVtcGxhdGUgKi8pOwogICAgaWYgKGkgPiAtMSkgewogICAgICAgIGkrKzsKICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoYXR0cnNbaV0gPT09IG5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgaSsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogQ2hlY2tzIHdoZXRoZXIgYSBzZWxlY3RvciBpcyBpbnNpZGUgYSBDc3NTZWxlY3Rvckxpc3QKICogQHBhcmFtIHs/fSBzZWxlY3RvciBTZWxlY3RvciB0byBiZSBjaGVja2VkLgogKiBAcGFyYW0gez99IGxpc3QgTGlzdCBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgc2VsZWN0b3IuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1NlbGVjdG9ySW5TZWxlY3Rvckxpc3Qoc2VsZWN0b3IsIGxpc3QpIHsKICAgIHNlbGVjdG9yTGlzdExvb3A6IGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0b3JJbkxpc3QgPSBsaXN0W2ldOwogICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggIT09IGN1cnJlbnRTZWxlY3RvckluTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VsZWN0b3IubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgaWYgKHNlbGVjdG9yW2pdICE9PSBjdXJyZW50U2VsZWN0b3JJbkxpc3Rbal0pIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIHNlbGVjdG9yTGlzdExvb3A7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaXNOZWdhdGl2ZU1vZGUKICogQHBhcmFtIHs/fSBjaHVuawogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY2h1bmspIHsKICAgIHJldHVybiBpc05lZ2F0aXZlTW9kZSA/ICc6bm90KCcgKyBjaHVuay50cmltKCkgKyAnKScgOiBjaHVuazsKfQovKioKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Q1NTU2VsZWN0b3Ioc2VsZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByZXN1bHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JbMF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi87CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3VycmVudENodW5rID0gJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaXNOZWdhdGl2ZU1vZGUgPSBmYWxzZTsKICAgIHdoaWxlIChpIDwgc2VsZWN0b3IubGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2YWx1ZU9yTWFya2VyID0gc2VsZWN0b3JbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZU9yTWFya2VyID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBpZiAobW9kZSAmIDIgLyogQVRUUklCVVRFICovKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JbKytpXSkpOwogICAgICAgICAgICAgICAgY3VycmVudENodW5rICs9CiAgICAgICAgICAgICAgICAgICAgJ1snICsgdmFsdWVPck1hcmtlciArIChhdHRyVmFsdWUubGVuZ3RoID4gMCA/ICc9IicgKyBhdHRyVmFsdWUgKyAnIicgOiAnJykgKyAnXSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobW9kZSAmIDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayArPSAnLicgKyB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgJiA0IC8qIEVMRU1FTlQgKi8pIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayArPSAnICcgKyB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBcHBlbmQgY3VycmVudCBjaHVuayB0byB0aGUgZmluYWwgcmVzdWx0IGluIGNhc2Ugd2UgY29tZSBhY3Jvc3MgU2VsZWN0b3JGbGFnLCB3aGljaAogICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJldmlvdXMgc2VjdGlvbiBvZiBhIHNlbGVjdG9yIGlzIG92ZXIuIFdlIG5lZWQgdG8gYWNjdW11bGF0ZSBjb250ZW50CiAgICAgICAgICAgIC8vIGJldHdlZW4gZmxhZ3MgdG8gbWFrZSBzdXJlIHdlIHdyYXAgdGhlIGNodW5rIGxhdGVyIGluIDpub3QoKSBzZWxlY3RvciBpZiBuZWVkZWQsIGUuZy4KICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vICBbJycsIEZsYWdzLkNMQVNTLCAnLmNsYXNzQScsIEZsYWdzLkNMQVNTIHwgRmxhZ3MuTk9ULCAnLmNsYXNzQicsICcuY2xhc3NDJ10KICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBgLmNsYXNzQSA6bm90KC5jbGFzc0IgLmNsYXNzQylgLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBOb3RlOiBmb3IgbmVnYXRpdmUgc2VsZWN0b3IgcGFydCwgd2UgYWNjdW11bGF0ZSBjb250ZW50IGJldHdlZW4gZmxhZ3MgdW50aWwgd2UgZmluZCB0aGUKICAgICAgICAgICAgLy8gbmV4dCBuZWdhdGl2ZSBmbGFnLiBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IGEgY2FzZSB3aGVyZSBgOm5vdCgpYCBydWxlIGNvbnRhaW5zIG1vcmUgdGhhbgogICAgICAgICAgICAvLyBvbmUgY2h1bmssIGUuZy4gdGhlIGZvbGxvd2luZyBzZWxlY3RvcjoKICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgIC8vICBbJycsIEZsYWdzLkVMRU1FTlQgfCBGbGFncy5OT1QsICdwJywgRmxhZ3MuQ0xBU1MsICdmb28nLCBGbGFncy5DTEFTUyB8IEZsYWdzLk5PVCwgJ2JhciddCiAgICAgICAgICAgIC8vIGBgYAogICAgICAgICAgICAvLyBzaG91bGQgYmUgc3RyaW5naWZpZWQgdG8gYDpub3QocC5mb28pIDpub3QoLmJhcilgCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGlmIChjdXJyZW50Q2h1bmsgIT09ICcnICYmICFpc1Bvc2l0aXZlKHZhbHVlT3JNYXJrZXIpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY3VycmVudENodW5rKTsKICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vZGUgPSB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gQ3NzU2VsZWN0b3Igc3BlYywgb25jZSB3ZSBjb21lIGFjcm9zcyBgU2VsZWN0b3JGbGFncy5OT1RgIGZsYWcsIHRoZSBuZWdhdGl2ZQogICAgICAgICAgICAvLyBtb2RlIGlzIG1haW50YWluZWQgZm9yIHJlbWFpbmluZyBjaHVua3Mgb2YgYSBzZWxlY3Rvci4KICAgICAgICAgICAgaXNOZWdhdGl2ZU1vZGUgPSBpc05lZ2F0aXZlTW9kZSB8fCAhaXNQb3NpdGl2ZShtb2RlKTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQogICAgaWYgKGN1cnJlbnRDaHVuayAhPT0gJycpIHsKICAgICAgICByZXN1bHQgKz0gbWF5YmVXcmFwSW5Ob3RTZWxlY3Rvcihpc05lZ2F0aXZlTW9kZSwgY3VycmVudENodW5rKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIEdlbmVyYXRlcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtLgogKgogKiBDb21wb25lbnREZWYgYW5kIERpcmVjdGl2ZURlZiBhcmUgZ2VuZXJhdGVkIHdpdGggdGhlIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtIHRvIGF2b2lkIGRvaW5nCiAqIGFkZGl0aW9uYWwgcGFyc2luZyBhdCBydW50aW1lIChmb3IgZXhhbXBsZSwgZm9yIGRpcmVjdGl2ZSBtYXRjaGluZykuIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyAoZm9yCiAqIGV4YW1wbGUsIHdoaWxlIGJvb3RzdHJhcHBpbmcgYSBjb21wb25lbnQpLCBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBzZWxlY3RvciBpcyByZXF1aXJlZCB0byBxdWVyeQogKiBmb3IgdGhlIGhvc3QgZWxlbWVudCBvbiB0aGUgcGFnZS4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcGFyc2VkIGZvcm0gb2YgYSBzZWxlY3RvciBhbmQgcmV0dXJucwogKiBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogKgogKiBAcGFyYW0gez99IHNlbGVjdG9yTGlzdCBzZWxlY3RvciBpbiBwYXJzZWQgZm9ybQogKiBAcmV0dXJuIHs/fSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBzZWxlY3RvcgogKi8KZnVuY3Rpb24gc3RyaW5naWZ5Q1NTU2VsZWN0b3JMaXN0KHNlbGVjdG9yTGlzdCkgewogICAgcmV0dXJuIHNlbGVjdG9yTGlzdC5tYXAoc3RyaW5naWZ5Q1NTU2VsZWN0b3IpLmpvaW4oJywnKTsKfQovKioKICogRXh0cmFjdHMgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBmcm9tIGEgZ2l2ZW4gQ1NTIHNlbGVjdG9yLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hpbGUgY3JlYXRpbmcgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuIEluIHRoaXMgY2FzZSwgdGhlIGhvc3QgZWxlbWVudAogKiAodGhhdCBpcyBjcmVhdGVkIGR5bmFtaWNhbGx5KSBzaG91bGQgY29udGFpbiBhdHRyaWJ1dGVzIGFuZCBjbGFzc2VzIHNwZWNpZmllZCBpbiBjb21wb25lbnQncyBDU1MKICogc2VsZWN0b3IuCiAqCiAqIEBwYXJhbSB7P30gc2VsZWN0b3IgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtIChpbiBhIGZvcm0gb2YgYXJyYXkpCiAqIEByZXR1cm4gez99IG9iamVjdCB3aXRoIGBhdHRyc2AgYW5kIGBjbGFzc2VzYCBmaWVsZHMgdGhhdCBjb250YWluIGV4dHJhY3RlZCBpbmZvcm1hdGlvbgogKi8KZnVuY3Rpb24gZXh0cmFjdEF0dHJzQW5kQ2xhc3Nlc0Zyb21TZWxlY3RvcihzZWxlY3RvcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYXR0cnMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNsYXNzZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi87CiAgICB3aGlsZSAoaSA8IHNlbGVjdG9yLmxlbmd0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWVPck1hcmtlciA9IHNlbGVjdG9yW2ldOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWVPck1hcmtlciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgaWYgKG1vZGUgPT09IDIgLyogQVRUUklCVVRFICovKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVPck1hcmtlciAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKHZhbHVlT3JNYXJrZXIsICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvclsrK2ldKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPT09IDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCh2YWx1ZU9yTWFya2VyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIENzc1NlbGVjdG9yIHNwZWMsIG9uY2Ugd2UgY29tZSBhY3Jvc3MgYFNlbGVjdG9yRmxhZ3MuTk9UYCBmbGFnLCB0aGUgbmVnYXRpdmUKICAgICAgICAgICAgLy8gbW9kZSBpcyBtYWludGFpbmVkIGZvciByZW1haW5pbmcgY2h1bmtzIG9mIGEgc2VsZWN0b3IuIFNpbmNlIGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgYXJlCiAgICAgICAgICAgIC8vIGV4dHJhY3RlZCBvbmx5IGZvciAicG9zaXRpdmUiIHBhcnQgb2YgdGhlIHNlbGVjdG9yLCB3ZSBjYW4gc3RvcCBoZXJlLgogICAgICAgICAgICBpZiAoIWlzUG9zaXRpdmUobW9kZSkpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgbW9kZSA9IHZhbHVlT3JNYXJrZXI7CiAgICAgICAgfQogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiB7IGF0dHJzLCBjbGFzc2VzIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogQSBzcGVjaWFsIHZhbHVlIHdoaWNoIGRlc2lnbmF0ZXMgdGhhdCBhIHZhbHVlIGhhcyBub3QgY2hhbmdlZC4KICogQHR5cGUgez99CiAqLwpjb25zdCBOT19DSEFOR0UgPSAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSA/IHsgX19icmFuZF9fOiAnTk9fQ0hBTkdFJyB9IDogKCgvKiogQHR5cGUgez99ICovICh7fSkpKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC92aWV3X3RyYXZlcnNhbF91dGlscy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogR2V0cyB0aGUgcGFyZW50IExWaWV3IG9mIHRoZSBwYXNzZWQgTFZpZXcsIGlmIHRoZSBQQVJFTlQgaXMgYW4gTENvbnRhaW5lciwgd2lsbCBnZXQgdGhlIHBhcmVudCBvZgogKiB0aGF0IExDb250YWluZXIsIHdoaWNoIGlzIGFuIExWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGxWaWV3IHdob3NlIHBhcmVudCB0byBnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExWaWV3UGFyZW50KGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50ID0gbFZpZXdbUEFSRU5UXTsKICAgIHJldHVybiBpc0xDb250YWluZXIocGFyZW50KSA/ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRbUEFSRU5UXSkpIDogcGFyZW50Owp9Ci8qKgogKiBSZXRyaWV2ZSB0aGUgcm9vdCB2aWV3IGZyb20gYW55IGNvbXBvbmVudCBvciBgTFZpZXdgIGJ5IHdhbGtpbmcgdGhlIHBhcmVudCBgTFZpZXdgIHVudGlsCiAqIHJlYWNoaW5nIHRoZSByb290IGBMVmlld2AuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JMVmlldyBhbnkgY29tcG9uZW50IG9yIGBMVmlld2AKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFJvb3RWaWV3KGNvbXBvbmVudE9yTFZpZXcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGNvbXBvbmVudE9yTFZpZXcsICdjb21wb25lbnQnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBsVmlldyA9IGlzTFZpZXcoY29tcG9uZW50T3JMVmlldykgPyBjb21wb25lbnRPckxWaWV3IDogKC8qKiBAdHlwZSB7P30gKi8gKHJlYWRQYXRjaGVkTFZpZXcoY29tcG9uZW50T3JMVmlldykpKTsKICAgIHdoaWxlIChsVmlldyAmJiAhKGxWaWV3W0ZMQUdTXSAmIDUxMiAvKiBJc1Jvb3QgKi8pKSB7CiAgICAgICAgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TFZpZXdQYXJlbnQobFZpZXcpKSk7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgcmV0dXJuIGxWaWV3Owp9Ci8qKgogKiBSZXR1cm5zIHRoZSBgUm9vdENvbnRleHRgIGluc3RhbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoCiAqIHRoZSBhcHBsaWNhdGlvbiB3aGVyZSB0aGUgdGFyZ2V0IGlzIHNpdHVhdGVkLiBJdCBkb2VzIHRoaXMgYnkgd2Fsa2luZyB0aGUgcGFyZW50IHZpZXdzIHVudGlsIGl0CiAqIGdldHMgdG8gdGhlIHJvb3QgdmlldywgdGhlbiBnZXR0aW5nIHRoZSBjb250ZXh0IG9mZiBvZiB0aGF0LgogKgogKiBAcGFyYW0gez99IHZpZXdPckNvbXBvbmVudCB0aGUgYExWaWV3YCBvciBjb21wb25lbnQgdG8gZ2V0IHRoZSByb290IGNvbnRleHQgZm9yLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Um9vdENvbnRleHQodmlld09yQ29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VmlldyA9IGdldFJvb3RWaWV3KHZpZXdPckNvbXBvbmVudCk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnREZWZpbmVkKHJvb3RWaWV3W0NPTlRFWFRdLCAnUm9vdFZpZXcgaGFzIG5vIGNvbnRleHQuIFBlcmhhcHMgaXQgaXMgZGlzY29ubmVjdGVkPycpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyb290Vmlld1tDT05URVhUXSkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9hZHZhbmNlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZHZhbmNlcyB0byBhbiBlbGVtZW50IGZvciBsYXRlciBiaW5kaW5nIGluc3RydWN0aW9ucy4KICoKICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGluc3RydWN0aW9ucyBsaWtlIHtcQGxpbmsgcHJvcGVydHl9IHRvIGFjdCBvbiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZAogKiBpbmRpY2VzLCBmb3IgZXhhbXBsZSB0aG9zZSBjcmVhdGVkIHdpdGgge1xAbGluayBlbGVtZW50fSBvciB7XEBsaW5rIGVsZW1lbnRTdGFydH0uCiAqCiAqIGBgYHRzCiAqIChyZjogUmVuZGVyRmxhZ3MsIGN0eDogYW55KSA9PiB7CiAqICAgaWYgKHJmICYgMSkgewogKiAgICAgdGV4dCgwLCAnSGVsbG8nKTsKICogICAgIHRleHQoMSwgJ0dvb2RieWUnKQogKiAgICAgZWxlbWVudCgyLCAnZGl2Jyk7CiAqICAgfQogKiAgIGlmIChyZiAmIDIpIHsKICogICAgIGFkdmFuY2UoMik7IC8vIEFkdmFuY2UgdHdpY2UgdG8gdGhlIDxkaXY+LgogKiAgICAgcHJvcGVydHkoJ3RpdGxlJywgJ3Rlc3QnKTsKICogICB9CiAqICB9CiAqIGBgYAogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWx0YSBOdW1iZXIgb2YgZWxlbWVudHMgdG8gYWR2YW5jZSBmb3J3YXJkcyBieS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVhZHZhbmNlKGRlbHRhKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0R3JlYXRlclRoYW4oZGVsdGEsIDAsICdDYW4gb25seSBhZHZhbmNlIGZvcndhcmQnKTsKICAgIHNlbGVjdEluZGV4SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgZ2V0U2VsZWN0ZWRJbmRleCgpICsgZGVsdGEsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKTsKfQovKioKICogU2VsZWN0cyBhbiBlbGVtZW50IGZvciBsYXRlciBiaW5kaW5nIGluc3RydWN0aW9ucy4KICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIGJlaW5nIGdlbmVyYXRlZCwgYnV0IHN0aWxsIHVzZWQgaW4gdW5pdCB0ZXN0cy4KICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzZWxlY3QoaW5kZXgpIHsKICAgIC8vIFRPRE8obWlza28pOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZC4KICAgIHNlbGVjdEluZGV4SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgaW5kZXgsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBjaGVja05vQ2hhbmdlc01vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNlbGVjdEluZGV4SW50ZXJuYWwodFZpZXcsIGxWaWV3LCBpbmRleCwgY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0R3JlYXRlclRoYW4oaW5kZXgsIC0xLCAnSW52YWxpZCBpbmRleCcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCArIEhFQURFUl9PRkZTRVQpOwogICAgLy8gRmx1c2ggdGhlIGluaXRpYWwgaG9va3MgZm9yIGVsZW1lbnRzIGluIHRoZSB2aWV3IHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHVwIHRvIHRoaXMgcG9pbnQuCiAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9va3NJbml0UGhhc2VDb21wbGV0ZWQgPSAobFZpZXdbRkxBR1NdICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLzsKICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVPcmRlckNoZWNrSG9va3MgPSB0Vmlldy5wcmVPcmRlckNoZWNrSG9va3M7CiAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBwcmVPcmRlckNoZWNrSG9va3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVPcmRlckhvb2tzID0gdFZpZXcucHJlT3JkZXJIb29rczsKICAgICAgICAgICAgaWYgKHByZU9yZGVySG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJIb29rcywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8sIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIFdlIG11c3Qgc2V0IHRoZSBzZWxlY3RlZCBpbmRleCAqYWZ0ZXIqIHJ1bm5pbmcgdGhlIGhvb2tzLCBiZWNhdXNlIGhvb2tzIG1heSBoYXZlIHNpZGUtZWZmZWN0cwogICAgLy8gdGhhdCBjYXVzZSBvdGhlciB0ZW1wbGF0ZSBmdW5jdGlvbnMgdG8gcnVuLCB0aHVzIHVwZGF0aW5nIHRoZSBzZWxlY3RlZCBpbmRleCwgd2hpY2ggaXMgZ2xvYmFsCiAgICAvLyBzdGF0ZS4gSWYgd2UgcnVuIGBzZXRTZWxlY3RlZEluZGV4YCAqYmVmb3JlKiB3ZSBydW4gdGhlIGhvb2tzLCBpbiBzb21lIGNhc2VzIHRoZSBzZWxlY3RlZCBpbmRleAogICAgLy8gd2lsbCBiZSBhbHRlcmVkIGJ5IHRoZSB0aW1lIHdlIGxlYXZlIHRoZSBgybXJtWFkdmFuY2VgIGluc3RydWN0aW9uLgogICAgc2V0U2VsZWN0ZWRJbmRleChpbmRleCk7Cn0KLyoqCiAqIE1hcmtzIHRoYXQgdGhlIG5leHQgc3RyaW5nIGlzIGZvciBlbGVtZW50LgogKgogKiBTZWUgYEkxOG5NdXRhdGVPcENvZGVzYCBkb2N1bWVudGF0aW9uLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVMRU1FTlRfTUFSS0VSID0gewogICAgbWFya2VyOiAnZWxlbWVudCcKfTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAovKioKICogTWFya3MgdGhhdCB0aGUgbmV4dCBzdHJpbmcgaXMgZm9yIGNvbW1lbnQuCiAqCiAqIFNlZSBgSTE4bk11dGF0ZU9wQ29kZXNgIGRvY3VtZW50YXRpb24uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ09NTUVOVF9NQVJLRVIgPSB7CiAgICBtYXJrZXI6ICdjb21tZW50Jwp9OwovKioKICogQHBhcmFtIHs/fSBwcmV2CiAqIEBwYXJhbSB7P30gbmV4dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9UU3R5bGluZ1JhbmdlKHByZXYsIG5leHQpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXJJblJhbmdlKHByZXYsIDAsIDMyNzY3IC8qIFVOU0lHTkVEX01BU0sgKi8pOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlckluUmFuZ2UobmV4dCwgMCwgMzI3NjcgLyogVU5TSUdORURfTUFTSyAqLyk7CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChwcmV2IDw8IDE3IC8qIFBSRVZfU0hJRlQgKi8gfCBuZXh0IDw8IDIgLyogTkVYVF9TSElGVCAqLykpKTsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlUHJldih0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpID4+IDE3IC8qIFBSRVZfU0hJRlQgKi8pICYgMzI3NjcgLyogVU5TSUdORURfTUFTSyAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpICYgMiAvKiBQUkVWX0RVUExJQ0FURSAqLykgPT0KICAgICAgICAyIC8qIFBSRVZfRFVQTElDQVRFICovOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHBhcmFtIHs/fSBwcmV2aW91cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZVByZXYodFN0eWxpbmdSYW5nZSwgcHJldmlvdXMpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlckluUmFuZ2UocHJldmlvdXMsIDAsIDMyNzY3IC8qIFVOU0lHTkVEX01BU0sgKi8pOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIH40Mjk0ODM2MjI0IC8qIFBSRVZfTUFTSyAqLykgfAogICAgICAgIChwcmV2aW91cyA8PCAxNyAvKiBQUkVWX1NISUZUICovKSkpKTsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSB8IDIgLyogUFJFVl9EVVBMSUNBVEUgKi8pKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFN0eWxpbmdSYW5nZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICByZXR1cm4gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIDEzMTA2OCAvKiBORVhUX01BU0sgKi8pID4+IDIgLyogTkVYVF9TSElGVCAqLzsKfQovKioKICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAqIEBwYXJhbSB7P30gbmV4dAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSwgbmV4dCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVySW5SYW5nZShuZXh0LCAwLCAzMjc2NyAvKiBVTlNJR05FRF9NQVNLICovKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiB+MTMxMDY4IC8qIE5FWFRfTUFTSyAqLykgfCAvLwogICAgICAgIG5leHQgPDwgMiAvKiBORVhUX1NISUZUICovKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nUmFuZ2UpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgcmV0dXJuICgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiAxIC8qIE5FWFRfRFVQTElDQVRFICovKSA9PT0KICAgICAgICAxIC8qIE5FWFRfRFVQTElDQVRFICovOwp9Ci8qKgogKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nUmFuZ2UpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpIHwgMSAvKiBORVhUX0RVUExJQ0FURSAqLykpKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2RlYnVnX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKiBAcGFyYW0gez99IG9iagogKiBAcGFyYW0gez99IGRlYnVnCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhdHRhY2hEZWJ1Z09iamVjdChvYmosIGRlYnVnKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnZGVidWcnLCB7IHZhbHVlOiBkZWJ1ZywgZW51bWVyYWJsZTogZmFsc2UgfSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2x2aWV3X2RlYnVnLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTkdfREVWX01PREUgPSAoKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8ICEhbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCkpOwovKgogKiBUaGlzIGZpbGUgY29udGFpbnMgY29uZGl0aW9uYWxseSBhdHRhY2hlZCBjbGFzc2VzIHdoaWNoIHByb3ZpZGUgaHVtYW4gcmVhZGFibGUgKGRlYnVnKSBsZXZlbAogKiBpbmZvcm1hdGlvbiBmb3IgYExWaWV3YCwgYExDb250YWluZXJgIGFuZCBvdGhlciBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuIFRoZXNlIGRhdGEgc3RydWN0dXJlcwogKiBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgYXJyYXkgd2hpY2ggbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgZHVyaW5nIGRlYnVnZ2luZyB0byByZWFzb24gYWJvdXQgdGhlCiAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbS4KICoKICogUGF0Y2hpbmcgdGhlIGFycmF5IHdpdGggZXh0cmEgcHJvcGVydHkgZG9lcyBjaGFuZ2UgdGhlIGFycmF5J3MgaGlkZGVuIGNsYXNzJyBidXQgaXQgZG9lcyBub3QKICogY2hhbmdlIHRoZSBjb3N0IG9mIGFjY2VzcywgdGhlcmVmb3JlIHRoaXMgcGF0Y2hpbmcgc2hvdWxkIG5vdCBoYXZlIHNpZ25pZmljYW50IGlmIGFueSBpbXBhY3QgaW4KICogYG5nRGV2TW9kZWAgbW9kZS4gKHNlZTogaHR0cHM6Ly9qc3BlcmYuY29tL2FycmF5LXZzLW1vbmtleS1wYXRjaC1hcnJheSkKICoKICogU28gaW5zdGVhZCBvZiBzZWVpbmc6CiAqIGBgYAogKiBBcnJheSgzMCkgW09iamVjdCwgNjU5LCBudWxsLCDigKZdCiAqIGBgYAogKgogKiBZb3UgZ2V0IHRvIHNlZToKICogYGBgCiAqIExWaWV3RGVidWcgewogKiAgIHZpZXdzOiBbLi4uXSwKICogICBmbGFnczoge2F0dGFjaGVkOiB0cnVlLCAuLi59CiAqICAgbm9kZXM6IFsKICogICAgIHtodG1sOiAnPGRpdiBpZD0iMTIzIj4nLCAuLi4sIG5vZGVzOiBbCiAqICAgICAgIHtodG1sOiAnPHNwYW4+JywgLi4uLCBub2RlczogbnVsbH0KICogICAgIF19CiAqICAgXQogKiB9CiAqIGBgYAogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgTFZJRVdfQ09NUE9ORU5UX0NBQ0hFOwovKiogQHR5cGUgez99ICovCmxldCBMVklFV19FTUJFRERFRF9DQUNIRTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgTFZJRVdfUk9PVDsKLyoqCiAqIFRoaXMgZnVuY3Rpb24gY2xvbmVzIGEgYmx1ZXByaW50IGFuZCBjcmVhdGVzIExWaWV3LgogKgogKiBTaW1wbGUgc2xpY2Ugd2lsbCBrZWVwIHRoZSBzYW1lIHR5cGUsIGFuZCB3ZSBuZWVkIGl0IHRvIGJlIExWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb25lVG9MVmlld0Zyb21UVmlld0JsdWVwcmludCh0VmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVidWdUVmlldyA9ICgvKiogQHR5cGUgez99ICovICh0VmlldykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlld1RvQ2xvbmUoZGVidWdUVmlldy50eXBlLCB0Vmlldy50ZW1wbGF0ZSAmJiB0Vmlldy50ZW1wbGF0ZS5uYW1lKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXcuY29uY2F0KHRWaWV3LmJsdWVwcmludCkpKTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TFZpZXdUb0Nsb25lKHR5cGUsIG5hbWUpIHsKICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMCAvKiBSb290ICovOgogICAgICAgICAgICBpZiAoTFZJRVdfUk9PVCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgTFZJRVdfUk9PVCA9IG5ldyAoY3JlYXRlTmFtZWRBcnJheVR5cGUoJ0xSb290VmlldycpKSgpOwogICAgICAgICAgICByZXR1cm4gTFZJRVdfUk9PVDsKICAgICAgICBjYXNlIDEgLyogQ29tcG9uZW50ICovOgogICAgICAgICAgICBpZiAoTFZJRVdfQ09NUE9ORU5UX0NBQ0hFID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICBMVklFV19DT01QT05FTlRfQ0FDSEUgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbXBvbmVudEFycmF5ID0gTFZJRVdfQ09NUE9ORU5UX0NBQ0hFLmdldChuYW1lKTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudEFycmF5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudEFycmF5ID0gbmV3IChjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENvbXBvbmVudFZpZXcnICsgbmFtZVN1ZmZpeChuYW1lKSkpKCk7CiAgICAgICAgICAgICAgICBMVklFV19DT01QT05FTlRfQ0FDSEUuc2V0KG5hbWUsIGNvbXBvbmVudEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50QXJyYXk7CiAgICAgICAgY2FzZSAyIC8qIEVtYmVkZGVkICovOgogICAgICAgICAgICBpZiAoTFZJRVdfRU1CRURERURfQ0FDSEUgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgIExWSUVXX0VNQkVEREVEX0NBQ0hFID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlbWJlZGRlZEFycmF5ID0gTFZJRVdfRU1CRURERURfQ0FDSEUuZ2V0KG5hbWUpOwogICAgICAgICAgICBpZiAoZW1iZWRkZWRBcnJheSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBlbWJlZGRlZEFycmF5ID0gbmV3IChjcmVhdGVOYW1lZEFycmF5VHlwZSgnTEVtYmVkZGVkVmlldycgKyBuYW1lU3VmZml4KG5hbWUpKSkoKTsKICAgICAgICAgICAgICAgIExWSUVXX0VNQkVEREVEX0NBQ0hFLnNldChuYW1lLCBlbWJlZGRlZEFycmF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZW1iZWRkZWRBcnJheTsKICAgIH0KICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUgY29kZScpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hbWVTdWZmaXgodGV4dCkgewogICAgaWYgKHRleHQgPT0gbnVsbCkKICAgICAgICByZXR1cm4gJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ19UZW1wbGF0ZScpOwogICAgcmV0dXJuICdfJyArIChpbmRleCA9PT0gLTEgPyB0ZXh0IDogdGV4dC5zdWJzdHIoMCwgaW5kZXgpKTsKfQovKioKICogVGhpcyBjbGFzcyBpcyBhIGRlYnVnIHZlcnNpb24gb2YgT2JqZWN0IGxpdGVyYWwgc28gdGhhdCB3ZSBjYW4gaGF2ZSBjb25zdHJ1Y3RvciBuYW1lIHNob3cgdXAKICogaW4KICogZGVidWcgdG9vbHMgaW4gbmdEZXZNb2RlLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFRWaWV3Q29uc3RydWN0b3IgPSBjbGFzcyBUVmlldyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBpZAogICAgICogQHBhcmFtIHs/fSBibHVlcHJpbnQKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAqIEBwYXJhbSB7P30gcXVlcmllcwogICAgICogQHBhcmFtIHs/fSB2aWV3UXVlcnkKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdTdGFydEluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9TdGFydEluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9JbnN0cnVjdGlvbnMKICAgICAqIEBwYXJhbSB7P30gZmlyc3RDcmVhdGVQYXNzCiAgICAgKiBAcGFyYW0gez99IGZpcnN0VXBkYXRlUGFzcwogICAgICogQHBhcmFtIHs/fSBzdGF0aWNWaWV3UXVlcmllcwogICAgICogQHBhcmFtIHs/fSBzdGF0aWNDb250ZW50UXVlcmllcwogICAgICogQHBhcmFtIHs/fSBwcmVPcmRlckhvb2tzCiAgICAgKiBAcGFyYW0gez99IHByZU9yZGVyQ2hlY2tIb29rcwogICAgICogQHBhcmFtIHs/fSBjb250ZW50SG9va3MKICAgICAqIEBwYXJhbSB7P30gY29udGVudENoZWNrSG9va3MKICAgICAqIEBwYXJhbSB7P30gdmlld0hvb2tzCiAgICAgKiBAcGFyYW0gez99IHZpZXdDaGVja0hvb2tzCiAgICAgKiBAcGFyYW0gez99IGRlc3Ryb3lIb29rcwogICAgICogQHBhcmFtIHs/fSBjbGVhbnVwCiAgICAgKiBAcGFyYW0gez99IGNvbnRlbnRRdWVyaWVzCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudHMKICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlUmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gcGlwZVJlZ2lzdHJ5CiAgICAgKiBAcGFyYW0gez99IGZpcnN0Q2hpbGQKICAgICAqIEBwYXJhbSB7P30gc2NoZW1hcwogICAgICogQHBhcmFtIHs/fSBjb25zdHMKICAgICAqLwogICAgY29uc3RydWN0b3IodHlwZSwgLy8KICAgIGlkLCAvLwogICAgYmx1ZXByaW50LCAvLwogICAgdGVtcGxhdGUsIC8vCiAgICBxdWVyaWVzLCAvLwogICAgdmlld1F1ZXJ5LCAvLwogICAgbm9kZSwgLy8KICAgIGRhdGEsIC8vCiAgICBiaW5kaW5nU3RhcnRJbmRleCwgLy8KICAgIGV4cGFuZG9TdGFydEluZGV4LCAvLwogICAgZXhwYW5kb0luc3RydWN0aW9ucywgLy8KICAgIGZpcnN0Q3JlYXRlUGFzcywgLy8KICAgIGZpcnN0VXBkYXRlUGFzcywgLy8KICAgIHN0YXRpY1ZpZXdRdWVyaWVzLCAvLwogICAgc3RhdGljQ29udGVudFF1ZXJpZXMsIC8vCiAgICBwcmVPcmRlckhvb2tzLCAvLwogICAgcHJlT3JkZXJDaGVja0hvb2tzLCAvLwogICAgY29udGVudEhvb2tzLCAvLwogICAgY29udGVudENoZWNrSG9va3MsIC8vCiAgICB2aWV3SG9va3MsIC8vCiAgICB2aWV3Q2hlY2tIb29rcywgLy8KICAgIGRlc3Ryb3lIb29rcywgLy8KICAgIGNsZWFudXAsIC8vCiAgICBjb250ZW50UXVlcmllcywgLy8KICAgIGNvbXBvbmVudHMsIC8vCiAgICBkaXJlY3RpdmVSZWdpc3RyeSwgLy8KICAgIHBpcGVSZWdpc3RyeSwgLy8KICAgIGZpcnN0Q2hpbGQsIC8vCiAgICBzY2hlbWFzLCAvLwogICAgY29uc3RzKSB7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgdGhpcy5ibHVlcHJpbnQgPSBibHVlcHJpbnQ7CiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICAgICAgdGhpcy52aWV3UXVlcnkgPSB2aWV3UXVlcnk7CiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMuYmluZGluZ1N0YXJ0SW5kZXggPSBiaW5kaW5nU3RhcnRJbmRleDsKICAgICAgICB0aGlzLmV4cGFuZG9TdGFydEluZGV4ID0gZXhwYW5kb1N0YXJ0SW5kZXg7CiAgICAgICAgdGhpcy5leHBhbmRvSW5zdHJ1Y3Rpb25zID0gZXhwYW5kb0luc3RydWN0aW9uczsKICAgICAgICB0aGlzLmZpcnN0Q3JlYXRlUGFzcyA9IGZpcnN0Q3JlYXRlUGFzczsKICAgICAgICB0aGlzLmZpcnN0VXBkYXRlUGFzcyA9IGZpcnN0VXBkYXRlUGFzczsKICAgICAgICB0aGlzLnN0YXRpY1ZpZXdRdWVyaWVzID0gc3RhdGljVmlld1F1ZXJpZXM7CiAgICAgICAgdGhpcy5zdGF0aWNDb250ZW50UXVlcmllcyA9IHN0YXRpY0NvbnRlbnRRdWVyaWVzOwogICAgICAgIHRoaXMucHJlT3JkZXJIb29rcyA9IHByZU9yZGVySG9va3M7CiAgICAgICAgdGhpcy5wcmVPcmRlckNoZWNrSG9va3MgPSBwcmVPcmRlckNoZWNrSG9va3M7CiAgICAgICAgdGhpcy5jb250ZW50SG9va3MgPSBjb250ZW50SG9va3M7CiAgICAgICAgdGhpcy5jb250ZW50Q2hlY2tIb29rcyA9IGNvbnRlbnRDaGVja0hvb2tzOwogICAgICAgIHRoaXMudmlld0hvb2tzID0gdmlld0hvb2tzOwogICAgICAgIHRoaXMudmlld0NoZWNrSG9va3MgPSB2aWV3Q2hlY2tIb29rczsKICAgICAgICB0aGlzLmRlc3Ryb3lIb29rcyA9IGRlc3Ryb3lIb29rczsKICAgICAgICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwOwogICAgICAgIHRoaXMuY29udGVudFF1ZXJpZXMgPSBjb250ZW50UXVlcmllczsKICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzOwogICAgICAgIHRoaXMuZGlyZWN0aXZlUmVnaXN0cnkgPSBkaXJlY3RpdmVSZWdpc3RyeTsKICAgICAgICB0aGlzLnBpcGVSZWdpc3RyeSA9IHBpcGVSZWdpc3RyeTsKICAgICAgICB0aGlzLmZpcnN0Q2hpbGQgPSBmaXJzdENoaWxkOwogICAgICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7CiAgICAgICAgdGhpcy5jb25zdHMgPSBjb25zdHM7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgICAgIHByb2Nlc3NUTm9kZUNoaWxkcmVuKHRoaXMuZmlyc3RDaGlsZCwgYnVmKTsKICAgICAgICByZXR1cm4gYnVmLmpvaW4oJycpOwogICAgfQp9OwpjbGFzcyBUTm9kZSQxIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Vmlld18KICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZVN0YXJ0CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUVuZAogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVTdHlsaW5nTGFzdAogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eUJpbmRpbmdzCiAgICAgKiBAcGFyYW0gez99IGZsYWdzCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVySW5kZXhlcwogICAgICogQHBhcmFtIHs/fSB0YWdOYW1lCiAgICAgKiBAcGFyYW0gez99IGF0dHJzCiAgICAgKiBAcGFyYW0gez99IG1lcmdlZEF0dHJzCiAgICAgKiBAcGFyYW0gez99IGxvY2FsTmFtZXMKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbElucHV0cwogICAgICogQHBhcmFtIHs/fSBpbnB1dHMKICAgICAqIEBwYXJhbSB7P30gb3V0cHV0cwogICAgICogQHBhcmFtIHs/fSB0Vmlld3MKICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICogQHBhcmFtIHs/fSBwcm9qZWN0aW9uTmV4dAogICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gcHJvamVjdGlvbgogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEBwYXJhbSB7P30gcmVzaWR1YWxTdHlsZXMKICAgICAqIEBwYXJhbSB7P30gY2xhc3NlcwogICAgICogQHBhcmFtIHs/fSByZXNpZHVhbENsYXNzZXMKICAgICAqIEBwYXJhbSB7P30gY2xhc3NCaW5kaW5ncwogICAgICogQHBhcmFtIHs/fSBzdHlsZUJpbmRpbmdzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRWaWV3XywgLy8KICAgIHR5cGUsIC8vCiAgICBpbmRleCwgLy8KICAgIGluamVjdG9ySW5kZXgsIC8vCiAgICBkaXJlY3RpdmVTdGFydCwgLy8KICAgIGRpcmVjdGl2ZUVuZCwgLy8KICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0LCAvLwogICAgcHJvcGVydHlCaW5kaW5ncywgLy8KICAgIGZsYWdzLCAvLwogICAgcHJvdmlkZXJJbmRleGVzLCAvLwogICAgdGFnTmFtZSwgLy8KICAgIGF0dHJzLCAvLwogICAgbWVyZ2VkQXR0cnMsIC8vCiAgICBsb2NhbE5hbWVzLCAvLwogICAgaW5pdGlhbElucHV0cywgLy8KICAgIGlucHV0cywgLy8KICAgIG91dHB1dHMsIC8vCiAgICB0Vmlld3MsIC8vCiAgICBuZXh0LCAvLwogICAgcHJvamVjdGlvbk5leHQsIC8vCiAgICBjaGlsZCwgLy8KICAgIHBhcmVudCwgLy8KICAgIHByb2plY3Rpb24sIC8vCiAgICBzdHlsZXMsIC8vCiAgICByZXNpZHVhbFN0eWxlcywgLy8KICAgIGNsYXNzZXMsIC8vCiAgICByZXNpZHVhbENsYXNzZXMsIC8vCiAgICBjbGFzc0JpbmRpbmdzLCAvLwogICAgc3R5bGVCaW5kaW5ncykgewogICAgICAgIHRoaXMudFZpZXdfID0gdFZpZXdfOwogICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgICAgIHRoaXMuaW5qZWN0b3JJbmRleCA9IGluamVjdG9ySW5kZXg7CiAgICAgICAgdGhpcy5kaXJlY3RpdmVTdGFydCA9IGRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIHRoaXMuZGlyZWN0aXZlRW5kID0gZGlyZWN0aXZlRW5kOwogICAgICAgIHRoaXMuZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgICAgICB0aGlzLnByb3BlcnR5QmluZGluZ3MgPSBwcm9wZXJ0eUJpbmRpbmdzOwogICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgICAgICB0aGlzLnByb3ZpZGVySW5kZXhlcyA9IHByb3ZpZGVySW5kZXhlczsKICAgICAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwogICAgICAgIHRoaXMuYXR0cnMgPSBhdHRyczsKICAgICAgICB0aGlzLm1lcmdlZEF0dHJzID0gbWVyZ2VkQXR0cnM7CiAgICAgICAgdGhpcy5sb2NhbE5hbWVzID0gbG9jYWxOYW1lczsKICAgICAgICB0aGlzLmluaXRpYWxJbnB1dHMgPSBpbml0aWFsSW5wdXRzOwogICAgICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzOwogICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7CiAgICAgICAgdGhpcy50Vmlld3MgPSB0Vmlld3M7CiAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKICAgICAgICB0aGlzLnByb2plY3Rpb25OZXh0ID0gcHJvamVjdGlvbk5leHQ7CiAgICAgICAgdGhpcy5jaGlsZCA9IGNoaWxkOwogICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgIHRoaXMucHJvamVjdGlvbiA9IHByb2plY3Rpb247CiAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7CiAgICAgICAgdGhpcy5yZXNpZHVhbFN0eWxlcyA9IHJlc2lkdWFsU3R5bGVzOwogICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7CiAgICAgICAgdGhpcy5yZXNpZHVhbENsYXNzZXMgPSByZXNpZHVhbENsYXNzZXM7CiAgICAgICAgdGhpcy5jbGFzc0JpbmRpbmdzID0gY2xhc3NCaW5kaW5nczsKICAgICAgICB0aGlzLnN0eWxlQmluZGluZ3MgPSBzdHlsZUJpbmRpbmdzOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdHlwZV8oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAwIC8qIENvbnRhaW5lciAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLkNvbnRhaW5lcic7CiAgICAgICAgICAgIGNhc2UgMyAvKiBFbGVtZW50ICovOgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuRWxlbWVudCc7CiAgICAgICAgICAgIGNhc2UgNCAvKiBFbGVtZW50Q29udGFpbmVyICovOgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuRWxlbWVudENvbnRhaW5lcic7CiAgICAgICAgICAgIGNhc2UgNSAvKiBJY3VDb250YWluZXIgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gJ1ROb2RlVHlwZS5JY3VDb250YWluZXInOwogICAgICAgICAgICBjYXNlIDEgLyogUHJvamVjdGlvbiAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLlByb2plY3Rpb24nOwogICAgICAgICAgICBjYXNlIDIgLyogVmlldyAqLzoKICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLlZpZXcnOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuPz8/JzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmbGFnc18oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZsYWdzID0gW107CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxNiAvKiBoYXNDbGFzc0lucHV0ICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0NsYXNzSW5wdXQnKTsKICAgICAgICBpZiAodGhpcy5mbGFncyAmIDggLyogaGFzQ29udGVudFF1ZXJ5ICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0NvbnRlbnRRdWVyeScpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgMzIgLyogaGFzU3R5bGVJbnB1dCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5oYXNTdHlsZUlucHV0Jyk7CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovKQogICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0hvc3RCaW5kaW5ncycpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pCiAgICAgICAgICAgIGZsYWdzLnB1c2goJ1ROb2RlRmxhZ3MuaXNDb21wb25lbnRIb3N0Jyk7CiAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxIC8qIGlzRGlyZWN0aXZlSG9zdCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5pc0RpcmVjdGl2ZUhvc3QnKTsKICAgICAgICBpZiAodGhpcy5mbGFncyAmIDY0IC8qIGlzRGV0YWNoZWQgKi8pCiAgICAgICAgICAgIGZsYWdzLnB1c2goJ1ROb2RlRmxhZ3MuaXNEZXRhY2hlZCcpOwogICAgICAgIGlmICh0aGlzLmZsYWdzICYgNCAvKiBpc1Byb2plY3RlZCAqLykKICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5pc1Byb2plY3RlZCcpOwogICAgICAgIHJldHVybiBmbGFncy5qb2luKCd8Jyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJ1ZiA9IFtdOwogICAgICAgIGJ1Zi5wdXNoKCc8JywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8pOwogICAgICAgIGlmICh0aGlzLmF0dHJzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9IHRoaXMuYXR0cnNbaSsrXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXR0ck5hbWUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSsrXTsKICAgICAgICAgICAgICAgIGJ1Zi5wdXNoKCcgJywgKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJOYW1lKSksICc9IicsICgvKiogQHR5cGUgez99ICovIChhdHRyVmFsdWUpKSwgJyInKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBidWYucHVzaCgnPicpOwogICAgICAgIHByb2Nlc3NUTm9kZUNoaWxkcmVuKHRoaXMuY2hpbGQsIGJ1Zik7CiAgICAgICAgYnVmLnB1c2goJzwvJywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8sICc+Jyk7CiAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHN0eWxlQmluZGluZ3NfKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnU3R5bGVCaW5kaW5nKHRoaXMsIGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNsYXNzQmluZGluZ3NfKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnU3R5bGVCaW5kaW5nKHRoaXMsIHRydWUpOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVE5vZGVEZWJ1ZyA9IFROb2RlJDE7Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b0RlYnVnU3R5bGVCaW5kaW5nKHROb2RlLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHREYXRhID0gdE5vZGUudFZpZXdfLmRhdGE7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5ncyA9ICgvKiogQHR5cGUgez99ICovIChbXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmFuZ2UgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5jbGFzc0JpbmRpbmdzIDogdE5vZGUuc3R5bGVCaW5kaW5nczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXYgPSBnZXRUU3R5bGluZ1JhbmdlUHJldihyYW5nZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXh0ID0gZ2V0VFN0eWxpbmdSYW5nZU5leHQocmFuZ2UpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzVGVtcGxhdGUgPSBuZXh0ICE9PSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGN1cnNvciA9IGlzVGVtcGxhdGUgPyBuZXh0IDogcHJldjsKICAgIHdoaWxlIChjdXJzb3IgIT09IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXRlbUtleSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3JdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW1SYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgIGJpbmRpbmdzLnVuc2hpZnQoewogICAgICAgICAgICBrZXk6IGl0ZW1LZXksCiAgICAgICAgICAgIGluZGV4OiBjdXJzb3IsCiAgICAgICAgICAgIGlzVGVtcGxhdGU6IGlzVGVtcGxhdGUsCiAgICAgICAgICAgIHByZXZEdXBsaWNhdGU6IGdldFRTdHlsaW5nUmFuZ2VQcmV2RHVwbGljYXRlKGl0ZW1SYW5nZSksCiAgICAgICAgICAgIG5leHREdXBsaWNhdGU6IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKGl0ZW1SYW5nZSksCiAgICAgICAgICAgIG5leHRJbmRleDogZ2V0VFN0eWxpbmdSYW5nZU5leHQoaXRlbVJhbmdlKSwKICAgICAgICAgICAgcHJldkluZGV4OiBnZXRUU3R5bGluZ1JhbmdlUHJldihpdGVtUmFuZ2UpLAogICAgICAgIH0pOwogICAgICAgIGlmIChjdXJzb3IgPT09IHByZXYpCiAgICAgICAgICAgIGlzVGVtcGxhdGUgPSBmYWxzZTsKICAgICAgICBjdXJzb3IgPSBnZXRUU3R5bGluZ1JhbmdlUHJldihpdGVtUmFuZ2UpOwogICAgfQogICAgYmluZGluZ3MucHVzaCgoaXNDbGFzc0Jhc2VkID8gdE5vZGUucmVzaWR1YWxDbGFzc2VzIDogdE5vZGUucmVzaWR1YWxTdHlsZXMpIHx8IG51bGwpOwogICAgcmV0dXJuIGJpbmRpbmdzOwp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gYnVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwcm9jZXNzVE5vZGVDaGlsZHJlbih0Tm9kZSwgYnVmKSB7CiAgICB3aGlsZSAodE5vZGUpIHsKICAgICAgICBidWYucHVzaCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpKSkpLnRlbXBsYXRlXyk7CiAgICAgICAgdE5vZGUgPSB0Tm9kZS5uZXh0OwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgVFZpZXdEYXRhID0gTkdfREVWX01PREUgJiYgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ1RWaWV3RGF0YScpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFRWSUVXREFUQV9FTVBUWTsKLy8gY2FuJ3QgaW5pdGlhbGl6ZSBoZXJlIG9yIGl0IHdpbGwgbm90IGJlIHRyZWUgc2hha2VuLCBiZWNhdXNlCi8vIGBMVmlld2AgY29uc3RydWN0b3IgY291bGQgaGF2ZSBzaWRlLWVmZmVjdHMuCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGNsb25lcyBhIGJsdWVwcmludCBhbmQgY3JlYXRlcyBURGF0YS4KICoKICogU2ltcGxlIHNsaWNlIHdpbGwga2VlcCB0aGUgc2FtZSB0eXBlLCBhbmQgd2UgbmVlZCBpdCB0byBiZSBURGF0YQogKiBAcGFyYW0gez99IGxpc3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsb25lVG9UVmlld0RhdGEobGlzdCkgewogICAgaWYgKFRWSUVXREFUQV9FTVBUWSA9PT0gdW5kZWZpbmVkKQogICAgICAgIFRWSUVXREFUQV9FTVBUWSA9IG5ldyBUVmlld0RhdGEoKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoVFZJRVdEQVRBX0VNUFRZLmNvbmNhdChsaXN0KSkpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTFZpZXdCbHVlcHJpbnQgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTFZpZXdCbHVlcHJpbnQnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IE1hdGNoZXNBcnJheSA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdNYXRjaGVzQXJyYXknKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRWaWV3Q29tcG9uZW50cyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUVmlld0NvbXBvbmVudHMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlTG9jYWxOYW1lcyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUTm9kZUxvY2FsTmFtZXMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlSW5pdGlhbElucHV0cyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUTm9kZUluaXRpYWxJbnB1dHMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFROb2RlSW5pdGlhbERhdGEgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnVE5vZGVJbml0aWFsRGF0YScpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgTENsZWFudXAgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENsZWFudXAnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRDbGVhbnVwID0gTkdfREVWX01PREUgJiYgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ1RDbGVhbnVwJykgfHwgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKTsKLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGF0dGFjaExWaWV3RGVidWcobFZpZXcpIHsKICAgIGF0dGFjaERlYnVnT2JqZWN0KGxWaWV3LCBuZXcgTFZpZXdEZWJ1ZyhsVmlldykpOwp9Ci8qKgogKiBAcGFyYW0gez99IGxDb250YWluZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGF0dGFjaExDb250YWluZXJEZWJ1ZyhsQ29udGFpbmVyKSB7CiAgICBhdHRhY2hEZWJ1Z09iamVjdChsQ29udGFpbmVyLCBuZXcgTENvbnRhaW5lckRlYnVnKGxDb250YWluZXIpKTsKfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvRGVidWcob2JqKSB7CiAgICBpZiAob2JqKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlYnVnID0gKCgvKiogQHR5cGUgez99ICovIChvYmopKSkuZGVidWc7CiAgICAgICAgYXNzZXJ0RGVmaW5lZChkZWJ1ZywgJ09iamVjdCBkb2VzIG5vdCBoYXZlIGEgZGVidWcgcmVwcmVzZW50YXRpb24uJyk7CiAgICAgICAgcmV0dXJuIGRlYnVnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KfQovKioKICogVXNlIHRoaXMgbWV0aG9kIHRvIHVud3JhcCBhIG5hdGl2ZSBlbGVtZW50IGluIGBMVmlld2AgYW5kIGNvbnZlcnQgaXQgaW50byBIVE1MIGZvciBlYXNpZXIKICogcmVhZGluZy4KICoKICogQHBhcmFtIHs/fSB2YWx1ZSBwb3NzaWJseSB3cmFwcGVkIG5hdGl2ZSBET00gbm9kZS4KICogQHBhcmFtIHs/PX0gaW5jbHVkZUNoaWxkcmVuIElmIGB0cnVlYCB0aGVuIHRoZSBzZXJpYWxpemVkIEhUTUwgZm9ybSB3aWxsIGluY2x1ZGUgY2hpbGQgZWxlbWVudHMKICogKHNhbWUKICogYXMgYG91dGVySFRNTGApLiBJZiBgZmFsc2VgIHRoZW4gdGhlIHNlcmlhbGl6ZWQgSFRNTCBmb3JtIHdpbGwgb25seSBjb250YWluIHRoZSBlbGVtZW50CiAqIGl0c2VsZgogKiAod2lsbCBub3Qgc2VyaWFsaXplIGNoaWxkIGVsZW1lbnRzKS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvSHRtbCh2YWx1ZSwgaW5jbHVkZUNoaWxkcmVuID0gZmFsc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwUk5vZGUodmFsdWUpKSk7CiAgICBpZiAobm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1RleHROb2RlID0gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG91dGVySFRNTCA9IChpc1RleHROb2RlID8gbm9kZS50ZXh0Q29udGVudCA6IG5vZGUub3V0ZXJIVE1MKSB8fCAnJzsKICAgICAgICBpZiAoaW5jbHVkZUNoaWxkcmVuIHx8IGlzVGV4dE5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG91dGVySFRNTDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5uZXJIVE1MID0gJz4nICsgbm9kZS5pbm5lckhUTUwgKyAnPCc7CiAgICAgICAgICAgIHJldHVybiAob3V0ZXJIVE1MLnNwbGl0KGlubmVySFRNTClbMF0pICsgJz4nOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CmNsYXNzIExWaWV3RGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yYXdfbFZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3Jhd19sVmlldykgewogICAgICAgIHRoaXMuX3Jhd19sVmlldyA9IF9yYXdfbFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIEZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYExWaWV3YCB1bnBhY2tlZCBpbnRvIGEgbW9yZSByZWFkYWJsZSBzdGF0ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBmbGFncygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmxhZ3MgPSB0aGlzLl9yYXdfbFZpZXdbRkxBR1NdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIF9fcmF3X19mbGFnc19fOiBmbGFncywKICAgICAgICAgICAgaW5pdFBoYXNlU3RhdGU6IGZsYWdzICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8sCiAgICAgICAgICAgIGNyZWF0aW9uTW9kZTogISEoZmxhZ3MgJiA0IC8qIENyZWF0aW9uTW9kZSAqLyksCiAgICAgICAgICAgIGZpcnN0Vmlld1Bhc3M6ICEhKGZsYWdzICYgOCAvKiBGaXJzdExWaWV3UGFzcyAqLyksCiAgICAgICAgICAgIGNoZWNrQWx3YXlzOiAhIShmbGFncyAmIDE2IC8qIENoZWNrQWx3YXlzICovKSwKICAgICAgICAgICAgZGlydHk6ICEhKGZsYWdzICYgNjQgLyogRGlydHkgKi8pLAogICAgICAgICAgICBhdHRhY2hlZDogISEoZmxhZ3MgJiAxMjggLyogQXR0YWNoZWQgKi8pLAogICAgICAgICAgICBkZXN0cm95ZWQ6ICEhKGZsYWdzICYgMjU2IC8qIERlc3Ryb3llZCAqLyksCiAgICAgICAgICAgIGlzUm9vdDogISEoZmxhZ3MgJiA1MTIgLyogSXNSb290ICovKSwKICAgICAgICAgICAgaW5kZXhXaXRoaW5Jbml0UGhhc2U6IGZsYWdzID4+IDEwIC8qIEluZGV4V2l0aGluSW5pdFBoYXNlU2hpZnQgKi8sCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHBhcmVudCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbUEFSRU5UXSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBob3N0KCkgewogICAgICAgIHJldHVybiB0b0h0bWwodGhpcy5fcmF3X2xWaWV3W0hPU1RdLCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGh0bWwoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLm5vZGVzIHx8IFtdKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZSA9PiB0b0h0bWwobm9kZS5uYXRpdmUsIHRydWUpKSkuam9pbignJyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250ZXh0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbQ09OVEVYVF07CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB0cmVlIG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgTFZpZXdgLiBUaGUgbm9kZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgaW50bwogICAgICogYQogICAgICogdHJlZSBzdHJ1Y3R1cmUgd2l0aCByZWxldmFudCBkZXRhaWxzIHB1bGxlZCBvdXQgZm9yIHJlYWRhYmlsaXR5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IG5vZGVzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IHRoaXMuX3Jhd19sVmlldzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgICAgICByZXR1cm4gdG9EZWJ1Z05vZGVzKHROb2RlLCBsVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCB0VmlldygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W1RWSUVXXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNsZWFudXAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tDTEVBTlVQXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbSU5KRUNUT1IkMV07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCByZW5kZXJlckZhY3RvcnkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tSRU5ERVJFUl9GQUNUT1JZXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJlbmRlcmVyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbUkVOREVSRVJdOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgc2FuaXRpemVyKCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbU0FOSVRJWkVSXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNoaWxkSGVhZCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbQ0hJTERfSEVBRF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbmV4dCgpIHsKICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbTkVYVF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgY2hpbGRUYWlsKCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sVmlld1tDSElMRF9UQUlMXSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkZWNsYXJhdGlvblZpZXcoKSB7CiAgICAgICAgcmV0dXJuIHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHF1ZXJpZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tRVUVSSUVTXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHRIb3N0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbVF9IT1NUXTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplZCB2aWV3IG9mIGNoaWxkIHZpZXdzIChhbmQgY29udGFpbmVycykgYXR0YWNoZWQgYXQgdGhpcyBsb2NhdGlvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjaGlsZFZpZXdzKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGlsZFZpZXdzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRIZWFkOwogICAgICAgIHdoaWxlIChjaGlsZCkgewogICAgICAgICAgICBjaGlsZFZpZXdzLnB1c2goY2hpbGQpOwogICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaGlsZFZpZXdzOwogICAgfQp9Ci8qKgogKiBUdXJucyBhIGZsYXQgbGlzdCBvZiBub2RlcyBpbnRvIGEgdHJlZSBieSB3YWxraW5nIHRoZSBhc3NvY2lhdGVkIGBUTm9kZWAgdHJlZS4KICoKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b0RlYnVnTm9kZXModE5vZGUsIGxWaWV3KSB7CiAgICBpZiAodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVidWdOb2RlcyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGVDdXJzb3IgPSB0Tm9kZTsKICAgICAgICB3aGlsZSAodE5vZGVDdXJzb3IpIHsKICAgICAgICAgICAgZGVidWdOb2Rlcy5wdXNoKGJ1aWxkRGVidWdOb2RlKHROb2RlQ3Vyc29yLCBsVmlldywgdE5vZGVDdXJzb3IuaW5kZXgpKTsKICAgICAgICAgICAgdE5vZGVDdXJzb3IgPSB0Tm9kZUN1cnNvci5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVidWdOb2RlczsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJ1aWxkRGVidWdOb2RlKHROb2RlLCBsVmlldywgbm9kZUluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByYXdWYWx1ZSA9IGxWaWV3W25vZGVJbmRleF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmUgPSB1bndyYXBSTm9kZShyYXdWYWx1ZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRMVmlld0RlYnVnID0gdG9EZWJ1ZyhyZWFkTFZpZXdWYWx1ZShyYXdWYWx1ZSkpOwogICAgcmV0dXJuIHsKICAgICAgICBodG1sOiB0b0h0bWwobmF0aXZlKSwKICAgICAgICBuYXRpdmU6ICgvKiogQHR5cGUgez99ICovIChuYXRpdmUpKSwKICAgICAgICBub2RlczogdG9EZWJ1Z05vZGVzKHROb2RlLmNoaWxkLCBsVmlldyksCiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRMVmlld0RlYnVnLAogICAgfTsKfQpjbGFzcyBMQ29udGFpbmVyRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9yYXdfbENvbnRhaW5lcgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmF3X2xDb250YWluZXIpIHsKICAgICAgICB0aGlzLl9yYXdfbENvbnRhaW5lciA9IF9yYXdfbENvbnRhaW5lcjsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGFjdGl2ZUluZGV4KCkgewogICAgICAgIHJldHVybiBnZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgodGhpcy5fcmF3X2xDb250YWluZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaGFzVHJhbnNwbGFudGVkVmlld3MoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLl9yYXdfbENvbnRhaW5lcltBQ1RJVkVfSU5ERVhdICYgMSAvKiBIQVNfVFJBTlNQTEFOVEVEX1ZJRVdTICovKSA9PT0KICAgICAgICAgICAgMSAvKiBIQVNfVFJBTlNQTEFOVEVEX1ZJRVdTICovOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgdmlld3MoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyLnNsaWNlKENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKQogICAgICAgICAgICAubWFwKCgvKiogQHR5cGUgez99ICovICh0b0RlYnVnKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgcGFyZW50KCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW1BBUkVOVF0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbW92ZWRWaWV3cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbTU9WRURfVklFV1NdOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaG9zdCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbSE9TVF07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuYXRpdmUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW05BVElWRV07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuZXh0KCkgewogICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW05FWFRdKTsKICAgIH0KfQovKioKICogUmV0dXJuIGFuIGBMVmlld2AgdmFsdWUgaWYgZm91bmQuCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgYExWaWV3YCBpZiBhbnkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlYWRMVmlld1ZhbHVlKHZhbHVlKSB7CiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5vdCBxdWl0ZSByaWdodCwgYXMgaXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgYFN0eWxpbmdDb250ZXh0YAogICAgICAgIC8vIFRoaXMgaXMgd2h5IGl0IGlzIGluIGRlYnVnLCBub3QgaW4gdXRpbC50cwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gSEVBREVSX09GRlNFVCAtIDEpCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICB2YWx1ZSA9IHZhbHVlW0hPU1RdOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KY2xhc3MgSTE4TkRlYnVnSXRlbSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX19yYXdfb3BDb2RlCiAgICAgKiBAcGFyYW0gez99IF9sVmlldwogICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfX3Jhd19vcENvZGUsIF9sVmlldywgbm9kZUluZGV4LCB0eXBlKSB7CiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGUgPSBfX3Jhd19vcENvZGU7CiAgICAgICAgdGhpcy5fbFZpZXcgPSBfbFZpZXc7CiAgICAgICAgdGhpcy5ub2RlSW5kZXggPSBub2RlSW5kZXg7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHROb2RlKCkgewogICAgICAgIHJldHVybiBnZXRUTm9kZSh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMubm9kZUluZGV4KTsKICAgIH0KfQovKioKICogVHVybnMgYSBsaXN0IG9mICJDcmVhdGUiICYgIlVwZGF0ZSIgT3BDb2RlcyBpbnRvIGEgaHVtYW4tcmVhZGFibGUgbGlzdCBvZiBvcGVyYXRpb25zIGZvcgogKiBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAqIEBwYXJhbSB7P30gbXV0YXRlT3BDb2RlcyBtdXRhdGlvbiBvcENvZGVzIHRvIHJlYWQKICogQHBhcmFtIHs/fSB1cGRhdGVPcENvZGVzIHVwZGF0ZSBvcENvZGVzIHRvIHJlYWQKICogQHBhcmFtIHs/fSBpY3VzIGxpc3Qgb2YgSUNVIGV4cHJlc3Npb25zCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdGhlIG9wQ29kZXMgYXJlIGFjdGluZyBvbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXR0YWNoSTE4bk9wQ29kZXNEZWJ1ZyhtdXRhdGVPcENvZGVzLCB1cGRhdGVPcENvZGVzLCBpY3VzLCBsVmlldykgewogICAgYXR0YWNoRGVidWdPYmplY3QobXV0YXRlT3BDb2RlcywgbmV3IEkxOG5NdXRhdGVPcENvZGVzRGVidWcobXV0YXRlT3BDb2RlcywgbFZpZXcpKTsKICAgIGF0dGFjaERlYnVnT2JqZWN0KHVwZGF0ZU9wQ29kZXMsIG5ldyBJMThuVXBkYXRlT3BDb2Rlc0RlYnVnKHVwZGF0ZU9wQ29kZXMsIGljdXMsIGxWaWV3KSk7CiAgICBpZiAoaWN1cykgewogICAgICAgIGljdXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpY3UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGljdSA9PiB7CiAgICAgICAgICAgIGljdS5jcmVhdGUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWN1Q2FzZSA9PiB7CiAgICAgICAgICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChpY3VDYXNlLCBuZXcgSTE4bk11dGF0ZU9wQ29kZXNEZWJ1ZyhpY3VDYXNlLCBsVmlldykpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGljdS51cGRhdGUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWN1Q2FzZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWN1Q2FzZSA9PiB7CiAgICAgICAgICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChpY3VDYXNlLCBuZXcgSTE4blVwZGF0ZU9wQ29kZXNEZWJ1ZyhpY3VDYXNlLCBpY3VzLCBsVmlldykpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSkpOwogICAgfQp9CmNsYXNzIEkxOG5NdXRhdGVPcENvZGVzRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fcmF3X29wQ29kZXMKICAgICAqIEBwYXJhbSB7P30gX19sVmlldwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfX3Jhd19vcENvZGVzLCBfX2xWaWV3KSB7CiAgICAgICAgdGhpcy5fX3Jhd19vcENvZGVzID0gX19yYXdfb3BDb2RlczsKICAgICAgICB0aGlzLl9fbFZpZXcgPSBfX2xWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBBIGxpc3Qgb2Ygb3BlcmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgT3BDb2RlcyB3aWxsIGFjdCBvbiB0aGUgdmlldy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBvcGVyYXRpb25zKCkgewogICAgICAgIGNvbnN0IHsgX19sVmlldywgX19yYXdfb3BDb2RlcyB9ID0gdGhpczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgX19yYXdfb3BDb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wQ29kZSA9IF9fcmF3X29wQ29kZXNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NyZWF0ZSBUZXh0IE5vZGUnLAogICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleDogX19yYXdfb3BDb2Rlc1srK2ldLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IG9wQ29kZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Ob2RlSW5kZXggPSBvcENvZGUgPj4+IDE3IC8qIFNISUZUX1BBUkVOVCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBkZXN0aW5hdGlvbk5vZGVJbmRleCwgJ0FwcGVuZENoaWxkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBTZWxlY3QgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBub2RlSW5kZXgsICdTZWxlY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1IC8qIEVsZW1lbnRFbmQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRJbmRleCA9IG9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgZWxlbWVudEluZGV4LCAnRWxlbWVudEVuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQgLyogQXR0ciAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBlbGVtZW50SW5kZXgsICdBdHRyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnYXR0ck5hbWUnXSA9IF9fcmF3X29wQ29kZXNbKytpXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydhdHRyVmFsdWUnXSA9IF9fcmF3X29wQ29kZXNbKytpXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAob3BDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBDT01NRU5UX01BUktFUjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ09NTUVOVF9NQVJLRVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudFZhbHVlOiBfX3Jhd19vcENvZGVzWysraV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXg6IF9fcmF3X29wQ29kZXNbKytpXSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBFTEVNRU5UX01BUktFUjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRUxFTUVOVF9NQVJLRVInLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVbmtub3duIE9wIENvZGUnLAogICAgICAgICAgICAgICAgICAgIGNvZGU6IG9wQ29kZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQp9CmNsYXNzIEkxOG5VcGRhdGVPcENvZGVzRGVidWcgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fcmF3X29wQ29kZXMKICAgICAqIEBwYXJhbSB7P30gaWN1cwogICAgICogQHBhcmFtIHs/fSBfX2xWaWV3CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9fcmF3X29wQ29kZXMsIGljdXMsIF9fbFZpZXcpIHsKICAgICAgICB0aGlzLl9fcmF3X29wQ29kZXMgPSBfX3Jhd19vcENvZGVzOwogICAgICAgIHRoaXMuaWN1cyA9IGljdXM7CiAgICAgICAgdGhpcy5fX2xWaWV3ID0gX19sVmlldzsKICAgIH0KICAgIC8qKgogICAgICogQSBsaXN0IG9mIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIE9wQ29kZXMgd2lsbCBhY3Qgb24gdGhlIHZpZXcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb3BlcmF0aW9ucygpIHsKICAgICAgICBjb25zdCB7IF9fbFZpZXcsIF9fcmF3X29wQ29kZXMsIGljdXMgfSA9IHRoaXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9fcmF3X29wQ29kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gYml0IGNvZGUgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGFwcGx5IHRoZSBuZXh0IHVwZGF0ZQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNoZWNrQml0ID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbaV0pKTsKICAgICAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXMKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBza2lwQ29kZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlID0gJyc7CiAgICAgICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8PSAoaSArIHNraXBDb2Rlcyk7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3BDb2RlID0gX19yYXdfb3BDb2Rlc1tqXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BDb2RlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IG9wQ29kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3BDb2RlIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgYmluZGluZyBpbmRleCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3Qga25vdyB0aGUgdmFsdWUgb2YgdGhlIGJpbmRpbmcgc28gd2Ugb25seSBzaG93IHRoZSBpbmRleAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBg77+9JHstb3BDb2RlIC0gMX3vv71gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3BDb2RlICYgMyAvKiBNQVNLX09QQ09ERSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbKytqXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYW5pdGl6ZUZuID0gX19yYXdfb3BDb2Rlc1srK2pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0F0dHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuaXRpemVGbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBUZXh0ICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0JpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIC8qIEljdVN3aXRjaCAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljdSA9ICgvKiogQHR5cGUgez99ICovIChpY3VzKSlbdEljdUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1U3dpdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1SW5kZXgnXSA9IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ21haW5CaW5kaW5nJ10gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3UnXSA9IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogSWN1VXBkYXRlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovIChfX3Jhd19vcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1VXBkYXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1SW5kZXgnXSA9IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3UnXSA9IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSBza2lwQ29kZXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zaGFyZWQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY29uc3QgybUwJDQgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+IFByb21pc2UucmVzb2x2ZShudWxsKTsKLyoqCiAqIEEgcGVybWFuZW50IG1hcmtlciBwcm9taXNlIHdoaWNoIHNpZ25pZmllcyB0aGF0IHRoZSBjdXJyZW50IENEIHRyZWUgaXMKICogY2xlYW4uCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgX0NMRUFOX1BST01JU0UgPSAoKMm1MCQ0KSkoKTsKLyoqCiAqIFByb2Nlc3MgdGhlIGBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zYC4gKEV4ZWN1dGUgdGhlIGBob3N0QmluZGluZ3NgLikKICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGNvbnRhaW5pbmcgdGhlIGBleHBhbmRvSW5zdHJ1Y3Rpb25zYAogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBgVFZpZXdgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0U2FtZSh0VmlldywgbFZpZXdbVFZJRVddLCAnYExWaWV3YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBgVFZpZXdgIScpOwogICAgdHJ5IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhwYW5kb0luc3RydWN0aW9ucyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7CiAgICAgICAgaWYgKGV4cGFuZG9JbnN0cnVjdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYmluZGluZ1Jvb3RJbmRleCA9IHRWaWV3LmV4cGFuZG9TdGFydEluZGV4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjdXJyZW50RGlyZWN0aXZlSW5kZXggPSAtMTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY3VycmVudEVsZW1lbnRJbmRleCA9IC0xOwogICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogUEVSRiBJdCBpcyBwb3NzaWJsZSB0byBnZXQgaGVyZSB3aXRoIGBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zYCBjb250YWluaW5nIG5vCiAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyB0byBleGVjdXRlLiBUaGlzIGlzIHdhc3RlZnVsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gYmUgZG9uZSwgYnV0IHdlIHN0aWxsIG5lZWQKICAgICAgICAgICAgLy8gdG8gaXRlcmF0ZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMuCiAgICAgICAgICAgIC8vIEluIGV4YW1wbGUgb2YgdGhpcyBpcyBpbiB0aGlzIHRlc3Q6IGBob3N0X2JpbmRpbmdfc3BlYy50c2AKICAgICAgICAgICAgLy8gYGZpdCgnc2hvdWxkIG5vdCBjYXVzZSBwcm9ibGVtcyBpZiBkZXRlY3RDaGFuZ2VzIGlzIGNhbGxlZCB3aGVuIGEgcHJvcGVydHkgdXBkYXRlcycsIC4uLmAKICAgICAgICAgICAgLy8gSW4gdGhlIGFib3ZlIHRlc3Qgd2UgZ2V0IGhlcmUgd2l0aCBleHBhbmRvIFswLCAwLCAxXSB3aGljaCByZXF1aXJlcyBhIGxvdCBvZiBwcm9jZXNzaW5nIGJ1dAogICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBmdW5jdGlvbiB0byBleGVjdXRlLgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZG9JbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluc3RydWN0aW9uID0gZXhwYW5kb0luc3RydWN0aW9uc1tpXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgbnVtYmVycyBtZWFuIHRoYXQgd2UgYXJlIHN0YXJ0aW5nIG5ldyBFWFBBTkRPIGJsb2NrIGFuZCBuZWVkIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBkaXJlY3RpdmUgaW5kZXguCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEltcG9ydGFudDogSW4gSlMgYC14YCBhbmQgYDAteGAgaXMgbm90IHRoZSBzYW1lISBJZiBgeD09PTBgIHRoZW4gYC14YCB3aWxsIHByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYC0wYCB3aGljaCByZXF1aXJlcyBub24gc3RhbmRhcmQgbWF0aCBhcml0aG1ldGljIGFuZCBpdCBjYW4gcHJldmVudCBWTSBvcHRpbWl6YXRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiBQRVJGIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gdXNlIGB+aW5zdHJ1Y3Rpb25gIGFzIHRoYXQgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VmZmVyIGZyb20gYC0wYCBhbmQgaXQgaXMgZmFzdGVyL21vcmUgY29tcGFjdC4KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRJbmRleCA9IDAgLSBpbnN0cnVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChjdXJyZW50RWxlbWVudEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0b3IgYmxvY2sgYW5kIHByb3ZpZGVycyBhcmUgdGFrZW4gaW50byBhY2NvdW50LgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyQ291bnQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGV4cGFuZG9JbnN0cnVjdGlvbnNbKytpXSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ1Jvb3RJbmRleCArPSBJTkpFQ1RPUl9CTE9PTV9QQVJFTlRfU0laRSArIHByb3ZpZGVyQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGJpbmRpbmdSb290SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciB0aGUgaW5qZWN0b3Igc2l6ZSAoc28gdGhlIGJpbmRpbmcgcm9vdCBjYW4gc2tpcCBvdmVyIGRpcmVjdGl2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGdldCB0byB0aGUgZmlyc3Qgc2V0IG9mIGhvc3QgYmluZGluZ3Mgb24gdGhpcyBub2RlKSBvciB0aGUgaG9zdCB2YXIgY291bnQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRvIGdldCB0byB0aGUgbmV4dCBzZXQgb2YgaG9zdCBiaW5kaW5ncyBvbiB0aGlzIG5vZGUpLgogICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nUm9vdEluZGV4ICs9IGluc3RydWN0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGEgbnVtYmVyLCBpdCdzIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpbmRpbmdSb290Rm9ySG9zdEJpbmRpbmdzKGJpbmRpbmdSb290SW5kZXgsIGN1cnJlbnREaXJlY3RpdmVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdEN0eCA9IGxWaWV3W2N1cnJlbnREaXJlY3RpdmVJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uKDIgLyogVXBkYXRlICovLCBob3N0Q3R4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IFBFUkYgUmVseWluZyBvbiBpbmNyZW1lbnRpbmcgdGhlIGBjdXJyZW50RGlyZWN0aXZlSW5kZXhgIGhlcmUgaXMKICAgICAgICAgICAgICAgICAgICAvLyBzdWItb3B0aW1hbC4gVGhlIGltcGxpY2F0aW9ucyBhcmUgdGhhdCBpZiB3ZSBoYXZlIGEgbG90IG9mIGRpcmVjdGl2ZXMgYnV0IG5vbmUgb2YgdGhlbQogICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgaG9zdCBiaW5kaW5ncyB3ZSBuZXZlcnRoZWxlc3MgbmVlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGV4cGFuZG8gaW5zdHJ1Y3Rpb25zIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBjb3VudGVyLiBJdCB3b3VsZCBiZSBtdWNoIGJldHRlciBpZiB3ZSBjb3VsZCBlbmNvZGUgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gYGN1cnJlbnREaXJlY3RpdmVJbmRleGAgaW50byB0aGUgYGV4cGFuZG9JbnN0cnVjdGlvbmAgYXJyYXkgc28gdGhhdCB3ZSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhvc2UgZGlyZWN0aXZlcyB3aGljaCBhY3R1YWxseSBoYXZlIGBob3N0QmluZGluZ3NgLgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICB9Cn0KLyoqCiAqIFJlZnJlc2hlcyBhbGwgY29udGVudCBxdWVyaWVzIGRlY2xhcmVkIGJ5IGRpcmVjdGl2ZXMgaW4gYSBnaXZlbiB2aWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmcmVzaENvbnRlbnRRdWVyaWVzKHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGVudFF1ZXJpZXMgPSB0Vmlldy5jb250ZW50UXVlcmllczsKICAgIGlmIChjb250ZW50UXVlcmllcyAhPT0gbnVsbCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudFF1ZXJpZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBxdWVyeVN0YXJ0SWR4ID0gY29udGVudFF1ZXJpZXNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmSWR4ID0gY29udGVudFF1ZXJpZXNbaSArIDFdOwogICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmSWR4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbZGlyZWN0aXZlRGVmSWR4XSkpOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChkaXJlY3RpdmVEZWYuY29udGVudFF1ZXJpZXMsICdjb250ZW50UXVlcmllcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgc2V0Q3VycmVudFF1ZXJ5SW5kZXgocXVlcnlTdGFydElkeCk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyZWN0aXZlRGVmLmNvbnRlbnRRdWVyaWVzKSkoMiAvKiBVcGRhdGUgKi8sIGxWaWV3W2RpcmVjdGl2ZURlZklkeF0sIGRpcmVjdGl2ZURlZklkeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFJlZnJlc2hlcyBjaGlsZCBjb21wb25lbnRzIGluIHRoZSBjdXJyZW50IHZpZXcgKHVwZGF0ZSBtb2RlKS4KICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICogQHBhcmFtIHs/fSBjb21wb25lbnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoQ2hpbGRDb21wb25lbnRzKGhvc3RMVmlldywgY29tcG9uZW50cykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVmcmVzaENvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudHNbaV0pOwogICAgfQp9Ci8qKgogKiBSZW5kZXJzIGNoaWxkIGNvbXBvbmVudHMgaW4gdGhlIGN1cnJlbnQgdmlldyAoY3JlYXRpb24gbW9kZSkuCiAqIEBwYXJhbSB7P30gaG9zdExWaWV3CiAqIEBwYXJhbSB7P30gY29tcG9uZW50cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVuZGVyQ2hpbGRDb21wb25lbnRzKGhvc3RMVmlldywgY29tcG9uZW50cykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcmVuZGVyQ29tcG9uZW50KGhvc3RMVmlldywgY29tcG9uZW50c1tpXSk7CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYSBuYXRpdmUgZWxlbWVudCBmcm9tIGEgdGFnIG5hbWUsIHVzaW5nIGEgcmVuZGVyZXIuCiAqIEBwYXJhbSB7P30gbmFtZSB0aGUgdGFnIG5hbWUKICogQHBhcmFtIHs/fSByZW5kZXJlciBBIHJlbmRlcmVyIHRvIHVzZQogKiBAcGFyYW0gez99IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSB0aGUgZWxlbWVudCBjcmVhdGVkCiAqLwpmdW5jdGlvbiBlbGVtZW50Q3JlYXRlKG5hbWUsIHJlbmRlcmVyLCBuYW1lc3BhY2UpIHsKICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICByZXR1cm4gcmVuZGVyZXIuY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PT0gbnVsbCA/IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQobmFtZSkgOgogICAgICAgICAgICByZW5kZXJlci5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwYXJlbnRMVmlldwogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gY29udGV4dAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gaG9zdAogKiBAcGFyYW0gez99IHRIb3N0Tm9kZQogKiBAcGFyYW0gez89fSByZW5kZXJlckZhY3RvcnkKICogQHBhcmFtIHs/PX0gcmVuZGVyZXIKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyCiAqIEBwYXJhbSB7Pz19IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVMVmlldyhwYXJlbnRMVmlldywgdFZpZXcsIGNvbnRleHQsIGZsYWdzLCBob3N0LCB0SG9zdE5vZGUsIHJlbmRlcmVyRmFjdG9yeSwgcmVuZGVyZXIsIHNhbml0aXplciwgaW5qZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gbmdEZXZNb2RlID8gY2xvbmVUb0xWaWV3RnJvbVRWaWV3Qmx1ZXByaW50KHRWaWV3KSA6ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5ibHVlcHJpbnQuc2xpY2UoKSkpOwogICAgbFZpZXdbSE9TVF0gPSBob3N0OwogICAgbFZpZXdbRkxBR1NdID0gZmxhZ3MgfCA0IC8qIENyZWF0aW9uTW9kZSAqLyB8IDEyOCAvKiBBdHRhY2hlZCAqLyB8IDggLyogRmlyc3RMVmlld1Bhc3MgKi87CiAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTsKICAgIGxWaWV3W1BBUkVOVF0gPSBsVmlld1tERUNMQVJBVElPTl9WSUVXXSA9IHBhcmVudExWaWV3OwogICAgbFZpZXdbQ09OVEVYVF0gPSBjb250ZXh0OwogICAgbFZpZXdbUkVOREVSRVJfRkFDVE9SWV0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKHJlbmRlcmVyRmFjdG9yeSB8fCBwYXJlbnRMVmlldyAmJiBwYXJlbnRMVmlld1tSRU5ERVJFUl9GQUNUT1JZXSkpKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldLCAnUmVuZGVyZXJGYWN0b3J5IGlzIHJlcXVpcmVkJyk7CiAgICBsVmlld1tSRU5ERVJFUl0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKHJlbmRlcmVyIHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1JFTkRFUkVSXSkpKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxWaWV3W1JFTkRFUkVSXSwgJ1JlbmRlcmVyIGlzIHJlcXVpcmVkJyk7CiAgICBsVmlld1tTQU5JVElaRVJdID0gc2FuaXRpemVyIHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1NBTklUSVpFUl0gfHwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIGxWaWV3WygvKiogQHR5cGUgez99ICovIChJTkpFQ1RPUiQxKSldID0gaW5qZWN0b3IgfHwgcGFyZW50TFZpZXcgJiYgcGFyZW50TFZpZXdbSU5KRUNUT1IkMV0gfHwgbnVsbDsKICAgIGxWaWV3W1RfSE9TVF0gPSB0SG9zdE5vZGU7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbCh0Vmlldy50eXBlID09IDIgLyogRW1iZWRkZWQgKi8gPyBwYXJlbnRMVmlldyAhPT0gbnVsbCA6IHRydWUsIHRydWUsICdFbWJlZGRlZCB2aWV3cyBtdXN0IGhhdmUgcGFyZW50TFZpZXcnKTsKICAgIGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXSA9CiAgICAgICAgdFZpZXcudHlwZSA9PSAyIC8qIEVtYmVkZGVkICovID8gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudExWaWV3KSlbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddIDogbFZpZXc7CiAgICBuZ0Rldk1vZGUgJiYgYXR0YWNoTFZpZXdEZWJ1ZyhsVmlldyk7CiAgICByZXR1cm4gbFZpZXc7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0SG9zdE5vZGUKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIHRIb3N0Tm9kZSwgaW5kZXgsIHR5cGUsIG5hbWUsIGF0dHJzKSB7CiAgICAvLyBLZWVwIHRoaXMgZnVuY3Rpb24gc2hvcnQsIHNvIHRoYXQgdGhlIFZNIHdpbGwgaW5saW5lIGl0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKSB8fAogICAgICAgIGNyZWF0ZVROb2RlQXRJbmRleCh0VmlldywgdEhvc3ROb2RlLCBhZGp1c3RlZEluZGV4LCB0eXBlLCBuYW1lLCBhdHRycyk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIHRydWUpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdEhvc3ROb2RlCiAqIEBwYXJhbSB7P30gYWRqdXN0ZWRJbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZVROb2RlQXRJbmRleCh0VmlldywgdEhvc3ROb2RlLCBhZGp1c3RlZEluZGV4LCB0eXBlLCBuYW1lLCBhdHRycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1BhcmVudCA9IGdldElzUGFyZW50KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnQgPSBpc1BhcmVudCA/IHByZXZpb3VzT3JQYXJlbnRUTm9kZSA6IHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50OwogICAgLy8gUGFyZW50cyBjYW5ub3QgY3Jvc3MgY29tcG9uZW50IGJvdW5kYXJpZXMgYmVjYXVzZSBjb21wb25lbnRzIHdpbGwgYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMsCiAgICAvLyBzbyBpdCdzIG9ubHkgc2V0IGlmIHRoZSB2aWV3IGlzIHRoZSBzYW1lLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50SW5TYW1lVmlldyA9IHBhcmVudCAmJiBwYXJlbnQgIT09IHRIb3N0Tm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRQYXJlbnROb2RlID0gcGFyZW50SW5TYW1lVmlldyA/ICgvKiogQHR5cGUgez99ICovIChwYXJlbnQpKSA6IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGNyZWF0ZVROb2RlKHRWaWV3LCB0UGFyZW50Tm9kZSwgdHlwZSwgYWRqdXN0ZWRJbmRleCwgbmFtZSwgYXR0cnMpOwogICAgLy8gQXNzaWduIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgbm9kZSBvZiBhIGdpdmVuIHZpZXcuIFRoZSBmaXJzdCBub2RlIGlzIG5vdCBhbHdheXMgdGhlIG9uZQogICAgLy8gYXQgaW5kZXggMCwgaW4gY2FzZSBvZiBpMThuLCBpbmRleCAwIGNhbiBiZSB0aGUgaW5zdHJ1Y3Rpb24gYGkxOG5TdGFydGAgYW5kIHRoZSBmaXJzdCBub2RlIGhhcwogICAgLy8gdGhlIGluZGV4IDEgb3IgbW9yZSwgc28gd2UgY2FuJ3QganVzdCBjaGVjayBub2RlIGluZGV4LgogICAgaWYgKHRWaWV3LmZpcnN0Q2hpbGQgPT09IG51bGwpIHsKICAgICAgICB0Vmlldy5maXJzdENoaWxkID0gdE5vZGU7CiAgICB9CiAgICBpZiAocHJldmlvdXNPclBhcmVudFROb2RlKSB7CiAgICAgICAgaWYgKGlzUGFyZW50ICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5jaGlsZCA9PSBudWxsICYmCiAgICAgICAgICAgICh0Tm9kZS5wYXJlbnQgIT09IG51bGwgfHwgcHJldmlvdXNPclBhcmVudFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykpIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBzYW1lIHZpZXcsIHdoaWNoIG1lYW5zIHdlIGFyZSBhZGRpbmcgY29udGVudCBub2RlIHRvIHRoZSBwYXJlbnQgdmlldy4KICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlLmNoaWxkID0gdE5vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFpc1BhcmVudCkgewogICAgICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IHROb2RlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiB0Tm9kZTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHRQYXJlbnROb2RlCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzaWduVFZpZXdOb2RlVG9MVmlldyh0VmlldywgdFBhcmVudE5vZGUsIGluZGV4LCBsVmlldykgewogICAgLy8gVmlldyBub2RlcyBhcmUgbm90IHN0b3JlZCBpbiBkYXRhIGJlY2F1c2UgdGhleSBjYW4gYmUgYWRkZWQgLyByZW1vdmVkIGF0IHJ1bnRpbWUgKHdoaWNoCiAgICAvLyB3b3VsZCBjYXVzZSBpbmRpY2VzIHRvIGNoYW5nZSkuIFRoZWlyIFROb2RlcyBhcmUgaW5zdGVhZCBzdG9yZWQgaW4gdFZpZXcubm9kZS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0Tm9kZSA9IHRWaWV3Lm5vZGU7CiAgICBpZiAodE5vZGUgPT0gbnVsbCkgewogICAgICAgIG5nRGV2TW9kZSAmJiB0UGFyZW50Tm9kZSAmJgogICAgICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHRQYXJlbnROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovKTsKICAgICAgICB0Vmlldy5ub2RlID0gdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlVE5vZGUodFZpZXcsICgvKiogQHR5cGUgez99ICovICh0UGFyZW50Tm9kZSkpLCAvLwogICAgICAgIDIgLyogVmlldyAqLywgaW5kZXgsIG51bGwsIG51bGwpKSk7CiAgICB9CiAgICByZXR1cm4gbFZpZXdbVF9IT1NUXSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwp9Ci8qKgogKiBXaGVuIGVsZW1lbnRzIGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5IGFmdGVyIGEgdmlldyBibHVlcHJpbnQgaXMgY3JlYXRlZCAoZS5nLiB0aHJvdWdoCiAqIGkxOG5BcHBseSgpIG9yIENvbXBvbmVudEZhY3RvcnkuY3JlYXRlKSwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIGJsdWVwcmludCBmb3IgZnV0dXJlCiAqIHRlbXBsYXRlIHBhc3Nlcy4KICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGFzc29jaWF0ZWQgd2l0aCBgTFZpZXdgCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBudW1TbG90c1RvQWxsb2MgVGhlIG51bWJlciBvZiBzbG90cyB0byBhbGxvYyBpbiB0aGUgTFZpZXcsIHNob3VsZCBiZSA+MAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWxsb2NFeHBhbmRvKHRWaWV3LCBsVmlldywgbnVtU2xvdHNUb0FsbG9jKSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRHcmVhdGVyVGhhbihudW1TbG90c1RvQWxsb2MsIDAsICdUaGUgbnVtYmVyIG9mIHNsb3RzIHRvIGFsbG9jIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCcpOwogICAgaWYgKG51bVNsb3RzVG9BbGxvYyA+IDApIHsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2xvdHNUb0FsbG9jOyBpKyspIHsKICAgICAgICAgICAgICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgdFZpZXcuZGF0YS5wdXNoKG51bGwpOwogICAgICAgICAgICAgICAgbFZpZXcucHVzaChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBpbmNyZW1lbnQgdGhlIGV4cGFuZG8gc3RhcnQgaW5kZXggaWYgdGhlcmUgYXJlbid0IGFscmVhZHkgZGlyZWN0aXZlcwogICAgICAgICAgICAvLyBhbmQgaW5qZWN0b3JzIHNhdmVkIGluIHRoZSAiZXhwYW5kbyIgc2VjdGlvbgogICAgICAgICAgICBpZiAoIXRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRWaWV3LmV4cGFuZG9TdGFydEluZGV4ICs9IG51bVNsb3RzVG9BbGxvYzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlJ3JlIGFkZGluZyB0aGUgZHluYW1pYyBub2RlcyBpbnRvIHRoZSBleHBhbmRvIHNlY3Rpb24sIHdlIG5lZWQgdG8gbGV0IHRoZSBob3N0CiAgICAgICAgICAgICAgICAvLyBiaW5kaW5ncyBrbm93IHRoYXQgdGhleSBzaG91bGQgc2tpcCB4IHNsb3RzCiAgICAgICAgICAgICAgICB0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zLnB1c2gobnVtU2xvdHNUb0FsbG9jKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vIFJlbmRlcgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovKioKICogUHJvY2Vzc2VzIGEgdmlldyBpbiB0aGUgY3JlYXRpb24gbW9kZS4gVGhpcyBpbmNsdWRlcyBhIG51bWJlciBvZiBzdGVwcyBpbiBhIHNwZWNpZmljIG9yZGVyOgogKiAtIGNyZWF0aW5nIHZpZXcgcXVlcnkgZnVuY3Rpb25zIChpZiBhbnkpOwogKiAtIGV4ZWN1dGluZyBhIHRlbXBsYXRlIGZ1bmN0aW9uIGluIHRoZSBjcmVhdGlvbiBtb2RlOwogKiAtIHVwZGF0aW5nIHN0YXRpYyBxdWVyaWVzIChpZiBhbnkpOwogKiAtIGNyZWF0aW5nIGNoaWxkIGNvbXBvbmVudHMgZGVmaW5lZCBpbiBhIGdpdmVuIHZpZXcuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwoaXNDcmVhdGlvbk1vZGUobFZpZXcpLCB0cnVlLCAnU2hvdWxkIGJlIHJ1biBpbiBjcmVhdGlvbiBtb2RlJyk7CiAgICBlbnRlclZpZXcobFZpZXcsIGxWaWV3W1RfSE9TVF0pOwogICAgdHJ5IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld1F1ZXJ5ID0gdFZpZXcudmlld1F1ZXJ5OwogICAgICAgIGlmICh2aWV3UXVlcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgZXhlY3V0ZVZpZXdRdWVyeUZuKDEgLyogQ3JlYXRlICovLCB2aWV3UXVlcnksIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICAvLyBFeGVjdXRlIGEgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldywgaWYgaXQgZXhpc3RzLiBBIHRlbXBsYXRlIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZQogICAgICAgIC8vIGRlZmluZWQgZm9yIHRoZSByb290IGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGVGbiA9IHRWaWV3LnRlbXBsYXRlOwogICAgICAgIGlmICh0ZW1wbGF0ZUZuICE9PSBudWxsKSB7CiAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIDEgLyogQ3JlYXRlICovLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIGNoaWxkcmVuIGFyZSBwcm9jZXNzZWQgdG8gc3VwcG9ydCByZWN1cnNpdmUgY29tcG9uZW50cy4KICAgICAgICAvLyBUaGlzIG11c3QgYmUgc2V0IHRvIGZhbHNlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCBjcmVhdGlvbiBydW4gYmVjYXVzZSBpbiBhbgogICAgICAgIC8vIG5nRm9yIGxvb3AsIGFsbCB0aGUgdmlld3Mgd2lsbCBiZSBjcmVhdGVkIHRvZ2V0aGVyIGJlZm9yZSB1cGRhdGUgbW9kZSBydW5zIGFuZCB0dXJucwogICAgICAgIC8vIG9mZiBmaXJzdENyZWF0ZVBhc3MuIElmIHdlIGRvbid0IHNldCBpdCBoZXJlLCBpbnN0YW5jZXMgd2lsbCBwZXJmb3JtIGRpcmVjdGl2ZQogICAgICAgIC8vIG1hdGNoaW5nLCBldGMgYWdhaW4gYW5kIGFnYWluLgogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgdFZpZXcuZmlyc3RDcmVhdGVQYXNzID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFdlIHJlc29sdmUgY29udGVudCBxdWVyaWVzIHNwZWNpZmljYWxseSBtYXJrZWQgYXMgYHN0YXRpY2AgaW4gY3JlYXRpb24gbW9kZS4gRHluYW1pYwogICAgICAgIC8vIGNvbnRlbnQgcXVlcmllcyBhcmUgcmVzb2x2ZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gKGkuZS4gdXBkYXRlIG1vZGUpLCBhZnRlciBlbWJlZGRlZAogICAgICAgIC8vIHZpZXdzIGFyZSByZWZyZXNoZWQgKHNlZSBibG9jayBhYm92ZSkuCiAgICAgICAgaWYgKHRWaWV3LnN0YXRpY0NvbnRlbnRRdWVyaWVzKSB7CiAgICAgICAgICAgIHJlZnJlc2hDb250ZW50UXVlcmllcyh0VmlldywgbFZpZXcpOwogICAgICAgIH0KICAgICAgICAvLyBXZSBtdXN0IG1hdGVyaWFsaXplIHF1ZXJ5IHJlc3VsdHMgYmVmb3JlIGNoaWxkIGNvbXBvbmVudHMgYXJlIHByb2Nlc3NlZAogICAgICAgIC8vIGluIGNhc2UgYSBjaGlsZCBjb21wb25lbnQgaGFzIHByb2plY3RlZCBhIGNvbnRhaW5lci4gVGhlIExDb250YWluZXIgbmVlZHMKICAgICAgICAvLyB0byBleGlzdCBzbyB0aGUgZW1iZWRkZWQgdmlld3MgYXJlIHByb3Blcmx5IGF0dGFjaGVkIGJ5IHRoZSBjb250YWluZXIuCiAgICAgICAgaWYgKHRWaWV3LnN0YXRpY1ZpZXdRdWVyaWVzKSB7CiAgICAgICAgICAgIGV4ZWN1dGVWaWV3UXVlcnlGbigyIC8qIFVwZGF0ZSAqLywgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnZpZXdRdWVyeSkpLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLy8gUmVuZGVyIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRWaWV3LmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVuZGVyQ2hpbGRDb21wb25lbnRzKGxWaWV3LCBjb21wb25lbnRzKTsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBsVmlld1tGTEFHU10gJj0gfjQgLyogQ3JlYXRpb25Nb2RlICovOwogICAgICAgIGxlYXZlVmlldygpOwogICAgfQp9Ci8qKgogKiBQcm9jZXNzZXMgYSB2aWV3IGluIHVwZGF0ZSBtb2RlLiBUaGlzIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN0ZXBzIGluIGEgc3BlY2lmaWMgb3JkZXI6CiAqIC0gZXhlY3V0aW5nIGEgdGVtcGxhdGUgZnVuY3Rpb24gaW4gdXBkYXRlIG1vZGU7CiAqIC0gZXhlY3V0aW5nIGhvb2tzOwogKiAtIHJlZnJlc2hpbmcgcXVlcmllczsKICogLSBzZXR0aW5nIGhvc3QgYmluZGluZ3M7CiAqIC0gcmVmcmVzaGluZyBjaGlsZCAoZW1iZWRkZWQgYW5kIGNvbXBvbmVudCkgdmlld3MuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoVmlldyh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGNvbnRleHQpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShsVmlldyksIGZhbHNlLCAnU2hvdWxkIGJlIHJ1biBpbiB1cGRhdGUgbW9kZScpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmxhZ3MgPSBsVmlld1tGTEFHU107CiAgICBpZiAoKGZsYWdzICYgMjU2IC8qIERlc3Ryb3llZCAqLykgPT09IDI1NiAvKiBEZXN0cm95ZWQgKi8pCiAgICAgICAgcmV0dXJuOwogICAgZW50ZXJWaWV3KGxWaWV3LCBsVmlld1tUX0hPU1RdKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNoZWNrTm9DaGFuZ2VzTW9kZSA9IGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpOwogICAgdHJ5IHsKICAgICAgICByZXNldFByZU9yZGVySG9va0ZsYWdzKGxWaWV3KTsKICAgICAgICBzZXRCaW5kaW5nSW5kZXgodFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgpOwogICAgICAgIGlmICh0ZW1wbGF0ZUZuICE9PSBudWxsKSB7CiAgICAgICAgICAgIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIDIgLyogVXBkYXRlICovLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvb2tzSW5pdFBoYXNlQ29tcGxldGVkID0gKGZsYWdzICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLzsKICAgICAgICAvLyBleGVjdXRlIHByZS1vcmRlciBob29rcyAoT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2spCiAgICAgICAgLy8gUEVSRiBXQVJOSU5HOiBkbyBOT1QgZXh0cmFjdCB0aGlzIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gd2l0aG91dCBydW5uaW5nIGJlbmNobWFya3MKICAgICAgICBpZiAoIWNoZWNrTm9DaGFuZ2VzTW9kZSkgewogICAgICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVyQ2hlY2tIb29rcyA9IHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRlQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJDaGVja0hvb2tzLCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVySG9va3MgPSB0Vmlldy5wcmVPcmRlckhvb2tzOwogICAgICAgICAgICAgICAgaWYgKHByZU9yZGVySG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRlSW5pdEFuZENoZWNrSG9va3MobFZpZXcsIHByZU9yZGVySG9va3MsIDAgLyogT25Jbml0SG9va3NUb0JlUnVuICovLCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluY3JlbWVudEluaXRQaGFzZUZsYWdzKGxWaWV3LCAwIC8qIE9uSW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVmcmVzaER5bmFtaWNFbWJlZGRlZFZpZXdzKGxWaWV3KTsKICAgICAgICAvLyBDb250ZW50IHF1ZXJ5IHJlc3VsdHMgbXVzdCBiZSByZWZyZXNoZWQgYmVmb3JlIGNvbnRlbnQgaG9va3MgYXJlIGNhbGxlZC4KICAgICAgICBpZiAodFZpZXcuY29udGVudFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVmcmVzaENvbnRlbnRRdWVyaWVzKHRWaWV3LCBsVmlldyk7CiAgICAgICAgfQogICAgICAgIC8vIGV4ZWN1dGUgY29udGVudCBob29rcyAoQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCkKICAgICAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGVudENoZWNrSG9va3MgPSB0Vmlldy5jb250ZW50Q2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmIChjb250ZW50Q2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBjb250ZW50Q2hlY2tIb29rcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SG9va3MgPSB0Vmlldy5jb250ZW50SG9va3M7CiAgICAgICAgICAgICAgICBpZiAoY29udGVudEhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCBjb250ZW50SG9va3MsIDEgLyogQWZ0ZXJDb250ZW50SW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMSAvKiBBZnRlckNvbnRlbnRJbml0SG9va3NUb0JlUnVuICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGxWaWV3KTsKICAgICAgICAvLyBSZWZyZXNoIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRWaWV3LmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmVmcmVzaENoaWxkQ29tcG9uZW50cyhsVmlldywgY29tcG9uZW50cyk7CiAgICAgICAgfQogICAgICAgIC8vIFZpZXcgcXVlcmllcyBtdXN0IGV4ZWN1dGUgYWZ0ZXIgcmVmcmVzaGluZyBjaGlsZCBjb21wb25lbnRzIGJlY2F1c2UgYSB0ZW1wbGF0ZSBpbiB0aGlzIHZpZXcKICAgICAgICAvLyBjb3VsZCBiZSBpbnNlcnRlZCBpbiBhIGNoaWxkIGNvbXBvbmVudC4gSWYgdGhlIHZpZXcgcXVlcnkgZXhlY3V0ZXMgYmVmb3JlIGNoaWxkIGNvbXBvbmVudAogICAgICAgIC8vIHJlZnJlc2gsIHRoZSB0ZW1wbGF0ZSBtaWdodCBub3QgeWV0IGJlIGluc2VydGVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3UXVlcnkgPSB0Vmlldy52aWV3UXVlcnk7CiAgICAgICAgaWYgKHZpZXdRdWVyeSAhPT0gbnVsbCkgewogICAgICAgICAgICBleGVjdXRlVmlld1F1ZXJ5Rm4oMiAvKiBVcGRhdGUgKi8sIHZpZXdRdWVyeSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8vIGV4ZWN1dGUgdmlldyBob29rcyAoQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCkKICAgICAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgdmlld0NoZWNrSG9va3MgPSB0Vmlldy52aWV3Q2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmICh2aWV3Q2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCB2aWV3Q2hlY2tIb29rcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3SG9va3MgPSB0Vmlldy52aWV3SG9va3M7CiAgICAgICAgICAgICAgICBpZiAodmlld0hvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCB2aWV3SG9va3MsIDIgLyogQWZ0ZXJWaWV3SW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMiAvKiBBZnRlclZpZXdJbml0SG9va3NUb0JlUnVuICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzID09PSB0cnVlKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugb25seSBmbGlwIHRoZSBmbGFnIG9uIHN1Y2Nlc3NmdWwgYHJlZnJlc2hWaWV3YCBvbmx5CiAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgaW4gYGZpbmFsbHlgIGJsb2NrLgogICAgICAgICAgICAvLyBJZiB3ZSBkaWQgdGhpcyBpbiBgZmluYWxseWAgYmxvY2sgdGhlbiBhbiBleGNlcHRpb24gY291bGQgYmxvY2sgdGhlIGV4ZWN1dGlvbiBvZiBzdHlsaW5nCiAgICAgICAgICAgIC8vIGluc3RydWN0aW9ucyB3aGljaCBpbiB0dXJuIHdvdWxkIGJlIHVuYWJsZSB0byBpbnNlcnQgdGhlbXNlbHZlcyBpbnRvIHRoZSBzdHlsaW5nIGxpbmtlZAogICAgICAgICAgICAvLyBsaXN0LiBUaGUgcmVzdWx0IG9mIHRoaXMgd291bGQgYmUgdGhhdCBpZiB0aGUgZXhjZXB0aW9uIHdvdWxkIG5vdCBiZSB0aHJvdyBvbiBzdWJzZXF1ZW50IENECiAgICAgICAgICAgIC8vIHRoZSBzdHlsaW5nIHdvdWxkIGJlIHVuYWJsZSB0byBwcm9jZXNzIGl0IGRhdGEgYW5kIHJlZmxlY3QgdG8gdGhlIERPTS4KICAgICAgICAgICAgdFZpZXcuZmlyc3RVcGRhdGVQYXNzID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIERvIG5vdCByZXNldCB0aGUgZGlydHkgc3RhdGUgd2hlbiBydW5uaW5nIGluIGNoZWNrIG5vIGNoYW5nZXMgbW9kZS4gV2UgZG9uJ3Qgd2FudCBjb21wb25lbnRzCiAgICAgICAgLy8gdG8gYmVoYXZlIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIGNoZWNrIG5vIGNoYW5nZXMgaXMgZW5hYmxlZCBvciBub3QuIEZvciBleGFtcGxlOgogICAgICAgIC8vIE1hcmtpbmcgYW4gT25QdXNoIGNvbXBvbmVudCBhcyBkaXJ0eSBmcm9tIHdpdGhpbiB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgaG9vayBpbiBvcmRlciB0bwogICAgICAgIC8vIHJlZnJlc2ggYSBgTmdDbGFzc2AgYmluZGluZyBzaG91bGQgd29yay4gSWYgd2Ugd291bGQgcmVzZXQgdGhlIGRpcnR5IHN0YXRlIGluIHRoZSBjaGVjawogICAgICAgIC8vIG5vIGNoYW5nZXMgY3ljbGUsIHRoZSBjb21wb25lbnQgd291bGQgYmUgbm90IGJlIGRpcnR5IGZvciB0aGUgbmV4dCB1cGRhdGUgcGFzcy4gVGhpcyB3b3VsZAogICAgICAgIC8vIGJlIGRpZmZlcmVudCBpbiBwcm9kdWN0aW9uIG1vZGUgd2hlcmUgdGhlIGNvbXBvbmVudCBkaXJ0eSBzdGF0ZSBpcyBub3QgcmVzZXQuCiAgICAgICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAgICAgbFZpZXdbRkxBR1NdICY9IH4oNjQgLyogRGlydHkgKi8gfCA4IC8qIEZpcnN0TFZpZXdQYXNzICovKTsKICAgICAgICB9CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBsZWF2ZVZpZXcoKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudE9yVGVtcGxhdGUodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlckZhY3RvcnkgPSBsVmlld1tSRU5ERVJFUl9GQUNUT1JZXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vcm1hbEV4ZWN1dGlvblBhdGggPSAhZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjcmVhdGlvbk1vZGVJc0FjdGl2ZSA9IGlzQ3JlYXRpb25Nb2RlKGxWaWV3KTsKICAgIHRyeSB7CiAgICAgICAgaWYgKG5vcm1hbEV4ZWN1dGlvblBhdGggJiYgIWNyZWF0aW9uTW9kZUlzQWN0aXZlICYmIHJlbmRlcmVyRmFjdG9yeS5iZWdpbikgewogICAgICAgICAgICByZW5kZXJlckZhY3RvcnkuYmVnaW4oKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNyZWF0aW9uTW9kZUlzQWN0aXZlKSB7CiAgICAgICAgICAgIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChub3JtYWxFeGVjdXRpb25QYXRoICYmICFjcmVhdGlvbk1vZGVJc0FjdGl2ZSAmJiByZW5kZXJlckZhY3RvcnkuZW5kKSB7CiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICogQHBhcmFtIHs/fSByZgogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIHJmLCBjb250ZXh0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2U2VsZWN0ZWRJbmRleCA9IGdldFNlbGVjdGVkSW5kZXgoKTsKICAgIHRyeSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICAgICAgaWYgKHJmICYgMiAvKiBVcGRhdGUgKi8gJiYgbFZpZXcubGVuZ3RoID4gSEVBREVSX09GRlNFVCkgewogICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHVwZGF0aW5nLCBpbmhlcmVudGx5IHNlbGVjdCAwIHNvIHdlIGRvbid0CiAgICAgICAgICAgIC8vIGhhdmUgdG8gZ2VuZXJhdGUgdGhhdCBpbnN0cnVjdGlvbiBmb3IgbW9zdCB1cGRhdGUgYmxvY2tzLgogICAgICAgICAgICBzZWxlY3RJbmRleEludGVybmFsKHRWaWV3LCBsVmlldywgMCwgZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCkpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZUZuKHJmLCBjb250ZXh0KTsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHNldFNlbGVjdGVkSW5kZXgocHJldlNlbGVjdGVkSW5kZXgpOwogICAgfQp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8gRWxlbWVudAovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KSB7CiAgICBpZiAoaXNDb250ZW50UXVlcnlIb3N0KHROb2RlKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAgICAgZm9yIChsZXQgZGlyZWN0aXZlSW5kZXggPSBzdGFydDsgZGlyZWN0aXZlSW5kZXggPCBlbmQ7IGRpcmVjdGl2ZUluZGV4KyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtkaXJlY3RpdmVJbmRleF0pKTsKICAgICAgICAgICAgaWYgKGRlZi5jb250ZW50UXVlcmllcykgewogICAgICAgICAgICAgICAgZGVmLmNvbnRlbnRRdWVyaWVzKDEgLyogQ3JlYXRlICovLCBsVmlld1tkaXJlY3RpdmVJbmRleF0sIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQ3JlYXRlcyBkaXJlY3RpdmUgaW5zdGFuY2VzLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKSB7CiAgICBpZiAoIWdldEJpbmRpbmdzRW5hYmxlZCgpKQogICAgICAgIHJldHVybjsKICAgIGluc3RhbnRpYXRlQWxsRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpOwogICAgaWYgKCh0Tm9kZS5mbGFncyAmIDEyOCAvKiBoYXNIb3N0QmluZGluZ3MgKi8pID09PSAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovKSB7CiAgICAgICAgaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgIH0KfQovKioKICogVGFrZXMgYSBsaXN0IG9mIGxvY2FsIG5hbWVzIGFuZCBpbmRpY2VzIGFuZCBwdXNoZXMgdGhlIHJlc29sdmVkIGxvY2FsIHZhcmlhYmxlIHZhbHVlcwogKiB0byBMVmlldyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFyZSBsb2FkZWQgaW4gdGhlIHRlbXBsYXRlIHdpdGggbG9hZCgpLgogKiBAcGFyYW0gez99IHZpZXdEYXRhCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/PX0gbG9jYWxSZWZFeHRyYWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YSh2aWV3RGF0YSwgdE5vZGUsIGxvY2FsUmVmRXh0cmFjdG9yID0gZ2V0TmF0aXZlQnlUTm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXM7CiAgICBpZiAobG9jYWxOYW1lcyAhPT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbG9jYWxJbmRleCA9IHROb2RlLmluZGV4ICsgMTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChsb2NhbE5hbWVzW2kgKyAxXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IC0xID8KICAgICAgICAgICAgICAgIGxvY2FsUmVmRXh0cmFjdG9yKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCB2aWV3RGF0YSkgOgogICAgICAgICAgICAgICAgdmlld0RhdGFbaW5kZXhdOwogICAgICAgICAgICB2aWV3RGF0YVtsb2NhbEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBHZXRzIFRWaWV3IGZyb20gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBvciBjcmVhdGVzIGEgbmV3IFRWaWV3CiAqIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KICoKICogQHBhcmFtIHs/fSBkZWYgQ29tcG9uZW50RGVmCiAqIEByZXR1cm4gez99IFRWaWV3CiAqLwpmdW5jdGlvbiBnZXRPckNyZWF0ZVRDb21wb25lbnRWaWV3KGRlZikgewogICAgcmV0dXJuIGRlZi50VmlldyB8fAogICAgICAgIChkZWYudFZpZXcgPSBjcmVhdGVUVmlldygxIC8qIENvbXBvbmVudCAqLywgLTEsIGRlZi50ZW1wbGF0ZSwgZGVmLmRlY2xzLCBkZWYudmFycywgZGVmLmRpcmVjdGl2ZURlZnMsIGRlZi5waXBlRGVmcywgZGVmLnZpZXdRdWVyeSwgZGVmLnNjaGVtYXMsIGRlZi5jb25zdHMpKTsKfQovKioKICogQ3JlYXRlcyBhIFRWaWV3IGluc3RhbmNlCiAqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IHZpZXdJbmRleCBUaGUgdmlld0Jsb2NrSWQgZm9yIGlubGluZSB2aWV3cywgb3IgLTEgaWYgaXQncyBhIGNvbXBvbmVudC9keW5hbWljCiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbiBUZW1wbGF0ZSBmdW5jdGlvbgogKiBAcGFyYW0gez99IGRlY2xzIFRoZSBudW1iZXIgb2Ygbm9kZXMsIGxvY2FsIHJlZnMsIGFuZCBwaXBlcyBpbiB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gdmFycwogKiBAcGFyYW0gez99IGRpcmVjdGl2ZXMgUmVnaXN0cnkgb2YgZGlyZWN0aXZlcyBmb3IgdGhpcyB2aWV3CiAqIEBwYXJhbSB7P30gcGlwZXMgUmVnaXN0cnkgb2YgcGlwZXMgZm9yIHRoaXMgdmlldwogKiBAcGFyYW0gez99IHZpZXdRdWVyeSBWaWV3IHF1ZXJpZXMgZm9yIHRoaXMgdmlldwogKiBAcGFyYW0gez99IHNjaGVtYXMgU2NoZW1hcyBmb3IgdGhpcyB2aWV3CiAqIEBwYXJhbSB7P30gY29uc3RzIENvbnN0YW50cyBmb3IgdGhpcyB2aWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVUVmlldyh0eXBlLCB2aWV3SW5kZXgsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCBkaXJlY3RpdmVzLCBwaXBlcywgdmlld1F1ZXJ5LCBzY2hlbWFzLCBjb25zdHMpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUudFZpZXcrKzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdTdGFydEluZGV4ID0gSEVBREVSX09GRlNFVCArIGRlY2xzOwogICAgLy8gVGhpcyBsZW5ndGggZG9lcyBub3QgeWV0IGNvbnRhaW4gaG9zdCBiaW5kaW5ncyBmcm9tIGNoaWxkIGRpcmVjdGl2ZXMgYmVjYXVzZSBhdCB0aGlzIHBvaW50LAogICAgLy8gd2UgZG9uJ3Qga25vdyB3aGljaCBkaXJlY3RpdmVzIGFyZSBhY3RpdmUgb24gdGhpcyB0ZW1wbGF0ZS4gQXMgc29vbiBhcyBhIGRpcmVjdGl2ZSBpcyBtYXRjaGVkCiAgICAvLyB0aGF0IGhhcyBhIGhvc3QgYmluZGluZywgd2Ugd2lsbCB1cGRhdGUgdGhlIGJsdWVwcmludCB3aXRoIHRoYXQgZGVmJ3MgaG9zdFZhcnMgY291bnQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbml0aWFsVmlld0xlbmd0aCA9IGJpbmRpbmdTdGFydEluZGV4ICsgdmFyczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJsdWVwcmludCA9IGNyZWF0ZVZpZXdCbHVlcHJpbnQoYmluZGluZ1N0YXJ0SW5kZXgsIGluaXRpYWxWaWV3TGVuZ3RoKTsKICAgIHJldHVybiBibHVlcHJpbnRbKC8qKiBAdHlwZSB7P30gKi8gKFRWSUVXKSldID0gbmdEZXZNb2RlID8KICAgICAgICBuZXcgVFZpZXdDb25zdHJ1Y3Rvcih0eXBlLCB2aWV3SW5kZXgsIC8vIGlkOiBudW1iZXIsCiAgICAgICAgYmx1ZXByaW50LCAvLyBibHVlcHJpbnQ6IExWaWV3LAogICAgICAgIHRlbXBsYXRlRm4sIC8vIHRlbXBsYXRlOiBDb21wb25lbnRUZW1wbGF0ZTx7fT58bnVsbCwKICAgICAgICBudWxsLCAvLyBxdWVyaWVzOiBUUXVlcmllc3xudWxsCiAgICAgICAgdmlld1F1ZXJ5LCAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLCAvLyBub2RlOiBUVmlld05vZGV8VEVsZW1lbnROb2RlfG51bGwsCiAgICAgICAgY2xvbmVUb1RWaWV3RGF0YShibHVlcHJpbnQpLmZpbGwobnVsbCwgYmluZGluZ1N0YXJ0SW5kZXgpLCAvLyBkYXRhOiBURGF0YSwKICAgICAgICBiaW5kaW5nU3RhcnRJbmRleCwgLy8gYmluZGluZ1N0YXJ0SW5kZXg6IG51bWJlciwKICAgICAgICBpbml0aWFsVmlld0xlbmd0aCwgLy8gZXhwYW5kb1N0YXJ0SW5kZXg6IG51bWJlciwKICAgICAgICBudWxsLCAvLyBleHBhbmRvSW5zdHJ1Y3Rpb25zOiBFeHBhbmRvSW5zdHJ1Y3Rpb25zfG51bGwsCiAgICAgICAgdHJ1ZSwgLy8gZmlyc3RDcmVhdGVQYXNzOiBib29sZWFuLAogICAgICAgIHRydWUsIC8vIGZpcnN0VXBkYXRlUGFzczogYm9vbGVhbiwKICAgICAgICBmYWxzZSwgLy8gc3RhdGljVmlld1F1ZXJpZXM6IGJvb2xlYW4sCiAgICAgICAgZmFsc2UsIC8vIHN0YXRpY0NvbnRlbnRRdWVyaWVzOiBib29sZWFuLAogICAgICAgIG51bGwsIC8vIHByZU9yZGVySG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gcHJlT3JkZXJDaGVja0hvb2tzOiBIb29rRGF0YXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbnRlbnRIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyBjb250ZW50Q2hlY2tIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyB2aWV3SG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gdmlld0NoZWNrSG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgbnVsbCwgLy8gZGVzdHJveUhvb2tzOiBEZXN0cm95SG9va0RhdGF8bnVsbCwKICAgICAgICBudWxsLCAvLyBjbGVhbnVwOiBhbnlbXXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbnRlbnRRdWVyaWVzOiBudW1iZXJbXXxudWxsLAogICAgICAgIG51bGwsIC8vIGNvbXBvbmVudHM6IG51bWJlcltdfG51bGwsCiAgICAgICAgdHlwZW9mIGRpcmVjdGl2ZXMgPT09ICdmdW5jdGlvbicgPwogICAgICAgICAgICBkaXJlY3RpdmVzKCkgOgogICAgICAgICAgICBkaXJlY3RpdmVzLCAvLyBkaXJlY3RpdmVSZWdpc3RyeTogRGlyZWN0aXZlRGVmTGlzdHxudWxsLAogICAgICAgIHR5cGVvZiBwaXBlcyA9PT0gJ2Z1bmN0aW9uJyA/IHBpcGVzKCkgOiBwaXBlcywgLy8gcGlwZVJlZ2lzdHJ5OiBQaXBlRGVmTGlzdHxudWxsLAogICAgICAgIG51bGwsIC8vIGZpcnN0Q2hpbGQ6IFROb2RlfG51bGwsCiAgICAgICAgc2NoZW1hcywgLy8gc2NoZW1hczogU2NoZW1hTWV0YWRhdGFbXXxudWxsLAogICAgICAgIGNvbnN0cykgOiAvLyBjb25zdHM6IFRDb25zdGFudHN8bnVsbAogICAgICAgIHsKICAgICAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICAgICAgaWQ6IHZpZXdJbmRleCwKICAgICAgICAgICAgYmx1ZXByaW50OiBibHVlcHJpbnQsCiAgICAgICAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZUZuLAogICAgICAgICAgICBxdWVyaWVzOiBudWxsLAogICAgICAgICAgICB2aWV3UXVlcnk6IHZpZXdRdWVyeSwKICAgICAgICAgICAgbm9kZTogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgZGF0YTogYmx1ZXByaW50LnNsaWNlKCkuZmlsbChudWxsLCBiaW5kaW5nU3RhcnRJbmRleCksCiAgICAgICAgICAgIGJpbmRpbmdTdGFydEluZGV4OiBiaW5kaW5nU3RhcnRJbmRleCwKICAgICAgICAgICAgZXhwYW5kb1N0YXJ0SW5kZXg6IGluaXRpYWxWaWV3TGVuZ3RoLAogICAgICAgICAgICBleHBhbmRvSW5zdHJ1Y3Rpb25zOiBudWxsLAogICAgICAgICAgICBmaXJzdENyZWF0ZVBhc3M6IHRydWUsCiAgICAgICAgICAgIGZpcnN0VXBkYXRlUGFzczogdHJ1ZSwKICAgICAgICAgICAgc3RhdGljVmlld1F1ZXJpZXM6IGZhbHNlLAogICAgICAgICAgICBzdGF0aWNDb250ZW50UXVlcmllczogZmFsc2UsCiAgICAgICAgICAgIHByZU9yZGVySG9va3M6IG51bGwsCiAgICAgICAgICAgIHByZU9yZGVyQ2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgY29udGVudEhvb2tzOiBudWxsLAogICAgICAgICAgICBjb250ZW50Q2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgdmlld0hvb2tzOiBudWxsLAogICAgICAgICAgICB2aWV3Q2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgZGVzdHJveUhvb2tzOiBudWxsLAogICAgICAgICAgICBjbGVhbnVwOiBudWxsLAogICAgICAgICAgICBjb250ZW50UXVlcmllczogbnVsbCwKICAgICAgICAgICAgY29tcG9uZW50czogbnVsbCwKICAgICAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnk6IHR5cGVvZiBkaXJlY3RpdmVzID09PSAnZnVuY3Rpb24nID8gZGlyZWN0aXZlcygpIDogZGlyZWN0aXZlcywKICAgICAgICAgICAgcGlwZVJlZ2lzdHJ5OiB0eXBlb2YgcGlwZXMgPT09ICdmdW5jdGlvbicgPyBwaXBlcygpIDogcGlwZXMsCiAgICAgICAgICAgIGZpcnN0Q2hpbGQ6IG51bGwsCiAgICAgICAgICAgIHNjaGVtYXM6IHNjaGVtYXMsCiAgICAgICAgICAgIGNvbnN0czogY29uc3RzLAogICAgICAgIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gYmluZGluZ1N0YXJ0SW5kZXgKICogQHBhcmFtIHs/fSBpbml0aWFsVmlld0xlbmd0aAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVmlld0JsdWVwcmludChiaW5kaW5nU3RhcnRJbmRleCwgaW5pdGlhbFZpZXdMZW5ndGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJsdWVwcmludCA9IG5nRGV2TW9kZSA/IG5ldyBMVmlld0JsdWVwcmludCgpIDogW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRpYWxWaWV3TGVuZ3RoOyBpKyspIHsKICAgICAgICBibHVlcHJpbnQucHVzaChpIDwgYmluZGluZ1N0YXJ0SW5kZXggPyBudWxsIDogTk9fQ0hBTkdFKTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoYmx1ZXByaW50KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGV4dAogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVFcnJvcih0ZXh0LCB0b2tlbikgewogICAgcmV0dXJuIG5ldyBFcnJvcihgUmVuZGVyZXI6ICR7dGV4dH0gWyR7c3RyaW5naWZ5Rm9yRXJyb3IodG9rZW4pfV1gKTsKfQovKioKICogQHBhcmFtIHs/fSByRWxlbWVudAogKiBAcGFyYW0gez99IGVsZW1lbnRPclNlbGVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRIb3N0Tm9kZUV4aXN0cyhyRWxlbWVudCwgZWxlbWVudE9yU2VsZWN0b3IpIHsKICAgIGlmICghckVsZW1lbnQpIHsKICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRPclNlbGVjdG9yID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcignSG9zdCBub2RlIHdpdGggc2VsZWN0b3Igbm90IGZvdW5kOicsIGVsZW1lbnRPclNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IGNyZWF0ZUVycm9yKCdIb3N0IG5vZGUgaXMgcmVxdWlyZWQ6JywgZWxlbWVudE9yU2VsZWN0b3IpOwogICAgICAgIH0KICAgIH0KfQovKioKICogTG9jYXRlcyB0aGUgaG9zdCBuYXRpdmUgZWxlbWVudCwgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyBleGlzdGluZyBub2RlcyBpbnRvIHJlbmRlcmluZyBwaXBlbGluZS4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IGVsZW1lbnRPclNlbGVjdG9yIFJlbmRlciBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB0byBsb2NhdGUgdGhlIGVsZW1lbnQuCiAqIEBwYXJhbSB7P30gZW5jYXBzdWxhdGlvbiBWaWV3IEVuY2Fwc3VsYXRpb24gZGVmaW5lZCBmb3IgY29tcG9uZW50IHRoYXQgcmVxdWVzdHMgaG9zdCBlbGVtZW50LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9jYXRlSG9zdEVsZW1lbnQocmVuZGVyZXIsIGVsZW1lbnRPclNlbGVjdG9yLCBlbmNhcHN1bGF0aW9uKSB7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgLy8gV2hlbiB1c2luZyBuYXRpdmUgU2hhZG93IERPTSwgZG8gbm90IGNsZWFyIGhvc3QgZWxlbWVudCB0byBhbGxvdyBuYXRpdmUgc2xvdCBwcm9qZWN0aW9uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXNlcnZlQ29udGVudCA9IGVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uJDEuU2hhZG93RG9tOwogICAgICAgIHJldHVybiByZW5kZXJlci5zZWxlY3RSb290RWxlbWVudChlbGVtZW50T3JTZWxlY3RvciwgcHJlc2VydmVDb250ZW50KTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByRWxlbWVudCA9IHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gJ3N0cmluZycgPwogICAgICAgICgvKiogQHR5cGUgez99ICovIChyZW5kZXJlci5xdWVyeVNlbGVjdG9yKGVsZW1lbnRPclNlbGVjdG9yKSkpIDoKICAgICAgICBlbGVtZW50T3JTZWxlY3RvcjsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIb3N0Tm9kZUV4aXN0cyhyRWxlbWVudCwgZWxlbWVudE9yU2VsZWN0b3IpOwogICAgLy8gQWx3YXlzIGNsZWFyIGhvc3QgZWxlbWVudCdzIGNvbnRlbnQgd2hlbiBSZW5kZXJlcjMgaXMgaW4gdXNlLiBGb3IgcHJvY2VkdXJhbCByZW5kZXJlciBjYXNlIHdlCiAgICAvLyBtYWtlIGl0IGRlcGVuZCBvbiB3aGV0aGVyIFNoYWRvd0RvbSBlbmNhcHN1bGF0aW9uIGlzIHVzZWQgKGluIHdoaWNoIGNhc2UgdGhlIGNvbnRlbnQgc2hvdWxkIGJlCiAgICAvLyBwcmVzZXJ2ZWQgdG8gYWxsb3cgbmF0aXZlIHNsb3QgcHJvamVjdGlvbikuIFNoYWRvd0RvbSBlbmNhcHN1bGF0aW9uIHJlcXVpcmVzIHByb2NlZHVyYWwKICAgIC8vIHJlbmRlcmVyLCBhbmQgcHJvY2VkdXJhbCByZW5kZXJlciBjYXNlIGlzIGhhbmRsZWQgYWJvdmUuCiAgICByRWxlbWVudC50ZXh0Q29udGVudCA9ICcnOwogICAgcmV0dXJuIHJFbGVtZW50Owp9Ci8qKgogKiBTYXZlcyBjb250ZXh0IGZvciB0aGlzIGNsZWFudXAgZnVuY3Rpb24gaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy4KICoKICogT24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHNhdmVzIGluIFRWaWV3OgogKiAtIENsZWFudXAgZnVuY3Rpb24KICogLSBJbmRleCBvZiBjb250ZXh0IHdlIGp1c3Qgc2F2ZWQgaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcwogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEBwYXJhbSB7P30gY2xlYW51cEZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZUNsZWFudXBXaXRoQ29udGV4dCh0VmlldywgbFZpZXcsIGNvbnRleHQsIGNsZWFudXBGbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENsZWFudXAgPSBnZXRMQ2xlYW51cChsVmlldyk7CiAgICBsQ2xlYW51cC5wdXNoKGNvbnRleHQpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGdldFRWaWV3Q2xlYW51cCh0VmlldykucHVzaChjbGVhbnVwRm4sIGxDbGVhbnVwLmxlbmd0aCAtIDEpOwogICAgfQp9Ci8qKgogKiBTYXZlcyB0aGUgY2xlYW51cCBmdW5jdGlvbiBpdHNlbGYgaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy4KICoKICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSB3cmFwcGVkIHdpdGggdGhlaXIgY29udGV4dHMsIGxpa2UgaW4gcmVuZGVyZXIyCiAqIGxpc3RlbmVycy4KICoKICogT24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHRoZSBpbmRleCBvZiB0aGUgY2xlYW51cCBmdW5jdGlvbiBpcyBzYXZlZCBpbiBUVmlldy4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gY2xlYW51cEZuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZUNsZWFudXBGbih0VmlldywgbFZpZXcsIGNsZWFudXBGbikgewogICAgZ2V0TENsZWFudXAobFZpZXcpLnB1c2goY2xlYW51cEZuKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBnZXRUVmlld0NsZWFudXAodFZpZXcpLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NMRUFOVVBdKSkubGVuZ3RoIC0gMSwgbnVsbCk7CiAgICB9Cn0KLyoqCiAqIENvbnN0cnVjdHMgYSBUTm9kZSBvYmplY3QgZnJvbSB0aGUgYXJndW1lbnRzLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgdG8gd2hpY2ggdGhpcyBgVE5vZGVgIGJlbG9uZ3MgKHVzZWQgb25seSBpbiBgbmdEZXZNb2RlYCkKICogQHBhcmFtIHs/fSB0UGFyZW50CiAqIEBwYXJhbSB7P30gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbm9kZQogKiBAcGFyYW0gez99IGFkanVzdGVkSW5kZXggVGhlIGluZGV4IG9mIHRoZSBUTm9kZSBpbiBUVmlldy5kYXRhLCBhZGp1c3RlZCBmb3IgSEVBREVSX09GRlNFVAogKiBAcGFyYW0gez99IHRhZ05hbWUgVGhlIHRhZyBuYW1lIG9mIHRoZSBub2RlCiAqIEBwYXJhbSB7P30gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBvbiB0aGlzIG5vZGUKICogQHJldHVybiB7P30gdGhlIFROb2RlIG9iamVjdAogKi8KZnVuY3Rpb24gY3JlYXRlVE5vZGUodFZpZXcsIHRQYXJlbnQsIHR5cGUsIGFkanVzdGVkSW5kZXgsIHRhZ05hbWUsIGF0dHJzKSB7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnROb2RlKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5qZWN0b3JJbmRleCA9IHRQYXJlbnQgPyB0UGFyZW50LmluamVjdG9ySW5kZXggOiAtMTsKICAgIHJldHVybiBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVEZWJ1Zyh0VmlldywgLy8gdFZpZXdfOiBUVmlldwogICAgdHlwZSwgLy8gdHlwZTogVE5vZGVUeXBlCiAgICBhZGp1c3RlZEluZGV4LCAvLyBpbmRleDogbnVtYmVyCiAgICBpbmplY3RvckluZGV4LCAvLyBpbmplY3RvckluZGV4OiBudW1iZXIKICAgIC0xLCAvLyBkaXJlY3RpdmVTdGFydDogbnVtYmVyCiAgICAtMSwgLy8gZGlyZWN0aXZlRW5kOiBudW1iZXIKICAgIC0xLCAvLyBkaXJlY3RpdmVTdHlsaW5nTGFzdDogbnVtYmVyCiAgICBudWxsLCAvLyBwcm9wZXJ0eUJpbmRpbmdzOiBudW1iZXJbXXxudWxsCiAgICAwLCAvLyBmbGFnczogVE5vZGVGbGFncwogICAgMCwgLy8gcHJvdmlkZXJJbmRleGVzOiBUTm9kZVByb3ZpZGVySW5kZXhlcwogICAgdGFnTmFtZSwgLy8gdGFnTmFtZTogc3RyaW5nfG51bGwKICAgIGF0dHJzLCAvLyBhdHRyczogKHN0cmluZ3xBdHRyaWJ1dGVNYXJrZXJ8KHN0cmluZ3xTZWxlY3RvckZsYWdzKVtdKVtdfG51bGwKICAgIG51bGwsIC8vIG1lcmdlZEF0dHJzCiAgICBudWxsLCAvLyBsb2NhbE5hbWVzOiAoc3RyaW5nfG51bWJlcilbXXxudWxsCiAgICB1bmRlZmluZWQsIC8vIGluaXRpYWxJbnB1dHM6IChzdHJpbmdbXXxudWxsKVtdfG51bGx8dW5kZWZpbmVkCiAgICBudWxsLCAvLyBpbnB1dHM6IFByb3BlcnR5QWxpYXNlc3xudWxsCiAgICBudWxsLCAvLyBvdXRwdXRzOiBQcm9wZXJ0eUFsaWFzZXN8bnVsbAogICAgbnVsbCwgLy8gdFZpZXdzOiBJVFZpZXd8SVRWaWV3W118bnVsbAogICAgbnVsbCwgLy8gbmV4dDogSVROb2RlfG51bGwKICAgIG51bGwsIC8vIHByb2plY3Rpb25OZXh0OiBJVE5vZGV8bnVsbAogICAgbnVsbCwgLy8gY2hpbGQ6IElUTm9kZXxudWxsCiAgICB0UGFyZW50LCAvLyBwYXJlbnQ6IFRFbGVtZW50Tm9kZXxUQ29udGFpbmVyTm9kZXxudWxsCiAgICBudWxsLCAvLyBwcm9qZWN0aW9uOiBudW1iZXJ8KElUTm9kZXxSTm9kZVtdKVtdfG51bGwKICAgIG51bGwsIC8vIHN0eWxlczogc3RyaW5nfG51bGwKICAgIHVuZGVmaW5lZCwgLy8gcmVzaWR1YWxTdHlsZXM6IHN0cmluZ3xudWxsCiAgICBudWxsLCAvLyBjbGFzc2VzOiBzdHJpbmd8bnVsbAogICAgdW5kZWZpbmVkLCAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLCAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpKSA6CiAgICAgICAgewogICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICBpbmRleDogYWRqdXN0ZWRJbmRleCwKICAgICAgICAgICAgaW5qZWN0b3JJbmRleDogaW5qZWN0b3JJbmRleCwKICAgICAgICAgICAgZGlyZWN0aXZlU3RhcnQ6IC0xLAogICAgICAgICAgICBkaXJlY3RpdmVFbmQ6IC0xLAogICAgICAgICAgICBkaXJlY3RpdmVTdHlsaW5nTGFzdDogLTEsCiAgICAgICAgICAgIHByb3BlcnR5QmluZGluZ3M6IG51bGwsCiAgICAgICAgICAgIGZsYWdzOiAwLAogICAgICAgICAgICBwcm92aWRlckluZGV4ZXM6IDAsCiAgICAgICAgICAgIHRhZ05hbWU6IHRhZ05hbWUsCiAgICAgICAgICAgIGF0dHJzOiBhdHRycywKICAgICAgICAgICAgbWVyZ2VkQXR0cnM6IG51bGwsCiAgICAgICAgICAgIGxvY2FsTmFtZXM6IG51bGwsCiAgICAgICAgICAgIGluaXRpYWxJbnB1dHM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgaW5wdXRzOiBudWxsLAogICAgICAgICAgICBvdXRwdXRzOiBudWxsLAogICAgICAgICAgICB0Vmlld3M6IG51bGwsCiAgICAgICAgICAgIG5leHQ6IG51bGwsCiAgICAgICAgICAgIHByb2plY3Rpb25OZXh0OiBudWxsLAogICAgICAgICAgICBjaGlsZDogbnVsbCwKICAgICAgICAgICAgcGFyZW50OiB0UGFyZW50LAogICAgICAgICAgICBwcm9qZWN0aW9uOiBudWxsLAogICAgICAgICAgICBzdHlsZXM6IG51bGwsCiAgICAgICAgICAgIHJlc2lkdWFsU3R5bGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGNsYXNzZXM6IG51bGwsCiAgICAgICAgICAgIHJlc2lkdWFsQ2xhc3NlczogdW5kZWZpbmVkLAogICAgICAgICAgICBjbGFzc0JpbmRpbmdzOiAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLAogICAgICAgICAgICBzdHlsZUJpbmRpbmdzOiAoLyoqIEB0eXBlIHs/fSAqLyAoMCkpLAogICAgICAgIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5wdXRBbGlhc01hcAogKiBAcGFyYW0gez99IGRpcmVjdGl2ZURlZklkeAogKiBAcGFyYW0gez99IHByb3BTdG9yZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2VuZXJhdGVQcm9wZXJ0eUFsaWFzZXMoaW5wdXRBbGlhc01hcCwgZGlyZWN0aXZlRGVmSWR4LCBwcm9wU3RvcmUpIHsKICAgIGZvciAobGV0IHB1YmxpY05hbWUgaW4gaW5wdXRBbGlhc01hcCkgewogICAgICAgIGlmIChpbnB1dEFsaWFzTWFwLmhhc093blByb3BlcnR5KHB1YmxpY05hbWUpKSB7CiAgICAgICAgICAgIHByb3BTdG9yZSA9IHByb3BTdG9yZSA9PT0gbnVsbCA/IHt9IDogcHJvcFN0b3JlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGludGVybmFsTmFtZSA9IGlucHV0QWxpYXNNYXBbcHVibGljTmFtZV07CiAgICAgICAgICAgIGlmIChwcm9wU3RvcmUuaGFzT3duUHJvcGVydHkocHVibGljTmFtZSkpIHsKICAgICAgICAgICAgICAgIHByb3BTdG9yZVtwdWJsaWNOYW1lXS5wdXNoKGRpcmVjdGl2ZURlZklkeCwgaW50ZXJuYWxOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIChwcm9wU3RvcmVbcHVibGljTmFtZV0gPSBbZGlyZWN0aXZlRGVmSWR4LCBpbnRlcm5hbE5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBwcm9wU3RvcmU7Cn0KLyoqCiAqIEluaXRpYWxpemVzIGRhdGEgc3RydWN0dXJlcyByZXF1aXJlZCB0byB3b3JrIHdpdGggZGlyZWN0aXZlIG91dHB1dHMgYW5kIG91dHB1dHMuCiAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgZm9yIGFsbCBkaXJlY3RpdmVzIG1hdGNoZWQgb24gYSBnaXZlbiBUTm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbml0aWFsaXplSW5wdXRBbmRPdXRwdXRBbGlhc2VzKHRWaWV3LCB0Tm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmcyA9IHRWaWV3LmRhdGE7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZUF0dHJzID0gdE5vZGUuYXR0cnM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnB1dHNGcm9tQXR0cnMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVJbml0aWFsSW5wdXRzKCkgOiBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbnB1dHNTdG9yZSA9IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgb3V0cHV0c1N0b3JlID0gbnVsbDsKICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZiA9ICgvKiogQHR5cGUgez99ICovIChkZWZzW2ldKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpcmVjdGl2ZUlucHV0cyA9IGRpcmVjdGl2ZURlZi5pbnB1dHM7CiAgICAgICAgaW5wdXRzRnJvbUF0dHJzLnB1c2godE5vZGVBdHRycyAhPT0gbnVsbCA/IGdlbmVyYXRlSW5pdGlhbElucHV0cyhkaXJlY3RpdmVJbnB1dHMsIHROb2RlQXR0cnMpIDogbnVsbCk7CiAgICAgICAgaW5wdXRzU3RvcmUgPSBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhkaXJlY3RpdmVJbnB1dHMsIGksIGlucHV0c1N0b3JlKTsKICAgICAgICBvdXRwdXRzU3RvcmUgPSBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhkaXJlY3RpdmVEZWYub3V0cHV0cywgaSwgb3V0cHV0c1N0b3JlKTsKICAgIH0KICAgIGlmIChpbnB1dHNTdG9yZSAhPT0gbnVsbCkgewogICAgICAgIGlmIChpbnB1dHNTdG9yZS5oYXNPd25Qcm9wZXJ0eSgnY2xhc3MnKSkgewogICAgICAgICAgICB0Tm9kZS5mbGFncyB8PSAxNiAvKiBoYXNDbGFzc0lucHV0ICovOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXRzU3RvcmUuaGFzT3duUHJvcGVydHkoJ3N0eWxlJykpIHsKICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gMzIgLyogaGFzU3R5bGVJbnB1dCAqLzsKICAgICAgICB9CiAgICB9CiAgICB0Tm9kZS5pbml0aWFsSW5wdXRzID0gaW5wdXRzRnJvbUF0dHJzOwogICAgdE5vZGUuaW5wdXRzID0gaW5wdXRzU3RvcmU7CiAgICB0Tm9kZS5vdXRwdXRzID0gb3V0cHV0c1N0b3JlOwp9Ci8qKgogKiBNYXBwaW5nIGJldHdlZW4gYXR0cmlidXRlcyBuYW1lcyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgdG8gdGhlaXIgZWxlbWVudCBwcm9wZXJ0eSBuYW1lcy4KICoKICogUGVyZm9ybWFuY2Ugbm90ZTogdGhpcyBmdW5jdGlvbiBpcyB3cml0dGVuIGFzIGEgc2VyaWVzIG9mIGlmIGNoZWNrcyAoaW5zdGVhZCBvZiwgc2F5LCBhIHByb3BlcnR5CiAqIG9iamVjdCBsb29rdXApIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIC0gdGhlIHNlcmllcyBvZiBgaWZgIGNoZWNrcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgb2YKICogbWFwcGluZyBwcm9wZXJ0eSBuYW1lcy4gRG8gTk9UIGNoYW5nZSB3aXRob3V0IGJlbmNobWFya2luZy4KICoKICogTm90ZTogdGhpcyBtYXBwaW5nIGhhcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZXF1YWxseSBuYW1lZCBtYXBwaW5nIGluIHRoZSB0ZW1wbGF0ZQogKiB0eXBlLWNoZWNraW5nIG1hY2hpbmVyeSBvZiBuZ3RzYy4KICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXBQcm9wTmFtZShuYW1lKSB7CiAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykKICAgICAgICByZXR1cm4gJ2NsYXNzTmFtZSc7CiAgICBpZiAobmFtZSA9PT0gJ2ZvcicpCiAgICAgICAgcmV0dXJuICdodG1sRm9yJzsKICAgIGlmIChuYW1lID09PSAnZm9ybWFjdGlvbicpCiAgICAgICAgcmV0dXJuICdmb3JtQWN0aW9uJzsKICAgIGlmIChuYW1lID09PSAnaW5uZXJIdG1sJykKICAgICAgICByZXR1cm4gJ2lubmVySFRNTCc7CiAgICBpZiAobmFtZSA9PT0gJ3JlYWRvbmx5JykKICAgICAgICByZXR1cm4gJ3JlYWRPbmx5JzsKICAgIGlmIChuYW1lID09PSAndGFiaW5kZXgnKQogICAgICAgIHJldHVybiAndGFiSW5kZXgnOwogICAgcmV0dXJuIG5hbWU7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJvcE5hbWUKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gc2FuaXRpemVyCiAqIEBwYXJhbSB7P30gbmF0aXZlT25seQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIHZhbHVlLCByZW5kZXJlciwgc2FuaXRpemVyLCBuYXRpdmVPbmx5KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKE5PX0NIQU5HRSkpLCAnSW5jb21pbmcgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIE5PX0NIQU5HRS4nKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5wdXREYXRhID0gdE5vZGUuaW5wdXRzOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRhdGFWYWx1ZTsKICAgIGlmICghbmF0aXZlT25seSAmJiBpbnB1dERhdGEgIT0gbnVsbCAmJiAoZGF0YVZhbHVlID0gaW5wdXREYXRhW3Byb3BOYW1lXSkpIHsKICAgICAgICBzZXRJbnB1dHNGb3JQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGRhdGFWYWx1ZSwgcHJvcE5hbWUsIHZhbHVlKTsKICAgICAgICBpZiAoaXNDb21wb25lbnRIb3N0KHROb2RlKSkKICAgICAgICAgICAgbWFya0RpcnR5SWZPblB1c2gobFZpZXcsIHROb2RlLmluZGV4KTsKICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHROb2RlLnR5cGUsIGRhdGFWYWx1ZSwgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgIHByb3BOYW1lID0gbWFwUHJvcE5hbWUocHJvcE5hbWUpOwogICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgdmFsaWRhdGVBZ2FpbnN0RXZlbnRQcm9wZXJ0aWVzKHByb3BOYW1lKTsKICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVByb3BlcnR5KHRWaWV3LCBsVmlldywgZWxlbWVudCwgcHJvcE5hbWUsIHROb2RlKSkgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIGhlcmUgc2luY2Ugd2Ugb25seSBsb2cgd2FybmluZ3MgZm9yIHVua25vd24gcHJvcGVydGllcy4KICAgICAgICAgICAgICAgIHdhcm5BYm91dFVua25vd25Qcm9wZXJ0eShwcm9wTmFtZSwgdE5vZGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5nRGV2TW9kZS5yZW5kZXJlclNldFByb3BlcnR5Kys7CiAgICAgICAgfQogICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgc2FuaXRpemVyIGlzIG9ubHkgYWRkZWQgd2hlbiB0aGUgY29tcGlsZXIgZGV0ZXJtaW5lcyB0aGF0IHRoZQogICAgICAgIC8vIHByb3BlcnR5IGlzIHJpc2t5LCBzbyBzYW5pdGl6YXRpb24gY2FuIGJlIGRvbmUgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KICAgICAgICB2YWx1ZSA9IHNhbml0aXplciAhPSBudWxsID8gKCgvKiogQHR5cGUgez99ICovIChzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIHByb3BOYW1lKSkpKSA6IHZhbHVlOwogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0UHJvcGVydHkoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSwgcHJvcE5hbWUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIWlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5ID8gKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSkgOgogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpW3Byb3BOYW1lXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgLy8gSWYgdGhlIG5vZGUgaXMgYSBjb250YWluZXIgYW5kIHRoZSBwcm9wZXJ0eSBkaWRuJ3QKICAgICAgICAvLyBtYXRjaCBhbnkgb2YgdGhlIGlucHV0cyBvciBzY2hlbWFzIHdlIHNob3VsZCB0aHJvdy4KICAgICAgICBpZiAobmdEZXZNb2RlICYmICFtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0Tm9kZS50YWdOYW1lKSkgewogICAgICAgICAgICB3YXJuQWJvdXRVbmtub3duUHJvcGVydHkocHJvcE5hbWUsIHROb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIElmIG5vZGUgaXMgYW4gT25QdXNoIGNvbXBvbmVudCwgbWFya3MgaXRzIExWaWV3IGRpcnR5LgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmlld0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXJrRGlydHlJZk9uUHVzaChsVmlldywgdmlld0luZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2hpbGRDb21wb25lbnRMVmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh2aWV3SW5kZXgsIGxWaWV3KTsKICAgIGlmICghKGNoaWxkQ29tcG9uZW50TFZpZXdbRkxBR1NdICYgMTYgLyogQ2hlY2tBbHdheXMgKi8pKSB7CiAgICAgICAgY2hpbGRDb21wb25lbnRMVmlld1tGTEFHU10gfD0gNjQgLyogRGlydHkgKi87CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IGF0dHJOYW1lCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCBhdHRyTmFtZSwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgYXR0ck5hbWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdOYW1lKGF0dHJOYW1lKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlYnVnVmFsdWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdWYWx1ZSh2YWx1ZSk7CiAgICBpZiAodHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgYXR0ck5hbWUpIDoKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8KICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZSgoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSksIGF0dHJOYW1lLCBkZWJ1Z1ZhbHVlKSA6CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSkuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBkZWJ1Z1ZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBgYmluZGluZ3M9JHtKU09OLnN0cmluZ2lmeSh7IFthdHRyTmFtZV06IGRlYnVnVmFsdWUgfSwgbnVsbCwgMil9YDsKICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJlbmRlcmVyLnNldFZhbHVlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgdGV4dENvbnRlbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQ7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBkYXRhVmFsdWUKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0TmdSZWZsZWN0UHJvcGVydGllcyhsVmlldywgZWxlbWVudCwgdHlwZSwgZGF0YVZhbHVlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCB0eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgIC8qKgogICAgICAgICAqIGRhdGFWYWx1ZSBpcyBhbiBhcnJheSBjb250YWluaW5nIHJ1bnRpbWUgaW5wdXQgb3Igb3V0cHV0IG5hbWVzIGZvciB0aGUgZGlyZWN0aXZlczoKICAgICAgICAgKiBpKzA6IGRpcmVjdGl2ZSBpbnN0YW5jZSBpbmRleAogICAgICAgICAqIGkrMTogcHJpdmF0ZU5hbWUKICAgICAgICAgKgogICAgICAgICAqIGUuZy4gWzAsICdjaGFuZ2UnLCAnY2hhbmdlLW1pbmlmaWVkJ10KICAgICAgICAgKiB3ZSB3YW50IHRvIHNldCB0aGUgcmVmbGVjdGVkIHByb3BlcnR5IHdpdGggdGhlIHByaXZhdGVOYW1lOiBkYXRhVmFsdWVbaSsxXQogICAgICAgICAqLwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVZhbHVlLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVZhbHVlW2kgKyAxXSkpLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlbGVtZW50CiAqIEBwYXJhbSB7P30gcHJvcE5hbWUKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSkgewogICAgLy8gVGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgdmFsaWQgaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2NoZW1hLCBpdCBleGlzdHMgb24gdGhlIGVsZW1lbnQKICAgIC8vIG9yIGl0IGlzIHN5bnRoZXRpYywgYW5kIHdlIGFyZSBpbiBhIGJyb3dzZXIgY29udGV4dCAod2ViIHdvcmtlciBub2RlcyBzaG91bGQgYmUgc2tpcHBlZCkuCiAgICBpZiAobWF0Y2hpbmdTY2hlbWFzKHRWaWV3LCBsVmlldywgdE5vZGUudGFnTmFtZSkgfHwgcHJvcE5hbWUgaW4gZWxlbWVudCB8fAogICAgICAgIGlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vIE5vdGU6IGB0eXBlb2YgTm9kZWAgcmV0dXJucyAnZnVuY3Rpb24nIGluIG1vc3QgYnJvd3NlcnMsIGJ1dCBvbiBJRSBpdCBpcyAnb2JqZWN0JyBzbyB3ZQogICAgLy8gbmVlZCB0byBhY2NvdW50IGZvciBib3RoIGhlcmUsIHdoaWxlIGJlaW5nIGNhcmVmdWwgZm9yIGB0eXBlb2YgbnVsbGAgYWxzbyByZXR1cm5pbmcgJ29iamVjdCcuCiAgICByZXR1cm4gdHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnIHx8IE5vZGUgPT09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgTm9kZSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHRhZ05hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hdGNoaW5nU2NoZW1hcyh0VmlldywgbFZpZXcsIHRhZ05hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjaGVtYXMgPSB0Vmlldy5zY2hlbWFzOwogICAgaWYgKHNjaGVtYXMgIT09IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW2ldOwogICAgICAgICAgICBpZiAoc2NoZW1hID09PSBOT19FUlJPUlNfU0NIRU1BIHx8CiAgICAgICAgICAgICAgICBzY2hlbWEgPT09IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgJiYgdGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQovKioKICogTG9ncyBhIHdhcm5pbmcgdGhhdCBhIHByb3BlcnR5IGlzIG5vdCBzdXBwb3J0ZWQgb24gYW4gZWxlbWVudC4KICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHRoZSBpbnZhbGlkIHByb3BlcnR5LgogKiBAcGFyYW0gez99IHROb2RlIE5vZGUgb24gd2hpY2ggd2UgZW5jb3VudGVyZWQgdGhlIHByb3BlcnR5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd2FybkFib3V0VW5rbm93blByb3BlcnR5KHByb3BOYW1lLCB0Tm9kZSkgewogICAgY29uc29sZS53YXJuKGBDYW4ndCBiaW5kIHRvICcke3Byb3BOYW1lfScgc2luY2UgaXQgaXNuJ3QgYSBrbm93biBwcm9wZXJ0eSBvZiAnJHt0Tm9kZS50YWdOYW1lfScuYCk7Cn0KLyoqCiAqIEluc3RhbnRpYXRlIGEgcm9vdCBjb21wb25lbnQuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGRlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zdGFudGlhdGVSb290Q29tcG9uZW50KHRWaWV3LCBsVmlldywgZGVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBpZiAoZGVmLnByb3ZpZGVyc1Jlc29sdmVyKQogICAgICAgICAgICBkZWYucHJvdmlkZXJzUmVzb2x2ZXIoZGVmKTsKICAgICAgICBnZW5lcmF0ZUV4cGFuZG9JbnN0cnVjdGlvbkJsb2NrKHRWaWV3LCByb290VE5vZGUsIDEpOwogICAgICAgIGJhc2VSZXNvbHZlRGlyZWN0aXZlKHRWaWV3LCBsVmlldywgZGVmKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGdldE5vZGVJbmplY3RhYmxlKGxWaWV3LCB0VmlldywgbFZpZXcubGVuZ3RoIC0gMSwgKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RUTm9kZSkpKTsKICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmUsIGxWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9IGdldE5hdGl2ZUJ5VE5vZGUocm9vdFROb2RlLCBsVmlldyk7CiAgICBpZiAobmF0aXZlKSB7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgfQogICAgcmV0dXJuIGRpcmVjdGl2ZTsKfQovKioKICogUmVzb2x2ZSB0aGUgbWF0Y2hlZCBkaXJlY3RpdmVzIG9uIGEgbm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsb2NhbFJlZnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCBsVmlldywgdE5vZGUsIGxvY2FsUmVmcykgewogICAgLy8gUGxlYXNlIG1ha2Ugc3VyZSB0byBoYXZlIGV4cGxpY2l0IHR5cGUgZm9yIGBleHBvcnRzTWFwYC4gSW5mZXJyZWQgdHlwZSB0cmlnZ2VycyBidWcgaW4KICAgIC8vIHRzaWNrbGUuCiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBoYXNEaXJlY3RpdmVzID0gZmFsc2U7CiAgICBpZiAoZ2V0QmluZGluZ3NFbmFibGVkKCkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmcyA9IGZpbmREaXJlY3RpdmVEZWZNYXRjaGVzKHRWaWV3LCBsVmlldywgdE5vZGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleHBvcnRzTWFwID0gbG9jYWxSZWZzID09PSBudWxsID8gbnVsbCA6IHsgJyc6IC0xIH07CiAgICAgICAgaWYgKGRpcmVjdGl2ZURlZnMgIT09IG51bGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdG90YWxEaXJlY3RpdmVIb3N0VmFycyA9IDA7CiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlOwogICAgICAgICAgICBpbml0VE5vZGVGbGFncyh0Tm9kZSwgdFZpZXcuZGF0YS5sZW5ndGgsIGRpcmVjdGl2ZURlZnMubGVuZ3RoKTsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgc2FtZSB0b2tlbiBpcyBwcm92aWRlZCBieSBzZXZlcmFsIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgbm9kZSwgc29tZSBydWxlcyBhcHBseSBpbgogICAgICAgICAgICAvLyB0aGUgdmlld0VuZ2luZToKICAgICAgICAgICAgLy8gLSB2aWV3UHJvdmlkZXJzIGhhdmUgcHJpb3JpdHkgb3ZlciBwcm92aWRlcnMKICAgICAgICAgICAgLy8gLSB0aGUgbGFzdCBkaXJlY3RpdmUgaW4gTmdNb2R1bGUuZGVjbGFyYXRpb25zIGhhcyBwcmlvcml0eSBvdmVyIHRoZSBwcmV2aW91cyBvbmUKICAgICAgICAgICAgLy8gU28gdG8gbWF0Y2ggdGhlc2UgcnVsZXMsIHRoZSBvcmRlciBpbiB3aGljaCBwcm92aWRlcnMgYXJlIGFkZGVkIGluIHRoZSBhcnJheXMgaXMgdmVyeQogICAgICAgICAgICAvLyBpbXBvcnRhbnQuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlRGVmcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gZGlyZWN0aXZlRGVmc1tpXTsKICAgICAgICAgICAgICAgIGlmIChkZWYucHJvdmlkZXJzUmVzb2x2ZXIpCiAgICAgICAgICAgICAgICAgICAgZGVmLnByb3ZpZGVyc1Jlc29sdmVyKGRlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2VuZXJhdGVFeHBhbmRvSW5zdHJ1Y3Rpb25CbG9jayh0VmlldywgdE5vZGUsIGRpcmVjdGl2ZURlZnMubGVuZ3RoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJlT3JkZXJIb29rc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHByZU9yZGVyQ2hlY2tIb29rc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlRGVmcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gZGlyZWN0aXZlRGVmc1tpXTsKICAgICAgICAgICAgICAgIC8vIE1lcmdlIHRoZSBhdHRycyBpbiB0aGUgb3JkZXIgb2YgbWF0Y2hlcy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpcyB0aGUKICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBpdHNlbGYsIHNvIHRoYXQgdGhlIGNvbXBvbmVudCBoYXMgdGhlIGxlYXN0IHByaW9yaXR5LgogICAgICAgICAgICAgICAgdE5vZGUubWVyZ2VkQXR0cnMgPSBtZXJnZUhvc3RBdHRycyh0Tm9kZS5tZXJnZWRBdHRycywgZGVmLmhvc3RBdHRycyk7CiAgICAgICAgICAgICAgICBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0VmlldywgbFZpZXcsIGRlZik7CiAgICAgICAgICAgICAgICBzYXZlTmFtZVRvRXhwb3J0TWFwKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhKSkubGVuZ3RoIC0gMSwgZGVmLCBleHBvcnRzTWFwKTsKICAgICAgICAgICAgICAgIGlmIChkZWYuY29udGVudFF1ZXJpZXMgIT09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gOCAvKiBoYXNDb250ZW50UXVlcnkgKi87CiAgICAgICAgICAgICAgICBpZiAoZGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBkZWYuaG9zdEF0dHJzICE9PSBudWxsIHx8IGRlZi5ob3N0VmFycyAhPT0gMCkKICAgICAgICAgICAgICAgICAgICB0Tm9kZS5mbGFncyB8PSAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovOwogICAgICAgICAgICAgICAgLy8gT25seSBwdXNoIGEgbm9kZSBpbmRleCBpbnRvIHRoZSBwcmVPcmRlckhvb2tzIGFycmF5IGlmIHRoaXMgaXMgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAvLyBwcmUtb3JkZXIgaG9vayBmb3VuZCBvbiB0aGlzIG5vZGUuCiAgICAgICAgICAgICAgICBpZiAoIXByZU9yZGVySG9va3NGb3VuZCAmJiAoZGVmLm9uQ2hhbmdlcyB8fCBkZWYub25Jbml0IHx8IGRlZi5kb0NoZWNrKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcHVzaCB0aGUgYWN0dWFsIGhvb2sgZnVuY3Rpb24gaW50byB0aGlzIGFycmF5IGxhdGVyIGR1cmluZyBkaXIgaW5zdGFudGlhdGlvbi4KICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZG8gaXQgbm93IGJlY2F1c2Ugd2UgbXVzdCBlbnN1cmUgaG9va3MgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAvLyBvcmRlciB0aGF0IGRpcmVjdGl2ZXMgYXJlIGNyZWF0ZWQgKGkuZS4gaW5qZWN0aW9uIG9yZGVyKS4KICAgICAgICAgICAgICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCh0Tm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpOwogICAgICAgICAgICAgICAgICAgIHByZU9yZGVySG9va3NGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXByZU9yZGVyQ2hlY2tIb29rc0ZvdW5kICYmIChkZWYub25DaGFuZ2VzIHx8IGRlZi5kb0NoZWNrKSkgewogICAgICAgICAgICAgICAgICAgICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgfHwgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyA9IFtdKSkKICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2godE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUKTsKICAgICAgICAgICAgICAgICAgICBwcmVPcmRlckNoZWNrSG9va3NGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGRlZik7CiAgICAgICAgICAgICAgICB0b3RhbERpcmVjdGl2ZUhvc3RWYXJzICs9IGRlZi5ob3N0VmFyczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbml0aWFsaXplSW5wdXRBbmRPdXRwdXRBbGlhc2VzKHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgIGdyb3dIb3N0VmFyc1NwYWNlKHRWaWV3LCBsVmlldywgdG90YWxEaXJlY3RpdmVIb3N0VmFycyk7CiAgICAgICAgfQogICAgICAgIGlmIChleHBvcnRzTWFwKQogICAgICAgICAgICBjYWNoZU1hdGNoaW5nTG9jYWxOYW1lcyh0Tm9kZSwgbG9jYWxSZWZzLCBleHBvcnRzTWFwKTsKICAgIH0KICAgIC8vIE1lcmdlIHRoZSB0ZW1wbGF0ZSBhdHRycyBsYXN0IHNvIHRoYXQgdGhleSBoYXZlIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogICAgdE5vZGUubWVyZ2VkQXR0cnMgPSBtZXJnZUhvc3RBdHRycyh0Tm9kZS5tZXJnZWRBdHRycywgdE5vZGUuYXR0cnMpOwogICAgcmV0dXJuIGhhc0RpcmVjdGl2ZXM7Cn0KLyoqCiAqIEFkZCBgaG9zdEJpbmRpbmdzYCB0byB0aGUgYFRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnNgLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgdG8gd2hpY2ggdGhlIGBob3N0QmluZGluZ3NgIHNob3VsZCBiZSBhZGRlZC4KICogQHBhcmFtIHs/fSBkZWYgYENvbXBvbmVudERlZmAvYERpcmVjdGl2ZURlZmAsIHdoaWNoIGNvbnRhaW5zIHRoZSBgaG9zdFZhcnNgL2Bob3N0QmluZGluZ3NgIHRvIGFkZC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFkZEhvc3RCaW5kaW5nc1RvRXhwYW5kb0luc3RydWN0aW9ucyh0VmlldywgZGVmKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGV4cGFuZG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucykpOwogICAgLy8gVE9ETyhtaXNrbyk6IFBFUkYgd2UgYXJlIGFkZGluZyBgaG9zdEJpbmRpbmdzYCBldmVuIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkISBUaGlzIGlzCiAgICAvLyBzdWJvcHRpbWFsIGZvciBwZXJmb3JtYW5jZS4gYGRlZi5ob3N0QmluZGluZ3NgIG1heSBiZSBudWxsLAogICAgLy8gYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHVzaCBudWxsIHRvIHRoZSBhcnJheSBhcyBhIHBsYWNlaG9sZGVyCiAgICAvLyB0byBlbnN1cmUgdGhlIGRpcmVjdGl2ZSBjb3VudGVyIGlzIGluY3JlbWVudGVkIChzbyBob3N0CiAgICAvLyBiaW5kaW5nIGZ1bmN0aW9ucyBhbHdheXMgbGluZSB1cCB3aXRoIHRoZSBjb3JyZWN0aXZlIGRpcmVjdGl2ZSkuCiAgICAvLyBUaGlzIGlzIHN1Ym9wdGltYWwgZm9yIHBlcmZvcm1hbmNlLiBTZWUgYGN1cnJlbnREaXJlY3RpdmVJbmRleGAKICAgIC8vICBjb21tZW50IGluIGBzZXRIb3N0QmluZGluZ3NCeUV4ZWN1dGluZ0V4cGFuZG9JbnN0cnVjdGlvbnNgIGZvciBtb3JlCiAgICAvLyBkZXRhaWxzLiAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MpOwogICAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaG9zdFZhcnMgPSBkZWYuaG9zdFZhcnM7CiAgICBpZiAoaG9zdFZhcnMgIT09IDApIHsKICAgICAgICBleHBhbmRvLnB1c2goZGVmLmhvc3RWYXJzKTsKICAgIH0KfQovKioKICogR3JvdyB0aGUgYExWaWV3YCwgYmx1ZXByaW50IGFuZCBgVFZpZXcuZGF0YWAgdG8gYWNjb21tb2RhdGUgdGhlIGBob3N0QmluZGluZ3NgLgogKgogKiBUbyBzdXBwb3J0IGxvY2FsaXR5IHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZSBob3cgbWFueSBgaG9zdFZhcnNgIG9mIHRoZSBjb250YWluaW5nIGRpcmVjdGl2ZXMKICogd2UgbmVlZCB0byBhbGxvY2F0ZS4gRm9yIHRoaXMgcmVhc29uIHdlIGFsbG93IGdyb3dpbmcgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFzIHdlIGRpc2NvdmVyIG1vcmUKICogZGlyZWN0aXZlcyB0byBhY2NvbW1vZGF0ZSB0aGVtLgogKgogKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgZ3Jvd24uCiAqIEBwYXJhbSB7P30gbFZpZXcgYExWaWV3YCB3aGljaCBuZWVkcyB0byBiZSBncm93bi4KICogQHBhcmFtIHs/fSBjb3VudCBTaXplIGJ5IHdoaWNoIHdlIG5lZWQgdG8gZ3JvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ3Jvd0hvc3RWYXJzU3BhY2UodFZpZXcsIGxWaWV3LCBjb3VudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0U2FtZSh0VmlldywgbFZpZXdbVFZJRVddLCAnYExWaWV3YCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBgVFZpZXdgIScpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgbFZpZXcucHVzaChOT19DSEFOR0UpOwogICAgICAgIHRWaWV3LmJsdWVwcmludC5wdXNoKE5PX0NIQU5HRSk7CiAgICAgICAgdFZpZXcuZGF0YS5wdXNoKG51bGwpOwogICAgfQp9Ci8qKgogKiBJbnN0YW50aWF0ZSBhbGwgdGhlIGRpcmVjdGl2ZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmVzb2x2ZWQgb24gdGhlIGN1cnJlbnQgbm9kZS4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBuYXRpdmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGluc3RhbnRpYXRlQWxsRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBuYXRpdmUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICBpZiAoIXRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdGlhbElucHV0cyA9IHROb2RlLmluaXRpYWxJbnB1dHM7CiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtpXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGlzQ29tcG9uZW50RGVmKGRlZik7CiAgICAgICAgaWYgKGlzQ29tcG9uZW50KSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgICAgICBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksICgvKiogQHR5cGUgez99ICovIChkZWYpKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgdFZpZXcsIGksIHROb2RlKTsKICAgICAgICBhdHRhY2hQYXRjaERhdGEoZGlyZWN0aXZlLCBsVmlldyk7CiAgICAgICAgaWYgKGluaXRpYWxJbnB1dHMgIT09IG51bGwpIHsKICAgICAgICAgICAgc2V0SW5wdXRzRnJvbUF0dHJzKGxWaWV3LCBpIC0gc3RhcnQsIGRpcmVjdGl2ZSwgZGVmLCB0Tm9kZSwgKC8qKiBAdHlwZSB7P30gKi8gKGluaXRpYWxJbnB1dHMpKSk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0NvbXBvbmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KTsKICAgICAgICAgICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGRpcmVjdGl2ZTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVzSG9zdEJpbmRpbmdzKHRWaWV3LCBsVmlldywgdE5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBleHBhbmRvID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpcnN0Q3JlYXRlUGFzcyA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDsKICAgIHRyeSB7CiAgICAgICAgc2V0U2VsZWN0ZWRJbmRleChlbGVtZW50SW5kZXgpOwogICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaV0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBsVmlld1tpXTsKICAgICAgICAgICAgaWYgKGRlZi5ob3N0QmluZGluZ3MgIT09IG51bGwgfHwgZGVmLmhvc3RWYXJzICE9PSAwIHx8IGRlZi5ob3N0QXR0cnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGRlZiwgZGlyZWN0aXZlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmaXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgICAgIGV4cGFuZG8ucHVzaChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHNldFNlbGVjdGVkSW5kZXgoLTEpOwogICAgfQp9Ci8qKgogKiBJbnZva2UgdGhlIGhvc3QgYmluZGluZ3MgaW4gY3JlYXRpb24gbW9kZS4KICoKICogQHBhcmFtIHs/fSBkZWYgYERpcmVjdGl2ZURlZmAgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIGBob3N0QmluZGluZ3NgIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IGRpcmVjdGl2ZSBJbnN0YW5jZSBvZiBkaXJlY3RpdmUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnZva2VIb3N0QmluZGluZ3NJbkNyZWF0aW9uTW9kZShkZWYsIGRpcmVjdGl2ZSkgewogICAgaWYgKGRlZi5ob3N0QmluZGluZ3MgIT09IG51bGwpIHsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLmhvc3RCaW5kaW5ncykpKDEgLyogQ3JlYXRlICovLCBkaXJlY3RpdmUpOwogICAgfQp9Ci8qKgogKiBHZW5lcmF0ZXMgYSBuZXcgYmxvY2sgaW4gVFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyBmb3IgdGhpcyBub2RlLgogKgogKiBFYWNoIGV4cGFuZG8gYmxvY2sgc3RhcnRzIHdpdGggdGhlIGVsZW1lbnQgaW5kZXggKHR1cm5lZCBuZWdhdGl2ZSBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2gKICogaXQgZnJvbSB0aGUgaG9zdFZhciBjb3VudCkgYW5kIHRoZSBkaXJlY3RpdmUgY291bnQuIFNlZSBtb3JlIGluIFZJRVdfREFUQS5tZC4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlQ291bnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdlbmVyYXRlRXhwYW5kb0luc3RydWN0aW9uQmxvY2sodFZpZXcsIHROb2RlLCBkaXJlY3RpdmVDb3VudCkgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RDcmVhdGVQYXNzLCB0cnVlLCAnRXhwYW5kbyBibG9jayBzaG91bGQgb25seSBiZSBnZW5lcmF0ZWQgb24gZmlyc3QgY3JlYXRlIHBhc3MuJyk7CiAgICAvLyBJbXBvcnRhbnQ6IEluIEpTIGAteGAgYW5kIGAwLXhgIGlzIG5vdCB0aGUgc2FtZSEgSWYgYHg9PT0wYCB0aGVuIGAteGAgd2lsbCBwcm9kdWNlIGAtMGAgd2hpY2gKICAgIC8vIHJlcXVpcmVzIG5vbiBzdGFuZGFyZCBtYXRoIGFyaXRobWV0aWMgYW5kIGl0IGNhbiBwcmV2ZW50IFZNIG9wdGltaXphdGlvbnMuCiAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlbGVtZW50SW5kZXggPSBIRUFERVJfT0ZGU0VUIC0gdE5vZGUuaW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm92aWRlclN0YXJ0SW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByb3ZpZGVyQ291bnQgPSB0Vmlldy5kYXRhLmxlbmd0aCAtIHByb3ZpZGVyU3RhcnRJbmRleDsKICAgICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zIHx8ICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zID0gW10pKQogICAgICAgIC5wdXNoKGVsZW1lbnRJbmRleCwgcHJvdmlkZXJDb3VudCwgZGlyZWN0aXZlQ291bnQpOwp9Ci8qKgogKiBNYXRjaGVzIHRoZSBjdXJyZW50IG5vZGUgYWdhaW5zdCBhbGwgYXZhaWxhYmxlIHNlbGVjdG9ycy4KICogSWYgYSBjb21wb25lbnQgaXMgbWF0Y2hlZCAoYXQgbW9zdCBvbmUpLCBpdCBpcyByZXR1cm5lZCBpbiBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB2aWV3RGF0YQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmaW5kRGlyZWN0aXZlRGVmTWF0Y2hlcyh0Vmlldywgdmlld0RhdGEsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWdpc3RyeSA9IHRWaWV3LmRpcmVjdGl2ZVJlZ2lzdHJ5OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hdGNoZXMgPSBudWxsOwogICAgaWYgKHJlZ2lzdHJ5KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZiA9ICgvKiogQHR5cGUgez99ICovIChyZWdpc3RyeVtpXSkpOwogICAgICAgICAgICBpZiAoaXNOb2RlTWF0Y2hpbmdTZWxlY3Rvckxpc3QodE5vZGUsICgvKiogQHR5cGUgez99ICovIChkZWYuc2VsZWN0b3JzKSksIC8qIGlzUHJvamVjdGlvbk1vZGUgKi8gZmFsc2UpKSB7CiAgICAgICAgICAgICAgICBtYXRjaGVzIHx8IChtYXRjaGVzID0gbmdEZXZNb2RlID8gbmV3IE1hdGNoZXNBcnJheSgpIDogW10pOwogICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSh0Tm9kZSwgdmlld0RhdGEpLCB0VmlldywgZGVmLnR5cGUpOwogICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLykKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dNdWx0aXBsZUNvbXBvbmVudEVycm9yKHROb2RlKTsKICAgICAgICAgICAgICAgICAgICBtYXJrQXNDb21wb25lbnRIb3N0KHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBpcyBhbHdheXMgc3RvcmVkIGZpcnN0IHdpdGggZGlyZWN0aXZlcyBhZnRlci4KICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnVuc2hpZnQoZGVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChkZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hdGNoZXM7Cn0KLyoqCiAqIE1hcmtzIGEgZ2l2ZW4gVE5vZGUgYXMgYSBjb21wb25lbnQncyBob3N0LiBUaGlzIGNvbnNpc3RzIG9mOgogKiAtIHNldHRpbmcgYXBwcm9wcmlhdGUgVE5vZGUgZmxhZ3M7CiAqIC0gc3RvcmluZyBpbmRleCBvZiBjb21wb25lbnQncyBob3N0IGVsZW1lbnQgc28gaXQgd2lsbCBiZSBxdWV1ZWQgZm9yIHZpZXcgcmVmcmVzaCBkdXJpbmcgQ0QuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBob3N0VE5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hcmtBc0NvbXBvbmVudEhvc3QodFZpZXcsIGhvc3RUTm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBob3N0VE5vZGUuZmxhZ3MgfD0gMiAvKiBpc0NvbXBvbmVudEhvc3QgKi87CiAgICAodFZpZXcuY29tcG9uZW50cyB8fCAodFZpZXcuY29tcG9uZW50cyA9IG5nRGV2TW9kZSA/IG5ldyBUVmlld0NvbXBvbmVudHMoKSA6IFtdKSkKICAgICAgICAucHVzaChob3N0VE5vZGUuaW5kZXgpOwp9Ci8qKgogKiBDYWNoZXMgbG9jYWwgbmFtZXMgYW5kIHRoZWlyIG1hdGNoaW5nIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBxdWVyeSBhbmQgdGVtcGxhdGUgbG9va3Vwcy4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxvY2FsUmVmcwogKiBAcGFyYW0gez99IGV4cG9ydHNNYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNhY2hlTWF0Y2hpbmdMb2NhbE5hbWVzKHROb2RlLCBsb2NhbFJlZnMsIGV4cG9ydHNNYXApIHsKICAgIGlmIChsb2NhbFJlZnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVMb2NhbE5hbWVzKCkgOiBbXTsKICAgICAgICAvLyBMb2NhbCBuYW1lcyBtdXN0IGJlIHN0b3JlZCBpbiB0Tm9kZSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IGxvY2FsUmVmcyBhcmUgZGVmaW5lZAogICAgICAgIC8vIGluIHRoZSB0ZW1wbGF0ZSB0byBlbnN1cmUgdGhlIGRhdGEgaXMgbG9hZGVkIGluIHRoZSBzYW1lIHNsb3RzIGFzIHRoZWlyIHJlZnMKICAgICAgICAvLyBpbiB0aGUgdGVtcGxhdGUgKGZvciB0ZW1wbGF0ZSBxdWVyaWVzKS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsUmVmcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXhwb3J0c01hcFtsb2NhbFJlZnNbaSArIDFdXTsKICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cG9ydCBvZiBuYW1lICcke2xvY2FsUmVmc1tpICsgMV19JyBub3QgZm91bmQhYCk7CiAgICAgICAgICAgIGxvY2FsTmFtZXMucHVzaChsb2NhbFJlZnNbaV0sIGluZGV4KTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEJ1aWxkcyB1cCBhbiBleHBvcnQgbWFwIGFzIGRpcmVjdGl2ZXMgYXJlIGNyZWF0ZWQsIHNvIGxvY2FsIHJlZnMgY2FuIGJlIHF1aWNrbHkgbWFwcGVkCiAqIHRvIHRoZWlyIGRpcmVjdGl2ZSBpbnN0YW5jZXMuCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBkZWYKICogQHBhcmFtIHs/fSBleHBvcnRzTWFwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzYXZlTmFtZVRvRXhwb3J0TWFwKGluZGV4LCBkZWYsIGV4cG9ydHNNYXApIHsKICAgIGlmIChleHBvcnRzTWFwKSB7CiAgICAgICAgaWYgKGRlZi5leHBvcnRBcykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZi5leHBvcnRBcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZXhwb3J0c01hcFtkZWYuZXhwb3J0QXNbaV1dID0gaW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpCiAgICAgICAgICAgIGV4cG9ydHNNYXBbJyddID0gaW5kZXg7CiAgICB9Cn0KLyoqCiAqIEluaXRpYWxpemVzIHRoZSBmbGFncyBvbiB0aGUgY3VycmVudCBub2RlLCBzZXR0aW5nIGFsbCBpbmRpY2VzIHRvIHRoZSBpbml0aWFsIGluZGV4LAogKiB0aGUgZGlyZWN0aXZlIGNvdW50IHRvIDAsIGFuZCBhZGRpbmcgdGhlIGlzQ29tcG9uZW50IGZsYWcuCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBpbmRleCB0aGUgaW5pdGlhbCBpbmRleAogKiBAcGFyYW0gez99IG51bWJlck9mRGlyZWN0aXZlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5pdFROb2RlRmxhZ3ModE5vZGUsIGluZGV4LCBudW1iZXJPZkRpcmVjdGl2ZXMpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKG51bWJlck9mRGlyZWN0aXZlcywgdE5vZGUuZGlyZWN0aXZlRW5kIC0gdE5vZGUuZGlyZWN0aXZlU3RhcnQsICdSZWFjaGVkIHRoZSBtYXggbnVtYmVyIG9mIGRpcmVjdGl2ZXMnKTsKICAgIHROb2RlLmZsYWdzIHw9IDEgLyogaXNEaXJlY3RpdmVIb3N0ICovOwogICAgLy8gV2hlbiB0aGUgZmlyc3QgZGlyZWN0aXZlIGlzIGNyZWF0ZWQgb24gYSBub2RlLCBzYXZlIHRoZSBpbmRleAogICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQgPSBpbmRleDsKICAgIHROb2RlLmRpcmVjdGl2ZUVuZCA9IGluZGV4ICsgbnVtYmVyT2ZEaXJlY3RpdmVzOwogICAgdE5vZGUucHJvdmlkZXJJbmRleGVzID0gaW5kZXg7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB2aWV3RGF0YQogKiBAcGFyYW0gez99IGRlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmFzZVJlc29sdmVEaXJlY3RpdmUodFZpZXcsIHZpZXdEYXRhLCBkZWYpIHsKICAgIHRWaWV3LmRhdGEucHVzaChkZWYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlyZWN0aXZlRmFjdG9yeSA9IGRlZi5mYWN0b3J5IHx8ICgoKC8qKiBAdHlwZSB7P30gKi8gKGRlZikpKS5mYWN0b3J5ID0gZ2V0RmFjdG9yeURlZihkZWYudHlwZSwgdHJ1ZSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZUluamVjdG9yRmFjdG9yeSA9IG5ldyBOb2RlSW5qZWN0b3JGYWN0b3J5KGRpcmVjdGl2ZUZhY3RvcnksIGlzQ29tcG9uZW50RGVmKGRlZiksIG51bGwpOwogICAgdFZpZXcuYmx1ZXByaW50LnB1c2gobm9kZUluamVjdG9yRmFjdG9yeSk7CiAgICB2aWV3RGF0YS5wdXNoKG5vZGVJbmplY3RvckZhY3RvcnkpOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaG9zdFROb2RlCiAqIEBwYXJhbSB7P30gZGVmCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgaG9zdFROb2RlLCBkZWYpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKGhvc3RUTm9kZSwgbFZpZXcpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldE9yQ3JlYXRlVENvbXBvbmVudFZpZXcoZGVmKTsKICAgIC8vIE9ubHkgY29tcG9uZW50IHZpZXdzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgdmlldyB0cmVlIGRpcmVjdGx5LiBFbWJlZGRlZCB2aWV3cyBhcmUKICAgIC8vIGFjY2Vzc2VkIHRocm91Z2ggdGhlaXIgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgbWF5IGJlIHJlbW92ZWQgLyByZS1hZGRlZCBsYXRlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9IGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50VmlldyA9IGFkZFRvVmlld1RyZWUobFZpZXcsIGNyZWF0ZUxWaWV3KGxWaWV3LCB0VmlldywgbnVsbCwgZGVmLm9uUHVzaCA/IDY0IC8qIERpcnR5ICovIDogMTYgLyogQ2hlY2tBbHdheXMgKi8sIG5hdGl2ZSwgKC8qKiBAdHlwZSB7P30gKi8gKGhvc3RUTm9kZSkpLCByZW5kZXJlckZhY3RvcnksIHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihuYXRpdmUsIGRlZikpKTsKICAgIC8vIENvbXBvbmVudCB2aWV3IHdpbGwgYWx3YXlzIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBpbmplY3RlZCBMQ29udGFpbmVycywKICAgIC8vIHNvIHRoaXMgaXMgYSByZWd1bGFyIGVsZW1lbnQsIHdyYXAgaXQgd2l0aCB0aGUgY29tcG9uZW50IHZpZXcKICAgIGxWaWV3W2hvc3RUTm9kZS5pbmRleF0gPSBjb21wb25lbnRWaWV3Owp9Ci8qKgogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHBhcmFtIHs/fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdFNhbWUodmFsdWUsICgvKiogQHR5cGUgez99ICovIChOT19DSEFOR0UpKSwgJ0luY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuJyk7CiAgICBuZ0Rldk1vZGUgJiYgdmFsaWRhdGVBZ2FpbnN0RXZlbnRBdHRyaWJ1dGVzKG5hbWUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlKys7CiAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIG5hbWVzcGFjZSkgOgogICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSBzYW5pdGl6ZXIgPT0gbnVsbCA/IHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkgOiBzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIG5hbWUpOwogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIHN0clZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmFtZXNwYWNlID8gZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIG5hbWUsIHN0clZhbHVlKSA6CiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBzdHJWYWx1ZSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBTZXRzIGluaXRpYWwgaW5wdXQgcHJvcGVydGllcyBvbiBkaXJlY3RpdmUgaW5zdGFuY2VzIGZyb20gYXR0cmlidXRlIGRhdGEKICoKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsVmlldyBDdXJyZW50IExWaWV3IHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkLgogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4IEluZGV4IG9mIHRoZSBkaXJlY3RpdmUgaW4gZGlyZWN0aXZlcyBhcnJheQogKiBAcGFyYW0gez99IGluc3RhbmNlIEluc3RhbmNlIG9mIHRoZSBkaXJlY3RpdmUgb24gd2hpY2ggdG8gc2V0IHRoZSBpbml0aWFsIGlucHV0cwogKiBAcGFyYW0gez99IGRlZiBUaGUgZGlyZWN0aXZlIGRlZiB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIGlucHV0cwogKiBAcGFyYW0gez99IHROb2RlIFRoZSBzdGF0aWMgZGF0YSBmb3IgdGhpcyBub2RlCiAqIEBwYXJhbSB7P30gaW5pdGlhbElucHV0RGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0SW5wdXRzRnJvbUF0dHJzKGxWaWV3LCBkaXJlY3RpdmVJbmRleCwgaW5zdGFuY2UsIGRlZiwgdE5vZGUsIGluaXRpYWxJbnB1dERhdGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluaXRpYWxJbnB1dHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5pdGlhbElucHV0RGF0YSkpW2RpcmVjdGl2ZUluZGV4XTsKICAgIGlmIChpbml0aWFsSW5wdXRzICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNldElucHV0ID0gZGVmLnNldElucHV0OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdGlhbElucHV0cy5sZW5ndGg7KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHVibGljTmFtZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcml2YXRlTmFtZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgaWYgKHNldElucHV0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnNldElucHV0KSkoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGluc3RhbmNlKSkpW3ByaXZhdGVOYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgICAgICAgICBzZXROZ1JlZmxlY3RQcm9wZXJ0eShsVmlldywgbmF0aXZlRWxlbWVudCwgdE5vZGUudHlwZSwgcHJpdmF0ZU5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogR2VuZXJhdGVzIGluaXRpYWxJbnB1dERhdGEgZm9yIGEgbm9kZSBhbmQgc3RvcmVzIGl0IGluIHRoZSB0ZW1wbGF0ZSdzIHN0YXRpYyBzdG9yYWdlCiAqIHNvIHN1YnNlcXVlbnQgdGVtcGxhdGUgaW52b2NhdGlvbnMgZG9uJ3QgaGF2ZSB0byByZWNhbGN1bGF0ZSBpdC4KICoKICogaW5pdGlhbElucHV0RGF0YSBpcyBhbiBhcnJheSBjb250YWluaW5nIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgc2V0IGFzIGlucHV0IHByb3BlcnRpZXMKICogZm9yIGRpcmVjdGl2ZXMgb24gdGhpcyBub2RlLCBidXQgb25seSBvbmNlIG9uIGNyZWF0aW9uLiBXZSBuZWVkIHRoaXMgYXJyYXkgdG8gc3VwcG9ydAogKiB0aGUgY2FzZSB3aGVyZSB5b3Ugc2V0IGFuIFxASW5wdXQgcHJvcGVydHkgb2YgYSBkaXJlY3RpdmUgdXNpbmcgYXR0cmlidXRlLWxpa2Ugc3ludGF4LgogKiBlLmcuIGlmIHlvdSBoYXZlIGEgYG5hbWVgIFxASW5wdXQsIHlvdSBjYW4gc2V0IGl0IG9uY2UgbGlrZSB0aGlzOgogKgogKiA8bXktY29tcG9uZW50IG5hbWU9IkJlc3MiPjwvbXktY29tcG9uZW50PgogKgogKiBAcGFyYW0gez99IGlucHV0cyBUaGUgbGlzdCBvZiBpbnB1dHMgZnJvbSB0aGUgZGlyZWN0aXZlIGRlZgogKiBAcGFyYW0gez99IGF0dHJzIFRoZSBzdGF0aWMgYXR0cnMgb24gdGhpcyBub2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZW5lcmF0ZUluaXRpYWxJbnB1dHMoaW5wdXRzLCBhdHRycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlucHV0c1RvU3RvcmUgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGkgPSAwOwogICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyc1tpXTsKICAgICAgICBpZiAoYXR0ck5hbWUgPT09IDAgLyogTmFtZXNwYWNlVVJJICovKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBpbnB1dHMgb24gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzLgogICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhdHRyTmFtZSA9PT0gNSAvKiBQcm9qZWN0QXMgKi8pIHsKICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBgbmdQcm9qZWN0QXNgIHZhbHVlLgogICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvLyBJZiB3ZSBoaXQgYW55IG90aGVyIGF0dHJpYnV0ZSBtYXJrZXJzLCB3ZSdyZSBkb25lIGFueXdheS4gTm9uZSBvZiB0aG9zZSBhcmUgdmFsaWQgaW5wdXRzLgogICAgICAgIGlmICh0eXBlb2YgYXR0ck5hbWUgPT09ICdudW1iZXInKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoaW5wdXRzLmhhc093blByb3BlcnR5KCgvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpKSkgewogICAgICAgICAgICBpZiAoaW5wdXRzVG9TdG9yZSA9PT0gbnVsbCkKICAgICAgICAgICAgICAgIGlucHV0c1RvU3RvcmUgPSBbXTsKICAgICAgICAgICAgaW5wdXRzVG9TdG9yZS5wdXNoKCgvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpLCBpbnB1dHNbKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJOYW1lKSldLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaSArIDFdKSkpOwogICAgICAgIH0KICAgICAgICBpICs9IDI7CiAgICB9CiAgICByZXR1cm4gaW5wdXRzVG9TdG9yZTsKfQovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vIFZpZXdDb250YWluZXIgJiBWaWV3Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIE5vdCBzdXJlIHdoeSBJIG5lZWQgdG8gZG8gYGFueWAgaGVyZSBidXQgVFMgY29tcGxhaW5zIGxhdGVyLgovKiogQHR5cGUgez99ICovCmNvbnN0IExDb250YWluZXJBcnJheSA9ICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCkpICYmCiAgICBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTENvbnRhaW5lcicpOwovKioKICogQ3JlYXRlcyBhIExDb250YWluZXIsIGVpdGhlciBmcm9tIGEgY29udGFpbmVyIGluc3RydWN0aW9uLCBvciBmb3IgYSBWaWV3Q29udGFpbmVyUmVmLgogKgogKiBAcGFyYW0gez99IGhvc3ROYXRpdmUgVGhlIGhvc3QgZWxlbWVudCBmb3IgdGhlIExDb250YWluZXIKICogQHBhcmFtIHs/fSBjdXJyZW50VmlldyBUaGUgcGFyZW50IHZpZXcgb2YgdGhlIExDb250YWluZXIKICogQHBhcmFtIHs/fSBuYXRpdmUgVGhlIG5hdGl2ZSBjb21tZW50IGVsZW1lbnQKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fSBMQ29udGFpbmVyCiAqLwpmdW5jdGlvbiBjcmVhdGVMQ29udGFpbmVyKGhvc3ROYXRpdmUsIGN1cnJlbnRWaWV3LCBuYXRpdmUsIHROb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcoY3VycmVudFZpZXcpOwogICAgbmdEZXZNb2RlICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihjdXJyZW50Vmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobmF0aXZlKTsKICAgIC8vIGh0dHBzOi8vanNwZXJmLmNvbS9hcnJheS1saXRlcmFsLXZzLW5ldy1hcnJheS1yZWFsbHkKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250YWluZXIgPSBuZXcgKG5nRGV2TW9kZSA/IExDb250YWluZXJBcnJheSA6IEFycmF5KShob3N0TmF0aXZlLCAvLyBob3N0IG5hdGl2ZQogICAgdHJ1ZSwgLy8gQm9vbGVhbiBgdHJ1ZWAgaW4gdGhpcyBwb3NpdGlvbiBzaWduaWZpZXMgdGhhdCB0aGlzIGlzIGFuIGBMQ29udGFpbmVyYAogICAgLTEgLyogRFlOQU1JQ19FTUJFRERFRF9WSUVXU19PTkxZICovIDw8IDEgLyogU0hJRlQgKi8sIC8vIGFjdGl2ZSBpbmRleAogICAgY3VycmVudFZpZXcsIC8vIHBhcmVudAogICAgbnVsbCwgLy8gbmV4dAogICAgbnVsbCwgLy8gcXVlcmllcwogICAgdE5vZGUsIC8vIHRfaG9zdAogICAgbmF0aXZlLCAvLyBuYXRpdmUsCiAgICBudWxsKTsKICAgIG5nRGV2TW9kZSAmJiBhdHRhY2hMQ29udGFpbmVyRGVidWcobENvbnRhaW5lcik7CiAgICByZXR1cm4gbENvbnRhaW5lcjsKfQovKioKICogR29lcyBvdmVyIGR5bmFtaWMgZW1iZWRkZWQgdmlld3MgKG9uZXMgY3JlYXRlZCB0aHJvdWdoIFZpZXdDb250YWluZXJSZWYgQVBJcykgYW5kIHJlZnJlc2hlcwogKiB0aGVtIGJ5IGV4ZWN1dGluZyBhbiBhc3NvY2lhdGVkIHRlbXBsYXRlIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZyZXNoRHluYW1pY0VtYmVkZGVkVmlld3MobFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3T3JDb250YWluZXIgPSBsVmlld1tDSElMRF9IRUFEXTsKICAgIHdoaWxlICh2aWV3T3JDb250YWluZXIgIT09IG51bGwpIHsKICAgICAgICAvLyBOb3RlOiB2aWV3T3JDb250YWluZXIgY2FuIGJlIGFuIExWaWV3IG9yIGFuIExDb250YWluZXIgaW5zdGFuY2UsIGJ1dCBoZXJlIHdlIGFyZSBvbmx5CiAgICAgICAgLy8gaW50ZXJlc3RlZCBpbiBMQ29udGFpbmVyCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBhY3RpdmVJbmRleEZsYWc7CiAgICAgICAgaWYgKGlzTENvbnRhaW5lcih2aWV3T3JDb250YWluZXIpICYmCiAgICAgICAgICAgIChhY3RpdmVJbmRleEZsYWcgPSB2aWV3T3JDb250YWluZXJbQUNUSVZFX0lOREVYXSkgPj4gMSAvKiBTSElGVCAqLyA9PT0KICAgICAgICAgICAgICAgIC0xIC8qIERZTkFNSUNfRU1CRURERURfVklFV1NfT05MWSAqLykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQ7IGkgPCB2aWV3T3JDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmlld09yQ29udGFpbmVyW2ldKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZFRWaWV3ID0gZW1iZWRkZWRMVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChlbWJlZGRlZFRWaWV3LCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGVtYmVkZGVkTFZpZXcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFZpZXcoZW1iZWRkZWRUVmlldywgZW1iZWRkZWRMVmlldywgZW1iZWRkZWRUVmlldy50ZW1wbGF0ZSwgKC8qKiBAdHlwZSB7P30gKi8gKGVtYmVkZGVkTFZpZXdbQ09OVEVYVF0pKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChhY3RpdmVJbmRleEZsYWcgJiAxIC8qIEhBU19UUkFOU1BMQU5URURfVklFV1MgKi8pICE9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgb25seSBDRCBtb3ZlZCB2aWV3cyBpZiB0aGUgY29tcG9uZW50IHdoZXJlIHRoZXkgd2VyZSBpbnNlcnRlZCBkb2VzIG5vdCBtYXRjaAogICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aGVyZSB0aGV5IHdlcmUgZGVjbGFyZWQgYW5kIGluc2VydGlvbiBpcyBvbi1wdXNoLiBNb3ZlZCB2aWV3cyBhbHNvCiAgICAgICAgICAgICAgICAvLyBjb250YWlucyBpbnRyYSBjb21wb25lbnQgbW92ZXMsIG9yIGNoZWNrLWFsd2F5cyB3aGljaCBuZWVkIHRvIGJlIHNraXBwZWQuCiAgICAgICAgICAgICAgICByZWZyZXNoVHJhbnNwbGFudGVkVmlld3Modmlld09yQ29udGFpbmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpZXdPckNvbnRhaW5lciA9IHZpZXdPckNvbnRhaW5lcltORVhUXTsKICAgIH0KfQovKioKICogUmVmcmVzaCB0cmFuc3BsYW50ZWQgTFZpZXdzLgogKgogKiBTZWU6IGBBY3RpdmVJbmRleEZsYWcuSEFTX1RSQU5TUExBTlRFRF9WSUVXU2AgYW5kIGBMVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV11gIGZvcgogKiBleHBsYW5hdGlvbiBvZiB0cmFuc3BsYW50ZWQgdmlld3MuCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgYExDb250YWluZXJgIHdoaWNoIGhhcyB0cmFuc3BsYW50ZWQgdmlld3MuCiAqIEBwYXJhbSB7P30gZGVjbGFyZWRDb21wb25lbnRMVmlldyBUaGUgYGxDb250YWluZXJgIHBhcmVudCBjb21wb25lbnQgYExWaWV3YC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlZnJlc2hUcmFuc3BsYW50ZWRWaWV3cyhsQ29udGFpbmVyLCBkZWNsYXJlZENvbXBvbmVudExWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb3ZlZFZpZXdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChtb3ZlZFZpZXdzLCAnVHJhbnNwbGFudGVkIFZpZXcgZmxhZ3Mgc2V0IGJ1dCBtaXNzaW5nIE1PVkVEX1ZJRVdTJyk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vdmVkVmlld3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbW92ZWRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChtb3ZlZFZpZXdzW2ldKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluc2VydGlvbkxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobW92ZWRMVmlld1tQQVJFTlRdKSk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIoaW5zZXJ0aW9uTENvbnRhaW5lcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluc2VydGVkQ29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5zZXJ0aW9uTENvbnRhaW5lcltQQVJFTlRdW0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGluc2VydGVkQ29tcG9uZW50TFZpZXcsICdNaXNzaW5nIExWaWV3Jyk7CiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRyYW5zcGxhbnRlZCB2aWV3IGJ5IGNvbXBlcmluZyBkZWNsYXJhdGlvbiBhbmQgaW5zZXJ0aW9uIGxvY2F0aW9uLgogICAgICAgIGlmIChpbnNlcnRlZENvbXBvbmVudExWaWV3ICE9PSBkZWNsYXJlZENvbXBvbmVudExWaWV3KSB7CiAgICAgICAgICAgIC8vIFllcyB0aGUgYExWaWV3YCBpcyB0cmFuc3BsYW50ZWQuCiAgICAgICAgICAgIC8vIEhlcmUgd2Ugd291bGQgbGlrZSB0byBrbm93IGlmIHRoZSBjb21wb25lbnQgaXMgYE9uUHVzaGAuIFdlIGRvbid0IGhhdmUKICAgICAgICAgICAgLy8gZXhwbGljaXQgYE9uUHVzaGAgZmxhZyBpbnN0ZWFkIHdlIHNldCBgQ2hlY2tBbHdheXNgIHRvIGZhbHNlICh3aGljaCBpcyBgT25QdXNoYCkKICAgICAgICAgICAgLy8gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYE1hbnVhbE9uUHVzaGAgd2hpY2ggaXMgdXNlZCB3aXRoIHdldGhlciBhIERPTSBldmVudAogICAgICAgICAgICAvLyBzaG91bGQgYXV0b21hdGljYWxseSBtYXJrIGEgdmlldyBhcyBkaXJ0eS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnNlcnRpb25Db21wb25lbnRJc09uUHVzaCA9IChpbnNlcnRlZENvbXBvbmVudExWaWV3W0ZMQUdTXSAmIDE2IC8qIENoZWNrQWx3YXlzICovKSA9PT0gMDsKICAgICAgICAgICAgaWYgKGluc2VydGlvbkNvbXBvbmVudElzT25QdXNoKSB7CiAgICAgICAgICAgICAgICAvLyBIZXJlIHdlIGtub3cgdGhhdCB0aGUgdGVtcGxhdGUgaGFzIGJlZW4gdHJhbnNwbGFudGVkIGFjcm9zcyBjb21wb25lbnRzIGFuZCBpcwogICAgICAgICAgICAgICAgLy8gb24tcHVzaCAobm90IGp1c3QgbW92ZWQgd2l0aGluIGEgY29tcG9uZW50KS4gSWYgdGhlIGluc2VydGlvbiBpcyBtYXJrZWQgZGlydHksIHRoZW4KICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gQ0QgaGVyZSBhcyB3ZSB3aWxsIGRvIGl0IGFnYWluIGxhdGVyIHdoZW4gd2UgZ2V0IHRvIGluc2VydGlvbgogICAgICAgICAgICAgICAgLy8gcG9pbnQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlZFRWaWV3ID0gbW92ZWRMVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChtb3ZlZFRWaWV3LCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3KG1vdmVkVFZpZXcsIG1vdmVkTFZpZXcsIG1vdmVkVFZpZXcudGVtcGxhdGUsICgvKiogQHR5cGUgez99ICovIChtb3ZlZExWaWV3W0NPTlRFWFRdKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8vLy8vLy8vLy8vLy8KLyoqCiAqIFJlZnJlc2hlcyBjb21wb25lbnRzIGJ5IGVudGVyaW5nIHRoZSBjb21wb25lbnQgdmlldyBhbmQgcHJvY2Vzc2luZyBpdHMgYmluZGluZ3MsIHF1ZXJpZXMsIGV0Yy4KICoKICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICogQHBhcmFtIHs/fSBjb21wb25lbnRIb3N0SWR4ICBFbGVtZW50IGluZGV4IGluIExWaWV3W10gKGFkanVzdGVkIGZvciBIRUFERVJfT0ZGU0VUKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmcmVzaENvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudEhvc3RJZHgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShob3N0TFZpZXcpLCBmYWxzZSwgJ1Nob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgoY29tcG9uZW50SG9zdElkeCwgaG9zdExWaWV3KTsKICAgIC8vIE9ubHkgYXR0YWNoZWQgY29tcG9uZW50cyB0aGF0IGFyZSBDaGVja0Fsd2F5cyBvciBPblB1c2ggYW5kIGRpcnR5IHNob3VsZCBiZSByZWZyZXNoZWQKICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGNvbXBvbmVudFZpZXcpICYmCiAgICAgICAgY29tcG9uZW50Vmlld1tGTEFHU10gJiAoMTYgLyogQ2hlY2tBbHdheXMgKi8gfCA2NCAvKiBEaXJ0eSAqLykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50VFZpZXcgPSBjb21wb25lbnRWaWV3W1RWSUVXXTsKICAgICAgICByZWZyZXNoVmlldyhjb21wb25lbnRUVmlldywgY29tcG9uZW50VmlldywgY29tcG9uZW50VFZpZXcudGVtcGxhdGUsIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0pOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGhvc3RMVmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudEhvc3RJZHgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudEhvc3RJZHgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRFcXVhbChpc0NyZWF0aW9uTW9kZShob3N0TFZpZXcpLCB0cnVlLCAnU2hvdWxkIGJlIHJ1biBpbiBjcmVhdGlvbiBtb2RlJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KGNvbXBvbmVudEhvc3RJZHgsIGhvc3RMVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnRUVmlldyA9IGNvbXBvbmVudFZpZXdbVFZJRVddOwogICAgc3luY1ZpZXdXaXRoQmx1ZXByaW50KGNvbXBvbmVudFRWaWV3LCBjb21wb25lbnRWaWV3KTsKICAgIHJlbmRlclZpZXcoY29tcG9uZW50VFZpZXcsIGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0pOwp9Ci8qKgogKiBTeW5jcyBhbiBMVmlldyBpbnN0YW5jZSB3aXRoIGl0cyBibHVlcHJpbnQgaWYgdGhleSBoYXZlIGdvdHRlbiBvdXQgb2Ygc3luYy4KICoKICogVHlwaWNhbGx5LCBibHVlcHJpbnRzIGFuZCB0aGVpciB2aWV3IGluc3RhbmNlcyBzaG91bGQgYWx3YXlzIGJlIGluIHN5bmMsIHNvIHRoZSBsb29wIGhlcmUKICogd2lsbCBiZSBza2lwcGVkLiBIb3dldmVyLCBjb25zaWRlciB0aGlzIGNhc2Ugb2YgdHdvIGNvbXBvbmVudHMgc2lkZS1ieS1zaWRlOgogKgogKiBBcHAgdGVtcGxhdGU6CiAqIGBgYAogKiA8Y29tcD48L2NvbXA+CiAqIDxjb21wPjwvY29tcD4KICogYGBgCiAqCiAqIFRoZSBmb2xsb3dpbmcgd2lsbCBoYXBwZW46CiAqIDEuIEFwcCB0ZW1wbGF0ZSBiZWdpbnMgcHJvY2Vzc2luZy4KICogMi4gRmlyc3QgPGNvbXA+IGlzIG1hdGNoZWQgYXMgYSBjb21wb25lbnQgYW5kIGl0cyBMVmlldyBpcyBjcmVhdGVkLgogKiAzLiBTZWNvbmQgPGNvbXA+IGlzIG1hdGNoZWQgYXMgYSBjb21wb25lbnQgYW5kIGl0cyBMVmlldyBpcyBjcmVhdGVkLgogKiA0LiBBcHAgdGVtcGxhdGUgY29tcGxldGVzIHByb2Nlc3NpbmcsIHNvIGl0J3MgdGltZSB0byBjaGVjayBjaGlsZCB0ZW1wbGF0ZXMuCiAqIDUuIEZpcnN0IDxjb21wPiB0ZW1wbGF0ZSBpcyBjaGVja2VkLiBJdCBoYXMgYSBkaXJlY3RpdmUsIHNvIGl0cyBkZWYgaXMgcHVzaGVkIHRvIGJsdWVwcmludC4KICogNi4gU2Vjb25kIDxjb21wPiB0ZW1wbGF0ZSBpcyBjaGVja2VkLiBJdHMgYmx1ZXByaW50IGhhcyBiZWVuIHVwZGF0ZWQgYnkgdGhlIGZpcnN0CiAqIDxjb21wPiB0ZW1wbGF0ZSwgYnV0IGl0cyBMVmlldyB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyB1cGRhdGUsIHNvIGl0IGlzIG91dCBvZiBzeW5jLgogKgogKiBOb3RlIHRoYXQgZW1iZWRkZWQgdmlld3MgaW5zaWRlIG5nRm9yIGxvb3BzIHdpbGwgbmV2ZXIgYmUgb3V0IG9mIHN5bmMgYmVjYXVzZSB0aGVzZSB2aWV3cwogKiBhcmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhleSBhcmUgY3JlYXRlZC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3YCB0aGF0IGNvbnRhaW5zIHRoZSBibHVlcHJpbnQgZm9yIHN5bmNpbmcKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdmlldyB0byBzeW5jCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzeW5jVmlld1dpdGhCbHVlcHJpbnQodFZpZXcsIGxWaWV3KSB7CiAgICBmb3IgKGxldCBpID0gbFZpZXcubGVuZ3RoOyBpIDwgdFZpZXcuYmx1ZXByaW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbFZpZXcucHVzaCh0Vmlldy5ibHVlcHJpbnRbaV0pOwogICAgfQp9Ci8qKgogKiBBZGRzIExWaWV3IG9yIExDb250YWluZXIgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCB2aWV3IHRyZWUuCiAqCiAqIFRoaXMgc3RydWN0dXJlIHdpbGwgYmUgdXNlZCB0byB0cmF2ZXJzZSB0aHJvdWdoIG5lc3RlZCB2aWV3cyB0byByZW1vdmUgbGlzdGVuZXJzCiAqIGFuZCBjYWxsIG9uRGVzdHJveSBjYWxsYmFja3MuCiAqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgd2hlcmUgTFZpZXcgb3IgTENvbnRhaW5lciBzaG91bGQgYmUgYWRkZWQKICogQHBhcmFtIHs/fSBsVmlld09yTENvbnRhaW5lciBUaGUgTFZpZXcgb3IgTENvbnRhaW5lciB0byBhZGQgdG8gdGhlIHZpZXcgdHJlZQogKiBAcmV0dXJuIHs/fSBUaGUgc3RhdGUgcGFzc2VkIGluCiAqLwpmdW5jdGlvbiBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBsVmlld09yTENvbnRhaW5lcikgewogICAgLy8gVE9ETyhiZW5sZXNoL21pc2tvKTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvcnJlY3QsIGJlY2F1c2UgaXQgYWx3YXlzIGFkZHMgdGhlIExDb250YWluZXIKICAgIC8vIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlLCB3aGljaCBtZWFucyBpZiB0aGUgZGV2ZWxvcGVyIHJldHJpZXZlcyB0aGUgTENvbnRhaW5lcnMgZnJvbSBSTm9kZXMgb3V0CiAgICAvLyBvZiBvcmRlciwgdGhlIGNoYW5nZSBkZXRlY3Rpb24gd2lsbCBydW4gb3V0IG9mIG9yZGVyLCBhcyB0aGUgYWN0IG9mIHJldHJpZXZpbmcgdGhlIHRoZQogICAgLy8gTENvbnRhaW5lciBmcm9tIHRoZSBSTm9kZSBpcyB3aGF0IGFkZHMgaXQgdG8gdGhlIHF1ZXVlLgogICAgaWYgKGxWaWV3W0NISUxEX0hFQURdKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NISUxEX1RBSUxdKSlbTkVYVF0gPSBsVmlld09yTENvbnRhaW5lcjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGxWaWV3W0NISUxEX0hFQURdID0gbFZpZXdPckxDb250YWluZXI7CiAgICB9CiAgICBsVmlld1tDSElMRF9UQUlMXSA9IGxWaWV3T3JMQ29udGFpbmVyOwogICAgcmV0dXJuIGxWaWV3T3JMQ29udGFpbmVyOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyBDaGFuZ2UgZGV0ZWN0aW9uCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLyoqCiAqIE1hcmtzIGN1cnJlbnQgdmlldyBhbmQgYWxsIGFuY2VzdG9ycyBkaXJ0eS4KICoKICogUmV0dXJucyB0aGUgcm9vdCB2aWV3IGJlY2F1c2UgaXQgaXMgZm91bmQgYXMgYSBieXByb2R1Y3Qgb2YgbWFya2luZyB0aGUgdmlldyB0cmVlCiAqIGRpcnR5LCBhbmQgY2FuIGJlIHVzZWQgYnkgbWV0aG9kcyB0aGF0IGNvbnN1bWUgbWFya1ZpZXdEaXJ0eSgpIHRvIGVhc2lseSBzY2hlZHVsZQogKiBjaGFuZ2UgZGV0ZWN0aW9uLiBPdGhlcndpc2UsIHN1Y2ggbWV0aG9kcyB3b3VsZCBuZWVkIHRvIHRyYXZlcnNlIHVwIHRoZSB2aWV3IHRyZWUKICogYW4gYWRkaXRpb25hbCB0aW1lIHRvIGdldCB0aGUgcm9vdCB2aWV3IGFuZCBzY2hlZHVsZSBhIHRpY2sgb24gaXQuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHN0YXJ0aW5nIExWaWV3IHRvIG1hcmsgZGlydHkKICogQHJldHVybiB7P30gdGhlIHJvb3QgTFZpZXcKICovCmZ1bmN0aW9uIG1hcmtWaWV3RGlydHkobFZpZXcpIHsKICAgIHdoaWxlIChsVmlldykgewogICAgICAgIGxWaWV3W0ZMQUdTXSB8PSA2NCAvKiBEaXJ0eSAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0TFZpZXdQYXJlbnQobFZpZXcpOwogICAgICAgIC8vIFN0b3AgdHJhdmVyc2luZyB1cCBhcyBzb29uIGFzIHlvdSBmaW5kIGEgcm9vdCB2aWV3IHRoYXQgd2Fzbid0IGF0dGFjaGVkIHRvIGFueSBjb250YWluZXIKICAgICAgICBpZiAoaXNSb290VmlldyhsVmlldykgJiYgIXBhcmVudCkgewogICAgICAgICAgICByZXR1cm4gbFZpZXc7CiAgICAgICAgfQogICAgICAgIC8vIGNvbnRpbnVlIG90aGVyd2lzZQogICAgICAgIGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudCkpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIFVzZWQgdG8gc2NoZWR1bGUgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGUgd2hvbGUgYXBwbGljYXRpb24uCiAqCiAqIFVubGlrZSBgdGlja2AsIGBzY2hlZHVsZVRpY2tgIGNvYWxlc2NlcyBtdWx0aXBsZSBjYWxscyBpbnRvIG9uZSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi4KICogSXQgaXMgdXN1YWxseSBjYWxsZWQgaW5kaXJlY3RseSBieSBjYWxsaW5nIGBtYXJrRGlydHlgIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gYmUKICogcmUtcmVuZGVyZWQuCiAqCiAqIFR5cGljYWxseSBgc2NoZWR1bGVUaWNrYCB1c2VzIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRvIGNvYWxlc2NlIG11bHRpcGxlCiAqIGBzY2hlZHVsZVRpY2tgIHJlcXVlc3RzLiBUaGUgc2NoZWR1bGluZyBmdW5jdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBpbgogKiBgcmVuZGVyQ29tcG9uZW50YCdzIGBzY2hlZHVsZXJgIG9wdGlvbi4KICogQHBhcmFtIHs/fSByb290Q29udGV4dAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzY2hlZHVsZVRpY2socm9vdENvbnRleHQsIGZsYWdzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBub3RoaW5nU2NoZWR1bGVkID0gcm9vdENvbnRleHQuZmxhZ3MgPT09IDAgLyogRW1wdHkgKi87CiAgICByb290Q29udGV4dC5mbGFncyB8PSBmbGFnczsKICAgIGlmIChub3RoaW5nU2NoZWR1bGVkICYmIHJvb3RDb250ZXh0LmNsZWFuID09IF9DTEVBTl9QUk9NSVNFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXM7CiAgICAgICAgcm9vdENvbnRleHQuY2xlYW4gPSBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocikgPT4gcmVzID0gcikpOwogICAgICAgIHJvb3RDb250ZXh0LnNjaGVkdWxlcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChyb290Q29udGV4dC5mbGFncyAmIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLykgewogICAgICAgICAgICAgICAgcm9vdENvbnRleHQuZmxhZ3MgJj0gfjEgLyogRGV0ZWN0Q2hhbmdlcyAqLzsKICAgICAgICAgICAgICAgIHRpY2tSb290Q29udGV4dChyb290Q29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJvb3RDb250ZXh0LmZsYWdzICYgMiAvKiBGbHVzaFBsYXllcnMgKi8pIHsKICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0LmZsYWdzICY9IH4yIC8qIEZsdXNoUGxheWVycyAqLzsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllckhhbmRsZXIgPSByb290Q29udGV4dC5wbGF5ZXJIYW5kbGVyOwogICAgICAgICAgICAgICAgaWYgKHBsYXllckhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJIYW5kbGVyLmZsdXNoUGxheWVycygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvb3RDb250ZXh0LmNsZWFuID0gX0NMRUFOX1BST01JU0U7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChyZXMpKShudWxsKTsKICAgICAgICB9KSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcm9vdENvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRpY2tSb290Q29udGV4dChyb290Q29udGV4dCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb290Q29udGV4dC5jb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29udGV4dC5jb21wb25lbnRzW2ldOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChyZWFkUGF0Y2hlZExWaWV3KHJvb3RDb21wb25lbnQpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddOwogICAgICAgIHJlbmRlckNvbXBvbmVudE9yVGVtcGxhdGUodFZpZXcsIGxWaWV3LCB0Vmlldy50ZW1wbGF0ZSwgcm9vdENvbXBvbmVudCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGNvbnRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgbFZpZXcsIGNvbnRleHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9IGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldOwogICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5iZWdpbikKICAgICAgICByZW5kZXJlckZhY3RvcnkuYmVnaW4oKTsKICAgIHRyeSB7CiAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0Vmlldy50ZW1wbGF0ZSwgY29udGV4dCk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpOwogICAgICAgIHRocm93IGVycm9yOwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5lbmQpCiAgICAgICAgICAgIHJlbmRlcmVyRmFjdG9yeS5lbmQoKTsKICAgIH0KfQovKioKICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSByb290IHZpZXcgYW5kIGl0cyBjb21wb25lbnRzLgogKgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHdoaWNoIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgb24uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldykgewogICAgdGlja1Jvb3RDb250ZXh0KCgvKiogQHR5cGUgez99ICovIChsVmlld1tDT05URVhUXSkpKTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IHZpZXcKICogQHBhcmFtIHs/fSBjb250ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja05vQ2hhbmdlc0ludGVybmFsKHRWaWV3LCB2aWV3LCBjb250ZXh0KSB7CiAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUodHJ1ZSk7CiAgICB0cnkgewogICAgICAgIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgdmlldywgY29udGV4dCk7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpOwogICAgfQp9Ci8qKgogKiBDaGVja3MgdGhlIGNoYW5nZSBkZXRlY3RvciBvbiBhIHJvb3QgdmlldyBhbmQgaXRzIGNvbXBvbmVudHMsIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlCiAqIGRldGVjdGVkLgogKgogKiBUaGlzIGlzIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSB0byB2ZXJpZnkgdGhhdCBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndAogKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy4KICoKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdmlldyB3aGljaCB0aGUgY2hhbmdlIGRldGVjdGlvbiBzaG91bGQgYmUgY2hlY2tlZCBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNoZWNrTm9DaGFuZ2VzSW5Sb290VmlldyhsVmlldykgewogICAgc2V0Q2hlY2tOb0NoYW5nZXNNb2RlKHRydWUpOwogICAgdHJ5IHsKICAgICAgICBkZXRlY3RDaGFuZ2VzSW5Sb290VmlldyhsVmlldyk7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGZsYWdzCiAqIEBwYXJhbSB7P30gdmlld1F1ZXJ5Rm4KICogQHBhcmFtIHs/fSBjb21wb25lbnQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4ZWN1dGVWaWV3UXVlcnlGbihmbGFncywgdmlld1F1ZXJ5Rm4sIGNvbXBvbmVudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodmlld1F1ZXJ5Rm4sICdWaWV3IHF1ZXJpZXMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBtdXN0IGJlIGRlZmluZWQuJyk7CiAgICBzZXRDdXJyZW50UXVlcnlJbmRleCgwKTsKICAgIHZpZXdRdWVyeUZuKGZsYWdzLCBjb21wb25lbnQpOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLyBCaW5kaW5ncyAmIGludGVycG9sYXRpb25zCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLyoqCiAqIFN0b3JlcyBtZXRhLWRhdGEgZm9yIGEgcHJvcGVydHkgYmluZGluZyB0byBiZSB1c2VkIGJ5IFRlc3RCZWQncyBgRGVidWdFbGVtZW50LnByb3BlcnRpZXNgLgogKgogKiBJbiBvcmRlciB0byBzdXBwb3J0IFRlc3RCZWQncyBgRGVidWdFbGVtZW50LnByb3BlcnRpZXNgIHdlIG5lZWQgdG8gc2F2ZSwgZm9yIGVhY2ggYmluZGluZzoKICogLSBhIGJvdW5kIHByb3BlcnR5IG5hbWU7CiAqIC0gYSBzdGF0aWMgcGFydHMgb2YgaW50ZXJwb2xhdGVkIHN0cmluZ3M7CiAqCiAqIEEgZ2l2ZW4gcHJvcGVydHkgbWV0YWRhdGEgaXMgc2F2ZWQgYXQgdGhlIGJpbmRpbmcncyBpbmRleCBpbiB0aGUgYFRWaWV3LmRhdGFgIChpbiBvdGhlciB3b3JkcywgYQogKiBwcm9wZXJ0eSBiaW5kaW5nIG1ldGFkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGBUVmlldy5kYXRhYCBhdCB0aGUgc2FtZSBpbmRleCBhcyBhIGJvdW5kIHZhbHVlIGluCiAqIGBMVmlld2ApLiBNZXRhZGF0YSBhcmUgcmVwcmVzZW50ZWQgYXMgYElOVEVSUE9MQVRJT05fREVMSU1JVEVSYC1kZWxpbWl0ZWQgc3RyaW5nIHdpdGggdGhlCiAqIGZvbGxvd2luZyBmb3JtYXQ6CiAqIC0gYHByb3BlcnR5TmFtZWAgZm9yIGJvdW5kIHByb3BlcnRpZXM7CiAqIC0gYHByb3BlcnR5TmFtZe+/vXByZWZpeO+/vWludGVycG9sYXRpb25fc3RhdGljX3BhcnQx77+9Li5pbnRlcnBvbGF0aW9uX3N0YXRpY19wYXJ0Tu+/vXN1ZmZpeGAgZm9yCiAqIGludGVycG9sYXRlZCBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgbWV0YS1kYXRhIHdpbGwgYmUgc2F2ZWQ7CiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB0aGF0IGlzIGEgdGFyZ2V0IG9mIHRoZSBiaW5kaW5nOwogKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZSBib3VuZCBwcm9wZXJ0eSBuYW1lOwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleCBiaW5kaW5nIGluZGV4IGluIGBMVmlld2AKICogQHBhcmFtIHsuLi4/fSBpbnRlcnBvbGF0aW9uUGFydHMgc3RhdGljIGludGVycG9sYXRpb24gcGFydHMgKGZvciBwcm9wZXJ0eSBpbnRlcnBvbGF0aW9ucykKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodERhdGEsIHROb2RlLCBwcm9wZXJ0eU5hbWUsIGJpbmRpbmdJbmRleCwgLi4uaW50ZXJwb2xhdGlvblBhcnRzKSB7CiAgICAvLyBCaW5kaW5nIG1ldGEtZGF0YSBhcmUgc3RvcmVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgYSBnaXZlbiBwcm9wZXJ0eSBpbnN0cnVjdGlvbiBpcyBwcm9jZXNzZWQuCiAgICAvLyBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgY29uY2VwdCBvZiB0aGUgImZpcnN0IHVwZGF0ZSBwYXNzIiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBwcmVzZW5jZSBvZiB0aGUKICAgIC8vIGJpbmRpbmcgbWV0YS1kYXRhIHRvIGRlY2lkZSBpZiBvbmUgc2hvdWxkIGJlIHN0b3JlZCAob3IgaWYgd2FzIHN0b3JlZCBhbHJlYWR5KS4KICAgIGlmICh0RGF0YVtiaW5kaW5nSW5kZXhdID09PSBudWxsKSB7CiAgICAgICAgaWYgKHROb2RlLmlucHV0cyA9PSBudWxsIHx8ICF0Tm9kZS5pbnB1dHNbcHJvcGVydHlOYW1lXSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3BCaW5kaW5nSWR4cyA9IHROb2RlLnByb3BlcnR5QmluZGluZ3MgfHwgKHROb2RlLnByb3BlcnR5QmluZGluZ3MgPSBbXSk7CiAgICAgICAgICAgIHByb3BCaW5kaW5nSWR4cy5wdXNoKGJpbmRpbmdJbmRleCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGJpbmRpbmdNZXRhZGF0YSA9IHByb3BlcnR5TmFtZTsKICAgICAgICAgICAgaWYgKGludGVycG9sYXRpb25QYXJ0cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBiaW5kaW5nTWV0YWRhdGEgKz0KICAgICAgICAgICAgICAgICAgICBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiArIGludGVycG9sYXRpb25QYXJ0cy5qb2luKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0RGF0YVtiaW5kaW5nSW5kZXhdID0gYmluZGluZ01ldGFkYXRhOwogICAgICAgIH0KICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IENMRUFOX1BST01JU0UgPSBfQ0xFQU5fUFJPTUlTRTsKLyoqCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TENsZWFudXAodmlldykgewogICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKQogICAgcmV0dXJuIHZpZXdbQ0xFQU5VUF0gfHwgKHZpZXdbQ0xFQU5VUF0gPSBuZ0Rldk1vZGUgPyBuZXcgTENsZWFudXAoKSA6IFtdKTsKfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0VFZpZXdDbGVhbnVwKHRWaWV3KSB7CiAgICByZXR1cm4gdFZpZXcuY2xlYW51cCB8fCAodFZpZXcuY2xlYW51cCA9IG5nRGV2TW9kZSA/IG5ldyBUQ2xlYW51cCgpIDogW10pOwp9Ci8qKgogKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHN1YiBjb21wb25lbnQncyByZW5kZXJlciBuZWVkcyB0byBiZSBpbmNsdWRlZAogKiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHJlbmRlcmVyIChzZWUgdGhlIGNvbXBvbmVudFN5bnRoZXRpY0hvc3QqIGluc3RydWN0aW9ucykuCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9hZENvbXBvbmVudFJlbmRlcmVyKHROb2RlLCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwTFZpZXcobFZpZXdbdE5vZGUuaW5kZXhdKSkpOwogICAgcmV0dXJuIGNvbXBvbmVudExWaWV3W1JFTkRFUkVSXTsKfQovKioKICogSGFuZGxlcyBhbiBlcnJvciB0aHJvd24gaW4gYW4gTFZpZXcuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBlcnJvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFuZGxlRXJyb3IobFZpZXcsIGVycm9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmplY3RvciA9IGxWaWV3W0lOSkVDVE9SJDFdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3JIYW5kbGVyID0gaW5qZWN0b3IgPyBpbmplY3Rvci5nZXQoRXJyb3JIYW5kbGVyLCBudWxsKSA6IG51bGw7CiAgICBlcnJvckhhbmRsZXIgJiYgZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKTsKfQovKioKICogU2V0IHRoZSBpbnB1dHMgb2YgZGlyZWN0aXZlcyBhdCB0aGUgY3VycmVudCBub2RlIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGN1cnJlbnQgVFZpZXcKICogQHBhcmFtIHs/fSBsVmlldyB0aGUgYExWaWV3YCB3aGljaCBjb250YWlucyB0aGUgZGlyZWN0aXZlcy4KICogQHBhcmFtIHs/fSBpbnB1dHMgbWFwcGluZyBiZXR3ZWVuIHRoZSBwdWJsaWMgImlucHV0IiBuYW1lIGFuZCBwcml2YXRlbHkta25vd24sCiAqICAgICAgICBwb3NzaWJseSBtaW5pZmllZCwgcHJvcGVydHkgbmFtZXMgdG8gd3JpdGUgdG8uCiAqIEBwYXJhbSB7P30gcHVibGljTmFtZQogKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIHRvIHNldC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldElucHV0c0ZvclByb3BlcnR5KHRWaWV3LCBsVmlldywgaW5wdXRzLCBwdWJsaWNOYW1lLCB2YWx1ZSkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChpbnB1dHNbaSsrXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcml2YXRlTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChpbnB1dHNbaSsrXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaW5kZXhdKSk7CiAgICAgICAgaWYgKGRlZi5zZXRJbnB1dCAhPT0gbnVsbCkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnNldElucHV0KSkoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnN0YW5jZVtwcml2YXRlTmFtZV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZXMgYSB0ZXh0IGJpbmRpbmcgYXQgYSBnaXZlbiBpbmRleCBpbiBhIGdpdmVuIExWaWV3LgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgaW5kZXgsIHZhbHVlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKE5PX0NIQU5HRSkpLCAndmFsdWUgc2hvdWxkIG5vdCBiZSBOT19DSEFOR0UnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5SW5kZXgoaW5kZXgsIGxWaWV3KSkpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChlbGVtZW50LCAnbmF0aXZlIGVsZW1lbnQgc2hvdWxkIGV4aXN0Jyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0VGV4dCsrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5zZXRWYWx1ZShlbGVtZW50LCB2YWx1ZSkgOiBlbGVtZW50LnRleHRDb250ZW50ID0gdmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBlbWJlZGRlZFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExDb250YWluZXIodE5vZGUsIGVtYmVkZGVkVmlldykgewogICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGVtYmVkZGVkVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZW1iZWRkZWRWaWV3W1BBUkVOVF0pKTsKICAgIGlmICh0Tm9kZS5pbmRleCA9PT0gLTEpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgZHluYW1pY2FsbHkgY3JlYXRlZCB2aWV3IGluc2lkZSBhIGR5bmFtaWMgY29udGFpbmVyLgogICAgICAgIC8vIFRoZSBwYXJlbnQgaXNuJ3QgYW4gTENvbnRhaW5lciBpZiB0aGUgZW1iZWRkZWQgdmlldyBoYXNuJ3QgYmVlbiBhdHRhY2hlZCB5ZXQuCiAgICAgICAgcmV0dXJuIGlzTENvbnRhaW5lcihjb250YWluZXIpID8gY29udGFpbmVyIDogbnVsbDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGNvbnRhaW5lcik7CiAgICAgICAgLy8gVGhpcyBpcyBhIGlubGluZSB2aWV3IG5vZGUgKGUuZy4gZW1iZWRkZWRWaWV3U3RhcnQpCiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgIH0KfQovKioKICogUmV0cmlldmVzIHJlbmRlciBwYXJlbnQgZm9yIGEgZ2l2ZW4gdmlldy4KICogTWlnaHQgYmUgbnVsbCBpZiBhIHZpZXcgaXMgbm90IHlldCBhdHRhY2hlZCB0byBhbnkgY29udGFpbmVyLgogKiBAcGFyYW0gez99IHRWaWV3Tm9kZQogKiBAcGFyYW0gez99IHZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENvbnRhaW5lclJlbmRlclBhcmVudCh0Vmlld05vZGUsIHZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldExDb250YWluZXIodFZpZXdOb2RlLCB2aWV3KTsKICAgIHJldHVybiBjb250YWluZXIgPyBuYXRpdmVQYXJlbnROb2RlKHZpZXdbUkVOREVSRVJdLCBjb250YWluZXJbTkFUSVZFXSkgOiBudWxsOwp9Ci8qKgogKiBOT1RFOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIHBvc3NpYmxlIGFjdGlvbnMgYXJlIGlubGluZWQgd2l0aGluIHRoZSBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAqIGJlaW5nIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcGFyYW0gez99IGxOb2RlVG9IYW5kbGUKICogQHBhcmFtIHs/PX0gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCBwYXJlbnQsIGxOb2RlVG9IYW5kbGUsIGJlZm9yZU5vZGUpIHsKICAgIC8vIElmIHRoaXMgc2xvdCB3YXMgYWxsb2NhdGVkIGZvciBhIHRleHQgbm9kZSBkeW5hbWljYWxseSBjcmVhdGVkIGJ5IGkxOG4sIHRoZSB0ZXh0IG5vZGUgaXRzZWxmCiAgICAvLyB3b24ndCBiZSBjcmVhdGVkIHVudGlsIGkxOG5BcHBseSgpIGluIHRoZSB1cGRhdGUgYmxvY2ssIHNvIHRoaXMgbm9kZSBzaG91bGQgYmUgc2tpcHBlZC4KICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSAiSUNVIGV4cHJlc3Npb25zIHNob3VsZCB3b3JrIGluc2lkZSBhbiBuZ1RlbXBsYXRlT3V0bGV0IGluc2lkZSBhbiBuZ0ZvciIKICAgIC8vIGluIGBpMThuX3NwZWMudHNgLgogICAgaWYgKGxOb2RlVG9IYW5kbGUgIT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbENvbnRhaW5lcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlzQ29tcG9uZW50ID0gZmFsc2U7CiAgICAgICAgLy8gV2UgYXJlIGV4cGVjdGluZyBhbiBSTm9kZSwgYnV0IGluIHRoZSBjYXNlIG9mIGEgY29tcG9uZW50IG9yIExDb250YWluZXIgdGhlIGBSTm9kZWAgaXMKICAgICAgICAvLyB3cmFwcGVkIGluIGFuIGFycmF5IHdoaWNoIG5lZWRzIHRvIGJlIHVud3JhcHBlZC4gV2UgbmVlZCB0byBrbm93IGlmIGl0IGlzIGEgY29tcG9uZW50IGFuZCBpZgogICAgICAgIC8vIGl0IGhhcyBMQ29udGFpbmVyIHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgYWxsIG9mIHRob3NlIGNhc2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgaWYgKGlzTENvbnRhaW5lcihsTm9kZVRvSGFuZGxlKSkgewogICAgICAgICAgICBsQ29udGFpbmVyID0gbE5vZGVUb0hhbmRsZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNMVmlldyhsTm9kZVRvSGFuZGxlKSkgewogICAgICAgICAgICBpc0NvbXBvbmVudCA9IHRydWU7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxOb2RlVG9IYW5kbGVbSE9TVF0sICdIT1NUIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBjb21wb25lbnQgTFZpZXcnKTsKICAgICAgICAgICAgbE5vZGVUb0hhbmRsZSA9ICgvKiogQHR5cGUgez99ICovIChsTm9kZVRvSGFuZGxlW0hPU1RdKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByTm9kZSA9IHVud3JhcFJOb2RlKGxOb2RlVG9IYW5kbGUpOwogICAgICAgIG5nRGV2TW9kZSAmJiAhaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpICYmIGFzc2VydERvbU5vZGUock5vZGUpOwogICAgICAgIGlmIChhY3Rpb24gPT09IDAgLyogQ3JlYXRlICovICYmIHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoYmVmb3JlTm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVBcHBlbmRDaGlsZChyZW5kZXJlciwgcGFyZW50LCByTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuYXRpdmVJbnNlcnRCZWZvcmUocmVuZGVyZXIsIHBhcmVudCwgck5vZGUsIGJlZm9yZU5vZGUgfHwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAxIC8qIEluc2VydCAqLyAmJiBwYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIHJOb2RlLCBiZWZvcmVOb2RlIHx8IG51bGwpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09IDIgLyogRGV0YWNoICovKSB7CiAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBpc0NvbXBvbmVudCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gMyAvKiBEZXN0cm95ICovKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95Tm9kZSsrOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5kZXN0cm95Tm9kZSkpKHJOb2RlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxDb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICBhcHBseUNvbnRhaW5lcihyZW5kZXJlciwgYWN0aW9uLCBsQ29udGFpbmVyLCBwYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh2YWx1ZSwgcmVuZGVyZXIpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrOwogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKzsKICAgIHJldHVybiBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5jcmVhdGVUZXh0KHZhbHVlKSA6CiAgICAgICAgcmVuZGVyZXIuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbnNlcnRNb2RlCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYWRkUmVtb3ZlVmlld0Zyb21Db250YWluZXIodFZpZXcsIGxWaWV3LCBpbnNlcnRNb2RlLCBiZWZvcmVOb2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJQYXJlbnQgPSBnZXRDb250YWluZXJSZW5kZXJQYXJlbnQoKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKSwgbFZpZXcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5ub2RlKSksIDIgLyogVmlldyAqLyk7CiAgICBpZiAocmVuZGVyUGFyZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3Rpb24gPSBpbnNlcnRNb2RlID8gMSAvKiBJbnNlcnQgKi8gOiAyIC8qIERldGFjaCAqLzsKICAgICAgICBhcHBseVZpZXcodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgYWN0aW9uLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgfQp9Ci8qKgogKiBEZXRhY2ggYSBgTFZpZXdgIGZyb20gdGhlIERPTSBieSBkZXRhY2hpbmcgaXRzIG5vZGVzLgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBgVFZpZXcnIG9mIHRoZSBgTFZpZXdgIHRvIGJlIGRldGFjaGVkCiAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGBMVmlld2AgdG8gYmUgZGV0YWNoZWQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZW5kZXJEZXRhY2hWaWV3KHRWaWV3LCBsVmlldykgewogICAgYXBwbHlWaWV3KHRWaWV3LCBsVmlldywgbFZpZXdbUkVOREVSRVJdLCAyIC8qIERldGFjaCAqLywgbnVsbCwgbnVsbCk7Cn0KLyoqCiAqIFRyYXZlcnNlcyBkb3duIGFuZCB1cCB0aGUgdHJlZSBvZiB2aWV3cyBhbmQgY29udGFpbmVycyB0byByZW1vdmUgbGlzdGVuZXJzIGFuZAogKiBjYWxsIG9uRGVzdHJveSBjYWxsYmFja3MuCiAqCiAqIE5vdGVzOgogKiAgLSBCZWNhdXNlIGl0J3MgdXNlZCBmb3Igb25EZXN0cm95IGNhbGxzLCBpdCBuZWVkcyB0byBiZSBib3R0b20tdXAuCiAqICAtIE11c3QgcHJvY2VzcyBjb250YWluZXJzIGluc3RlYWQgb2YgdGhlaXIgdmlld3MgdG8gYXZvaWQgc3BsaWNpbmcKICogIHdoZW4gdmlld3MgYXJlIGRlc3Ryb3llZCBhbmQgcmUtYWRkZWQuCiAqICAtIFVzaW5nIGEgd2hpbGUgbG9vcCBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gcmVjdXJzaW9uCiAqICAtIERlc3Ryb3kgb25seSBjYWxsZWQgb24gbW92ZW1lbnQgdG8gc2libGluZyBvciBtb3ZlbWVudCB0byBwYXJlbnQgKGxhdGVyYWxseSBvciB1cCkKICoKICogQHBhcmFtIHs/fSByb290VmlldyBUaGUgdmlldyB0byBkZXN0cm95CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXN0cm95Vmlld1RyZWUocm9vdFZpZXcpIHsKICAgIC8vIElmIHRoZSB2aWV3IGhhcyBubyBjaGlsZHJlbiwgd2UgY2FuIGNsZWFuIGl0IHVwIGFuZCByZXR1cm4gZWFybHkuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXdPckxDb250YWluZXIgPSByb290Vmlld1tDSElMRF9IRUFEXTsKICAgIGlmICghbFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICByZXR1cm4gY2xlYW5VcFZpZXcocm9vdFZpZXdbVFZJRVddLCByb290Vmlldyk7CiAgICB9CiAgICB3aGlsZSAobFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5leHQgPSBudWxsOwogICAgICAgIGlmIChpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSkgewogICAgICAgICAgICAvLyBJZiBMVmlldywgdHJhdmVyc2UgZG93biB0byBjaGlsZC4KICAgICAgICAgICAgbmV4dCA9IGxWaWV3T3JMQ29udGFpbmVyW0NISUxEX0hFQURdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIobFZpZXdPckxDb250YWluZXIpOwogICAgICAgICAgICAvLyBJZiBjb250YWluZXIsIHRyYXZlcnNlIGRvd24gdG8gaXRzIGZpcnN0IExWaWV3LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmlldyA9IGxWaWV3T3JMQ29udGFpbmVyW0NPTlRBSU5FUl9IRUFERVJfT0ZGU0VUXTsKICAgICAgICAgICAgaWYgKGZpcnN0VmlldykKICAgICAgICAgICAgICAgIG5leHQgPSBmaXJzdFZpZXc7CiAgICAgICAgfQogICAgICAgIGlmICghbmV4dCkgewogICAgICAgICAgICAvLyBPbmx5IGNsZWFuIHVwIHZpZXcgd2hlbiBtb3ZpbmcgdG8gdGhlIHNpZGUgb3IgdXAsIGFzIGRlc3Ryb3kgaG9va3MKICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciBmcm9tIHRoZSBib3R0b20gdXAuCiAgICAgICAgICAgIHdoaWxlIChsVmlld09yTENvbnRhaW5lciAmJiAhKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3T3JMQ29udGFpbmVyKSlbTkVYVF0gJiYgbFZpZXdPckxDb250YWluZXIgIT09IHJvb3RWaWV3KSB7CiAgICAgICAgICAgICAgICBpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiBjbGVhblVwVmlldyhsVmlld09yTENvbnRhaW5lcltUVklFV10sIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGxWaWV3T3JMQ29udGFpbmVyID0gZ2V0UGFyZW50U3RhdGUobFZpZXdPckxDb250YWluZXIsIHJvb3RWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobFZpZXdPckxDb250YWluZXIgPT09IG51bGwpCiAgICAgICAgICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IHJvb3RWaWV3OwogICAgICAgICAgICBpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiBjbGVhblVwVmlldyhsVmlld09yTENvbnRhaW5lcltUVklFV10sIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgbmV4dCA9IGxWaWV3T3JMQ29udGFpbmVyICYmICgvKiogQHR5cGUgez99ICovIChsVmlld09yTENvbnRhaW5lcikpW05FWFRdOwogICAgICAgIH0KICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IG5leHQ7CiAgICB9Cn0KLyoqCiAqIEluc2VydHMgYSB2aWV3IGludG8gYSBjb250YWluZXIuCiAqCiAqIFRoaXMgYWRkcyB0aGUgdmlldyB0byB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzIGluIHRoZSBjb3JyZWN0CiAqIHBvc2l0aW9uLiBJdCBhbHNvIGFkZHMgdGhlIHZpZXcncyBlbGVtZW50cyB0byB0aGUgRE9NIGlmIHRoZSBjb250YWluZXIgaXNuJ3QgYQogKiByb290IG5vZGUgb2YgYW5vdGhlciB2aWV3IChpbiB0aGF0IGNhc2UsIHRoZSB2aWV3J3MgZWxlbWVudHMgd2lsbCBiZSBhZGRlZCB3aGVuCiAqIHRoZSBjb250YWluZXIncyBwYXJlbnQgdmlldyBpcyBhZGRlZCBsYXRlcikuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gaW5zZXJ0CiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gaW5zZXJ0CiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgY29udGFpbmVyIGludG8gd2hpY2ggdGhlIHZpZXcgc2hvdWxkIGJlIGluc2VydGVkCiAqIEBwYXJhbSB7P30gaW5kZXggV2hpY2ggaW5kZXggaW4gdGhlIGNvbnRhaW5lciB0byBpbnNlcnQgdGhlIGNoaWxkIHZpZXcgaW50bwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zZXJ0Vmlldyh0VmlldywgbFZpZXcsIGxDb250YWluZXIsIGluZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIobENvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmRleEluQ29udGFpbmVyID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQgKyBpbmRleDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lckxlbmd0aCA9IGxDb250YWluZXIubGVuZ3RoOwogICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgIC8vIFRoaXMgaXMgYSBuZXcgdmlldywgd2UgbmVlZCB0byBhZGQgaXQgdG8gdGhlIGNoaWxkcmVuLgogICAgICAgIGxDb250YWluZXJbaW5kZXhJbkNvbnRhaW5lciAtIDFdW05FWFRdID0gbFZpZXc7CiAgICB9CiAgICBpZiAoaW5kZXggPCBjb250YWluZXJMZW5ndGggLSBDT05UQUlORVJfSEVBREVSX09GRlNFVCkgewogICAgICAgIGxWaWV3W05FWFRdID0gbENvbnRhaW5lcltpbmRleEluQ29udGFpbmVyXTsKICAgICAgICBhZGRUb0FycmF5KGxDb250YWluZXIsIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgaW5kZXgsIGxWaWV3KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGxDb250YWluZXIucHVzaChsVmlldyk7CiAgICAgICAgbFZpZXdbTkVYVF0gPSBudWxsOwogICAgfQogICAgbFZpZXdbUEFSRU5UXSA9IGxDb250YWluZXI7CiAgICAvLyB0cmFjayB2aWV3cyB3aGVyZSBkZWNsYXJhdGlvbiBhbmQgaW5zZXJ0aW9uIHBvaW50cyBhcmUgZGlmZmVyZW50CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSBsVmlld1tERUNMQVJBVElPTl9MQ09OVEFJTkVSXTsKICAgIGlmIChkZWNsYXJhdGlvbkxDb250YWluZXIgIT09IG51bGwgJiYgbENvbnRhaW5lciAhPT0gZGVjbGFyYXRpb25MQ29udGFpbmVyKSB7CiAgICAgICAgdHJhY2tNb3ZlZFZpZXcoZGVjbGFyYXRpb25MQ29udGFpbmVyLCBsVmlldyk7CiAgICB9CiAgICAvLyBub3RpZnkgcXVlcnkgdGhhdCBhIG5ldyB2aWV3IGhhcyBiZWVuIGFkZGVkCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsUXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdOwogICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgbFF1ZXJpZXMuaW5zZXJ0Vmlldyh0Vmlldyk7CiAgICB9CiAgICAvLyBTZXRzIHRoZSBhdHRhY2hlZCBmbGFnCiAgICBsVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovOwp9Ci8qKgogKiBUcmFjayB2aWV3cyBjcmVhdGVkIGZyb20gdGhlIGRlY2xhcmF0aW9uIGNvbnRhaW5lciAoVGVtcGxhdGVSZWYpIGFuZCBpbnNlcnRlZCBpbnRvIGEKICogZGlmZmVyZW50IExDb250YWluZXIuCiAqIEBwYXJhbSB7P30gZGVjbGFyYXRpb25Db250YWluZXIKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdHJhY2tNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChsVmlldywgJ0xWaWV3IHJlcXVpcmVkJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkNvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb3ZlZFZpZXdzID0gZGVjbGFyYXRpb25Db250YWluZXJbTU9WRURfVklFV1NdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5zZXJ0ZWRMQ29udGFpbmVyID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1BBUkVOVF0pKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGluc2VydGVkTENvbnRhaW5lcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnNlcnRlZENvbXBvbmVudExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGluc2VydGVkTENvbnRhaW5lcltQQVJFTlRdKSlbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoaW5zZXJ0ZWRDb21wb25lbnRMVmlldywgJ01pc3NpbmcgaW5zZXJ0ZWRDb21wb25lbnRMVmlldycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5zZXJ0ZWRDb21wb25lbnRJc09uUHVzaCA9IChpbnNlcnRlZENvbXBvbmVudExWaWV3W0ZMQUdTXSAmIDE2IC8qIENoZWNrQWx3YXlzICovKSAhPT0gMTYgLyogQ2hlY2tBbHdheXMgKi87CiAgICBpZiAoaW5zZXJ0ZWRDb21wb25lbnRJc09uUHVzaCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJlZENvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGRlY2xhcmVkQ29tcG9uZW50TFZpZXcsICdNaXNzaW5nIGRlY2xhcmVkQ29tcG9uZW50TFZpZXcnKTsKICAgICAgICBpZiAoZGVjbGFyZWRDb21wb25lbnRMVmlldyAhPT0gaW5zZXJ0ZWRDb21wb25lbnRMVmlldykgewogICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBkZWNsYXJhdGlvbi1jb21wb25lbnQgaXMgbm90IHNhbWUgYXMgaW5zZXJ0aW9uLWNvbXBvbmVudCBhbmQgd2UgYXJlIGluCiAgICAgICAgICAgIC8vIG9uLXB1c2ggbW9kZSwgdGhpcyBtZWFucyB0aGF0IHRoaXMgaXMgYSB0cmFuc3BsYW50ZWQgdmlldy4gTWFyayB0aGUgZGVjbGFyZWQgbFZpZXcgYXMKICAgICAgICAgICAgLy8gaGF2aW5nCiAgICAgICAgICAgIC8vIHRyYW5zcGxhbnRlZCB2aWV3cyBzbyB0aGF0IHRob3NlIHZpZXdzIGNhbiBwYXJ0aWNpcGF0ZSBpbiBDRC4KICAgICAgICAgICAgZGVjbGFyYXRpb25Db250YWluZXJbQUNUSVZFX0lOREVYXSB8PSAxIC8qIEhBU19UUkFOU1BMQU5URURfVklFV1MgKi87CiAgICAgICAgfQogICAgfQogICAgaWYgKG1vdmVkVmlld3MgPT09IG51bGwpIHsKICAgICAgICBkZWNsYXJhdGlvbkNvbnRhaW5lcltNT1ZFRF9WSUVXU10gPSBbbFZpZXddOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbW92ZWRWaWV3cy5wdXNoKGxWaWV3KTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbkNvbnRhaW5lcgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZXRhY2hNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkNvbnRhaW5lcik7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnREZWZpbmVkKGRlY2xhcmF0aW9uQ29udGFpbmVyW01PVkVEX1ZJRVdTXSwgJ0EgcHJvamVjdGVkIHZpZXcgc2hvdWxkIGJlbG9uZyB0byBhIG5vbi1lbXB0eSBwcm9qZWN0ZWQgdmlld3MgY29sbGVjdGlvbicpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW92ZWRWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbkNvbnRhaW5lcltNT1ZFRF9WSUVXU10pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlY2xhcmVkVmlld0luZGV4ID0gbW92ZWRWaWV3cy5pbmRleE9mKGxWaWV3KTsKICAgIG1vdmVkVmlld3Muc3BsaWNlKGRlY2xhcmVkVmlld0luZGV4LCAxKTsKfQovKioKICogRGV0YWNoZXMgYSB2aWV3IGZyb20gYSBjb250YWluZXIuCiAqCiAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIHZpZXcgZnJvbSB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzLiBJdCBhbHNvCiAqIHJlbW92ZXMgdGhlIHZpZXcncyBlbGVtZW50cyBmcm9tIHRoZSBET00uCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciBUaGUgY29udGFpbmVyIGZyb20gd2hpY2ggdG8gZGV0YWNoIGEgdmlldwogKiBAcGFyYW0gez99IHJlbW92ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmlldyB0byBkZXRhY2gKICogQHJldHVybiB7P30gRGV0YWNoZWQgTFZpZXcgaW5zdGFuY2UuCiAqLwpmdW5jdGlvbiBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KSB7CiAgICBpZiAobENvbnRhaW5lci5sZW5ndGggPD0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQpCiAgICAgICAgcmV0dXJuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXhJbkNvbnRhaW5lciA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgcmVtb3ZlSW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3VG9EZXRhY2ggPSBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXJdOwogICAgaWYgKHZpZXdUb0RldGFjaCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSB2aWV3VG9EZXRhY2hbREVDTEFSQVRJT05fTENPTlRBSU5FUl07CiAgICAgICAgaWYgKGRlY2xhcmF0aW9uTENvbnRhaW5lciAhPT0gbnVsbCAmJiBkZWNsYXJhdGlvbkxDb250YWluZXIgIT09IGxDb250YWluZXIpIHsKICAgICAgICAgICAgZGV0YWNoTW92ZWRWaWV3KGRlY2xhcmF0aW9uTENvbnRhaW5lciwgdmlld1RvRGV0YWNoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlbW92ZUluZGV4ID4gMCkgewogICAgICAgICAgICBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXIgLSAxXVtORVhUXSA9ICgvKiogQHR5cGUgez99ICovICh2aWV3VG9EZXRhY2hbTkVYVF0pKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbW92ZWRMVmlldyA9IHJlbW92ZUZyb21BcnJheShsQ29udGFpbmVyLCBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHJlbW92ZUluZGV4KTsKICAgICAgICBhZGRSZW1vdmVWaWV3RnJvbUNvbnRhaW5lcih2aWV3VG9EZXRhY2hbVFZJRVddLCB2aWV3VG9EZXRhY2gsIGZhbHNlLCBudWxsKTsKICAgICAgICAvLyBub3RpZnkgcXVlcnkgdGhhdCBhIHZpZXcgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsUXVlcmllcyA9IHJlbW92ZWRMVmlld1tRVUVSSUVTXTsKICAgICAgICBpZiAobFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgbFF1ZXJpZXMuZGV0YWNoVmlldyhyZW1vdmVkTFZpZXdbVFZJRVddKTsKICAgICAgICB9CiAgICAgICAgdmlld1RvRGV0YWNoW1BBUkVOVF0gPSBudWxsOwogICAgICAgIHZpZXdUb0RldGFjaFtORVhUXSA9IG51bGw7CiAgICAgICAgLy8gVW5zZXRzIHRoZSBhdHRhY2hlZCBmbGFnCiAgICAgICAgdmlld1RvRGV0YWNoW0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgcmV0dXJuIHZpZXdUb0RldGFjaDsKfQovKioKICogUmVtb3ZlcyBhIHZpZXcgZnJvbSBhIGNvbnRhaW5lciwgaS5lLiBkZXRhY2hlcyBpdCBhbmQgdGhlbiBkZXN0cm95cyB0aGUgdW5kZXJseWluZyBMVmlldy4KICoKICogQHBhcmFtIHs/fSBsQ29udGFpbmVyIFRoZSBjb250YWluZXIgZnJvbSB3aGljaCB0byByZW1vdmUgYSB2aWV3CiAqIEBwYXJhbSB7P30gcmVtb3ZlSW5kZXggVGhlIGluZGV4IG9mIHRoZSB2aWV3IHRvIHJlbW92ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlVmlldyhsQ29udGFpbmVyLCByZW1vdmVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGV0YWNoZWRWaWV3ID0gZGV0YWNoVmlldyhsQ29udGFpbmVyLCByZW1vdmVJbmRleCk7CiAgICBkZXRhY2hlZFZpZXcgJiYgZGVzdHJveUxWaWV3KGRldGFjaGVkVmlld1tUVklFV10sIGRldGFjaGVkVmlldyk7Cn0KLyoqCiAqIEEgc3RhbmRhbG9uZSBmdW5jdGlvbiB3aGljaCBkZXN0cm95cyBhbiBMVmlldywKICogY29uZHVjdGluZyBjbGVhbiB1cCAoZS5nLiByZW1vdmluZyBsaXN0ZW5lcnMsIGNhbGxpbmcgb25EZXN0cm95cykuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gYmUgZGVzdHJveWVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gYmUgZGVzdHJveWVkLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGVzdHJveUxWaWV3KHRWaWV3LCBsVmlldykgewogICAgaWYgKCEobFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSAmJiByZW5kZXJlci5kZXN0cm95Tm9kZSkgewogICAgICAgICAgICBhcHBseVZpZXcodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgMyAvKiBEZXN0cm95ICovLCBudWxsLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgZGVzdHJveVZpZXdUcmVlKGxWaWV3KTsKICAgIH0KfQovKioKICogRGV0ZXJtaW5lcyB3aGljaCBMVmlld09yTENvbnRhaW5lciB0byBqdW1wIHRvIHdoZW4gdHJhdmVyc2luZyBiYWNrIHVwIHRoZQogKiB0cmVlIGluIGRlc3Ryb3lWaWV3VHJlZS4KICoKICogTm9ybWFsbHksIHRoZSB2aWV3J3MgcGFyZW50IExWaWV3IHNob3VsZCBiZSBjaGVja2VkLCBidXQgaW4gdGhlIGNhc2Ugb2YKICogZW1iZWRkZWQgdmlld3MsIHRoZSBjb250YWluZXIgKHdoaWNoIGlzIHRoZSB2aWV3IG5vZGUncyBwYXJlbnQsIGJ1dCBub3QgdGhlCiAqIExWaWV3J3MgcGFyZW50KSBuZWVkcyB0byBiZSBjaGVja2VkIGZvciBhIHBvc3NpYmxlIG5leHQgcHJvcGVydHkuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXdPckxDb250YWluZXIgVGhlIExWaWV3T3JMQ29udGFpbmVyIGZvciB3aGljaCB3ZSBuZWVkIGEgcGFyZW50IHN0YXRlCiAqIEBwYXJhbSB7P30gcm9vdFZpZXcgVGhlIHJvb3RWaWV3LCBzbyB3ZSBkb24ndCBwcm9wYWdhdGUgdG9vIGZhciB1cCB0aGUgdmlldyB0cmVlCiAqIEByZXR1cm4gez99IFRoZSBjb3JyZWN0IHBhcmVudCBMVmlld09yTENvbnRhaW5lcgogKi8KZnVuY3Rpb24gZ2V0UGFyZW50U3RhdGUobFZpZXdPckxDb250YWluZXIsIHJvb3RWaWV3KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdE5vZGU7CiAgICBpZiAoaXNMVmlldyhsVmlld09yTENvbnRhaW5lcikgJiYgKHROb2RlID0gbFZpZXdPckxDb250YWluZXJbVF9IT1NUXSkgJiYKICAgICAgICB0Tm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAvLyBpZiBpdCdzIGFuIGVtYmVkZGVkIHZpZXcsIHRoZSBzdGF0ZSBuZWVkcyB0byBnbyB1cCB0byB0aGUgY29udGFpbmVyLCBpbiBjYXNlIHRoZQogICAgICAgIC8vIGNvbnRhaW5lciBoYXMgYSBuZXh0CiAgICAgICAgcmV0dXJuIGdldExDb250YWluZXIoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHBhcmVudCB2aWV3IGZvciBjb250YWluZXJzIG9yIGNvbXBvbmVudCB2aWV3cwogICAgICAgIHJldHVybiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdID09PSByb290VmlldyA/IG51bGwgOiBsVmlld09yTENvbnRhaW5lcltQQVJFTlRdOwogICAgfQp9Ci8qKgogKiBDYWxscyBvbkRlc3Ryb3lzIGhvb2tzIGZvciBhbGwgZGlyZWN0aXZlcyBhbmQgcGlwZXMgaW4gYSBnaXZlbiB2aWV3IGFuZCB0aGVuIHJlbW92ZXMgYWxsCiAqIGxpc3RlbmVycy4gTGlzdGVuZXJzIGFyZSByZW1vdmVkIGFzIHRoZSBsYXN0IHN0ZXAgc28gZXZlbnRzIGRlbGl2ZXJlZCBpbiB0aGUgb25EZXN0cm95cyBob29rcwogKiBjYW4gYmUgcHJvcGFnYXRlZCB0byBcQE91dHB1dCBsaXN0ZW5lcnMuCiAqCiAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCBmb3IgdGhlIGBMVmlld2AgdG8gY2xlYW4gdXAuCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHRvIGNsZWFuIHVwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjbGVhblVwVmlldyh0VmlldywgbFZpZXcpIHsKICAgIGlmICghKGxWaWV3W0ZMQUdTXSAmIDI1NiAvKiBEZXN0cm95ZWQgKi8pKSB7CiAgICAgICAgLy8gVXN1YWxseSB0aGUgQXR0YWNoZWQgZmxhZyBpcyByZW1vdmVkIHdoZW4gdGhlIHZpZXcgaXMgZGV0YWNoZWQgZnJvbSBpdHMgcGFyZW50LCBob3dldmVyCiAgICAgICAgLy8gaWYgaXQncyBhIHJvb3QgdmlldywgdGhlIGZsYWcgd29uJ3QgYmUgdW5zZXQgaGVuY2Ugd2h5IHdlJ3JlIGFsc28gcmVtb3Zpbmcgb24gZGVzdHJveS4KICAgICAgICBsVmlld1tGTEFHU10gJj0gfjEyOCAvKiBBdHRhY2hlZCAqLzsKICAgICAgICAvLyBNYXJrIHRoZSBMVmlldyBhcyBkZXN0cm95ZWQgKmJlZm9yZSogZXhlY3V0aW5nIHRoZSBvbkRlc3Ryb3kgaG9va3MuIEFuIG9uRGVzdHJveSBob29rCiAgICAgICAgLy8gcnVucyBhcmJpdHJhcnkgdXNlciBjb2RlLCB3aGljaCBjb3VsZCBpbmNsdWRlIGl0cyBvd24gYHZpZXdSZWYuZGVzdHJveSgpYCAob3Igc2ltaWxhcikuIElmCiAgICAgICAgLy8gV2UgZG9uJ3QgZmxhZyB0aGUgdmlldyBhcyBkZXN0cm95ZWQgYmVmb3JlIHRoZSBob29rcywgdGhpcyBjb3VsZCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuCiAgICAgICAgLy8gVGhpcyBhbHNvIGFsaWducyB3aXRoIHRoZSBWaWV3RW5naW5lIGJlaGF2aW9yLiBJdCBhbHNvIG1lYW5zIHRoYXQgdGhlIG9uRGVzdHJveSBob29rIGlzCiAgICAgICAgLy8gcmVhbGx5IG1vcmUgb2YgYW4gImFmdGVyRGVzdHJveSIgaG9vayBpZiB5b3UgdGhpbmsgYWJvdXQgaXQuCiAgICAgICAgbFZpZXdbRkxBR1NdIHw9IDI1NiAvKiBEZXN0cm95ZWQgKi87CiAgICAgICAgZXhlY3V0ZU9uRGVzdHJveXModFZpZXcsIGxWaWV3KTsKICAgICAgICByZW1vdmVMaXN0ZW5lcnModFZpZXcsIGxWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdFROb2RlID0gbFZpZXdbVF9IT1NUXTsKICAgICAgICAvLyBGb3IgY29tcG9uZW50IHZpZXdzIG9ubHksIHRoZSBsb2NhbCByZW5kZXJlciBpcyBkZXN0cm95ZWQgYXMgY2xlYW4gdXAgdGltZS4KICAgICAgICBpZiAoaG9zdFROb2RlICYmIGhvc3RUTm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gJiYKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIobFZpZXdbUkVOREVSRVJdKSkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyRGVzdHJveSsrOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1JFTkRFUkVSXSkpKS5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkNvbnRhaW5lciA9IGxWaWV3W0RFQ0xBUkFUSU9OX0xDT05UQUlORVJdOwogICAgICAgIC8vIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gZW1iZWRkZWQgdmlldyB0aGF0IGlzIHN0aWxsIGluc2VydGVkIGludG8gYSBjb250YWluZXIKICAgICAgICBpZiAoZGVjbGFyYXRpb25Db250YWluZXIgIT09IG51bGwgJiYgaXNMQ29udGFpbmVyKGxWaWV3W1BBUkVOVF0pKSB7CiAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIGEgcHJvamVjdGVkIHZpZXcKICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ29udGFpbmVyICE9PSBsVmlld1tQQVJFTlRdKSB7CiAgICAgICAgICAgICAgICBkZXRhY2hNb3ZlZFZpZXcoZGVjbGFyYXRpb25Db250YWluZXIsIGxWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGb3IgZW1iZWRkZWQgdmlld3Mgc3RpbGwgYXR0YWNoZWQgdG8gYSBjb250YWluZXI6IHJlbW92ZSBxdWVyeSByZXN1bHQgZnJvbSB0aGlzIHZpZXcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFF1ZXJpZXMgPSBsVmlld1tRVUVSSUVTXTsKICAgICAgICAgICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsUXVlcmllcy5kZXRhY2hWaWV3KHRWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogUmVtb3ZlcyBsaXN0ZW5lcnMgYW5kIHVuc3Vic2NyaWJlcyBmcm9tIG91dHB1dCBzdWJzY3JpcHRpb25zCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgaWYgKHRDbGVhbnVwICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDbGVhbnVwID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NMRUFOVVBdKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGggLSAxOyBpICs9IDIpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB0Q2xlYW51cFtpXSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBuYXRpdmUgRE9NIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpZHhPclRhcmdldEdldHRlciA9IHRDbGVhbnVwW2kgKyAxXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHR5cGVvZiBpZHhPclRhcmdldEdldHRlciA9PT0gJ2Z1bmN0aW9uJyA/CiAgICAgICAgICAgICAgICAgICAgaWR4T3JUYXJnZXRHZXR0ZXIobFZpZXcpIDoKICAgICAgICAgICAgICAgICAgICB1bndyYXBSTm9kZShsVmlld1tpZHhPclRhcmdldEdldHRlcl0pOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSBsQ2xlYW51cFt0Q2xlYW51cFtpICsgMl1dOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdXNlQ2FwdHVyZU9yU3ViSWR4ID0gdENsZWFudXBbaSArIDNdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VDYXB0dXJlT3JTdWJJZHggPT09ICdib29sZWFuJykgewogICAgICAgICAgICAgICAgICAgIC8vIG5hdGl2ZSBET00gbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIFJlbmRlcmVyMwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRDbGVhbnVwW2ldLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZU9yU3ViSWR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYXB0dXJlT3JTdWJJZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnJlZ2lzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGxDbGVhbnVwW3VzZUNhcHR1cmVPclN1YklkeF0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnNjcmlwdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBsQ2xlYW51cFstdXNlQ2FwdHVyZU9yU3ViSWR4XS51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgaXMgZ3JvdXBlZCB3aXRoIHRoZSBpbmRleCBvZiBpdHMgY29udGV4dAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGxDbGVhbnVwW3RDbGVhbnVwW2kgKyAxXV07CiAgICAgICAgICAgICAgICB0Q2xlYW51cFtpXS5jYWxsKGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxWaWV3W0NMRUFOVVBdID0gbnVsbDsKICAgIH0KfQovKioKICogQ2FsbHMgb25EZXN0cm95IGhvb2tzIGZvciB0aGlzIHZpZXcKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleGVjdXRlT25EZXN0cm95cyh0VmlldywgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkZXN0cm95SG9va3M7CiAgICBpZiAodFZpZXcgIT0gbnVsbCAmJiAoZGVzdHJveUhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzKSAhPSBudWxsKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXN0cm95SG9va3MubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbFZpZXdbKC8qKiBAdHlwZSB7P30gKi8gKGRlc3Ryb3lIb29rc1tpXSkpXTsKICAgICAgICAgICAgLy8gT25seSBjYWxsIHRoZSBkZXN0cm95IGhvb2sgaWYgdGhlIGNvbnRleHQgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAgICAgICAgICBpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgTm9kZUluamVjdG9yRmFjdG9yeSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRvQ2FsbCA9ICgvKiogQHR5cGUgez99ICovIChkZXN0cm95SG9va3NbaSArIDFdKSk7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b0NhbGwpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0NhbGwubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0b0NhbGxbaiArIDFdKSkpLmNhbGwoY29udGV4dFsoLyoqIEB0eXBlIHs/fSAqLyAodG9DYWxsW2pdKSldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0b0NhbGwuY2FsbChjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogUmV0dXJucyBhIG5hdGl2ZSBlbGVtZW50IGlmIGEgbm9kZSBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gcGFyZW50LgogKgogKiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgd2h5IHdlIG1heSBub3QgYmUgYWJsZSB0byBpbnNlcnQgYSBlbGVtZW50IGltbWVkaWF0ZWx5LgogKiAtIFByb2plY3Rpb246IFdoZW4gY3JlYXRpbmcgYSBjaGlsZCBjb250ZW50IGVsZW1lbnQgb2YgYSBjb21wb25lbnQsIHdlIGhhdmUgdG8gc2tpcCB0aGUKICogICBpbnNlcnRpb24gYmVjYXVzZSB0aGUgY29udGVudCBvZiBhIGNvbXBvbmVudCB3aWxsIGJlIHByb2plY3RlZC4KICogICBgPGNvbXBvbmVudD48Y29udGVudD5kZWxheWVkIGR1ZSB0byBwcm9qZWN0aW9uPC9jb250ZW50PjwvY29tcG9uZW50PmAKICogLSBQYXJlbnQgY29udGFpbmVyIGlzIGRpc2Nvbm5lY3RlZDogVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGluc2VydGluZyBhIHZpZXcgaW50bwogKiAgIHBhcmVudCBjb250YWluZXIsIHdoaWNoIGl0c2VsZiBpcyBkaXNjb25uZWN0ZWQuIEZvciBleGFtcGxlIHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIHBhcnQKICogICBvZiBhIFZpZXcgd2hpY2ggaGFzIG5vdCBiZSBpbnNlcnRlZCBvciBpcyBtYWRlIGZvciBwcm9qZWN0aW9uIGJ1dCBoYXMgbm90IGJlZW4gaW5zZXJ0ZWQKICogICBpbnRvIGRlc3RpbmF0aW9uLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBjdXJyZW50VmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCB0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIC8vIFNraXAgb3ZlciBlbGVtZW50IGFuZCBJQ1UgY29udGFpbmVycyBhcyB0aG9zZSBhcmUgcmVwcmVzZW50ZWQgYnkgYSBjb21tZW50IG5vZGUgYW5kCiAgICAvLyBjYW4ndCBiZSB1c2VkIGFzIGEgcmVuZGVyIHBhcmVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRUTm9kZSA9IHROb2RlLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnRUTm9kZSAhPSBudWxsICYmCiAgICAgICAgKHBhcmVudFROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fAogICAgICAgICAgICBwYXJlbnRUTm9kZS50eXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykpIHsKICAgICAgICB0Tm9kZSA9IHBhcmVudFROb2RlOwogICAgICAgIHBhcmVudFROb2RlID0gdE5vZGUucGFyZW50OwogICAgfQogICAgLy8gSWYgdGhlIHBhcmVudCB0Tm9kZSBpcyBudWxsLCB0aGVuIHdlIGFyZSBpbnNlcnRpbmcgYWNyb3NzIHZpZXdzOiBlaXRoZXIgaW50byBhbiBlbWJlZGRlZCB2aWV3CiAgICAvLyBvciBhIGNvbXBvbmVudCB2aWV3LgogICAgaWYgKHBhcmVudFROb2RlID09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRWaWV3W1RfSE9TVF0pKTsKICAgICAgICBpZiAoaG9zdFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykgewogICAgICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGEgcm9vdCBlbGVtZW50IG9mIGFuIGVtYmVkZGVkIHZpZXcgV2UgbWlnaHQgZGVsYXkgaW5zZXJ0aW9uIG9mIGNoaWxkcmVuCiAgICAgICAgICAgIC8vIGZvciBhIGdpdmVuIHZpZXcgaWYgaXQgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1pZ2h0IGhhcHBlbiBmb3IgMiBtYWluIHJlYXNvbnM6CiAgICAgICAgICAgIC8vIC0gdmlldyBpcyBub3QgaW5zZXJ0ZWQgaW50byBhbnkgY29udGFpbmVyKHZpZXcgd2FzIGNyZWF0ZWQgYnV0IG5vdCBpbnNlcnRlZCB5ZXQpCiAgICAgICAgICAgIC8vIC0gdmlldyBpcyBpbnNlcnRlZCBpbnRvIGEgY29udGFpbmVyIGJ1dCB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBub3QgaW5zZXJ0ZWQgaW50byB0aGUgRE9NCiAgICAgICAgICAgIC8vIChjb250YWluZXIgbWlnaHQgYmUgcGFydCBvZiBwcm9qZWN0aW9uIG9yIGNoaWxkIG9mIGEgdmlldyB0aGF0IGlzIG5vdCBpbnNlcnRlZCB5ZXQpLgogICAgICAgICAgICAvLyBJbiBvdGhlciB3b3JkcyB3ZSBjYW4gaW5zZXJ0IGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdmlldyBpZiB0aGlzIHZpZXcgd2FzIGluc2VydGVkIGludG8gYQogICAgICAgICAgICAvLyBjb250YWluZXIgYW5kIHRoZSBjb250YWluZXIgaXRzZWxmIGhhcyBpdHMgcmVuZGVyIHBhcmVudCBkZXRlcm1pbmVkLgogICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KCgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3VycmVudFZpZXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHJvb3QgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHZpZXcgaW50byB0aGUgY29tcG9uZW50IGhvc3QgZWxlbWVudCBhbmQKICAgICAgICAgICAgLy8gaXQgc2hvdWxkIGFsd2F5cyBiZSBlYWdlci4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXMoaG9zdFROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgICAgICByZXR1cm4gY3VycmVudFZpZXdbSE9TVF07CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzSWN1Q2FzZSA9IHROb2RlICYmIHROb2RlLnR5cGUgPT09IDUgLyogSWN1Q29udGFpbmVyICovOwogICAgICAgIC8vIElmIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGlzIGFuIElDVSBjb250YWluZXIsIHRoZW4gaXQgaXMgcmVwcmVzZW50ZWQgYnkgY29tbWVudCBub2RlIGFuZCB3ZQogICAgICAgIC8vIG5lZWQgdG8gdXNlIGl0IGFzIGFuIGFuY2hvci4gSWYgaXQgaXMgcHJvamVjdGVkIHRoZW4gaXQncyBkaXJlY3QgcGFyZW50IG5vZGUgaXMgdGhlIHJlbmRlcmVyLgogICAgICAgIGlmIChpc0ljdUNhc2UgJiYgdE5vZGUuZmxhZ3MgJiA0IC8qIGlzUHJvamVjdGVkICovKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgY3VycmVudFZpZXcpLnBhcmVudE5vZGUpKTsKICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHBhcmVudFROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgIGlmIChwYXJlbnRUTm9kZS5mbGFncyAmIDIgLyogaXNDb21wb25lbnRIb3N0ICovKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3BhcmVudFROb2RlLmluZGV4XSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuY2Fwc3VsYXRpb24gPSAoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3ROb2RlLmRpcmVjdGl2ZVN0YXJ0XSkpKS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAvLyBXZSd2ZSBnb3QgYSBwYXJlbnQgd2hpY2ggaXMgYW4gZWxlbWVudCBpbiB0aGUgY3VycmVudCB2aWV3LiBXZSBqdXN0IG5lZWQgdG8gdmVyaWZ5IGlmIHRoZQogICAgICAgICAgICAvLyBwYXJlbnQgZWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQuIENvbXBvbmVudCdzIGNvbnRlbnQgbm9kZXMgYXJlIG5vdCBpbnNlcnRlZCBpbW1lZGlhdGVseQogICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBwcm9qZWN0ZWQsIGFuZCBzbyBkb2luZyBpbnNlcnQgYXQgdGhpcyBwb2ludCB3b3VsZCBiZSB3YXN0ZWZ1bC4KICAgICAgICAgICAgLy8gU2luY2UgdGhlIHByb2plY3Rpb24gd291bGQgdGhlbiBtb3ZlIGl0IHRvIGl0cyBmaW5hbCBkZXN0aW5hdGlvbi4gTm90ZSB0aGF0IHdlIGNhbid0CiAgICAgICAgICAgIC8vIG1ha2UgdGhpcyBhc3N1bXB0aW9uIHdoZW4gdXNpbmcgdGhlIFNoYWRvdyBET00sIGJlY2F1c2UgdGhlIG5hdGl2ZSBwcm9qZWN0aW9uIHBsYWNlaG9sZGVycwogICAgICAgICAgICAvLyAoPGNvbnRlbnQ+IG9yIDxzbG90PikgaGF2ZSB0byBiZSBpbiBwbGFjZSBhcyBlbGVtZW50cyBhcmUgYmVpbmcgaW5zZXJ0ZWQuCiAgICAgICAgICAgIGlmIChlbmNhcHN1bGF0aW9uICE9PSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbSAmJgogICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24kMS5OYXRpdmUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgY3VycmVudFZpZXcpKSk7CiAgICB9Cn0KLyoqCiAqIEluc2VydHMgYSBuYXRpdmUgbm9kZSBiZWZvcmUgYW5vdGhlciBuYXRpdmUgbm9kZSBmb3IgYSBnaXZlbiBwYXJlbnQgdXNpbmcge1xAbGluayBSZW5kZXJlcjN9LgogKiBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gbmF0aXZlIG5vZGVzIHdlcmUgZGV0ZXJtaW5lZCAtIGl0IGFic3RyYWN0cyBhbgogKiBhY3R1YWwgcmVuZGVyZXIgYmVpbmcgdXNlZC4KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcGFyYW0gez99IGNoaWxkCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVySW5zZXJ0QmVmb3JlKys7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHBhcmVudCwgY2hpbGQsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlTm9kZSwgdHJ1ZSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBwYXJlbnQKICogQHBhcmFtIHs/fSBjaGlsZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlQXBwZW5kQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJBcHBlbmRDaGlsZCsrOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocGFyZW50LCAncGFyZW50IG5vZGUgbXVzdCBiZSBkZWZpbmVkJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuYXBwZW5kQ2hpbGQocGFyZW50LCBjaGlsZCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gcGFyZW50CiAqIEBwYXJhbSB7P30gY2hpbGQKICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSkgewogICAgaWYgKGJlZm9yZU5vZGUgIT09IG51bGwpIHsKICAgICAgICBuYXRpdmVJbnNlcnRCZWZvcmUocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmF0aXZlQXBwZW5kQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQpOwogICAgfQp9Ci8qKgogKiBSZW1vdmVzIGEgbm9kZSBmcm9tIHRoZSBET00gZ2l2ZW4gaXRzIG5hdGl2ZSBwYXJlbnQuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBwYXJlbnQKICogQHBhcmFtIHs/fSBjaGlsZAogKiBAcGFyYW0gez89fSBpc0hvc3RFbGVtZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBuYXRpdmVSZW1vdmVDaGlsZChyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgaXNIb3N0RWxlbWVudCkgewogICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgIHJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIG5hdGl2ZSBwYXJlbnQgb2YgYSBnaXZlbiBuYXRpdmUgbm9kZS4KICogQHBhcmFtIHs/fSByZW5kZXJlcgogKiBAcGFyYW0gez99IG5vZGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hdGl2ZVBhcmVudE5vZGUocmVuZGVyZXIsIG5vZGUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/IHJlbmRlcmVyLnBhcmVudE5vZGUobm9kZSkgOiBub2RlLnBhcmVudE5vZGUpKSk7Cn0KLyoqCiAqIFJldHVybnMgYSBuYXRpdmUgc2libGluZyBvZiBhIGdpdmVuIG5hdGl2ZSBub2RlLgogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gbm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIG5vZGUpIHsKICAgIHJldHVybiBpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5uZXh0U2libGluZyhub2RlKSA6IG5vZGUubmV4dFNpYmxpbmc7Cn0KLyoqCiAqIEZpbmRzIGEgbmF0aXZlICJhbmNob3IiIG5vZGUgZm9yIGNhc2VzIHdoZXJlIHdlIGNhbid0IGFwcGVuZCBhIG5hdGl2ZSBjaGlsZCBkaXJlY3RseQogKiAoYGFwcGVuZENoaWxkYCkgYW5kIG5lZWQgdG8gdXNlIGEgcmVmZXJlbmNlIChhbmNob3IpIG5vZGUgZm9yIHRoZSBgaW5zZXJ0QmVmb3JlYCBvcGVyYXRpb24uCiAqIEBwYXJhbSB7P30gcGFyZW50VE5vZGUKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmF0aXZlQW5jaG9yTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpIHsKICAgIGlmIChwYXJlbnRUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbENvbnRhaW5lciA9IGdldExDb250YWluZXIoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFROb2RlKSksIGxWaWV3KTsKICAgICAgICBpZiAobENvbnRhaW5lciA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gbENvbnRhaW5lci5pbmRleE9mKGxWaWV3LCBDT05UQUlORVJfSEVBREVSX09GRlNFVCkgLSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsKICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoaW5kZXgsIGxDb250YWluZXIpOwogICAgfQogICAgZWxzZSBpZiAocGFyZW50VE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8CiAgICAgICAgcGFyZW50VE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICByZXR1cm4gZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEFwcGVuZHMgdGhlIGBjaGlsZGAgbmF0aXZlIG5vZGUgKG9yIGEgY29sbGVjdGlvbiBvZiBub2RlcykgdG8gdGhlIGBwYXJlbnRgLgogKgogKiBUaGUgZWxlbWVudCBpbnNlcnRpb24gbWlnaHQgYmUgZGVsYXllZCB7XEBsaW5rIGNhbkluc2VydE5hdGl2ZU5vZGV9LgogKgogKiBAcGFyYW0gez99IHRWaWV3IFRoZSBgVFZpZXcnIHRvIGJlIGFwcGVuZGVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIGN1cnJlbnQgTFZpZXcKICogQHBhcmFtIHs/fSBjaGlsZEVsIFRoZSBuYXRpdmUgY2hpbGQgKG9yIGNoaWxkcmVuKSB0aGF0IHNob3VsZCBiZSBhcHBlbmRlZAogKiBAcGFyYW0gez99IGNoaWxkVE5vZGUgVGhlIFROb2RlIG9mIHRoZSBjaGlsZCBlbGVtZW50CiAqIEByZXR1cm4gez99IFdoZXRoZXIgb3Igbm90IHRoZSBjaGlsZCB3YXMgYXBwZW5kZWQKICovCmZ1bmN0aW9uIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgY2hpbGRFbCwgY2hpbGRUTm9kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyUGFyZW50ID0gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCBjaGlsZFROb2RlLCBsVmlldyk7CiAgICBpZiAocmVuZGVyUGFyZW50ICE9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudFROb2RlID0gY2hpbGRUTm9kZS5wYXJlbnQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IGdldE5hdGl2ZUFuY2hvck5vZGUocGFyZW50VE5vZGUsIGxWaWV3KTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZEVsKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkRWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIG5hdGl2ZUFwcGVuZE9ySW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIGNoaWxkRWxbaV0sIGFuY2hvck5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcmVuZGVyUGFyZW50LCBjaGlsZEVsLCBhbmNob3JOb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIFJldHVybnMgdGhlIGZpcnN0IG5hdGl2ZSBub2RlIGZvciBhIGdpdmVuIExWaWV3LCBzdGFydGluZyBmcm9tIHRoZSBwcm92aWRlZCBUTm9kZS4KICoKICogTmF0aXZlIG5vZGVzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2UgYXBwZWFyIGluIHRoZSBuYXRpdmUgdHJlZSAoRE9NKS4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRGaXJzdE5hdGl2ZU5vZGUobFZpZXcsIHROb2RlKSB7CiAgICBpZiAodE5vZGUgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCA1IC8qIEljdUNvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGVUeXBlID0gdE5vZGUudHlwZTsKICAgICAgICBpZiAodE5vZGVUeXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHsKICAgICAgICAgICAgcmV0dXJuIGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodE5vZGVUeXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIGxWaWV3W3ROb2RlLmluZGV4XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbEljdUNvbnRhaW5lckNoaWxkID0gdE5vZGUuY2hpbGQ7CiAgICAgICAgICAgIGlmIChlbEljdUNvbnRhaW5lckNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCBlbEljdUNvbnRhaW5lckNoaWxkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJOb2RlT3JMQ29udGFpbmVyID0gbFZpZXdbdE5vZGUuaW5kZXhdOwogICAgICAgICAgICAgICAgaWYgKGlzTENvbnRhaW5lcihyTm9kZU9yTENvbnRhaW5lcikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIHJOb2RlT3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBSTm9kZShyTm9kZU9yTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRIb3N0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudFZpZXcgPSBnZXRMVmlld1BhcmVudChjb21wb25lbnRWaWV3KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaXJzdFByb2plY3RlZFROb2RlID0gKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKSlbKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLnByb2plY3Rpb24pKV07CiAgICAgICAgICAgIGlmIChmaXJzdFByb2plY3RlZFROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdE5hdGl2ZU5vZGUoKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudFZpZXcpKSwgZmlyc3RQcm9qZWN0ZWRUTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCB0Tm9kZS5uZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwp9Ci8qKgogKiBAcGFyYW0gez99IHZpZXdJbmRleEluQ29udGFpbmVyCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmVmb3JlTm9kZUZvclZpZXcodmlld0luZGV4SW5Db250YWluZXIsIGxDb250YWluZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5leHRWaWV3SW5kZXggPSBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHZpZXdJbmRleEluQ29udGFpbmVyICsgMTsKICAgIGlmIChuZXh0Vmlld0luZGV4IDwgbENvbnRhaW5lci5sZW5ndGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobENvbnRhaW5lcltuZXh0Vmlld0luZGV4XSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaXJzdFROb2RlT2ZWaWV3ID0gbFZpZXdbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICAgICAgaWYgKGZpcnN0VE5vZGVPZlZpZXcgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0TmF0aXZlTm9kZShsVmlldywgZmlyc3RUTm9kZU9mVmlldyk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGxDb250YWluZXJbTkFUSVZFXTsKfQovKioKICogUmVtb3ZlcyBhIG5hdGl2ZSBub2RlIGl0c2VsZiB1c2luZyBhIGdpdmVuIHJlbmRlcmVyLiBUbyByZW1vdmUgdGhlIG5vZGUgd2UgYXJlIGxvb2tpbmcgdXAgaXRzCiAqIHBhcmVudCBmcm9tIHRoZSBuYXRpdmUgdHJlZSBhcyBub3QgYWxsIHBsYXRmb3JtcyAvIGJyb3dzZXJzIHN1cHBvcnQgdGhlIGVxdWl2YWxlbnQgb2YKICogbm9kZS5yZW1vdmUoKS4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBBIHJlbmRlcmVyIHRvIGJlIHVzZWQKICogQHBhcmFtIHs/fSByTm9kZSBUaGUgbmF0aXZlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAogKiBAcGFyYW0gez89fSBpc0hvc3RFbGVtZW50IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgbm9kZSB0byBiZSByZW1vdmVkIGlzIGEgaG9zdCBvZiBhIGNvbXBvbmVudC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBpc0hvc3RFbGVtZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmVQYXJlbnQgPSBuYXRpdmVQYXJlbnROb2RlKHJlbmRlcmVyLCByTm9kZSk7CiAgICBpZiAobmF0aXZlUGFyZW50KSB7CiAgICAgICAgbmF0aXZlUmVtb3ZlQ2hpbGQocmVuZGVyZXIsIG5hdGl2ZVBhcmVudCwgck5vZGUsIGlzSG9zdEVsZW1lbnQpOwogICAgfQp9Ci8qKgogKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIG9mIGBhY3Rpb25gIG9uIHRoZSBub2RlLiBUeXBpY2FsbHkgdGhpcyBpbnZvbHZlcyBpbnNlcnRpbmcgb3IgcmVtb3ZpbmcKICogbm9kZXMgb24gdGhlIExWaWV3IG9yIHByb2plY3Rpb24gYm91bmRhcnkuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICogQHBhcmFtIHs/fSBhY3Rpb24KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50CiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZQogKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlOb2RlcyhyZW5kZXJlciwgYWN0aW9uLCB0Tm9kZSwgbFZpZXcsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSwgaXNQcm9qZWN0aW9uKSB7CiAgICB3aGlsZSAodE5vZGUgIT0gbnVsbCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovLCAxIC8qIFByb2plY3Rpb24gKi8sIDUgLyogSWN1Q29udGFpbmVyICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmF3U2xvdFZhbHVlID0gbFZpZXdbdE5vZGUuaW5kZXhdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZVR5cGUgPSB0Tm9kZS50eXBlOwogICAgICAgIGlmIChpc1Byb2plY3Rpb24pIHsKICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gMCAvKiBDcmVhdGUgKi8pIHsKICAgICAgICAgICAgICAgIHJhd1Nsb3RWYWx1ZSAmJiBhdHRhY2hQYXRjaERhdGEodW53cmFwUk5vZGUocmF3U2xvdFZhbHVlKSwgbFZpZXcpOwogICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gNCAvKiBpc1Byb2plY3RlZCAqLzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKHROb2RlLmZsYWdzICYgNjQgLyogaXNEZXRhY2hlZCAqLykgIT09IDY0IC8qIGlzRGV0YWNoZWQgKi8pIHsKICAgICAgICAgICAgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgIGFwcGx5Tm9kZXMocmVuZGVyZXIsIGFjdGlvbiwgdE5vZGUuY2hpbGQsIGxWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGFwcGx5VG9FbGVtZW50T3JDb250YWluZXIoYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCByYXdTbG90VmFsdWUsIGJlZm9yZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7CiAgICAgICAgICAgICAgICBhcHBseVByb2plY3Rpb25SZWN1cnNpdmUocmVuZGVyZXIsIGFjdGlvbiwgbFZpZXcsICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8pOwogICAgICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJhd1Nsb3RWYWx1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdE5vZGUgPSBpc1Byb2plY3Rpb24gPyB0Tm9kZS5wcm9qZWN0aW9uTmV4dCA6IHROb2RlLm5leHQ7CiAgICB9Cn0KLyoqCiAqIGBhcHBseVZpZXdgIHBlcmZvcm1zIG9wZXJhdGlvbiBvbiB0aGUgdmlldyBhcyBzcGVjaWZpZWQgaW4gYGFjdGlvbmAgKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKgogKiBJbnNlcnRpbmcgYSB2aWV3IHdpdGhvdXQgcHJvamVjdGlvbiBvciBjb250YWluZXJzIGF0IHRvcCBsZXZlbCBpcyBzaW1wbGUuIEp1c3QgaXRlcmF0ZSBvdmVyIHRoZQogKiByb290IG5vZGVzIG9mIHRoZSBWaWV3LCBhbmQgZm9yIGVhY2ggbm9kZSBwZXJmb3JtIHRoZSBgYWN0aW9uYC4KICoKICogVGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkIHdpdGggY29udGFpbmVycyBhbmQgcHJvamVjdGlvbnMuIFRoYXQgaXMgYmVjYXVzZSBjb21pbmcgYWNyb3NzOgogKiAtIENvbnRhaW5lcjogaW1wbGllcyB0aGF0IHdlIGhhdmUgdG8gaW5zZXJ0L3JlbW92ZS9kZXN0cm95IHRoZSB2aWV3cyBvZiB0aGF0IGNvbnRhaW5lciBhcyB3ZWxsCiAqICAgICAgICAgICAgICB3aGljaCBpbiB0dXJuIGNhbiBoYXZlIHRoZWlyIG93biBDb250YWluZXJzIGF0IHRoZSBWaWV3IHJvb3RzLgogKiAtIFByb2plY3Rpb246IGltcGxpZXMgdGhhdCB3ZSBoYXZlIHRvIGluc2VydC9yZW1vdmUvZGVzdHJveSB0aGUgbm9kZXMgb2YgdGhlIHByb2plY3Rpb24uIFRoZQogKiAgICAgICAgICAgICAgIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSBub2RlcyB3ZSBhcmUgcHJvamVjdGluZyBjYW4gdGhlbXNlbHZlcyBoYXZlIENvbnRhaW5lcnMKICogICAgICAgICAgICAgICBvciBvdGhlciBQcm9qZWN0aW9ucy4KICoKICogQXMgeW91IGNhbiBzZWUgdGhpcyBpcyBhIHZlcnkgcmVjdXJzaXZlIHByb2JsZW0uIFllcyByZWN1cnNpb24gaXMgbm90IG1vc3QgZWZmaWNpZW50IGJ1dCB0aGUKICogY29kZSBpcyBjb21wbGljYXRlZCBlbm91Z2ggdGhhdCB0cnlpbmcgdG8gaW1wbGVtZW50ZWQgd2l0aCByZWN1cnNpb24gYmVjb21lcyB1bm1haW50YWluYWJsZS4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3JyB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCwgZGV0YWNoZWQsIGRlc3Ryb3llZAogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCwgZGV0YWNoZWQsIGRlc3Ryb3llZC4KICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBhY3Rpb24gYWN0aW9uIHRvIHBlcmZvcm0gKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogKiBAcGFyYW0gez99IGJlZm9yZU5vZGUgQmVmb3JlIHdoaWNoIG5vZGUgdGhlIGluc2VydGlvbnMgc2hvdWxkIGhhcHBlbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5Vmlldyh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5ub2RlKSksIDIgLyogVmlldyAqLyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3Um9vdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKS5jaGlsZDsKICAgIGFwcGx5Tm9kZXMocmVuZGVyZXIsIGFjdGlvbiwgdmlld1Jvb3RUTm9kZSwgbFZpZXcsIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSwgZmFsc2UpOwp9Ci8qKgogKiBgYXBwbHlQcm9qZWN0aW9uYCBwZXJmb3JtcyBvcGVyYXRpb24gb24gdGhlIHByb2plY3Rpb24uCiAqCiAqIEluc2VydGluZyBhIHByb2plY3Rpb24gcmVxdWlyZXMgdXMgdG8gbG9jYXRlIHRoZSBwcm9qZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC4gVGhlCiAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRob3NlIG5vZGVzIHRoZW1zZWx2ZXMgY291bGQgYmUgcmUtcHJvamVjdGVkIGZyb20gdGhlaXIgcGFyZW50IGNvbXBvbmVudC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3YCBvZiBgTFZpZXdgIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkCiAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIGBMVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gdFByb2plY3Rpb25Ob2RlIG5vZGUgdG8gcHJvamVjdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlQcm9qZWN0aW9uKHRWaWV3LCBsVmlldywgdFByb2plY3Rpb25Ob2RlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlciA9IGxWaWV3W1JFTkRFUkVSXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbmRlclBhcmVudCA9IGdldFJlbmRlclBhcmVudCh0VmlldywgdFByb2plY3Rpb25Ob2RlLCBsVmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRUTm9kZSA9IHRQcm9qZWN0aW9uTm9kZS5wYXJlbnQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBiZWZvcmVOb2RlID0gZ2V0TmF0aXZlQW5jaG9yTm9kZShwYXJlbnRUTm9kZSwgbFZpZXcpOwogICAgYXBwbHlQcm9qZWN0aW9uUmVjdXJzaXZlKHJlbmRlcmVyLCAwIC8qIENyZWF0ZSAqLywgbFZpZXcsIHRQcm9qZWN0aW9uTm9kZSwgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlKTsKfQovKioKICogYGFwcGx5UHJvamVjdGlvblJlY3Vyc2l2ZWAgcGVyZm9ybXMgb3BlcmF0aW9uIG9uIHRoZSBwcm9qZWN0aW9uIHNwZWNpZmllZCBieSBgYWN0aW9uYCAoaW5zZXJ0LAogKiBkZXRhY2gsIGRlc3Ryb3kpCiAqCiAqIEluc2VydGluZyBhIHByb2plY3Rpb24gcmVxdWlyZXMgdXMgdG8gbG9jYXRlIHRoZSBwcm9qZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC4gVGhlCiAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRob3NlIG5vZGVzIHRoZW1zZWx2ZXMgY291bGQgYmUgcmUtcHJvamVjdGVkIGZyb20gdGhlaXIgcGFyZW50IGNvbXBvbmVudC4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXIgdG8gdXNlCiAqIEBwYXJhbSB7P30gYWN0aW9uIGFjdGlvbiB0byBwZXJmb3JtIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICogQHBhcmFtIHs/fSBsVmlldyBUaGUgTFZpZXcgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gdFByb2plY3Rpb25Ob2RlIG5vZGUgdG8gcHJvamVjdAogKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogKiBAcGFyYW0gez99IGJlZm9yZU5vZGUgQmVmb3JlIHdoaWNoIG5vZGUgdGhlIGluc2VydGlvbnMgc2hvdWxkIGhhcHBlbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5UHJvamVjdGlvblJlY3Vyc2l2ZShyZW5kZXJlciwgYWN0aW9uLCBsVmlldywgdFByb2plY3Rpb25Ob2RlLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRMVmlld1tUX0hPU1RdKSk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbCh0eXBlb2YgdFByb2plY3Rpb25Ob2RlLnByb2plY3Rpb24sICdudW1iZXInLCAnZXhwZWN0aW5nIHByb2plY3Rpb24gaW5kZXgnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVUb1Byb2plY3RPclJOb2RlcyA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uKSlbdFByb2plY3Rpb25Ob2RlLnByb2plY3Rpb25dKSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlVG9Qcm9qZWN0T3JSTm9kZXMpKSB7CiAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGV4aXN0LCBpdCBpcyBhIGJpdCBvZiBhIGhhY2suIFdoZW4gd2UgYm9vdHN0cmFwIGEgdG9wIGxldmVsIG5vZGUgYW5kIHdlCiAgICAgICAgLy8gbmVlZCB0byBzdXBwb3J0IHBhc3NpbmcgcHJvamVjdGFibGUgbm9kZXMsIHNvIHdlIGNoZWF0IGFuZCBwdXQgdGhlbSBpbiB0aGUgVE5vZGUKICAgICAgICAvLyBvZiB0aGUgSG9zdCBUVmlldy4gKFllcyB3ZSBwdXQgaW5zdGFuY2UgaW5mbyBhdCB0aGUgVCBMZXZlbCkuIFdlIGNhbiBnZXQgYXdheSB3aXRoIGl0CiAgICAgICAgLy8gYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhhdCBUVmlldyBpcyBub3Qgc2hhcmVkIGFuZCB0aGVyZWZvcmUgaXQgd2lsbCBub3QgYmUgYSBwcm9ibGVtLgogICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgYW5kIGNsZWFuZWQgdXAuCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlVG9Qcm9qZWN0T3JSTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByTm9kZSA9IG5vZGVUb1Byb2plY3RPclJOb2Rlc1tpXTsKICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJOb2RlLCBiZWZvcmVOb2RlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5vZGVUb1Byb2plY3QgPSBub2RlVG9Qcm9qZWN0T3JSTm9kZXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb2plY3RlZENvbXBvbmVudExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudExWaWV3W1BBUkVOVF0pKTsKICAgICAgICBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIG5vZGVUb1Byb2plY3QsIHByb2plY3RlZENvbXBvbmVudExWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIHRydWUpOwogICAgfQp9Ci8qKgogKiBgYXBwbHlDb250YWluZXJgIHBlcmZvcm1zIGFuIG9wZXJhdGlvbiBvbiB0aGUgY29udGFpbmVyIGFuZCBpdHMgdmlld3MgYXMgc3BlY2lmaWVkIGJ5CiAqIGBhY3Rpb25gIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICoKICogSW5zZXJ0aW5nIGEgQ29udGFpbmVyIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIGNvbnRhaW5lciBtYXkgaGF2ZSBWaWV3cyB3aGljaAogKiB0aGVtc2VsdmVzIGhhdmUgY29udGFpbmVycyBvciBwcm9qZWN0aW9ucy4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBhY3Rpb24gYWN0aW9uIHRvIHBlcmZvcm0gKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogKiBAcGFyYW0gez99IGxDb250YWluZXIgVGhlIExDb250YWluZXIgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50IHBhcmVudCBET00gZWxlbWVudCBmb3IgaW5zZXJ0aW9uL3JlbW92YWwuCiAqIEBwYXJhbSB7P30gYmVmb3JlTm9kZSBCZWZvcmUgd2hpY2ggbm9kZSB0aGUgaW5zZXJ0aW9ucyBzaG91bGQgaGFwcGVuLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXBwbHlDb250YWluZXIocmVuZGVyZXIsIGFjdGlvbiwgbENvbnRhaW5lciwgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihsQ29udGFpbmVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFuY2hvciA9IGxDb250YWluZXJbTkFUSVZFXTsKICAgIC8vIExDb250YWluZXIgaGFzIGl0cyBvd24gYmVmb3JlIG5vZGUuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYXRpdmUgPSB1bndyYXBSTm9kZShsQ29udGFpbmVyKTsKICAgIC8vIEFuIExDb250YWluZXIgY2FuIGJlIGNyZWF0ZWQgZHluYW1pY2FsbHkgb24gYW55IG5vZGUgYnkgaW5qZWN0aW5nIFZpZXdDb250YWluZXJSZWYuCiAgICAvLyBBc2tpbmcgZm9yIGEgVmlld0NvbnRhaW5lclJlZiBvbiBhbiBlbGVtZW50IHdpbGwgcmVzdWx0IGluIGEgY3JlYXRpb24gb2YgYSBzZXBhcmF0ZSBhbmNob3Igbm9kZQogICAgLy8gKGNvbW1lbnQgaW4gdGhlIERPTSkgdGhhdCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBMQ29udGFpbmVyJ3MgaG9zdCBub2RlLiBJbiB0aGlzIHBhcnRpY3VsYXIKICAgIC8vIGNhc2Ugd2UgbmVlZCB0byBleGVjdXRlIGFjdGlvbiBvbiAyIG5vZGVzOgogICAgLy8gLSBjb250YWluZXIncyBob3N0IG5vZGUgKHRoaXMgaXMgZG9uZSBpbiB0aGUgZXhlY3V0ZUFjdGlvbk9uRWxlbWVudE9yQ29udGFpbmVyKQogICAgLy8gLSBjb250YWluZXIncyBob3N0IG5vZGUgKHRoaXMgaXMgZG9uZSBoZXJlKQogICAgaWYgKGFuY2hvciAhPT0gbmF0aXZlKSB7CiAgICAgICAgLy8gVGhpcyBpcyB2ZXJ5IHN0cmFuZ2UgdG8gbWUgKE1pc2tvKS4gSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgbmF0aXZlIGlzIHNhbWUgYXMgYW5jaG9yLiBJIGRvbid0CiAgICAgICAgLy8gc2VlIGEgcmVhc29uIHdoeSB0aGV5IHNob3VsZCBiZSBkaWZmZXJlbnQsIGJ1dCB0aGV5IGFyZS4KICAgICAgICAvLwogICAgICAgIC8vIElmIHRoZXkgYXJlIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgc2Vjb25kIGFuY2hvciBhcyB3ZWxsLgogICAgICAgIGFwcGx5VG9FbGVtZW50T3JDb250YWluZXIoYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCBhbmNob3IsIGJlZm9yZU5vZGUpOwogICAgfQogICAgZm9yIChsZXQgaSA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOyBpIDwgbENvbnRhaW5lci5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChsQ29udGFpbmVyW2ldKSk7CiAgICAgICAgYXBwbHlWaWV3KGxWaWV3W1RWSUVXXSwgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYW5jaG9yKTsKICAgIH0KfQovKioKICogV3JpdGVzIGNsYXNzL3N0eWxlIHRvIGVsZW1lbnQuCiAqCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgaXQgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYGNsYXNzYCAoYGZhbHNlYCB0byB3cml0ZSB0byBgc3R5bGVgKQogKiBAcGFyYW0gez99IHJOb2RlIFRoZSBOb2RlIHRvIHdyaXRlIHRvLgogKiBAcGFyYW0gez99IHByb3AgUHJvcGVydHkgdG8gd3JpdGUgdG8uIFRoaXMgd291bGQgYmUgdGhlIGNsYXNzL3N0eWxlIG5hbWUuCiAqIEBwYXJhbSB7P30gdmFsdWUgVmFsdWUgdG8gd3JpdGUuIElmIGBudWxsYC9gdW5kZWZpbmVkYC9gZmFsc2VgIHRoaXMgaXMgY29uc2lkZXJlZCBhIHJlbW92ZSAoc2V0L2FkZAogKiAgICAgICAgb3RoZXJ3aXNlKS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFwcGx5U3R5bGluZyhyZW5kZXJlciwgaXNDbGFzc0Jhc2VkLCByTm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzUHJvY2VkdXJhbCA9IGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKTsKICAgIGlmIChpc0NsYXNzQmFzZWQpIHsKICAgICAgICAvLyBXZSBhY3R1YWxseSB3YW50IEpTIHRydWUvZmFsc2UgaGVyZSBiZWNhdXNlIGFueSB0cnV0aHkgdmFsdWUgc2hvdWxkIGFkZCB0aGUgY2xhc3MKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVDbGFzcysrOwogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSkpLnJlbW92ZUNsYXNzKHJOb2RlLCBwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAock5vZGUpKSkuY2xhc3NMaXN0LnJlbW92ZShwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZENsYXNzKys7CiAgICAgICAgICAgIGlmIChpc1Byb2NlZHVyYWwpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuYWRkQ2xhc3Mock5vZGUsIHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QsICdIVE1MRWxlbWVudCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QuYWRkKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IENhbid0IGltcG9ydCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlIGFzIGl0IGNhdXNlcyBpbXBvcnRzIHRvIGJlIHJlc29sdmVkIGluCiAgICAgICAgLy8gZGlmZmVyZW50IG9yZGVyIHdoaWNoIGNhdXNlcyBmYWlsdXJlcy4gVXNpbmcgZGlyZWN0IGNvbnN0YW50IGFzIHdvcmthcm91bmQgZm9yIG5vdy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmxhZ3MgPSBwcm9wLmluZGV4T2YoJy0nKSA9PSAtMSA/IHVuZGVmaW5lZCA6IDIgLyogUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZSAqLzsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAvKiogfHwgdmFsdWUgPT09IHVuZGVmaW5lZCAqLykgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlU3R5bGUrKzsKICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5yZW1vdmVTdHlsZShyTm9kZSwgcHJvcCwgZmxhZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFN0eWxlKys7CiAgICAgICAgICAgIGlmIChpc1Byb2NlZHVyYWwpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0U3R5bGUock5vZGUsIHByb3AsIHZhbHVlLCBmbGFncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCgoKC8qKiBAdHlwZSB7P30gKi8gKHJOb2RlKSkpLnN0eWxlLCAnSFRNTEVsZW1lbnQgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAock5vZGUpKSkuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBXcml0ZSBgY3NzVGV4dGAgdG8gYFJFbGVtZW50YC4KICoKICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICogdGhhdCBzdGF0aWMgc3R5bGluZyB2YWx1ZXMgZG8gbm90IHB1bGwgaW4gdGhlIHN0eWxlIHBhcnNlci4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbmV3VmFsdWUgVGhlIG5ldyBjbGFzcyBsaXN0IHRvIHdyaXRlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd3JpdGVEaXJlY3RTdHlsZShyZW5kZXJlciwgZWxlbWVudCwgbmV3VmFsdWUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdzdHlsZScsIG5ld1ZhbHVlKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS5zdHlsZS5jc3NUZXh0ID0gbmV3VmFsdWU7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0U3R5bGUrKzsKfQovKioKICogV3JpdGUgYGNsYXNzTmFtZWAgdG8gYFJFbGVtZW50YC4KICoKICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICogdGhhdCBzdGF0aWMgc3R5bGluZyB2YWx1ZXMgZG8gbm90IHB1bGwgaW4gdGhlIHN0eWxlIHBhcnNlci4KICoKICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbmV3VmFsdWUgVGhlIG5ldyBjbGFzcyBsaXN0IHRvIHdyaXRlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gd3JpdGVEaXJlY3RDbGFzcyhyZW5kZXJlciwgZWxlbWVudCwgbmV3VmFsdWUpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSAnJykgewogICAgICAgICAgICAvLyBUaGVyZSBhcmUgdGVzdHMgaW4gYGdvb2dsZTNgIHdoaWNoIGV4cGVjdCBgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylgIHRvIGJlIGBudWxsYC4KICAgICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsICdjbGFzcycpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdjbGFzcycsIG5ld1ZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG5ld1ZhbHVlOwogICAgfQogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldENsYXNzTmFtZSsrOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL25vZGVfdXRpbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogSWYgYHN0YXJ0VE5vZGUucGFyZW50YCBleGlzdHMgYW5kIGhhcyBhbiBpbmplY3RvciwgcmV0dXJucyBUTm9kZSBmb3IgdGhhdCBpbmplY3Rvci4KICogT3RoZXJ3aXNlLCB1bndyYXBzIGEgcGFyZW50IGluamVjdG9yIGxvY2F0aW9uIG51bWJlciB0byBmaW5kIHRoZSB2aWV3IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50CiAqIGluamVjdG9yLCB0aGVuIHdhbGtzIHVwIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgdW50aWwgdGhlIFROb2RlIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IgaXMKICogZm91bmQuCiAqCiAqIEBwYXJhbSB7P30gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IsIHdoaWNoIGNvbnRhaW5zIHRoZSB2aWV3IG9mZnNldAogKiBAcGFyYW0gez99IHN0YXJ0VmlldyBUaGUgTFZpZXcgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBzdGFydCB3YWxraW5nIHVwIHRoZSB2aWV3IHRyZWUKICogQHBhcmFtIHs/fSBzdGFydFROb2RlIFRoZSBUTm9kZSBpbnN0YW5jZSBvZiB0aGUgc3RhcnRpbmcgZWxlbWVudAogKiBAcmV0dXJuIHs/fSBUaGUgVE5vZGUgb2YgdGhlIHBhcmVudCBpbmplY3RvcgogKi8KZnVuY3Rpb24gZ2V0UGFyZW50SW5qZWN0b3JUTm9kZShsb2NhdGlvbiwgc3RhcnRWaWV3LCBzdGFydFROb2RlKSB7CiAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbmplY3RvciBvbiB0aGUgcGFyZW50IFROb2RlLCByZXRyaWV2ZSB0aGUgVE5vZGUgZm9yIHRoYXQgaW5qZWN0b3IuCiAgICBpZiAoc3RhcnRUTm9kZS5wYXJlbnQgJiYgc3RhcnRUTm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAvLyB2aWV3IG9mZnNldCBpcyAwCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluamVjdG9ySW5kZXggPSBzdGFydFROb2RlLnBhcmVudC5pbmplY3RvckluZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGUgPSBzdGFydFROb2RlLnBhcmVudDsKICAgICAgICAvLyBJZiB0Tm9kZS5pbmplY3RvckluZGV4ID09PSB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCwgdGhlbiB0aGUgaW5kZXggYmVsb25ncyB0byBhIHBhcmVudAogICAgICAgIC8vIGluamVjdG9yLgogICAgICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgIT0gbnVsbCAmJiBpbmplY3RvckluZGV4ID09IHROb2RlLnBhcmVudC5pbmplY3RvckluZGV4KSB7CiAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdE5vZGU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7CiAgICAvLyB2aWV3IG9mZnNldCBpcyAxCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50VmlldyA9IHN0YXJ0VmlldzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChzdGFydFZpZXdbVF9IT1NUXSkpOwogICAgLy8gdmlldyBvZmZzZXQgaXMgc3VwZXJpb3IgdG8gMQogICAgd2hpbGUgKHZpZXdPZmZzZXQgPiAxKSB7CiAgICAgICAgcGFyZW50VmlldyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSk7CiAgICAgICAgcGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50Vmlld1tUX0hPU1RdKSk7CiAgICAgICAgdmlld09mZnNldC0tOwogICAgfQogICAgcmV0dXJuIHBhcmVudFROb2RlOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgVmlld1JlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2xWaWV3CiAgICAgKiBAcGFyYW0gez89fSBfY2RSZWZJbmplY3RpbmdWaWV3CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sVmlldywgX2NkUmVmSW5qZWN0aW5nVmlldykgewogICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgICAgIHRoaXMuX2NkUmVmSW5qZWN0aW5nVmlldyA9IF9jZFJlZkluamVjdGluZ1ZpZXc7CiAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdFZpZXdOb2RlID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHJvb3ROb2RlcygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSB0aGlzLl9sVmlldzsKICAgICAgICBpZiAobFZpZXdbSE9TVF0gPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvc3RUVmlldyA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tUX0hPU1RdKSk7CiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXdbVFZJRVddLCBsVmlldywgaG9zdFRWaWV3LmNoaWxkLCBbXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGNvbnRleHQoKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLl9sVmlld1tDT05URVhUXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZGVzdHJveWVkKCkgewogICAgICAgIHJldHVybiAodGhpcy5fbFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykgPT09IDI1NiAvKiBEZXN0cm95ZWQgKi87CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcFJlZikgewogICAgICAgICAgICB0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmlld0NvbnRhaW5lclJlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMpOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBudWxsOwogICAgICAgIH0KICAgICAgICBkZXN0cm95TFZpZXcodGhpcy5fbFZpZXdbVFZJRVddLCB0aGlzLl9sVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIHN0b3JlQ2xlYW51cEZuKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIGNhbGxiYWNrKTsKICAgIH0KICAgIC8qKgogICAgICogTWFya3MgYSB2aWV3IGFuZCBhbGwgb2YgaXRzIGFuY2VzdG9ycyBkaXJ0eS4KICAgICAqCiAgICAgKiBJdCBhbHNvIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gYnkgY2FsbGluZyBgc2NoZWR1bGVUaWNrYCBpbnRlcm5hbGx5LCB3aGljaCBjb2FsZXNjZXMKICAgICAqIG11bHRpcGxlIGBtYXJrRm9yQ2hlY2tgIGNhbGxzIHRvIGludG8gb25lIGNoYW5nZSBkZXRlY3Rpb24gcnVuLgogICAgICoKICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5zdXJlIGFuIHtcQGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kjT25QdXNoIE9uUHVzaH0gY29tcG9uZW50IGlzCiAgICAgKiBjaGVja2VkIHdoZW4gaXQgbmVlZHMgdG8gYmUgcmUtcmVuZGVyZWQgYnV0IHRoZSB0d28gbm9ybWFsIHRyaWdnZXJzIGhhdmVuJ3QgbWFya2VkIGl0CiAgICAgKiBkaXJ0eSAoaS5lLiBpbnB1dHMgaGF2ZW4ndCBjaGFuZ2VkIGFuZCBldmVudHMgaGF2ZW4ndCBmaXJlZCBpbiB0aGUgdmlldykuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogXEBDb21wb25lbnQoewogICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgKiAgIHRlbXBsYXRlOiBgTnVtYmVyIG9mIHRpY2tzOiB7e251bWJlck9mVGlja3N9fWAKICAgICAqICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgKiB9KQogICAgICogY2xhc3MgQXBwQ29tcG9uZW50IHsKICAgICAqICAgbnVtYmVyT2ZUaWNrcyA9IDA7CiAgICAgKgogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgKiAgICAgICB0aGlzLm51bWJlck9mVGlja3MrKzsKICAgICAqICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQsIG90aGVyd2lzZSB0aGUgdmlldyB3aWxsIG5vdCBiZSB1cGRhdGVkCiAgICAgKiAgICAgICB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAqICAgICB9LCAxMDAwKTsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXJrRm9yQ2hlY2soKSB7CiAgICAgICAgbWFya1ZpZXdEaXJ0eSh0aGlzLl9jZFJlZkluamVjdGluZ1ZpZXcgfHwgdGhpcy5fbFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2hlcyB0aGUgdmlldyBmcm9tIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyZWUuCiAgICAgKgogICAgICogRGV0YWNoZWQgdmlld3Mgd2lsbCBub3QgYmUgY2hlY2tlZCBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbiBydW5zIHVudGlsIHRoZXkgYXJlCiAgICAgKiByZS1hdHRhY2hlZCwgZXZlbiBpZiB0aGV5IGFyZSBkaXJ0eS4gYGRldGFjaGAgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAogICAgICoge1xAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRlY3RDaGFuZ2VzIGRldGVjdENoYW5nZXN9IHRvIGltcGxlbWVudCBsb2NhbCBjaGFuZ2UKICAgICAqIGRldGVjdGlvbiBjaGVja3MuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY29tcG9uZW50IHdpdGggYSBsYXJnZSBsaXN0IG9mIHJlYWRvbmx5IGRhdGEuCiAgICAgKiBJbWFnaW5lIHRoZSBkYXRhIGNoYW5nZXMgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKICAgICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZwogICAgICogdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciBhbmQgZG9pbmcgYSBsb2NhbCBjaGVjayBldmVyeSBmaXZlIHNlY29uZHMuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY2xhc3MgRGF0YVByb3ZpZGVyIHsKICAgICAqICAgLy8gaW4gYSByZWFsIGFwcGxpY2F0aW9uIHRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYmUgZGlmZmVyZW50IGV2ZXJ5IHRpbWUKICAgICAqICAgZ2V0IGRhdGEoKSB7CiAgICAgKiAgICAgcmV0dXJuIFsxLDIsMyw0LDVdOwogICAgICogICB9CiAgICAgKiB9CiAgICAgKgogICAgICogXEBDb21wb25lbnQoewogICAgICogICBzZWxlY3RvcjogJ2dpYW50LWxpc3QnLAogICAgICogICB0ZW1wbGF0ZTogYAogICAgICogICAgIDxsaSAqbmdGb3I9ImxldCBkIG9mIGRhdGFQcm92aWRlci5kYXRhIj5EYXRhIHt7ZH19PC9saT4KICAgICAqICAgYCwKICAgICAqIH0pCiAgICAgKiBjbGFzcyBHaWFudExpc3QgewogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIpIHsKICAgICAqICAgICByZWYuZGV0YWNoKCk7CiAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICogICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICogICAgIH0sIDUwMDApOwogICAgICogICB9CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogICBzZWxlY3RvcjogJ2FwcCcsCiAgICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgPGdpYW50LWxpc3Q+PGdpYW50LWxpc3Q+CiAgICAgKiAgIGAsCiAgICAgKiB9KQogICAgICogY2xhc3MgQXBwIHsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoKCkgewogICAgICAgIHRoaXMuX2xWaWV3W0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgLyoqCiAgICAgKiBSZS1hdHRhY2hlcyBhIHZpZXcgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlLWF0dGFjaCB2aWV3cyB0aGF0IHdlcmUgcHJldmlvdXNseSBkZXRhY2hlZCBmcm9tIHRoZSB0cmVlCiAgICAgKiB1c2luZyB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9LiBWaWV3cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHRyZWUgYnkgZGVmYXVsdC4KICAgICAqCiAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IGRpc3BsYXlpbmcgYGxpdmVgIGRhdGEuIFRoZSBjb21wb25lbnQgd2lsbCBkZXRhY2gKICAgICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5CiAgICAgKiBpcyBzZXQgdG8gZmFsc2UuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY2xhc3MgRGF0YVByb3ZpZGVyIHsKICAgICAqICAgZGF0YSA9IDE7CiAgICAgKgogICAgICogICBjb25zdHJ1Y3RvcigpIHsKICAgICAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgKiAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgKiAyOwogICAgICogICAgIH0sIDUwMCk7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqCiAgICAgKiBcQENvbXBvbmVudCh7CiAgICAgKiAgIHNlbGVjdG9yOiAnbGl2ZS1kYXRhJywKICAgICAqICAgaW5wdXRzOiBbJ2xpdmUnXSwKICAgICAqICAgdGVtcGxhdGU6ICdEYXRhOiB7e2RhdGFQcm92aWRlci5kYXRhfX0nCiAgICAgKiB9KQogICAgICogY2xhc3MgTGl2ZURhdGEgewogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBEYXRhUHJvdmlkZXIpIHt9CiAgICAgKgogICAgICogICBzZXQgbGl2ZSh2YWx1ZSkgewogICAgICogICAgIGlmICh2YWx1ZSkgewogICAgICogICAgICAgdGhpcy5yZWYucmVhdHRhY2goKTsKICAgICAqICAgICB9IGVsc2UgewogICAgICogICAgICAgdGhpcy5yZWYuZGV0YWNoKCk7CiAgICAgKiAgICAgfQogICAgICogICB9CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgTGl2ZSBVcGRhdGU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgWyhuZ01vZGVsKV09ImxpdmUiPgogICAgICogICAgIDxsaXZlLWRhdGEgW2xpdmVdPSJsaXZlIj48bGl2ZS1kYXRhPgogICAgICogICBgLAogICAgICogfSkKICAgICAqIGNsYXNzIEFwcENvbXBvbmVudCB7CiAgICAgKiAgIGxpdmUgPSB0cnVlOwogICAgICogfQogICAgICogYGBgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWF0dGFjaCgpIHsKICAgICAgICB0aGlzLl9sVmlld1tGTEFHU10gfD0gMTI4IC8qIEF0dGFjaGVkICovOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVja3MgdGhlIHZpZXcgYW5kIGl0cyBjaGlsZHJlbi4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9IHRvIGltcGxlbWVudAogICAgICogbG9jYWwgY2hhbmdlIGRldGVjdGlvbiBjaGVja3MuCiAgICAgKgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPgogICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+CiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgY29tcG9uZW50IHdpdGggYSBsYXJnZSBsaXN0IG9mIHJlYWRvbmx5IGRhdGEuCiAgICAgKiBJbWFnaW5lLCB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCiAgICAgKiB3ZSB3YW50IHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIGxpc3QgZXZlcnkgZml2ZSBzZWNvbmRzLgogICAgICoKICAgICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb24KICAgICAqIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICAgICAqCiAgICAgKiBTZWUge1xAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRhY2ggZGV0YWNofSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRldGVjdENoYW5nZXMoKSB7CiAgICAgICAgZGV0ZWN0Q2hhbmdlc0ludGVybmFsKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIHRoaXMuY29udGV4dCk7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4sIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlIGRldGVjdGVkLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCBpbiBkZXZlbG9wbWVudCBtb2RlIHRvIHZlcmlmeSB0aGF0IHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbiBkb2Vzbid0CiAgICAgKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNoZWNrTm9DaGFuZ2VzKCkgewogICAgICAgIGNoZWNrTm9DaGFuZ2VzSW50ZXJuYWwodGhpcy5fbFZpZXdbVFZJRVddLCB0aGlzLl9sVmlldywgdGhpcy5jb250ZXh0KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2Y1JlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKHZjUmVmKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcFJlZikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBBcHBsaWNhdGlvblJlZiEnKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IHZjUmVmOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2hGcm9tQXBwUmVmKCkgewogICAgICAgIHRoaXMuX2FwcFJlZiA9IG51bGw7CiAgICAgICAgcmVuZGVyRGV0YWNoVmlldyh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMuX2xWaWV3KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhcHBSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGF0dGFjaFRvQXBwUmVmKGFwcFJlZikgewogICAgICAgIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9hcHBSZWYgPSBhcHBSZWY7CiAgICB9Cn0KLyoqCiAqIFxAaW50ZXJuYWwKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIFJvb3RWaWV3UmVmIGV4dGVuZHMgVmlld1JlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXcpIHsKICAgICAgICBzdXBlcihfdmlldyk7CiAgICAgICAgdGhpcy5fdmlldyA9IF92aWV3OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRlY3RDaGFuZ2VzKCkgewogICAgICAgIGRldGVjdENoYW5nZXNJblJvb3RWaWV3KHRoaXMuX3ZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVja05vQ2hhbmdlcygpIHsKICAgICAgICBjaGVja05vQ2hhbmdlc0luUm9vdFZpZXcodGhpcy5fdmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBjb250ZXh0KCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHJlc3VsdAogKiBAcGFyYW0gez89fSBpc1Byb2plY3Rpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbGxlY3ROYXRpdmVOb2Rlcyh0VmlldywgbFZpZXcsIHROb2RlLCByZXN1bHQsIGlzUHJvamVjdGlvbiA9IGZhbHNlKSB7CiAgICB3aGlsZSAodE5vZGUgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovLCA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8sIDUgLyogSWN1Q29udGFpbmVyICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbE5vZGUgPSBsVmlld1t0Tm9kZS5pbmRleF07CiAgICAgICAgaWYgKGxOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVud3JhcFJOb2RlKGxOb2RlKSk7CiAgICAgICAgfQogICAgICAgIC8vIEEgZ2l2ZW4gbE5vZGUgY2FuIHJlcHJlc2VudCBlaXRoZXIgYSBuYXRpdmUgbm9kZSBvciBhIExDb250YWluZXIgKHdoZW4gaXQgaXMgYSBob3N0IG9mIGEKICAgICAgICAvLyBWaWV3Q29udGFpbmVyUmVmKS4gV2hlbiB3ZSBmaW5kIGEgTENvbnRhaW5lciB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50byBpdCB0byBjb2xsZWN0IHJvb3Qgbm9kZXMKICAgICAgICAvLyBmcm9tIHRoZSB2aWV3cyBpbiB0aGlzIGNvbnRhaW5lci4KICAgICAgICBpZiAoaXNMQ29udGFpbmVyKGxOb2RlKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQ7IGkgPCBsTm9kZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbFZpZXdJbkFDb250YWluZXIgPSBsTm9kZVtpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGxWaWV3Rmlyc3RDaGlsZFROb2RlID0gbFZpZXdJbkFDb250YWluZXJbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgICAgICBpZiAobFZpZXdGaXJzdENoaWxkVE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXdJbkFDb250YWluZXJbVFZJRVddLCBsVmlld0luQUNvbnRhaW5lciwgbFZpZXdGaXJzdENoaWxkVE5vZGUsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlVHlwZSA9IHROb2RlLnR5cGU7CiAgICAgICAgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKHRWaWV3LCBsVmlldywgdE5vZGUuY2hpbGQsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlVHlwZSA9PT0gMSAvKiBQcm9qZWN0aW9uICovKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRIb3N0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudFZpZXcgPSBnZXRMVmlld1BhcmVudChjb21wb25lbnRWaWV3KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmlyc3RQcm9qZWN0ZWROb2RlID0gKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKSlbKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLnByb2plY3Rpb24pKV07CiAgICAgICAgICAgIGlmIChmaXJzdFByb2plY3RlZE5vZGUgIT09IG51bGwgJiYgcGFyZW50VmlldyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKHBhcmVudFZpZXdbVFZJRVddLCBwYXJlbnRWaWV3LCBmaXJzdFByb2plY3RlZE5vZGUsIHJlc3VsdCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdE5vZGUgPSBpc1Byb2plY3Rpb24gPyB0Tm9kZS5wcm9qZWN0aW9uTmV4dCA6IHROb2RlLm5leHQ7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3ZpZXdfZW5naW5lX2NvbXBhdGliaWxpdHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZXMgYW4gRWxlbWVudFJlZiBmcm9tIHRoZSBtb3N0IHJlY2VudCBub2RlLgogKgogKiBAcGFyYW0gez99IEVsZW1lbnRSZWZUb2tlbgogKiBAcmV0dXJuIHs/fSBUaGUgRWxlbWVudFJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGluamVjdEVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuKSB7CiAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBnZXRMVmlldygpKTsKfQovKiogQHR5cGUgez99ICovCmxldCBSM0VsZW1lbnRSZWY7Ci8qKgogKiBDcmVhdGVzIGFuIEVsZW1lbnRSZWYgZ2l2ZW4gYSBub2RlLgogKgogKiBAcGFyYW0gez99IEVsZW1lbnRSZWZUb2tlbiBUaGUgRWxlbWVudFJlZiB0eXBlCiAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIG5vZGUgZm9yIHdoaWNoIHlvdSdkIGxpa2UgYW4gRWxlbWVudFJlZgogKiBAcGFyYW0gez99IHZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogKiBAcmV0dXJuIHs/fSBUaGUgRWxlbWVudFJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZlRva2VuLCB0Tm9kZSwgdmlldykgewogICAgaWYgKCFSM0VsZW1lbnRSZWYpIHsKICAgICAgICBSM0VsZW1lbnRSZWYgPSBjbGFzcyBFbGVtZW50UmVmIGV4dGVuZHMgRWxlbWVudFJlZlRva2VuIHsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIG5ldyBSM0VsZW1lbnRSZWYoKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIHZpZXcpKSkpOwp9Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFIzVGVtcGxhdGVSZWY7Ci8qKgogKiBDcmVhdGVzIGEgVGVtcGxhdGVSZWYgZ2l2ZW4gYSBub2RlLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IFRlbXBsYXRlUmVmVG9rZW4KICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4KICogQHJldHVybiB7P30gVGhlIFRlbXBsYXRlUmVmIGluc3RhbmNlIHRvIHVzZQogKi8KZnVuY3Rpb24gaW5qZWN0VGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuKSB7CiAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuLCBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgZ2V0TFZpZXcoKSk7Cn0KLyoqCiAqIENyZWF0ZXMgYSBUZW1wbGF0ZVJlZiBhbmQgc3RvcmVzIGl0IG9uIHRoZSBpbmplY3Rvci4KICoKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBUZW1wbGF0ZVJlZlRva2VuIFRoZSBUZW1wbGF0ZVJlZiB0eXBlCiAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuIFRoZSBFbGVtZW50UmVmIHR5cGUKICogQHBhcmFtIHs/fSBob3N0VE5vZGUgVGhlIG5vZGUgb24gd2hpY2ggYSBUZW1wbGF0ZVJlZiBpcyByZXF1ZXN0ZWQKICogQHBhcmFtIHs/fSBob3N0VmlldyBUaGUgdmlldyB0byB3aGljaCB0aGUgbm9kZSBiZWxvbmdzCiAqIEByZXR1cm4gez99IFRoZSBUZW1wbGF0ZVJlZiBpbnN0YW5jZSBvciBudWxsIGlmIHdlIGNhbid0IGNyZWF0ZSBhIFRlbXBsYXRlUmVmIG9uIGEgZ2l2ZW4gbm9kZSB0eXBlCiAqLwpmdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZlRva2VuLCBFbGVtZW50UmVmVG9rZW4sIGhvc3RUTm9kZSwgaG9zdFZpZXcpIHsKICAgIGlmICghUjNUZW1wbGF0ZVJlZikgewogICAgICAgIFIzVGVtcGxhdGVSZWYgPSBjbGFzcyBUZW1wbGF0ZVJlZiBleHRlbmRzIFRlbXBsYXRlUmVmVG9rZW4gewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfZGVjbGFyYXRpb25WaWV3CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2RlY2xhcmF0aW9uVENvbnRhaW5lcgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKF9kZWNsYXJhdGlvblZpZXcsIF9kZWNsYXJhdGlvblRDb250YWluZXIsIGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZWNsYXJhdGlvblZpZXcgPSBfZGVjbGFyYXRpb25WaWV3OwogICAgICAgICAgICAgICAgdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyID0gX2RlY2xhcmF0aW9uVENvbnRhaW5lcjsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkVFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLnRWaWV3cykpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW1iZWRkZWRMVmlldyA9IGNyZWF0ZUxWaWV3KHRoaXMuX2RlY2xhcmF0aW9uVmlldywgZW1iZWRkZWRUVmlldywgY29udGV4dCwgMTYgLyogQ2hlY2tBbHdheXMgKi8sIG51bGwsIGVtYmVkZGVkVFZpZXcubm9kZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSB0aGlzLl9kZWNsYXJhdGlvblZpZXdbdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLmluZGV4XTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGRlY2xhcmF0aW9uTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICBlbWJlZGRlZExWaWV3W0RFQ0xBUkFUSU9OX0xDT05UQUlORVJdID0gZGVjbGFyYXRpb25MQ29udGFpbmVyOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMgPSB0aGlzLl9kZWNsYXJhdGlvblZpZXdbUVVFUklFU107CiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZExWaWV3W1FVRVJJRVNdID0gZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMuY3JlYXRlRW1iZWRkZWRWaWV3KGVtYmVkZGVkVFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVuZGVyVmlldyhlbWJlZGRlZFRWaWV3LCBlbWJlZGRlZExWaWV3LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSBuZXcgVmlld1JlZihlbWJlZGRlZExWaWV3KTsKICAgICAgICAgICAgICAgIHZpZXdSZWYuX3RWaWV3Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChlbWJlZGRlZExWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGlmIChob3N0VE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChob3N0VE5vZGUudFZpZXdzLCAnVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQnKTsKICAgICAgICByZXR1cm4gbmV3IFIzVGVtcGxhdGVSZWYoaG9zdFZpZXcsICgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIGhvc3RUTm9kZSwgaG9zdFZpZXcpKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KbGV0IFIzVmlld0NvbnRhaW5lclJlZjsKLyoqCiAqIENyZWF0ZXMgYSBWaWV3Q29udGFpbmVyUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLiBPciwgaWYgdGhlIFZpZXdDb250YWluZXJSZWYKICogYWxyZWFkeSBleGlzdHMsIHJldHJpZXZlcyB0aGUgZXhpc3RpbmcgVmlld0NvbnRhaW5lclJlZi4KICoKICogQHBhcmFtIHs/fSBWaWV3Q29udGFpbmVyUmVmVG9rZW4KICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4KICogQHJldHVybiB7P30gVGhlIFZpZXdDb250YWluZXJSZWYgaW5zdGFuY2UgdG8gdXNlCiAqLwpmdW5jdGlvbiBpbmplY3RWaWV3Q29udGFpbmVyUmVmKFZpZXdDb250YWluZXJSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c1ROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpKSk7CiAgICByZXR1cm4gY3JlYXRlQ29udGFpbmVyUmVmKFZpZXdDb250YWluZXJSZWZUb2tlbiwgRWxlbWVudFJlZlRva2VuLCBwcmV2aW91c1ROb2RlLCBnZXRMVmlldygpKTsKfQovKioKICogQ3JlYXRlcyBhIFZpZXdDb250YWluZXJSZWYgYW5kIHN0b3JlcyBpdCBvbiB0aGUgaW5qZWN0b3IuCiAqCiAqIEBwYXJhbSB7P30gVmlld0NvbnRhaW5lclJlZlRva2VuIFRoZSBWaWV3Q29udGFpbmVyUmVmIHR5cGUKICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4gVGhlIEVsZW1lbnRSZWYgdHlwZQogKiBAcGFyYW0gez99IGhvc3RUTm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBWaWV3Q29udGFpbmVyUmVmCiAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogKiBAcmV0dXJuIHs/fSBUaGUgVmlld0NvbnRhaW5lclJlZiBpbnN0YW5jZSB0byB1c2UKICovCmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0VmlldykgewogICAgaWYgKCFSM1ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICBSM1ZpZXdDb250YWluZXJSZWYgPSBjbGFzcyBWaWV3Q29udGFpbmVyUmVmIGV4dGVuZHMgVmlld0NvbnRhaW5lclJlZlRva2VuIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2xDb250YWluZXIKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfaG9zdFROb2RlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2hvc3RWaWV3CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdHJ1Y3RvcihfbENvbnRhaW5lciwgX2hvc3RUTm9kZSwgX2hvc3RWaWV3KSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgdGhpcy5fbENvbnRhaW5lciA9IF9sQ29udGFpbmVyOwogICAgICAgICAgICAgICAgdGhpcy5faG9zdFROb2RlID0gX2hvc3RUTm9kZTsKICAgICAgICAgICAgICAgIHRoaXMuX2hvc3RWaWV3ID0gX2hvc3RWaWV3OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0IGVsZW1lbnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIHRoaXMuX2hvc3RUTm9kZSwgdGhpcy5faG9zdFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXQgcGFyZW50SW5qZWN0b3IoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRMb2NhdGlvbiA9IGdldFBhcmVudEluamVjdG9yTG9jYXRpb24odGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUTm9kZSA9IGdldFBhcmVudEluamVjdG9yVE5vZGUocGFyZW50TG9jYXRpb24sIHRoaXMuX2hvc3RWaWV3LCB0aGlzLl9ob3N0VE5vZGUpOwogICAgICAgICAgICAgICAgcmV0dXJuICFoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2NhdGlvbikgfHwgcGFyZW50VE5vZGUgPT0gbnVsbCA/CiAgICAgICAgICAgICAgICAgICAgbmV3IE5vZGVJbmplY3RvcihudWxsLCB0aGlzLl9ob3N0VmlldykgOgogICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlSW5qZWN0b3IocGFyZW50VE5vZGUsIHBhcmVudFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0KGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdICE9PSBudWxsICYmICgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKVtpbmRleF0gfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGggLSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBjb250ZXh0CiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGVSZWYsIGNvbnRleHQsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KGNvbnRleHQgfHwgKC8qKiBAdHlwZSB7P30gKi8gKHt9KSkpOwogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQodmlld1JlZiwgaW5kZXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50RmFjdG9yeQogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmplY3RvcgogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlUmVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgaW5kZXgsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzLCBuZ01vZHVsZVJlZikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dEluamVjdG9yID0gaW5qZWN0b3IgfHwgdGhpcy5wYXJlbnRJbmplY3RvcjsKICAgICAgICAgICAgICAgIGlmICghbmdNb2R1bGVSZWYgJiYgKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRGYWN0b3J5KSkpLm5nTW9kdWxlID09IG51bGwgJiYgY29udGV4dEluamVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRE8gTk9UIFJFRkFDVE9SLiBUaGUgY29kZSBoZXJlIHVzZWQgdG8gaGF2ZSBhIGB2YWx1ZSB8fCB1bmRlZmluZWRgIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBzZWVtcyB0byBjYXVzZSBpbnRlcm5hbCBnb29nbGUgYXBwcyB0byBmYWlsLiBUaGlzIGlzIGRvY3VtZW50ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGludGVybmFsIGJ1ZyBpc3N1ZTogZ28vYi8xNDI5Njc4MDIKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dEluamVjdG9yLmdldChOZ01vZHVsZVJlZiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZVJlZiA9IHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShjb250ZXh0SW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHVuZGVmaW5lZCwgbmdNb2R1bGVSZWYpOwogICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3LCBpbmRleCk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGluc2VydCh2aWV3UmVmLCBpbmRleCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh2aWV3UmVmKSkpLl9sVmlldykpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICBpZiAodmlld1JlZi5kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbnNlcnQgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmFsbG9jYXRlQ29udGFpbmVySWZOZWVkZWQoKTsKICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcihsVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQsIGRldGFjaCBpdCBmaXJzdCBzbyB3ZSBjbGVhbiB1cCByZWZlcmVuY2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZJZHggPSB0aGlzLmluZGV4T2Yodmlld1JlZik7CiAgICAgICAgICAgICAgICAgICAgLy8gQSB2aWV3IG1pZ2h0IGJlIGF0dGFjaGVkIGVpdGhlciB0byB0aGlzIG9yIGEgZGlmZmVyZW50IGNvbnRhaW5lci4gVGhlIGBwcmV2SWR4YCBmb3IKICAgICAgICAgICAgICAgICAgICAvLyB0aG9zZSBjYXNlcyB3aWxsIGJlOgogICAgICAgICAgICAgICAgICAgIC8vIGVxdWFsIHRvIC0xIGZvciB2aWV3cyBhdHRhY2hlZCB0byB0aGlzIFZpZXdDb250YWluZXJSZWYKICAgICAgICAgICAgICAgICAgICAvLyA+PSAwIGZvciB2aWV3cyBhdHRhY2hlZCB0byBhIGRpZmZlcmVudCBWaWV3Q29udGFpbmVyUmVmCiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZJZHggIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoKHByZXZJZHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2TENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwoaXNMQ29udGFpbmVyKHByZXZMQ29udGFpbmVyKSwgdHJ1ZSwgJ0FuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGhhdmUgaXRzIFBBUkVOVCBwb2ludCB0byBhIGNvbnRhaW5lci4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZS1jcmVhdGUgYSBSM1ZpZXdDb250YWluZXJSZWYgaW5zdGFuY2Ugc2luY2UgdGhvc2UgYXJlIG5vdCBzdG9yZWQgb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTFZpZXcgKG5vciBhbnl3aGVyZSBlbHNlKS4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VkNSZWYgPSBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKHByZXZMQ29udGFpbmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAocHJldkxDb250YWluZXJbVF9IT1NUXSkpLCBwcmV2TENvbnRhaW5lcltQQVJFTlRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJldlZDUmVmLmRldGFjaChwcmV2VkNSZWYuaW5kZXhPZih2aWV3UmVmKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRJZHggPSB0aGlzLl9hZGp1c3RJbmRleChpbmRleCk7CiAgICAgICAgICAgICAgICBpbnNlcnRWaWV3KHRWaWV3LCBsVmlldywgdGhpcy5fbENvbnRhaW5lciwgYWRqdXN0ZWRJZHgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlTm9kZSA9IGdldEJlZm9yZU5vZGVGb3JWaWV3KGFkanVzdGVkSWR4LCB0aGlzLl9sQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIGFkZFJlbW92ZVZpZXdGcm9tQ29udGFpbmVyKHRWaWV3LCBsVmlldywgdHJ1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdSZWYpKSkuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKHRoaXMpOwogICAgICAgICAgICAgICAgYWRkVG9BcnJheSgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdKSksIGFkanVzdGVkSWR4LCB2aWV3UmVmKTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuZXdJbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbW92ZSh2aWV3UmVmLCBuZXdJbmRleCkgewogICAgICAgICAgICAgICAgaWYgKHZpZXdSZWYuZGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbW92ZSBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2VydCh2aWV3UmVmLCBuZXdJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmlld1JlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW5kZXhPZih2aWV3UmVmKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmc0FyciA9IHRoaXMuX2xDb250YWluZXJbVklFV19SRUZTXTsKICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmc0FyciAhPT0gbnVsbCA/IHZpZXdSZWZzQXJyLmluZGV4T2Yodmlld1JlZikgOiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlbW92ZShpbmRleCkgewogICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4LCAtMSk7CiAgICAgICAgICAgICAgICByZW1vdmVWaWV3KHRoaXMuX2xDb250YWluZXIsIGFkanVzdGVkSWR4KTsKICAgICAgICAgICAgICAgIHJlbW92ZUZyb21BcnJheSgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdKSksIGFkanVzdGVkSWR4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRldGFjaChpbmRleCkgewogICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4LCAtMSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gZGV0YWNoVmlldyh0aGlzLl9sQ29udGFpbmVyLCBhZGp1c3RlZElkeCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB3YXNEZXRhY2hlZCA9IHZpZXcgJiYgcmVtb3ZlRnJvbUFycmF5KCgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKSwgYWRqdXN0ZWRJZHgpICE9IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gd2FzRGV0YWNoZWQgPyBuZXcgVmlld1JlZigoLyoqIEB0eXBlIHs/fSAqLyAodmlldykpKSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IHNoaWZ0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfYWRqdXN0SW5kZXgoaW5kZXgsIHNoaWZ0ID0gMCkgewogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggKyBzaGlmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsIGBWaWV3UmVmIGluZGV4IG11c3QgYmUgcG9zaXRpdmUsIGdvdCAke2luZGV4fWApOwogICAgICAgICAgICAgICAgICAgIC8vICsxIGJlY2F1c2UgaXQncyBsZWdhbCB0byBpbnNlcnQgYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICBhc3NlcnRMZXNzVGhhbihpbmRleCwgdGhpcy5sZW5ndGggKyAxICsgc2hpZnQsICdpbmRleCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYWxsb2NhdGVDb250YWluZXJJZk5lZWRlZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKGhvc3RUTm9kZSwgMCAvKiBDb250YWluZXIgKi8sIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBsQ29udGFpbmVyOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gaG9zdFZpZXdbaG9zdFROb2RlLmluZGV4XTsKICAgIGlmIChpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgIC8vIElmIHRoZSBob3N0IGlzIGEgY29udGFpbmVyLCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBMQ29udGFpbmVyCiAgICAgICAgbENvbnRhaW5lciA9IHNsb3RWYWx1ZTsKICAgICAgICBzZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgobENvbnRhaW5lciwgLTEgLyogRFlOQU1JQ19FTUJFRERFRF9WSUVXU19PTkxZICovKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY29tbWVudE5vZGU7CiAgICAgICAgLy8gSWYgdGhlIGhvc3QgaXMgYW4gZWxlbWVudCBjb250YWluZXIsIHRoZSBuYXRpdmUgaG9zdCBlbGVtZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQogICAgICAgIC8vIGNvbW1lbnQgYW5kIHdlIGNhbiByZXVzZSB0aGF0IGNvbW1lbnQgYXMgYW5jaG9yIGVsZW1lbnQgZm9yIHRoZSBuZXcgTENvbnRhaW5lci4KICAgICAgICAvLyBUaGUgY29tbWVudCBub2RlIGluIHF1ZXN0aW9uIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGFwcGVuZAogICAgICAgIC8vIGl0IGFnYWluLgogICAgICAgIGlmIChob3N0VE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7CiAgICAgICAgICAgIGNvbW1lbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHVud3JhcFJOb2RlKHNsb3RWYWx1ZSkpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAgICAgICAgIGNvbW1lbnROb2RlID0gaG9zdFZpZXdbUkVOREVSRVJdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlID8gJ2NvbnRhaW5lcicgOiAnJyk7CiAgICAgICAgICAgIC8vIEEgYFZpZXdDb250YWluZXJSZWZgIGNhbiBiZSBpbmplY3RlZCBieSB0aGUgcm9vdCAodG9wbW9zdCAvIGJvb3RzdHJhcHBlZCkgY29tcG9uZW50LiBJbgogICAgICAgICAgICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3QgdXNlIFRWaWV3IC8gVE5vZGUgZGF0YSBzdHJ1Y3R1cmVzIHRvIGluc2VydCBjb250YWluZXIncyBtYXJrZXIgbm9kZQogICAgICAgICAgICAvLyAoYm90aCBhIHBhcmVudCBvZiBhIGNvbW1lbnQgbm9kZSBhbmQgdGhlIGNvbW1lbnQgbm9kZSBpdHNlbGYgYXJlIG5vdCBwYXJ0IG9mIGFueSB2aWV3KS4gSW4KICAgICAgICAgICAgLy8gdGhpcyBzcGVjaWZpYyBjYXNlIHdlIHVzZSBsb3ctbGV2ZWwgRE9NIG1hbmlwdWxhdGlvbiB0byBpbnNlcnQgY29udGFpbmVyJ3MgbWFya2VyIChjb21tZW50KQogICAgICAgICAgICAvLyBub2RlLgogICAgICAgICAgICBpZiAoaXNSb290Vmlldyhob3N0VmlldykpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gaG9zdFZpZXdbUkVOREVSRVJdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaG9zdE5hdGl2ZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKGhvc3RUTm9kZSwgaG9zdFZpZXcpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRPZkhvc3ROYXRpdmUgPSBuYXRpdmVQYXJlbnROb2RlKHJlbmRlcmVyLCBob3N0TmF0aXZlKTsKICAgICAgICAgICAgICAgIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudE9mSG9zdE5hdGl2ZSkpLCBjb21tZW50Tm9kZSwgbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIGhvc3ROYXRpdmUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGFwcGVuZENoaWxkKGhvc3RWaWV3W1RWSUVXXSwgaG9zdFZpZXcsIGNvbW1lbnROb2RlLCBob3N0VE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhvc3RWaWV3W2hvc3RUTm9kZS5pbmRleF0gPSBsQ29udGFpbmVyID0KICAgICAgICAgICAgY3JlYXRlTENvbnRhaW5lcihzbG90VmFsdWUsIGhvc3RWaWV3LCBjb21tZW50Tm9kZSwgaG9zdFROb2RlKTsKICAgICAgICBhZGRUb1ZpZXdUcmVlKGhvc3RWaWV3LCBsQ29udGFpbmVyKTsKICAgIH0KICAgIHJldHVybiBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKGxDb250YWluZXIsIGhvc3RUTm9kZSwgaG9zdFZpZXcpOwp9Ci8qKgogKiBSZXR1cm5zIGEgQ2hhbmdlRGV0ZWN0b3JSZWYgKGEuay5hLiBhIFZpZXdSZWYpCiAqIEBwYXJhbSB7Pz19IGlzUGlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWYoaXNQaXBlID0gZmFsc2UpIHsKICAgIHJldHVybiBjcmVhdGVWaWV3UmVmKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBnZXRMVmlldygpLCBpc1BpcGUpOwp9Ci8qKgogKiBDcmVhdGVzIGEgVmlld1JlZiBhbmQgc3RvcmVzIGl0IG9uIHRoZSBpbmplY3RvciBhcyBDaGFuZ2VEZXRlY3RvclJlZiAocHVibGljIGFsaWFzKS4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBUaGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBDaGFuZ2VEZXRlY3RvclJlZgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHRvIHdoaWNoIHRoZSBub2RlIGJlbG9uZ3MKICogQHBhcmFtIHs/fSBpc1BpcGUgV2hldGhlciB0aGUgdmlldyBpcyBiZWluZyBpbmplY3RlZCBpbnRvIGEgcGlwZS4KICogQHJldHVybiB7P30gVGhlIENoYW5nZURldGVjdG9yUmVmIHRvIHVzZQogKi8KZnVuY3Rpb24gY3JlYXRlVmlld1JlZih0Tm9kZSwgbFZpZXcsIGlzUGlwZSkgewogICAgLy8gYGlzQ29tcG9uZW50Vmlld2Agd2lsbCBiZSB0cnVlIGZvciBDb21wb25lbnQgYW5kIERpcmVjdGl2ZXMgKGJ1dCBub3QgZm9yIFBpcGVzKS4KICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3B1bGwvMzMwNzIgZm9yIHByb3BlciBmaXgKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzQ29tcG9uZW50VmlldyA9ICFpc1BpcGUgJiYgaXNDb21wb25lbnRIb3N0KHROb2RlKTsKICAgIGlmIChpc0NvbXBvbmVudFZpZXcpIHsKICAgICAgICAvLyBUaGUgTFZpZXcgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbXBvbmVudCBpcyBkZWNsYXJlZC4KICAgICAgICAvLyBJbnN0ZWFkIHdlIHdhbnQgdGhlIExWaWV3IGZvciB0aGUgY29tcG9uZW50IFZpZXcgYW5kIHNvIHdlIG5lZWQgdG8gbG9vayBpdCB1cC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh0Tm9kZS5pbmRleCwgbFZpZXcpOwogICAgICAgIHJldHVybiBuZXcgVmlld1JlZihjb21wb25lbnRWaWV3LCBjb21wb25lbnRWaWV3KTsKICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyB8fAogICAgICAgIHROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fCB0Tm9kZS50eXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykgewogICAgICAgIC8vIFRoZSBMVmlldyByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCBmcm9tLgogICAgICAgIC8vIFdlIG5lZWQgdG8gbG9jYXRlIHRoZSBjb250YWluaW5nIExWaWV3IChpbiBjYXNlIHdoZXJlIHRoZSBgbFZpZXdgIGlzIGFuIGVtYmVkZGVkIHZpZXcpCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvc3RDb21wb25lbnRWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIHJldHVybiBuZXcgVmlld1JlZihob3N0Q29tcG9uZW50VmlldywgbFZpZXcpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChudWxsKSk7Cn0KLyoqCiAqIFJldHVybnMgYSBSZW5kZXJlcjIgKG9yIHRocm93cyB3aGVuIGFwcGxpY2F0aW9uIHdhcyBib290c3RyYXBwZWQgd2l0aCBSZW5kZXJlcjMpCiAqIEBwYXJhbSB7P30gdmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW5kZXJlcjIodmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSB2aWV3W1JFTkRFUkVSXTsKICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHJlbmRlcmVyKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmplY3QgUmVuZGVyZXIyIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHVzZXMgUmVuZGVyZXIzIScpOwogICAgfQp9Ci8qKgogKiBJbmplY3RzIGEgUmVuZGVyZXIyIGZvciB0aGUgY3VycmVudCBjb21wb25lbnQuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RSZW5kZXJlcjIoKSB7CiAgICAvLyBXZSBuZWVkIHRoZSBSZW5kZXJlciB0byBiZSBiYXNlZCBvbiB0aGUgY29tcG9uZW50IHRoYXQgaXQncyBiZWluZyBpbmplY3RlZCBpbnRvLCBob3dldmVyIHNpbmNlCiAgICAvLyBESSBoYXBwZW5zIGJlZm9yZSB3ZSd2ZSBlbnRlcmVkIGl0cyB2aWV3LCBgZ2V0TFZpZXdgIHdpbGwgcmV0dXJuIHRoZSBwYXJlbnQgdmlldyBpbnN0ZWFkLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vZGVBdEluZGV4ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KHROb2RlLmluZGV4LCBsVmlldyk7CiAgICByZXR1cm4gZ2V0T3JDcmVhdGVSZW5kZXJlcjIoaXNMVmlldyhub2RlQXRJbmRleCkgPyBub2RlQXRJbmRleCA6IGxWaWV3KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBCYXNlIGNsYXNzIGZvciBBbmd1bGFyIFZpZXdzLCBwcm92aWRlcyBjaGFuZ2UgZGV0ZWN0aW9uIGZ1bmN0aW9uYWxpdHkuCiAqIEEgY2hhbmdlLWRldGVjdGlvbiB0cmVlIGNvbGxlY3RzIGFsbCB2aWV3cyB0aGF0IGFyZSB0byBiZSBjaGVja2VkIGZvciBjaGFuZ2VzLgogKiBVc2UgdGhlIG1ldGhvZHMgdG8gYWRkIGFuZCByZW1vdmUgdmlld3MgZnJvbSB0aGUgdHJlZSwgaW5pdGlhdGUgY2hhbmdlLWRldGVjdGlvbiwKICogYW5kIGV4cGxpY2l0bHkgbWFyayB2aWV3cyBhcyBfZGlydHlfLCBtZWFuaW5nIHRoYXQgdGhleSBoYXZlIGNoYW5nZWQgYW5kIG5lZWQgdG8gYmUgcmVyZW5kZXJlZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRvIG1vZGlmeSBkZWZhdWx0IGNoYW5nZS1kZXRlY3Rpb24gYmVoYXZpb3IKICogdG8gcGVyZm9ybSBleHBsaWNpdCBkZXRlY3Rpb24gd2hlbiBuZWVkZWQuCiAqCiAqICMjIyBVc2UgYG1hcmtGb3JDaGVjaygpYCB3aXRoIGBDaGVja09uY2VgIHN0cmF0ZWd5CiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHRoZSBgT25QdXNoYCBjaGFuZ2UtZGV0ZWN0aW9uIHN0cmF0ZWd5IGZvciBhIGNvbXBvbmVudAogKiAoYENoZWNrT25jZWAsIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGBDaGVja0Fsd2F5c2ApLCB0aGVuIGZvcmNlcyBhIHNlY29uZCBjaGVjawogKiBhZnRlciBhbiBpbnRlcnZhbC4gU2VlIFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0dDNTEyYj9wPXByZXZpZXcpLgogKgogKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvcmUvdHMvY2hhbmdlX2RldGVjdC9jaGFuZ2UtZGV0ZWN0aW9uLnRzIgogKiByZWdpb249Im1hcmstZm9yLWNoZWNrIj48L2NvZGUtZXhhbXBsZT4KICoKICogIyMjIERldGFjaCBjaGFuZ2UgZGV0ZWN0b3IgdG8gbGltaXQgaG93IG9mdGVuIGNoZWNrIG9jY3VycwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkLW9ubHkgZGF0YQogKiB0aGF0IGlzIGV4cGVjdGVkIHRvIGNoYW5nZSBjb25zdGFudGx5LCBtYW55IHRpbWVzIHBlciBzZWNvbmQuCiAqIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdAogKiBsZXNzIG9mdGVuIHRoYW4gdGhlIGNoYW5nZXMgYWN0dWFsbHkgb2NjdXIuIFRvIGRvIHRoYXQsIHdlIGRldGFjaAogKiB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBwZXJmb3JtIGFuIGV4cGxpY2l0IGxvY2FsIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICoKICogPGNvZGUtZXhhbXBsZSBwYXRoPSJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50cyIgcmVnaW9uPSJkZXRhY2giPjwvY29kZS1leGFtcGxlPgogKgogKgogKiAjIyMgUmVhdHRhY2hpbmcgYSBkZXRhY2hlZCBjb21wb25lbnQKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBjb21wb25lbnQgZGlzcGxheWluZyBsaXZlIGRhdGEuCiAqIFRoZSBjb21wb25lbnQgZGV0YWNoZXMgaXRzIGNoYW5nZSBkZXRlY3RvciBmcm9tIHRoZSBtYWluIGNoYW5nZSBkZXRlY3RvciB0cmVlCiAqIHdoZW4gdGhlIGBsaXZlYCBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UsIGFuZCByZWF0dGFjaGVzIGl0IHdoZW4gdGhlIHByb3BlcnR5CiAqIGJlY29tZXMgdHJ1ZS4KICoKICogPGNvZGUtZXhhbXBsZSBwYXRoPSJjb3JlL3RzL2NoYW5nZV9kZXRlY3QvY2hhbmdlLWRldGVjdGlvbi50cyIgcmVnaW9uPSJyZWF0dGFjaCI+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQ2hhbmdlRGV0ZWN0b3JSZWYgewp9Ci8qKgogKiBcQGludGVybmFsCiAqIEBub2NvbGxhcHNlCiAqLwpDaGFuZ2VEZXRlY3RvclJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUlkoKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWY7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWSA9IFNXSVRDSF9DSEFOR0VfREVURUNUT1JfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEBkZXNjcmlwdGlvbgogKgogKiBSZXByZXNlbnRzIGEgdHlwZSB0aGF0IGEgQ29tcG9uZW50IG9yIG90aGVyIG9iamVjdCBpcyBpbnN0YW5jZXMgb2YuCiAqCiAqIEFuIGV4YW1wbGUgb2YgYSBgVHlwZWAgaXMgYE15Q3VzdG9tQ29tcG9uZW50YCBjbGFzcywgd2hpY2ggaW4gSmF2YVNjcmlwdCBpcyBiZSByZXByZXNlbnRlZCBieQogKiB0aGUgYE15Q3VzdG9tQ29tcG9uZW50YCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHB1YmxpY0FwaQogKi8KY29uc3QgVHlwZSA9IEZ1bmN0aW9uOwpmdW5jdGlvbiBpc1R5cGUodikgewogICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBBdHRlbnRpb246IFRoZXNlIHJlZ2V4IGhhcyB0byBob2xkIGV2ZW4gaWYgdGhlIGNvZGUgaXMgbWluaWZpZWQhCiAqLwpjb25zdCBERUxFR0FURV9DVE9SID0gL15mdW5jdGlvblxzK1xTK1woXClccyp7W1xzXFNdK1wuYXBwbHlcKHRoaXMsXHMqYXJndW1lbnRzXCkvOwpjb25zdCBJTkhFUklURURfQ0xBU1MgPSAvXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3svOwpjb25zdCBJTkhFUklURURfQ0xBU1NfV0lUSF9DVE9SID0gL15jbGFzc1xzK1tBLVphLXpcZCRfXSpccypleHRlbmRzXHMrW157XSt7W1xzXFNdKmNvbnN0cnVjdG9yXHMqXCgvOwpjb25zdCBJTkhFUklURURfQ0xBU1NfV0lUSF9ERUxFR0FURV9DVE9SID0gL15jbGFzc1xzK1tBLVphLXpcZCRfXSpccypleHRlbmRzXHMrW157XSt7W1xzXFNdKmNvbnN0cnVjdG9yXHMqXChcKVxzKntccytzdXBlclwoXC5cLlwuYXJndW1lbnRzXCkvOwovKioKICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdHJpbmdpZmllZCB0eXBlIGlzIGEgY2xhc3Mgd2hpY2ggZGVsZWdhdGVzIGl0cyBjb25zdHJ1Y3RvcgogKiB0byBpdHMgcGFyZW50LgogKgogKiBUaGlzIGlzIG5vdCB0cml2aWFsIHNpbmNlIGNvbXBpbGVkIGNvZGUgY2FuIGFjdHVhbGx5IGNvbnRhaW4gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiBldmVuIGlmIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSBkaWQgbm90LiBGb3IgaW5zdGFuY2UsIHdoZW4gdGhlIGNoaWxkIGNsYXNzIGNvbnRhaW5zCiAqIGFuIGluaXRpYWxpemVkIGluc3RhbmNlIHByb3BlcnR5LgogKi8KZnVuY3Rpb24gaXNEZWxlZ2F0ZUN0b3IodHlwZVN0cikgewogICAgcmV0dXJuIERFTEVHQVRFX0NUT1IudGVzdCh0eXBlU3RyKSB8fCBJTkhFUklURURfQ0xBU1NfV0lUSF9ERUxFR0FURV9DVE9SLnRlc3QodHlwZVN0cikgfHwKICAgICAgICAoSU5IRVJJVEVEX0NMQVNTLnRlc3QodHlwZVN0cikgJiYgIUlOSEVSSVRFRF9DTEFTU19XSVRIX0NUT1IudGVzdCh0eXBlU3RyKSk7Cn0KY2xhc3MgUmVmbGVjdGlvbkNhcGFiaWxpdGllcyB7CiAgICBjb25zdHJ1Y3RvcihyZWZsZWN0KSB7CiAgICAgICAgdGhpcy5fcmVmbGVjdCA9IHJlZmxlY3QgfHwgX2dsb2JhbFsnUmVmbGVjdCddOwogICAgfQogICAgaXNSZWZsZWN0aW9uRW5hYmxlZCgpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZhY3RvcnkodCkgewogICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gbmV3IHQoLi4uYXJncyk7CiAgICB9CiAgICAvKiogQGludGVybmFsICovCiAgICBfemlwVHlwZXNBbmRBbm5vdGF0aW9ucyhwYXJhbVR5cGVzLCBwYXJhbUFubm90YXRpb25zKSB7CiAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICBpZiAodHlwZW9mIHBhcmFtVHlwZXMgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ld0FycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ld0FycmF5KHBhcmFtVHlwZXMubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gVFMgb3V0cHV0cyBPYmplY3QgZm9yIHBhcmFtZXRlcnMgd2l0aG91dCB0eXBlcywgd2hpbGUgVHJhY2V1ciBvbWl0cwogICAgICAgICAgICAvLyB0aGUgYW5ub3RhdGlvbnMuIEZvciBub3cgd2UgcHJlc2VydmUgdGhlIFRyYWNldXIgYmVoYXZpb3IgdG8gYWlkCiAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiwgYnV0IHRoaXMgY2FuIGJlIHJldmlzaXRlZC4KICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1UeXBlc1tpXSAmJiBwYXJhbVR5cGVzW2ldICE9IE9iamVjdCkgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmFtQW5ub3RhdGlvbnMgJiYgcGFyYW1Bbm5vdGF0aW9uc1tpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBfb3duUGFyYW1ldGVycyh0eXBlLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgY29uc3QgdHlwZVN0ciA9IHR5cGUudG9TdHJpbmcoKTsKICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRlY29yYXRvcnMsIHdlIG9ubHkgaGF2ZSBmdW5jdGlvbi5sZW5ndGggYXMgbWV0YWRhdGEuCiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB0byBkZXRlY3Qgd2hldGhlciBhIGNoaWxkIGNsYXNzIGRlY2xhcmVkIGFuIG93biBjb25zdHJ1Y3RvciBvciBub3QsCiAgICAgICAgLy8gd2UgbmVlZCB0byBsb29rIGluc2lkZSBvZiB0aGF0IGNvbnN0cnVjdG9yIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMKICAgICAgICAvLyBqdXN0IGNhbGxpbmcgdGhlIHBhcmVudC4KICAgICAgICAvLyBUaGlzIGFsc28gaGVscHMgdG8gd29yayBhcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTI0MzkKICAgICAgICAvLyB0aGF0IHNldHMgJ2Rlc2lnbjpwYXJhbXR5cGVzJyB0byBbXQogICAgICAgIC8vIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzIGJ1dCBoYXMgbm8gY3RvciBkZWNsYXJlZCBpdHNlbGYuCiAgICAgICAgaWYgKGlzRGVsZWdhdGVDdG9yKHR5cGVTdHIpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBQcmVmZXIgdGhlIGRpcmVjdCBBUEkuCiAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVycyAmJiB0eXBlLnBhcmFtZXRlcnMgIT09IHBhcmVudEN0b3IucGFyYW1ldGVycykgewogICAgICAgICAgICByZXR1cm4gdHlwZS5wYXJhbWV0ZXJzOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy4KICAgICAgICBjb25zdCB0c2lja2xlQ3RvclBhcmFtcyA9IHR5cGUuY3RvclBhcmFtZXRlcnM7CiAgICAgICAgaWYgKHRzaWNrbGVDdG9yUGFyYW1zICYmIHRzaWNrbGVDdG9yUGFyYW1zICE9PSBwYXJlbnRDdG9yLmN0b3JQYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgIC8vIE5ld2VyIHRzaWNrbGUgdXNlcyBhIGZ1bmN0aW9uIGNsb3N1cmUKICAgICAgICAgICAgLy8gUmV0YWluIHRoZSBub24tZnVuY3Rpb24gY2FzZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRzaWNrbGUKICAgICAgICAgICAgY29uc3QgY3RvclBhcmFtZXRlcnMgPSB0eXBlb2YgdHNpY2tsZUN0b3JQYXJhbXMgPT09ICdmdW5jdGlvbicgPyB0c2lja2xlQ3RvclBhcmFtcygpIDogdHNpY2tsZUN0b3JQYXJhbXM7CiAgICAgICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSBjdG9yUGFyYW1ldGVycy5tYXAoKGN0b3JQYXJhbSkgPT4gY3RvclBhcmFtICYmIGN0b3JQYXJhbS50eXBlKTsKICAgICAgICAgICAgY29uc3QgcGFyYW1Bbm5vdGF0aW9ucyA9IGN0b3JQYXJhbWV0ZXJzLm1hcCgoY3RvclBhcmFtKSA9PiBjdG9yUGFyYW0gJiYgY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEoY3RvclBhcmFtLmRlY29yYXRvcnMpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMocGFyYW1UeXBlcywgcGFyYW1Bbm5vdGF0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy4KICAgICAgICBjb25zdCBwYXJhbUFubm90YXRpb25zID0gdHlwZS5oYXNPd25Qcm9wZXJ0eShQQVJBTUVURVJTKSAmJiB0eXBlW1BBUkFNRVRFUlNdOwogICAgICAgIGNvbnN0IHBhcmFtVHlwZXMgPSB0aGlzLl9yZWZsZWN0ICYmIHRoaXMuX3JlZmxlY3QuZ2V0T3duTWV0YWRhdGEgJiYKICAgICAgICAgICAgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0eXBlKTsKICAgICAgICBpZiAocGFyYW1UeXBlcyB8fCBwYXJhbUFubm90YXRpb25zKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvLyBJZiBhIGNsYXNzIGhhcyBubyBkZWNvcmF0b3JzLCBhdCBsZWFzdCBjcmVhdGUgbWV0YWRhdGEKICAgICAgICAvLyBiYXNlZCBvbiBmdW5jdGlvbi5sZW5ndGguCiAgICAgICAgLy8gTm90ZTogV2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIGNvbnN0cnVjdG9yIGFzIHdlIGNoZWNrZWQKICAgICAgICAvLyB0aGUgY29udGVudCBvZiB0aGUgY29uc3RydWN0b3IgYWJvdmUuCiAgICAgICAgcmV0dXJuIG5ld0FycmF5KHR5cGUubGVuZ3RoKTsKICAgIH0KICAgIHBhcmFtZXRlcnModHlwZSkgewogICAgICAgIC8vIE5vdGU6IG9ubHkgcmVwb3J0IG1ldGFkYXRhIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNsYXNzIGRlY29yYXRvcgogICAgICAgIC8vIHRvIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBzdGF0aWMgcmVmbGVjdG9yLgogICAgICAgIGlmICghaXNUeXBlKHR5cGUpKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcGFyZW50Q3RvciA9IGdldFBhcmVudEN0b3IodHlwZSk7CiAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSB0aGlzLl9vd25QYXJhbWV0ZXJzKHR5cGUsIHBhcmVudEN0b3IpOwogICAgICAgIGlmICghcGFyYW1ldGVycyAmJiBwYXJlbnRDdG9yICE9PSBPYmplY3QpIHsKICAgICAgICAgICAgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycyhwYXJlbnRDdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMgfHwgW107CiAgICB9CiAgICBfb3duQW5ub3RhdGlvbnModHlwZU9yRnVuYywgcGFyZW50Q3RvcikgewogICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS4KICAgICAgICBpZiAodHlwZU9yRnVuYy5hbm5vdGF0aW9ucyAmJiB0eXBlT3JGdW5jLmFubm90YXRpb25zICE9PSBwYXJlbnRDdG9yLmFubm90YXRpb25zKSB7CiAgICAgICAgICAgIGxldCBhbm5vdGF0aW9ucyA9IHR5cGVPckZ1bmMuYW5ub3RhdGlvbnM7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy4KICAgICAgICBpZiAodHlwZU9yRnVuYy5kZWNvcmF0b3JzICYmIHR5cGVPckZ1bmMuZGVjb3JhdG9ycyAhPT0gcGFyZW50Q3Rvci5kZWNvcmF0b3JzKSB7CiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YSh0eXBlT3JGdW5jLmRlY29yYXRvcnMpOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuCiAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoQU5OT1RBVElPTlMpKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlT3JGdW5jW0FOTk9UQVRJT05TXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBhbm5vdGF0aW9ucyh0eXBlT3JGdW5jKSB7CiAgICAgICAgaWYgKCFpc1R5cGUodHlwZU9yRnVuYykpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBjb25zdCBwYXJlbnRDdG9yID0gZ2V0UGFyZW50Q3Rvcih0eXBlT3JGdW5jKTsKICAgICAgICBjb25zdCBvd25Bbm5vdGF0aW9ucyA9IHRoaXMuX293bkFubm90YXRpb25zKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpIHx8IFtdOwogICAgICAgIGNvbnN0IHBhcmVudEFubm90YXRpb25zID0gcGFyZW50Q3RvciAhPT0gT2JqZWN0ID8gdGhpcy5hbm5vdGF0aW9ucyhwYXJlbnRDdG9yKSA6IFtdOwogICAgICAgIHJldHVybiBwYXJlbnRBbm5vdGF0aW9ucy5jb25jYXQob3duQW5ub3RhdGlvbnMpOwogICAgfQogICAgX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLgogICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAmJgogICAgICAgICAgICB0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAhPT0gcGFyZW50Q3Rvci5wcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgbGV0IHByb3BNZXRhZGF0YSA9IHR5cGVPckZ1bmMucHJvcE1ldGFkYXRhOwogICAgICAgICAgICBpZiAodHlwZW9mIHByb3BNZXRhZGF0YSA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGEgPSBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIC8vIEFQSSBvZiB0c2lja2xlIGZvciBsb3dlcmluZyBkZWNvcmF0b3JzIHRvIHByb3BlcnRpZXMgb24gdGhlIGNsYXNzLgogICAgICAgIGlmICh0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzICYmCiAgICAgICAgICAgIHR5cGVPckZ1bmMucHJvcERlY29yYXRvcnMgIT09IHBhcmVudEN0b3IucHJvcERlY29yYXRvcnMpIHsKICAgICAgICAgICAgY29uc3QgcHJvcERlY29yYXRvcnMgPSB0eXBlT3JGdW5jLnByb3BEZWNvcmF0b3JzOwogICAgICAgICAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSB7fTsKICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcERlY29yYXRvcnMpLmZvckVhY2gocHJvcCA9PiB7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcF0gPSBjb252ZXJ0VHNpY2tsZURlY29yYXRvckludG9NZXRhZGF0YShwcm9wRGVjb3JhdG9yc1twcm9wXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhOwogICAgICAgIH0KICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuCiAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoUFJPUF9NRVRBREFUQSkpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVPckZ1bmNbUFJPUF9NRVRBREFUQV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpIHsKICAgICAgICBpZiAoIWlzVHlwZSh0eXBlT3JGdW5jKSkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBhcmVudEN0b3IgPSBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpOwogICAgICAgIGNvbnN0IHByb3BNZXRhZGF0YSA9IHt9OwogICAgICAgIGlmIChwYXJlbnRDdG9yICE9PSBPYmplY3QpIHsKICAgICAgICAgICAgY29uc3QgcGFyZW50UHJvcE1ldGFkYXRhID0gdGhpcy5wcm9wTWV0YWRhdGEocGFyZW50Q3Rvcik7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHBhcmVudFByb3BNZXRhZGF0YSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHsKICAgICAgICAgICAgICAgIHByb3BNZXRhZGF0YVtwcm9wTmFtZV0gPSBwYXJlbnRQcm9wTWV0YWRhdGFbcHJvcE5hbWVdOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgb3duUHJvcE1ldGFkYXRhID0gdGhpcy5fb3duUHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMsIHBhcmVudEN0b3IpOwogICAgICAgIGlmIChvd25Qcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgT2JqZWN0LmtleXMob3duUHJvcE1ldGFkYXRhKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IFtdOwogICAgICAgICAgICAgICAgaWYgKHByb3BNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goLi4ucHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goLi4ub3duUHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGFbcHJvcE5hbWVdID0gZGVjb3JhdG9yczsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7CiAgICB9CiAgICBvd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgIGlmICghaXNUeXBlKHR5cGVPckZ1bmMpKSB7CiAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpKSB8fCB7fTsKICAgIH0KICAgIGhhc0xpZmVjeWNsZUhvb2sodHlwZSwgbGNQcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZSAmJiBsY1Byb3BlcnR5IGluIHR5cGUucHJvdG90eXBlOwogICAgfQogICAgZ3VhcmRzKHR5cGUpIHsKICAgICAgICByZXR1cm4ge307CiAgICB9CiAgICBnZXR0ZXIobmFtZSkgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ28nLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnOycpOwogICAgfQogICAgc2V0dGVyKG5hbWUpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ3YnLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnID0gdjsnKTsKICAgIH0KICAgIG1ldGhvZChuYW1lKSB7CiAgICAgICAgY29uc3QgZnVuY3Rpb25Cb2R5ID0gYGlmICghby4ke25hbWV9KSB0aHJvdyBuZXcgRXJyb3IoJyIke25hbWV9IiBpcyB1bmRlZmluZWQnKTsKICAgICAgICByZXR1cm4gby4ke25hbWV9LmFwcGx5KG8sIGFyZ3MpO2A7CiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbignbycsICdhcmdzJywgZnVuY3Rpb25Cb2R5KTsKICAgIH0KICAgIC8vIFRoZXJlIGlzIG5vdCBhIGNvbmNlcHQgb2YgaW1wb3J0IHVyaSBpbiBKcywgYnV0IHRoaXMgaXMgdXNlZnVsIGluIGRldmVsb3BpbmcgRGFydCBhcHBsaWNhdGlvbnMuCiAgICBpbXBvcnRVcmkodHlwZSkgewogICAgICAgIC8vIFN0YXRpY1N5bWJvbAogICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZVsnZmlsZVBhdGgnXSkgewogICAgICAgICAgICByZXR1cm4gdHlwZVsnZmlsZVBhdGgnXTsKICAgICAgICB9CiAgICAgICAgLy8gUnVudGltZSB0eXBlCiAgICAgICAgcmV0dXJuIGAuLyR7c3RyaW5naWZ5KHR5cGUpfWA7CiAgICB9CiAgICByZXNvdXJjZVVyaSh0eXBlKSB7CiAgICAgICAgcmV0dXJuIGAuLyR7c3RyaW5naWZ5KHR5cGUpfWA7CiAgICB9CiAgICByZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpIHsKICAgICAgICByZXR1cm4gcnVudGltZTsKICAgIH0KICAgIHJlc29sdmVFbnVtKGVudW1JZGVudGlmaWVyLCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGVudW1JZGVudGlmaWVyW25hbWVdOwogICAgfQp9CmZ1bmN0aW9uIGNvbnZlcnRUc2lja2xlRGVjb3JhdG9ySW50b01ldGFkYXRhKGRlY29yYXRvckludm9jYXRpb25zKSB7CiAgICBpZiAoIWRlY29yYXRvckludm9jYXRpb25zKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgcmV0dXJuIGRlY29yYXRvckludm9jYXRpb25zLm1hcChkZWNvcmF0b3JJbnZvY2F0aW9uID0+IHsKICAgICAgICBjb25zdCBkZWNvcmF0b3JUeXBlID0gZGVjb3JhdG9ySW52b2NhdGlvbi50eXBlOwogICAgICAgIGNvbnN0IGFubm90YXRpb25DbHMgPSBkZWNvcmF0b3JUeXBlLmFubm90YXRpb25DbHM7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbkFyZ3MgPSBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgPyBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgOiBbXTsKICAgICAgICByZXR1cm4gbmV3IGFubm90YXRpb25DbHMoLi4uYW5ub3RhdGlvbkFyZ3MpOwogICAgfSk7Cn0KZnVuY3Rpb24gZ2V0UGFyZW50Q3RvcihjdG9yKSB7CiAgICBjb25zdCBwYXJlbnRQcm90byA9IGN0b3IucHJvdG90eXBlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IucHJvdG90eXBlKSA6IG51bGw7CiAgICBjb25zdCBwYXJlbnRDdG9yID0gcGFyZW50UHJvdG8gPyBwYXJlbnRQcm90by5jb25zdHJ1Y3RvciA6IG51bGw7CiAgICAvLyBOb3RlOiBXZSBhbHdheXMgdXNlIGBPYmplY3RgIGFzIHRoZSBudWxsIHZhbHVlCiAgICAvLyB0byBzaW1wbGlmeSBjaGVja2luZyBsYXRlciBvbi4KICAgIHJldHVybiBwYXJlbnRDdG9yIHx8IE9iamVjdDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpsZXQgX3JlZmxlY3QgPSBudWxsOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFJlZmxlY3QoKSB7CiAgICByZXR1cm4gKF9yZWZsZWN0ID0gX3JlZmxlY3QgfHwgbmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVmbGVjdERlcGVuZGVuY2llcyh0eXBlKSB7CiAgICByZXR1cm4gY29udmVydERlcGVuZGVuY2llcyhnZXRSZWZsZWN0KCkucGFyYW1ldGVycyh0eXBlKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZGVwcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydERlcGVuZGVuY2llcyhkZXBzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICByZXR1cm4gZGVwcy5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlcCA9PiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGNvbXBpbGVyCiAqIEBwYXJhbSB7P30gZGVwCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXRhID0gewogICAgICAgIHRva2VuOiBudWxsLAogICAgICAgIGhvc3Q6IGZhbHNlLAogICAgICAgIG9wdGlvbmFsOiBmYWxzZSwKICAgICAgICByZXNvbHZlZDogY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLlRva2VuLAogICAgICAgIHNlbGY6IGZhbHNlLAogICAgICAgIHNraXBTZWxmOiBmYWxzZSwKICAgIH07CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHRva2VuKSB7CiAgICAgICAgbWV0YS5yZXNvbHZlZCA9IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5Ub2tlbjsKICAgICAgICBtZXRhLnRva2VuID0gdG9rZW47CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXApICYmIGRlcC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkZXAubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbSA9IGRlcFtqXTsKICAgICAgICAgICAgaWYgKHBhcmFtID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIHBhcmFtIG1heSBiZSB1bmRlZmluZWQgaWYgdHlwZSBvZiBkZXAgaXMgbm90IHNldCBieSBuZ3RzYwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJhbSk7CiAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9wdGlvbmFsIHx8IHByb3RvLm5nTWV0YWRhdGFOYW1lID09PSAnT3B0aW9uYWwnKSB7CiAgICAgICAgICAgICAgICBtZXRhLm9wdGlvbmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IHByb3RvLm5nTWV0YWRhdGFOYW1lID09PSAnU2tpcFNlbGYnKSB7CiAgICAgICAgICAgICAgICBtZXRhLnNraXBTZWxmID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIFNlbGYgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdTZWxmJykgewogICAgICAgICAgICAgICAgbWV0YS5zZWxmID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEhvc3QgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdIb3N0JykgewogICAgICAgICAgICAgICAgbWV0YS5ob3N0ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbSBpbnN0YW5jZW9mIEluamVjdCkgewogICAgICAgICAgICAgICAgbWV0YS50b2tlbiA9IHBhcmFtLnRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgQXR0cmlidXRlKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uYXR0cmlidXRlTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGRlZmluZWQuYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZXRhLnRva2VuID0gcGFyYW0uYXR0cmlidXRlTmFtZTsKICAgICAgICAgICAgICAgIG1ldGEucmVzb2x2ZWQgPSBjb21waWxlci5SM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuQXR0cmlidXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSBDaGFuZ2VEZXRlY3RvclJlZikgewogICAgICAgICAgICAgICAgbWV0YS50b2tlbiA9IHBhcmFtOwogICAgICAgICAgICAgICAgbWV0YS5yZXNvbHZlZCA9IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5DaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHBhcmFtKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGRlcCA9PT0gdW5kZWZpbmVkIHx8IChBcnJheS5pc0FycmF5KGRlcCkgJiYgZGVwLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICBtZXRhLnRva2VuID0gdW5kZWZpbmVkOwogICAgICAgIG1ldGEucmVzb2x2ZWQgPSBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuSW52YWxpZDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKGRlcCk7CiAgICB9CiAgICByZXR1cm4gbWV0YTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaml0L2luamVjdGFibGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENvbXBpbGUgYW4gQW5ndWxhciBpbmplY3RhYmxlIGFjY29yZGluZyB0byBpdHMgYEluamVjdGFibGVgIG1ldGFkYXRhLCBhbmQgcGF0Y2ggdGhlIHJlc3VsdGluZwogKiBpbmplY3RhYmxlIGRlZiAoYMm1cHJvdmApIG9udG8gdGhlIGluamVjdGFibGUgdHlwZS4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7Pz19IHNyY01ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVJbmplY3RhYmxlKHR5cGUsIHNyY01ldGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ0luamVjdGFibGVEZWYgPSBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nRmFjdG9yeURlZiA9IG51bGw7CiAgICAvLyBpZiBOR19QUk9WX0RFRiBpcyBhbHJlYWR5IGRlZmluZWQgb24gdGhpcyBjbGFzcyB0aGVuIGRvbid0IG92ZXJ3cml0ZSBpdAogICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGKSkgewogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19QUk9WX0RFRiwgewogICAgICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChuZ0luamVjdGFibGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBuZ0luamVjdGFibGVEZWYgPSBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVJbmplY3RhYmxlKGFuZ3VsYXJDb3JlRGlFbnYsIGBuZzovLy8ke3R5cGUubmFtZX0vybVwcm92LmpzYCwgZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHR5cGUsIHNyY01ldGEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0luamVjdGFibGVEZWY7CiAgICAgICAgICAgIH0pLAogICAgICAgIH0pOwogICAgICAgIC8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAogICAgICAgIC8vIHdoaWNoIHdpbGwgYnJlYWsgaW5oZXJpdGluZyB0aGUgaW5qZWN0YWJsZSBkZWZpbml0aW9uIGZyb20gYSBncmFuZHBhcmVudCB0aHJvdWdoIGFuCiAgICAgICAgLy8gdW5kZWNvcmF0ZWQgcGFyZW50IGNsYXNzLiBXZSB3b3JrIGFyb3VuZCBpdCBieSBkZWZpbmluZyBhIG1ldGhvZCB3aGljaCBzaG91bGQgYmUgdXNlZAogICAgICAgIC8vIGFzIGEgZmFsbGJhY2suIFRoaXMgc2hvdWxkIG9ubHkgYmUgYSBwcm9ibGVtIGluIEpJVCBtb2RlLCBiZWNhdXNlIGluIEFPVCBUeXBlU2NyaXB0CiAgICAgICAgLy8gc2VlbXMgdG8gaGF2ZSBhIHdvcmthcm91bmQgZm9yIHN0YXRpYyBwcm9wZXJ0aWVzLiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhbiB1bmRlY29yYXRlZAogICAgICAgIC8vIHBhcmVudCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHYxMCwgdGhpcyBjYW4gc2FmZWx5IGJlIHJlbW92ZWQuCiAgICAgICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGX0ZBTExCQUNLKSkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSlbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpW05HX1BST1ZfREVGXSk7CiAgICAgICAgfQogICAgfQogICAgLy8gaWYgTkdfRkFDVE9SWV9ERUYgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIHRoaXMgY2xhc3MgdGhlbiBkb24ndCBvdmVyd3JpdGUgaXQKICAgIGlmICghdHlwZS5oYXNPd25Qcm9wZXJ0eShOR19GQUNUT1JZX0RFRikpIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRkFDVE9SWV9ERUYsIHsKICAgICAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHR5cGUsIHNyY01ldGEpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVEaUVudiwgYG5nOi8vLyR7dHlwZS5uYW1lfS/JtWZhYy5qc2AsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWV0YWRhdGEudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IG1ldGFkYXRhLnR5cGVBcmd1bWVudENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiByZWZsZWN0RGVwZW5kZW5jaWVzKHR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RGbjogJ2luamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogY29tcGlsZXIuUjNGYWN0b3J5VGFyZ2V0LkluamVjdGFibGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0ZhY3RvcnlEZWY7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAvLyBMZWF2ZSB0aGlzIGNvbmZpZ3VyYWJsZSBzbyB0aGF0IHRoZSBmYWN0b3JpZXMgZnJvbSBkaXJlY3RpdmVzIG9yIHBpcGVzIGNhbiB0YWtlIHByZWNlZGVuY2UuCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgfQp9CmNvbnN0IMm1MCQ2ID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVU0VfVkFMVUUkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkNiB9KTsKLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VDbGFzc1Byb3ZpZGVyKG1ldGEpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1ldGEpKSkudXNlQ2xhc3MgIT09IHVuZGVmaW5lZDsKfQovKioKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1VzZVZhbHVlUHJvdmlkZXIobWV0YSkgewogICAgcmV0dXJuIFVTRV9WQUxVRSQxIGluIG1ldGE7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobWV0YSkpKS51c2VGYWN0b3J5ICE9PSB1bmRlZmluZWQ7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG1ldGEpKSkudXNlRXhpc3RpbmcgIT09IHVuZGVmaW5lZDsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7Pz19IHNyY01ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEluamVjdGFibGVNZXRhZGF0YSh0eXBlLCBzcmNNZXRhKSB7CiAgICAvLyBBbGxvdyB0aGUgY29tcGlsYXRpb24gb2YgYSBjbGFzcyB3aXRoIGEgYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciB3aXRob3V0IHBhcmFtZXRlcnMKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1ldGEgPSBzcmNNZXRhIHx8IHsgcHJvdmlkZWRJbjogbnVsbCB9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcGlsZXJNZXRhID0gewogICAgICAgIG5hbWU6IHR5cGUubmFtZSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgIHByb3ZpZGVkSW46IG1ldGEucHJvdmlkZWRJbiwKICAgICAgICB1c2VyRGVwczogdW5kZWZpbmVkLAogICAgfTsKICAgIGlmICgoaXNVc2VDbGFzc1Byb3ZpZGVyKG1ldGEpIHx8IGlzVXNlRmFjdG9yeVByb3ZpZGVyKG1ldGEpKSAmJiBtZXRhLmRlcHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGNvbXBpbGVyTWV0YS51c2VyRGVwcyA9IGNvbnZlcnREZXBlbmRlbmNpZXMobWV0YS5kZXBzKTsKICAgIH0KICAgIGlmIChpc1VzZUNsYXNzUHJvdmlkZXIobWV0YSkpIHsKICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VDbGFzcywgYW5kIG1heSBvciBtYXkgbm90IGhhdmUgcHJvdmlkZWQgZGVwcy4KICAgICAgICBjb21waWxlck1ldGEudXNlQ2xhc3MgPSByZXNvbHZlRm9yd2FyZFJlZihtZXRhLnVzZUNsYXNzKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzVXNlVmFsdWVQcm92aWRlcihtZXRhKSkgewogICAgICAgIC8vIFRoZSB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHVzZVZhbHVlLgogICAgICAgIGNvbXBpbGVyTWV0YS51c2VWYWx1ZSA9IHJlc29sdmVGb3J3YXJkUmVmKG1ldGEudXNlVmFsdWUpOwogICAgfQogICAgZWxzZSBpZiAoaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkpIHsKICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VGYWN0b3J5LgogICAgICAgIGNvbXBpbGVyTWV0YS51c2VGYWN0b3J5ID0gbWV0YS51c2VGYWN0b3J5OwogICAgfQogICAgZWxzZSBpZiAoaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpKSB7CiAgICAgICAgLy8gVGhlIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdXNlRXhpc3RpbmcuCiAgICAgICAgY29tcGlsZXJNZXRhLnVzZUV4aXN0aW5nID0gcmVzb2x2ZUZvcndhcmRSZWYobWV0YS51c2VFeGlzdGluZyk7CiAgICB9CiAgICByZXR1cm4gY29tcGlsZXJNZXRhOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS91dGlsLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNvbnN0IMm1MCQ3ID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBVU0VfVkFMVUUkMiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkNyB9KTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTAkOCA9IC8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwoodHlwZSwgbWV0YSkgPT4gU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRSgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBtZXRhKTsKLyoqCiAqIEluamVjdGFibGUgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSW5qZWN0YWJsZSA9IG1ha2VEZWNvcmF0b3IoJ0luamVjdGFibGUnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUwJDgpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9JTkpFQ1RBQkxFX19QT1NUX1IzX18gPSBjb21waWxlSW5qZWN0YWJsZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9JTkpFQ1RBQkxFID0gU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRV9fUE9TVF9SM19fOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvc2NvcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuIGludGVybmFsIHRva2VuIHdob3NlIHByZXNlbmNlIGluIGFuIGluamVjdG9yIGluZGljYXRlcyB0aGF0IHRoZSBpbmplY3RvciBzaG91bGQgdHJlYXQgaXRzZWxmCiAqIGFzIGEgcm9vdCBzY29wZWQgaW5qZWN0b3Igd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzIGZvciB1bmtub3duIHRva2VucyB3aGljaCBtYXkgaW5kaWNhdGUKICogdGhleSBhcmUgcHJvdmlkZWQgaW4gdGhlIHJvb3Qgc2NvcGUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSU5KRUNUT1JfU0NPUEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1NldCBJbmplY3RvciBzY29wZS4nKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3IzX2luamVjdG9yLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBNYXJrZXIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSB2YWx1ZSBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgZmFjdG9yeSBmdW5jdGlvbi4KICogQHR5cGUgez99CiAqLwpjb25zdCBOT1RfWUVUID0ge307Ci8qKgogKiBNYXJrZXIgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGEgdG9rZW4gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY2FsbGVkLgogKgogKiBJZiB0aGUgaW5qZWN0b3IgaXMgYXNrZWQgdG8gaW5qZWN0IGEgdG9rZW4gd2l0aCBpdHMgdmFsdWUgc2V0IHRvIENJUkNVTEFSLCB0aGF0IGluZGljYXRlcwogKiBpbmplY3Rpb24gb2YgYSBkZXBlbmRlbmN5IGhhcyByZWN1cnNpdmVseSBhdHRlbXB0ZWQgdG8gaW5qZWN0IHRoZSBvcmlnaW5hbCB0b2tlbiwgYW5kIHRoZXJlIGlzCiAqIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBhbW9uZyB0aGUgcHJvdmlkZXJzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IENJUkNVTEFSID0ge307Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRU1QVFlfQVJSQVkkMiA9ICgvKiogQHR5cGUgez99ICovIChbXSkpOwovKioKICogQSBsYXppbHkgaW5pdGlhbGl6ZWQgTnVsbEluamVjdG9yLgogKiBAdHlwZSB7P30KICovCmxldCBOVUxMX0lOSkVDVE9SID0gdW5kZWZpbmVkOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE51bGxJbmplY3RvcigpIHsKICAgIGlmIChOVUxMX0lOSkVDVE9SID09PSB1bmRlZmluZWQpIHsKICAgICAgICBOVUxMX0lOSkVDVE9SID0gbmV3IE51bGxJbmplY3RvcigpOwogICAgfQogICAgcmV0dXJuIE5VTExfSU5KRUNUT1I7Cn0KLyoqCiAqIENyZWF0ZSBhIG5ldyBgSW5qZWN0b3JgIHdoaWNoIGlzIGNvbmZpZ3VyZWQgdXNpbmcgYSBgZGVmVHlwZWAgb2YgYEluamVjdG9yVHlwZTxhbnk+YHMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gZGVmVHlwZQogKiBAcGFyYW0gez89fSBwYXJlbnQKICogQHBhcmFtIHs/PX0gYWRkaXRpb25hbFByb3ZpZGVycwogKiBAcGFyYW0gez89fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVJbmplY3RvcihkZWZUeXBlLCBwYXJlbnQgPSBudWxsLCBhZGRpdGlvbmFsUHJvdmlkZXJzID0gbnVsbCwgbmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcldpdGhvdXRJbmplY3Rvckluc3RhbmNlcyhkZWZUeXBlLCBwYXJlbnQsIGFkZGl0aW9uYWxQcm92aWRlcnMsIG5hbWUpOwogICAgaW5qZWN0b3IuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCk7CiAgICByZXR1cm4gaW5qZWN0b3I7Cn0KLyoqCiAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0b3Igd2l0aG91dCBlYWdlcmx5IHJlc29sdmluZyBpdHMgaW5qZWN0b3IgdHlwZXMuIENhbiBiZSB1c2VkIGluIHBsYWNlcwogKiB3aGVyZSByZXNvbHZpbmcgdGhlIGluamVjdG9yIHR5cGVzIGltbWVkaWF0ZWx5IGNhbiBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuIFRoZSBpbmplY3RvciB0eXBlcwogKiBzaG91bGQgYmUgcmVzb2x2ZWQgYXQgYSBsYXRlciBwb2ludCBieSBjYWxsaW5nIGBfcmVzb2x2ZUluamVjdG9yRGVmVHlwZXNgLgogKiBAcGFyYW0gez99IGRlZlR5cGUKICogQHBhcmFtIHs/PX0gcGFyZW50CiAqIEBwYXJhbSB7Pz19IGFkZGl0aW9uYWxQcm92aWRlcnMKICogQHBhcmFtIHs/PX0gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3JXaXRob3V0SW5qZWN0b3JJbnN0YW5jZXMoZGVmVHlwZSwgcGFyZW50ID0gbnVsbCwgYWRkaXRpb25hbFByb3ZpZGVycyA9IG51bGwsIG5hbWUpIHsKICAgIHJldHVybiBuZXcgUjNJbmplY3RvcihkZWZUeXBlLCBhZGRpdGlvbmFsUHJvdmlkZXJzLCBwYXJlbnQgfHwgZ2V0TnVsbEluamVjdG9yKCksIG5hbWUpOwp9CmNsYXNzIFIzSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbmFsUHJvdmlkZXJzCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/PX0gc291cmNlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRlZiwgYWRkaXRpb25hbFByb3ZpZGVycywgcGFyZW50LCBzb3VyY2UgPSBudWxsKSB7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgLyoqCiAgICAgICAgICogTWFwIG9mIHRva2VucyB0byByZWNvcmRzIHdoaWNoIGNvbnRhaW4gdGhlIGluc3RhbmNlcyBvZiB0aG9zZSB0b2tlbnMuCiAgICAgICAgICogLSBgbnVsbGAgdmFsdWUgaW1wbGllcyB0aGF0IHdlIGRvbid0IGhhdmUgdGhlIHJlY29yZC4gVXNlZCBieSB0cmVlLXNoYWthYmxlIGluamVjdG9ycwogICAgICAgICAqIHRvIHByZXZlbnQgZnVydGhlciBzZWFyY2hlcy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLnJlY29yZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRyYW5zaXRpdmUgc2V0IG9mIGBJbmplY3RvclR5cGVgcyB3aGljaCBkZWZpbmUgdGhpcyBpbmplY3Rvci4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmluamVjdG9yRGVmVHlwZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IG9mIHZhbHVlcyBpbnN0YW50aWF0ZWQgYnkgdGhpcyBpbmplY3RvciB3aGljaCBjb250YWluIGBuZ09uRGVzdHJveWAgbGlmZWN5Y2xlIGhvb2tzLgogICAgICAgICAqLwogICAgICAgIHRoaXMub25EZXN0cm95ID0gbmV3IFNldCgpOwogICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWR1cFN0YWNrID0gW107CiAgICAgICAgLy8gU3RhcnQgb2ZmIGJ5IGNyZWF0aW5nIFJlY29yZHMgZm9yIGV2ZXJ5IHByb3ZpZGVyIGRlY2xhcmVkIGluIGV2ZXJ5IEluamVjdG9yVHlwZQogICAgICAgIC8vIGluY2x1ZGVkIHRyYW5zaXRpdmVseSBpbiBhZGRpdGlvbmFsIHByb3ZpZGVycyB0aGVuIGRvIHRoZSBzYW1lIGZvciBgZGVmYC4gVGhpcyBvcmRlciBpcwogICAgICAgIC8vIGltcG9ydGFudCBiZWNhdXNlIGBkZWZgIG1heSBpbmNsdWRlIHByb3ZpZGVycyB0aGF0IG92ZXJyaWRlIG9uZXMgaW4gYWRkaXRpb25hbFByb3ZpZGVycy4KICAgICAgICBhZGRpdGlvbmFsUHJvdmlkZXJzICYmCiAgICAgICAgICAgIGRlZXBGb3JFYWNoKGFkZGl0aW9uYWxQcm92aWRlcnMsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvdmlkZXIgPT4gdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIGRlZiwgYWRkaXRpb25hbFByb3ZpZGVycykpKTsKICAgICAgICBkZWVwRm9yRWFjaChbZGVmXSwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JEZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluamVjdG9yRGVmID0+IHRoaXMucHJvY2Vzc0luamVjdG9yVHlwZShpbmplY3RvckRlZiwgW10sIGRlZHVwU3RhY2spKSk7CiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBJTkpFQ1RPUiB0b2tlbiBwcm92aWRlcyB0aGlzIGluamVjdG9yLgogICAgICAgIHRoaXMucmVjb3Jkcy5zZXQoSU5KRUNUT1IsIG1ha2VSZWNvcmQodW5kZWZpbmVkLCB0aGlzKSk7CiAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhpcyBpbmplY3RvciBoYXMgdGhlIEFQUF9ST09UX1NDT1BFIHRva2VuIGFuZCB0aHVzIHNob3VsZCBwcm92aWRlCiAgICAgICAgLy8gYW55IGluamVjdGFibGUgc2NvcGVkIHRvIEFQUF9ST09UX1NDT1BFLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KElOSkVDVE9SX1NDT1BFKTsKICAgICAgICB0aGlzLnNjb3BlID0gcmVjb3JkICE9IG51bGwgPyByZWNvcmQudmFsdWUgOiBudWxsOwogICAgICAgIC8vIFNvdXJjZSBuYW1lLCB1c2VkIGZvciBkZWJ1Z2dpbmcKICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZSB8fCAodHlwZW9mIGRlZiA9PT0gJ29iamVjdCcgPyBudWxsIDogc3RyaW5naWZ5KGRlZikpOwogICAgfQogICAgLyoqCiAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGluamVjdG9yIHdhcyBwcmV2aW91c2x5IGRlc3Ryb3llZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkZXN0cm95ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Rlc3Ryb3llZDsKICAgIH0KICAgIC8qKgogICAgICogRGVzdHJveSB0aGUgaW5qZWN0b3IgYW5kIHJlbGVhc2UgcmVmZXJlbmNlcyB0byBldmVyeSBpbnN0YW5jZSBvciBwcm92aWRlciBhc3NvY2lhdGVkIHdpdGggaXQuCiAgICAgKgogICAgICogQWxzbyBjYWxscyB0aGUgYE9uRGVzdHJveWAgbGlmZWN5Y2xlIGhvb2tzIG9mIGV2ZXJ5IGluc3RhbmNlIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHdoaWNoIGEKICAgICAqIGhvb2sgd2FzIGZvdW5kLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpOwogICAgICAgIC8vIFNldCBkZXN0cm95ZWQgPSB0cnVlIGZpcnN0LCBpbiBjYXNlIGxpZmVjeWNsZSBob29rcyByZS1lbnRlciBkZXN0cm95KCkuCiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDYWxsIGFsbCB0aGUgbGlmZWN5Y2xlIGhvb2tzLgogICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZXJ2aWNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXJ2aWNlID0+IHNlcnZpY2UubmdPbkRlc3Ryb3koKSkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgLy8gUmVsZWFzZSBhbGwgcmVmZXJlbmNlcy4KICAgICAgICAgICAgdGhpcy5yZWNvcmRzLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMub25EZXN0cm95LmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5jbGVhcigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBUSFJPV19JRl9OT1RfRk9VTkQsIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7CiAgICAgICAgLy8gU2V0IHRoZSBpbmplY3Rpb24gY29udGV4dC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmplY3RvciA9IHNldEN1cnJlbnRJbmplY3Rvcih0aGlzKTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFNraXBTZWxmIGZsYWcuCiAgICAgICAgICAgIGlmICghKGZsYWdzICYgSW5qZWN0RmxhZ3MuU2tpcFNlbGYpKSB7CiAgICAgICAgICAgICAgICAvLyBTa2lwU2VsZiBpc24ndCBzZXQsIGNoZWNrIGlmIHRoZSByZWNvcmQgYmVsb25ncyB0byB0aGlzIGluamVjdG9yLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodG9rZW4pOwogICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkLCBidXQgbWF5YmUgdGhlIHRva2VuIGlzIHNjb3BlZCB0byB0aGlzIGluamVjdG9yLiBMb29rIGZvciBhbiBpbmplY3RhYmxlCiAgICAgICAgICAgICAgICAgICAgLy8gZGVmIHdpdGggYSBzY29wZSBtYXRjaGluZyB0aGlzIGluamVjdG9yLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSBjb3VsZEJlSW5qZWN0YWJsZVR5cGUodG9rZW4pICYmIGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgICAgICAgICAgICAgICAgIGlmIChkZWYgJiYgdGhpcy5pbmplY3RhYmxlRGVmSW5TY29wZShkZWYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGFuIGluamVjdGFibGUgZGVmIGFuZCBpdCdzIHNjb3BlZCB0byB0aGlzIGluamVjdG9yLiBQcmV0ZW5kIGFzIGlmIGl0IHdhcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBhbG9uZy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkID0gbWFrZVJlY29yZChpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodG9rZW4pLCBOT1RfWUVUKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQodG9rZW4sIHJlY29yZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiBhIHJlY29yZCB3YXMgZm91bmQsIGdldCB0aGUgaW5zdGFuY2UgZm9yIGl0IGFuZCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgLyogTk9UIG51bGwgfHwgdW5kZWZpbmVkICovKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh0b2tlbiwgcmVjb3JkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTZWxlY3QgdGhlIG5leHQgaW5qZWN0b3IgYmFzZWQgb24gdGhlIFNlbGYgZmxhZyAtIGlmIHNlbGYgaXMgc2V0LCB0aGUgbmV4dCBpbmplY3RvciBpcwogICAgICAgICAgICAvLyB0aGUgTnVsbEluamVjdG9yLCBvdGhlcndpc2UgaXQncyB0aGUgcGFyZW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRJbmplY3RvciA9ICEoZmxhZ3MgJiBJbmplY3RGbGFncy5TZWxmKSA/IHRoaXMucGFyZW50IDogZ2V0TnVsbEluamVjdG9yKCk7CiAgICAgICAgICAgIC8vIFNldCB0aGUgbm90Rm91bmRWYWx1ZSBiYXNlZCBvbiB0aGUgT3B0aW9uYWwgZmxhZyAtIGlmIG9wdGlvbmFsIGlzIHNldCBhbmQgbm90Rm91bmRWYWx1ZQogICAgICAgICAgICAvLyBpcyB1bmRlZmluZWQsIHRoZSB2YWx1ZSBpcyBudWxsLCBvdGhlcndpc2UgaXQncyB0aGUgbm90Rm91bmRWYWx1ZS4KICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9IChmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSAmJiBub3RGb3VuZFZhbHVlID09PSBUSFJPV19JRl9OT1RfRk9VTkQgPwogICAgICAgICAgICAgICAgbnVsbCA6CiAgICAgICAgICAgICAgICBub3RGb3VuZFZhbHVlOwogICAgICAgICAgICByZXR1cm4gbmV4dEluamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdOdWxsSW5qZWN0b3JFcnJvcicpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gfHwgW107CiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoc3RyaW5naWZ5KHRva2VuKSk7CiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNJbmplY3RvcikgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYSBwYXJlbnQgaW5qZWN0b3IsIGtlZXAgdGhyb3dpbmcKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0ICYgdGhyb3cgdGhlIGZpbmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB3ZSBkb24ndCBoYXZlIGFueSBwcmV2aW91cyBpbmplY3RvcgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXRjaEluamVjdG9yRXJyb3IoZSwgdG9rZW4sICdSM0luamVjdG9yRXJyb3InLCB0aGlzLnNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAvLyBMYXN0bHksIGNsZWFuIHVwIHRoZSBzdGF0ZSBieSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGluamVjdG9yLgogICAgICAgICAgICBzZXRDdXJyZW50SW5qZWN0b3IocHJldmlvdXNJbmplY3Rvcik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzb2x2ZUluamVjdG9yRGVmVHlwZXMoKSB7CiAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmVHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVmVHlwZSA9PiB0aGlzLmdldChkZWZUeXBlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b1N0cmluZygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9rZW5zID0gKC8qKiBAdHlwZSB7P30gKi8gKFtdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlY29yZHMgPSB0aGlzLnJlY29yZHM7CiAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodiwgdG9rZW4pID0+IHRva2Vucy5wdXNoKHN0cmluZ2lmeSh0b2tlbikpKSk7CiAgICAgICAgcmV0dXJuIGBSM0luamVjdG9yWyR7dG9rZW5zLmpvaW4oJywgJyl9XWA7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhc3NlcnROb3REZXN0cm95ZWQoKSB7CiAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luamVjdG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLicpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGBJbmplY3RvclR5cGVgIG9yIGBJbmplY3RvclR5cGVXaXRoUHJvdmlkZXJzYCBhbmQgYWxsIG9mIGl0cyB0cmFuc2l0aXZlIHByb3ZpZGVycwogICAgICogdG8gdGhpcyBpbmplY3Rvci4KICAgICAqCiAgICAgKiBJZiBhbiBgSW5qZWN0b3JUeXBlV2l0aFByb3ZpZGVyc2AgdGhhdCBkZWNsYXJlcyBwcm92aWRlcnMgYmVzaWRlcyB0aGUgdHlwZSBpcyBzcGVjaWZpZWQsCiAgICAgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gInRydWUiIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb3ZpZGVycyBvZiB0aGUgdHlwZSBkZWZpbml0aW9uIG5lZWQKICAgICAqIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBhbGxvd3MgdXMgdG8gcHJvY2VzcyBwcm92aWRlcnMgb2YgaW5qZWN0b3IgdHlwZXMgYWZ0ZXIgYWxsIGltcG9ydHMgb2YKICAgICAqIGFuIGluamVjdG9yIGRlZmluaXRpb24gYXJlIHByb2Nlc3NlZC4gKGZvbGxvd2luZyBWaWV3IEVuZ2luZSBzZW1hbnRpY3M6IHNlZSBGVy0xMzQ5KQogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGVmT3JXcmFwcGVkRGVmCiAgICAgKiBAcGFyYW0gez99IHBhcmVudHMKICAgICAqIEBwYXJhbSB7P30gZGVkdXBTdGFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHJvY2Vzc0luamVjdG9yVHlwZShkZWZPcldyYXBwZWREZWYsIHBhcmVudHMsIGRlZHVwU3RhY2spIHsKICAgICAgICBkZWZPcldyYXBwZWREZWYgPSByZXNvbHZlRm9yd2FyZFJlZihkZWZPcldyYXBwZWREZWYpOwogICAgICAgIGlmICghZGVmT3JXcmFwcGVkRGVmKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy8gRWl0aGVyIHRoZSBkZWZPcldyYXBwZWREZWYgaXMgYW4gSW5qZWN0b3JUeXBlICh3aXRoIGluamVjdG9yIGRlZikgb3IgYW4KICAgICAgICAvLyBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzIChha2EgTW9kdWxlV2l0aFByb3ZpZGVycykuIERldGVjdGluZyBlaXRoZXIgaXMgYSBtZWdhbW9ycGhpYwogICAgICAgIC8vIHJlYWQsIHNvIGNhcmUgaXMgdGFrZW4gdG8gb25seSBkbyB0aGUgcmVhZCBvbmNlLgogICAgICAgIC8vIEZpcnN0IGF0dGVtcHQgdG8gcmVhZCB0aGUgaW5qZWN0b3IgZGVmIChgybVpbmpgKS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlZiA9IGdldEluamVjdG9yRGVmKGRlZk9yV3JhcHBlZERlZik7CiAgICAgICAgLy8gSWYgdGhhdCdzIG5vdCBwcmVzZW50LCB0aGVuIGF0dGVtcHQgdG8gcmVhZCBuZ01vZHVsZSBmcm9tIHRoZSBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ01vZHVsZSA9IChkZWYgPT0gbnVsbCkgJiYgKCgvKiogQHR5cGUgez99ICovIChkZWZPcldyYXBwZWREZWYpKSkubmdNb2R1bGUgfHwgdW5kZWZpbmVkOwogICAgICAgIC8vIERldGVybWluZSB0aGUgSW5qZWN0b3JUeXBlLiBJbiB0aGUgY2FzZSB3aGVyZSBgZGVmT3JXcmFwcGVkRGVmYCBpcyBhbiBgSW5qZWN0b3JUeXBlYCwKICAgICAgICAvLyB0aGVuIHRoaXMgaXMgZWFzeS4gSW4gdGhlIGNhc2Ugb2YgYW4gSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycywgdGhlbiB0aGUgZGVmaW5pdGlvbiB0eXBlCiAgICAgICAgLy8gaXMgdGhlIGBuZ01vZHVsZWAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZlR5cGUgPSAobmdNb2R1bGUgPT09IHVuZGVmaW5lZCkgPyAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZk9yV3JhcHBlZERlZikpKSA6IG5nTW9kdWxlOwogICAgICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmNpZXMuCiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiBwYXJlbnRzLmluZGV4T2YoZGVmVHlwZSkgIT09IC0xKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmTmFtZSA9IHN0cmluZ2lmeShkZWZUeXBlKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaXJjdWxhciBkZXBlbmRlbmN5IGluIERJIGRldGVjdGVkIGZvciB0eXBlICR7ZGVmTmFtZX0uIERlcGVuZGVuY3kgcGF0aDogJHtwYXJlbnRzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmVHlwZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGVmVHlwZSA9PiBzdHJpbmdpZnkoZGVmVHlwZSkpKS5qb2luKCcgPiAnKX0gPiAke2RlZk5hbWV9LmApOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBmb3IgbXVsdGlwbGUgaW1wb3J0cyBvZiB0aGUgc2FtZSBtb2R1bGUKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBkZWR1cFN0YWNrLmluZGV4T2YoZGVmVHlwZSkgIT09IC0xOwogICAgICAgIC8vIEZpbmFsbHksIGlmIGRlZk9yV3JhcHBlZFR5cGUgd2FzIGFuIGBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzYCwgdGhlbiB0aGUgYWN0dWFsCiAgICAgICAgLy8gYEluamVjdG9yRGVmYCBpcyBvbiBpdHMgYG5nTW9kdWxlYC4KICAgICAgICBpZiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBkZWYgPSBnZXRJbmplY3RvckRlZihuZ01vZHVsZSk7CiAgICAgICAgfQogICAgICAgIC8vIElmIG5vIGRlZmluaXRpb24gd2FzIGZvdW5kLCBpdCBtaWdodCBiZSBmcm9tIGV4cG9ydHMuIFJlbW92ZSBpdC4KICAgICAgICBpZiAoZGVmID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGluIHRoZSBzYW1lIHdheSB0aGF0IEBOZ01vZHVsZSByZXNvbHV0aW9uIGRpZDoKICAgICAgICAvLyBGaXJzdCwgaW5jbHVkZSBwcm92aWRlcnMgZnJvbSBhbnkgaW1wb3J0cy4KICAgICAgICBpZiAoZGVmLmltcG9ydHMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgLy8gQmVmb3JlIHByb2Nlc3NpbmcgZGVmVHlwZSdzIGltcG9ydHMsIGFkZCBpdCB0byB0aGUgc2V0IG9mIHBhcmVudHMuIFRoaXMgd2F5LCBpZiBpdCBlbmRzCiAgICAgICAgICAgIC8vIHVwIGRlZXBseSBpbXBvcnRpbmcgaXRzZWxmLCB0aGlzIGNhbiBiZSBkZXRlY3RlZC4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIHBhcmVudHMucHVzaChkZWZUeXBlKTsKICAgICAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSBzZXQgb2YgZGVkdXBzLiBUaGlzIHdheSB3ZSBjYW4gZGV0ZWN0IG11bHRpcGxlIGltcG9ydHMgb2YgdGhlIHNhbWUgbW9kdWxlCiAgICAgICAgICAgIGRlZHVwU3RhY2sucHVzaChkZWZUeXBlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZGVlcEZvckVhY2goZGVmLmltcG9ydHMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGltcG9ydGVkID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9jZXNzSW5qZWN0b3JUeXBlKGltcG9ydGVkLCBwYXJlbnRzLCBkZWR1cFN0YWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlc1dpdGhQcm92aWRlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByb2Nlc3NlZCBpbXBvcnQgaXMgYW4gaW5qZWN0b3IgdHlwZSB3aXRoIHByb3ZpZGVycywgd2Ugc3RvcmUgaXQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgaW1wb3J0IHR5cGVzIHdpdGggcHJvdmlkZXJzLCBzbyB0aGF0IHdlIGNhbiBwcm9jZXNzIHRob3NlIGFmdGVyd2FyZHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFR5cGVzV2l0aFByb3ZpZGVycy5wdXNoKGltcG9ydGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgcGFyZW50cyBzZXQgd2hlbiBmaW5pc2hlZC4KICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBwYXJlbnRzLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEltcG9ydHMgd2hpY2ggYXJlIGRlY2xhcmVkIHdpdGggcHJvdmlkZXJzIChUeXBlV2l0aFByb3ZpZGVycykgbmVlZCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgICAgLy8gYWZ0ZXIgYWxsIGltcG9ydGVkIG1vZHVsZXMgYXJlIHByb2Nlc3NlZC4gVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBWaWV3IEVuZ2luZQogICAgICAgICAgICAvLyBwcm9jZXNzZXMvbWVyZ2VzIG1vZHVsZSBpbXBvcnRzIGluIHRoZSBtZXRhZGF0YSByZXNvbHZlci4gU2VlOiBGVy0xMzQ5LgogICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBuZ01vZHVsZSwgcHJvdmlkZXJzIH0gPSBpbXBvcnRUeXBlc1dpdGhQcm92aWRlcnNbaV07CiAgICAgICAgICAgICAgICAgICAgZGVlcEZvckVhY2goKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVycykpLCAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPT4gdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIG5nTW9kdWxlLCBwcm92aWRlcnMgfHwgRU1QVFlfQVJSQVkkMikpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUcmFjayB0aGUgSW5qZWN0b3JUeXBlIGFuZCBhZGQgYSBwcm92aWRlciBmb3IgaXQuIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyBpcyBkb25lIGFmdGVyIHRoZQogICAgICAgIC8vIGRlZidzIGltcG9ydHMuCiAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmFkZChkZWZUeXBlKTsKICAgICAgICB0aGlzLnJlY29yZHMuc2V0KGRlZlR5cGUsIG1ha2VSZWNvcmQoZGVmLmZhY3RvcnksIE5PVF9ZRVQpKTsKICAgICAgICAvLyBOZXh0LCBpbmNsdWRlIHByb3ZpZGVycyBsaXN0ZWQgb24gdGhlIGRlZmluaXRpb24gaXRzZWxmLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWZQcm92aWRlcnMgPSBkZWYucHJvdmlkZXJzOwogICAgICAgIGlmIChkZWZQcm92aWRlcnMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmplY3RvclR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmT3JXcmFwcGVkRGVmKSk7CiAgICAgICAgICAgIGRlZXBGb3JFYWNoKGRlZlByb3ZpZGVycywgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm92aWRlciA9PiB0aGlzLnByb2Nlc3NQcm92aWRlcihwcm92aWRlciwgaW5qZWN0b3JUeXBlLCBkZWZQcm92aWRlcnMpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCAmJgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZk9yV3JhcHBlZERlZikpKS5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7CiAgICB9CiAgICAvKioKICAgICAqIFByb2Nlc3MgYSBgU2luZ2xlUHJvdmlkZXJgIGFuZCBhZGQgaXQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZVR5cGUKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b2tlbiBmcm9tIHRoZSBwcm92aWRlci4gRWl0aGVyIGl0J3MgaXRzIG93biB0b2tlbiwgb3IgaGFzIGEge3Byb3ZpZGU6IC4uLn0KICAgICAgICAvLyBwcm9wZXJ0eS4KICAgICAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRva2VuID0gaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpID8gcHJvdmlkZXIgOiByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlciAmJiBwcm92aWRlci5wcm92aWRlKTsKICAgICAgICAvLyBDb25zdHJ1Y3QgYSBgUmVjb3JkYCBmb3IgdGhlIHByb3ZpZGVyLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNvcmQgPSBwcm92aWRlclRvUmVjb3JkKHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycyk7CiAgICAgICAgaWYgKCFpc1R5cGVQcm92aWRlcihwcm92aWRlcikgJiYgcHJvdmlkZXIubXVsdGkgPT09IHRydWUpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIHByb3ZpZGVyIGluZGljYXRlcyB0aGF0IGl0J3MgYSBtdWx0aS1wcm92aWRlciwgcHJvY2VzcyBpdCBzcGVjaWFsbHkuCiAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHdoZXRoZXIgaXQncyBiZWVuIGRlZmluZWQgYWxyZWFkeS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbXVsdGlSZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkKSB7CiAgICAgICAgICAgICAgICAvLyBJdCBoYXMuIFRocm93IGEgbmljZSBlcnJvciBpZgogICAgICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkLm11bHRpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtdWx0aVJlY29yZCA9IG1ha2VSZWNvcmQodW5kZWZpbmVkLCBOT1RfWUVULCB0cnVlKTsKICAgICAgICAgICAgICAgIG11bHRpUmVjb3JkLmZhY3RvcnkgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBpbmplY3RBcmdzKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobXVsdGlSZWNvcmQpKS5tdWx0aSkpKSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMuc2V0KHRva2VuLCBtdWx0aVJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9rZW4gPSBwcm92aWRlcjsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG11bHRpUmVjb3JkLm11bHRpKSkucHVzaChwcm92aWRlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5yZWNvcmRzLmdldCh0b2tlbik7CiAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5tdWx0aSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aHJvd01peGVkTXVsdGlQcm92aWRlckVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5yZWNvcmRzLnNldCh0b2tlbiwgcmVjb3JkKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaHlkcmF0ZSh0b2tlbiwgcmVjb3JkKSB7CiAgICAgICAgaWYgKHJlY29yZC52YWx1ZSA9PT0gQ0lSQ1VMQVIpIHsKICAgICAgICAgICAgdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3Ioc3RyaW5naWZ5KHRva2VuKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJlY29yZC52YWx1ZSA9PT0gTk9UX1lFVCkgewogICAgICAgICAgICByZWNvcmQudmFsdWUgPSBDSVJDVUxBUjsKICAgICAgICAgICAgcmVjb3JkLnZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlY29yZC5mYWN0b3J5KSkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQudmFsdWUgPT09ICdvYmplY3QnICYmIHJlY29yZC52YWx1ZSAmJiBoYXNPbkRlc3Ryb3kocmVjb3JkLnZhbHVlKSkgewogICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5hZGQocmVjb3JkLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZWNvcmQudmFsdWUpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbmplY3RhYmxlRGVmSW5TY29wZShkZWYpIHsKICAgICAgICBpZiAoIWRlZi5wcm92aWRlZEluKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZi5wcm92aWRlZEluID09PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gZGVmLnByb3ZpZGVkSW4gPT09ICdhbnknIHx8IChkZWYucHJvdmlkZWRJbiA9PT0gdGhpcy5zY29wZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RvckRlZlR5cGVzLmhhcyhkZWYucHJvdmlkZWRJbik7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodG9rZW4pIHsKICAgIC8vIE1vc3QgdG9rZW5zIHdpbGwgaGF2ZSBhbiBpbmplY3RhYmxlIGRlZiBkaXJlY3RseSBvbiB0aGVtLCB3aGljaCBzcGVjaWZpZXMgYSBmYWN0b3J5IGRpcmVjdGx5LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5qZWN0YWJsZURlZiA9IGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZmFjdG9yeSA9IGluamVjdGFibGVEZWYgIT09IG51bGwgPyBpbmplY3RhYmxlRGVmLmZhY3RvcnkgOiBnZXRGYWN0b3J5RGVmKHRva2VuKTsKICAgIGlmIChmYWN0b3J5ICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICB9CiAgICAvLyBJZiB0aGUgdG9rZW4gaXMgYW4gTmdNb2R1bGUsIGl0J3MgYWxzbyBpbmplY3RhYmxlIGJ1dCB0aGUgZmFjdG9yeSBpcyBvbiBpdHMgaW5qZWN0b3IgZGVmCiAgICAvLyAoYMm1aW5qYCkKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluamVjdG9yRGVmID0gZ2V0SW5qZWN0b3JEZWYodG9rZW4pOwogICAgaWYgKGluamVjdG9yRGVmICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGluamVjdG9yRGVmLmZhY3Rvcnk7CiAgICB9CiAgICAvLyBJbmplY3Rpb25Ub2tlbnMgc2hvdWxkIGhhdmUgYW4gaW5qZWN0YWJsZSBkZWYgKMm1cHJvdikgYW5kIHRodXMgc2hvdWxkIGJlIGhhbmRsZWQgYWJvdmUuCiAgICAvLyBJZiBpdCdzIG1pc3NpbmcgdGhhdCwgaXQncyBhbiBlcnJvci4KICAgIGlmICh0b2tlbiBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiAke3N0cmluZ2lmeSh0b2tlbil9IGlzIG1pc3NpbmcgYSDJtXByb3YgZGVmaW5pdGlvbi5gKTsKICAgIH0KICAgIC8vIFVuZGVjb3JhdGVkIHR5cGVzIGNhbiBzb21ldGltZXMgYmUgY3JlYXRlZCBpZiB0aGV5IGhhdmUgbm8gY29uc3RydWN0b3IgYXJndW1lbnRzLgogICAgaWYgKHRva2VuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgICByZXR1cm4gZ2V0VW5kZWNvcmF0ZWRJbmplY3RhYmxlRmFjdG9yeSh0b2tlbik7CiAgICB9CiAgICAvLyBUaGVyZSB3YXMgbm8gd2F5IHRvIHJlc29sdmUgYSBmYWN0b3J5IGZvciB0aGlzIHRva2VuLgogICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZScpOwp9Ci8qKgogKiBAcGFyYW0gez99IHRva2VuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRVbmRlY29yYXRlZEluamVjdGFibGVGYWN0b3J5KHRva2VuKSB7CiAgICAvLyBJZiB0aGUgdG9rZW4gaGFzIHBhcmFtZXRlcnMgdGhlbiBpdCBoYXMgZGVwZW5kZW5jaWVzIHRoYXQgd2UgY2Fubm90IHJlc29sdmUgaW1wbGljaXRseS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhcmFtTGVuZ3RoID0gdG9rZW4ubGVuZ3RoOwogICAgaWYgKHBhcmFtTGVuZ3RoID4gMCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhcmdzID0gbmV3QXJyYXkocGFyYW1MZW5ndGgsICc/Jyk7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciAke3N0cmluZ2lmeSh0b2tlbil9OiAoJHthcmdzLmpvaW4oJywgJyl9KS5gKTsKICAgIH0KICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBhcHBlYXJzIHRvIGhhdmUgbm8gcGFyYW1ldGVycy4KICAgIC8vIFRoaXMgbWlnaHQgYmUgYmVjYXVzZSBpdCBpbmhlcml0cyBmcm9tIGEgc3VwZXItY2xhc3MuIEluIHdoaWNoIGNhc2UsIHVzZSBhbiBpbmplY3RhYmxlCiAgICAvLyBkZWYgZnJvbSBhbiBhbmNlc3RvciBpZiB0aGVyZSBpcyBvbmUuCiAgICAvLyBPdGhlcndpc2UgdGhpcyByZWFsbHkgaXMgYSBzaW1wbGUgY2xhc3Mgd2l0aCBubyBkZXBlbmRlbmNpZXMsIHNvIHJldHVybiBhIGZhY3RvcnkgdGhhdAogICAgLy8ganVzdCBpbnN0YW50aWF0ZXMgdGhlIHplcm8tYXJnIGNvbnN0cnVjdG9yLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5oZXJpdGVkSW5qZWN0YWJsZURlZiA9IGdldEluaGVyaXRlZEluamVjdGFibGVEZWYodG9rZW4pOwogICAgaWYgKGluaGVyaXRlZEluamVjdGFibGVEZWYgIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gaW5oZXJpdGVkSW5qZWN0YWJsZURlZi5mYWN0b3J5KCgvKiogQHR5cGUgez99ICovICh0b2tlbikpKSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSkoKSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICogQHBhcmFtIHs/fSBuZ01vZHVsZVR5cGUKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVyVG9SZWNvcmQocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7CiAgICBpZiAoaXNWYWx1ZVByb3ZpZGVyKHByb3ZpZGVyKSkgewogICAgICAgIHJldHVybiBtYWtlUmVjb3JkKHVuZGVmaW5lZCwgcHJvdmlkZXIudXNlVmFsdWUpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpOwogICAgICAgIHJldHVybiBtYWtlUmVjb3JkKGZhY3RvcnksIE5PVF9ZRVQpOwogICAgfQp9Ci8qKgogKiBDb252ZXJ0cyBhIGBTaW5nbGVQcm92aWRlcmAgaW50byBhIGZhY3RvcnkgZnVuY3Rpb24uCiAqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXIgcHJvdmlkZXIgdG8gY29udmVydCB0byBmYWN0b3J5CiAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlVHlwZQogKiBAcGFyYW0gez89fSBwcm92aWRlcnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVyVG9GYWN0b3J5KHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZhY3RvcnkgPSB1bmRlZmluZWQ7CiAgICBpZiAoaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVud3JhcHBlZFByb3ZpZGVyID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIpOwogICAgICAgIHJldHVybiBnZXRGYWN0b3J5RGVmKHVud3JhcHBlZFByb3ZpZGVyKSB8fCBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodW53cmFwcGVkUHJvdmlkZXIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGlzVmFsdWVQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZVZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzRmFjdG9yeVByb3ZpZGVyKHByb3ZpZGVyKSkgewogICAgICAgICAgICBmYWN0b3J5ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcHJvdmlkZXIudXNlRmFjdG9yeSguLi5pbmplY3RBcmdzKHByb3ZpZGVyLmRlcHMgfHwgW10pKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzRXhpc3RpbmdQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IMm1ybVpbmplY3QocmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIudXNlRXhpc3RpbmcpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsYXNzUmVmID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIgJiYKICAgICAgICAgICAgICAgICgoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyKSkpLnVzZUNsYXNzIHx8IHByb3ZpZGVyLnByb3ZpZGUpKTsKICAgICAgICAgICAgaWYgKCFjbGFzc1JlZikgewogICAgICAgICAgICAgICAgdGhyb3dJbnZhbGlkUHJvdmlkZXJFcnJvcihuZ01vZHVsZVR5cGUsIHByb3ZpZGVycywgcHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYXNEZXBzKHByb3ZpZGVyKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IG5ldyAoY2xhc3NSZWYpKC4uLmluamVjdEFyZ3MocHJvdmlkZXIuZGVwcykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRGYWN0b3J5RGVmKGNsYXNzUmVmKSB8fCBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkoY2xhc3NSZWYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhY3Rvcnk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZmFjdG9yeQogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7Pz19IG11bHRpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYWtlUmVjb3JkKGZhY3RvcnksIHZhbHVlLCBtdWx0aSA9IGZhbHNlKSB7CiAgICByZXR1cm4gewogICAgICAgIGZhY3Rvcnk6IGZhY3RvcnksCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIG11bHRpOiBtdWx0aSA/IFtdIDogdW5kZWZpbmVkLAogICAgfTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNWYWx1ZVByb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIFVTRV9WQUxVRSBpbiB2YWx1ZTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNFeGlzdGluZ1Byb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gISEodmFsdWUgJiYgKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VFeGlzdGluZyk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzRmFjdG9yeVByb3ZpZGVyKHZhbHVlKSB7CiAgICByZXR1cm4gISEodmFsdWUgJiYgKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VGYWN0b3J5KTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNUeXBlUHJvdmlkZXIodmFsdWUpIHsKICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ2xhc3NQcm92aWRlcih2YWx1ZSkgewogICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS51c2VDbGFzczsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzRGVwcyh2YWx1ZSkgewogICAgcmV0dXJuICEhKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS5kZXBzOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBoYXNPbkRlc3Ryb3kodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmCiAgICAgICAgdHlwZW9mICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkubmdPbkRlc3Ryb3kgPT09ICdmdW5jdGlvbic7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvdWxkQmVJbmplY3RhYmxlVHlwZSh2YWx1ZSkgewogICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHx8CiAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbik7Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAqIEBwYXJhbSB7P30gcGFyZW50CiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gSU5KRUNUT1JfSU1QTF9fUE9TVF9SM19fKHByb3ZpZGVycywgcGFyZW50LCBuYW1lKSB7CiAgICByZXR1cm4gY3JlYXRlSW5qZWN0b3IoeyBuYW1lOiBuYW1lIH0sIHBhcmVudCwgcHJvdmlkZXJzLCBuYW1lKTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IElOSkVDVE9SX0lNUEwgPSBJTkpFQ1RPUl9JTVBMX19QT1NUX1IzX187Ci8qKgogKiBDb25jcmV0ZSBpbmplY3RvcnMgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBJbmplY3RvcnMgYXJlIGNvbmZpZ3VyZWQKICogd2l0aCBbcHJvdmlkZXJzXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikgdGhhdCBhc3NvY2lhdGUKICogZGVwZW5kZW5jaWVzIG9mIHZhcmlvdXMgdHlwZXMgd2l0aCBbaW5qZWN0aW9uIHRva2Vuc10oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pLgogKgogKiBAc2VlIFsiREkgUHJvdmlkZXJzIl0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24tcHJvdmlkZXJzKS4KICogQHNlZSBgU3RhdGljUHJvdmlkZXJgCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBzZXJ2aWNlIGluamVjdG9yIGluc3RhbmNlLgogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvcHJvdmlkZXJfc3BlYy50cyByZWdpb249J0NvbnN0cnVjdG9yUHJvdmlkZXInfQogKgogKiAjIyMgVXNhZ2UgZXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J0luamVjdG9yJ30KICoKICogYEluamVjdG9yYCByZXR1cm5zIGl0c2VsZiB3aGVuIGdpdmVuIGBJbmplY3RvcmAgYXMgYSB0b2tlbjoKICoKICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdpbmplY3RJbmplY3Rvcid9CiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShvcHRpb25zLCBwYXJlbnQpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgewogICAgICAgICAgICByZXR1cm4gSU5KRUNUT1JfSU1QTChvcHRpb25zLCBwYXJlbnQsICcnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBJTkpFQ1RPUl9JTVBMKG9wdGlvbnMucHJvdmlkZXJzLCBvcHRpb25zLnBhcmVudCwgb3B0aW9ucy5uYW1lIHx8ICcnKTsKICAgICAgICB9CiAgICB9Cn0KSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5EID0gVEhST1dfSUZfTk9UX0ZPVU5EOwpJbmplY3Rvci5OVUxMID0gbmV3IE51bGxJbmplY3RvcigpOwovKiogQG5vY29sbGFwc2UgKi8KSW5qZWN0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoewogICAgdG9rZW46IEluamVjdG9yLAogICAgcHJvdmlkZWRJbjogKC8qKiBAdHlwZSB7P30gKi8gKCdhbnknKSksCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiDJtcm1aW5qZWN0KElOSkVDVE9SKSksCn0pOwovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KSW5qZWN0b3IuX19OR19FTEVNRU5UX0lEX18gPSAtMTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3JlZmxlY3RpdmVfZXJyb3JzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGtleXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKHJlcy5pbmRleE9mKGtleXNbaV0pID4gLTEpIHsKICAgICAgICAgICAgcmVzLnB1c2goa2V5c1tpXSk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgICAgIHJlcy5wdXNoKGtleXNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlczsKfQovKioKICogQHBhcmFtIHs/fSBrZXlzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpIHsKICAgIGlmIChrZXlzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmV2ZXJzZWQgPSBmaW5kRmlyc3RDbG9zZWRDeWNsZShrZXlzLnNsaWNlKCkucmV2ZXJzZSgpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdG9rZW5TdHJzID0gcmV2ZXJzZWQubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGsKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGsgPT4gc3RyaW5naWZ5KGsudG9rZW4pKSk7CiAgICAgICAgcmV0dXJuICcgKCcgKyB0b2tlblN0cnMuam9pbignIC0+ICcpICsgJyknOwogICAgfQogICAgcmV0dXJuICcnOwp9Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZQogKiBAcGFyYW0gez89fSBvcmlnaW5hbEVycm9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlLCBvcmlnaW5hbEVycm9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBrZXlzID0gW2tleV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJNc2cgPSBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlKGtleXMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKG9yaWdpbmFsRXJyb3IgPyB3cmFwcGVkRXJyb3IoZXJyTXNnLCBvcmlnaW5hbEVycm9yKSA6IEVycm9yKGVyck1zZykpKSk7CiAgICBlcnJvci5hZGRLZXkgPSBhZGRLZXk7CiAgICBlcnJvci5rZXlzID0ga2V5czsKICAgIGVycm9yLmluamVjdG9ycyA9IFtpbmplY3Rvcl07CiAgICBlcnJvci5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlID0gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTsKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZXJyb3IpKSlbRVJST1JfT1JJR0lOQUxfRVJST1JdID0gb3JpZ2luYWxFcnJvcjsKICAgIHJldHVybiBlcnJvcjsKfQovKioKICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBrZXkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGFkZEtleShpbmplY3Rvciwga2V5KSB7CiAgICB0aGlzLmluamVjdG9ycy5wdXNoKGluamVjdG9yKTsKICAgIHRoaXMua2V5cy5wdXNoKGtleSk7CiAgICAvLyBOb3RlOiBUaGlzIHVwZGF0ZWQgbWVzc2FnZSB3b24ndCBiZSByZWZsZWN0ZWQgaW4gdGhlIGAuc3RhY2tgIHByb3BlcnR5CiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTsKfQovKioKICogVGhyb3duIHdoZW4gdHJ5aW5nIHRvIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBieSBrZXkgZnJvbSB7XEBsaW5rIEluamVjdG9yfSwgYnV0IHRoZQogKiB7XEBsaW5rIEluamVjdG9yfSBkb2VzIG5vdCBoYXZlIGEge1xAbGluayBQcm92aWRlcn0gZm9yIHRoZSBnaXZlbiBrZXkuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGNsYXNzIEEgewogKiAgIGNvbnN0cnVjdG9yKGI6Qikge30KICogfQogKgogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTsKICogYGBgCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBrZXkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vUHJvdmlkZXJFcnJvcihpbmplY3Rvciwga2V5KSB7CiAgICByZXR1cm4gaW5qZWN0aW9uRXJyb3IoaW5qZWN0b3IsIGtleSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBrZXlzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoa2V5cykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaXJzdCA9IHN0cmluZ2lmeShrZXlzWzBdLnRva2VuKTsKICAgICAgICByZXR1cm4gYE5vIHByb3ZpZGVyIGZvciAke2ZpcnN0fSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDsKICAgIH0pKTsKfQovKioKICogVGhyb3duIHdoZW4gZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAqICAge3Byb3ZpZGU6ICJvbmUiLCB1c2VGYWN0b3J5OiAodHdvKSA9PiAidHdvIiwgZGVwczogW1tuZXcgSW5qZWN0KCJ0d28iKV1dfSwKICogICB7cHJvdmlkZTogInR3byIsIHVzZUZhY3Rvcnk6IChvbmUpID0+ICJvbmUiLCBkZXBzOiBbW25ldyBJbmplY3QoIm9uZSIpXV19CiAqIF0pOwogKgogKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KCJvbmUiKSkudG9UaHJvd0Vycm9yKCk7CiAqIGBgYAogKgogKiBSZXRyaWV2aW5nIGBBYCBvciBgQmAgdGhyb3dzIGEgYEN5Y2xpY0RlcGVuZGVuY3lFcnJvcmAgYXMgdGhlIGdyYXBoIGFib3ZlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KICogQHBhcmFtIHs/fSBpbmplY3RvcgogKiBAcGFyYW0gez99IGtleQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3ljbGljRGVwZW5kZW5jeUVycm9yKGluamVjdG9yLCBrZXkpIHsKICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgcmV0dXJuIGBDYW5ub3QgaW5zdGFudGlhdGUgY3ljbGljIGRlcGVuZGVuY3khJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfWA7CiAgICB9KSk7Cn0KLyoqCiAqIFRocm93biB3aGVuIGEgY29uc3RydWN0aW5nIHR5cGUgcmV0dXJucyB3aXRoIGFuIEVycm9yLgogKgogKiBUaGUgYEluc3RhbnRpYXRpb25FcnJvcmAgY2xhc3MgY29udGFpbnMgdGhlIG9yaWdpbmFsIGVycm9yIHBsdXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggd2hpY2ggY2F1c2VkCiAqIHRoaXMgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogY2xhc3MgQSB7CiAqICAgY29uc3RydWN0b3IoKSB7CiAqICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UnKTsKICogICB9CiAqIH0KICoKICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pOwogKiB0cnkgewogKiAgIGluamVjdG9yLmdldChBKTsKICogfSBjYXRjaCAoZSkgewogKiAgIGV4cGVjdChlIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvbkVycm9yKS50b0JlKHRydWUpOwogKiAgIGV4cGVjdChlLm9yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2UpLnRvRXF1YWwoIm1lc3NhZ2UiKTsKICogICBleHBlY3QoZS5vcmlnaW5hbFN0YWNrKS50b0JlRGVmaW5lZCgpOwogKiB9CiAqIGBgYAogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gb3JpZ2luYWxFeGNlcHRpb24KICogQHBhcmFtIHs/fSBvcmlnaW5hbFN0YWNrCiAqIEBwYXJhbSB7P30ga2V5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnN0YW50aWF0aW9uRXJyb3IoaW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXkpIHsKICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpcnN0ID0gc3RyaW5naWZ5KGtleXNbMF0udG9rZW4pOwogICAgICAgIHJldHVybiBgJHtvcmlnaW5hbEV4Y2VwdGlvbi5tZXNzYWdlfTogRXJyb3IgZHVyaW5nIGluc3RhbnRpYXRpb24gb2YgJHtmaXJzdH0hJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfS5gOwogICAgfSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKfQovKioKICogVGhyb3duIHdoZW4gYW4gb2JqZWN0IG90aGVyIHRoZW4ge1xAbGluayBQcm92aWRlcn0gKG9yIGBUeXBlYCkgaXMgcGFzc2VkIHRvIHtcQGxpbmsgSW5qZWN0b3J9CiAqIGNyZWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbIm5vdCBhIHR5cGUiXSkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW52YWxpZFByb3ZpZGVyRXJyb3IocHJvdmlkZXIpIHsKICAgIHJldHVybiBFcnJvcihgSW52YWxpZCBwcm92aWRlciAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6ICR7cHJvdmlkZXJ9YCk7Cn0KLyoqCiAqIFRocm93biB3aGVuIHRoZSBjbGFzcyBoYXMgbm8gYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4KICoKICogTGFjayBvZiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHByZXZlbnRzIHRoZSB7XEBsaW5rIEluamVjdG9yfSBmcm9tIGRldGVybWluaW5nIHdoaWNoIGRlcGVuZGVuY2llcwogKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBjbGFzcyBBIHsKICogICBjb25zdHJ1Y3RvcihiKSB7fQogKiB9CiAqCiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICoKICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge1xAbGluayBJbmplY3RhYmxlfSBoYXMgcGFyYW1ldGVyIHR5cGVzLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGNsYXNzIEIge30KICoKICogY2xhc3MgQSB7CiAqICAgY29uc3RydWN0b3IoYjpCKSB7fSAvLyBubyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIEEgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuCiAqIH0KICoKICogZXhwZWN0KCgpID0+IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0EsQl0pKS50b1Rocm93RXJyb3IoKTsKICogYGBgCiAqCiAqIEBwYXJhbSB7P30gdHlwZU9yRnVuYwogKiBAcGFyYW0gez99IHBhcmFtcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzaWduYXR1cmUgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHBhcmFtcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHBhcmFtc1tpXTsKICAgICAgICBpZiAoIXBhcmFtZXRlciB8fCBwYXJhbWV0ZXIubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgc2lnbmF0dXJlLnB1c2goJz8nKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNpZ25hdHVyZS5wdXNoKHBhcmFtZXRlci5tYXAoc3RyaW5naWZ5KS5qb2luKCcgJykpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBFcnJvcignQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwnJyArIHN0cmluZ2lmeSh0eXBlT3JGdW5jKSArICdcJygnICsKICAgICAgICBzaWduYXR1cmUuam9pbignLCAnKSArICcpLiAnICsKICAgICAgICAnTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBkZWNvcmF0ZWQgd2l0aCBJbmplY3Qgb3IgaGF2ZSB2YWxpZCB0eXBlIGFubm90YXRpb25zIGFuZCB0aGF0IFwnJyArCiAgICAgICAgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1wnIGlzIGRlY29yYXRlZCB3aXRoIEluamVjdGFibGUuJyk7Cn0KLyoqCiAqIFRocm93biB3aGVuIGdldHRpbmcgYW4gb2JqZWN0IGJ5IGluZGV4LgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBjbGFzcyBBIHt9CiAqCiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTsKICoKICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldEF0KDEwMCkpLnRvVGhyb3dFcnJvcigpOwogKiBgYGAKICoKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gb3V0T2ZCb3VuZHNFcnJvcihpbmRleCkgewogICAgcmV0dXJuIEVycm9yKGBJbmRleCAke2luZGV4fSBpcyBvdXQtb2YtYm91bmRzLmApOwp9Ci8vIFRPRE86IGFkZCBhIHdvcmtpbmcgZXhhbXBsZSBhZnRlciBhbHBoYTM4IGlzIHJlbGVhc2VkCi8qKgogKiBUaHJvd24gd2hlbiBhIG11bHRpIHByb3ZpZGVyIGFuZCBhIHJlZ3VsYXIgcHJvdmlkZXIgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIHRva2VuLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAqICAgeyBwcm92aWRlOiAiU3RyaW5ncyIsIHVzZVZhbHVlOiAic3RyaW5nMSIsIG11bHRpOiB0cnVlfSwKICogICB7IHByb3ZpZGU6ICJTdHJpbmdzIiwgdXNlVmFsdWU6ICJzdHJpbmcyIiwgbXVsdGk6IGZhbHNlfQogKiBdKSkudG9UaHJvd0Vycm9yKCk7CiAqIGBgYAogKiBAcGFyYW0gez99IHByb3ZpZGVyMQogKiBAcGFyYW0gez99IHByb3ZpZGVyMgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSB7CiAgICByZXR1cm4gRXJyb3IoYENhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiAke3Byb3ZpZGVyMX0gJHtwcm92aWRlcjJ9YCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3JlZmxlY3RpdmVfa2V5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIHVuaXF1ZSBvYmplY3QgdXNlZCBmb3IgcmV0cmlldmluZyBpdGVtcyBmcm9tIHRoZSB7XEBsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0uCiAqCiAqIEtleXMgaGF2ZToKICogLSBhIHN5c3RlbS13aWRlIHVuaXF1ZSBgaWRgLgogKiAtIGEgYHRva2VuYC4KICoKICogYEtleWAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtcQGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yfSBiZWNhdXNlIGl0cyBzeXN0ZW0td2lkZSB1bmlxdWUgYGlkYCBhbGxvd3MKICogdGhlCiAqIGluamVjdG9yIHRvIHN0b3JlIGNyZWF0ZWQgb2JqZWN0cyBpbiBhIG1vcmUgZWZmaWNpZW50IHdheS4KICoKICogYEtleWAgc2hvdWxkIG5vdCBiZSBjcmVhdGVkIGRpcmVjdGx5LiB7XEBsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0gY3JlYXRlcyBrZXlzIGF1dG9tYXRpY2FsbHkgd2hlbgogKiByZXNvbHZpbmcKICogcHJvdmlkZXJzLgogKgogKiBAZGVwcmVjYXRlZCBObyByZXBsYWNlbWVudAogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUmVmbGVjdGl2ZUtleSB7CiAgICAvKioKICAgICAqIFByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqLwogICAgY29uc3RydWN0b3IodG9rZW4sIGlkKSB7CiAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOwogICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICBpZiAoIXRva2VuKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gbXVzdCBiZSBkZWZpbmVkIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gc3RyaW5naWZ5KHRoaXMudG9rZW4pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYSBgS2V5YCBmb3IgYSB0b2tlbi4KICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBnZXQodG9rZW4pIHsKICAgICAgICByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5LmdldChyZXNvbHZlRm9yd2FyZFJlZih0b2tlbikpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fSB0aGUgbnVtYmVyIG9mIGtleXMgcmVnaXN0ZXJlZCBpbiB0aGUgc3lzdGVtLgogICAgICovCiAgICBzdGF0aWMgZ2V0IG51bWJlck9mS2V5cygpIHsKICAgICAgICByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5Lm51bWJlck9mS2V5czsKICAgIH0KfQpjbGFzcyBLZXlSZWdpc3RyeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9hbGxLZXlzID0gbmV3IE1hcCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4pIHsKICAgICAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBSZWZsZWN0aXZlS2V5KQogICAgICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2FsbEtleXMuZ2V0KHRva2VuKSkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3S2V5ID0gbmV3IFJlZmxlY3RpdmVLZXkodG9rZW4sIFJlZmxlY3RpdmVLZXkubnVtYmVyT2ZLZXlzKTsKICAgICAgICB0aGlzLl9hbGxLZXlzLnNldCh0b2tlbiwgbmV3S2V5KTsKICAgICAgICByZXR1cm4gbmV3S2V5OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgbnVtYmVyT2ZLZXlzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9hbGxLZXlzLnNpemU7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfZ2xvYmFsS2V5UmVnaXN0cnkgPSBuZXcgS2V5UmVnaXN0cnkoKTsKCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scy4gVXNlZCBpbnRlcm5hbGx5IGJ5IEFuZ3VsYXIKICogdG8gcG93ZXIgZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIGNvbXBpbGF0aW9uLgogKi8KY2xhc3MgUmVmbGVjdG9yIHsKICAgIGNvbnN0cnVjdG9yKHJlZmxlY3Rpb25DYXBhYmlsaXRpZXMpIHsKICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSByZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOwogICAgfQogICAgdXBkYXRlQ2FwYWJpbGl0aWVzKGNhcHMpIHsKICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBjYXBzOwogICAgfQogICAgZmFjdG9yeSh0eXBlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5mYWN0b3J5KHR5cGUpOwogICAgfQogICAgcGFyYW1ldGVycyh0eXBlT3JGdW5jKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGVPckZ1bmMpOwogICAgfQogICAgYW5ub3RhdGlvbnModHlwZU9yRnVuYykgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuYW5ub3RhdGlvbnModHlwZU9yRnVuYyk7CiAgICB9CiAgICBwcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpOwogICAgfQogICAgaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBsY1Byb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5oYXNMaWZlY3ljbGVIb29rKHR5cGUsIGxjUHJvcGVydHkpOwogICAgfQogICAgZ2V0dGVyKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlcihuYW1lKTsKICAgIH0KICAgIHNldHRlcihuYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7CiAgICB9CiAgICBtZXRob2QobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKG5hbWUpOwogICAgfQogICAgaW1wb3J0VXJpKHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSh0eXBlKTsKICAgIH0KICAgIHJlc291cmNlVXJpKHR5cGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc291cmNlVXJpKHR5cGUpOwogICAgfQogICAgcmVzb2x2ZUlkZW50aWZpZXIobmFtZSwgbW9kdWxlVXJsLCBtZW1iZXJzLCBydW50aW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5yZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpOwogICAgfQogICAgcmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSk7CiAgICB9Cn0KCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFRoZSB7QGxpbmsgUmVmbGVjdG9yfSB1c2VkIGludGVybmFsbHkgaW4gQW5ndWxhciB0byBhY2Nlc3MgbWV0YWRhdGEKICogYWJvdXQgc3ltYm9scy4KICovCmNvbnN0IHJlZmxlY3RvciA9IG5ldyBSZWZsZWN0b3IobmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKSk7Ci8qKgogKiBgRGVwZW5kZW5jeWAgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGV4dGVuZCBESS4KICogVGhpcyBpcyBpbnRlcm5hbCB0byBBbmd1bGFyIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCiAqLwpjbGFzcyBSZWZsZWN0aXZlRGVwZW5kZW5jeSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IG9wdGlvbmFsCiAgICAgKiBAcGFyYW0gez99IHZpc2liaWxpdHkKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5LCBvcHRpb25hbCwgdmlzaWJpbGl0eSkgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKICAgICAgICB0aGlzLnZpc2liaWxpdHkgPSB2aXNpYmlsaXR5OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGZyb21LZXkoa2V5KSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlRGVwZW5kZW5jeShrZXksIGZhbHNlLCBudWxsKTsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9FTVBUWV9MSVNUID0gW107CmNsYXNzIFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyXyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IHJlc29sdmVkRmFjdG9yaWVzCiAgICAgKiBAcGFyYW0gez99IG11bHRpUHJvdmlkZXIKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlQcm92aWRlcikgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHRoaXMucmVzb2x2ZWRGYWN0b3JpZXMgPSByZXNvbHZlZEZhY3RvcmllczsKICAgICAgICB0aGlzLm11bHRpUHJvdmlkZXIgPSBtdWx0aVByb3ZpZGVyOwogICAgICAgIHRoaXMucmVzb2x2ZWRGYWN0b3J5ID0gdGhpcy5yZXNvbHZlZEZhY3Rvcmllc1swXTsKICAgIH0KfQovKioKICogQW4gaW50ZXJuYWwgcmVzb2x2ZWQgcmVwcmVzZW50YXRpb24gb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZWQgYnkgcmVzb2x2aW5nIGBQcm92aWRlcmAuCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3J5CiAgICAgKiBAcGFyYW0gez99IGRlcGVuZGVuY2llcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihmYWN0b3J5LCBkZXBlbmRlbmNpZXMpIHsKICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzOwogICAgfQp9Ci8qKgogKiBSZXNvbHZlIGEgc2luZ2xlIHByb3ZpZGVyLgogKiBAcGFyYW0gez99IHByb3ZpZGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmYWN0b3J5Rm47CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzb2x2ZWREZXBzOwogICAgaWYgKHByb3ZpZGVyLnVzZUNsYXNzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVzZUNsYXNzID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIudXNlQ2xhc3MpOwogICAgICAgIGZhY3RvcnlGbiA9IHJlZmxlY3Rvci5mYWN0b3J5KHVzZUNsYXNzKTsKICAgICAgICByZXNvbHZlZERlcHMgPSBfZGVwZW5kZW5jaWVzRm9yKHVzZUNsYXNzKTsKICAgIH0KICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSB7CiAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWxpYXNJbnN0YW5jZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGFsaWFzSW5zdGFuY2UpID0+IGFsaWFzSW5zdGFuY2UpOwogICAgICAgIHJlc29sdmVkRGVwcyA9IFtSZWZsZWN0aXZlRGVwZW5kZW5jeS5mcm9tS2V5KFJlZmxlY3RpdmVLZXkuZ2V0KHByb3ZpZGVyLnVzZUV4aXN0aW5nKSldOwogICAgfQogICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRmFjdG9yeSkgewogICAgICAgIGZhY3RvcnlGbiA9IHByb3ZpZGVyLnVzZUZhY3Rvcnk7CiAgICAgICAgcmVzb2x2ZWREZXBzID0gY29uc3RydWN0RGVwZW5kZW5jaWVzKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcHMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gcHJvdmlkZXIudXNlVmFsdWUpOwogICAgICAgIHJlc29sdmVkRGVwcyA9IF9FTVBUWV9MSVNUOwogICAgfQogICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnlGbiwgcmVzb2x2ZWREZXBzKTsKfQovKioKICogQ29udmVydHMgdGhlIGBQcm92aWRlcmAgaW50byBgUmVzb2x2ZWRQcm92aWRlcmAuCiAqCiAqIGBJbmplY3RvcmAgaW50ZXJuYWxseSBvbmx5IHVzZXMgYFJlc29sdmVkUHJvdmlkZXJgLCBgUHJvdmlkZXJgIGNvbnRhaW5zIGNvbnZlbmllbmNlIHByb3ZpZGVyCiAqIHN5bnRheC4KICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcihwcm92aWRlcikgewogICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8oUmVmbGVjdGl2ZUtleS5nZXQocHJvdmlkZXIucHJvdmlkZSksIFtyZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpXSwgcHJvdmlkZXIubXVsdGkgfHwgZmFsc2UpOwp9Ci8qKgogKiBSZXNvbHZlIGEgbGlzdCBvZiBQcm92aWRlcnMuCiAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplUHJvdmlkZXJzKHByb3ZpZGVycywgW10pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVkLm1hcChyZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVyKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc29sdmVkUHJvdmlkZXJNYXAgPSBtZXJnZVJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyhyZXNvbHZlZCwgbmV3IE1hcCgpKTsKICAgIHJldHVybiBBcnJheS5mcm9tKHJlc29sdmVkUHJvdmlkZXJNYXAudmFsdWVzKCkpOwp9Ci8qKgogKiBNZXJnZXMgYSBsaXN0IG9mIFJlc29sdmVkUHJvdmlkZXJzIGludG8gYSBsaXN0IHdoZXJlIGVhY2gga2V5IGlzIGNvbnRhaW5lZCBleGFjdGx5IG9uY2UgYW5kCiAqIG11bHRpIHByb3ZpZGVycyBoYXZlIGJlZW4gbWVyZ2VkLgogKiBAcGFyYW0gez99IHByb3ZpZGVycwogKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRQcm92aWRlcnNNYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1lcmdlUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycywgbm9ybWFsaXplZFByb3ZpZGVyc01hcCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBwcm92aWRlcnNbaV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplZFByb3ZpZGVyc01hcC5nZXQocHJvdmlkZXIua2V5LmlkKTsKICAgICAgICBpZiAoZXhpc3RpbmcpIHsKICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIgIT09IGV4aXN0aW5nLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZywgcHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm92aWRlci5tdWx0aVByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucmVzb2x2ZWRGYWN0b3JpZXMucHVzaChwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1tqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJzTWFwLnNldChwcm92aWRlci5rZXkuaWQsIHByb3ZpZGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVzb2x2ZWRQcm92aWRlcjsKICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKHByb3ZpZGVyLmtleSwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMuc2xpY2UoKSwgcHJvdmlkZXIubXVsdGlQcm92aWRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9ybWFsaXplZFByb3ZpZGVyc01hcC5zZXQocHJvdmlkZXIua2V5LmlkLCByZXNvbHZlZFByb3ZpZGVyKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbm9ybWFsaXplZFByb3ZpZGVyc01hcDsKfQovKioKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/fSByZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCByZXMpIHsKICAgIHByb3ZpZGVycy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gYgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYiA9PiB7CiAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBUeXBlKSB7CiAgICAgICAgICAgIHJlcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh7IHByb3ZpZGU6IGIsIHVzZUNsYXNzOiBiIH0pKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGIgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcgJiYgKCgvKiogQHR5cGUgez99ICovIChiKSkpLnByb3ZpZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAoYikpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiKSkgewogICAgICAgICAgICBfbm9ybWFsaXplUHJvdmlkZXJzKGIsIHJlcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUHJvdmlkZXJFcnJvcihiKTsKICAgICAgICB9CiAgICB9KSk7CiAgICByZXR1cm4gcmVzOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICogQHBhcmFtIHs/PX0gZGVwZW5kZW5jaWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb25zdHJ1Y3REZXBlbmRlbmNpZXModHlwZU9yRnVuYywgZGVwZW5kZW5jaWVzKSB7CiAgICBpZiAoIWRlcGVuZGVuY2llcykgewogICAgICAgIHJldHVybiBfZGVwZW5kZW5jaWVzRm9yKHR5cGVPckZ1bmMpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmFtcyA9IGRlcGVuZGVuY2llcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdCA9PiBbdF0pKTsKICAgICAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0ID0+IF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgdCwgcGFyYW1zKSkpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9kZXBlbmRlbmNpZXNGb3IodHlwZU9yRnVuYykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyYW1zID0gcmVmbGVjdG9yLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7CiAgICBpZiAoIXBhcmFtcykKICAgICAgICByZXR1cm4gW107CiAgICBpZiAocGFyYW1zLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSBwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwID0+IHAgPT0gbnVsbCkpKSB7CiAgICAgICAgdGhyb3cgbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTsKICAgIH0KICAgIHJldHVybiBwYXJhbXMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcCA9PiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcykpKTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHBhcmFtIHs/fSBwYXJhbXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgbWV0YWRhdGEsIHBhcmFtcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHRva2VuID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBvcHRpb25hbCA9IGZhbHNlOwogICAgaWYgKCFBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkgewogICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdCkgewogICAgICAgICAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kobWV0YWRhdGEudG9rZW4sIG9wdGlvbmFsLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YSwgb3B0aW9uYWwsIG51bGwpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aXNpYmlsaXR5ID0gbnVsbDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YWRhdGEubGVuZ3RoOyArK2kpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1NZXRhZGF0YSA9IG1ldGFkYXRhW2ldOwogICAgICAgIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgVHlwZSkgewogICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3QpIHsKICAgICAgICAgICAgdG9rZW4gPSBwYXJhbU1ldGFkYXRhLnRva2VuOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgT3B0aW9uYWwpIHsKICAgICAgICAgICAgb3B0aW9uYWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2VsZiB8fCBwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2tpcFNlbGYpIHsKICAgICAgICAgICAgdmlzaWJpbGl0eSA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgewogICAgICAgICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGE7CiAgICAgICAgfQogICAgfQogICAgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZih0b2tlbik7CiAgICBpZiAodG9rZW4gIT0gbnVsbCkgewogICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIHZpc2liaWxpdHkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGhyb3cgbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcGFyYW0gez99IG9wdGlvbmFsCiAqIEBwYXJhbSB7P30gdmlzaWJpbGl0eQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCB2aXNpYmlsaXR5KSB7CiAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KFJlZmxlY3RpdmVLZXkuZ2V0KHRva2VuKSwgb3B0aW9uYWwsIHZpc2liaWxpdHkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9yZWZsZWN0aXZlX2luamVjdG9yLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8vIFRocmVzaG9sZCBmb3IgdGhlIGR5bmFtaWMgdmVyc2lvbgovKiogQHR5cGUgez99ICovCmNvbnN0IFVOREVGSU5FRCA9IHt9OwovKioKICogQSBSZWZsZWN0aXZlRGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgb2JqZWN0cyBhbmQgcmVzb2x2aW5nCiAqIGRlcGVuZGVuY2llcy4KICoKICogQW4gYEluamVjdG9yYCBpcyBhIHJlcGxhY2VtZW50IGZvciBhIGBuZXdgIG9wZXJhdG9yLCB3aGljaCBjYW4gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZQogKiBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMuCiAqCiAqIEluIHR5cGljYWwgdXNlLCBhcHBsaWNhdGlvbiBjb2RlIGFza3MgZm9yIHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGV5IGFyZQogKiByZXNvbHZlZCBieSB0aGUgYEluamVjdG9yYC4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGFuIGBJbmplY3RvcmAgY29uZmlndXJlZCB0byBjcmVhdGUgYEVuZ2luZWAgYW5kIGBDYXJgLgogKgogKiBgYGB0eXBlc2NyaXB0CiAqIFxASW5qZWN0YWJsZSgpCiAqIGNsYXNzIEVuZ2luZSB7CiAqIH0KICoKICogXEBJbmplY3RhYmxlKCkKICogY2xhc3MgQ2FyIHsKICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge30KICogfQogKgogKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQ2FyLCBFbmdpbmVdKTsKICogdmFyIGNhciA9IGluamVjdG9yLmdldChDYXIpOwogKiBleHBlY3QoY2FyIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpOwogKiBleHBlY3QoY2FyLmVuZ2luZSBpbnN0YW5jZW9mIEVuZ2luZSkudG9CZSh0cnVlKTsKICogYGBgCiAqCiAqIE5vdGljZSwgd2UgZG9uJ3QgdXNlIHRoZSBgbmV3YCBvcGVyYXRvciBiZWNhdXNlIHdlIGV4cGxpY2l0bHkgd2FudCB0byBoYXZlIHRoZSBgSW5qZWN0b3JgCiAqIHJlc29sdmUgYWxsIG9mIHRoZSBvYmplY3QncyBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4KICoKICogQGRlcHJlY2F0ZWQgZnJvbSB2NSAtIHNsb3cgYW5kIGJyaW5ncyBpbiBhIGxvdCBvZiBjb2RlLCBVc2UgYEluamVjdG9yLmNyZWF0ZWAgaW5zdGVhZC4KICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBSZWZsZWN0aXZlSW5qZWN0b3IgewogICAgLyoqCiAgICAgKiBUdXJucyBhbiBhcnJheSBvZiBwcm92aWRlciBkZWZpbml0aW9ucyBpbnRvIGFuIGFycmF5IG9mIHJlc29sdmVkIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBBIHJlc29sdXRpb24gaXMgYSBwcm9jZXNzIG9mIGZsYXR0ZW5pbmcgbXVsdGlwbGUgbmVzdGVkIGFycmF5cyBhbmQgY29udmVydGluZyBpbmRpdmlkdWFsCiAgICAgKiBwcm92aWRlcnMgaW50byBhbiBhcnJheSBvZiBgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJgcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogXEBJbmplY3RhYmxlKCkKICAgICAqIGNsYXNzIEVuZ2luZSB7CiAgICAgKiB9CiAgICAgKiAgLwogICAgICogY2xhc3MgQ2FyIHsKICAgICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9CiAgICAgKiB9CiAgICAgKgogICAgICogdmFyIHByb3ZpZGVycyA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtDYXIsIFtbRW5naW5lXV1dKTsKICAgICAqCiAgICAgKiBleHBlY3QocHJvdmlkZXJzLmxlbmd0aCkudG9FcXVhbCgyKTsKICAgICAqCiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXIpLnRvQmUodHJ1ZSk7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmtleS5kaXNwbGF5TmFtZSkudG9CZSgiQ2FyIik7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmRlcGVuZGVuY2llcy5sZW5ndGgpLnRvRXF1YWwoMSk7CiAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmZhY3RvcnkpLnRvQmVEZWZpbmVkKCk7CiAgICAgKgogICAgICogZXhwZWN0KHByb3ZpZGVyc1sxXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoIkVuZ2luZSIpOwogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIHJlc29sdmUocHJvdmlkZXJzKSB7CiAgICAgICAgcmV0dXJuIHJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXJzKHByb3ZpZGVycyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHByb3ZpZGVycyBhbmQgY3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHRob3NlIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBUaGUgcGFzc2VkLWluIHByb3ZpZGVycyBjYW4gYmUgYW4gYXJyYXkgb2YgYFR5cGVgLCBgUHJvdmlkZXJgLAogICAgICogb3IgYSByZWN1cnNpdmUgYXJyYXkgb2YgbW9yZSBwcm92aWRlcnMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICogfQogICAgICogIC8KICAgICAqIGNsYXNzIENhciB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fQogICAgICogfQogICAgICoKICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pOwogICAgICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpOwogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHBhcmFtIHs/PX0gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgcmVzb2x2ZUFuZENyZWF0ZShwcm92aWRlcnMsIHBhcmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShwcm92aWRlcnMpOwogICAgICAgIHJldHVybiBSZWZsZWN0aXZlSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycywgcGFyZW50KTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLgogICAgICoKICAgICAqIFRoaXMgQVBJIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY29uc3RydWN0IGluamVjdG9ycyBpbiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgcGFydHMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICogfQogICAgICogIC8KICAgICAqIGNsYXNzIENhciB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fQogICAgICogfQogICAgICoKICAgICAqIHZhciBwcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShbQ2FyLCBFbmdpbmVdKTsKICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzKTsKICAgICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTsKICAgICAqIGBgYAogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGZyb21SZXNvbHZlZFByb3ZpZGVycyhwcm92aWRlcnMsIHBhcmVudCkgewogICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGl2ZUluamVjdG9yXyhwcm92aWRlcnMsIHBhcmVudCk7CiAgICB9Cn0KY2xhc3MgUmVmbGVjdGl2ZUluamVjdG9yXyB7CiAgICAvKioKICAgICAqIFByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gX3Byb3ZpZGVycwogICAgICogQHBhcmFtIHs/PX0gX3BhcmVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcHJvdmlkZXJzLCBfcGFyZW50KSB7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOwogICAgICAgIHRoaXMuX3Byb3ZpZGVycyA9IF9wcm92aWRlcnM7CiAgICAgICAgdGhpcy5wYXJlbnQgPSBfcGFyZW50IHx8IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxlbiA9IF9wcm92aWRlcnMubGVuZ3RoOwogICAgICAgIHRoaXMua2V5SWRzID0gW107CiAgICAgICAgdGhpcy5vYmpzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICB0aGlzLmtleUlkc1tpXSA9IF9wcm92aWRlcnNbaV0ua2V5LmlkOwogICAgICAgICAgICB0aGlzLm9ianNbaV0gPSBVTkRFRklORUQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBUSFJPV19JRl9OT1RfRk9VTkQpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXkoUmVmbGVjdGl2ZUtleS5nZXQodG9rZW4pLCBudWxsLCBub3RGb3VuZFZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc29sdmVBbmRDcmVhdGVDaGlsZChwcm92aWRlcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTsKICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQocHJvdmlkZXJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaiA9IG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JfKHByb3ZpZGVycyk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChpbmopKSkucGFyZW50ID0gdGhpczsKICAgICAgICByZXR1cm4gaW5qOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNvbHZlQW5kSW5zdGFudGlhdGUocHJvdmlkZXIpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZVJlc29sdmVkKFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtwcm92aWRlcl0pWzBdKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5zdGFudGlhdGVSZXNvbHZlZChwcm92aWRlcikgewogICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4KSB7CiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9wcm92aWRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG91dE9mQm91bmRzRXJyb3IoaW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcHJvdmlkZXJzW2luZGV4XTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX25ldyhwcm92aWRlcikgewogICAgICAgIGlmICh0aGlzLl9jb25zdHJ1Y3Rpb25Db3VudGVyKysgPiB0aGlzLl9nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSkgewogICAgICAgICAgICB0aHJvdyBjeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE1heE51bWJlck9mT2JqZWN0cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5vYmpzLmxlbmd0aDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKSB7CiAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgcmVzW2ldID0gdGhpcy5faW5zdGFudGlhdGUocHJvdmlkZXIsIHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1swXSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICogQHBhcmFtIHs/fSBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaW5zdGFudGlhdGUocHJvdmlkZXIsIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkuZmFjdG9yeTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlcHM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZGVwcyA9CiAgICAgICAgICAgICAgICBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5LmRlcGVuZGVuY2llcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRlcCA9PiB0aGlzLl9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KGRlcCkpKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKGUuYWRkS2V5KSB7CiAgICAgICAgICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2JqOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9iaiA9IGZhY3RvcnkoLi4uZGVwcyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRocm93IGluc3RhbnRpYXRpb25FcnJvcih0aGlzLCBlLCBlLnN0YWNrLCBwcm92aWRlci5rZXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KGRlcCkgewogICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShkZXAua2V5LCBkZXAudmlzaWJpbGl0eSwgZGVwLm9wdGlvbmFsID8gbnVsbCA6IFRIUk9XX0lGX05PVF9GT1VORCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSB2aXNpYmlsaXR5CiAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeUtleShrZXksIHZpc2liaWxpdHksIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICBpZiAoa2V5ID09PSBSZWZsZWN0aXZlSW5qZWN0b3JfLklOSkVDVE9SX0tFWSkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKHZpc2liaWxpdHkgaW5zdGFuY2VvZiBTZWxmKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleVNlbGYoa2V5LCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCeUtleURlZmF1bHQoa2V5LCBub3RGb3VuZFZhbHVlLCB2aXNpYmlsaXR5KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleUlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0T2JqQnlLZXlJZChrZXlJZCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5rZXlJZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMua2V5SWRzW2ldID09PSBrZXlJZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYmpzW2ldID0gdGhpcy5fbmV3KHRoaXMuX3Byb3ZpZGVyc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmpzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBVTkRFRklORUQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSAhPT0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbm9Qcm92aWRlckVycm9yKHRoaXMsIGtleSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfZ2V0QnlLZXlTZWxmKGtleSwgbm90Rm91bmRWYWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvYmogPSB0aGlzLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7CiAgICAgICAgcmV0dXJuIChvYmogIT09IFVOREVGSU5FRCkgPyBvYmogOiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcGFyYW0gez99IHZpc2liaWxpdHkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9nZXRCeUtleURlZmF1bHQoa2V5LCBub3RGb3VuZFZhbHVlLCB2aXNpYmlsaXR5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbmo7CiAgICAgICAgaWYgKHZpc2liaWxpdHkgaW5zdGFuY2VvZiBTa2lwU2VsZikgewogICAgICAgICAgICBpbmogPSB0aGlzLnBhcmVudDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluaiA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChpbmogaW5zdGFuY2VvZiBSZWZsZWN0aXZlSW5qZWN0b3JfKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qXyA9ICgvKiogQHR5cGUgez99ICovIChpbmopKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYmogPSBpbmpfLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7CiAgICAgICAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkKICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgIGluaiA9IGlual8ucGFyZW50OwogICAgICAgIH0KICAgICAgICBpZiAoaW5qICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBpbmouZ2V0KGtleS50b2tlbiwgbm90Rm91bmRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGhyb3dPck51bGwoa2V5LCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBkaXNwbGF5TmFtZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXJzID0gX21hcFByb3ZpZGVycyh0aGlzLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYikgPT4gJyAiJyArIGIua2V5LmRpc3BsYXlOYW1lICsgJyIgJykpCiAgICAgICAgICAgIC5qb2luKCcsICcpOwogICAgICAgIHJldHVybiBgUmVmbGVjdGl2ZUluamVjdG9yKHByb3ZpZGVyczogWyR7cHJvdmlkZXJzfV0pYDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWU7CiAgICB9Cn0KUmVmbGVjdGl2ZUluamVjdG9yXy5JTkpFQ1RPUl9LRVkgPSBSZWZsZWN0aXZlS2V5LmdldChJbmplY3Rvcik7Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEBwYXJhbSB7P30gZm4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9tYXBQcm92aWRlcnMoaW5qZWN0b3IsIGZuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3ZpZGVycy5sZW5ndGg7ICsraSkgewogICAgICAgIHJlc1tpXSA9IGZuKGluamVjdG9yLmdldFByb3ZpZGVyQXRJbmRleChpKSk7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9pbmRleC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL2RpLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIHRva2VuIHRoYXQgeW91IGNhbiB1c2UgdG8gY3JlYXRlIGEgdmlydHVhbCBbcHJvdmlkZXJdKGd1aWRlL2dsb3NzYXJ5I3Byb3ZpZGVyKQogKiB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIGBlbnRyeUNvbXBvbmVudHNgIGZpZWxkIG9mIGNvbXBvbmVudHMgYW5kIE5nTW9kdWxlcwogKiBiYXNlZCBvbiBpdHMgYHVzZVZhbHVlYCBwcm9wZXJ0eSB2YWx1ZS4KICogQWxsIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgYHVzZVZhbHVlYCB2YWx1ZSAoZWl0aGVyIGRpcmVjdGx5CiAqIG9yIGluIGEgbmVzdGVkIGFycmF5IG9yIG1hcCkgYXJlIGFkZGVkIHRvIHRoZSBgZW50cnlDb21wb25lbnRzYCBwcm9wZXJ0eS4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIHJvdXRlciBjYW4gcG9wdWxhdGUgdGhlIGBlbnRyeUNvbXBvbmVudHNgCiAqIGZpZWxkIG9mIGFuIE5nTW9kdWxlIGJhc2VkIG9uIGEgcm91dGVyIGNvbmZpZ3VyYXRpb24gdGhhdCByZWZlcnMKICogdG8gY29tcG9uZW50cy4KICoKICogYGBgdHlwZXNjcmlwdAogKiAvLyBoZWxwZXIgZnVuY3Rpb24gaW5zaWRlIHRoZSByb3V0ZXIKICogZnVuY3Rpb24gcHJvdmlkZVJvdXRlcyhyb3V0ZXMpIHsKICogICByZXR1cm4gWwogKiAgICAge3Byb3ZpZGU6IFJPVVRFUywgdXNlVmFsdWU6IHJvdXRlc30sCiAqICAgICB7cHJvdmlkZTogQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUywgdXNlVmFsdWU6IHJvdXRlcywgbXVsdGk6IHRydWV9CiAqICAgXTsKICogfQogKgogKiAvLyB1c2VyIGNvZGUKICogbGV0IHJvdXRlcyA9IFsKICogICB7cGF0aDogJy9yb290JywgY29tcG9uZW50OiBSb290Q29tcH0sCiAqICAge3BhdGg6ICcvdGVhbXMnLCBjb21wb25lbnQ6IFRlYW1zQ29tcH0KICogXTsKICoKICogXEBOZ01vZHVsZSh7CiAqICAgcHJvdmlkZXJzOiBbcHJvdmlkZVJvdXRlcyhyb3V0ZXMpXQogKiB9KQogKiBjbGFzcyBNb2R1bGVXaXRoUm91dGVzIHt9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAZGVwcmVjYXRlZCBTaW5jZSA5LjAuMC4gV2l0aCBJdnksIHRoaXMgcHJvcGVydHkgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KICogQHR5cGUgez99CiAqLwpjb25zdCBBTkFMWVpFX0ZPUl9FTlRSWV9DT01QT05FTlRTID0gbmV3IEluamVjdGlvblRva2VuKCdBbmFseXplRm9yRW50cnlDb21wb25lbnRzJyk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKLyoqCiAqIEJhc2UgY2xhc3MgZm9yIHF1ZXJ5IG1ldGFkYXRhLgogKgogKiBAc2VlIGBDb250ZW50Q2hpbGRyZW5gLgogKiBAc2VlIGBDb250ZW50Q2hpbGRgLgogKiBAc2VlIGBWaWV3Q2hpbGRyZW5gLgogKiBAc2VlIGBWaWV3Q2hpbGRgLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIFF1ZXJ5IHsKfQpjb25zdCDJtTAkYSA9IC8qKgogKiBAcGFyYW0gez89fSBzZWxlY3RvcgogKiBAcGFyYW0gez89fSBkYXRhCiAqIEByZXR1cm4gez99CiAqLwooc2VsZWN0b3IsIGRhdGEgPSB7fSkgPT4gKE9iamVjdC5hc3NpZ24oeyBzZWxlY3RvciwgZmlyc3Q6IGZhbHNlLCBpc1ZpZXdRdWVyeTogZmFsc2UsIGRlc2NlbmRhbnRzOiBmYWxzZSB9LCBkYXRhKSk7Ci8qKgogKiBDb250ZW50Q2hpbGRyZW4gZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ29udGVudENoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ0NvbnRlbnRDaGlsZHJlbicsICjJtTAkYSksIFF1ZXJ5KTsKY29uc3QgybUxJDIgPSAvKioKICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICogQHBhcmFtIHs/PX0gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KKHNlbGVjdG9yLCBkYXRhID0ge30pID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogZmFsc2UsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTsKLyoqCiAqIENvbnRlbnRDaGlsZCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKgogKiBcQEFubm90YXRpb24KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBDb250ZW50Q2hpbGQgPSBtYWtlUHJvcERlY29yYXRvcignQ29udGVudENoaWxkJywgKMm1MSQyKSwgUXVlcnkpOwpjb25zdCDJtTIgPSAvKioKICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICogQHBhcmFtIHs/PX0gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KKHNlbGVjdG9yLCBkYXRhID0ge30pID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiBmYWxzZSwgaXNWaWV3UXVlcnk6IHRydWUsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTsKLyoqCiAqIFZpZXdDaGlsZHJlbiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBWaWV3Q2hpbGRyZW4gPSBtYWtlUHJvcERlY29yYXRvcignVmlld0NoaWxkcmVuJywgKMm1MiksIFF1ZXJ5KTsKY29uc3QgybUzID0gLyoqCiAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICogQHBhcmFtIHs/fSBkYXRhCiAqIEByZXR1cm4gez99CiAqLwooc2VsZWN0b3IsIGRhdGEpID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiB0cnVlLCBpc1ZpZXdRdWVyeTogdHJ1ZSwgZGVzY2VuZGFudHM6IHRydWUgfSwgZGF0YSkpOwovKioKICogVmlld0NoaWxkIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFZpZXdDaGlsZCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdWaWV3Q2hpbGQnLCAoybUzKSwgUXVlcnkpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbWV0YWRhdGEvcmVzb3VyY2VfbG9hZGluZy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBVc2VkIHRvIHJlc29sdmUgcmVzb3VyY2UgVVJMcyBvbiBgXEBDb21wb25lbnRgIHdoZW4gdXNlZCB3aXRoIEpJVCBjb21waWxhdGlvbi4KICoKICogRXhhbXBsZToKICogYGBgCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ215LWNvbXAnLAogKiAgIHRlbXBsYXRlVXJsOiAnbXktY29tcC5odG1sJywgLy8gVGhpcyByZXF1aXJlcyBhc3luY2hyb25vdXMgcmVzb2x1dGlvbgogKiB9KQogKiBjbGFzcyBNeUNvbXBvbmVudHsKICogfQogKgogKiAvLyBDYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIHdpbGwgZmFpbCBiZWNhdXNlIGByZW5kZXJDb21wb25lbnRgIGlzIGEgc3luY2hyb25vdXMgcHJvY2VzcwogKiAvLyBhbmQgYE15Q29tcG9uZW50YCdzIGBcQENvbXBvbmVudC50ZW1wbGF0ZVVybGAgbmVlZHMgdG8gYmUgcmVzb2x2ZWQgYXN5bmNocm9ub3VzbHkuCiAqCiAqIC8vIENhbGxpbmcgYHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMoKWAgd2lsbCByZXNvbHZlIGBcQENvbXBvbmVudC50ZW1wbGF0ZVVybGAgaW50bwogKiAvLyBgXEBDb21wb25lbnQudGVtcGxhdGVgLCB3aGljaCBhbGxvd3MgYHJlbmRlckNvbXBvbmVudGAgdG8gcHJvY2VlZCBpbiBhIHN5bmNocm9ub3VzIG1hbm5lci4KICoKICogLy8gVXNlIGJyb3dzZXIncyBgZmV0Y2goKWAgZnVuY3Rpb24gYXMgdGhlIGRlZmF1bHQgcmVzb3VyY2UgcmVzb2x1dGlvbiBzdHJhdGVneS4KICogcmVzb2x2ZUNvbXBvbmVudFJlc291cmNlcyhmZXRjaCkudGhlbigoKSA9PiB7CiAqICAgLy8gQWZ0ZXIgcmVzb2x1dGlvbiBhbGwgVVJMcyBoYXZlIGJlZW4gY29udmVydGVkIGludG8gYHRlbXBsYXRlYCBzdHJpbmdzLgogKiAgIHJlbmRlckNvbXBvbmVudChNeUNvbXBvbmVudCk7CiAqIH0pOwogKgogKiBgYGAKICoKICogTk9URTogSW4gQU9UIHRoZSByZXNvbHV0aW9uIGhhcHBlbnMgZHVyaW5nIGNvbXBpbGF0aW9uLCBhbmQgc28gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQKICogdG8gY2FsbCB0aGlzIG1ldGhvZCBvdXRzaWRlIEpJVCBtb2RlLgogKgogKiBAcGFyYW0gez99IHJlc291cmNlUmVzb2x2ZXIgYSBmdW5jdGlvbiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIGEgYFByb21pc2VgIHRvIHRoZQogKiBjb250ZW50cyBvZiB0aGUgcmVzb2x2ZWQgVVJMLiBCcm93c2VyJ3MgYGZldGNoKClgIG1ldGhvZCBpcyBhIGdvb2QgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMocmVzb3VyY2VSZXNvbHZlcikgewogICAgLy8gU3RvcmUgYWxsIHByb21pc2VzIHdoaWNoIGFyZSBmZXRjaGluZyB0aGUgcmVzb3VyY2VzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50UmVzb2x2ZWQgPSBbXTsKICAgIC8vIENhY2hlIHNvIHRoYXQgd2UgZG9uJ3QgZmV0Y2ggdGhlIHNhbWUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cmxNYXAgPSBuZXcgTWFwKCk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjYWNoZWRSZXNvdXJjZVJlc29sdmUodXJsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcm9taXNlID0gdXJsTWFwLmdldCh1cmwpOwogICAgICAgIGlmICghcHJvbWlzZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSByZXNvdXJjZVJlc29sdmVyKHVybCk7CiAgICAgICAgICAgIHVybE1hcC5zZXQodXJsLCBwcm9taXNlID0gcmVzcC50aGVuKHVud3JhcFJlc3BvbnNlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm9taXNlOwogICAgfQogICAgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoY29tcG9uZW50LCB0eXBlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb21pc2VzID0gW107CiAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybCkgewogICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlZFJlc291cmNlUmVzb2x2ZShjb21wb25lbnQudGVtcGxhdGVVcmwpLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodGVtcGxhdGUpID0+IHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVVcmxzID0gY29tcG9uZW50LnN0eWxlVXJsczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gY29tcG9uZW50LnN0eWxlcyB8fCAoY29tcG9uZW50LnN0eWxlcyA9IFtdKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVPZmZzZXQgPSBjb21wb25lbnQuc3R5bGVzLmxlbmd0aDsKICAgICAgICBzdHlsZVVybHMgJiYgc3R5bGVVcmxzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVVcmwKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc3R5bGVVcmwsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIHN0eWxlcy5wdXNoKCcnKTsgLy8gcHJlLWFsbG9jYXRlIGFycmF5LgogICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNhY2hlZFJlc291cmNlUmVzb2x2ZShzdHlsZVVybCkudGhlbigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdHlsZSkgPT4gewogICAgICAgICAgICAgICAgc3R5bGVzW3N0eWxlT2Zmc2V0ICsgaW5kZXhdID0gc3R5bGU7CiAgICAgICAgICAgICAgICBzdHlsZVVybHMuc3BsaWNlKHN0eWxlVXJscy5pbmRleE9mKHN0eWxlVXJsKSwgMSk7CiAgICAgICAgICAgICAgICBpZiAoc3R5bGVVcmxzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnN0eWxlVXJscyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZ1bGx5UmVzb2x2ZWQgPSBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBjb21wb25lbnREZWZSZXNvbHZlZCh0eXBlKSkpOwogICAgICAgIGNvbXBvbmVudFJlc29sdmVkLnB1c2goZnVsbHlSZXNvbHZlZCk7CiAgICB9KSk7CiAgICBjbGVhclJlc29sdXRpb25PZkNvbXBvbmVudFJlc291cmNlc1F1ZXVlKCk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50UmVzb2x2ZWQpLnRoZW4oKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gdW5kZWZpbmVkKSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUgPSBuZXcgTWFwKCk7Ci8vIFRyYWNrIHdoZW4gZXhpc3RpbmcgybVjbXAgZm9yIGEgVHlwZSBpcyB3YWl0aW5nIG9uIHJlc291cmNlcy4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBjb21wb25lbnREZWZQZW5kaW5nUmVzb2x1dGlvbiA9IG5ldyBTZXQoKTsKLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXliZVF1ZXVlUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzKHR5cGUsIG1ldGFkYXRhKSB7CiAgICBpZiAoY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKG1ldGFkYXRhKSkgewogICAgICAgIGNvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlLnNldCh0eXBlLCBtZXRhZGF0YSk7CiAgICAgICAgY29tcG9uZW50RGVmUGVuZGluZ1Jlc29sdXRpb24uYWRkKHR5cGUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKGNvbXBvbmVudCkgewogICAgcmV0dXJuICEhKChjb21wb25lbnQudGVtcGxhdGVVcmwgJiYgIWNvbXBvbmVudC5oYXNPd25Qcm9wZXJ0eSgndGVtcGxhdGUnKSkgfHwKICAgICAgICBjb21wb25lbnQuc3R5bGVVcmxzICYmIGNvbXBvbmVudC5zdHlsZVVybHMubGVuZ3RoKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNsZWFyUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzUXVldWUoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbGQgPSBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZTsKICAgIGNvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlID0gbmV3IE1hcCgpOwogICAgcmV0dXJuIG9sZDsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzQ29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWVFbXB0eSgpIHsKICAgIHJldHVybiBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZS5zaXplID09PSAwOwp9Ci8qKgogKiBAcGFyYW0gez99IHJlc3BvbnNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bndyYXBSZXNwb25zZShyZXNwb25zZSkgewogICAgcmV0dXJuIHR5cGVvZiByZXNwb25zZSA9PSAnc3RyaW5nJyA/IHJlc3BvbnNlIDogcmVzcG9uc2UudGV4dCgpOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBvbmVudERlZlJlc29sdmVkKHR5cGUpIHsKICAgIGNvbXBvbmVudERlZlBlbmRpbmdSZXNvbHV0aW9uLmRlbGV0ZSh0eXBlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nL3N0YXRpY19zdHlsaW5nLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBDb21wdXRlIHRoZSBzdGF0aWMgc3R5bGluZyAoY2xhc3Mvc3R5bGUpIGZyb20gYFRBdHRyaWJ1dGVzYC4KICoKICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBgZmlyc3RDcmVhdGVQYXNzYCBvbmx5LgogKgogKiBAcGFyYW0gez99IHROb2RlIFRoZSBgVE5vZGVgIGludG8gd2hpY2ggdGhlIHN0eWxpbmcgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGxvYWRlZC4KICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIGNvbnRhaW5pbmcgdGhlIHN0eWxpbmcgaW5mb3JtYXRpb24uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21wdXRlU3RhdGljU3R5bGluZyh0Tm9kZSwgYXR0cnMpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyhnZXRUVmlldygpLCAnRXhwZWN0aW5nIHRvIGJlIGNhbGxlZCBpbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBzdHlsZXMgPSB0Tm9kZS5zdHlsZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2xhc3NlcyA9IHROb2RlLmNsYXNzZXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbW9kZSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgbW9kZSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtb2RlID09IDEgLyogQ2xhc3NlcyAqLykgewogICAgICAgICAgICBjbGFzc2VzID0gY29uY2F0U3RyaW5nc1dpdGhTcGFjZShjbGFzc2VzLCAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMiAvKiBTdHlsZXMgKi8pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbKytpXSkpOwogICAgICAgICAgICBzdHlsZXMgPSBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKHN0eWxlcywgc3R5bGUgKyAnOiAnICsgc3R5bGVWYWx1ZSArICc7Jyk7CiAgICAgICAgfQogICAgfQogICAgc3R5bGVzICE9PSBudWxsICYmICh0Tm9kZS5zdHlsZXMgPSBzdHlsZXMpOwogICAgY2xhc3NlcyAhPT0gbnVsbCAmJiAodE5vZGUuY2xhc3NlcyA9IGNsYXNzZXMpOwp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCmxldCBfc3ltYm9sSXRlcmF0b3IgPSBudWxsOwpmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvciQxKCkgewogICAgaWYgKCFfc3ltYm9sSXRlcmF0b3IpIHsKICAgICAgICBjb25zdCBTeW1ib2wgPSBfZ2xvYmFsWydTeW1ib2wnXTsKICAgICAgICBpZiAoU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcikgewogICAgICAgICAgICBfc3ltYm9sSXRlcmF0b3IgPSBTeW1ib2wuaXRlcmF0b3I7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBlczYtc2hpbSBzcGVjaWZpYyBsb2dpYwogICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJgogICAgICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVba2V5XSA9PT0gTWFwLnByb3RvdHlwZVsnZW50cmllcyddKSB7CiAgICAgICAgICAgICAgICAgICAgX3N5bWJvbEl0ZXJhdG9yID0ga2V5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovLyBKUyBoYXMgTmFOICE9PSBOYU4KZnVuY3Rpb24gbG9vc2VJZGVudGljYWwoYSwgYikgewogICAgcmV0dXJuIGEgPT09IGIgfHwgdHlwZW9mIGEgPT09ICdudW1iZXInICYmIHR5cGVvZiBiID09PSAnbnVtYmVyJyAmJiBpc05hTihhKSAmJiBpc05hTihiKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldk1vZGVFcXVhbCQxKGEsIGIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTGlzdExpa2VJdGVyYWJsZUEgPSBpc0xpc3RMaWtlSXRlcmFibGUkMShhKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTGlzdExpa2VJdGVyYWJsZUIgPSBpc0xpc3RMaWtlSXRlcmFibGUkMShiKTsKICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGVBICYmIGlzTGlzdExpa2VJdGVyYWJsZUIpIHsKICAgICAgICByZXR1cm4gYXJlSXRlcmFibGVzRXF1YWwkMShhLCBiLCBkZXZNb2RlRXF1YWwkMSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBT2JqZWN0ID0gYSAmJiAodHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNCT2JqZWN0ID0gYiAmJiAodHlwZW9mIGIgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBiID09PSAnZnVuY3Rpb24nKTsKICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZUEgJiYgaXNBT2JqZWN0ICYmICFpc0xpc3RMaWtlSXRlcmFibGVCICYmIGlzQk9iamVjdCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBsb29zZUlkZW50aWNhbChhLCBiKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgYSB7XEBsaW5rIFBpcGV9IHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkIGV2ZW4gdGhvdWdoIHRoZQogKiByZWZlcmVuY2UgaGFzIG5vdCBjaGFuZ2VkLgogKgogKiBXcmFwcGVkIHZhbHVlcyBhcmUgdW53cmFwcGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLCBhbmQgdGhlIHVud3JhcHBlZCB2YWx1ZQogKiBpcyBzdG9yZWQuCiAqCiAqIEV4YW1wbGU6CiAqCiAqIGBgYAogKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHsKICogICAgcmV0dXJuIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU7CiAqICB9IGVsc2UgewogKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7CiAqICAgIHJldHVybiBXcmFwcGVkVmFsdWUud3JhcCh0aGlzLl9sYXRlc3RWYWx1ZSk7IC8vIHRoaXMgd2lsbCBmb3JjZSB1cGRhdGUKICogIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBXcmFwcGVkVmFsdWUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHZhbHVlKSB7CiAgICAgICAgdGhpcy53cmFwcGVkID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSB3cmFwcGVkIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIHdyYXAodmFsdWUpIHsKICAgICAgICByZXR1cm4gbmV3IFdyYXBwZWRWYWx1ZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdmFsdWUgb2YgYSB3cmFwcGVkIHZhbHVlLgogICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gYHZhbHVlYCB3aGVuIGl0IGlzIG5vdCB3cmFwcGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyB1bndyYXAodmFsdWUpIHsKICAgICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLmlzV3JhcHBlZCh2YWx1ZSkgPyB2YWx1ZS53cmFwcGVkIDogdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgd3JhcHBlZCB2YWx1ZS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpc1dyYXBwZWQodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBXcmFwcGVkVmFsdWU7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gb2JqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0xpc3RMaWtlSXRlcmFibGUkMShvYmopIHsKICAgIGlmICghaXNKc09iamVjdCQxKG9iaikpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fAogICAgICAgICghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgLy8gSlMgTWFwIGFyZSBpdGVyYWJsZXMgYnV0IHJldHVybiBlbnRyaWVzIGFzIFtrLCB2XQogICAgICAgICAgICBnZXRTeW1ib2xJdGVyYXRvciQxKCkgaW4gb2JqKTsgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wCn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHBhcmFtIHs/fSBjb21wYXJhdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcmVJdGVyYWJsZXNFcXVhbCQxKGEsIGIsIGNvbXBhcmF0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGl0ZXJhdG9yMSA9IGFbZ2V0U3ltYm9sSXRlcmF0b3IkMSgpXSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaXRlcmF0b3IyID0gYltnZXRTeW1ib2xJdGVyYXRvciQxKCldKCk7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVtMSA9IGl0ZXJhdG9yMS5uZXh0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZW0yID0gaXRlcmF0b3IyLm5leHQoKTsKICAgICAgICBpZiAoaXRlbTEuZG9uZSAmJiBpdGVtMi5kb25lKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoaXRlbTEuZG9uZSB8fCBpdGVtMi5kb25lKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKCFjb21wYXJhdG9yKGl0ZW0xLnZhbHVlLCBpdGVtMi52YWx1ZSkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBvYmoKICogQHBhcmFtIHs/fSBmbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXRlcmF0ZUxpc3RMaWtlJDEob2JqLCBmbikgewogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGZuKG9ialtpXSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gb2JqW2dldFN5bWJvbEl0ZXJhdG9yJDEoKV0oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGl0ZW07CiAgICAgICAgd2hpbGUgKCEoKGl0ZW0gPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpKSB7CiAgICAgICAgICAgIGZuKGl0ZW0udmFsdWUpOwogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBvCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0pzT2JqZWN0JDEobykgewogICAgcmV0dXJuIG8gIT09IG51bGwgJiYgKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvID09PSAnb2JqZWN0Jyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvYmluZGluZ3MudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLy8gVE9ETyhtaXNrbyk6IGNvbnNpZGVyIGlubGluaW5nCi8qKgogKiBVcGRhdGVzIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHZhbHVlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpIHsKICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7Cn0KLyoqCiAqIEdldHMgdGhlIGN1cnJlbnQgYmluZGluZyB2YWx1ZS4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4KSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGJpbmRpbmdJbmRleCk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RTYW1lKGxWaWV3W2JpbmRpbmdJbmRleF0sIE5PX0NIQU5HRSwgJ1N0b3JlZCB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpOwogICAgcmV0dXJuIGxWaWV3W2JpbmRpbmdJbmRleF07Cn0KLyoqCiAqIFVwZGF0ZXMgYmluZGluZyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBpdCB3YXMgdXBkYXRlZC4KICoKICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyB0aGUgYENoZWNrTm9DaGFuZ2VzTW9kZWAgYW5kIHRocm93cyBpZiBjaGFuZ2VzIGFyZSBtYWRlLgogKiBTb21lIGNoYW5nZXMgKE9iamVjdHMvaXRlcmFibGVzKSBkdXJpbmcgYENoZWNrTm9DaGFuZ2VzTW9kZWAgYXJlIGV4ZW1wdCB0byBjb21wbHkgd2l0aCBWRQogKiBiZWhhdmlvci4KICoKICogQHBhcmFtIHs/fSBsVmlldyBjdXJyZW50IGBMVmlld2AKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggVGhlIGJpbmRpbmcgaW4gdGhlIGBMVmlld2AgdG8gY2hlY2sKICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCBgbFZpZXdbYmluZGluZ0luZGV4XWAKICogQHJldHVybiB7P30gYHRydWVgIGlmIHRoZSBiaW5kaW5ncyBoYXMgY2hhbmdlZC4gKFRocm93cyBpZiBiaW5kaW5nIGhhcyBjaGFuZ2VkIGR1cmluZwogKiAgICAgICAgICBgQ2hlY2tOb0NoYW5nZXNNb2RlYCkKICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgTk9fQ0hBTkdFLCAnSW5jb21pbmcgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIE5PX0NIQU5HRS4nKTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydExlc3NUaGFuKGJpbmRpbmdJbmRleCwgbFZpZXcubGVuZ3RoLCBgU2xvdCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIE5PX0NIQU5HRWApOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb2xkVmFsdWUgPSBsVmlld1tiaW5kaW5nSW5kZXhdOwogICAgaWYgKE9iamVjdC5pcyhvbGRWYWx1ZSwgdmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSkgewogICAgICAgICAgICAvLyBWaWV3IGVuZ2luZSBkaWRuJ3QgcmVwb3J0IHVuZGVmaW5lZCB2YWx1ZXMgYXMgY2hhbmdlZCBvbiB0aGUgZmlyc3QgY2hlY2tOb0NoYW5nZXMgcGFzcwogICAgICAgICAgICAvLyAoYmVmb3JlIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHdhcyBydW4pLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlVG9Db21wYXJlID0gb2xkVmFsdWUgIT09IE5PX0NIQU5HRSA/IG9sZFZhbHVlIDogdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoIWRldk1vZGVFcXVhbCQxKG9sZFZhbHVlVG9Db21wYXJlLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBnZXRFeHByZXNzaW9uQ2hhbmdlZEVycm9yRGV0YWlscyhsVmlldywgYmluZGluZ0luZGV4LCBvbGRWYWx1ZVRvQ29tcGFyZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgdGhyb3dFcnJvcklmTm9DaGFuZ2VzTW9kZShvbGRWYWx1ZSA9PT0gTk9fQ0hBTkdFLCBkZXRhaWxzLm9sZFZhbHVlLCBkZXRhaWxzLm5ld1ZhbHVlLCBkZXRhaWxzLnByb3BOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBjaGFuZ2UsIGJ1dCB0aGUgYGRldk1vZGVFcXVhbGAgZGVjaWRlZCB0aGF0IHRoZSBjaGFuZ2UgaXMgZXhlbXB0IGZyb20gYW4gZXJyb3IuCiAgICAgICAgICAgIC8vIEZvciB0aGlzIHJlYXNvbiB3ZSBleGl0IGFzIGlmIG5vIGNoYW5nZS4gVGhlIGVhcmx5IGV4aXQgaXMgbmVlZGVkIHRvIHByZXZlbnQgdGhlIGNoYW5nZWQKICAgICAgICAgICAgLy8gdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIGBMVmlld2AgKElmIHdlIHdvdWxkIHdyaXRlIHRoZSBuZXcgdmFsdWUgdGhhdCB3ZSB3b3VsZCBub3Qgc2VlIGl0CiAgICAgICAgICAgIC8vIGFzIGNoYW5nZSBvbiBuZXh0IENELikKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZXMgMiBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBlaXRoZXIgd2FzIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEpOwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAxLCBleHAyKSB8fCBkaWZmZXJlbnQ7Cn0KLyoqCiAqIFVwZGF0ZXMgMyBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBhbnkgd2FzIHVwZGF0ZWQuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkMyhsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMik7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDIsIGV4cDMpIHx8IGRpZmZlcmVudDsKfQovKioKICogVXBkYXRlcyA0IGJpbmRpbmdzIGlmIGNoYW5nZWQsIHRoZW4gcmV0dXJucyB3aGV0aGVyIGFueSB3YXMgdXBkYXRlZC4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogKiBAcGFyYW0gez99IGV4cDEKICogQHBhcmFtIHs/fSBleHAyCiAqIEBwYXJhbSB7P30gZXhwMwogKiBAcGFyYW0gez99IGV4cDQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzLCBleHA0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMik7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAyLCBleHAzLCBleHA0KSB8fCBkaWZmZXJlbnQ7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2F0dHJpYnV0ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVXBkYXRlcyB0aGUgdmFsdWUgb2Ygb3IgcmVtb3ZlcyBhIGJvdW5kIGF0dHJpYnV0ZSBvbiBhbiBFbGVtZW50LgogKgogKiBVc2VkIGluIHRoZSBjYXNlIG9mIGBbYXR0ci50aXRsZV09InZhbHVlImAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gbmFtZSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSB7P30gdmFsdWUgdmFsdWUgVGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkIHdoZW4gdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLgogKiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIHNldCB0byB0aGUgc3RyaW5naWZpZWQgdmFsdWUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlIE9wdGlvbmFsIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlKG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gbmV4dEJpbmRpbmdJbmRleCgpOwogICAgaWYgKGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBuYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2ludGVycG9sYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZSBpbnRlcnBvbGF0aW9uIGJpbmRpbmdzIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMuCiAqCiAqIElmIHRoZXJlIGFyZSAxIHRvIDggZXhwcmVzc2lvbnMgYGludGVycG9sYXRpb24xKClgIHRvIGBpbnRlcnBvbGF0aW9uOCgpYCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgogKiBUaG9zZSBhcmUgZmFzdGVyIGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgYW5kIGl0ZXJhdGUgb3ZlciBpdC4KICoKICogYHZhbHVlc2A6CiAqIC0gaGFzIHN0YXRpYyB0ZXh0IGF0IGV2ZW4gaW5kZXhlcywKICogLSBoYXMgZXZhbHVhdGVkIGV4cHJlc3Npb25zIGF0IG9kZCBpbmRleGVzLgogKgogKiBSZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nIHdoZW4gYW55IG9mIHRoZSBhcmd1bWVudHMgY2hhbmdlcywgYE5PX0NIQU5HRWAgb3RoZXJ3aXNlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmFsdWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4oMiwgdmFsdWVzLmxlbmd0aCwgJ3Nob3VsZCBoYXZlIGF0IGxlYXN0IDMgdmFsdWVzJyk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwodmFsdWVzLmxlbmd0aCAlIDIsIDEsICdzaG91bGQgaGF2ZSBhbiBvZGQgbnVtYmVyIG9mIHZhbHVlcycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzQmluZGluZ1VwZGF0ZWQgPSBmYWxzZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgYmluZGluZ3MgKG9kZCBpbmRleGVzKSBoYXZlIGNoYW5nZWQKICAgICAgICBpc0JpbmRpbmdVcGRhdGVkID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCsrLCB2YWx1ZXNbaV0pIHx8IGlzQmluZGluZ1VwZGF0ZWQ7CiAgICB9CiAgICBzZXRCaW5kaW5nSW5kZXgoYmluZGluZ0luZGV4KTsKICAgIGlmICghaXNCaW5kaW5nVXBkYXRlZCkgewogICAgICAgIHJldHVybiBOT19DSEFOR0U7CiAgICB9CiAgICAvLyBCdWlsZCB0aGUgdXBkYXRlZCBjb250ZW50CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY29udGVudCA9IHZhbHVlc1swXTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgY29udGVudCArPSByZW5kZXJTdHJpbmdpZnkodmFsdWVzW2ldKSArIHZhbHVlc1tpICsgMV07CiAgICB9CiAgICByZXR1cm4gY29udGVudDsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAxIGV4cHJlc3Npb24uCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVmaXggc3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCB2YWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IHN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZChsVmlldywgbmV4dEJpbmRpbmdJbmRleCgpLCB2MCk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAyIGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSk7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoMik7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAzIGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIpOwogICAgaW5jcmVtZW50QmluZGluZ0luZGV4KDMpOwogICAgcmV0dXJuIGRpZmZlcmVudCA/CiAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9Ci8qKgogKiBDcmVhdGUgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNCBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoNCk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsKICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgc3VmZml4IDoKICAgICAgICBOT19DSEFOR0U7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNSBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpOwogICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0KSB8fCBkaWZmZXJlbnQ7CiAgICBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoNSk7CiAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsKICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgaTMgKyByZW5kZXJTdHJpbmdpZnkodjQpICsgc3VmZml4IDoKICAgICAgICBOT19DSEFOR0U7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNiBleHByZXNzaW9ucy4KICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IGk0CiAqIEBwYXJhbSB7P30gdjUKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgdjAsIHYxLCB2MiwgdjMpOwogICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg2KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPwogICAgICAgIHByZWZpeCArIHJlbmRlclN0cmluZ2lmeSh2MCkgKyBpMCArIHJlbmRlclN0cmluZ2lmeSh2MSkgKyBpMSArIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArCiAgICAgICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArIHJlbmRlclN0cmluZ2lmeSh2NSkgKyBzdWZmaXggOgogICAgICAgIE5PX0NIQU5HRTsKfQovKioKICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCA3IGV4cHJlc3Npb25zLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDMobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0LCB2NSwgdjYpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg3KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArCiAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY1KSArIGk1ICsgcmVuZGVyU3RyaW5naWZ5KHY2KSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9Ci8qKgogKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDggZXhwcmVzc2lvbnMuCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVmaXgKICogQHBhcmFtIHs/fSB2MAogKiBAcGFyYW0gez99IGkwCiAqIEBwYXJhbSB7P30gdjEKICogQHBhcmFtIHs/fSBpMQogKiBAcGFyYW0gez99IHYyCiAqIEBwYXJhbSB7P30gaTIKICogQHBhcmFtIHs/fSB2MwogKiBAcGFyYW0gez99IGkzCiAqIEBwYXJhbSB7P30gdjQKICogQHBhcmFtIHs/fSBpNAogKiBAcGFyYW0gez99IHY1CiAqIEBwYXJhbSB7P30gaTUKICogQHBhcmFtIHs/fSB2NgogKiBAcGFyYW0gez99IGk2CiAqIEBwYXJhbSB7P30gdjcKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludGVycG9sYXRpb244KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIsIHYzKTsKICAgIGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4ICsgNCwgdjQsIHY1LCB2NiwgdjcpIHx8IGRpZmZlcmVudDsKICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg4KTsKICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MikgKyBpMiArIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArCiAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY1KSArIGk1ICsgcmVuZGVyU3RyaW5naWZ5KHY2KSArIGk2ICsgcmVuZGVyU3RyaW5naWZ5KHY3KSArIHN1ZmZpeCA6CiAgICAgICAgTk9fQ0hBTkdFOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9hdHRyaWJ1dGVfaW50ZXJwb2xhdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTEoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMShhdHRyTmFtZSwgcHJlZml4LCB2MCwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKGdldFRWaWV3KCkuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBhdHRyTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSAxLCBwcmVmaXgsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTIoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDIsIHByZWZpeCwgaTAsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMjsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMygKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMyhhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDMsIHByZWZpeCwgaTAsIGkxLCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTM7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0KAogKiAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDQsIHByZWZpeCwgaTAsIGkxLCBpMiwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA1IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTUoCiAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTUoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDUsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNigKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNihhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDYsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTY7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3KAogKiAgICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDcsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTgoCiAqICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4KGF0dHJOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKGdldFRWaWV3KCkuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBhdHRyTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA4LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIGk2LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTg7Cn0KLyoqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWKAogKiAgJ3RpdGxlJywgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICogICdzdWZmaXgnXSk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICogYSBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguCiAqIChlLmcuIGBbJ3ByZWZpeCcsIHZhbHVlMCwgJy0nLCB2YWx1ZTEsICctJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZVYoYXR0ck5hbWUsIHZhbHVlcywgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZCA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWQsIHNhbml0aXplciwgbmFtZXNwYWNlKTsKICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbkluQmV0d2VlbiA9IFt2YWx1ZXNbMF1dOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkluQmV0d2Vlbi5wdXNoKHZhbHVlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YShnZXRUVmlldygpLmRhdGEsIHROb2RlLCAnYXR0ci4nICsgYXR0ck5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gaW50ZXJwb2xhdGlvbkluQmV0d2Vlbi5sZW5ndGggKyAxLCAuLi5pbnRlcnBvbGF0aW9uSW5CZXR3ZWVuKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvY2hhbmdlX2RldGVjdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSBjb21wb25lbnQgKGFuZCBwb3NzaWJseSBpdHMgc3ViLWNvbXBvbmVudHMpLgogKgogKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGNoYW5nZSBkZXRlY3Rpb24gaW4gYSBzeW5jaHJvbm91cyB3YXkgb24gYSBjb21wb25lbnQuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IFRoZSBjb21wb25lbnQgd2hpY2ggdGhlIGNoYW5nZSBkZXRlY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRldGVjdENoYW5nZXMoY29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50KTsKICAgIGRldGVjdENoYW5nZXNJbnRlcm5hbCh2aWV3W1RWSUVXXSwgdmlldywgY29tcG9uZW50KTsKfQovKioKICogTWFya3MgdGhlIGNvbXBvbmVudCBhcyBkaXJ0eSAobmVlZGluZyBjaGFuZ2UgZGV0ZWN0aW9uKS4gTWFya2luZyBhIGNvbXBvbmVudCBkaXJ0eSB3aWxsCiAqIHNjaGVkdWxlIGEgY2hhbmdlIGRldGVjdGlvbiBvbiBpdCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCiAqCiAqIE1hcmtpbmcgYW4gYWxyZWFkeSBkaXJ0eSBjb21wb25lbnQgYXMgZGlydHkgd29uJ3QgZG8gYW55dGhpbmcuIE9ubHkgb25lIG91dHN0YW5kaW5nIGNoYW5nZQogKiBkZXRlY3Rpb24gY2FuIGJlIHNjaGVkdWxlZCBwZXIgY29tcG9uZW50IHRyZWUuCiAqCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IENvbXBvbmVudCB0byBtYXJrIGFzIGRpcnR5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWFya0RpcnR5KGNvbXBvbmVudCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY29tcG9uZW50LCAnY29tcG9uZW50Jyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VmlldyA9ICgvKiogQHR5cGUgez99ICovIChtYXJrVmlld0RpcnR5KGdldENvbXBvbmVudFZpZXdCeUluc3RhbmNlKGNvbXBvbmVudCkpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChyb290Vmlld1tDT05URVhUXSwgJ3Jvb3RDb250ZXh0IHNob3VsZCBiZSBkZWZpbmVkJyk7CiAgICBzY2hlZHVsZVRpY2soKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RWaWV3W0NPTlRFWFRdKSksIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2NvbnRhaW5lci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ3JlYXRlcyBhbiBMQ29udGFpbmVyIGZvciBpbmxpbmUgdmlld3MsIGUuZy4KICoKICogJSBpZiAoc2hvd2luZykgewogKiAgIDxkaXY+PC9kaXY+CiAqICUgfQogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciBpbiB0aGUgZGF0YSBhcnJheQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNvbnRhaW5lcihpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBjb250YWluZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIGluZGV4LCBudWxsLCBudWxsKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICB0Tm9kZS50Vmlld3MgPSBbXTsKICAgIH0KICAgIHNldElzTm90UGFyZW50KCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogKiBAcGFyYW0gez99IGRlY2xzCiAqIEBwYXJhbSB7P30gdmFycwogKiBAcGFyYW0gez89fSB0YWdOYW1lCiAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXgKICogQHBhcmFtIHs/PX0gbG9jYWxSZWZzSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRlbXBsYXRlRmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0YWdOYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb25zdHMgPSB0Vmlldy5jb25zdHM7CiAgICAvLyBUT0RPKHBrKTogcmVmYWN0b3IgZ2V0T3JDcmVhdGVUTm9kZSB0byBoYXZlIHRoZSAiY3JlYXRlIiBvbmx5IHZlcnNpb24KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDAgLyogQ29udGFpbmVyICovLCB0YWdOYW1lIHx8IG51bGwsIGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBhdHRyc0luZGV4KSk7CiAgICByZXNvbHZlRGlyZWN0aXZlcyh0VmlldywgbFZpZXcsIHROb2RlLCBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgbG9jYWxSZWZzSW5kZXgpKTsKICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3ModFZpZXcsIHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVtYmVkZGVkVFZpZXcgPSB0Tm9kZS50Vmlld3MgPSBjcmVhdGVUVmlldygyIC8qIEVtYmVkZGVkICovLCAtMSwgdGVtcGxhdGVGbiwgZGVjbHMsIHZhcnMsIHRWaWV3LmRpcmVjdGl2ZVJlZ2lzdHJ5LCB0Vmlldy5waXBlUmVnaXN0cnksIG51bGwsIHRWaWV3LnNjaGVtYXMsIHRWaWV3Q29uc3RzKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVtYmVkZGVkVFZpZXdOb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZVROb2RlKHRWaWV3LCBudWxsLCAyIC8qIFZpZXcgKi8sIC0xLCBudWxsLCBudWxsKSkpOwogICAgZW1iZWRkZWRUVmlld05vZGUuaW5qZWN0b3JJbmRleCA9IHROb2RlLmluamVjdG9ySW5kZXg7CiAgICBlbWJlZGRlZFRWaWV3Lm5vZGUgPSBlbWJlZGRlZFRWaWV3Tm9kZTsKICAgIGlmICh0Vmlldy5xdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgdFZpZXcucXVlcmllcy50ZW1wbGF0ZSh0VmlldywgdE5vZGUpOwogICAgICAgIGVtYmVkZGVkVFZpZXcucXVlcmllcyA9IHRWaWV3LnF1ZXJpZXMuZW1iZWRkZWRUVmlldyh0Tm9kZSk7CiAgICB9CiAgICByZXR1cm4gdE5vZGU7Cn0KLyoqCiAqIENyZWF0ZXMgYW4gTENvbnRhaW5lciBmb3IgYW4gbmctdGVtcGxhdGUgKGR5bmFtaWNhbGx5LWluc2VydGVkIHZpZXcpLCBlLmcuCiAqCiAqIDxuZy10ZW1wbGF0ZSAjZm9vPgogKiAgICA8ZGl2PjwvZGl2PgogKiA8L25nLXRlbXBsYXRlPgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbnRhaW5lciBpbiB0aGUgZGF0YSBhcnJheQogKiBAcGFyYW0gez99IHRlbXBsYXRlRm4gSW5saW5lIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gZGVjbHMgVGhlIG51bWJlciBvZiBub2RlcywgbG9jYWwgcmVmcywgYW5kIHBpcGVzIGZvciB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7P30gdmFycyBUaGUgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciB0aGlzIHRlbXBsYXRlCiAqIEBwYXJhbSB7Pz19IHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50LCBpZiBhcHBsaWNhYmxlCiAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXggSW5kZXggb2YgdGVtcGxhdGUgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmRXh0cmFjdG9yIEEgZnVuY3Rpb24gd2hpY2ggZXh0cmFjdHMgbG9jYWwtcmVmcyB2YWx1ZXMgZnJvbSB0aGUgdGVtcGxhdGUuCiAqICAgICAgICBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9jYWwtcmVmLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXRlbXBsYXRlKGluZGV4LCB0ZW1wbGF0ZUZuLCBkZWNscywgdmFycywgdGFnTmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgsIGxvY2FsUmVmRXh0cmFjdG9yKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgIHRlbXBsYXRlRmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0YWdOYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgOgogICAgICAgICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGZhbHNlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbW1lbnQgPSBsVmlld1tSRU5ERVJFUl0uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGUgPyAnY29udGFpbmVyJyA6ICcnKTsKICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgY29tbWVudCwgdE5vZGUpOwogICAgYXR0YWNoUGF0Y2hEYXRhKGNvbW1lbnQsIGxWaWV3KTsKICAgIGFkZFRvVmlld1RyZWUobFZpZXcsIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gY3JlYXRlTENvbnRhaW5lcihjb21tZW50LCBsVmlldywgY29tbWVudCwgdE5vZGUpKTsKICAgIGlmIChpc0RpcmVjdGl2ZUhvc3QodE5vZGUpKSB7CiAgICAgICAgY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgIH0KICAgIGlmIChsb2NhbFJlZnNJbmRleCAhPSBudWxsKSB7CiAgICAgICAgc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKGxWaWV3LCB0Tm9kZSwgbG9jYWxSZWZFeHRyYWN0b3IpOwogICAgfQp9Ci8qKgogKiBTZXRzIGEgY29udGFpbmVyIHVwIHRvIHJlY2VpdmUgdmlld3MuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29udGFpbmVyIGluIHRoZSBkYXRhIGFycmF5CiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29udGFpbmVyUmVmcmVzaFN0YXJ0KGluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcHJldmlvdXNPclBhcmVudFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxvYWQodFZpZXcuZGF0YSwgaW5kZXgpKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUocHJldmlvdXNPclBhcmVudFROb2RlLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUocHJldmlvdXNPclBhcmVudFROb2RlLCB0cnVlKTsKICAgIGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF1bQUNUSVZFX0lOREVYXSA9IDA7CiAgICAvLyBXZSBuZWVkIHRvIGV4ZWN1dGUgaW5pdCBob29rcyBoZXJlIHNvIG5nT25Jbml0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdG9wIGxldmVsIHZpZXdzCiAgICAvLyBiZWZvcmUgdGhleSBhcmUgY2FsbGVkIGluIGVtYmVkZGVkIHZpZXdzIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLgogICAgaWYgKCFnZXRDaGVja05vQ2hhbmdlc01vZGUoKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob29rc0luaXRQaGFzZUNvbXBsZXRlZCA9IChsVmlld1tGTEFHU10gJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovOwogICAgICAgIGlmIChob29rc0luaXRQaGFzZUNvbXBsZXRlZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZU9yZGVyQ2hlY2tIb29rcyA9IHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rczsKICAgICAgICAgICAgaWYgKHByZU9yZGVyQ2hlY2tIb29rcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZXhlY3V0ZUNoZWNrSG9va3MobFZpZXcsIHByZU9yZGVyQ2hlY2tIb29rcywgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlT3JkZXJIb29rcyA9IHRWaWV3LnByZU9yZGVySG9va3M7CiAgICAgICAgICAgIGlmIChwcmVPcmRlckhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBleGVjdXRlSW5pdEFuZENoZWNrSG9va3MobFZpZXcsIHByZU9yZGVySG9va3MsIDAgLyogT25Jbml0SG9va3NUb0JlUnVuICovLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8pOwogICAgICAgIH0KICAgIH0KfQovKioKICogTWFya3MgdGhlIGVuZCBvZiB0aGUgTENvbnRhaW5lci4KICoKICogTWFya2luZyB0aGUgZW5kIG9mIExDb250YWluZXIgaXMgdGhlIHRpbWUgd2hlbiB0byBjaGlsZCB2aWV3cyBnZXQgaW5zZXJ0ZWQgb3IgcmVtb3ZlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29udGFpbmVyUmVmcmVzaEVuZCgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwcmV2aW91c09yUGFyZW50VE5vZGUsIDIgLyogVmlldyAqLyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEhhc1BhcmVudChwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgMCAvKiBDb250YWluZXIgKi8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENvbnRhaW5lciA9IGdldExWaWV3KClbcHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4XTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5leHRJbmRleCA9IGdldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyKTsKICAgIC8vIHJlbW92ZSBleHRyYSB2aWV3cyBhdCB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIKICAgIHdoaWxlIChuZXh0SW5kZXggPCBsQ29udGFpbmVyLmxlbmd0aCAtIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKSB7CiAgICAgICAgcmVtb3ZlVmlldyhsQ29udGFpbmVyLCBuZXh0SW5kZXgpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/fSB0YWdOYW1lCiAqIEBwYXJhbSB7P30gYXR0cnMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbnRhaW5lckludGVybmFsKHRWaWV3LCBsVmlldywgbm9kZUluZGV4LCB0YWdOYW1lLCBhdHRycykgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwoZ2V0QmluZGluZ0luZGV4KCksIHRWaWV3LmJpbmRpbmdTdGFydEluZGV4LCAnY29udGFpbmVyIG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSBub2RlSW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBub2RlSW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21tZW50ID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGxWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICdjb250YWluZXInIDogJycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBub2RlSW5kZXgsIDAgLyogQ29udGFpbmVyICovLCB0YWdOYW1lLCBhdHRycyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsQ29udGFpbmVyID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPSBjcmVhdGVMQ29udGFpbmVyKGNvbW1lbnQsIGxWaWV3LCBjb21tZW50LCB0Tm9kZSk7CiAgICBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIGNvbW1lbnQsIHROb2RlKTsKICAgIGF0dGFjaFBhdGNoRGF0YShjb21tZW50LCBsVmlldyk7CiAgICAvLyBDb250YWluZXJzIGFyZSBhZGRlZCB0byB0aGUgY3VycmVudCB2aWV3IHRyZWUgaW5zdGVhZCBvZiB0aGVpciBlbWJlZGRlZCB2aWV3cwogICAgLy8gYmVjYXVzZSB2aWV3cyBjYW4gYmUgcmVtb3ZlZCBhbmQgcmUtaW5zZXJ0ZWQuCiAgICBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBsQ29udGFpbmVyKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgMCAvKiBDb250YWluZXIgKi8pOwogICAgcmV0dXJuIHROb2RlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zdG9yYWdlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBTdG9yZSBhIHZhbHVlIGluIHRoZSBgZGF0YWAgYXQgYSBnaXZlbiBgaW5kZXhgLgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdG9yZSh0VmlldywgbFZpZXcsIGluZGV4LCB2YWx1ZSkgewogICAgLy8gV2UgZG9uJ3Qgc3RvcmUgYW55IHN0YXRpYyBkYXRhIGZvciBsb2NhbCB2YXJpYWJsZXMsIHNvIHRoZSBmaXJzdCB0aW1lCiAgICAvLyB3ZSBzZWUgdGhlIHRlbXBsYXRlLCB3ZSBzaG91bGQgc3RvcmUgYXMgbnVsbCB0byBhdm9pZCBhIHNwYXJzZSBhcnJheQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIGlmIChhZGp1c3RlZEluZGV4ID49IHRWaWV3LmRhdGEubGVuZ3RoKSB7CiAgICAgICAgdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IG51bGw7CiAgICAgICAgdFZpZXcuYmx1ZXByaW50W2FkanVzdGVkSW5kZXhdID0gbnVsbDsKICAgIH0KICAgIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gdmFsdWU7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsIHJlZmVyZW5jZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHRWaWV3RGF0YS4KICoKICogSWYgdGhlIHJlZmVyZW5jZSB0byByZXRyaWV2ZSBpcyBpbiBhIHBhcmVudCB2aWV3LCB0aGlzIGluc3RydWN0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24KICogd2l0aCBhIG5leHRDb250ZXh0KCkgY2FsbCwgd2hpY2ggd2Fsa3MgdXAgdGhlIHRyZWUgYW5kIHVwZGF0ZXMgdGhlIGNvbnRleHRWaWV3RGF0YSBpbnN0YW5jZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBsb2NhbCByZWYgaW4gY29udGV4dFZpZXdEYXRhLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXJlZmVyZW5jZShpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dExWaWV3ID0gZ2V0Q29udGV4dExWaWV3KCk7CiAgICByZXR1cm4gbG9hZChjb250ZXh0TFZpZXcsIGluZGV4KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZGkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdG9rZW4KICogQHBhcmFtIHs/PX0gZmxhZ3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVkaXJlY3RpdmVJbmplY3QodG9rZW4sIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLy8gRmFsbCBiYWNrIHRvIGluamVjdCgpIGlmIHZpZXcgaGFzbid0IGJlZW4gY3JlYXRlZC4gVGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbiBpbiB0ZXN0cwogICAgLy8gaWYgaW5qZWN0IHV0aWxpdGllcyBhcmUgdXNlZCBiZWZvcmUgYm9vdHN0cmFwcGluZy4KICAgIGlmIChsVmlldyA9PSBudWxsKQogICAgICAgIHJldHVybiDJtcm1aW5qZWN0KHRva2VuLCBmbGFncyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgcmV0dXJuIGdldE9yQ3JlYXRlSW5qZWN0YWJsZSgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcsIHJlc29sdmVGb3J3YXJkUmVmKHRva2VuKSwgZmxhZ3MpOwp9Ci8qKgogKiBGYWNhZGUgZm9yIHRoZSBhdHRyaWJ1dGUgaW5qZWN0aW9uIGZyb20gREkuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGF0dHJOYW1lVG9JbmplY3QKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbmplY3RBdHRyaWJ1dGUoYXR0ck5hbWVUb0luamVjdCkgewogICAgcmV0dXJuIGluamVjdEF0dHJpYnV0ZUltcGwoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGF0dHJOYW1lVG9JbmplY3QpOwp9Ci8qKgogKiBUaHJvd3MgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IGEgZmFjdG9yeSBmdW5jdGlvbiBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgYQogKiBwYXJ0aWN1bGFyIGNsYXNzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFsbG93cyB0aGUgYWN0dWFsIGVycm9yIG1lc3NhZ2UgdG8gYmUgb3B0aW1pemVkIGF3YXkgd2hlbiBuZ0Rldk1vZGUgaXMgdHVybmVkCiAqIG9mZiwgc2F2aW5nIGJ5dGVzIG9mIGdlbmVyYXRlZCBjb2RlIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBhIGdvb2QgZXhwZXJpZW5jZSBpbiBkZXYgbW9kZS4KICoKICogVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdCBtZW50aW9uZWQgaGVyZSwgYnV0IHdpbGwgYmUgaW4gdGhlIGdlbmVyYXRlZCBmYWN0b3J5IGZ1bmN0aW9uIG5hbWUKICogYW5kIHRodXMgaW4gdGhlIHN0YWNrIHRyYWNlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbnZhbGlkRmFjdG9yeSgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1zZyA9IG5nRGV2TW9kZSA/IGBUaGlzIGNvbnN0cnVjdG9yIHdhcyBub3QgY29tcGF0aWJsZSB3aXRoIERlcGVuZGVuY3kgSW5qZWN0aW9uLmAgOiAnaW52YWxpZCc7CiAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvcHJvcGVydHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgc2VsZWN0ZWQgZWxlbWVudC4KICoKICogT3BlcmF0ZXMgb24gdGhlIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggdmlhIHRoZSB7XEBsaW5rIHNlbGVjdH0gaW5zdHJ1Y3Rpb24uCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZAogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0bwogKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlLgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogKiAoZS5nLiBgcHJvcGVydHkoJ25hbWUnLCBjdHgubmFtZSkoJ3RpdGxlJywgY3R4LnRpdGxlKWApCiAqCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eTsKfQovKioKICogR2l2ZW4gYDxkaXYgc3R5bGU9Ii4uLiIgbXktZGlyPmAgYW5kIGBNeURpcmAgd2l0aCBgXEBJbnB1dCgnc3R5bGUnKWAgd2UgbmVlZCB0byB3cml0ZSB0bwogKiBkaXJlY3RpdmUgaW5wdXQuCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgdmFsdWUsIGlzQ2xhc3NCYXNlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5wdXRzID0gKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLmlucHV0cykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJvcGVydHkgPSBpc0NsYXNzQmFzZWQgPyAnY2xhc3MnIDogJ3N0eWxlJzsKICAgIC8vIFdlIHN1cHBvcnQgYm90aCAnY2xhc3MnIGFuZCBgY2xhc3NOYW1lYCBoZW5jZSB0aGUgZmFsbGJhY2suCiAgICBzZXRJbnB1dHNGb3JQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGlucHV0c1twcm9wZXJ0eV0sIHByb3BlcnR5LCB2YWx1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gbmF0aXZlCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbGVtZW50U3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgbmF0aXZlLCBuYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb25zdHMgPSB0Vmlldy5jb25zdHM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhdHRycyA9IGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBhdHRyc0luZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDMgLyogRWxlbWVudCAqLywgbmFtZSwgYXR0cnMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaGFzRGlyZWN0aXZlcyA9IHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCBsVmlldywgdE5vZGUsIGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBsb2NhbFJlZnNJbmRleCkpOwogICAgbmdEZXZNb2RlICYmIHdhcm5BYm91dFVua25vd25FbGVtZW50KHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSwgaGFzRGlyZWN0aXZlcyk7CiAgICBpZiAodE5vZGUubWVyZ2VkQXR0cnMgIT09IG51bGwpIHsKICAgICAgICBjb21wdXRlU3RhdGljU3R5bGluZyh0Tm9kZSwgdE5vZGUubWVyZ2VkQXR0cnMpOwogICAgfQogICAgaWYgKHRWaWV3LnF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICB0Vmlldy5xdWVyaWVzLmVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpOwogICAgfQogICAgcmV0dXJuIHROb2RlOwp9Ci8qKgogKiBDcmVhdGUgRE9NIGVsZW1lbnQuIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50RW5kKClgIGNhbGwuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogKiBAcGFyYW0gez99IG5hbWUgTmFtZSBvZiB0aGUgRE9NIE5vZGUKICogQHBhcmFtIHs/PX0gYXR0cnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGxvY2FsIHJlZmVyZW5jZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKgogKiBBdHRyaWJ1dGVzIGFuZCBsb2NhbFJlZnMgYXJlIHBhc3NlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmdzIHdoZXJlIGVsZW1lbnRzIHdpdGggYW4gZXZlbiBpbmRleAogKiBob2xkIGFuIGF0dHJpYnV0ZSBuYW1lIGFuZCBlbGVtZW50cyB3aXRoIGFuIG9kZCBpbmRleCBob2xkIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgZXguOgogKiBbJ2lkJywgJ3dhcm5pbmc1JywgJ2NsYXNzJywgJ2FsZXJ0J10KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50U3RhcnQoaW5kZXgsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gSEVBREVSX09GRlNFVCArIGluZGV4OwogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RXF1YWwoZ2V0QmluZGluZ0luZGV4KCksIHRWaWV3LmJpbmRpbmdTdGFydEluZGV4LCAnZWxlbWVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpOwogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKzsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgYWRqdXN0ZWRJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZW5kZXJlciA9IGxWaWV3W1JFTkRFUkVSXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hdGl2ZSA9IGxWaWV3W2FkanVzdGVkSW5kZXhdID0gZWxlbWVudENyZWF0ZShuYW1lLCByZW5kZXJlciwgZ2V0TmFtZXNwYWNlKCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgIGVsZW1lbnRTdGFydEZpcnN0Q3JlYXRlUGFzcyhpbmRleCwgdFZpZXcsIGxWaWV3LCBuYXRpdmUsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSwgdHJ1ZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXJnZWRBdHRycyA9IHROb2RlLm1lcmdlZEF0dHJzOwogICAgaWYgKG1lcmdlZEF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgc2V0VXBBdHRyaWJ1dGVzKHJlbmRlcmVyLCBuYXRpdmUsIG1lcmdlZEF0dHJzKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNsYXNzZXMgPSB0Tm9kZS5jbGFzc2VzOwogICAgaWYgKGNsYXNzZXMgIT09IG51bGwpIHsKICAgICAgICB3cml0ZURpcmVjdENsYXNzKHJlbmRlcmVyLCBuYXRpdmUsIGNsYXNzZXMpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3R5bGVzID0gdE5vZGUuc3R5bGVzOwogICAgaWYgKHN0eWxlcyAhPT0gbnVsbCkgewogICAgICAgIHdyaXRlRGlyZWN0U3R5bGUocmVuZGVyZXIsIG5hdGl2ZSwgc3R5bGVzKTsKICAgIH0KICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSk7CiAgICAvLyBhbnkgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIGEgY29tcG9uZW50IG9yIHRlbXBsYXRlIGNvbnRhaW5lciBtdXN0IGJlIHByZS1lbXB0aXZlbHkKICAgIC8vIG1vbmtleS1wYXRjaGVkIHdpdGggdGhlIGNvbXBvbmVudCB2aWV3IGRhdGEgc28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUgaW5zcGVjdGVkCiAgICAvLyBsYXRlciBvbiB1c2luZyBhbnkgZWxlbWVudCBkaXNjb3ZlcnkgdXRpbGl0eSBtZXRob2RzIChzZWUgYGVsZW1lbnRfZGlzY292ZXJ5LnRzYCkKICAgIGlmIChnZXRFbGVtZW50RGVwdGhDb3VudCgpID09PSAwKSB7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgfQogICAgaW5jcmVhc2VFbGVtZW50RGVwdGhDb3VudCgpOwogICAgaWYgKGlzRGlyZWN0aXZlSG9zdCh0Tm9kZSkpIHsKICAgICAgICBjcmVhdGVEaXJlY3RpdmVzSW5zdGFuY2VzKHRWaWV3LCBsVmlldywgdE5vZGUpOwogICAgICAgIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KTsKICAgIH0KICAgIGlmIChsb2NhbFJlZnNJbmRleCAhPT0gbnVsbCkgewogICAgICAgIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YShsVmlldywgdE5vZGUpOwogICAgfQp9Ci8qKgogKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWVsZW1lbnRFbmQoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChwcmV2aW91c09yUGFyZW50VE5vZGUsICdObyBwYXJlbnQgbm9kZSB0byBjbG9zZS4nKTsKICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIYXNQYXJlbnQoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCkpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBwcmV2aW91c09yUGFyZW50VE5vZGU7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUodE5vZGUsIDMgLyogRWxlbWVudCAqLyk7CiAgICBkZWNyZWFzZUVsZW1lbnREZXB0aENvdW50KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgcHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICBpZiAoaXNDb250ZW50UXVlcnlIb3N0KHByZXZpb3VzT3JQYXJlbnRUTm9kZSkpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnF1ZXJpZXMpKS5lbGVtZW50RW5kKHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHROb2RlLmNsYXNzZXMgIT09IG51bGwgJiYgaGFzQ2xhc3NJbnB1dCh0Tm9kZSkpIHsKICAgICAgICBzZXREaXJlY3RpdmVJbnB1dHNXaGljaFNoYWRvd3NTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgZ2V0TFZpZXcoKSwgdE5vZGUuY2xhc3NlcywgdHJ1ZSk7CiAgICB9CiAgICBpZiAodE5vZGUuc3R5bGVzICE9PSBudWxsICYmIGhhc1N0eWxlSW5wdXQodE5vZGUpKSB7CiAgICAgICAgc2V0RGlyZWN0aXZlSW5wdXRzV2hpY2hTaGFkb3dzU3R5bGluZyh0VmlldywgdE5vZGUsIGdldExWaWV3KCksIHROb2RlLnN0eWxlcywgZmFsc2UpOwogICAgfQp9Ci8qKgogKiBDcmVhdGVzIGFuIGVtcHR5IGVsZW1lbnQgdXNpbmcge1xAbGluayBlbGVtZW50U3RhcnR9IGFuZCB7XEBsaW5rIGVsZW1lbnRFbmR9CiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBkYXRhIGFycmF5CiAqIEBwYXJhbSB7P30gbmFtZSBOYW1lIG9mIHRoZSBET00gTm9kZQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgbG9jYWwgcmVmZXJlbmNlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZWxlbWVudChpbmRleCwgbmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgIMm1ybVlbGVtZW50U3RhcnQoaW5kZXgsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KTsKICAgIMm1ybVlbGVtZW50RW5kKCk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGVsZW1lbnQKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGhhc0RpcmVjdGl2ZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdhcm5BYm91dFVua25vd25FbGVtZW50KHRWaWV3LCBsVmlldywgZWxlbWVudCwgdE5vZGUsIGhhc0RpcmVjdGl2ZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjaGVtYXMgPSB0Vmlldy5zY2hlbWFzOwogICAgLy8gSWYgYHNjaGVtYXNgIGlzIHNldCB0byBgbnVsbGAsIHRoYXQncyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcyBDb21wb25lbnQgd2FzIGNvbXBpbGVkIGluIEFPVAogICAgLy8gbW9kZSB3aGVyZSB0aGlzIGNoZWNrIGhhcHBlbnMgYXQgY29tcGlsZSB0aW1lLiBJbiBKSVQgbW9kZSwgYHNjaGVtYXNgIGlzIGFsd2F5cyBwcmVzZW50IGFuZAogICAgLy8gZGVmaW5lZCBhcyBhbiBhcnJheSAoYXMgYW4gZW1wdHkgYXJyYXkgaW4gY2FzZSBgc2NoZW1hc2AgZmllbGQgaXMgbm90IGRlZmluZWQpIGFuZCB3ZSBzaG91bGQKICAgIC8vIGV4ZWN1dGUgdGhlIGNoZWNrIGJlbG93LgogICAgaWYgKHNjaGVtYXMgPT09IG51bGwpCiAgICAgICAgcmV0dXJuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdGFnTmFtZSA9IHROb2RlLnRhZ05hbWU7CiAgICAvLyBJZiB0aGUgZWxlbWVudCBtYXRjaGVzIGFueSBkaXJlY3RpdmUsIGl0J3MgY29uc2lkZXJlZCBhcyB2YWxpZC4KICAgIGlmICghaGFzRGlyZWN0aXZlcyAmJiB0YWdOYW1lICE9PSBudWxsKSB7CiAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgdW5rbm93biBpZiBpdCdzIGFuIGluc3RhbmNlIG9mIEhUTUxVbmtub3duRWxlbWVudCBvciBpdCBpc24ndCByZWdpc3RlcmVkCiAgICAgICAgLy8gYXMgYSBjdXN0b20gZWxlbWVudC4gTm90ZSB0aGF0IHVua25vd24gZWxlbWVudHMgd2l0aCBhIGRhc2ggaW4gdGhlaXIgbmFtZSB3b24ndCBiZSBpbnN0YW5jZXMKICAgICAgICAvLyBvZiBIVE1MVW5rbm93bkVsZW1lbnQgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IHdlYiBjb21wb25lbnRzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc1Vua25vd24gPSAKICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2hlY2sgZm9yIGB0eXBlb2YgSFRNTFVua25vd25FbGVtZW50ID09PSAnZnVuY3Rpb24nYCwKICAgICAgICAvLyBiZWNhdXNlIHdoaWxlIG1vc3QgYnJvd3NlcnMgcmV0dXJuICdmdW5jdGlvbicsIElFIHJldHVybnMgJ29iamVjdCcuCiAgICAgICAgKHR5cGVvZiBIVE1MVW5rbm93bkVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIEhUTUxVbmtub3duRWxlbWVudCAmJgogICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFVua25vd25FbGVtZW50KSB8fAogICAgICAgICAgICAodHlwZW9mIGN1c3RvbUVsZW1lbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xICYmCiAgICAgICAgICAgICAgICAhY3VzdG9tRWxlbWVudHMuZ2V0KHRhZ05hbWUpKTsKICAgICAgICBpZiAoaXNVbmtub3duICYmICFtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0YWdOYW1lKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB3YXJuaW5nID0gYCcke3RhZ05hbWV9JyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxuYDsKICAgICAgICAgICAgd2FybmluZyArPSBgMS4gSWYgJyR7dGFnTmFtZX0nIGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50LCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIHBhcnQgb2YgdGhpcyBtb2R1bGUuXG5gOwogICAgICAgICAgICBpZiAodGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICB3YXJuaW5nICs9IGAyLiBJZiAnJHt0YWdOYW1lfScgaXMgYSBXZWIgQ29tcG9uZW50IHRoZW4gYWRkICdDVVNUT01fRUxFTUVOVFNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudCB0byBzdXBwcmVzcyB0aGlzIG1lc3NhZ2UuYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdhcm5pbmcgKz0KICAgICAgICAgICAgICAgICAgICBgMi4gVG8gYWxsb3cgYW55IGVsZW1lbnQgYWRkICdOT19FUlJPUlNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudC5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnNvbGUud2Fybih3YXJuaW5nKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnRfY29udGFpbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbGVtZW50Q29udGFpbmVyU3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUuZmlyc3RDcmVhdGVQYXNzKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Vmlld0NvbnN0cyA9IHRWaWV3LmNvbnN0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGF0dHJzID0gZ2V0Q29uc3RhbnQodFZpZXdDb25zdHMsIGF0dHJzSW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdE5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCAnbmctY29udGFpbmVyJywgYXR0cnMpOwogICAgLy8gV2hpbGUgbmctY29udGFpbmVyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBzdHlsaW5nLCB3ZSB1c2UgdGhlIHN0eWxlIGNvbnRleHQgdG8gaWRlbnRpZnkKICAgIC8vIGFuZCBleGVjdXRlIGRpcmVjdGl2ZXMgb24gdGhlIG5nLWNvbnRhaW5lci4KICAgIGlmIChhdHRycyAhPT0gbnVsbCkgewogICAgICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCBhdHRycyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsb2NhbFJlZnMgPSBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgbG9jYWxSZWZzSW5kZXgpOwogICAgcmVzb2x2ZURpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgbG9jYWxSZWZzKTsKICAgIGlmICh0Vmlldy5xdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgdFZpZXcucXVlcmllcy5lbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKTsKICAgIH0KICAgIHJldHVybiB0Tm9kZTsKfQovKioKICogQ3JlYXRlcyBhIGxvZ2ljYWwgY29udGFpbmVyIGZvciBvdGhlciBub2RlcyAoPG5nLWNvbnRhaW5lcj4pIGJhY2tlZCBieSBhIGNvbW1lbnQgbm9kZSBpbiB0aGUgRE9NLgogKiBUaGUgaW5zdHJ1Y3Rpb24gbXVzdCBsYXRlciBiZSBmb2xsb3dlZCBieSBgZWxlbWVudENvbnRhaW5lckVuZCgpYCBjYWxsLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgTFZpZXcgYXJyYXkKICogQHBhcmFtIHs/PX0gYXR0cnNJbmRleCBJbmRleCBvZiB0aGUgY29udGFpbmVyIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgY29udGFpbmVyJ3MgbG9jYWwgcmVmZXJlbmNlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqCiAqIEV2ZW4gaWYgdGhpcyBpbnN0cnVjdGlvbiBhY2NlcHRzIGEgc2V0IG9mIGF0dHJpYnV0ZXMgbm8gYWN0dWFsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgdG8KICogdGhlIERPTSAoYXMgYSBjb21tZW50IG5vZGUgY2FuJ3QgaGF2ZSBhdHRyaWJ1dGVzKS4gQXR0cmlidXRlcyBhcmUgaGVyZSBvbmx5IGZvciBkaXJlY3RpdmUKICogbWF0Y2hpbmcgcHVycG9zZXMgYW5kIHNldHRpbmcgaW5pdGlhbCBpbnB1dHMgb2YgZGlyZWN0aXZlcy4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoaW5kZXgsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBhZGp1c3RlZEluZGV4KTsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2VsZW1lbnQgY29udGFpbmVycyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyA/CiAgICAgICAgZWxlbWVudENvbnRhaW5lclN0YXJ0Rmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSwgdHJ1ZSk7CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbmF0aXZlID0gbFZpZXdbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgIGxWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICduZy1jb250YWluZXInIDogJycpOwogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBuYXRpdmUsIHROb2RlKTsKICAgIGF0dGFjaFBhdGNoRGF0YShuYXRpdmUsIGxWaWV3KTsKICAgIGlmIChpc0RpcmVjdGl2ZUhvc3QodE5vZGUpKSB7CiAgICAgICAgY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgICAgICBleGVjdXRlQ29udGVudFF1ZXJpZXModFZpZXcsIHROb2RlLCBsVmlldyk7CiAgICB9CiAgICBpZiAobG9jYWxSZWZzSW5kZXggIT0gbnVsbCkgewogICAgICAgIHNhdmVSZXNvbHZlZExvY2Fsc0luRGF0YShsVmlldywgdE5vZGUpOwogICAgfQp9Ci8qKgogKiBNYXJrIHRoZSBlbmQgb2YgdGhlIDxuZy1jb250YWluZXI+LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgaWYgKGdldElzUGFyZW50KCkpIHsKICAgICAgICBzZXRJc05vdFBhcmVudCgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEhhc1BhcmVudChwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgfQogICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICByZWdpc3RlclBvc3RPcmRlckhvb2tzKHRWaWV3LCBwcmV2aW91c09yUGFyZW50VE5vZGUpOwogICAgICAgIGlmIChpc0NvbnRlbnRRdWVyeUhvc3QocHJldmlvdXNPclBhcmVudFROb2RlKSkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcucXVlcmllcykpLmVsZW1lbnRFbmQocHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYW4gZW1wdHkgbG9naWNhbCBjb250YWluZXIgdXNpbmcge1xAbGluayBlbGVtZW50Q29udGFpbmVyU3RhcnR9CiAqIGFuZCB7XEBsaW5rIGVsZW1lbnRDb250YWluZXJFbmR9CiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBjb250YWluZXIgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4IEluZGV4IG9mIHRoZSBjb250YWluZXIncyBsb2NhbCByZWZlcmVuY2VzIGluIHRoZSBgY29uc3RzYCBhcnJheS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyKGluZGV4LCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydChpbmRleCwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpOwogICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZW1iZWRkZWRfdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogTWFya3MgdGhlIHN0YXJ0IG9mIGFuIGVtYmVkZGVkIHZpZXcuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHZpZXdCbG9ja0lkIFRoZSBJRCBvZiB0aGlzIHZpZXcKICogQHBhcmFtIHs/fSBkZWNscwogKiBAcGFyYW0gez99IHZhcnMKICogQHJldHVybiB7P30gYm9vbGVhbiBXaGV0aGVyIG9yIG5vdCB0aGlzIHZpZXcgaXMgaW4gY3JlYXRpb24gbW9kZQogKgogKi8KZnVuY3Rpb24gybXJtWVtYmVkZGVkVmlld1N0YXJ0KHZpZXdCbG9ja0lkLCBkZWNscywgdmFycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvLyBUaGUgcHJldmlvdXMgbm9kZSBjYW4gYmUgYSB2aWV3IG5vZGUgaWYgd2UgYXJlIHByb2Nlc3NpbmcgYW4gaW5saW5lIGZvciBsb29wCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250YWluZXJUTm9kZSA9IHByZXZpb3VzT3JQYXJlbnRUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8gPwogICAgICAgICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSkgOgogICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbY29udGFpbmVyVE5vZGUuaW5kZXhdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUoY29udGFpbmVyVE5vZGUsIDAgLyogQ29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2aWV3VG9SZW5kZXIgPSBzY2FuRm9yVmlldyhsQ29udGFpbmVyLCBnZXRMQ29udGFpbmVyQWN0aXZlSW5kZXgobENvbnRhaW5lciksIHZpZXdCbG9ja0lkKTsKICAgIGlmICh2aWV3VG9SZW5kZXIpIHsKICAgICAgICBzZXRJc1BhcmVudCgpOwogICAgICAgIGVudGVyVmlldyh2aWV3VG9SZW5kZXIsIHZpZXdUb1JlbmRlcltUVklFV10ubm9kZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXaGVuIHdlIGNyZWF0ZSBhIG5ldyBMVmlldywgd2UgYWx3YXlzIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zLgogICAgICAgIHZpZXdUb1JlbmRlciA9IGNyZWF0ZUxWaWV3KGxWaWV3LCBnZXRPckNyZWF0ZUVtYmVkZGVkVFZpZXcodmlld0Jsb2NrSWQsIGRlY2xzLCB2YXJzLCAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGFpbmVyVE5vZGUpKSksIG51bGwsIDE2IC8qIENoZWNrQWx3YXlzICovLCBudWxsLCBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFBhcmVudE5vZGUgPSBnZXRJc1BhcmVudCgpID8gcHJldmlvdXNPclBhcmVudFROb2RlIDoKICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5wYXJlbnQ7CiAgICAgICAgYXNzaWduVFZpZXdOb2RlVG9MVmlldyh2aWV3VG9SZW5kZXJbVFZJRVddLCB0UGFyZW50Tm9kZSwgdmlld0Jsb2NrSWQsIHZpZXdUb1JlbmRlcik7CiAgICAgICAgZW50ZXJWaWV3KHZpZXdUb1JlbmRlciwgdmlld1RvUmVuZGVyW1RWSUVXXS5ub2RlKTsKICAgIH0KICAgIGlmIChsQ29udGFpbmVyKSB7CiAgICAgICAgaWYgKGlzQ3JlYXRpb25Nb2RlKHZpZXdUb1JlbmRlcikpIHsKICAgICAgICAgICAgLy8gaXQgaXMgYSBuZXcgdmlldywgaW5zZXJ0IGl0IGludG8gY29sbGVjdGlvbiBvZiB2aWV3cyBmb3IgYSBnaXZlbiBjb250YWluZXIKICAgICAgICAgICAgaW5zZXJ0Vmlldyh2aWV3VG9SZW5kZXJbVFZJRVddLCB2aWV3VG9SZW5kZXIsIGxDb250YWluZXIsIGdldExDb250YWluZXJBY3RpdmVJbmRleChsQ29udGFpbmVyKSk7CiAgICAgICAgfQogICAgICAgIGxDb250YWluZXJbQUNUSVZFX0lOREVYXSArPSAyIC8qIElOQ1JFTUVOVCAqLzsKICAgIH0KICAgIHJldHVybiBpc0NyZWF0aW9uTW9kZSh2aWV3VG9SZW5kZXIpID8gMSAvKiBDcmVhdGUgKi8gfCAyIC8qIFVwZGF0ZSAqLyA6CiAgICAgICAgMiAvKiBVcGRhdGUgKi87Cn0KLyoqCiAqIEluaXRpYWxpemUgdGhlIFRWaWV3IChlLmcuIHN0YXRpYyBkYXRhKSBmb3IgdGhlIGFjdGl2ZSBlbWJlZGRlZCB2aWV3LgogKgogKiBFYWNoIGVtYmVkZGVkIHZpZXcgYmxvY2sgbXVzdCBjcmVhdGUgb3IgcmV0cmlldmUgaXRzIG93biBUVmlldy4gT3RoZXJ3aXNlLCB0aGUgZW1iZWRkZWQgdmlldydzCiAqIHN0YXRpYyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgbm9kZSB3b3VsZCBvdmVyd3JpdGUgdGhlIHN0YXRpYyBkYXRhIGZvciBhIG5vZGUgaW4gdGhlIHZpZXcgYWJvdmUKICogaXQgd2l0aCB0aGUgc2FtZSBpbmRleCAoc2luY2UgaXQncyBpbiB0aGUgc2FtZSB0ZW1wbGF0ZSkuCiAqCiAqIEBwYXJhbSB7P30gdmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGUgVFZpZXcgaW4gVE5vZGUudFZpZXdzCiAqIEBwYXJhbSB7P30gZGVjbHMgVGhlIG51bWJlciBvZiBub2RlcywgbG9jYWwgcmVmcywgYW5kIHBpcGVzIGluIHRoaXMgdGVtcGxhdGUKICogQHBhcmFtIHs/fSB2YXJzIFRoZSBudW1iZXIgb2YgYmluZGluZ3MgYW5kIHB1cmUgZnVuY3Rpb24gYmluZGluZ3MgaW4gdGhpcyB0ZW1wbGF0ZQogKiBAcGFyYW0gez99IHBhcmVudAogKiBAcmV0dXJuIHs/fSBUVmlldwogKi8KZnVuY3Rpb24gZ2V0T3JDcmVhdGVFbWJlZGRlZFRWaWV3KHZpZXdJbmRleCwgZGVjbHMsIHZhcnMsIHBhcmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRMVmlldygpW1RWSUVXXTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZShwYXJlbnQsIDAgLyogQ29udGFpbmVyICovKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5lclRWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnQudFZpZXdzKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjb250YWluZXJUVmlld3MsICdUVmlldyBleHBlY3RlZCcpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKEFycmF5LmlzQXJyYXkoY29udGFpbmVyVFZpZXdzKSwgdHJ1ZSwgJ1RWaWV3cyBzaG91bGQgYmUgaW4gYW4gYXJyYXknKTsKICAgIGlmICh2aWV3SW5kZXggPj0gY29udGFpbmVyVFZpZXdzLmxlbmd0aCB8fCBjb250YWluZXJUVmlld3Nbdmlld0luZGV4XSA9PSBudWxsKSB7CiAgICAgICAgY29udGFpbmVyVFZpZXdzW3ZpZXdJbmRleF0gPSBjcmVhdGVUVmlldygyIC8qIEVtYmVkZGVkICovLCB2aWV3SW5kZXgsIG51bGwsIGRlY2xzLCB2YXJzLCB0Vmlldy5kaXJlY3RpdmVSZWdpc3RyeSwgdFZpZXcucGlwZVJlZ2lzdHJ5LCBudWxsLCBudWxsLCB0Vmlldy5jb25zdHMpOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5lclRWaWV3c1t2aWV3SW5kZXhdOwp9Ci8qKgogKiBMb29rcyBmb3IgYSB2aWV3IHdpdGggYSBnaXZlbiB2aWV3IGJsb2NrIGlkIGluc2lkZSBhIHByb3ZpZGVkIExDb250YWluZXIuCiAqIFJlbW92ZXMgdmlld3MgdGhhdCBuZWVkIHRvIGJlIGRlbGV0ZWQgaW4gdGhlIHByb2Nlc3MuCiAqCiAqIEBwYXJhbSB7P30gbENvbnRhaW5lciB0byBzZWFyY2ggZm9yIHZpZXdzCiAqIEBwYXJhbSB7P30gc3RhcnRJZHggc3RhcnRpbmcgaW5kZXggaW4gdGhlIHZpZXdzIGFycmF5IHRvIHNlYXJjaCBmcm9tCiAqIEBwYXJhbSB7P30gdmlld0Jsb2NrSWQgZXhhY3QgdmlldyBibG9jayBpZCB0byBsb29rIGZvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2NhbkZvclZpZXcobENvbnRhaW5lciwgc3RhcnRJZHgsIHZpZXdCbG9ja0lkKSB7CiAgICBmb3IgKGxldCBpID0gc3RhcnRJZHggKyBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGxDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgdmlld0F0UG9zaXRpb25JZCA9IGxDb250YWluZXJbaV1bVFZJRVddLmlkOwogICAgICAgIGlmICh2aWV3QXRQb3NpdGlvbklkID09PSB2aWV3QmxvY2tJZCkgewogICAgICAgICAgICByZXR1cm4gbENvbnRhaW5lcltpXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodmlld0F0UG9zaXRpb25JZCA8IHZpZXdCbG9ja0lkKSB7CiAgICAgICAgICAgIC8vIGZvdW5kIGEgdmlldyB0aGF0IHNob3VsZCBub3QgYmUgYXQgdGhpcyBwb3NpdGlvbiAtIHJlbW92ZQogICAgICAgICAgICByZW1vdmVWaWV3KGxDb250YWluZXIsIGkgLSBDT05UQUlORVJfSEVBREVSX09GRlNFVCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBmb3VuZCBhIHZpZXcgd2l0aCBpZCBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvcgogICAgICAgICAgICAvLyB3aGljaCBtZWFucyB0aGF0IHJlcXVpcmVkIHZpZXcgZG9lc24ndCBleGlzdCBhbmQgY2FuJ3QgYmUgZm91bmQgYXQKICAgICAgICAgICAgLy8gbGF0ZXIgcG9zaXRpb25zIGluIHRoZSB2aWV3cyBhcnJheSAtIHN0b3AgdGhlIHNlYXJjaGRlZi5jb250IGhlcmUKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIE1hcmtzIHRoZSBlbmQgb2YgYW4gZW1iZWRkZWQgdmlldy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1ZW1iZWRkZWRWaWV3RW5kKCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgdmlld0hvc3QgPSBsVmlld1tUX0hPU1RdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGxWaWV3W0NPTlRFWFRdOwogICAgaWYgKGlzQ3JlYXRpb25Nb2RlKGxWaWV3KSkgewogICAgICAgIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KTsgLy8gY3JlYXRpb24gbW9kZSBwYXNzCiAgICB9CiAgICByZWZyZXNoVmlldyh0VmlldywgbFZpZXcsIHRWaWV3LnRlbXBsYXRlLCBjb250ZXh0KTsgLy8gdXBkYXRlIG1vZGUgcGFzcwogICAgLy8gdXBkYXRlIG1vZGUgcGFzcwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lck9yVW5kZWZpbmVkKGxDb250YWluZXIpOwogICAgbGVhdmVWaWV3KCk7CiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdIb3N0KSksIGZhbHNlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvZ2V0X2N1cnJlbnRfdmlldy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0dXJucyB0aGUgY3VycmVudCBPcGFxdWVWaWV3U3RhdGUgaW5zdGFuY2UuCiAqCiAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcmVzdG9yZVZpZXcoKSBpbnN0cnVjdGlvbiB0byBzYXZlIGEgc25hcHNob3QKICogb2YgdGhlIGN1cnJlbnQgdmlldyBhbmQgcmVzdG9yZSBpdCB3aGVuIGxpc3RlbmVycyBhcmUgaW52b2tlZC4gVGhpcyBhbGxvd3MKICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Z2V0Q3VycmVudFZpZXcoKSB7CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChnZXRMVmlldygpKSkpKTsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBzaGFwZWQgbGlrZSBhIFByb21pc2UKICovCmZ1bmN0aW9uIGlzUHJvbWlzZSQxKG9iaikgewogICAgLy8gYWxsb3cgYW55IFByb21pc2UvQSsgY29tcGxpYW50IHRoZW5hYmxlLgogICAgLy8gSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IG9iai50aGVuIGNvbmZvcm1zIHRvIHRoZSBzcGVjCiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nOwp9Ci8qKgogKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIE9ic2VydmFibGUKICovCmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSQxKG9iaikgewogICAgLy8gVE9ETzogdXNlIGlzT2JzZXJ2YWJsZSBvbmNlIHdlIHVwZGF0ZSBwYXNzIHJ4anMgNi4xCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvQ0hBTkdFTE9HLm1kIzYxMC0yMDE4LTA1LTAzCiAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbic7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2xpc3RlbmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IG5vZGUuCiAqCiAqIElmIGFuIG91dHB1dCBleGlzdHMgb24gb25lIG9mIHRoZSBub2RlJ3MgZGlyZWN0aXZlcywgaXQgYWxzbyBzdWJzY3JpYmVzIHRvIHRoZSBvdXRwdXQKICogYW5kIHNhdmVzIHRoZSBzdWJzY3JpcHRpb24gZm9yIGxhdGVyIGNsZWFudXAuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudAogKiBAcGFyYW0gez99IGxpc3RlbmVyRm4gVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIGV2ZW50IGVtaXRzCiAqIEBwYXJhbSB7Pz19IHVzZUNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gdXNlIGNhcHR1cmUgaW4gZXZlbnQgbGlzdGVuZXIKICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlciBGdW5jdGlvbiB0aGF0IHJldHVybnMgZ2xvYmFsIHRhcmdldCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoaXMgbGlzdGVuZXIKICogc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGEgZ2xvYmFsIG9iamVjdCBsaWtlIHdpbmRvdywgZG9jdW1lbnQgb3IgYm9keQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgbGlzdGVuZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgdE5vZGUsIGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSwgZXZlbnRUYXJnZXRSZXNvbHZlcik7CiAgICByZXR1cm4gybXJtWxpc3RlbmVyOwp9Ci8qKgogKiBSZWdpc3RlcnMgYSBzeW50aGV0aWMgaG9zdCBsaXN0ZW5lciAoZS5nLiBgKFxAZm9vLnN0YXJ0KWApIG9uIGEgY29tcG9uZW50LgogKgogKiBUaGlzIGluc3RydWN0aW9uIGlzIGZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIGFuZCBpcyBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCBhCiAqIHN5bnRoZXRpYyBob3N0IGxpc3RlbmVyIChlLmcuIGBcQEhvc3RMaXN0ZW5lcignXEBmb28uc3RhcnQnKWApIHByb3Blcmx5IGdldHMgcmVuZGVyZWQKICogaW4gdGhlIGNvbXBvbmVudCdzIHJlbmRlcmVyLiBOb3JtYWxseSBhbGwgaG9zdCBsaXN0ZW5lcnMgYXJlIGV2YWx1YXRlZCB3aXRoIHRoZQogKiBwYXJlbnQgY29tcG9uZW50J3MgcmVuZGVyZXIsIGJ1dCwgaW4gdGhlIGNhc2Ugb2YgYW5pbWF0aW9uIFxAdHJpZ2dlcnMsIHRoZXkgbmVlZAogKiB0byBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgc3ViIGNvbXBvbmVudCdzIHJlbmRlcmVyIChiZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUKICogYW5pbWF0aW9uIHRyaWdnZXJzIGFyZSBkZWZpbmVkKS4KICoKICogRG8gbm90IHVzZSB0aGlzIGluc3RydWN0aW9uIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGBsaXN0ZW5lcmAuIFRoaXMgaW5zdHJ1Y3Rpb24KICogb25seSBleGlzdHMgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVmlld0VuZ2luZSdzIGhvc3QgYmluZGluZyBiZWhhdmlvci4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gZXZlbnROYW1lIE5hbWUgb2YgdGhlIGV2ZW50CiAqIEBwYXJhbSB7P30gbGlzdGVuZXJGbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZXZlbnQgZW1pdHMKICogQHBhcmFtIHs/PX0gdXNlQ2FwdHVyZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgY2FwdHVyZSBpbiBldmVudCBsaXN0ZW5lcgogKiBAcGFyYW0gez89fSBldmVudFRhcmdldFJlc29sdmVyIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBnbG9iYWwgdGFyZ2V0IGluZm9ybWF0aW9uIGluIGNhc2UgdGhpcyBsaXN0ZW5lcgogKiBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYSBnbG9iYWwgb2JqZWN0IGxpa2Ugd2luZG93LCBkb2N1bWVudCBvciBib2R5CiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIodE5vZGUsIGxWaWV3KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIGxpc3RlbmVySW50ZXJuYWwodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgdE5vZGUsIGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSwgZXZlbnRUYXJnZXRSZXNvbHZlcik7CiAgICByZXR1cm4gybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lcjsKfQovKioKICogQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgZ2l2ZW4gZWxlbWVudCBoYXMgYWxyZWFkeSBhbiBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIGFuCiAqIGV2ZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZS4gVGhlIFRWaWV3LmNsZWFudXAgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBmaW5kIG91dCB3aGljaCBldmVudHMKICogYXJlIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudC4KICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAqIEBwYXJhbSB7P30gdE5vZGVJZHgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZpbmRFeGlzdGluZ0xpc3RlbmVyKHRWaWV3LCBsVmlldywgZXZlbnROYW1lLCB0Tm9kZUlkeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgaWYgKHRDbGVhbnVwICE9IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsZWFudXBFdmVudE5hbWUgPSB0Q2xlYW51cFtpXTsKICAgICAgICAgICAgaWYgKGNsZWFudXBFdmVudE5hbWUgPT09IGV2ZW50TmFtZSAmJiB0Q2xlYW51cFtpICsgMV0gPT09IHROb2RlSWR4KSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2hpbmcgZXZlbnQgbmFtZSBvbiB0aGUgc2FtZSBub2RlIGJ1dCBpdCBtaWdodCBub3QgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAvLyByZWdpc3RlcmVkIHlldCwgc28gd2UgbXVzdCBleHBsaWNpdGx5IHZlcmlmeSBlbnRyaWVzIGluIHRoZSBMVmlldyBjbGVhbnVwIGRhdGEKICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZXMuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsQ2xlYW51cCA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tDTEVBTlVQXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJJZHhJbkxDbGVhbnVwID0gdENsZWFudXBbaSArIDJdOwogICAgICAgICAgICAgICAgcmV0dXJuIGxDbGVhbnVwLmxlbmd0aCA+IGxpc3RlbmVySWR4SW5MQ2xlYW51cCA/IGxDbGVhbnVwW2xpc3RlbmVySWR4SW5MQ2xlYW51cF0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRWaWV3LmNsZWFudXAgY2FuIGhhdmUgYSBtaXggb2YgNC1lbGVtZW50cyBlbnRyaWVzIChmb3IgZXZlbnQgaGFuZGxlciBjbGVhbnVwcykgb3IKICAgICAgICAgICAgLy8gMi1lbGVtZW50IGVudHJpZXMgKGZvciBkaXJlY3RpdmUgYW5kIHF1ZXJpZXMgZGVzdHJveSBob29rcykuIEFzIHN1Y2ggd2UgY2FuIGVuY291bnRlcgogICAgICAgICAgICAvLyBibG9ja3Mgb2YgNCBvciAyIGl0ZW1zIGluIHRoZSB0Vmlldy5jbGVhbnVwIGFuZCB0aGlzIGlzIHdoeSB3ZSBpdGVyYXRlIG92ZXIgMiBlbGVtZW50cwogICAgICAgICAgICAvLyBmaXJzdCBhbmQganVtcCBhbm90aGVyIDIgZWxlbWVudHMgaWYgd2UgZGV0ZWN0IGxpc3RlbmVycyBjbGVhbnVwICg0IGVsZW1lbnRzKS4gQWxzbyBjaGVjawogICAgICAgICAgICAvLyBkb2N1bWVudGF0aW9uIG9mIFRWaWV3LmNsZWFudXAgZm9yIG1vcmUgZGV0YWlscyBvZiB0aGlzIGRhdGEgc3RydWN0dXJlIGxheW91dC4KICAgICAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwRXZlbnROYW1lID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHJlbmRlcmVyCiAqIEBwYXJhbSB7P30gdE5vZGUKICogQHBhcmFtIHs/fSBldmVudE5hbWUKICogQHBhcmFtIHs/fSBsaXN0ZW5lckZuCiAqIEBwYXJhbSB7Pz19IHVzZUNhcHR1cmUKICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbGlzdGVuZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCB0Tm9kZSwgZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlID0gZmFsc2UsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzVE5vZGVEaXJlY3RpdmVIb3N0ID0gaXNEaXJlY3RpdmVIb3N0KHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZpcnN0Q3JlYXRlUGFzcyA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRDbGVhbnVwID0gZmlyc3RDcmVhdGVQYXNzICYmICh0Vmlldy5jbGVhbnVwIHx8ICh0Vmlldy5jbGVhbnVwID0gW10pKTsKICAgIC8vIFdoZW4gdGhlIMm1ybVsaXN0ZW5lciBpbnN0cnVjdGlvbiB3YXMgZ2VuZXJhdGVkIGFuZCBpcyBleGVjdXRlZCB3ZSBrbm93IHRoYXQgdGhlcmUgaXMgZWl0aGVyIGEKICAgIC8vIG5hdGl2ZSBsaXN0ZW5lciBvciBhIGRpcmVjdGl2ZSBvdXRwdXQgb24gdGhpcyBlbGVtZW50LiBBcyBzdWNoIHdlIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGhhdmUgdG8KICAgIC8vIHJlZ2lzdGVyIGEgbGlzdGVuZXIgYW5kIHN0b3JlIGl0cyBjbGVhbnVwIGZ1bmN0aW9uIG9uIExWaWV3LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbENsZWFudXAgPSBnZXRMQ2xlYW51cChsVmlldyk7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovLCA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByb2Nlc3NPdXRwdXRzID0gdHJ1ZTsKICAgIC8vIGFkZCBuYXRpdmUgZXZlbnQgbGlzdGVuZXIgLSBhcHBsaWNhYmxlIHRvIGVsZW1lbnRzIG9ubHkKICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNvbHZlZCA9IGV2ZW50VGFyZ2V0UmVzb2x2ZXIgPyBldmVudFRhcmdldFJlc29sdmVyKG5hdGl2ZSkgOiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfT0JKKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhcmdldCA9IHJlc29sdmVkLnRhcmdldCB8fCBuYXRpdmU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDbGVhbnVwSW5kZXggPSBsQ2xlYW51cC5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlkeE9yVGFyZ2V0R2V0dGVyID0gZXZlbnRUYXJnZXRSZXNvbHZlciA/CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfbFZpZXcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfbFZpZXcpID0+IGV2ZW50VGFyZ2V0UmVzb2x2ZXIodW53cmFwUk5vZGUoX2xWaWV3W3ROb2RlLmluZGV4XSkpLnRhcmdldCkgOgogICAgICAgICAgICB0Tm9kZS5pbmRleDsKICAgICAgICAvLyBJbiBvcmRlciB0byBtYXRjaCBjdXJyZW50IGJlaGF2aW9yLCBuYXRpdmUgRE9NIGV2ZW50IGxpc3RlbmVycyBtdXN0IGJlIGFkZGVkIGZvciBhbGwKICAgICAgICAvLyBldmVudHMgKGluY2x1ZGluZyBvdXRwdXRzKS4KICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIGNhc2VzIHdoZXJlIG11bHRpcGxlIGRpcmVjdGl2ZXMgb24gdGhlIHNhbWUgZWxlbWVudCB0cnkgdG8gcmVnaXN0ZXIgYW4gZXZlbnQKICAgICAgICAgICAgLy8gaGFuZGxlciBmdW5jdGlvbiBmb3IgdGhlIHNhbWUgZXZlbnQuIEluIHRoaXMgc2l0dWF0aW9uIHdlIHdhbnQgdG8gYXZvaWQgcmVnaXN0cmF0aW9uIG9mCiAgICAgICAgICAgIC8vIHNldmVyYWwgbmF0aXZlIGxpc3RlbmVycyBhcyBlYWNoIHJlZ2lzdHJhdGlvbiB3b3VsZCBiZSBpbnRlcmNlcHRlZCBieSBOZ1pvbmUgYW5kCiAgICAgICAgICAgIC8vIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi4gVGhpcyB3b3VsZCBtZWFuIHRoYXQgYSBzaW5nbGUgdXNlciBhY3Rpb24gd291bGQgcmVzdWx0IGluIHNldmVyYWwKICAgICAgICAgICAgLy8gY2hhbmdlIGRldGVjdGlvbnMgYmVpbmcgaW52b2tlZC4gVG8gYXZvaWQgdGhpcyBzaXR1YXRpb24gd2Ugd2FudCB0byBoYXZlIG9ubHkgb25lIGNhbGwgdG8KICAgICAgICAgICAgLy8gbmF0aXZlIGhhbmRsZXIgcmVnaXN0cmF0aW9uIChmb3IgdGhlIHNhbWUgZWxlbWVudCBhbmQgc2FtZSB0eXBlIG9mIGV2ZW50KS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gaGF2ZSBqdXN0IG9uZSBuYXRpdmUgZXZlbnQgaGFuZGxlciBpbiBwcmVzZW5jZSBvZiBtdWx0aXBsZSBoYW5kbGVyIGZ1bmN0aW9ucywKICAgICAgICAgICAgLy8gd2UganVzdCByZWdpc3RlciBhIGZpcnN0IGhhbmRsZXIgZnVuY3Rpb24gYXMgYSBuYXRpdmUgZXZlbnQgbGlzdGVuZXIgYW5kIHRoZW4gY2hhaW4KICAgICAgICAgICAgLy8gKGNvYWxlc2NlKSBvdGhlciBoYW5kbGVyIGZ1bmN0aW9ucyBvbiB0b3Agb2YgdGhlIGZpcnN0IG5hdGl2ZSBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBleGlzdGluZ0xpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgY29hbGVzY2luZyBkZXNjcmliZWQgaGVyZSBkb2Vzbid0IGhhcHBlbiBmb3IgZXZlbnRzIHNwZWNpZnlpbmcgYW4KICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdGFyZ2V0IChleC4gKGRvY3VtZW50OmNsaWNrKSkgLSB0aGlzIGlzIHRvIGtlZXAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQogICAgICAgICAgICAvLyB2aWV3IGVuZ2luZS4KICAgICAgICAgICAgLy8gQWxzbywgd2UgZG9uJ3QgaGF2ZSB0byBzZWFyY2ggZm9yIGV4aXN0aW5nIGxpc3RlbmVycyBpcyB0aGVyZSBhcmUgbm8gZGlyZWN0aXZlcwogICAgICAgICAgICAvLyBtYXRjaGluZyBvbiBhIGdpdmVuIG5vZGUgYXMgd2UgY2FuJ3QgcmVnaXN0ZXIgbXVsdGlwbGUgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBzYW1lIGV2ZW50IGluCiAgICAgICAgICAgIC8vIGEgdGVtcGxhdGUgKHRoaXMgd291bGQgbWVhbiBoYXZpbmcgZHVwbGljYXRlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICBpZiAoIWV2ZW50VGFyZ2V0UmVzb2x2ZXIgJiYgaXNUTm9kZURpcmVjdGl2ZUhvc3QpIHsKICAgICAgICAgICAgICAgIGV4aXN0aW5nTGlzdGVuZXIgPSBmaW5kRXhpc3RpbmdMaXN0ZW5lcih0VmlldywgbFZpZXcsIGV2ZW50TmFtZSwgdE5vZGUuaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleGlzdGluZ0xpc3RlbmVyICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBBdHRhY2ggYSBuZXcgbGlzdGVuZXIgdG8gY29hbGVzY2VkIGxpc3RlbmVycyBsaXN0LCBtYWludGFpbmluZyB0aGUgb3JkZXIgaW4gd2hpY2gKICAgICAgICAgICAgICAgIC8vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QKICAgICAgICAgICAgICAgIC8vIGxpc3RlbmVyIGluIHRoYXQgbGlzdCAoaW4gYF9fbmdMYXN0TGlzdGVuZXJGbl9fYCBmaWVsZCksIHNvIHdlIGNhbiBhdm9pZCBnb2luZyB0aHJvdWdoCiAgICAgICAgICAgICAgICAvLyB0aGUgZW50aXJlIHNldCBlYWNoIHRpbWUgd2UgbmVlZCB0byBhZGQgYSBuZXcgbGlzdGVuZXIuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsYXN0TGlzdGVuZXJGbiA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZXhpc3RpbmdMaXN0ZW5lcikpKS5fX25nTGFzdExpc3RlbmVyRm5fXyB8fCBleGlzdGluZ0xpc3RlbmVyOwogICAgICAgICAgICAgICAgbGFzdExpc3RlbmVyRm4uX19uZ05leHRMaXN0ZW5lckZuX18gPSBsaXN0ZW5lckZuOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChleGlzdGluZ0xpc3RlbmVyKSkpLl9fbmdMYXN0TGlzdGVuZXJGbl9fID0gbGlzdGVuZXJGbjsKICAgICAgICAgICAgICAgIHByb2Nlc3NPdXRwdXRzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgYXJndW1lbnQgb2YgYGxpc3RlbmAgZnVuY3Rpb24gaW4gUHJvY2VkdXJhbCBSZW5kZXJlciBpczoKICAgICAgICAgICAgICAgIC8vIC0gZWl0aGVyIGEgdGFyZ2V0IG5hbWUgKGFzIGEgc3RyaW5nKSBpbiBjYXNlIG9mIGdsb2JhbCB0YXJnZXQgKHdpbmRvdywgZG9jdW1lbnQsIGJvZHkpCiAgICAgICAgICAgICAgICAvLyAtIG9yIGVsZW1lbnQgcmVmZXJlbmNlIChpbiBhbGwgb3RoZXIgY2FzZXMpCiAgICAgICAgICAgICAgICBsaXN0ZW5lckZuID0gd3JhcExpc3RlbmVyKHROb2RlLCBsVmlldywgbGlzdGVuZXJGbiwgZmFsc2UgLyoqIHByZXZlbnREZWZhdWx0ICovKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBGbiA9IHJlbmRlcmVyLmxpc3RlbihyZXNvbHZlZC5uYW1lIHx8IHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lckZuKTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJBZGRFdmVudExpc3RlbmVyKys7CiAgICAgICAgICAgICAgICBsQ2xlYW51cC5wdXNoKGxpc3RlbmVyRm4sIGNsZWFudXBGbik7CiAgICAgICAgICAgICAgICB0Q2xlYW51cCAmJiB0Q2xlYW51cC5wdXNoKGV2ZW50TmFtZSwgaWR4T3JUYXJnZXRHZXR0ZXIsIGxDbGVhbnVwSW5kZXgsIGxDbGVhbnVwSW5kZXggKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGlzdGVuZXJGbiA9IHdyYXBMaXN0ZW5lcih0Tm9kZSwgbFZpZXcsIGxpc3RlbmVyRm4sIHRydWUgLyoqIHByZXZlbnREZWZhdWx0ICovKTsKICAgICAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZEV2ZW50TGlzdGVuZXIrKzsKICAgICAgICAgICAgbENsZWFudXAucHVzaChsaXN0ZW5lckZuKTsKICAgICAgICAgICAgdENsZWFudXAgJiYgdENsZWFudXAucHVzaChldmVudE5hbWUsIGlkeE9yVGFyZ2V0R2V0dGVyLCBsQ2xlYW51cEluZGV4LCB1c2VDYXB0dXJlKTsKICAgICAgICB9CiAgICB9CiAgICAvLyBzdWJzY3JpYmUgdG8gZGlyZWN0aXZlIG91dHB1dHMKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG91dHB1dHMgPSB0Tm9kZS5vdXRwdXRzOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHByb3BzOwogICAgaWYgKHByb2Nlc3NPdXRwdXRzICYmIG91dHB1dHMgIT09IG51bGwgJiYgKHByb3BzID0gb3V0cHV0c1tldmVudE5hbWVdKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgICBpZiAocHJvcHNMZW5ndGgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc0xlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICgvKiogQHR5cGUgez99ICovIChwcm9wc1tpXSkpOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtaW5pZmllZE5hbWUgPSBwcm9wc1tpICsgMV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVJbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IGRpcmVjdGl2ZUluc3RhbmNlW21pbmlmaWVkTmFtZV07CiAgICAgICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmICFpc09ic2VydmFibGUkMShvdXRwdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBAT3V0cHV0ICR7bWluaWZpZWROYW1lfSBub3QgaW5pdGlhbGl6ZWQgaW4gJyR7ZGlyZWN0aXZlSW5zdGFuY2UuY29uc3RydWN0b3IubmFtZX0nLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb3V0cHV0LnN1YnNjcmliZShsaXN0ZW5lckZuKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGxDbGVhbnVwLmxlbmd0aDsKICAgICAgICAgICAgICAgIGxDbGVhbnVwLnB1c2gobGlzdGVuZXJGbiwgc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIHRDbGVhbnVwICYmIHRDbGVhbnVwLnB1c2goZXZlbnROYW1lLCB0Tm9kZS5pbmRleCwgaWR4LCAtKGlkeCArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IGxpc3RlbmVyRm4KICogQHBhcmFtIHs/fSBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbGlzdGVuZXJGbiwgZSkgewogICAgdHJ5IHsKICAgICAgICAvLyBPbmx5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGZhbHNlIGZyb20gYSBsaXN0ZW5lciBzaG91bGQgcHJldmVudERlZmF1bHQKICAgICAgICByZXR1cm4gbGlzdGVuZXJGbihlKSAhPT0gZmFsc2U7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQovKioKICogV3JhcHMgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgbWFya3MgYW5jZXN0b3JzIGRpcnR5IGFuZCBwcmV2ZW50cyBkZWZhdWx0IGJlaGF2aW9yLAogKiBpZiBhcHBsaWNhYmxlLgogKgogKiBAcGFyYW0gez99IHROb2RlIFRoZSBUTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0ZW5lcgogKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB0aGF0IGNvbnRhaW5zIHRoaXMgbGlzdGVuZXIKICogQHBhcmFtIHs/fSBsaXN0ZW5lckZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAqIEBwYXJhbSB7P30gd3JhcFdpdGhQcmV2ZW50RGVmYXVsdCBXaGV0aGVyIG9yIG5vdCB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IKICogKHRoZSBwcm9jZWR1cmFsIHJlbmRlcmVyIGRvZXMgdGhpcyBhbHJlYWR5LCBzbyBpbiB0aG9zZSBjYXNlcywgd2Ugc2hvdWxkIHNraXApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB3cmFwTGlzdGVuZXIodE5vZGUsIGxWaWV3LCBsaXN0ZW5lckZuLCB3cmFwV2l0aFByZXZlbnREZWZhdWx0KSB7CiAgICAvLyBOb3RlOiB3ZSBhcmUgcGVyZm9ybWluZyBtb3N0IG9mIHRoZSB3b3JrIGluIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpdHNlbGYKICAgIC8vIHRvIG9wdGltaXplIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbi4KICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyYXBMaXN0ZW5lckluX21hcmtEaXJ0eUFuZFByZXZlbnREZWZhdWx0KGUpIHsKICAgICAgICAvLyBJdnkgdXNlcyBgRnVuY3Rpb25gIGFzIGEgc3BlY2lhbCB0b2tlbiB0aGF0IGFsbG93cyB1cyB0byB1bndyYXAgdGhlIGZ1bmN0aW9uCiAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgaW52b2tlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5IGBEZWJ1Z05vZGUudHJpZ2dlckV2ZW50SGFuZGxlcmAuCiAgICAgICAgaWYgKGUgPT09IEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckZuOwogICAgICAgIH0KICAgICAgICAvLyBJbiBvcmRlciB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIFZpZXcgRW5naW5lLCBldmVudHMgb24gY29tcG9uZW50IGhvc3Qgbm9kZXMKICAgICAgICAvLyBtdXN0IGFsc28gbWFyayB0aGUgY29tcG9uZW50IHZpZXcgaXRzZWxmIGRpcnR5IChpLmUuIHRoZSB2aWV3IHRoYXQgaXQgb3ducykuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0VmlldyA9IHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8gPwogICAgICAgICAgICBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KSA6CiAgICAgICAgICAgIGxWaWV3OwogICAgICAgIC8vIFNlZSBpbnRlcmZhY2VzL3ZpZXcudHMgZm9yIG1vcmUgb24gTFZpZXdGbGFncy5NYW51YWxPblB1c2gKICAgICAgICBpZiAoKGxWaWV3W0ZMQUdTXSAmIDMyIC8qIE1hbnVhbE9uUHVzaCAqLykgPT09IDApIHsKICAgICAgICAgICAgbWFya1ZpZXdEaXJ0eShzdGFydFZpZXcpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc3VsdCA9IGV4ZWN1dGVMaXN0ZW5lcldpdGhFcnJvckhhbmRsaW5nKGxWaWV3LCBsaXN0ZW5lckZuLCBlKTsKICAgICAgICAvLyBBIGp1c3QtaW52b2tlZCBsaXN0ZW5lciBmdW5jdGlvbiBtaWdodCBoYXZlIGNvYWxlc2NlZCBsaXN0ZW5lcnMgc28gd2UgbmVlZCB0byBjaGVjayBmb3IKICAgICAgICAvLyB0aGVpciBwcmVzZW5jZSBhbmQgaW52b2tlIGFzIG5lZWRlZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5leHRMaXN0ZW5lckZuID0gKCgvKiogQHR5cGUgez99ICovICh3cmFwTGlzdGVuZXJJbl9tYXJrRGlydHlBbmRQcmV2ZW50RGVmYXVsdCkpKS5fX25nTmV4dExpc3RlbmVyRm5fXzsKICAgICAgICB3aGlsZSAobmV4dExpc3RlbmVyRm4pIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHByZXZlbnQgZGVmYXVsdCBpZiBhbnkgb2YgdGhlIGxpc3RlbmVycyBleHBsaWNpdGx5IHJldHVybiBmYWxzZQogICAgICAgICAgICByZXN1bHQgPSBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbmV4dExpc3RlbmVyRm4sIGUpICYmIHJlc3VsdDsKICAgICAgICAgICAgbmV4dExpc3RlbmVyRm4gPSAoKC8qKiBAdHlwZSB7P30gKi8gKG5leHRMaXN0ZW5lckZuKSkpLl9fbmdOZXh0TGlzdGVuZXJGbl9fOwogICAgICAgIH0KICAgICAgICBpZiAod3JhcFdpdGhQcmV2ZW50RGVmYXVsdCAmJiByZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgLy8gTmVjZXNzYXJ5IGZvciBsZWdhY3kgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByZXZlbnREZWZhdWx0IChlLmcuIElFKQogICAgICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9KTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvbmFtZXNwYWNlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9uZXh0X2NvbnRleHQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJldHJpZXZlcyBhIGNvbnRleHQgYXQgdGhlIGxldmVsIHNwZWNpZmllZCBhbmQgc2F2ZXMgaXQgYXMgdGhlIGdsb2JhbCwgY29udGV4dFZpZXdEYXRhLgogKiBXaWxsIGdldCB0aGUgbmV4dCBsZXZlbCB1cCBpZiBsZXZlbCBpcyBub3Qgc3BlY2lmaWVkLgogKgogKiBUaGlzIGlzIHVzZWQgdG8gc2F2ZSBjb250ZXh0cyBvZiBwYXJlbnQgdmlld3Mgc28gdGhleSBjYW4gYmUgYm91bmQgaW4gZW1iZWRkZWQgdmlld3MsIG9yCiAqIGluIGNvbmp1bmN0aW9uIHdpdGggcmVmZXJlbmNlKCkgdG8gYmluZCBhIHJlZiBmcm9tIGEgcGFyZW50IHZpZXcuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez89fSBsZXZlbCBUaGUgcmVsYXRpdmUgbGV2ZWwgb2YgdGhlIHZpZXcgZnJvbSB3aGljaCB0byBncmFiIGNvbnRleHQgY29tcGFyZWQgdG8gY29udGV4dFZld0RhdGEKICogQHJldHVybiB7P30gY29udGV4dAogKgogKi8KZnVuY3Rpb24gybXJtW5leHRDb250ZXh0KGxldmVsID0gMSkgewogICAgcmV0dXJuIG5leHRDb250ZXh0SW1wbChsZXZlbCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3Byb2plY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENoZWNrcyBhIGdpdmVuIG5vZGUgYWdhaW5zdCBtYXRjaGluZyBwcm9qZWN0aW9uIHNsb3RzIGFuZCByZXR1cm5zIHRoZQogKiBkZXRlcm1pbmVkIHNsb3QgaW5kZXguIFJldHVybnMgIm51bGwiIGlmIG5vIHNsb3QgbWF0Y2hlZCB0aGUgZ2l2ZW4gbm9kZS4KICoKICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHBhcnNlZCBuZ1Byb2plY3RBcyBzZWxlY3RvciBmcm9tIHRoZQogKiBub2RlJ3MgYXR0cmlidXRlcy4gSWYgcHJlc2VudCwgaXQgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBuZ1Byb2plY3RBcyBzZWxlY3RvcgogKiBtYXRjaGVzIGFueSBvZiB0aGUgcHJvamVjdGlvbiBzbG90IHNlbGVjdG9ycy4KICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHByb2plY3Rpb25TbG90cwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0Y2hpbmdQcm9qZWN0aW9uU2xvdEluZGV4KHROb2RlLCBwcm9qZWN0aW9uU2xvdHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nUHJvamVjdEFzQXR0clZhbCA9IGdldFByb2plY3RBc0F0dHJWYWx1ZSh0Tm9kZSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2plY3Rpb25TbG90cy5sZW5ndGg7IGkrKykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90VmFsdWUgPSBwcm9qZWN0aW9uU2xvdHNbaV07CiAgICAgICAgLy8gVGhlIGxhc3Qgd2lsZGNhcmQgcHJvamVjdGlvbiBzbG90IHNob3VsZCBtYXRjaCBhbGwgbm9kZXMgd2hpY2ggYXJlbid0IG1hdGNoaW5nCiAgICAgICAgLy8gYW55IHNlbGVjdG9yLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHZpZXcgZW5naW5lLgogICAgICAgIGlmIChzbG90VmFsdWUgPT09ICcqJykgewogICAgICAgICAgICB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gaTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIC8vIElmIHdlIHJhbiBpbnRvIGFuIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlLCB3ZSBzaG91bGQgbWF0Y2ggaXRzIHBhcnNlZCBzZWxlY3RvcgogICAgICAgIC8vIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycywgb3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byBtYXRjaGluZyBhZ2FpbnN0IHRoZSBub2RlLgogICAgICAgIGlmIChuZ1Byb2plY3RBc0F0dHJWYWwgPT09IG51bGwgPwogICAgICAgICAgICBpc05vZGVNYXRjaGluZ1NlbGVjdG9yTGlzdCh0Tm9kZSwgc2xvdFZhbHVlLCAvKiBpc1Byb2plY3Rpb25Nb2RlICovIHRydWUpIDoKICAgICAgICAgICAgaXNTZWxlY3RvckluU2VsZWN0b3JMaXN0KG5nUHJvamVjdEFzQXR0clZhbCwgc2xvdFZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gaTsgLy8gZmlyc3QgbWF0Y2hpbmcgc2VsZWN0b3IgImNhcHR1cmVzIiBhIGdpdmVuIG5vZGUKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gd2lsZGNhcmROZ0NvbnRlbnRJbmRleDsKfQovKioKICogSW5zdHJ1Y3Rpb24gdG8gZGlzdHJpYnV0ZSBwcm9qZWN0YWJsZSBub2RlcyBhbW9uZyA8bmctY29udGVudD4gb2NjdXJyZW5jZXMgaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICogSXQgdGFrZXMgYWxsIHRoZSBzZWxlY3RvcnMgZnJvbSB0aGUgZW50aXJlIGNvbXBvbmVudCdzIHRlbXBsYXRlIGFuZCBkZWNpZGVzIHdoZXJlCiAqIGVhY2ggcHJvamVjdGVkIG5vZGUgYmVsb25ncyAoaXQgcmUtZGlzdHJpYnV0ZXMgbm9kZXMgYW1vbmcgImJ1Y2tldHMiIHdoZXJlIGVhY2ggImJ1Y2tldCIgaXMKICogYmFja2VkIGJ5IGEgc2VsZWN0b3IpLgogKgogKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIENTUyBzZWxlY3RvcnMgdG8gYmUgcHJvdmlkZWQgaW4gMiBmb3JtczogcGFyc2VkIChieSBhIGNvbXBpbGVyKSBhbmQgdGV4dCwKICogdW4tcGFyc2VkIGZvcm0uCiAqCiAqIFRoZSBwYXJzZWQgZm9ybSBpcyBuZWVkZWQgZm9yIGVmZmljaWVudCBtYXRjaGluZyBvZiBhIG5vZGUgYWdhaW5zdCBhIGdpdmVuIENTUyBzZWxlY3Rvci4KICogVGhlIHVuLXBhcnNlZCwgdGV4dHVhbCBmb3JtIGlzIG5lZWRlZCBmb3Igc3VwcG9ydCBvZiB0aGUgbmdQcm9qZWN0QXMgYXR0cmlidXRlLgogKgogKiBIYXZpbmcgYSBDU1Mgc2VsZWN0b3IgaW4gMiBkaWZmZXJlbnQgZm9ybWF0cyBpcyBub3QgaWRlYWwsIGJ1dCBhbHRlcm5hdGl2ZXMgaGF2ZSBldmVuIG1vcmUKICogZHJhd2JhY2tzOgogKiAtIGhhdmluZyBvbmx5IGEgdGV4dHVhbCBmb3JtIHdvdWxkIHJlcXVpcmUgcnVudGltZSBwYXJzaW5nIG9mIENTUyBzZWxlY3RvcnM7CiAqIC0gd2UgY2FuJ3QgaGF2ZSBvbmx5IGEgcGFyc2VkIGFzIHdlIGNhbid0IHJlLWNvbnN0cnVjdCB0ZXh0dWFsIGZvcm0gZnJvbSBpdCAoYXMgZW50ZXJlZCBieSBhCiAqIHRlbXBsYXRlIGF1dGhvcikuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez89fSBwcm9qZWN0aW9uU2xvdHMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVwcm9qZWN0aW9uRGVmKHByb2plY3Rpb25TbG90cykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcG9uZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRMVmlldygpW0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXVtUX0hPU1RdKSk7CiAgICBpZiAoIWNvbXBvbmVudE5vZGUucHJvamVjdGlvbikgewogICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHByb2plY3Rpb24gc2xvdHMgYXJlIGRlZmluZWQsIGZhbGwgYmFjayB0byBhIHNpbmdsZQogICAgICAgIC8vIHByb2plY3Rpb24gc2xvdCB3aXRoIHRoZSB3aWxkY2FyZCBzZWxlY3Rvci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbnVtUHJvamVjdGlvblNsb3RzID0gcHJvamVjdGlvblNsb3RzID8gcHJvamVjdGlvblNsb3RzLmxlbmd0aCA6IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb2plY3Rpb25IZWFkcyA9IGNvbXBvbmVudE5vZGUucHJvamVjdGlvbiA9CiAgICAgICAgICAgIG5ld0FycmF5KG51bVByb2plY3Rpb25TbG90cywgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhaWxzID0gcHJvamVjdGlvbkhlYWRzLnNsaWNlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb21wb25lbnRDaGlsZCA9IGNvbXBvbmVudE5vZGUuY2hpbGQ7CiAgICAgICAgd2hpbGUgKGNvbXBvbmVudENoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2xvdEluZGV4ID0gcHJvamVjdGlvblNsb3RzID8gbWF0Y2hpbmdQcm9qZWN0aW9uU2xvdEluZGV4KGNvbXBvbmVudENoaWxkLCBwcm9qZWN0aW9uU2xvdHMpIDogMDsKICAgICAgICAgICAgaWYgKHNsb3RJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHRhaWxzW3Nsb3RJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGFpbHNbc2xvdEluZGV4XSkpLnByb2plY3Rpb25OZXh0ID0gY29tcG9uZW50Q2hpbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSGVhZHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGFpbHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbXBvbmVudENoaWxkID0gY29tcG9uZW50Q2hpbGQubmV4dDsKICAgICAgICB9CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgZGVsYXlQcm9qZWN0aW9uID0gZmFsc2U7Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXREZWxheVByb2plY3Rpb24odmFsdWUpIHsKICAgIGRlbGF5UHJvamVjdGlvbiA9IHZhbHVlOwp9Ci8qKgogKiBJbnNlcnRzIHByZXZpb3VzbHkgcmUtZGlzdHJpYnV0ZWQgcHJvamVjdGVkIG5vZGVzLiBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBjYWxsCiAqIHRvIHRoZSBwcm9qZWN0aW9uRGVmIGluc3RydWN0aW9uLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICogQHBhcmFtIHs/PX0gc2VsZWN0b3JJbmRleAogKiBAcGFyYW0gez89fSBhdHRycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXByb2plY3Rpb24obm9kZUluZGV4LCBzZWxlY3RvckluZGV4ID0gMCwgYXR0cnMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRQcm9qZWN0aW9uTm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIGxWaWV3W1RfSE9TVF0sIG5vZGVJbmRleCwgMSAvKiBQcm9qZWN0aW9uICovLCBudWxsLCBhdHRycyB8fCBudWxsKTsKICAgIC8vIFdlIGNhbid0IHVzZSB2aWV3RGF0YVtIT1NUX05PREVdIGJlY2F1c2UgcHJvamVjdGlvbiBub2RlcyBjYW4gYmUgbmVzdGVkIGluIGVtYmVkZGVkIHZpZXdzLgogICAgaWYgKHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID09PSBudWxsKQogICAgICAgIHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID0gc2VsZWN0b3JJbmRleDsKICAgIC8vIGA8bmctY29udGVudD5gIGhhcyBubyBjb250ZW50CiAgICBzZXRJc05vdFBhcmVudCgpOwogICAgLy8gV2UgbWlnaHQgbmVlZCB0byBkZWxheSB0aGUgcHJvamVjdGlvbiBvZiBub2RlcyBpZiB0aGV5IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIGkxOG4gYmxvY2sKICAgIGlmICghZGVsYXlQcm9qZWN0aW9uKSB7CiAgICAgICAgLy8gcmUtZGlzdHJpYnV0aW9uIG9mIHByb2plY3RhYmxlIG5vZGVzIGlzIHN0b3JlZCBvbiBhIGNvbXBvbmVudCdzIHZpZXcgbGV2ZWwKICAgICAgICBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCB0UHJvamVjdGlvbk5vZGUpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9wcm9wZXJ0eV9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBhIGxvbmUgYm91bmQgdmFsdWUKICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQsIGFuIG5vIGFkZGl0aW9uYWwgdGV4dAogKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0ie3t2MH19Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCd0aXRsZScsIHYwKTsKICogYGBgCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZQogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZShwcm9wTmFtZSwgdjAsIHNhbml0aXplcikgewogICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKHByb3BOYW1lLCAnJywgdjAsICcnLCBzYW5pdGl6ZXIpOwogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICoKICogYGBgdHMKICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYFxASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMShwcm9wTmFtZSwgcHJlZml4LCB2MCwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMSwgcHJlZml4LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggMiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTIoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24yKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMiwgcHJlZml4LCBpMCwgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTI7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMygKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUzKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjMobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDMsIHByZWZpeCwgaTAsIGkxLCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMzsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCgKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplciwgZmFsc2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA0LCBwcmVmaXgsIGkwLCBpMSwgaTIsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNSgKICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNSwgcHJlZml4LCBpMCwgaTEsIGkyLCBpMywgc3VmZml4KTsKICAgIH0KICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTU7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNigKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU2KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDYsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBzdWZmaXgpOwogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNjsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNygKICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplciwgZmFsc2UpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA3LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAqCiAqIGBgYHRzCiAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOCgKICogICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYFxASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOChwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgsIHNhbml0aXplcikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDgsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIHN1ZmZpeCk7CiAgICB9CiAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4Owp9Ci8qKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogKgogKiBgYGB0cwogKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYoCiAqICAndGl0bGUnLCBbJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnLScsIHY5LAogKiAgJ3N1ZmZpeCddKTsKICogYGBgCiAqCiAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbmJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aCBhCiAqIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYocHJvcE5hbWUsIHZhbHVlcywgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb25JbkJldHdlZW4gPSBbdmFsdWVzWzBdXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIGludGVycG9sYXRpb25JbkJldHdlZW4ucHVzaCh2YWx1ZXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIGludGVycG9sYXRpb25JbkJldHdlZW4ubGVuZ3RoICsgMSwgLi4uaW50ZXJwb2xhdGlvbkluQmV0d2Vlbik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogVGhpcyBmaWxlIGNvbnRhaW5zIHJldXNlYWJsZSAiZW1wdHkiIHN5bWJvbHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0IHJldHVybiB2YWx1ZXMKICogaW4gZGlmZmVyZW50IHBhcnRzIG9mIHRoZSByZW5kZXJpbmcgY29kZS4gQmVjYXVzZSB0aGUgc2FtZSBzeW1ib2xzIGFyZSByZXR1cm5lZCwgdGhpcwogKiBhbGxvd3MgZm9yIGlkZW50aXR5IGNoZWNrcyBhZ2FpbnN0IHRoZXNlIHZhbHVlcyB0byBiZSBjb25zaXN0ZW50bHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrCiAqIGNvZGUuCiAqLwpjb25zdCBFTVBUWV9PQkokMSA9IHt9Owpjb25zdCBFTVBUWV9BUlJBWSQzID0gW107Ci8vIGZyZWV6aW5nIHRoZSB2YWx1ZXMgcHJldmVudHMgYW55IGNvZGUgZnJvbSBhY2NpZGVudGFsbHkgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMgaW4KaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0Rldk1vZGUgd2lsbCBiZSBzZXQgdG8gZmFsc2UKICAgIC8vIHdoZW4gb3B0aW1pemluZyBjb2RlIGFuZCB0aGUgd2hvbGUgaWYgc3RhdGVtZW50IHdpbGwgYmUgZHJvcHBlZC4KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIE9iamVjdC5mcmVlemUoRU1QVFlfT0JKJDEpOwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2VzcwogICAgT2JqZWN0LmZyZWV6ZShFTVBUWV9BUlJBWSQzKTsKfQovKioKICogSW5zZXJ0IG5ldyBgdFN0eWxlVmFsdWVgIGF0IGBURGF0YWAgYW5kIGxpbmsgZXhpc3Rpbmcgc3R5bGUgYmluZGluZ3Mgc3VjaCB0aGF0IHdlIG1haW50YWluIGxpbmtlZAogKiBsaXN0IG9mIHN0eWxlcyBhbmQgY29tcHV0ZSB0aGUgZHVwbGljYXRlIGZsYWcuCiAqCiAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZHVyaW5nIGBmaXJzdFVwZGF0ZVBhc3NgIG9ubHkgdG8gcG9wdWxhdGUgdGhlIGBUVmlldy5kYXRhYC4KICoKICogVGhlIGZ1bmN0aW9uIHdvcmtzIGJ5IGtlZXBpbmcgdHJhY2sgb2YgYHRTdHlsaW5nUmFuZ2VgIHdoaWNoIGNvbnRhaW5zIHR3byBwb2ludGVycyBwb2ludGluZyB0bwogKiB0aGUgaGVhZC90YWlsIG9mIHRoZSB0ZW1wbGF0ZSBwb3J0aW9uIG9mIHRoZSBzdHlsZXMuCiAqICAtIGlmIGBpc0hvc3QgPT09IGZhbHNlYCAod2UgYXJlIHRlbXBsYXRlKSB0aGVuIGluc2VydGlvbiBpcyBhdCB0YWlsIG9mIGBUU3R5bGluZ1JhbmdlYAogKiAgLSBpZiBgaXNIb3N0ID09PSB0cnVlYCAod2UgYXJlIGhvc3QgYmluZGluZykgdGhlbiBpbnNlcnRpb24gaXMgYXQgaGVhZCBvZiBgVFN0eWxpbmdSYW5nZWAKICoKICogQHBhcmFtIHs/fSB0RGF0YSBUaGUgYFREYXRhYCB0byBpbnNlcnQgaW50by4KICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3R5bGluZyBlbGVtZW50LgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5V2l0aFN0YXRpYwogKiBAcGFyYW0gez99IGluZGV4IGxvY2F0aW9uIG9mIHdoZXJlIGB0U3R5bGVWYWx1ZWAgc2hvdWxkIGJlIHN0b3JlZCAoYW5kIGxpbmtlZCBpbnRvIGxpc3QuKQogKiBAcGFyYW0gez99IGlzSG9zdEJpbmRpbmcgYHRydWVgIGlmIHRoZSBpbnNlcnRpb24gaXMgZm9yIGEgYGhvc3RCaW5kaW5nYC4gKGluc2VydGlvbiBpcyBpbiBmcm9udCBvZgogKiAgICAgICAgICAgICAgIHRlbXBsYXRlLikKICogQHBhcmFtIHs/fSBpc0NsYXNzQmluZGluZyBUcnVlIGlmIHRoZSBhc3NvY2lhdGVkIGB0U3R5bGluZ0tleWAgYXMgYSBgY2xhc3NgIHN0eWxpbmcuCiAqICAgICAgICAgICAgICAgICAgICAgICBgdE5vZGUuY2xhc3NCaW5kaW5nc2Agc2hvdWxkIGJlIHVzZWQgKG9yIGB0Tm9kZS5zdHlsZUJpbmRpbmdzYCBvdGhlcndpc2UuKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zZXJ0VFN0eWxpbmdCaW5kaW5nKHREYXRhLCB0Tm9kZSwgdFN0eWxpbmdLZXlXaXRoU3RhdGljLCBpbmRleCwgaXNIb3N0QmluZGluZywgaXNDbGFzc0JpbmRpbmcpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdFVwZGF0ZVBhc3MoZ2V0VFZpZXcoKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdEJpbmRpbmdzID0gaXNDbGFzc0JpbmRpbmcgPyB0Tm9kZS5jbGFzc0JpbmRpbmdzIDogdE5vZGUuc3R5bGVCaW5kaW5nczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0bXBsSGVhZCA9IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRCaW5kaW5ncyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdG1wbFRhaWwgPSBnZXRUU3R5bGluZ1JhbmdlTmV4dCh0QmluZGluZ3MpOwogICAgdERhdGFbaW5kZXhdID0gdFN0eWxpbmdLZXlXaXRoU3RhdGljOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSBmYWxzZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0U3R5bGluZ0tleTsKICAgIGlmIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5V2l0aFN0YXRpYykpIHsKICAgICAgICAvLyBXZSBhcmUgY2FzZSB3aGVuIHRoZSBgVFN0eWxpbmdLZXlgIGNvbnRhaW5zIHN0YXRpYyBmaWVsZHMgYXMgd2VsbC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhdGljS2V5VmFsdWVBcnJheSA9ICgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ0tleVdpdGhTdGF0aWMpKTsKICAgICAgICB0U3R5bGluZ0tleSA9IHN0YXRpY0tleVZhbHVlQXJyYXlbMV07IC8vIHVud3JhcC4KICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGlmIG91ciBrZXkgaXMgcHJlc2VudCBpbiB0aGUgc3RhdGljIHNvIHRoYXQgd2UgY2FuIG1hcmsgaXQgYXMgZHVwbGljYXRlLgogICAgICAgIGlmICh0U3R5bGluZ0tleSA9PT0gbnVsbCB8fAogICAgICAgICAgICBrZXlWYWx1ZUFycmF5SW5kZXhPZihzdGF0aWNLZXlWYWx1ZUFycmF5LCAoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdLZXkpKSkgPiAwKSB7CiAgICAgICAgICAgIC8vIHRTdHlsaW5nS2V5IGlzIHByZXNlbnQgaW4gdGhlIHN0YXRpY3MsIG5lZWQgdG8gbWFyayBpdCBhcyBkdXBsaWNhdGUuCiAgICAgICAgICAgIGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIHRTdHlsaW5nS2V5ID0gdFN0eWxpbmdLZXlXaXRoU3RhdGljOwogICAgfQogICAgaWYgKGlzSG9zdEJpbmRpbmcpIHsKICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGhvc3QgYmluZGluZ3MKICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRlbXBsYXRlIGJpbmRpbmdzIHRoZW4gYHRhaWxgIGlzIDAuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc1RlbXBsYXRlQmluZGluZ3MgPSB0bXBsVGFpbCAhPT0gMDsKICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCB0byBrbm93IGJlY2F1c2UgdGhhdCBtZWFucyB0aGF0IHRoZSBgaGVhZGAgY2FuJ3QgcG9pbnQgdG8gdGhlIGZpcnN0CiAgICAgICAgLy8gdGVtcGxhdGUgYmluZGluZ3MgKHRoZXJlIGFyZSBub25lLikgSW5zdGVhZCB0aGUgaGVhZCBwb2ludHMgdG8gdGhlIHRhaWwgb2YgdGhlIHRlbXBsYXRlLgogICAgICAgIGlmIChoYXNUZW1wbGF0ZUJpbmRpbmdzKSB7CiAgICAgICAgICAgIC8vIHRlbXBsYXRlIGhlYWQncyAicHJldiIgd2lsbCBwb2ludCB0byBsYXN0IGhvc3QgYmluZGluZyBvciB0byAwIGlmIG5vIGhvc3QgYmluZGluZ3MgeWV0CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlID0gZ2V0VFN0eWxpbmdSYW5nZVByZXYoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxIZWFkICsgMV0pKSk7CiAgICAgICAgICAgIHREYXRhW2luZGV4ICsgMV0gPSB0b1RTdHlsaW5nUmFuZ2UocHJldmlvdXNOb2RlLCB0bXBsSGVhZCk7CiAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgIC8vIGJpbmRpbmcgdG8gcG9pbnQgdG8gdGhpcyBvbmUKICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9kZSAhPT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHRlbXBsYXRlLXRhaWwgdmFsdWUgdG8gcG9pbnQgdG8gdXMuCiAgICAgICAgICAgICAgICB0RGF0YVtwcmV2aW91c05vZGUgKyAxXSA9CiAgICAgICAgICAgICAgICAgICAgc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3ByZXZpb3VzTm9kZSArIDFdKSksIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgInByZXZpb3VzIiBvZiB0aGUgdGVtcGxhdGUgYmluZGluZyBoZWFkIHNob3VsZCBwb2ludCB0byB0aGlzIGhvc3QgYmluZGluZwogICAgICAgICAgICB0RGF0YVt0bXBsSGVhZCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZVByZXYoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxIZWFkICsgMV0pKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHRvVFN0eWxpbmdSYW5nZSh0bXBsSGVhZCwgMCk7CiAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgIC8vIGJpbmRpbmcgdG8gcG9pbnQgdG8gdGhpcyBvbmUKICAgICAgICAgICAgaWYgKHRtcGxIZWFkICE9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUtdGFpbCB2YWx1ZSB0byBwb2ludCB0byB1cy4KICAgICAgICAgICAgICAgIHREYXRhW3RtcGxIZWFkICsgMV0gPSBzZXRUU3R5bGluZ1JhbmdlTmV4dCgoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbdG1wbEhlYWQgKyAxXSkpLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSB0ZW1wbGF0ZSwgdGhlIGhlYWQgcG9pbnRzIHRvIHRlbXBsYXRlLXRhaWwsIGFuZCBuZWVkcyB0byBiZSBhZHZhbmNlZC4KICAgICAgICAgICAgdG1wbEhlYWQgPSBpbmRleDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSBhcmUgaW5zZXJ0aW5nIGluIHRlbXBsYXRlIHNlY3Rpb24uCiAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhpcyBiaW5kaW5nJ3MgInByZXZpb3VzIiB0byB0aGUgY3VycmVudCB0ZW1wbGF0ZSB0YWlsCiAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHRvVFN0eWxpbmdSYW5nZSh0bXBsVGFpbCwgMCk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKHRtcGxIZWFkICE9PSAwICYmIHRtcGxUYWlsID09PSAwLCBmYWxzZSwgJ0FkZGluZyB0ZW1wbGF0ZSBiaW5kaW5ncyBhZnRlciBob3N0QmluZGluZ3MgaXMgbm90IGFsbG93ZWQuJyk7CiAgICAgICAgaWYgKHRtcGxIZWFkID09PSAwKSB7CiAgICAgICAgICAgIHRtcGxIZWFkID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgcHJldmlvdXMgdmFsdWUgIm5leHQiIHRvIHBvaW50IHRvIHRoaXMgYmluZGluZwogICAgICAgICAgICB0RGF0YVt0bXBsVGFpbCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxUYWlsICsgMV0pKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICB0bXBsVGFpbCA9IGluZGV4OwogICAgfQogICAgLy8gTm93IHdlIG5lZWQgdG8gdXBkYXRlIC8gY29tcHV0ZSB0aGUgZHVwbGljYXRlcy4KICAgIC8vIFN0YXJ0aW5nIHdpdGggb3VyIGxvY2F0aW9uIHNlYXJjaCB0b3dhcmRzIGhlYWQgKGxlYXN0IHByaW9yaXR5KQogICAgaWYgKGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMpIHsKICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKSk7CiAgICB9CiAgICBtYXJrRHVwbGljYXRlcyh0RGF0YSwgdFN0eWxpbmdLZXksIGluZGV4LCB0cnVlKTsKICAgIG1hcmtEdXBsaWNhdGVzKHREYXRhLCB0U3R5bGluZ0tleSwgaW5kZXgsIGZhbHNlKTsKICAgIG1hcmtEdXBsaWNhdGVPZlJlc2lkdWFsU3R5bGluZyh0Tm9kZSwgdFN0eWxpbmdLZXksIHREYXRhLCBpbmRleCwgaXNDbGFzc0JpbmRpbmcpOwogICAgdEJpbmRpbmdzID0gdG9UU3R5bGluZ1JhbmdlKHRtcGxIZWFkLCB0bXBsVGFpbCk7CiAgICBpZiAoaXNDbGFzc0JpbmRpbmcpIHsKICAgICAgICB0Tm9kZS5jbGFzc0JpbmRpbmdzID0gdEJpbmRpbmdzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdE5vZGUuc3R5bGVCaW5kaW5ncyA9IHRCaW5kaW5nczsKICAgIH0KfQovKioKICogTG9vayBpbnRvIHRoZSByZXNpZHVhbCBzdHlsaW5nIHRvIHNlZSBpZiB0aGUgY3VycmVudCBgdFN0eWxpbmdLZXlgIGlzIGR1cGxpY2F0ZSBvZiByZXNpZHVhbC4KICoKICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIHdoZXJlIHRoZSByZXNpZHVhbCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdFN0eWxpbmdLZXkgYFRTdHlsaW5nS2V5YCB0byBzdG9yZS4KICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgTFZpZXdgLgogKiBAcGFyYW0gez99IGluZGV4IGxvY2F0aW9uIG9mIHdoZXJlIGB0U3R5bGVWYWx1ZWAgc2hvdWxkIGJlIHN0b3JlZCAoYW5kIGxpbmtlZCBpbnRvIGxpc3QuKQogKiBAcGFyYW0gez99IGlzQ2xhc3NCaW5kaW5nIFRydWUgaWYgdGhlIGFzc29jaWF0ZWQgYHRTdHlsaW5nS2V5YCBhcyBhIGBjbGFzc2Agc3R5bGluZy4KICogICAgICAgICAgICAgICAgICAgICAgIGB0Tm9kZS5jbGFzc0JpbmRpbmdzYCBzaG91bGQgYmUgdXNlZCAob3IgYHROb2RlLnN0eWxlQmluZGluZ3NgIG90aGVyd2lzZS4pCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtYXJrRHVwbGljYXRlT2ZSZXNpZHVhbFN0eWxpbmcodE5vZGUsIHRTdHlsaW5nS2V5LCB0RGF0YSwgaW5kZXgsIGlzQ2xhc3NCaW5kaW5nKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXNpZHVhbCA9IGlzQ2xhc3NCaW5kaW5nID8gdE5vZGUucmVzaWR1YWxDbGFzc2VzIDogdE5vZGUucmVzaWR1YWxTdHlsZXM7CiAgICBpZiAocmVzaWR1YWwgIT0gbnVsbCAvKiBvciB1bmRlZmluZWQgKi8gJiYgdHlwZW9mIHRTdHlsaW5nS2V5ID09ICdzdHJpbmcnICYmCiAgICAgICAga2V5VmFsdWVBcnJheUluZGV4T2YocmVzaWR1YWwsIHRTdHlsaW5nS2V5KSA+PSAwKSB7CiAgICAgICAgLy8gV2UgaGF2ZSBkdXBsaWNhdGUgaW4gdGhlIHJlc2lkdWFsIHNvIG1hcmsgb3Vyc2VsdmVzIGFzIGR1cGxpY2F0ZS4KICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHREdXBsaWNhdGUoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKSk7CiAgICB9Cn0KLyoqCiAqIE1hcmtzIGBUU3R5bGVWYWx1ZWBzIGFzIGR1cGxpY2F0ZXMgaWYgYW5vdGhlciBzdHlsZSBiaW5kaW5nIGluIHRoZSBsaXN0IGhhcyB0aGUgc2FtZQogKiBgVFN0eWxlVmFsdWVgLgogKgogKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCB0d2ljZSBvbmNlIHdpdGggYGlzUHJldkRpcmAgc2V0IHRvIGB0cnVlYCBhbmQgb25jZQogKiB3aXRoIGl0IHNldCB0byBgZmFsc2VgIHRvIHNlYXJjaCBib3RoIHRoZSBwcmV2aW91cyBhcyB3ZWxsIGFzIG5leHQgaXRlbXMgaW4gdGhlIGxpc3QuCiAqCiAqIE5vIGR1cGxpY2F0ZSBjYXNlCiAqIGBgYAogKiAgIFtzdHlsZS5jb2xvcl0KICogICBbc3R5bGUud2lkdGgucHhdIDw8LSBpbmRleAogKiAgIFtzdHlsZS5oZWlnaHQucHhdCiAqIGBgYAogKgogKiBJbiB0aGUgYWJvdmUgY2FzZSBhZGRpbmcgYFtzdHlsZS53aWR0aC5weF1gIHRvIHRoZSBleGlzdGluZyBgW3N0eWxlLmNvbG9yXWAgcHJvZHVjZXMgbm8KICogZHVwbGljYXRlcyBiZWNhdXNlIGB3aWR0aGAgaXMgbm90IGZvdW5kIGluIGFueSBvdGhlciBwYXJ0IG9mIHRoZSBsaW5rZWQgbGlzdC4KICoKICogRHVwbGljYXRlIGNhc2UKICogYGBgCiAqICAgW3N0eWxlLmNvbG9yXQogKiAgIFtzdHlsZS53aWR0aC5lbV0KICogICBbc3R5bGUud2lkdGgucHhdIDw8LSBpbmRleAogKiBgYGAKICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGUud2lkdGgucHhdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBgW3N0eWxlLndpZHRoLmVtXWAKICogYmVjYXVzZSBgd2lkdGhgIGlzIGZvdW5kIGluIHRoZSBjaGFpbi4KICoKICogTWFwIGNhc2UgMQogKiBgYGAKICogICBbc3R5bGUud2lkdGgucHhdCiAqICAgW3N0eWxlLmNvbG9yXQogKiAgIFtzdHlsZV0gIDw8LSBpbmRleAogKiBgYGAKICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGVdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBhbnkgb3RoZXIgYmluZGluZ3MgYmVjYXVzZQogKiBgW3N0eWxlXWAgaXMgYSBNYXAgYW5kIGFzIHN1Y2ggaXMgZnVsbHkgZHluYW1pYyBhbmQgY291bGQgcHJvZHVjZSBgY29sb3JgIG9yIGB3aWR0aGAuCiAqCiAqIE1hcCBjYXNlIDIKICogYGBgCiAqICAgW3N0eWxlXQogKiAgIFtzdHlsZS53aWR0aC5weF0KICogICBbc3R5bGUuY29sb3JdICA8PC0gaW5kZXgKICogYGBgCiAqIEluIHRoZSBhYm92ZSBjYXNlIGFkZGluZyBgW3N0eWxlLmNvbG9yXWAgd2lsbCBwcm9kdWNlIGEgZHVwbGljYXRlIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCiAqIGBbc3R5bGVdYCBiaW5kaW5nIHdoaWNoIGlzIGEgTWFwIGFuZCBhcyBzdWNoIGlzIGZ1bGx5IGR5bmFtaWMgYW5kIGNvdWxkIHByb2R1Y2UgYGNvbG9yYCBvcgogKiBgd2lkdGhgLgogKgogKiBOT1RFOiBPbmNlIGBbc3R5bGVdYCAoTWFwKSBpcyBhZGRlZCBpbnRvIHRoZSBzeXN0ZW0gYWxsIHRoaW5ncyBhcmUgbWFwcGVkIGFzIGR1cGxpY2F0ZXMuCiAqIE5PVEU6IFdlIHVzZSBgc3R5bGVgIGFzIGV4YW1wbGUsIGJ1dCBzYW1lIGxvZ2ljIGlzIGFwcGxpZWQgdG8gYGNsYXNzYGVzIGFzIHdlbGwuCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5IGBUU3R5bGluZ0tleVByaW1pdGl2ZWAgd2hpY2ggY29udGFpbnMgdGhlIHZhbHVlIHRvIGNvbXBhcmUgdG8gb3RoZXIga2V5cyBpbgogKiAgICAgICAgdGhlIGxpbmtlZCBsaXN0LgogKiBAcGFyYW0gez99IGluZGV4IFN0YXJ0aW5nIGxvY2F0aW9uIGluIHRoZSBsaW5rZWQgbGlzdCB0byBzZWFyY2ggZnJvbQogKiBAcGFyYW0gez99IGlzUHJldkRpciBEaXJlY3Rpb24uCiAqICAgICAgICAtIGB0cnVlYCBmb3IgcHJldmlvdXMgKGxvd2VyIHByaW9yaXR5KTsKICogICAgICAgIC0gYGZhbHNlYCBmb3IgbmV4dCAoaGlnaGVyIHByaW9yaXR5KS4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmluZGluZwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWFya0R1cGxpY2F0ZXModERhdGEsIHRTdHlsaW5nS2V5LCBpbmRleCwgaXNQcmV2RGlyLCBpc0NsYXNzQmluZGluZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFN0eWxpbmdBdEluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzTWFwID0gdFN0eWxpbmdLZXkgPT09IG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3Vyc29yID0gaXNQcmV2RGlyID8gZ2V0VFN0eWxpbmdSYW5nZVByZXYodFN0eWxpbmdBdEluZGV4KSA6IGdldFRTdHlsaW5nUmFuZ2VOZXh0KHRTdHlsaW5nQXRJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm91bmREdXBsaWNhdGUgPSBmYWxzZTsKICAgIC8vIFdlIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2UgaGF2ZSBhIGN1cnNvcgogICAgLy8gQU5EIGVpdGhlcjoKICAgIC8vIC0gd2UgZm91bmQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IsIE9SCiAgICAvLyAtIHdlIGFyZSBhIG1hcCBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gY29udGludWUgc2VhcmNoaW5nIGV2ZW4gYWZ0ZXIgd2UgZmluZCB3aGF0IHdlIHdlcmUKICAgIC8vICAgbG9va2luZyBmb3Igc2luY2Ugd2UgYXJlIGEgd2lsZCBjYXJkIGFuZCBldmVyeXRoaW5nIG5lZWRzIHRvIGJlIGZsaXBwZWQgdG8gZHVwbGljYXRlLgogICAgd2hpbGUgKGN1cnNvciAhPT0gMCAmJiAoZm91bmREdXBsaWNhdGUgPT09IGZhbHNlIHx8IGlzTWFwKSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZSh0RGF0YSwgY3Vyc29yKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFN0eWxpbmdWYWx1ZUF0Q3Vyc29yID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2N1cnNvcl0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFN0eWxlUmFuZ2VBdEN1cnNvciA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgIGlmIChpc1N0eWxpbmdNYXRjaCh0U3R5bGluZ1ZhbHVlQXRDdXJzb3IsIHRTdHlsaW5nS2V5KSkgewogICAgICAgICAgICBmb3VuZER1cGxpY2F0ZSA9IHRydWU7CiAgICAgICAgICAgIHREYXRhW2N1cnNvciArIDFdID0gaXNQcmV2RGlyID8gc2V0VFN0eWxpbmdSYW5nZU5leHREdXBsaWNhdGUodFN0eWxlUmFuZ2VBdEN1cnNvcikgOgogICAgICAgICAgICAgICAgc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFN0eWxlUmFuZ2VBdEN1cnNvcik7CiAgICAgICAgfQogICAgICAgIGN1cnNvciA9IGlzUHJldkRpciA/IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRTdHlsZVJhbmdlQXRDdXJzb3IpIDoKICAgICAgICAgICAgZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxlUmFuZ2VBdEN1cnNvcik7CiAgICB9CiAgICBpZiAoZm91bmREdXBsaWNhdGUpIHsKICAgICAgICAvLyBpZiB3ZSBmb3VuZCBhIGR1cGxpY2F0ZSwgdGhhbiBtYXJrIG91cnNlbHZlcy4KICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gaXNQcmV2RGlyID8gc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFN0eWxpbmdBdEluZGV4KSA6CiAgICAgICAgICAgIHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nQXRJbmRleCk7CiAgICB9Cn0KLyoqCiAqIERldGVybWluZXMgaWYgdHdvIGBUU3R5bGluZ0tleWBzIGFyZSBhIG1hdGNoLgogKgogKiBXaGVuIGNvbXB1dGluZyB3ZWF0aGVyIGEgYmluZGluZyBjb250YWlucyBhIGR1cGxpY2F0ZSwgd2UgbmVlZCB0byBjb21wYXJlIGlmIHRoZSBpbnN0cnVjdGlvbgogKiBgVFN0eWxpbmdLZXlgIGhhcyBhIG1hdGNoLgogKgogKiBIZXJlIGFyZSBleGFtcGxlcyBvZiBgVFN0eWxpbmdLZXlgcyB3aGljaCBtYXRjaCBnaXZlbiBgdFN0eWxpbmdLZXlDdXJzb3JgIGlzOgogKiAtIGBjb2xvcmAKICogICAgLSBgY29sb3JgICAgIC8vIE1hdGNoIGFub3RoZXIgY29sb3IKICogICAgLSBgbnVsbGAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCBgdFN0eWxpbmdLZXlgIGlzIGEgYGNsYXNzTWFwYC9gc3R5bGVNYXBgIGluc3RydWN0aW9uCiAqICAgIC0gYFsnJywgJ2NvbG9yJywgJ290aGVyJywgdHJ1ZV1gIC8vIHdyYXBwZWQgYGNvbG9yYCBzbyBtYXRjaAogKiAgICAtIGBbJycsIG51bGwsICdvdGhlcicsIHRydWVdYCAgICAgICAvLyB3cmFwcGVkIGBudWxsYCBzbyBtYXRjaAogKiAgICAtIGBbJycsICd3aWR0aCcsICdjb2xvcicsICd2YWx1ZSddYCAvLyB3cmFwcGVkIHN0YXRpYyB2YWx1ZSBjb250YWlucyBhIG1hdGNoIG9uIGAnY29sb3InYAogKiAtIGBudWxsYCAgICAgICAvLyBgdFN0eWxpbmdLZXlDdXJzb3JgIGFsd2F5cyBtYXRjaCBhcyBpdCBpcyBgY2xhc3NNYXBgL2BzdHlsZU1hcGAgaW5zdHJ1Y3Rpb24KICoKICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleUN1cnNvcgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1N0eWxpbmdNYXRjaCh0U3R5bGluZ0tleUN1cnNvciwgdFN0eWxpbmdLZXkpIHsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydE5vdEVxdWFsKEFycmF5LmlzQXJyYXkodFN0eWxpbmdLZXkpLCB0cnVlLCAnRXhwZWN0ZWQgdGhhdCBcJ3RTdHlsaW5nS2V5XCcgaGFzIGJlZW4gdW53cmFwcGVkJyk7CiAgICBpZiAodFN0eWxpbmdLZXlDdXJzb3IgPT09IG51bGwgfHwgLy8gSWYgdGhlIGN1cnNvciBpcyBgbnVsbGAgaXQgbWVhbnMgdGhhdCB3ZSBoYXZlIG1hcCBhdCB0aGF0CiAgICAgICAgLy8gbG9jYXRpb24gc28gd2UgbXVzdCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGEgbWF0Y2guCiAgICAgICAgdFN0eWxpbmdLZXkgPT0gbnVsbCB8fCAvLyBJZiBgdFN0eWxpbmdLZXlgIGlzIGBudWxsYCB0aGVuIGl0IGlzIGEgbWFwIHRoZXJlZm9yIGFzc3VtZSB0aGF0IGl0CiAgICAgICAgLy8gY29udGFpbnMgYSBtYXRjaC4KICAgICAgICAoQXJyYXkuaXNBcnJheSh0U3R5bGluZ0tleUN1cnNvcikgPyB0U3R5bGluZ0tleUN1cnNvclsxXSA6IHRTdHlsaW5nS2V5Q3Vyc29yKSA9PT0KICAgICAgICAgICAgdFN0eWxpbmdLZXkgLy8gSWYgdGhlIGtleXMgbWF0Y2ggZXhwbGljaXRseSB0aGFuIHdlIGFyZSBhIG1hdGNoLgogICAgKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5Q3Vyc29yKSAmJiB0eXBlb2YgdFN0eWxpbmdLZXkgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgLy8gaWYgd2UgZGlkIG5vdCBmaW5kIGEgbWF0Y2gsIGJ1dCBgdFN0eWxpbmdLZXlDdXJzb3JgIGlzIGBLZXlWYWx1ZUFycmF5YCB0aGF0IG1lYW5zIGN1cnNvciBoYXMKICAgICAgICAvLyBzdGF0aWNzIGFuZCB3ZSBuZWVkIHRvIGNoZWNrIHRob3NlIGFzIHdlbGwuCiAgICAgICAgcmV0dXJuIGtleVZhbHVlQXJyYXlJbmRleE9mKHRTdHlsaW5nS2V5Q3Vyc29yLCB0U3R5bGluZ0tleSkgPj0KICAgICAgICAgICAgMDsgLy8gc2VlIGlmIHdlIGFyZSBtYXRjaGluZyB0aGUga2V5CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KLy8gR2xvYmFsIHN0YXRlIG9mIHRoZSBwYXJzZXIuIChUaGlzIG1ha2VzIHBhcnNlciBub24tcmVlbnRyYW50LCBidXQgdGhhdCBpcyBub3QgYW4gaXNzdWUpCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgcGFyc2VyU3RhdGUgPSB7CiAgICB0ZXh0RW5kOiAwLAogICAga2V5OiAwLAogICAga2V5RW5kOiAwLAogICAgdmFsdWU6IDAsCiAgICB2YWx1ZUVuZDogMCwKfTsKLyoqCiAqIFJldHJpZXZlcyB0aGUgbGFzdCBwYXJzZWQgYGtleWAgb2Ygc3R5bGUuCiAqIEBwYXJhbSB7P30gdGV4dCB0aGUgdGV4dCB0byBzdWJzdHJpbmcgdGhlIGtleSBmcm9tLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TGFzdFBhcnNlZEtleSh0ZXh0KSB7CiAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFyc2VyU3RhdGUua2V5LCBwYXJzZXJTdGF0ZS5rZXlFbmQpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgdGhlIGxhc3QgcGFyc2VkIGB2YWx1ZWAgb2Ygc3R5bGUuCiAqIEBwYXJhbSB7P30gdGV4dCB0aGUgdGV4dCB0byBzdWJzdHJpbmcgdGhlIGtleSBmcm9tLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TGFzdFBhcnNlZFZhbHVlKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhwYXJzZXJTdGF0ZS52YWx1ZSwgcGFyc2VyU3RhdGUudmFsdWVFbmQpOwp9Ci8qKgogKiBJbml0aWFsaXplcyBgY2xhc3NOYW1lYCBzdHJpbmcgZm9yIHBhcnNpbmcgYW5kIHBhcnNlcyB0aGUgZmlyc3QgdG9rZW4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGlzIGZvcm1hdDoKICogYGBgCiAqIGZvciAobGV0IGkgPSBwYXJzZUNsYXNzTmFtZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VDbGFzc05hbWVOZXh0KHRleHQsIGkpKSB7CiAqICAgY29uc3Qga2V5ID0gZ2V0TGFzdFBhcnNlZEtleSgpOwogKiAgIC4uLgogKiB9CiAqIGBgYAogKiBAcGFyYW0gez99IHRleHQgYGNsYXNzTmFtZWAgdG8gcGFyc2UKICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VDbGFzc05hbWVOZXh0YCBzaG91bGQgcmVzdW1lLgogKi8KZnVuY3Rpb24gcGFyc2VDbGFzc05hbWUodGV4dCkgewogICAgcmVzZXRQYXJzZXJTdGF0ZSh0ZXh0KTsKICAgIHJldHVybiBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgMCwgcGFyc2VyU3RhdGUudGV4dEVuZCkpOwp9Ci8qKgogKiBQYXJzZXMgbmV4dCBgY2xhc3NOYW1lYCB0b2tlbi4KICoKICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRoaXMgZm9ybWF0OgogKiBgYGAKICogZm9yIChsZXQgaSA9IHBhcnNlQ2xhc3NOYW1lKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgaSkpIHsKICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAqICAgLi4uCiAqIH0KICogYGBgCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBgY2xhc3NOYW1lYCB0byBwYXJzZQogKiBAcGFyYW0gez99IGluZGV4IHdoZXJlIHRoZSBwYXJzaW5nIHNob3VsZCByZXN1bWUuCiAqIEByZXR1cm4gez99IGluZGV4IHdoZXJlIHRoZSBuZXh0IGludm9jYXRpb24gb2YgYHBhcnNlQ2xhc3NOYW1lTmV4dGAgc2hvdWxkIHJlc3VtZS4KICovCmZ1bmN0aW9uIHBhcnNlQ2xhc3NOYW1lTmV4dCh0ZXh0LCBpbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZW5kID0gcGFyc2VyU3RhdGUudGV4dEVuZDsKICAgIGlmIChlbmQgPT09IGluZGV4KSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaW5kZXggPSBwYXJzZXJTdGF0ZS5rZXlFbmQgPSBjb25zdW1lQ2xhc3NUb2tlbih0ZXh0LCBwYXJzZXJTdGF0ZS5rZXkgPSBpbmRleCwgZW5kKTsKICAgIHJldHVybiBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBpbmRleCwgZW5kKTsKfQovKioKICogSW5pdGlhbGl6ZXMgYGNzc1RleHRgIHN0cmluZyBmb3IgcGFyc2luZyBhbmQgcGFyc2VzIHRoZSBmaXJzdCBrZXkvdmFsdWVzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gdGhpcyBmb3JtYXQ6CiAqIGBgYAogKiBmb3IgKGxldCBpID0gcGFyc2VTdHlsZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VTdHlsZU5leHQodGV4dCwgaSkpKSB7CiAqICAgY29uc3Qga2V5ID0gZ2V0TGFzdFBhcnNlZEtleSgpOwogKiAgIGNvbnN0IHZhbHVlID0gZ2V0TGFzdFBhcnNlZFZhbHVlKCk7CiAqICAgLi4uCiAqIH0KICogYGBgCiAqIEBwYXJhbSB7P30gdGV4dCBgY3NzVGV4dGAgdG8gcGFyc2UKICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VTdHlsZU5leHRgIHNob3VsZCByZXN1bWUuCiAqLwpmdW5jdGlvbiBwYXJzZVN0eWxlKHRleHQpIHsKICAgIHJlc2V0UGFyc2VyU3RhdGUodGV4dCk7CiAgICByZXR1cm4gcGFyc2VTdHlsZU5leHQodGV4dCwgY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgMCwgcGFyc2VyU3RhdGUudGV4dEVuZCkpOwp9Ci8qKgogKiBQYXJzZXMgdGhlIG5leHQgYGNzc1RleHRgIGtleS92YWx1ZXMuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGlzIGZvcm1hdDoKICogYGBgCiAqIGZvciAobGV0IGkgPSBwYXJzZVN0eWxlKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZVN0eWxlTmV4dCh0ZXh0LCBpKSkpIHsKICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAqICAgY29uc3QgdmFsdWUgPSBnZXRMYXN0UGFyc2VkVmFsdWUoKTsKICogICAuLi4KICogfQogKgogKiBAcGFyYW0gez99IHRleHQgYGNzc1RleHRgIHRvIHBhcnNlCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleAogKiBAcmV0dXJuIHs/fSBpbmRleCB3aGVyZSB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIGBwYXJzZVN0eWxlTmV4dGAgc2hvdWxkIHJlc3VtZS4KICovCmZ1bmN0aW9uIHBhcnNlU3R5bGVOZXh0KHRleHQsIHN0YXJ0SW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVuZCA9IHBhcnNlclN0YXRlLnRleHRFbmQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSBwYXJzZXJTdGF0ZS5rZXkgPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBzdGFydEluZGV4LCBlbmQpOwogICAgaWYgKGVuZCA9PT0gaW5kZXgpIHsKICAgICAgICAvLyB3ZSByZWFjaGVkIGFuIGVuZCBzbyBqdXN0IHF1aXQKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLmtleUVuZCA9IGNvbnN1bWVTdHlsZUtleSh0ZXh0LCBpbmRleCwgZW5kKTsKICAgIGluZGV4ID0gY29uc3VtZVNlcGFyYXRvcih0ZXh0LCBpbmRleCwgZW5kLCA1OCAvKiBDT0xPTiAqLyk7CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLnZhbHVlID0gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgaW5kZXgsIGVuZCk7CiAgICBpbmRleCA9IHBhcnNlclN0YXRlLnZhbHVlRW5kID0gY29uc3VtZVN0eWxlVmFsdWUodGV4dCwgaW5kZXgsIGVuZCk7CiAgICByZXR1cm4gY29uc3VtZVNlcGFyYXRvcih0ZXh0LCBpbmRleCwgZW5kLCA1OSAvKiBTRU1JX0NPTE9OICovKTsKfQovKioKICogUmVzZXQgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgc3R5bGluZyBwYXJzZXIuCiAqIEBwYXJhbSB7P30gdGV4dCBUaGUgc3R5bGluZyB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVzZXRQYXJzZXJTdGF0ZSh0ZXh0KSB7CiAgICBwYXJzZXJTdGF0ZS5rZXkgPSAwOwogICAgcGFyc2VyU3RhdGUua2V5RW5kID0gMDsKICAgIHBhcnNlclN0YXRlLnZhbHVlID0gMDsKICAgIHBhcnNlclN0YXRlLnZhbHVlRW5kID0gMDsKICAgIHBhcnNlclN0YXRlLnRleHRFbmQgPSB0ZXh0Lmxlbmd0aDsKfQovKioKICogUmV0dXJucyBpbmRleCBvZiBuZXh0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci4KICoKICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogKiBAcGFyYW0gez99IHN0YXJ0SW5kZXggU3RhcnRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBzdGFydC4KICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAqIEByZXR1cm4gez99IEluZGV4IG9mIG5leHQgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIChNYXkgYmUgdGhlIHNhbWUgYXMgYHN0YXJ0YCBpZiBubyB3aGl0ZXNwYWNlIGF0CiAqICAgICAgICAgIHRoYXQgbG9jYXRpb24uKQogKi8KZnVuY3Rpb24gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXggJiYgdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpIDw9IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgc3RhcnRJbmRleCsrOwogICAgfQogICAgcmV0dXJuIHN0YXJ0SW5kZXg7Cn0KLyoqCiAqIFJldHVybnMgaW5kZXggb2YgbGFzdCBjaGFyIGluIGNsYXNzIHRva2VuLgogKgogKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICogQHJldHVybiB7P30gSW5kZXggYWZ0ZXIgbGFzdCBjaGFyIGluIGNsYXNzIHRva2VuLgogKi8KZnVuY3Rpb24gY29uc3VtZUNsYXNzVG9rZW4odGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXggJiYgdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpID4gMzIgLyogU1BBQ0UgKi8pIHsKICAgICAgICBzdGFydEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gc3RhcnRJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byBzdHlsZSBrZXkgYW5kIHRva2VuLgogKgogKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICogQHJldHVybiB7P30gSW5kZXggYWZ0ZXIgbGFzdCBzdHlsZSBrZXkgY2hhcmFjdGVyLgogKi8KZnVuY3Rpb24gY29uc3VtZVN0eWxlS2V5KHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2g7CiAgICB3aGlsZSAoc3RhcnRJbmRleCA8IGVuZEluZGV4ICYmCiAgICAgICAgKChjaCA9IHRleHQuY2hhckNvZGVBdChzdGFydEluZGV4KSkgPT09IDQ1IC8qIERBU0ggKi8gfHwgY2ggPT09IDk1IC8qIFVOREVSU0NPUkUgKi8gfHwKICAgICAgICAgICAgKChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA+PSA2NSAvKiBBICovICYmIChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA8PSA5MCAvKiBaICovKSkpIHsKICAgICAgICBzdGFydEluZGV4Kys7CiAgICB9CiAgICByZXR1cm4gc3RhcnRJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIHdoaXRlc3BhY2UgYW5kIHRoZSBzZXBhcmF0b3IgYDpgIGFmdGVyIHRoZSBzdHlsZSBrZXkuCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAqIEBwYXJhbSB7P30gZW5kSW5kZXggRW5kaW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgZW5kLgogKiBAcGFyYW0gez99IHNlcGFyYXRvcgogKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBzZXBhcmF0b3IgYW5kIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UuCiAqLwpmdW5jdGlvbiBjb25zdW1lU2VwYXJhdG9yKHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzZXBhcmF0b3IpIHsKICAgIHN0YXJ0SW5kZXggPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICBpZiAoc3RhcnRJbmRleCA8IGVuZEluZGV4KSB7CiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiB0ZXh0LmNoYXJDb2RlQXQoc3RhcnRJbmRleCkgIT09IHNlcGFyYXRvcikgewogICAgICAgICAgICBtYWxmb3JtZWRTdHlsZUVycm9yKHRleHQsIFN0cmluZy5mcm9tQ2hhckNvZGUoc2VwYXJhdG9yKSwgc3RhcnRJbmRleCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0SW5kZXgrKzsKICAgIH0KICAgIHJldHVybiBzdGFydEluZGV4Owp9Ci8qKgogKiBDb25zdW1lcyBzdHlsZSB2YWx1ZSBob25vcmluZyBgdXJsKClgIGFuZCBgIiJgIHRleHQuCiAqCiAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAqIEBwYXJhbSB7P30gZW5kSW5kZXggRW5kaW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgZW5kLgogKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBsYXN0IHN0eWxlIHZhbHVlIGNoYXJhY3Rlci4KICovCmZ1bmN0aW9uIGNvbnN1bWVTdHlsZVZhbHVlKHRleHQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gxID0gLTE7CiAgICAvLyAxc3QgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gyID0gLTE7CiAgICAvLyAybmQgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY2gzID0gLTE7CiAgICAvLyAzcmQgcHJldmlvdXMgY2hhcmFjdGVyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaSA9IHN0YXJ0SW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbGFzdENoSW5kZXggPSBpOwogICAgd2hpbGUgKGkgPCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChpKyspOwogICAgICAgIGlmIChjaCA9PT0gNTkgLyogU0VNSV9DT0xPTiAqLykgewogICAgICAgICAgICByZXR1cm4gbGFzdENoSW5kZXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNoID09PSAzNCAvKiBET1VCTEVfUVVPVEUgKi8gfHwgY2ggPT09IDM5IC8qIFNJTkdMRV9RVU9URSAqLykgewogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGkgPSBjb25zdW1lUXVvdGVkVGV4dCh0ZXh0LCBjaCwgaSwgZW5kSW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzdGFydEluZGV4ID09PQogICAgICAgICAgICBpIC0gNCAmJiAvLyBXZSBoYXZlIHNlZW4gb25seSA0IGNoYXJhY3RlcnMgc28gZmFyICJVUkwoIiAoSWdub3JlICJmb29fVVJMKCkiKQogICAgICAgICAgICBjaDMgPT09IDg1IC8qIFUgKi8gJiYKICAgICAgICAgICAgY2gyID09PSA4MiAvKiBSICovICYmIGNoMSA9PT0gNzYgLyogTCAqLyAmJiBjaCA9PT0gNDAgLyogT1BFTl9QQVJFTiAqLykgewogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGkgPSBjb25zdW1lUXVvdGVkVGV4dCh0ZXh0LCA0MSAvKiBDTE9TRV9QQVJFTiAqLywgaSwgZW5kSW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA+IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgdGhlbiBjYXB0dXJlIGl0cyBsb2NhdGlvbgogICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGk7CiAgICAgICAgfQogICAgICAgIGNoMyA9IGNoMjsKICAgICAgICBjaDIgPSBjaDE7CiAgICAgICAgY2gxID0gY2ggJiAtMzMgLyogVVBQRVJfQ0FTRSAqLzsKICAgIH0KICAgIHJldHVybiBsYXN0Q2hJbmRleDsKfQovKioKICogQ29uc3VtZXMgYWxsIG9mIHRoZSBxdW90ZWQgY2hhcmFjdGVycy4KICoKICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogKiBAcGFyYW0gez99IHF1b3RlQ2hhckNvZGUgQ2hhckNvZGUgb2YgZWl0aGVyIGAiYCBvciBgJ2AgcXVvdGUgb3IgYClgIGZvciBgdXJsKC4uLilgLgogKiBAcGFyYW0gez99IHN0YXJ0SW5kZXggU3RhcnRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBzdGFydC4KICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAqIEByZXR1cm4gez99IEluZGV4IGFmdGVyIHF1b3RlZCBjaGFyYWN0ZXJzLgogKi8KZnVuY3Rpb24gY29uc3VtZVF1b3RlZFRleHQodGV4dCwgcXVvdGVDaGFyQ29kZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjaDEgPSAtMTsKICAgIC8vIDFzdCBwcmV2aW91cyBjaGFyYWN0ZXIKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7CiAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChpbmRleCsrKTsKICAgICAgICBpZiAoY2ggPT0gcXVvdGVDaGFyQ29kZSAmJiBjaDEgIT09IDkyIC8qIEJBQ0tfU0xBU0ggKi8pIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gOTIgLyogQkFDS19TTEFTSCAqLyAmJiBjaDEgPT09IDkyIC8qIEJBQ0tfU0xBU0ggKi8pIHsKICAgICAgICAgICAgLy8gdHdvIGJhY2sgc2xhc2hlcyBjYW5jZWwgZWFjaCBvdGhlciBvdXQuIEZvciBleGFtcGxlIGAiXFwiYCBzaG91bGQgcHJvcGVybHkgZW5kIHRoZQogICAgICAgICAgICAvLyBxdW90YXRpb24uIChJdCBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBsYXN0IGAiYCBpcyBlc2NhcGVkLikKICAgICAgICAgICAgY2gxID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNoMSA9IGNoOwogICAgICAgIH0KICAgIH0KICAgIHRocm93IG5nRGV2TW9kZSA/IG1hbGZvcm1lZFN0eWxlRXJyb3IodGV4dCwgU3RyaW5nLmZyb21DaGFyQ29kZShxdW90ZUNoYXJDb2RlKSwgZW5kSW5kZXgpIDoKICAgICAgICBuZXcgRXJyb3IoKTsKfQovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEBwYXJhbSB7P30gZXhwZWN0aW5nCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1hbGZvcm1lZFN0eWxlRXJyb3IodGV4dCwgZXhwZWN0aW5nLCBpbmRleCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJywgdHJ1ZSwgJ1N0cmluZyBleHBlY3RlZCBoZXJlJyk7CiAgICB0aHJvdyB0aHJvd0Vycm9yJDEoYE1hbGZvcm1lZCBzdHlsZSBhdCBsb2NhdGlvbiAke2luZGV4fSBpbiBzdHJpbmcgJ2AgKyB0ZXh0LnN1YnN0cmluZygwLCBpbmRleCkgKyAnWz4+JyArCiAgICAgICAgdGV4dC5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkgKyAnPDxdJyArIHRleHQuc3Vic3RyKGluZGV4ICsgMSkgKwogICAgICAgIGAnLiBFeHBlY3RpbmcgJyR7ZXhwZWN0aW5nfScuYCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxpbmcudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFNldHMgdGhlIGN1cnJlbnQgc3R5bGUgc2FuaXRpemVyIGZ1bmN0aW9uIHdoaWNoIHdpbGwgdGhlbiBiZSB1c2VkCiAqIHdpdGhpbiBhbGwgZm9sbG93LXVwIHByb3AgYW5kIG1hcC1iYXNlZCBzdHlsZSBiaW5kaW5nIGluc3RydWN0aW9ucwogKiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCiAqCiAqIE5vdGUgdGhhdCBvbmNlIHN0eWxpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCAoaS5lLiBvbmNlCiAqIGBhZHZhbmNlKG4pYCBpcyBleGVjdXRlZCBvciB0aGUgaG9zdEJpbmRpbmdzL3RlbXBsYXRlIGZ1bmN0aW9uIGV4aXRzKQogKiB0aGVuIHRoZSBhY3RpdmUgYHNhbml0aXplckZuYCB3aWxsIGJlIHNldCB0byBgbnVsbGAuIFRoaXMgbWVhbnMgdGhhdAogKiBvbmNlIHN0eWxpbmcgaXMgYXBwbGllZCB0byBhbm90aGVyIGVsZW1lbnQgdGhlbiBhIGFub3RoZXIgY2FsbCB0bwogKiBgc3R5bGVTYW5pdGl6ZXJgIHdpbGwgbmVlZCB0byBiZSBtYWRlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpIHsKICAgIHNldEN1cnJlbnRTdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpOwp9Ci8qKgogKiBVcGRhdGUgYSBzdHlsZSBiaW5kaW5nIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuCiAqCiAqIElmIHRoZSBzdHlsZSB2YWx1ZSBpcyBmYWxzeSB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50CiAqIChvciBhc3NpZ25lZCBhIGRpZmZlcmVudCB2YWx1ZSBkZXBlbmRpbmcgaWYgdGhlcmUgYXJlIGFueSBzdHlsZXMgcGxhY2VkCiAqIG9uIHRoZSBlbGVtZW50IHdpdGggYHN0eWxlTWFwYCBvciBhbnkgc3RhdGljIHN0eWxlcyB0aGF0IGFyZQogKiBwcmVzZW50IGZyb20gd2hlbiB0aGUgZWxlbWVudCB3YXMgY3JlYXRlZCB3aXRoIGBzdHlsaW5nYCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgc3R5bGluZyBlbGVtZW50IGlzIHVwZGF0ZWQgYXMgcGFydCBvZiBgc3R5bGluZ0FwcGx5YC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcCBBIHZhbGlkIENTUyBwcm9wZXJ0eS4KICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUgKGBudWxsYCBvciBhbiBlbXB0eSBzdHJpbmcgdG8gcmVtb3ZlKS4KICogQHBhcmFtIHs/PX0gc3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiAgICAgICAgTm90ZSB0aGF0IHdoZW4gYSBzdWZmaXggaXMgcHJvdmlkZWQgdGhlbiB0aGUgdW5kZXJseWluZyBzYW5pdGl6ZXIgd2lsbAogKiAgICAgICAgYmUgaWdub3JlZC4KICoKICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgc3R5bGUgdmFsdWUgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAogKiB3aXRoaW4gYSBob3N0IGJpbmRpbmcgZnVuY3Rpb24uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wKHByb3AsIHZhbHVlLCBzdWZmaXgpIHsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlLCBzdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wOwp9Ci8qKgogKiBVcGRhdGUgYSBjbGFzcyBiaW5kaW5nIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gaGFuZGxlIHRoZSBgW2NsYXNzLmZvb109ImV4cCJgIGNhc2UgYW5kLAogKiB0aGVyZWZvcmUsIHRoZSBjbGFzcyBiaW5kaW5nIGl0c2VsZiBtdXN0IGFscmVhZHkgYmUgYWxsb2NhdGVkIHVzaW5nCiAqIGBzdHlsaW5nYCB3aXRoaW4gdGhlIGNyZWF0aW9uIGJsb2NrLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICogQHBhcmFtIHs/fSB2YWx1ZSBBIHRydWUvZmFsc2UgdmFsdWUgd2hpY2ggd2lsbCB0dXJuIHRoZSBjbGFzcyBvbiBvciBvZmYuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgYXBwbHkgdGhlIHByb3ZpZGVkIGNsYXNzIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbgogKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzUHJvcChjbGFzc05hbWUsIHZhbHVlKSB7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShjbGFzc05hbWUsIHZhbHVlLCBudWxsLCB0cnVlKTsKICAgIHJldHVybiDJtcm1Y2xhc3NQcm9wOwp9Ci8qKgogKiBVcGRhdGUgc3R5bGUgYmluZGluZ3MgdXNpbmcgYW4gb2JqZWN0IGxpdGVyYWwgb24gYW4gZWxlbWVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBhcHBseSBzdHlsaW5nIHZpYSB0aGUgYFtzdHlsZV09ImV4cCJgIHRlbXBsYXRlIGJpbmRpbmdzLgogKiBXaGVuIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCB0aGV5IHdpbGwgdGhlbiBiZSB1cGRhdGVkIHdpdGggcmVzcGVjdCB0bwogKiBhbnkgc3R5bGVzL2NsYXNzZXMgc2V0IHZpYSBgc3R5bGVQcm9wYC4gSWYgYW55IHN0eWxlcyBhcmUgc2V0IHRvIGZhbHN5CiAqIHRoZW4gdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudC4KICoKICogTm90ZSB0aGF0IHRoZSBzdHlsaW5nIGluc3RydWN0aW9uIHdpbGwgbm90IGJlIGFwcGxpZWQgdW50aWwgYHN0eWxpbmdBcHBseWAgaXMgY2FsbGVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzdHlsZXMgQSBrZXkvdmFsdWUgc3R5bGUgbWFwIG9mIHRoZSBzdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCiAqICAgICAgICBBbnkgbWlzc2luZyBzdHlsZXMgKHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCBiZWZvcmVoYW5kKSB3aWxsIGJlCiAqICAgICAgICByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIHN0eWxpbmcuCiAqCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgYXBwbHkgdGhlIHByb3ZpZGVkIHN0eWxlTWFwIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbgogKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwKHN0eWxlcykgewogICAgY2hlY2tTdHlsaW5nTWFwKHN0eWxlS2V5VmFsdWVBcnJheVNldCwgc3R5bGVTdHJpbmdQYXJzZXIsIHN0eWxlcywgZmFsc2UpOwp9Ci8qKgogKiBQYXJzZSB0ZXh0IGFzIHN0eWxlIGFuZCBhZGQgdmFsdWVzIHRvIEtleVZhbHVlQXJyYXkuCiAqCiAqIFRoaXMgY29kZSBpcyBwdWxsZWQgb3V0IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gYXdheSBpZiBpdCBpcyBub3QKICogbmVlZGVkLiBJdCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbSBgybXJtXN0eWxlTWFwYC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5IEtleVZhbHVlQXJyYXkgdG8gYWRkIHBhcnNlZCB2YWx1ZXMgdG8uCiAqIEBwYXJhbSB7P30gdGV4dCB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3R5bGVTdHJpbmdQYXJzZXIoa2V5VmFsdWVBcnJheSwgdGV4dCkgewogICAgZm9yIChsZXQgaSA9IHBhcnNlU3R5bGUodGV4dCk7IGkgPj0gMDsgaSA9IHBhcnNlU3R5bGVOZXh0KHRleHQsIGkpKSB7CiAgICAgICAgc3R5bGVLZXlWYWx1ZUFycmF5U2V0KGtleVZhbHVlQXJyYXksIGdldExhc3RQYXJzZWRLZXkodGV4dCksIGdldExhc3RQYXJzZWRWYWx1ZSh0ZXh0KSk7CiAgICB9Cn0KLyoqCiAqIFVwZGF0ZSBjbGFzcyBiaW5kaW5ncyB1c2luZyBhbiBvYmplY3QgbGl0ZXJhbCBvciBjbGFzcy1zdHJpbmcgb24gYW4gZWxlbWVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBtZWFudCB0byBhcHBseSBzdHlsaW5nIHZpYSB0aGUgYFtjbGFzc109ImV4cCJgIHRlbXBsYXRlIGJpbmRpbmdzLgogKiBXaGVuIGNsYXNzZXMgYXJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgdGhleSB3aWxsIHRoZW4gYmUgdXBkYXRlZCB3aXRoCiAqIHJlc3BlY3QgdG8gYW55IHN0eWxlcy9jbGFzc2VzIHNldCB2aWEgYGNsYXNzUHJvcGAuIElmIGFueQogKiBjbGFzc2VzIGFyZSBzZXQgdG8gZmFsc3kgdGhlbiB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50LgogKgogKiBOb3RlIHRoYXQgdGhlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gd2lsbCBub3QgYmUgYXBwbGllZCB1bnRpbCBgc3R5bGluZ0FwcGx5YCBpcyBjYWxsZWQuCiAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgdGhlIHByb3ZpZGVkIGNsYXNzTWFwIHZhbHVlIHRvIHRoZSBob3N0IGVsZW1lbnQgaWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKICogd2l0aGluIGEgaG9zdCBiaW5kaW5nLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBjbGFzc2VzIEEga2V5L3ZhbHVlIG1hcCBvciBzdHJpbmcgb2YgQ1NTIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZQogKiAgICAgICAgZ2l2ZW4gZWxlbWVudC4gQW55IG1pc3NpbmcgY2xhc3NlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50CiAqICAgICAgICBiZWZvcmVoYW5kKSB3aWxsIGJlIHJlbW92ZWQgKHVuc2V0KSBmcm9tIHRoZSBlbGVtZW50J3MgbGlzdCBvZiBDU1MgY2xhc3Nlcy4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcChjbGFzc2VzKSB7CiAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGNsYXNzZXMsIHRydWUpOwp9Ci8qKgogKiBQYXJzZSB0ZXh0IGFzIGNsYXNzIGFuZCBhZGQgdmFsdWVzIHRvIEtleVZhbHVlQXJyYXkuCiAqCiAqIFRoaXMgY29kZSBpcyBwdWxsZWQgb3V0IHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gYXdheSBpZiBpdCBpcyBub3QKICogbmVlZGVkLiBJdCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbSBgybXJtWNsYXNzTWFwYC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5IEtleVZhbHVlQXJyYXkgdG8gYWRkIHBhcnNlZCB2YWx1ZXMgdG8uCiAqIEBwYXJhbSB7P30gdGV4dCB0ZXh0IHRvIHBhcnNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2xhc3NTdHJpbmdQYXJzZXIoa2V5VmFsdWVBcnJheSwgdGV4dCkgewogICAgZm9yIChsZXQgaSA9IHBhcnNlQ2xhc3NOYW1lKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZUNsYXNzTmFtZU5leHQodGV4dCwgaSkpIHsKICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KGtleVZhbHVlQXJyYXksIGdldExhc3RQYXJzZWRLZXkodGV4dCksIHRydWUpOwogICAgfQp9Ci8qKgogKiBDb21tb24gY29kZSBiZXR3ZWVuIGDJtcm1Y2xhc3NQcm9wYCBhbmQgYMm1ybVzdHlsZVByb3BgLgogKgogKiBAcGFyYW0gez99IHByb3AgcHJvcGVydHkgbmFtZS4KICogQHBhcmFtIHs/fSB2YWx1ZSBiaW5kaW5nIHZhbHVlLgogKiBAcGFyYW0gez99IHN1ZmZpeE9yU2FuaXRpemVyIHN1ZmZpeCBvciBzYW5pdGl6YXRpb24gZnVuY3Rpb24KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgY2hhbmdlIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCB2YWx1ZSwgc3VmZml4T3JTYW5pdGl6ZXIsIGlzQ2xhc3NCYXNlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLy8gU3R5bGluZyBpbnN0cnVjdGlvbnMgdXNlIDIgc2xvdHMgcGVyIGJpbmRpbmcuCiAgICAvLyAxLiBvbmUgZm9yIHRoZSB2YWx1ZSAvIFRTdHlsaW5nS2V5CiAgICAvLyAyLiBvbmUgZm9yIHRoZSBpbnRlcm1pdHRlbnQtdmFsdWUgLyBUU3R5bGluZ1JhbmdlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBpbmNyZW1lbnRCaW5kaW5nSW5kZXgoMik7CiAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzKSB7CiAgICAgICAgc3R5bGluZ0ZpcnN0VXBkYXRlUGFzcyh0VmlldywgcHJvcCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgfQogICAgaWYgKHZhbHVlICE9PSBOT19DSEFOR0UgJiYgYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmsgYXJvdW5kLiBPbmNlIFBSIzM0NDgwIGxhbmRzIHRoZSBzYW5pdGl6ZXIgaXMgcGFzc2VkIGV4cGxpY2l0bHkgYW5kIHRoaXMgbGluZQogICAgICAgIC8vIGNhbiBiZSByZW1vdmVkLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3R5bGVTYW5pdGl6ZXI7CiAgICAgICAgaWYgKHN1ZmZpeE9yU2FuaXRpemVyID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHN0eWxlU2FuaXRpemVyID0gZ2V0Q3VycmVudFN0eWxlU2FuaXRpemVyKCkpIHsKICAgICAgICAgICAgICAgIHN1ZmZpeE9yU2FuaXRpemVyID0gKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlU2FuaXRpemVyKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbZ2V0U2VsZWN0ZWRJbmRleCgpICsgSEVBREVSX09GRlNFVF0pKTsKICAgICAgICB1cGRhdGVTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgcHJvcCwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0gPSBub3JtYWxpemVBbmRBcHBseVN1ZmZpeE9yU2FuaXRpemVyKHZhbHVlLCBzdWZmaXhPclNhbml0aXplciksIGlzQ2xhc3NCYXNlZCwgYmluZGluZ0luZGV4KTsKICAgIH0KfQovKioKICogQ29tbW9uIGNvZGUgYmV0d2VlbiBgybXJtWNsYXNzTWFwYCBhbmQgYMm1ybVzdHlsZU1hcGAuCiAqCiAqIEBwYXJhbSB7P30ga2V5VmFsdWVBcnJheVNldCAoU2VlIGBrZXlWYWx1ZUFycmF5U2V0YCBpbiAidXRpbC9hcnJheV91dGlscyIpIEdldHMgcGFzc2VkIGluIGFzIGEKICogZnVuY3Rpb24gc28gdGhhdAogKiAgICAgICAgYHN0eWxlYCBjYW4gcGFzcyBpbiB2ZXJzaW9uIHdoaWNoIGRvZXMgc2FuaXRpemF0aW9uLiBUaGlzIGlzIGRvbmUgZm9yIHRyZWUgc2hha2luZwogKiAgICAgICAgcHVycG9zZXMuCiAqIEBwYXJhbSB7P30gc3RyaW5nUGFyc2VyIFBhcnNlciB1c2VkIHRvIHBhcnNlIGB2YWx1ZWAgaWYgYHN0cmluZ2AuIChQYXNzZWQgaW4gYXMgYHN0eWxlYCBhbmQgYGNsYXNzYAogKiAgICAgICAgaGF2ZSBkaWZmZXJlbnQgcGFyc2Vycy4pCiAqIEBwYXJhbSB7P30gdmFsdWUgYm91bmQgdmFsdWUgZnJvbSBhcHBsaWNhdGlvbgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCBjaGFuZ2UgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGluY3JlbWVudEJpbmRpbmdJbmRleCgyKTsKICAgIGlmICh0Vmlldy5maXJzdFVwZGF0ZVBhc3MpIHsKICAgICAgICBzdHlsaW5nRmlyc3RVcGRhdGVQYXNzKHRWaWV3LCBudWxsLCBiaW5kaW5nSW5kZXgsIGlzQ2xhc3NCYXNlZCk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICBpZiAodmFsdWUgIT09IE5PX0NIQU5HRSAmJiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvLyBgZ2V0U2VsZWN0ZWRJbmRleCgpYCBzaG91bGQgYmUgaGVyZSAocmF0aGVyIHRoYW4gaW4gaW5zdHJ1Y3Rpb24pIHNvIHRoYXQgaXQgaXMgZ3VhcmRlZCBieSB0aGUKICAgICAgICAvLyBpZiBzbyBhcyBub3QgdG8gcmVhZCB1bm5lY2Vzc2FyaWx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2dldFNlbGVjdGVkSW5kZXgoKSArIEhFQURFUl9PRkZTRVRdKSk7CiAgICAgICAgaWYgKGhhc1N0eWxpbmdJbnB1dFNoYWRvdyh0Tm9kZSwgaXNDbGFzc0Jhc2VkKSAmJiAhaXNJbkhvc3RCaW5kaW5ncyh0VmlldywgYmluZGluZ0luZGV4KSkgewogICAgICAgICAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBpZiB3ZSBhcmUgc2hhZG93aW5nIHRoZW4gYFREYXRhYCBpcyBhcHByb3ByaWF0ZWx5IG1hcmtlZCBzbyB0aGF0IHdlIHNraXAKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgdGhpcyBiaW5kaW5nIGluIHN0eWxpbmcgcmVzb2x1dGlvbi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRTdHlsaW5nS2V5ID0gdFZpZXcuZGF0YVtiaW5kaW5nSW5kZXhdOwogICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwoQXJyYXkuaXNBcnJheSh0U3R5bGluZ0tleSkgPyB0U3R5bGluZ0tleVsxXSA6IHRTdHlsaW5nS2V5LCBmYWxzZSwgJ1N0eWxpbmcgbGlua2VkIGxpc3Qgc2hhZG93IGlucHV0IHNob3VsZCBiZSBtYXJrZWQgYXMgXCdmYWxzZVwnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVkUgZG9lcyBub3QgY29uY2F0ZW5hdGUgdGhlIHN0YXRpYyBwb3J0aW9uIGxpa2Ugd2UgYXJlIGRvaW5nIGhlcmUuCiAgICAgICAgICAgIC8vIEluc3RlYWQgVkUganVzdCBpZ25vcmVzIHRoZSBzdGF0aWMgY29tcGxldGVseSBpZiBkeW5hbWljIGJpbmRpbmcgaXMgcHJlc2VudC4KICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiBsb2NhbGl0eSB3ZSBoYXZlIGFscmVhZHkgc2V0IHRoZSBzdGF0aWMgcG9ydGlvbiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgdGhlcmUKICAgICAgICAgICAgLy8gaXMgYSBkeW5hbWljIHBvcnRpb24gdW50aWwgbGF0ZXIuIElmIHdlIHdvdWxkIGlnbm9yZSB0aGUgc3RhdGljIHBvcnRpb24gaXQgd291bGQgbG9vayBsaWtlCiAgICAgICAgICAgIC8vIHRoZSBiaW5kaW5nIGhhcyByZW1vdmVkIGl0LiBUaGlzIHdvdWxkIGNvbmZ1c2UgYFtuZ1N0eWxlXWAvYFtuZ0NsYXNzXWAgdG8gZG8gdGhlIHdyb25nCiAgICAgICAgICAgIC8vIHRoaW5nIGFzIGl0IHdvdWxkIHRoaW5rIHRoYXQgdGhlIHN0YXRpYyBwb3J0aW9uIHdhcyByZW1vdmVkLiBGb3IgdGhpcyByZWFzb24gd2UKICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUgaXQgc28gdGhhdCBgW25nU3R5bGVdYC9gW25nQ2xhc3NdYCAgY2FuIGNvbnRpbnVlIHRvIHdvcmsgb24gY2hhbmdlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3RhdGljUHJlZml4ID0gaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NlcyA6IHROb2RlLnN0eWxlczsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGlzQ2xhc3NCYXNlZCA9PT0gZmFsc2UgJiYgc3RhdGljUHJlZml4ICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbChzdGF0aWNQcmVmaXguZW5kc1dpdGgoJzsnKSwgdHJ1ZSwgJ0V4cGVjdGluZyBzdGF0aWMgcG9ydGlvbiB0byBlbmQgd2l0aCBcJztcJycpOwogICAgICAgICAgICBpZiAoc3RhdGljUHJlZml4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGZhbHN5IHZhbHVlcyBvZiBgdmFsdWVgIGJlY29tZSBlbXB0eSBzdHJpbmdzLgogICAgICAgICAgICAgICAgdmFsdWUgPSBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKHN0YXRpY1ByZWZpeCwgdmFsdWUgPyB2YWx1ZSA6ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBHaXZlbiBgPGRpdiBbc3R5bGVdIG15LWRpcj5gIHN1Y2ggdGhhdCBgbXktZGlyYCBoYXMgYEBJbnB1dCgnc3R5bGUnKWAuCiAgICAgICAgICAgIC8vIFRoaXMgdGFrZXMgb3ZlciB0aGUgYFtzdHlsZV1gIGJpbmRpbmcuIChTYW1lIGZvciBgW2NsYXNzXWApCiAgICAgICAgICAgIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgdmFsdWUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB1cGRhdGVTdHlsaW5nTWFwKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0sIGxWaWV3W2JpbmRpbmdJbmRleCArIDFdID0gdG9TdHlsaW5nS2V5VmFsdWVBcnJheShrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlKSwgaXNDbGFzc0Jhc2VkLCBiaW5kaW5nSW5kZXgpOwogICAgICAgIH0KICAgIH0KfQovKioKICogRGV0ZXJtaW5lcyB3aGVuIHRoZSBiaW5kaW5nIGlzIGluIGBob3N0QmluZGluZ3NgIHNlY3Rpb24KICoKICogQHBhcmFtIHs/fSB0VmlldyBDdXJyZW50IGBUVmlld2AKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggaW5kZXggb2YgYmluZGluZyB3aGljaCB3ZSB3b3VsZCBsaWtlIGlmIGl0IGlzIGluIGBob3N0QmluZGluZ3NgCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0luSG9zdEJpbmRpbmdzKHRWaWV3LCBiaW5kaW5nSW5kZXgpIHsKICAgIC8vIEFsbCBob3N0IGJpbmRpbmdzIGFyZSBwbGFjZWQgYWZ0ZXIgdGhlIGV4cGFuZG8gc2VjdGlvbi4KICAgIHJldHVybiBiaW5kaW5nSW5kZXggPj0gdFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXg7Cn0KLyoqCiAqIENvbGxlY3RzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gaW5zZXJ0IHRoZSBiaW5kaW5nIGludG8gYSBsaW5rZWQgbGlzdCBvZiBzdHlsZSBiaW5kaW5ncwogKiB1c2luZyBgaW5zZXJ0VFN0eWxpbmdCaW5kaW5nYC4KICoKICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIHdoZXJlIHRoZSBiaW5kaW5nIGxpbmtlZCBsaXN0IHdpbGwgYmUgc3RvcmVkLgogKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5IFByb3BlcnR5L2tleSBvZiB0aGUgYmluZGluZy4KICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggSW5kZXggb2YgYmluZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9wYAogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCBjaGFuZ2UgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN0eWxpbmdGaXJzdFVwZGF0ZVBhc3ModFZpZXcsIHRTdHlsaW5nS2V5LCBiaW5kaW5nSW5kZXgsIGlzQ2xhc3NCYXNlZCkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0VXBkYXRlUGFzcyh0Vmlldyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0RGF0YSA9IHRWaWV3LmRhdGE7CiAgICBpZiAodERhdGFbYmluZGluZ0luZGV4ICsgMV0gPT09IG51bGwpIHsKICAgICAgICAvLyBUaGUgYWJvdmUgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3QgY2xlYXIgZmlyc3QgdXBkYXRlIHBhc3MgdW50aWwgZmlyc3Qgc3VjY2Vzc2Z1bAogICAgICAgIC8vIChubyBleGNlcHRpb24pIHRlbXBsYXRlIGV4ZWN1dGlvbi4gVGhpcyBwcmV2ZW50cyB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbiBmcm9tIGRvdWJsZSBhZGRpbmcKICAgICAgICAvLyBpdHNlbGYgdG8gdGhlIGxpc3QuCiAgICAgICAgLy8gYGdldFNlbGVjdGVkSW5kZXgoKWAgc2hvdWxkIGJlIGhlcmUgKHJhdGhlciB0aGFuIGluIGluc3RydWN0aW9uKSBzbyB0aGF0IGl0IGlzIGd1YXJkZWQgYnkgdGhlCiAgICAgICAgLy8gaWYgc28gYXMgbm90IHRvIHJlYWQgdW5uZWNlc3NhcmlseS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbZ2V0U2VsZWN0ZWRJbmRleCgpICsgSEVBREVSX09GRlNFVF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNIb3N0QmluZGluZ3MgPSBpc0luSG9zdEJpbmRpbmdzKHRWaWV3LCBiaW5kaW5nSW5kZXgpOwogICAgICAgIGlmIChoYXNTdHlsaW5nSW5wdXRTaGFkb3codE5vZGUsIGlzQ2xhc3NCYXNlZCkgJiYgdFN0eWxpbmdLZXkgPT09IG51bGwgJiYgIWlzSG9zdEJpbmRpbmdzKSB7CiAgICAgICAgICAgIC8vIGB0U3R5bGluZ0tleSA9PT0gbnVsbGAgaW1wbGllcyB0aGF0IHdlIGFyZSBlaXRoZXIgYFtzdHlsZV1gIG9yIGBbY2xhc3NdYCBiaW5kaW5nLgogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSB3aGljaCB1c2VzIGBASW5wdXQoJ3N0eWxlJylgIG9yIGBASW5wdXQoJ2NsYXNzJylgIHRoYW4KICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBuZXV0cmFsaXplIHRoaXMgYmluZGluZyBzaW5jZSB0aGF0IGRpcmVjdGl2ZSBpcyBzaGFkb3dpbmcgaXQuCiAgICAgICAgICAgIC8vIFdlIHR1cm4gdGhpcyBpbnRvIGEgbm9vcCBieSBzZXR0aW5nIHRoZSBrZXkgdG8gYGZhbHNlYAogICAgICAgICAgICB0U3R5bGluZ0tleSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0U3R5bGluZ0tleSA9IHdyYXBJblN0YXRpY1N0eWxpbmdLZXkodERhdGEsIHROb2RlLCB0U3R5bGluZ0tleSwgaXNDbGFzc0Jhc2VkKTsKICAgICAgICBpbnNlcnRUU3R5bGluZ0JpbmRpbmcodERhdGEsIHROb2RlLCB0U3R5bGluZ0tleSwgYmluZGluZ0luZGV4LCBpc0hvc3RCaW5kaW5ncywgaXNDbGFzc0Jhc2VkKTsKICAgIH0KfQovKioKICogQWRkcyBzdGF0aWMgc3R5bGluZyBpbmZvcm1hdGlvbiB0byB0aGUgYmluZGluZyBpZiBhcHBsaWNhYmxlLgogKgogKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3R5bGVzIG5vdCBvbmx5IHN0b3JlcyB0aGUgbGlzdCBhbmQga2V5cywgYnV0IGFsc28gc3RvcmVzIHN0YXRpYyBzdHlsaW5nCiAqIGluZm9ybWF0aW9uIG9uIHNvbWUgb2YgdGhlIGtleXMuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUga2V5IHNob3VsZCBjb250YWluIHRoZSBzdHlsaW5nCiAqIGluZm9ybWF0aW9uIGFuZCBjb21wdXRlcyBpdC4KICoKICogU2VlIGBUU3R5bGluZ1N0YXRpY2AgZm9yIG1vcmUgZGV0YWlscy4KICoKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHdoZXJlIHRoZSBsaW5rZWQgbGlzdCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAqIEBwYXJhbSB7P30gc3R5bGluZ0tleSBgVFN0eWxpbmdLZXlQcmltaXRpdmVgIHdoaWNoIG1heSBuZWVkIHRvIGJlIHdyYXBwZWQgaW50byBgVFN0eWxpbmdLZXlgCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB3cmFwSW5TdGF0aWNTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgc3R5bGluZ0tleSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBob3N0RGlyZWN0aXZlRGVmID0gZ2V0SG9zdERpcmVjdGl2ZURlZih0RGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzaWR1YWwgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlczsKICAgIGlmIChob3N0RGlyZWN0aXZlRGVmID09PSBudWxsKSB7CiAgICAgICAgLy8gV2UgYXJlIGluIHRlbXBsYXRlIG5vZGUuCiAgICAgICAgLy8gSWYgdGVtcGxhdGUgbm9kZSBhbHJlYWR5IGhhZCBzdHlsaW5nIGluc3RydWN0aW9uIHRoZW4gaXQgaGFzIGFscmVhZHkgY29sbGVjdGVkIHRoZSBzdGF0aWMKICAgICAgICAvLyBzdHlsaW5nIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbGxlY3QgdGhlbSBhZ2Fpbi4gV2Uga25vdyB0aGF0IHdlIGFyZSB0aGUgZmlyc3Qgc3R5bGluZwogICAgICAgIC8vIGluc3RydWN0aW9uIGJlY2F1c2UgdGhlIGBUTm9kZS4qQmluZGluZ3NgIHBvaW50cyB0byAwIChub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkIHlldCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzRmlyc3RTdHlsaW5nSW5zdHJ1Y3Rpb25JblRlbXBsYXRlID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICgoaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NCaW5kaW5ncyA6IHROb2RlLnN0eWxlQmluZGluZ3MpKSkpKSA9PT0gMDsKICAgICAgICBpZiAoaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluVGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGdldCB0aGUgc3RhdGljcyBmcm9tIGBtZXJnZUF0dHJzYCwgaG93ZXZlciwgYXQgdGhpcyBwb2ludAogICAgICAgICAgICAvLyB0aGV5IGFyZSBhbHJlYWR5IG1lcmdlZCBhbmQgaXQgd291bGQgbm90IGJlIHBvc3NpYmxlIHRvIGZpZ3VyZSB3aGljaCBwcm9wZXJ0eSBiZWxvbmdzIHdoZXJlCiAgICAgICAgICAgIC8vIGluIHRoZSBwcmlvcml0eS4KICAgICAgICAgICAgc3R5bGluZ0tleSA9IGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMobnVsbCwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICBzdHlsaW5nS2V5ID0gY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHN0eWxpbmdLZXksIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgaWYgd2UgaGF2ZSBzdHlsaW5nIGJpbmRpbmcgaW4gdGVtcGxhdGUgd2UgY2FuJ3QgaGF2ZSByZXNpZHVhbC4KICAgICAgICAgICAgcmVzaWR1YWwgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIC8vIFdlIGFyZSBpbiBob3N0IGJpbmRpbmcgbm9kZSBhbmQgdGhlcmUgd2FzIG5vIGJpbmRpbmcgaW5zdHJ1Y3Rpb24gaW4gdGVtcGxhdGUgbm9kZS4KICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBjb21wdXRlIHRoZSByZXNpZHVhbC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSB0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluSG9zdEJpbmRpbmcgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9PT0gLTEgfHwgdERhdGFbZGlyZWN0aXZlU3R5bGluZ0xhc3RdICE9PSBob3N0RGlyZWN0aXZlRGVmOwogICAgICAgIGlmIChpc0ZpcnN0U3R5bGluZ0luc3RydWN0aW9uSW5Ib3N0QmluZGluZykgewogICAgICAgICAgICBzdHlsaW5nS2V5ID0KICAgICAgICAgICAgICAgIGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMoaG9zdERpcmVjdGl2ZURlZiwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICBpZiAocmVzaWR1YWwgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIC0gSWYgYG51bGxgIHRoYW4gZWl0aGVyOgogICAgICAgICAgICAgICAgLy8gICAgLSBUZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9uIGFscmVhZHkgcmFuIGFuZCBpdCBoYXMgY29uc3VtZWQgdGhlIHN0YXRpYwogICAgICAgICAgICAgICAgLy8gICAgICBzdHlsaW5nIGludG8gaXRzIGBUU3R5bGluZ0tleWAgYW5kIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXBkYXRlIHJlc2lkdWFsLiBJbnN0ZWFkCiAgICAgICAgICAgICAgICAvLyAgICAgIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBgVFN0eWxpbmdLZXlgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QgdGVtcGxhdGUgbm9kZQogICAgICAgICAgICAgICAgLy8gICAgICBpbnN0cnVjdGlvbi4gT1IKICAgICAgICAgICAgICAgIC8vICAgIC0gU29tZSBvdGhlciBzdHlsaW5nIGluc3RydWN0aW9uIHJhbiBhbmQgZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGFyZSBubyByZXNpZHVhbHMKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxpbmdLZXkgPSBnZXRUZW1wbGF0ZUhlYWRUU3R5bGluZ0tleSh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVTdHlsaW5nS2V5ICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZVN0eWxpbmdLZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSByZWNvbXB1dGUgaWYgYHRlbXBsYXRlU3R5bGluZ0tleWAgaGFkIHN0YXRpYyB2YWx1ZXMuIChJZiBubyBzdGF0aWMgdmFsdWUgZm91bmQKICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gc2luY2UgdGhpcyBvcGVyYXRpb24gY2FuIG9ubHkgcHJvZHVjZSBsZXNzIHN0YXRpYyBrZXlzLCBub3QKICAgICAgICAgICAgICAgICAgICAvLyBtb3JlLikKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0eWxpbmdLZXkgPSBjb2xsZWN0U3R5bGluZ0Zyb21EaXJlY3RpdmVzKG51bGwsIHREYXRhLCB0Tm9kZSwgdGVtcGxhdGVTdHlsaW5nS2V5WzFdIC8qIHVud3JhcCBwcmV2aW91cyBzdGF0aWNzICovLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3R5bGluZ0tleSA9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RTdHlsaW5nRnJvbVRBdHRycyh0ZW1wbGF0ZVN0eWxpbmdLZXksIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgICAgIHNldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkLCB0ZW1wbGF0ZVN0eWxpbmdLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlY29tcHV0ZSByZXNpZHVhbCBpZiBpdCBpcyBub3QgYG51bGxgLgogICAgICAgICAgICAgICAgLy8gLSBJZiBleGlzdGluZyByZXNpZHVhbCAoaW1wbGllcyB0aGVyZSB3YXMgbm8gdGVtcGxhdGUgc3R5bGluZykuIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mCiAgICAgICAgICAgICAgICAvLyAgIHRoZSBzdGF0aWNzIG1heSBoYXZlIG1vdmVkIGZyb20gdGhlIHJlc2lkdWFsIHRvIHRoZSBgc3R5bGluZ0tleWAgYW5kIHNvIHdlIGhhdmUgdG8KICAgICAgICAgICAgICAgIC8vICAgcmVjb21wdXRlLgogICAgICAgICAgICAgICAgLy8gLSBJZiBgdW5kZWZpbmVkYCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBydW5uaW5nLgogICAgICAgICAgICAgICAgcmVzaWR1YWwgPSBjb2xsZWN0UmVzaWR1YWwodERhdGEsIHROb2RlLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlc2lkdWFsICE9PSB1bmRlZmluZWQpIHsKICAgICAgICBpc0NsYXNzQmFzZWQgPyAodE5vZGUucmVzaWR1YWxDbGFzc2VzID0gcmVzaWR1YWwpIDogKHROb2RlLnJlc2lkdWFsU3R5bGVzID0gcmVzaWR1YWwpOwogICAgfQogICAgcmV0dXJuIHN0eWxpbmdLZXk7Cn0KLyoqCiAqIFJldHJpZXZlIHRoZSBgVFN0eWxpbmdLZXlgIGZvciB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbi4KICoKICogVGhpcyBpcyBuZWVkZWQgc2luY2UgYGhvc3RCaW5kaW5nYCBzdHlsaW5nIGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHRlbXBsYXRlCiAqIGluc3RydWN0aW9uLiBXaGlsZSB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gdXBkYXRlIHRoZSByZXNpZHVhbCBpbiBgVE5vZGVgIHRoZQogKiBgaG9zdEJpbmRpbmdgIGluc3RydWN0aW9ucyBuZWVkIHRvIHVwZGF0ZSB0aGUgYFRTdHlsaW5nS2V5YCBvZiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gYmVjYXVzZQogKiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gaXMgZG93bnN0cmVhbSBmcm9tIHRoZSBgaG9zdEJpbmRpbmdzYCBpbnN0cnVjdGlvbnMuCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgZm9yIHdoaWNoIHRoZSBzdHlsaW5nIGlzIGJlaW5nIGNvbXB1dGVkLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fSBgVFN0eWxpbmdLZXlgIGlmIGZvdW5kIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4KICovCmZ1bmN0aW9uIGdldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5ncyA9IGlzQ2xhc3NCYXNlZCA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzOwogICAgaWYgKGdldFRTdHlsaW5nUmFuZ2VOZXh0KGJpbmRpbmdzKSA9PT0gMCkgewogICAgICAgIC8vIFRoZXJlIGRvZXMgbm90IHNlZW0gdG8gYmUgYSBzdHlsaW5nIGluc3RydWN0aW9uIGluIHRoZSBgdGVtcGxhdGVgLgogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2dldFRTdHlsaW5nUmFuZ2VQcmV2KGJpbmRpbmdzKV0pKTsKfQovKioKICogVXBkYXRlIHRoZSBgVFN0eWxpbmdLZXlgIG9mIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiBpbiBgVE5vZGVgLgogKgogKiBMb2dpY2FsbHkgYGhvc3RCaW5kaW5nc2Agc3R5bGluZyBpbnN0cnVjdGlvbnMgYXJlIG9mIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhhdCBvZiB0aGUgdGVtcGxhdGUuCiAqIEhvd2V2ZXIsIHRoZXkgZXhlY3V0ZSBhZnRlciB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGV5IGdldCBpbnNlcnRlZAogKiBpbiBmcm9udCBvZiB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbnMuCiAqCiAqIElmIHdlIGhhdmUgYSB0ZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9uIGFuZCBhIG5ldyBgaG9zdEJpbmRpbmdzYCBzdHlsaW5nIGluc3RydWN0aW9uIGlzCiAqIGV4ZWN1dGVkIGl0IG1lYW5zIHRoYXQgaXQgbWF5IG5lZWQgdG8gc3RlYWwgc3RhdGljIGZpZWxkcyBmcm9tIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbi4gVGhpcwogKiBtZXRob2QgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgZmlyc3QgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gYFRTdHlsaW5nS2V5YCB3aXRoIGEgbmV3IHZhbHVlLgogKgogKiBBc3N1bWU6CiAqIGBgYAogKiA8ZGl2IG15LWRpciBzdHlsZT0iY29sb3I6IHJlZCIgW3N0eWxlLmNvbG9yXT0idG1wbEV4cCI+PC9kaXY+CiAqCiAqIFxARGlyZWN0aXZlKHsKICogICBob3N0OiB7CiAqICAgICAnc3R5bGUnOiAnd2lkdGg6IDEwMHB4JywKICogICAgICdbc3R5bGUuY29sb3JdJzogJ2RpckV4cCcsCiAqICAgfQogKiB9KQogKiBjbGFzcyBNeURpciB7fQogKiBgYGAKICoKICogd2hlbiBgW3N0eWxlLmNvbG9yXT0idG1wbEV4cCJgIGV4ZWN1dGVzIGl0IGNyZWF0ZXMgdGhpcyBkYXRhIHN0cnVjdHVyZS4KICogYGBgCiAqICBbJycsICdjb2xvcicsICdjb2xvcicsICdyZWQnLCAnd2lkdGgnLCAnMTAwcHgnXSwKICogYGBgCiAqCiAqIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qga25vdyBpZiB0aGVyZSBhcmUgc3R5bGluZwogKiBpbnN0cnVjdGlvbnMgYW5kIG11c3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vbmUgYW5kIG11c3QgY29sbGVjdCBhbGwgb2YgdGhlIHN0YXRpYyBzdHlsaW5nLgogKiAoYm90aAogKiBgY29sb3InIGFuZCAnd2lkdGhgKQogKgogKiBXaGVuIGAnW3N0eWxlLmNvbG9yXSc6ICdkaXJFeHAnLGAgZXhlY3V0ZXMgd2UgbmVlZCB0byBpbnNlcnQgYSBuZXcgZGF0YSBpbnRvIHRoZSBsaW5rZWQgbGlzdC4KICogYGBgCiAqICBbJycsICdjb2xvcicsICd3aWR0aCcsICcxMDBweCddLCAgLy8gbmV3bHkgaW5zZXJ0ZWQKICogIFsnJywgJ2NvbG9yJywgJ2NvbG9yJywgJ3JlZCcsICd3aWR0aCcsICcxMDBweCddLCAvLyB0aGlzIGlzIHdyb25nCiAqIGBgYAogKgogKiBOb3RpY2UgdGhhdCB0aGUgdGVtcGxhdGUgc3RhdGljcyBpcyBub3cgd3JvbmcgYXMgaXQgaW5jb3JyZWN0bHkgY29udGFpbnMgYHdpZHRoYCBzbyB3ZSBuZWVkIHRvCiAqIHVwZGF0ZSBpdCBsaWtlIHNvOgogKiBgYGAKICogIFsnJywgJ2NvbG9yJywgJ3dpZHRoJywgJzEwMHB4J10sCiAqICBbJycsICdjb2xvcicsICdjb2xvcicsICdyZWQnXSwgICAgLy8gVVBEQVRFCiAqIGBgYAogKgogKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGlzIHN0b3JlZC4KICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGZvciB3aGljaCB0aGUgc3R5bGluZyBpcyBiZWluZyBjb21wdXRlZC4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleSBOZXcgYFRTdHlsaW5nS2V5YCB3aGljaCBpcyByZXBsYWNpbmcgdGhlIG9sZCBvbmUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUZW1wbGF0ZUhlYWRUU3R5bGluZ0tleSh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCwgdFN0eWxpbmdLZXkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdzID0gaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NCaW5kaW5ncyA6IHROb2RlLnN0eWxlQmluZGluZ3M7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbChnZXRUU3R5bGluZ1JhbmdlTmV4dChiaW5kaW5ncyksIDAsICdFeHBlY3RpbmcgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdGVtcGxhdGUgc3R5bGluZyBiaW5kaW5nLicpOwogICAgdERhdGFbZ2V0VFN0eWxpbmdSYW5nZVByZXYoYmluZGluZ3MpXSA9IHRTdHlsaW5nS2V5Owp9Ci8qKgogKiBDb2xsZWN0IGFsbCBzdGF0aWMgdmFsdWVzIGFmdGVyIHRoZSBjdXJyZW50IGBUTm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdGAgaW5kZXguCiAqCiAqIENvbGxlY3QgdGhlIHJlbWFpbmluZyBzdHlsaW5nIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gY29sbGVjdGVkIGJ5IGFuIGV4aXN0aW5nCiAqIHN0eWxpbmcgaW5zdHJ1Y3Rpb24uCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgYERpcmVjdGl2ZURlZnNgIGFyZSBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB3aGljaCBjb250YWlucyB0aGUgZGlyZWN0aXZlIHJhbmdlLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFJlc2lkdWFsKHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzaWR1YWwgPSB1bmRlZmluZWQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaXJlY3RpdmVFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnROb3RFcXVhbCh0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdCwgLTEsICdCeSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGF0IGxlYXN0IG9uZSBob3N0QmluZGluZ3Mtbm9kZSBzdHlsaW5nIGluc3RydWN0aW9uIG11c3QgaGF2ZSBleGVjdXRlZC4nKTsKICAgIC8vIFdlIGFkZCBgMSArIHROb2RlLmRpcmVjdGl2ZVN0YXJ0YCBiZWNhdXNlIHdlIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBkaXJlY3RpdmUgKGFzIHdlIGFyZQogICAgLy8gY29sbGVjdGluZyB0aGluZ3MgYWZ0ZXIgdGhlIGxhc3QgYGhvc3RCaW5kaW5nc2AgZGlyZWN0aXZlIHdoaWNoIGhhZCBhIHN0eWxpbmcgaW5zdHJ1Y3Rpb24uKQogICAgZm9yIChsZXQgaSA9IDEgKyB0Tm9kZS5kaXJlY3RpdmVTdHlsaW5nTGFzdDsgaSA8IGRpcmVjdGl2ZUVuZDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHJzID0gKCgvKiogQHR5cGUgez99ICovICh0RGF0YVtpXSkpKS5ob3N0QXR0cnM7CiAgICAgICAgcmVzaWR1YWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHJlc2lkdWFsLCBhdHRycywgaXNDbGFzc0Jhc2VkKSkpOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnMocmVzaWR1YWwsIHROb2RlLmF0dHJzLCBpc0NsYXNzQmFzZWQpKSk7Cn0KLyoqCiAqIENvbGxlY3QgdGhlIHN0YXRpYyBzdHlsaW5nIGluZm9ybWF0aW9uIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiBgaG9zdERpcmVjdGl2ZURlZmAuCiAqCiAqIChUaGlzIGlzIG9wcG9zaXRlIG9mIHJlc2lkdWFsIHN0eWxpbmcuKQogKgogKiBAcGFyYW0gez99IGhvc3REaXJlY3RpdmVEZWYgYERpcmVjdGl2ZURlZmAgZm9yIHdoaWNoIHdlIHdhbnQgdG8gY29sbGVjdCBsb3dlciBwcmlvcml0eSBzdGF0aWMKICogICAgICAgIHN0eWxpbmcuIChPciBgbnVsbGAgaWYgdGVtcGxhdGUgc3R5bGluZykKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHdoZXJlIHRoZSBsaW5rZWQgbGlzdCBpcyBzdG9yZWQuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAqIEBwYXJhbSB7P30gc3R5bGluZ0tleSBFeGlzdGluZyBgVFN0eWxpbmdLZXlgIHRvIHVwZGF0ZSBvciB3cmFwLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFN0eWxpbmdGcm9tRGlyZWN0aXZlcyhob3N0RGlyZWN0aXZlRGVmLCB0RGF0YSwgdE5vZGUsIHN0eWxpbmdLZXksIGlzQ2xhc3NCYXNlZCkgewogICAgLy8gV2UgbmVlZCB0byBsb29wIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBgaG9zdEF0dHJzYCBidXQgZG9uJ3QgaGF2ZQogICAgLy8gYGhvc3RCaW5kaW5nc2Agc28gdGhpcyBsb29wIGNhdGNoZXMgdXAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0aXZlLi4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyZW50RGlyZWN0aXZlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpcmVjdGl2ZUVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9IHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0OwogICAgaWYgKGRpcmVjdGl2ZVN0eWxpbmdMYXN0ID09PSAtMSkgewogICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkaXJlY3RpdmVTdHlsaW5nTGFzdCsrOwogICAgfQogICAgd2hpbGUgKGRpcmVjdGl2ZVN0eWxpbmdMYXN0IDwgZGlyZWN0aXZlRW5kKSB7CiAgICAgICAgY3VycmVudERpcmVjdGl2ZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtkaXJlY3RpdmVTdHlsaW5nTGFzdF0pKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjdXJyZW50RGlyZWN0aXZlLCAnZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCcpOwogICAgICAgIHN0eWxpbmdLZXkgPSBjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnMoc3R5bGluZ0tleSwgY3VycmVudERpcmVjdGl2ZS5ob3N0QXR0cnMsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgaWYgKGN1cnJlbnREaXJlY3RpdmUgPT09IGhvc3REaXJlY3RpdmVEZWYpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0Kys7CiAgICB9CiAgICBpZiAoaG9zdERpcmVjdGl2ZURlZiAhPT0gbnVsbCkgewogICAgICAgIC8vIHdlIG9ubHkgYWR2YW5jZSB0aGUgc3R5bGluZyBjdXJzb3IgaWYgd2UgYXJlIGNvbGxlY3RpbmcgZGF0YSBmcm9tIGhvc3QgYmluZGluZ3MuCiAgICAgICAgLy8gVGVtcGxhdGUgZXhlY3V0ZXMgYmVmb3JlIGhvc3QgYmluZGluZ3MgYW5kIHNvIGlmIHdlIHdvdWxkIHVwZGF0ZSB0aGUgaW5kZXgsCiAgICAgICAgLy8gaG9zdCBiaW5kaW5ncyB3b3VsZCBub3QgZ2V0IHRoZWlyIHN0YXRpY3MuCiAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgIH0KICAgIHJldHVybiBzdHlsaW5nS2V5Owp9Ci8qKgogKiBDb252ZXJ0IGBUQXR0cnNgIGludG8gYFRTdHlsaW5nU3RhdGljYC4KICoKICogQHBhcmFtIHs/fSBzdHlsaW5nS2V5IGV4aXN0aW5nIGBUU3R5bGluZ0tleWAgdG8gdXBkYXRlIG9yIHdyYXAuCiAqIEBwYXJhbSB7P30gYXR0cnMgYFRBdHRyaWJ1dGVzYCB0byBwcm9jZXNzLgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHN0eWxpbmdLZXksIGF0dHJzLCBpc0NsYXNzQmFzZWQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlc2lyZWRNYXJrZXIgPSBpc0NsYXNzQmFzZWQgPyAxIC8qIENsYXNzZXMgKi8gOiAyIC8qIFN0eWxlcyAqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjdXJyZW50TWFya2VyID0gLTEgLyogSW1wbGljaXRBdHRyaWJ1dGVzICovOwogICAgaWYgKGF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaV0pKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgY3VycmVudE1hcmtlciA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1hcmtlciA9PT0gZGVzaXJlZE1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsaW5nS2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsaW5nS2V5ID0gc3R5bGluZ0tleSA9PT0gdW5kZWZpbmVkID8gW10gOiAoLyoqIEB0eXBlIHs/fSAqLyAoWycnLCBzdHlsaW5nS2V5XSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KCgvKiogQHR5cGUgez99ICovIChzdHlsaW5nS2V5KSksIGl0ZW0sIGlzQ2xhc3NCYXNlZCA/IHRydWUgOiBhdHRyc1srK2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHlsaW5nS2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogc3R5bGluZ0tleTsKfQovKioKICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYERpcmVjdGl2ZURlZmAgd2hpY2ggaXMgYWN0aXZlIHdoZW4gYGhvc3RCaW5kaW5nc2Agc3R5bGUgaW5zdHJ1Y3Rpb24gaXMKICogYmVpbmcgZXhlY3V0ZWQgKG9yIGBudWxsYCBpZiB3ZSBhcmUgaW4gYHRlbXBsYXRlYC4pCiAqCiAqIEBwYXJhbSB7P30gdERhdGEgQ3VycmVudCBgVERhdGFgIHdoZXJlIHRoZSBgRGlyZWN0aXZlRGVmYCB3aWxsIGJlIGxvb2tlZCB1cCBhdC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEhvc3REaXJlY3RpdmVEZWYodERhdGEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGdldEN1cnJlbnREaXJlY3RpdmVJbmRleCgpOwogICAgcmV0dXJuIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9PT0gLTEgPyBudWxsIDogKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2N1cnJlbnREaXJlY3RpdmVJbmRleF0pKTsKfQovKioKICogQ29udmVydCB1c2VyIGlucHV0IHRvIGBLZXlWYWx1ZUFycmF5YC4KICoKICogVGhpcyBmdW5jdGlvbiB0YWtlcyB1c2VyIGlucHV0IHdoaWNoIGNvdWxkIGJlIGBzdHJpbmdgLCBPYmplY3QgbGl0ZXJhbCwgb3IgaXRlcmFibGUgYW5kIGNvbnZlcnRzCiAqIGl0IGludG8gYSBjb25zaXN0ZW50IHJlcHJlc2VudGF0aW9uLiBUaGUgb3V0cHV0IG9mIHRoaXMgaXMgYEtleVZhbHVlQXJyYXlgICh3aGljaCBpcyBhbiBhcnJheQogKiB3aGVyZQogKiBldmVuIGluZGV4ZXMgY29udGFpbiBrZXlzIGFuZCBvZGQgaW5kZXhlcyBjb250YWluIHZhbHVlcyBmb3IgdGhvc2Uga2V5cykuCiAqCiAqIFRoZSBhZHZhbnRhZ2Ugb2YgY29udmVydGluZyB0byBgS2V5VmFsdWVBcnJheWAgaXMgdGhhdCB3ZSBjYW4gcGVyZm9ybSBkaWZmIGluIGFuIGlucHV0CiAqIGluZGVwZW5kZW50CiAqIHdheS4KICogKGllIHdlIGNhbiBjb21wYXJlIGBmb28gYmFyYCB0byBgWydiYXInLCAnYmF6J10gYW5kIGRldGVybWluZSBhIHNldCBvZiBjaGFuZ2VzIHdoaWNoIG5lZWQgdG8gYmUKICogYXBwbGllZCkKICoKICogVGhlIGZhY3QgdGhhdCBgS2V5VmFsdWVBcnJheWAgaXMgc29ydGVkIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGNvbXB1dGUgdGhlCiAqIGRpZmZlcmVuY2UgaW4gbGluZWFyIGZhc2hpb24gd2l0aG91dCB0aGUgbmVlZCB0byBhbGxvY2F0ZSBhbnkgYWRkaXRpb25hbCBkYXRhLgogKgogKiBGb3IgZXhhbXBsZSBpZiB3ZSBrZXB0IHRoaXMgYXMgYSBgTWFwYCB3ZSB3b3VsZCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBwcmV2aW91cyBgTWFwYCB0byBkZXRlcm1pbmUKICogd2hpY2ggdmFsdWVzIG5lZWQgdG8gYmUgZGVsZXRlZCwgb3ZlciB0aGUgbmV3IGBNYXBgIHRvIGRldGVybWluZSBhZGRpdGlvbnMsIGFuZCB3ZSB3b3VsZCBoYXZlIHRvCiAqIGtlZXAgYWRkaXRpb25hbCBgTWFwYCB0byBrZWVwIHRyYWNrIG9mIGR1cGxpY2F0ZXMgb3IgaXRlbXMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4gdmlzaXRlZC4KICoKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5U2V0IChTZWUgYGtleVZhbHVlQXJyYXlTZXRgIGluICJ1dGlsL2FycmF5X3V0aWxzIikgR2V0cyBwYXNzZWQgaW4gYXMgYQogKiBmdW5jdGlvbiBzbyB0aGF0CiAqICAgICAgICBgc3R5bGVgIGNhbiBwYXNzIGluIHZlcnNpb24gd2hpY2ggZG9lcyBzYW5pdGl6YXRpb24uIFRoaXMgaXMgZG9uZSBmb3IgdHJlZSBzaGFraW5nCiAqICAgICAgICBwdXJwb3Nlcy4KICogQHBhcmFtIHs/fSBzdHJpbmdQYXJzZXIgVGhlIHBhcnNlciBpcyBwYXNzZWQgaW4gc28gdGhhdCBpdCB3aWxsIGJlIHRyZWUgc2hha2FibGUuIFNlZQogKiAgICAgICAgYHN0eWxlU3RyaW5nUGFyc2VyYCBhbmQgYGNsYXNzU3RyaW5nUGFyc2VyYAogKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBwYXJzZS9jb252ZXJ0IHRvIGBLZXlWYWx1ZUFycmF5YAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9TdHlsaW5nS2V5VmFsdWVBcnJheShrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gbnVsbCAvKnx8IHZhbHVlID09PSB1bmRlZmluZWQgKi8gfHwgdmFsdWUgPT09ICcnKQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfQVJSQVkkMykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3R5bGVLZXlWYWx1ZUFycmF5ID0gKC8qKiBAdHlwZSB7P30gKi8gKFtdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1bndyYXBwZWRWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovICh1bndyYXBTYWZlVmFsdWUodmFsdWUpKSk7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh1bndyYXBwZWRWYWx1ZSkpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVud3JhcHBlZFZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGtleVZhbHVlQXJyYXlTZXQoc3R5bGVLZXlWYWx1ZUFycmF5LCB1bndyYXBwZWRWYWx1ZVtpXSwgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIHVud3JhcHBlZFZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgIGZvciAoY29uc3Qga2V5IGluIHVud3JhcHBlZFZhbHVlKSB7CiAgICAgICAgICAgIGlmICh1bndyYXBwZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KHN0eWxlS2V5VmFsdWVBcnJheSwga2V5LCB1bndyYXBwZWRWYWx1ZVtrZXldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiB1bndyYXBwZWRWYWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBzdHJpbmdQYXJzZXIoc3R5bGVLZXlWYWx1ZUFycmF5LCB1bndyYXBwZWRWYWx1ZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgdGhyb3dFcnJvciQxKCdVbnN1cHBvcnRlZCBzdHlsaW5nIHR5cGUgJyArIHR5cGVvZiB1bndyYXBwZWRWYWx1ZSArICc6ICcgKyB1bndyYXBwZWRWYWx1ZSk7CiAgICB9CiAgICByZXR1cm4gc3R5bGVLZXlWYWx1ZUFycmF5Owp9Ci8qKgogKiBTZXQgYSBgdmFsdWVgIGZvciBhIGBrZXlgIHRha2luZyBzdHlsZSBzYW5pdGl6YXRpb24gaW50byBhY2NvdW50LgogKgogKiBTZWU6IGBrZXlWYWx1ZUFycmF5U2V0YCBmb3IgZGV0YWlscwogKgogKiBAcGFyYW0gez99IGtleVZhbHVlQXJyYXkgS2V5VmFsdWVBcnJheSB0byBhZGQgdG8uCiAqIEBwYXJhbSB7P30ga2V5IFN0eWxlIGtleSB0byBhZGQuIChUaGlzIGtleSB3aWxsIGJlIGNoZWNrZWQgaWYgaXQgbmVlZHMgc2FuaXRpemF0aW9uKQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgKElmIGtleSBuZWVkcyBzYW5pdGl6YXRpb24gaXQgd2lsbCBiZSBzYW5pdGl6ZWQpCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHlsZUtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSkgewogICAgaWYgKHN0eWxlUHJvcE5lZWRzU2FuaXRpemF0aW9uKGtleSkpIHsKICAgICAgICB2YWx1ZSA9IMm1ybVzYW5pdGl6ZVN0eWxlKHZhbHVlKTsKICAgIH0KICAgIGtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSk7Cn0KLyoqCiAqIFVwZGF0ZSBtYXAgYmFzZWQgc3R5bGluZy4KICoKICogTWFwIGJhc2VkIHN0eWxpbmcgY291bGQgYmUgYW55dGhpbmcgd2hpY2ggY29udGFpbnMgbW9yZSB0aGFuIG9uZSBiaW5kaW5nLiBGb3IgZXhhbXBsZSBgc3RyaW5nYCwKICogb3Igb2JqZWN0IGxpdGVyYWwuIERlYWxpbmcgd2l0aCBhbGwgb2YgdGhlc2UgdHlwZXMgd291bGQgY29tcGxpY2F0ZSB0aGUgbG9naWMgc28KICogaW5zdGVhZCB0aGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCB0aGUgY29tcGxleCBpbnB1dCBpcyBmaXJzdCBjb252ZXJ0ZWQgaW50byBub3JtYWxpemVkCiAqIGBLZXlWYWx1ZUFycmF5YC4gVGhlIGFkdmFudGFnZSBvZiBub3JtYWxpemF0aW9uIGlzIHRoYXQgd2UgZ2V0IHRoZSB2YWx1ZXMgc29ydGVkLCB3aGljaCBtYWtlcyBpdAogKiB2ZXJ5IGNoZWFwIHRvIGNvbXB1dGUgZGVsdGFzIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCBjdXJyZW50IHZhbHVlLgogKgogKiBAcGFyYW0gez99IHRWaWV3IEFzc29jaWF0ZWQgYFRWaWV3LmRhdGFgIGNvbnRhaW5zIHRoZSBsaW5rZWQgbGlzdCBvZiBiaW5kaW5nIHByaW9yaXRpZXMuCiAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB3aGVyZSB0aGUgYmluZGluZyBpcyBsb2NhdGVkLgogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgY29udGFpbnMgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgc3R5bGluZyBiaW5kaW5nIGF0IHRoaXMgYFROb2RlYC4KICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UgaWYgYW55IHVwZGF0ZXMuCiAqIEBwYXJhbSB7P30gb2xkS2V5VmFsdWVBcnJheSBQcmV2aW91cyB2YWx1ZSByZXByZXNlbnRlZCBhcyBgS2V5VmFsdWVBcnJheWAKICogQHBhcmFtIHs/fSBuZXdLZXlWYWx1ZUFycmF5IEN1cnJlbnQgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYEtleVZhbHVlQXJyYXlgCiAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4IEJpbmRpbmcgaW5kZXggb2YgdGhlIGJpbmRpbmcuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1cGRhdGVTdHlsaW5nTWFwKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHJlbmRlcmVyLCBvbGRLZXlWYWx1ZUFycmF5LCBuZXdLZXlWYWx1ZUFycmF5LCBpc0NsYXNzQmFzZWQsIGJpbmRpbmdJbmRleCkgewogICAgaWYgKCgvKiogQHR5cGUgez99ICovIChvbGRLZXlWYWx1ZUFycmF5KSkgPT09IE5PX0NIQU5HRSkgewogICAgICAgIC8vIE9uIGZpcnN0IGV4ZWN1dGlvbiB0aGUgb2xkS2V5VmFsdWVBcnJheSBpcyBOT19DSEFOR0UgPT4gdHJlYXQgaXQgYXMgZW1wdHkgS2V5VmFsdWVBcnJheS4KICAgICAgICBvbGRLZXlWYWx1ZUFycmF5ID0gKC8qKiBAdHlwZSB7P30gKi8gKEVNUFRZX0FSUkFZJDMpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBvbGRJbmRleCA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV3SW5kZXggPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG9sZEtleSA9IDAgPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbMF0gOiBudWxsOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5ld0tleSA9IDAgPCBuZXdLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG5ld0tleVZhbHVlQXJyYXlbMF0gOiBudWxsOwogICAgd2hpbGUgKG9sZEtleSAhPT0gbnVsbCB8fCBuZXdLZXkgIT09IG51bGwpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4ob2xkSW5kZXgsIDk5OSwgJ0FyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPycpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbihuZXdJbmRleCwgOTk5LCAnQXJlIHdlIHN0dWNrIGluIGluZmluaXRlIGxvb3A/Jyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXggKyAxXSA6IHVuZGVmaW5lZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBuZXdJbmRleCA8IG5ld0tleVZhbHVlQXJyYXkubGVuZ3RoID8gbmV3S2V5VmFsdWVBcnJheVtuZXdJbmRleCArIDFdIDogdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2V0S2V5ID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNldFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChvbGRLZXkgPT09IG5ld0tleSkgewogICAgICAgICAgICAvLyBVUERBVEU6IEtleXMgYXJlIGVxdWFsID0+IG5ldyB2YWx1ZSBpcyBvdmVyd3JpdGluZyBvbGQgdmFsdWUuCiAgICAgICAgICAgIG9sZEluZGV4ICs9IDI7CiAgICAgICAgICAgIG5ld0luZGV4ICs9IDI7CiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIHNldEtleSA9IG5ld0tleTsKICAgICAgICAgICAgICAgIHNldFZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmV3S2V5ID09PSBudWxsIHx8IG9sZEtleSAhPT0gbnVsbCAmJiBvbGRLZXkgPCAoLyoqIEB0eXBlIHs/fSAqLyAobmV3S2V5KSkpIHsKICAgICAgICAgICAgLy8gREVMRVRFOiBvbGRLZXkga2V5IGlzIG1pc3Npbmcgb3Igd2UgZGlkIG5vdCBmaW5kIHRoZSBvbGRLZXkgaW4gdGhlIG5ld1ZhbHVlCiAgICAgICAgICAgIC8vIChiZWNhdXNlIHRoZSBrZXlWYWx1ZUFycmF5IGlzIHNvcnRlZCBhbmQgYG5ld0tleWAgaXMgZm91bmQgbGF0ZXIgYWxwaGFiZXRpY2FsbHkpLgogICAgICAgICAgICAvLyBgImJhY2tncm91bmQiIDwgImNvbG9yImAgc28gd2UgbmVlZCB0byBkZWxldGUgYCJiYWNrZ3JvdW5kImAgYmVjYXVzZSBpdCBpcyBub3QgZm91bmQgaW4gdGhlCiAgICAgICAgICAgIC8vIG5ldyBhcnJheS4KICAgICAgICAgICAgb2xkSW5kZXggKz0gMjsKICAgICAgICAgICAgc2V0S2V5ID0gb2xkS2V5OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gQ1JFQVRFOiBuZXdLZXkncyBpcyBlYXJsaWVyIGFscGhhYmV0aWNhbGx5IHRoYW4gb2xkS2V5J3MgKG9yIG5vIG9sZEtleSkgPT4gd2UgaGF2ZSBuZXcga2V5LgogICAgICAgICAgICAvLyBgImNvbG9yIiA+ICJiYWNrZ3JvdW5kImAgc28gd2UgbmVlZCB0byBhZGQgYGNvbG9yYCBiZWNhdXNlIGl0IGlzIGluIG5ldyBhcnJheSBidXQgbm90IGluCiAgICAgICAgICAgIC8vIG9sZCBhcnJheS4KICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobmV3S2V5LCAnRXhwZWN0aW5nIHRvIGhhdmUgYSB2YWxpZCBrZXknKTsKICAgICAgICAgICAgbmV3SW5kZXggKz0gMjsKICAgICAgICAgICAgc2V0S2V5ID0gbmV3S2V5OwogICAgICAgICAgICBzZXRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoc2V0S2V5ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHVwZGF0ZVN0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgcmVuZGVyZXIsIHNldEtleSwgc2V0VmFsdWUsIGlzQ2xhc3NCYXNlZCwgYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgb2xkS2V5ID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXhdIDogbnVsbDsKICAgICAgICBuZXdLZXkgPSBuZXdJbmRleCA8IG5ld0tleVZhbHVlQXJyYXkubGVuZ3RoID8gbmV3S2V5VmFsdWVBcnJheVtuZXdJbmRleF0gOiBudWxsOwogICAgfQp9Ci8qKgogKiBVcGRhdGUgYSBzaW1wbGUgKHByb3BlcnR5IG5hbWUpIHN0eWxpbmcuCiAqCiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYHByb3BgIGFuZCB1cGRhdGVzIHRoZSBET00gdG8gdGhhdCB2YWx1ZS4gVGhlIGZ1bmN0aW9uIHRha2VzIHRoZSBiaW5kaW5nCiAqIHZhbHVlIGFzIHdlbGwgYXMgYmluZGluZyBwcmlvcml0eSBpbnRvIGNvbnNpZGVyYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuCiAqIHRvIERPTS4gKEZvciBleGFtcGxlIGl0IG1heSBiZSBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgYSBoaWdoZXIgcHJpb3JpdHkgb3ZlcndyaXRlIHdoaWNoIGJsb2NrcwogKiB0aGUgRE9NIHdyaXRlLCBvciBpZiB0aGUgdmFsdWUgZ29lcyB0byBgdW5kZWZpbmVkYCBhIGxvd2VyIHByaW9yaXR5IG92ZXJ3cml0ZSBtYXkgYmUgY29uc3VsdGVkLikKICoKICogQHBhcmFtIHs/fSB0VmlldyBBc3NvY2lhdGVkIGBUVmlldy5kYXRhYCBjb250YWlucyB0aGUgbGlua2VkIGxpc3Qgb2YgYmluZGluZyBwcmlvcml0aWVzLgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hlcmUgdGhlIGJpbmRpbmcgaXMgbG9jYXRlZC4KICogQHBhcmFtIHs/fSBsVmlldyBgTFZpZXdgIGNvbnRhaW5zIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIG90aGVyIHN0eWxpbmcgYmluZGluZyBhdCB0aGlzIGBUTm9kZWAuCiAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlIGlmIGFueSB1cGRhdGVzLgogKiBAcGFyYW0gez99IHByb3AgRWl0aGVyIHN0eWxlIHByb3BlcnR5IG5hbWUgb3IgYSBjbGFzcyBuYW1lLgogKiBAcGFyYW0gez99IHZhbHVlIEVpdGhlciBzdHlsZSB2YWx1ZSBmb3IgYHByb3BgIG9yIGB0cnVlYC9gZmFsc2VgIGlmIGBwcm9wYCBpcyBjbGFzcy4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggQmluZGluZyBpbmRleCBvZiB0aGUgYmluZGluZy4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZVN0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgcmVuZGVyZXIsIHByb3AsIHZhbHVlLCBpc0NsYXNzQmFzZWQsIGJpbmRpbmdJbmRleCkgewogICAgaWYgKHROb2RlLnR5cGUgIT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc3R5bGluZyBvbiBub24tZWxlbWVudHMgKHN1Y2ggYXMgbmctY29udGFpbmVyKS4KICAgICAgICAvLyBUaGlzIGlzIHJhcmUsIGJ1dCBpdCBkb2VzIGhhcHBlbi4gSW4gc3VjaCBhIGNhc2UsIGp1c3QgaWdub3JlIHRoZSBiaW5kaW5nLgogICAgICAgIHJldHVybjsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHREYXRhID0gdFZpZXcuZGF0YTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRSYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaGlnaGVyUHJpb3JpdHlWYWx1ZSA9IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRSYW5nZSkgPwogICAgICAgIGZpbmRTdHlsaW5nVmFsdWUodERhdGEsIHROb2RlLCBsVmlldywgcHJvcCwgZ2V0VFN0eWxpbmdSYW5nZU5leHQodFJhbmdlKSwgaXNDbGFzc0Jhc2VkKSA6CiAgICAgICAgdW5kZWZpbmVkOwogICAgaWYgKCFpc1N0eWxpbmdWYWx1ZVByZXNlbnQoaGlnaGVyUHJpb3JpdHlWYWx1ZSkpIHsKICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgbmV4dCBkdXBsaWNhdGUsIG9yIHdlIGRpZCBub3QgZmluZCBhIGR1cGxpY2F0ZSB2YWx1ZS4KICAgICAgICBpZiAoIWlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRlbGV0ZSBjdXJyZW50IHZhbHVlIG9yIHJlc3RvcmUgdG8gbG93ZXIgcHJpb3JpdHkgdmFsdWUuCiAgICAgICAgICAgIGlmIChnZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0UmFuZ2UpKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcG9zc2libGUgcHJldiBkdXBsaWNhdGUsIGxldCdzIHJldHJpZXZlIGl0LgogICAgICAgICAgICAgICAgdmFsdWUgPSBmaW5kU3R5bGluZ1ZhbHVlKHREYXRhLCBudWxsLCBsVmlldywgcHJvcCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeUluZGV4KGdldFNlbGVjdGVkSW5kZXgoKSwgbFZpZXcpKSk7CiAgICAgICAgYXBwbHlTdHlsaW5nKHJlbmRlcmVyLCBpc0NsYXNzQmFzZWQsIHJOb2RlLCBwcm9wLCB2YWx1ZSk7CiAgICB9Cn0KLyoqCiAqIFNlYXJjaCBmb3Igc3R5bGluZyB2YWx1ZSB3aXRoIGhpZ2hlciBwcmlvcml0eSB3aGljaCBpcyBvdmVyd3JpdGluZyBjdXJyZW50IHZhbHVlLCBvciBhCiAqIHZhbHVlIG9mIGxvd2VyIHByaW9yaXR5IHRvIHdoaWNoIHdlIHNob3VsZCBmYWxsIGJhY2sgaWYgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLgogKgogKiBXaGVuIHZhbHVlIGlzIGJlaW5nIGFwcGxpZWQgYXQgYSBsb2NhdGlvbiwgcmVsYXRlZCB2YWx1ZXMgbmVlZCB0byBiZSBjb25zdWx0ZWQuCiAqIC0gSWYgdGhlcmUgaXMgYSBoaWdoZXIgcHJpb3JpdHkgYmluZGluZywgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoYXQgb25lIGluc3RlYWQuCiAqICAgRm9yIGV4YW1wbGUgYDxkaXYgIFtzdHlsZV09Intjb2xvcjpleHAxfSIgW3N0eWxlLmNvbG9yXT0iZXhwMiI+YCBjaGFuZ2UgdG8gYGV4cDFgCiAqICAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMmAgdG8gc2VlIGlmIGl0IGlzIHNldCB0byB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLgogKiAtIElmIHRoZXJlIGlzIGEgbG93ZXIgcHJpb3JpdHkgYmluZGluZyBhbmQgd2UgYXJlIGNoYW5naW5nIHRvIGB1bmRlZmluZWRgCiAqICAgRm9yIGV4YW1wbGUgYDxkaXYgIFtzdHlsZV09Intjb2xvcjpleHAxfSIgW3N0eWxlLmNvbG9yXT0iZXhwMiI+YCBjaGFuZ2UgdG8gYGV4cDJgIHRvCiAqICAgYHVuZGVmaW5lZGAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMWAgKGFuZCBzdGF0aWMgdmFsdWVzKSBhbmQgdXNlIHRoYXQgYXMgbmV3IHZhbHVlLgogKgogKiBOT1RFOiBUaGUgc3R5bGluZyBzdG9yZXMgdHdvIHZhbHVlcy4KICogMS4gVGhlIHJhdyB2YWx1ZSB3aGljaCBjYW1lIGZyb20gdGhlIGFwcGxpY2F0aW9uIGlzIHN0b3JlZCBhdCBgaW5kZXggKyAwYCBsb2NhdGlvbi4gKFRoaXMgdmFsdWUKICogICAgaXMgdXNlZCBmb3IgZGlydHkgY2hlY2tpbmcpLgogKiAyLiBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoY29udmVydGVkIHRvIGBLZXlWYWx1ZUFycmF5YCBpZiBtYXAgYW5kIHNhbml0aXplZCkgaXMgc3RvcmVkIGF0IGBpbmRleCArCiAqIDFgLgogKiAgICBUaGUgYWR2YW50YWdlIG9mIHN0b3JpbmcgdGhlIHNhbml0aXplZCB2YWx1ZSBpcyB0aGF0IG9uY2UgdGhlIHZhbHVlIGlzIHdyaXR0ZW4gd2UgZG9uJ3QgbmVlZAogKiAgICB0byB3b3JyeSBhYm91dCBzYW5pdGl6aW5nIGl0IGxhdGVyIG9yIGtlZXBpbmcgdHJhY2sgb2YgdGhlIHNhbml0aXplci4KICoKICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHVzZWQgZm9yIHRyYXZlcnNpbmcgdGhlIHByaW9yaXR5LgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgdG8gdXNlIGZvciByZXNvbHZpbmcgc3RhdGljIHN0eWxpbmcuIEFsc28gY29udHJvbHMgc2VhcmNoIGRpcmVjdGlvbi4KICogICAtIGBUTm9kZWAgc2VhcmNoIG5leHQgYW5kIHF1aXQgYXMgc29vbiBhcyBgaXNTdHlsaW5nVmFsdWVQcmVzZW50KHZhbHVlKWAgaXMgdHJ1ZS4KICogICAgICBJZiBubyB2YWx1ZSBmb3VuZCBjb25zdWx0IGB0Tm9kZS5yZXNpZHVhbFN0eWxlYC9gdE5vZGUucmVzaWR1YWxDbGFzc2AgZm9yIGRlZmF1bHQgdmFsdWUuCiAqICAgLSBgbnVsbGAgc2VhcmNoIHByZXYgYW5kIGdvIGFsbCB0aGUgd2F5IHRvIGVuZC4gUmV0dXJuIGxhc3QgdmFsdWUgd2hlcmUKICogICAgIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0dWFsIHZhbHVlcy4KICogQHBhcmFtIHs/fSBwcm9wIFByb3BlcnR5IHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkIGluLgogKiBAcGFyYW0gez99IGluZGV4IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBsaW5rZWQgbGlzdCBvZiBzdHlsaW5nIGJpbmRpbmdzIHdoZXJlIHRoZSBzZWFyY2ggc2hvdWxkIHN0YXJ0LgogKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmluZFN0eWxpbmdWYWx1ZSh0RGF0YSwgdE5vZGUsIGxWaWV3LCBwcm9wLCBpbmRleCwgaXNDbGFzc0Jhc2VkKSB7CiAgICAvLyBgVE5vZGVgIHRvIHVzZSBmb3IgcmVzb2x2aW5nIHN0YXRpYyBzdHlsaW5nLiBBbHNvIGNvbnRyb2xzIHNlYXJjaCBkaXJlY3Rpb24uCiAgICAvLyAgIC0gYFROb2RlYCBzZWFyY2ggbmV4dCBhbmQgcXVpdCBhcyBzb29uIGFzIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogICAgLy8gICAgICBJZiBubyB2YWx1ZSBmb3VuZCBjb25zdWx0IGB0Tm9kZS5yZXNpZHVhbFN0eWxlYC9gdE5vZGUucmVzaWR1YWxDbGFzc2AgZm9yIGRlZmF1bHQgdmFsdWUuCiAgICAvLyAgIC0gYG51bGxgIHNlYXJjaCBwcmV2IGFuZCBnbyBhbGwgdGhlIHdheSB0byBlbmQuIFJldHVybiBsYXN0IHZhbHVlIHdoZXJlCiAgICAvLyAgICAgYGlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSlgIGlzIHRydWUuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1ByZXZEaXJlY3Rpb24gPSB0Tm9kZSA9PT0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2YWx1ZSA9IHVuZGVmaW5lZDsKICAgIHdoaWxlIChpbmRleCA+IDApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmF3S2V5ID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4XSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250YWluc1N0YXRpY3MgPSBBcnJheS5pc0FycmF5KHJhd0tleSk7CiAgICAgICAgLy8gVW53cmFwIHRoZSBrZXkgaWYgd2UgY29udGFpbiBzdGF0aWMgdmFsdWVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZXkgPSBjb250YWluc1N0YXRpY3MgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHJhd0tleSkpKVsxXSA6IHJhd0tleTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNTdHlsaW5nTWFwID0ga2V5ID09PSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWVBdExWaWV3SW5kZXggPSBsVmlld1tpbmRleCArIDFdOwogICAgICAgIGlmICh2YWx1ZUF0TFZpZXdJbmRleCA9PT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8vIEluIGZpcnN0VXBkYXRlUGFzcyB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbnMgY3JlYXRlIGEgbGlua2VkIGxpc3Qgb2Ygc3R5bGluZy4KICAgICAgICAgICAgLy8gT24gc3Vic2VxdWVudCBwYXNzZXMgaXQgaXMgcG9zc2libGUgZm9yIGEgc3R5bGluZyBpbnN0cnVjdGlvbiB0byB0cnkgdG8gcmVhZCBhIGJpbmRpbmcKICAgICAgICAgICAgLy8gd2hpY2gKICAgICAgICAgICAgLy8gaGFzIG5vdCB5ZXQgZXhlY3V0ZWQuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGZpbmQgYE5PX0NIQU5HRWAgYW5kIHdlIHNob3VsZCBhc3N1bWUgdGhhdAogICAgICAgICAgICAvLyB3ZSBoYXZlIGB1bmRlZmluZWRgIChvciBlbXB0eSBhcnJheSBpbiBjYXNlIG9mIHN0eWxpbmctbWFwIGluc3RydWN0aW9uKSBpbnN0ZWFkLiBUaGlzCiAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgcmVzb2x1dGlvbiB0byBhcHBseSB0aGUgdmFsdWUgKHdoaWNoIG1heSBsYXRlciBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZQogICAgICAgICAgICAvLyBiaW5kaW5nIGFjdHVhbGx5IGV4ZWN1dGVzLikKICAgICAgICAgICAgdmFsdWVBdExWaWV3SW5kZXggPSBpc1N0eWxpbmdNYXAgPyBFTVBUWV9BUlJBWSQzIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZSA9IGlzU3R5bGluZ01hcCA/IGtleVZhbHVlQXJyYXlHZXQodmFsdWVBdExWaWV3SW5kZXgsIHByb3ApIDoKICAgICAgICAgICAga2V5ID09PSBwcm9wID8gdmFsdWVBdExWaWV3SW5kZXggOiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKGNvbnRhaW5zU3RhdGljcyAmJiAhaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgY3VycmVudFZhbHVlID0ga2V5VmFsdWVBcnJheUdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmF3S2V5KSksIHByb3ApOwogICAgICAgIH0KICAgICAgICBpZiAoaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgdmFsdWUgPSBjdXJyZW50VmFsdWU7CiAgICAgICAgICAgIGlmIChpc1ByZXZEaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFJhbmdlID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2luZGV4ICsgMV0pKTsKICAgICAgICBpbmRleCA9IGlzUHJldkRpcmVjdGlvbiA/IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRSYW5nZSkgOiBnZXRUU3R5bGluZ1JhbmdlTmV4dCh0UmFuZ2UpOwogICAgfQogICAgaWYgKHROb2RlICE9PSBudWxsKSB7CiAgICAgICAgLy8gaW4gY2FzZSB3aGVyZSB3ZSBhcmUgZ29pbmcgaW4gbmV4dCBkaXJlY3Rpb24gQU5EIHdlIGRpZCBub3QgZmluZCBhbnl0aGluZywgd2UgbmVlZCB0bwogICAgICAgIC8vIGNvbnN1bHQgcmVzaWR1YWwgc3R5bGluZwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzaWR1YWwgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlczsKICAgICAgICBpZiAocmVzaWR1YWwgIT0gbnVsbCAvKiogT1IgcmVzaWR1YWwgIT09PSB1bmRlZmluZWQgKi8pIHsKICAgICAgICAgICAgdmFsdWUgPSBrZXlWYWx1ZUFycmF5R2V0KCgvKiogQHR5cGUgez99ICovIChyZXNpZHVhbCkpLCBwcm9wKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KLyoqCiAqIERldGVybWluZXMgaWYgdGhlIGJpbmRpbmcgdmFsdWUgc2hvdWxkIGJlIHVzZWQgKG9yIGlmIHRoZSB2YWx1ZSBpcyAndW5kZWZpbmVkJyBhbmQgaGVuY2UgcHJpb3JpdHkKICogcmVzb2x1dGlvbiBzaG91bGQgYmUgdXNlZC4pCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgQmluZGluZyBzdHlsZSB2YWx1ZS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSkgewogICAgLy8gQ3VycmVudGx5IG9ubHkgYHVuZGVmaW5lZGAgdmFsdWUgaXMgY29uc2lkZXJlZCBub24tYmluZGluZy4gVGhhdCBpcyBgdW5kZWZpbmVkYCBzYXlzIEkgZG9uJ3QKICAgIC8vIGhhdmUgYW4gb3BpbmlvbiBhcyB0byB3aGF0IHRoaXMgYmluZGluZyBzaG91bGQgYmUgYW5kIHlvdSBzaG91bGQgY29uc3VsdCBvdGhlciBiaW5kaW5ncyBieQogICAgLy8gcHJpb3JpdHkgdG8gZGV0ZXJtaW5lIHRoZSB2YWxpZCB2YWx1ZS4KICAgIC8vIFRoaXMgaXMgZXh0cmFjdGVkIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHBsYWNlIHRvIGNvbnRyb2wgdGhpcy4KICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkOwp9Ci8qKgogKiBTYW5pdGl6ZXMgb3IgYWRkcyBzdWZmaXggdG8gdGhlIHZhbHVlLgogKgogKiBJZiB2YWx1ZSBpcyBgbnVsbGAvYHVuZGVmaW5lZGAgbm8gc3VmZml4IGlzIGFkZGVkCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBzdWZmaXhPclNhbml0aXplcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9ybWFsaXplQW5kQXBwbHlTdWZmaXhPclNhbml0aXplcih2YWx1ZSwgc3VmZml4T3JTYW5pdGl6ZXIpIHsKICAgIGlmICh2YWx1ZSA9PSBudWxsIC8qKiB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICovKSA7CiAgICBlbHNlIGlmICh0eXBlb2Ygc3VmZml4T3JTYW5pdGl6ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAvLyBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAgICAgICAgdmFsdWUgPSBzdWZmaXhPclNhbml0aXplcih2YWx1ZSk7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlb2Ygc3VmZml4T3JTYW5pdGl6ZXIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSArIHN1ZmZpeE9yU2FuaXRpemVyOwogICAgfQogICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgewogICAgICAgIHZhbHVlID0gc3RyaW5naWZ5KHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSkpOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9Ci8qKgogKiBUZXN0cyBpZiB0aGUgYFROb2RlYCBoYXMgaW5wdXQgc2hhZG93LgogKgogKiBBbiBpbnB1dCBzaGFkb3cgaXMgd2hlbiBhIGRpcmVjdGl2ZSBzdGVhbHMgKHNoYWRvd3MpIHRoZSBpbnB1dCBieSB1c2luZyBgXEBJbnB1dCgnc3R5bGUnKWAgb3IKICogYFxASW5wdXQoJ2NsYXNzJylgIGFzIGlucHV0LgogKgogKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hpY2ggd2Ugd291bGQgbGlrZSB0byBzZWUgaWYgaXQgaGFzIHNoYWRvdy4KICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGhhc1N0eWxpbmdJbnB1dFNoYWRvdyh0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgKGlzQ2xhc3NCYXNlZCA/IDE2IC8qIGhhc0NsYXNzSW5wdXQgKi8gOiAzMiAvKiBoYXNTdHlsZUlucHV0ICovKSkgIT09IDA7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3RleHQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIENyZWF0ZSBzdGF0aWMgdGV4dCBub2RlCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBub2RlIGluIHRoZSBkYXRhIGFycmF5CiAqIEBwYXJhbSB7Pz19IHZhbHVlIFN0YXRpYyBzdHJpbmcgdmFsdWUgdG8gd3JpdGUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1dGV4dChpbmRleCwgdmFsdWUgPSAnJykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ3RleHQgbm9kZXMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncycpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBhZGp1c3RlZEluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHROb2RlID0gdFZpZXcuZmlyc3RDcmVhdGVQYXNzID8KICAgICAgICBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgMyAvKiBFbGVtZW50ICovLCBudWxsLCBudWxsKSA6CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRleHROYXRpdmUgPSBsVmlld1thZGp1c3RlZEluZGV4XSA9IGNyZWF0ZVRleHROb2RlKHZhbHVlLCBsVmlld1tSRU5ERVJFUl0pOwogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCB0ZXh0TmF0aXZlLCB0Tm9kZSk7CiAgICAvLyBUZXh0IG5vZGVzIGFyZSBzZWxmIGNsb3NpbmcuCiAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGZhbHNlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvdGV4dF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggYSBsb25lIGJvdW5kIHZhbHVlCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQsIGFuIG5vIGFkZGl0aW9uYWwgdGV4dAogKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6CiAqCiAqIGBgYGh0bWwKICogPGRpdj57e3YwfX08L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZSh2MCk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdjAKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZSh2MCkgewogICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoJycsIHYwLCAnJyk7CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX1zdWZmaXg8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZTEoJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTEocHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlMTsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGUyKCdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICogQHNlZSB0ZXh0SW50ZXJwb2xhdGVWCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1dGV4dEludGVycG9sYXRlMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjIobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlMjsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeDwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1dGV4dEludGVycG9sYXRlMygKICogJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1dGV4dEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICB9CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTM7Cn0KLyoqCiAqCiAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU0KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqIEBzZWUgybXJtXRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTQocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlNDsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyA1IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU1KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICogYGBgCiAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXgKICogQHBhcmFtIHs/fSB2MAogKiBAcGFyYW0gez99IGkwCiAqIEBwYXJhbSB7P30gdjEKICogQHBhcmFtIHs/fSBpMQogKiBAcGFyYW0gez99IHYyCiAqIEBwYXJhbSB7P30gaTIKICogQHBhcmFtIHs/fSB2MwogKiBAcGFyYW0gez99IGkzCiAqIEBwYXJhbSB7P30gdjQKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTUocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZCA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICB9CiAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTU7Cn0KLyoqCiAqCiAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCA2IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAqCiAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXg8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXRleHRJbnRlcnBvbGF0ZTYoCiAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogQHNlZSB0ZXh0SW50ZXJwb2xhdGVWCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeAogKiBAcGFyYW0gez99IHYwCiAqIEBwYXJhbSB7P30gaTAKICogQHBhcmFtIHs/fSB2MQogKiBAcGFyYW0gez99IGkxCiAqIEBwYXJhbSB7P30gdjIKICogQHBhcmFtIHs/fSBpMgogKiBAcGFyYW0gez99IHYzCiAqIEBwYXJhbSB7P30gaTMKICogQHBhcmFtIHs/fSB2NAogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLiBcQHJldHVybnMgaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKiBAcGFyYW0gez99IHN1ZmZpeAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTYocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgfQogICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGU2Owp9Ci8qKgogKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogKgogKiBVc2VkIHdoZW4gYSB0ZXh0IG5vZGUgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2PnByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeDwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1dGV4dEludGVycG9sYXRlNygKICogICAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBzdWZmaXgKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlNzsKfQovKioKICoKICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDggYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICoKICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU4KAogKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4CiAqIEBwYXJhbSB7P30gdjAKICogQHBhcmFtIHs/fSBpMAogKiBAcGFyYW0gez99IHYxCiAqIEBwYXJhbSB7P30gaTEKICogQHBhcmFtIHs/fSB2MgogKiBAcGFyYW0gez99IGkyCiAqIEBwYXJhbSB7P30gdjMKICogQHBhcmFtIHs/fSBpMwogKiBAcGFyYW0gez99IHY0CiAqIEBwYXJhbSB7P30gaTQKICogQHBhcmFtIHs/fSB2NQogKiBAcGFyYW0gez99IGk1CiAqIEBwYXJhbSB7P30gdjYKICogQHBhcmFtIHs/fSBpNgogKiBAcGFyYW0gez99IHY3CiAqIEBwYXJhbSB7P30gc3VmZml4CiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybV0ZXh0SW50ZXJwb2xhdGU4KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgfQogICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGU4Owp9Ci8qKgogKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggOSBvciBtb3JlIGJvdW5kIHZhbHVlcyBvdGhlciBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogKgogKiBgYGBodG1sCiAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fS17e3Y4fX0te3t2OX19c3VmZml4PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybV0ZXh0SW50ZXJwb2xhdGVWKAogKiAgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICogICdzdWZmaXgnXSk7CiAqIGBgYAogKiAuCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHZhbHVlcyBUaGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYW5kIHRoZSBzdHJpbmdzIGluIGJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aAogKiBhIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICoKICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKTsKICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgIH0KICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlVjsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvY2xhc3NfbWFwX2ludGVycG9sYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMSgncHJlZml4JywgdjAsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMShwcmVmaXgsIHYwLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGludGVycG9sYXRlZFZhbHVlLCB0cnVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggMiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBjbGFzcz0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMigncHJlZml4JywgdjAsICctJywgdjEsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUzKAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24zKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTQoCiAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU1KAogKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlNShwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU2KAogKiAgICAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlNihwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTcoCiAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU4KAogKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwp9Ci8qKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAqCiAqIGBgYGh0bWwKICogPGRpdgogKiAgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlVigKICogIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksCiAqICAnc3VmZml4J10pOwogKiBgYGAKICogLgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICogYSBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguCiAqIChlLmcuIGBbJ3ByZWZpeCcsIHZhbHVlMCwgJy0nLCB2YWx1ZTEsICctJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxlX21hcF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMSgna2V5OiAnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUxKHByZWZpeCwgdjAsIHN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIoJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIocHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjIobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkyOiB7e3YxfX07IGtleTI6IHt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMygKICogICAgICdrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24zKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU0KAogKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjQobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCk7CiAgICDJtcm1c3R5bGVNYXAoaW50ZXJwb2xhdGVkVmFsdWUpOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fTsga2V5MToge3t2MX19OyBrZXkyOiB7e3YyfX07IGtleTM6IHt7djN9fTsga2V5NDoge3t2NH19c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU1KAogKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319OyBrZXk0OiB7e3Y0fX07CiAqICAgICAgICAgICAgIGtleTU6IHt7djV9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNigKICogICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnOyBrZXk1OiAnLCB2NSwKICogICAgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgICAgICBrZXk2OiB7e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTcoCiAqICAgICdrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAqICAgICc7IGtleTY6ICcsIHY2LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQovKioKICoKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAqCiAqIGBgYGh0bWwKICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgICAgICBrZXk2OiB7e3Y2fX07IGtleTc6IHt7djd9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlOCgKICogICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnOyBrZXk1OiAnLCB2NSwKICogICAgJzsga2V5NjogJywgdjYsICc7IGtleTc6ICcsIHY3LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7Cn0KLyoqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGV4Y2VlZHMgOC4KICoKICogYGBgaHRtbAogKiA8ZGl2CiAqICBjbGFzcz0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogKiAgICAgICAgIGtleTY6IHt7djZ9fTsga2V5Nzoge3t2N319OyBrZXk4OiB7e3Y4fX07IGtleTk6IHt7djl9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlVigKICogICAgWydrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAqICAgICAnOyBrZXk2OiAnLCB2NiwgJzsga2V5NzogJywgdjcsICc7IGtleTg6ICcsIHY4LCAnOyBrZXk5OiAnLCB2OSwgJ3N1ZmZpeCddKTsKICogYGBgCiAqIC4KICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gdmFsdWVzIFRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBhbmQgdGhlIHN0cmluZ3MgaW4tYmV0d2VlbiB0aG9zZSB2YWx1ZXMsIGJlZ2lubmluZyB3aXRoCiAqIGEgc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogKiAoZS5nLiBgWydwcmVmaXgnLCB2YWx1ZTAsICc7IGtleTI6ICcsIHZhbHVlMSwgJzsga2V5MjogJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvc3R5bGVfcHJvcF9pbnRlcnBvbGF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogKgogKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxKDAsICdwcmVmaXgnLCB2MCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEocHJvcCwgcHJlZml4LCB2MCwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTE7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyKDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTIocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24yKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCAzIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDMgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMoMCwgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlMyhwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUzOwp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0KDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQ7Cn0KLyoqCiAqCiAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICoKICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogKgogKiBgYGBodG1sCiAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1KDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTUocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA2IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDYgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fXN1ZmZpeCI+PC9kaXY+CiAqIGBgYAogKgogKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAqCiAqIGBgYHRzCiAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYoMCwgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBwcm9wCiAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogKi8KZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlNihwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU2Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDcgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX1zdWZmaXgiPjwvZGl2PgogKiBgYGAKICoKICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogKgogKiBgYGB0cwogKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3KAogKiAgICAwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3AKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICBjaGVja1N0eWxpbmdQcm9wZXJ0eShwcm9wLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdmFsdWVTdWZmaXgsIGZhbHNlKTsKICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3Owp9Ci8qKgogKgogKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICoKICogYGBgaHRtbAogKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlOCgwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsCiAqICctJywgdjcsICdzdWZmaXgnKTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHByb3AKICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAqLwpmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICByZXR1cm4gybXJtXN0eWxlUHJvcEludGVycG9sYXRlODsKfQovKioKICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggOSBvciBtb3JlIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5CiAqIHRleHQuCiAqCiAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogKgogKiBgYGBodG1sCiAqIDxkaXYKICogIHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319LXt7djh9fS17e3Y5fX1zdWZmaXgiPgogKiA8L2Rpdj4KICogYGBgCiAqCiAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICoKICogYGBgdHMKICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlVigKICogIDAsIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksCiAqICAnc3VmZml4J10pOwogKiBgYGAKICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gcHJvcAogKiBAcGFyYW0gez99IHZhbHVlcyBUaGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYW5kIHRoZSBzdHJpbmdzIGluLWJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aAogKiBhIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICovCmZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYocHJvcCwgdmFsdWVzLCB2YWx1ZVN1ZmZpeCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKTsKICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVY7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2hvc3RfcHJvcGVydHkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgaG9zdCBlbGVtZW50LiBPbmx5IGFwcGxpZXMgdG8gbmF0aXZlIG5vZGUgcHJvcGVydGllcywgbm90IGlucHV0cy4KICoKICogT3BlcmF0ZXMgb24gdGhlIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggdmlhIHRoZSB7XEBsaW5rIHNlbGVjdH0gaW5zdHJ1Y3Rpb24uCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHByb3BOYW1lIE5hbWUgb2YgcHJvcGVydHkuIEJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gRE9NLCB0aGlzIGlzIG5vdCBzdWJqZWN0IHRvCiAqICAgICAgICByZW5hbWluZyBhcyBwYXJ0IG9mIG1pbmlmaWNhdGlvbi4KICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICogQHJldHVybiB7P30gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGl0c2VsZiBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkCiAqIChlLmcuIGBwcm9wZXJ0eSgnbmFtZScsIGN0eC5uYW1lKSgndGl0bGUnLCBjdHgudGl0bGUpYCkKICoKICovCmZ1bmN0aW9uIMm1ybVob3N0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCB0cnVlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGJpbmRpbmdJbmRleCk7CiAgICB9CiAgICByZXR1cm4gybXJtWhvc3RQcm9wZXJ0eTsKfQovKioKICogVXBkYXRlcyBhIHN5bnRoZXRpYyBob3N0IGJpbmRpbmcgKGUuZy4gYFtcQGZvb11gKSBvbiBhIGNvbXBvbmVudC4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBpcyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlcyBhbmQgaXMgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgYQogKiBzeW50aGV0aWMgaG9zdCBiaW5kaW5nIChlLmcuIGBcQEhvc3RCaW5kaW5nKCdcQGZvbycpYCkgcHJvcGVybHkgZ2V0cyByZW5kZXJlZCBpbgogKiB0aGUgY29tcG9uZW50J3MgcmVuZGVyZXIuIE5vcm1hbGx5IGFsbCBob3N0IGJpbmRpbmdzIGFyZSBldmFsdWF0ZWQgd2l0aCB0aGUgcGFyZW50CiAqIGNvbXBvbmVudCdzIHJlbmRlcmVyLCBidXQsIGluIHRoZSBjYXNlIG9mIGFuaW1hdGlvbiBcQHRyaWdnZXJzLCB0aGV5IG5lZWQgdG8gYmUKICogZXZhbHVhdGVkIHdpdGggdGhlIHN1YiBjb21wb25lbnQncyByZW5kZXJlciAoYmVjYXVzZSB0aGF0J3Mgd2hlcmUgdGhlIGFuaW1hdGlvbgogKiB0cmlnZ2VycyBhcmUgZGVmaW5lZCkuCiAqCiAqIERvIG5vdCB1c2UgdGhpcyBpbnN0cnVjdGlvbiBhcyBhIHJlcGxhY2VtZW50IGZvciBgZWxlbWVudFByb3BlcnR5YC4gVGhpcyBpbnN0cnVjdGlvbgogKiBvbmx5IGV4aXN0cyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBWaWV3RW5naW5lJ3MgaG9zdCBiaW5kaW5nIGJlaGF2aW9yLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0bwogKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlLgogKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmcocHJvcE5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIodE5vZGUsIGxWaWV3KTsKICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIHJlbmRlcmVyLCBzYW5pdGl6ZXIsIHRydWUpOwogICAgICAgIG5nRGV2TW9kZSAmJiBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgYmluZGluZ0luZGV4KTsKICAgIH0KICAgIHJldHVybiDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmc7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2FsbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2Rpc2NvdmVyeV91dGlscy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRE9NIGVsZW1lbnQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBHaXZlbiB0aGUgZm9sbG93aW5nIERPTSBzdHJ1Y3R1cmU6CiAqIGBgYGh0bWwKICogPG15LWFwcD4KICogICA8ZGl2PgogKiAgICAgPGNoaWxkLWNvbXA+PC9jaGlsZC1jb21wPgogKiAgIDwvZGl2PgogKiA8L215LWFwcD4KICogYGBgCiAqIENhbGxpbmcgYGdldENvbXBvbmVudGAgb24gYDxjaGlsZC1jb21wPmAgd2lsbCByZXR1cm4gdGhlIGluc3RhbmNlIG9mIGBDaGlsZENvbXBvbmVudGAKICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgRE9NIGVsZW1lbnQuCiAqCiAqIENhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIGA8bXktYXBwPmAgd2lsbCByZXR1cm4gdGhlIGBNeUFwcGAgaW5zdGFuY2UuCiAqCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZWxlbWVudCBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJldHJpZXZlZC4KICogQHJldHVybiB7P30gQ29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBvciBgbnVsbGAgaWYgdGhlcmUKICogICAgaXMgbm8gY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4KICoKICovCmZ1bmN0aW9uIGdldENvbXBvbmVudChlbGVtZW50KSB7CiAgICBhc3NlcnREb21FbGVtZW50KGVsZW1lbnQpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGxvYWRMQ29udGV4dChlbGVtZW50LCBmYWxzZSk7CiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIGlmIChjb250ZXh0LmNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBnZXRDb21wb25lbnRBdE5vZGVJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7CiAgICB9CiAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY29tcG9uZW50KSk7Cn0KLyoqCiAqIElmIGluc2lkZSBhbiBlbWJlZGRlZCB2aWV3IChlLmcuIGAqbmdJZmAgb3IgYCpuZ0ZvcmApLCByZXRyaWV2ZXMgdGhlIGNvbnRleHQgb2YgdGhlIGVtYmVkZGVkCiAqIHZpZXcgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mLiBPdGhlcndpc2UgcmV0cmlldmVzIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IHdob3NlIHZpZXcKICogb3ducyB0aGUgZWxlbWVudCAoaW4gdGhpcyBjYXNlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgYGdldE93bmluZ0NvbXBvbmVudGApLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBzdXJyb3VuZGluZyBjb21wb25lbnQgaW5zdGFuY2UuCiAqIEByZXR1cm4gez99IEluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgdGhhdCBpcyBhcm91bmQgdGhlIGVsZW1lbnQgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpc24ndAogKiAgICBpbnNpZGUgYW55IGNvbXBvbmVudC4KICoKICovCmZ1bmN0aW9uIGdldENvbnRleHQoZWxlbWVudCkgewogICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRleHQgPSBsb2FkTENvbnRleHQoZWxlbWVudCwgZmFsc2UpOwogICAgcmV0dXJuIGNvbnRleHQgPT09IG51bGwgPyBudWxsIDogKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQubFZpZXdbQ09OVEVYVF0pKTsKfQovKioKICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBjb250YWlucyB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqIEZvciBleGFtcGxlLCBpZiBgPGNoaWxkLWNvbXA+YCBpcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiBgPGFwcC1jb21wPmAKICogKGkuZS4gYSBgVmlld0NoaWxkYCBvZiBgPGFwcC1jb21wPmApLCBjYWxsaW5nIGBnZXRPd25pbmdDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gCiAqIHdvdWxkIHJldHVybiBgPGFwcC1jb21wPmAuCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZWxlbWVudE9yRGlyIERPTSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlCiAqICAgIGZvciB3aGljaCB0byByZXRyaWV2ZSB0aGUgcm9vdCBjb21wb25lbnRzLgogKiBAcmV0dXJuIHs/fSBDb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBvd25zIHRoZSBET00gZWxlbWVudCBvciBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdAogKiAgICBwYXJ0IG9mIGEgY29tcG9uZW50IHZpZXcuCiAqCiAqLwpmdW5jdGlvbiBnZXRPd25pbmdDb21wb25lbnQoZWxlbWVudE9yRGlyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnRPckRpciwgZmFsc2UpOwogICAgaWYgKGNvbnRleHQgPT09IG51bGwpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbFZpZXcgPSBjb250ZXh0LmxWaWV3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcmVudDsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlldyhsVmlldyk7CiAgICB3aGlsZSAobFZpZXdbSE9TVF0gPT09IG51bGwgJiYgKHBhcmVudCA9ICgvKiogQHR5cGUgez99ICovIChnZXRMVmlld1BhcmVudChsVmlldykpKSkpIHsKICAgICAgICAvLyBBcyBsb25nIGFzIGxWaWV3W0hPU1RdIGlzIG51bGwgd2Uga25vdyB3ZSBhcmUgcGFydCBvZiBzdWItdGVtcGxhdGUgc3VjaCBhcyBgKm5nSWZgCiAgICAgICAgbFZpZXcgPSBwYXJlbnQ7CiAgICB9CiAgICByZXR1cm4gbFZpZXdbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLyA/IG51bGwgOiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbQ09OVEVYVF0pKTsKfQovKioKICogUmV0cmlldmVzIGFsbCByb290IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIGVsZW1lbnQsIGRpcmVjdGl2ZSBvciBjb21wb25lbnQgaW5zdGFuY2UuCiAqIFJvb3QgY29tcG9uZW50cyBhcmUgdGhvc2Ugd2hpY2ggaGF2ZSBiZWVuIGJvb3RzdHJhcHBlZCBieSBBbmd1bGFyLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGVsZW1lbnRPckRpciBET00gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZQogKiAgICBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHJvb3QgY29tcG9uZW50cy4KICogQHJldHVybiB7P30gUm9vdCBjb21wb25lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFyZ2V0IG9iamVjdC4KICoKICovCmZ1bmN0aW9uIGdldFJvb3RDb21wb25lbnRzKGVsZW1lbnRPckRpcikgewogICAgcmV0dXJuIFsuLi5nZXRSb290Q29udGV4dChlbGVtZW50T3JEaXIpLmNvbXBvbmVudHNdOwp9Ci8qKgogKiBSZXRyaWV2ZXMgYW4gYEluamVjdG9yYCBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICoKICogXEBwdWJsaWNBcGkKICogXEBnbG9iYWxBcGkgbmcKICogQHBhcmFtIHs/fSBlbGVtZW50T3JEaXIgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRvCiAqICAgIHJldHJpZXZlIHRoZSBpbmplY3Rvci4KICogQHJldHVybiB7P30gSW5qZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlLgogKgogKi8KZnVuY3Rpb24gZ2V0SW5qZWN0b3IoZWxlbWVudE9yRGlyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnRPckRpciwgZmFsc2UpOwogICAgaWYgKGNvbnRleHQgPT09IG51bGwpCiAgICAgICAgcmV0dXJuIEluamVjdG9yLk5VTEw7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmxWaWV3W1RWSUVXXS5kYXRhW2NvbnRleHQubm9kZUluZGV4XSkpOwogICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGNvbnRleHQubFZpZXcpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgZGlyZWN0aXZlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC4gRG9lcyBub3QgaW5jbHVkZQogKiBjb21wb25lbnQgaW5zdGFuY2VzLgogKgogKiBcQHVzYWdlTm90ZXMKICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOgogKiBgYGAKICogPG15LWFwcD4KICogICA8YnV0dG9uIG15LWJ1dHRvbj48L2J1dHRvbj4KICogICA8bXktY29tcD48L215LWNvbXA+CiAqIDwvbXktYXBwPgogKiBgYGAKICogQ2FsbGluZyBgZ2V0RGlyZWN0aXZlc2Agb24gYDxidXR0b24+YCB3aWxsIHJldHVybiBhbiBhcnJheSB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBgTXlCdXR0b25gCiAqIGRpcmVjdGl2ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqIENhbGxpbmcgYGdldERpcmVjdGl2ZXNgIG9uIGA8bXktY29tcD5gIHdpbGwgcmV0dXJuIGFuIGVtcHR5IGFycmF5LgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGVsZW1lbnQgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGlyZWN0aXZlcy4KICogQHJldHVybiB7P30gQXJyYXkgb2YgZGlyZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQuCiAqCiAqLwpmdW5jdGlvbiBnZXREaXJlY3RpdmVzKGVsZW1lbnQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRleHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobG9hZExDb250ZXh0KGVsZW1lbnQpKSk7CiAgICBpZiAoY29udGV4dC5kaXJlY3RpdmVzID09PSB1bmRlZmluZWQpIHsKICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBnZXREaXJlY3RpdmVzQXROb2RlSW5kZXgoY29udGV4dC5ub2RlSW5kZXgsIGNvbnRleHQubFZpZXcsIGZhbHNlKTsKICAgIH0KICAgIC8vIFRoZSBgZGlyZWN0aXZlc2AgaW4gdGhpcyBjYXNlIGFyZSBhIG5hbWVkIGFycmF5IGNhbGxlZCBgTENvbXBvbmVudFZpZXdgLiBDbG9uZSB0aGUKICAgIC8vIHJlc3VsdCBzbyB3ZSBkb24ndCBleHBvc2UgYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIHVzZXIncyBjb25zb2xlLgogICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gbnVsbCA/IFtdIDogWy4uLmNvbnRleHQuZGlyZWN0aXZlc107Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGFyZ2V0CiAqIEBwYXJhbSB7Pz19IHRocm93T25Ob3RGb3VuZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbG9hZExDb250ZXh0KHRhcmdldCwgdGhyb3dPbk5vdEZvdW5kID0gdHJ1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29udGV4dCA9IGdldExDb250ZXh0KHRhcmdldCk7CiAgICBpZiAoIWNvbnRleHQgJiYgdGhyb3dPbk5vdEZvdW5kKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5nRGV2TW9kZSA/IGBVbmFibGUgdG8gZmluZCBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCAke3N0cmluZ2lmeUZvckVycm9yKHRhcmdldCl9YCA6CiAgICAgICAgICAgICdJbnZhbGlkIG5nIHRhcmdldCcpOwogICAgfQogICAgcmV0dXJuIGNvbnRleHQ7Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgaG9zdCBlbGVtZW50IG9mIGEgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICogVGhlIGhvc3QgZWxlbWVudCBpcyB0aGUgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvciBvZiB0aGUgZGlyZWN0aXZlLgogKgogKiBcQHB1YmxpY0FwaQogKiBcQGdsb2JhbEFwaSBuZwogKiBAcGFyYW0gez99IGNvbXBvbmVudE9yRGlyZWN0aXZlIENvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBob3N0CiAqICAgICBlbGVtZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuCiAqIEByZXR1cm4gez99IEhvc3QgZWxlbWVudCBvZiB0aGUgdGFyZ2V0LgogKgogKi8KZnVuY3Rpb24gZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50T3JEaXJlY3RpdmUpIHsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChnZXRMQ29udGV4dChjb21wb25lbnRPckRpcmVjdGl2ZSkpKS5uYXRpdmUpKSkpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGV2ZW50IGxpc3RlbmVycyBhc3NvY2lhdGVkIHdpdGggYSBET00gZWxlbWVudC4gVGhlIGxpc3QgZG9lcyBpbmNsdWRlIGhvc3QKICogbGlzdGVuZXJzLCBidXQgaXQgZG9lcyBub3QgaW5jbHVkZSBldmVudCBsaXN0ZW5lcnMgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIGNvbnRleHQKICogKGUuZy4gdGhyb3VnaCBgYWRkRXZlbnRMaXN0ZW5lcmApLgogKgogKiBcQHVzYWdlTm90ZXMKICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOgogKiBgYGAKICogPG15LWFwcD4KICogICA8ZGl2IChjbGljayk9ImRvU29tZXRoaW5nKCkiPjwvZGl2PgogKiA8L215LWFwcD4KICoKICogYGBgCiAqIENhbGxpbmcgYGdldExpc3RlbmVyc2Agb24gYDxkaXY+YCB3aWxsIHJldHVybiBhbiBvYmplY3QgdGhhdCBsb29rcyBhcyBmb2xsb3dzOgogKiBgYGAKICogewogKiAgIG5hbWU6ICdjbGljaycsCiAqICAgZWxlbWVudDogPGRpdj4sCiAqICAgY2FsbGJhY2s6ICgpID0+IGRvU29tZXRoaW5nKCksCiAqICAgdXNlQ2FwdHVyZTogZmFsc2UKICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogXEBnbG9iYWxBcGkgbmcKICogQHBhcmFtIHs/fSBlbGVtZW50IEVsZW1lbnQgZm9yIHdoaWNoIHRoZSBET00gbGlzdGVuZXJzIHNob3VsZCBiZSByZXRyaWV2ZWQuCiAqIEByZXR1cm4gez99IEFycmF5IG9mIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgRE9NIGVsZW1lbnQuCiAqCiAqLwpmdW5jdGlvbiBnZXRMaXN0ZW5lcnMoZWxlbWVudCkgewogICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxDb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnQsIGZhbHNlKTsKICAgIGlmIChsQ29udGV4dCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGxDb250ZXh0LmxWaWV3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsQ2xlYW51cCA9IGxWaWV3W0NMRUFOVVBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbGlzdGVuZXJzID0gW107CiAgICBpZiAodENsZWFudXAgJiYgbENsZWFudXApIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aDspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFtID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWNvbmRQYXJhbSA9IHRDbGVhbnVwW2krK107CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlyc3RQYXJhbSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBmaXJzdFBhcmFtOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh1bndyYXBSTm9kZShsVmlld1tzZWNvbmRQYXJhbV0pKSkpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gbENsZWFudXBbdENsZWFudXBbaSsrXV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1c2VDYXB0dXJlT3JJbmR4ID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy4KICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgcG9zaXRpdmUgbnVtYmVyIHRoZW4gaXQgaW4gdW5zdWJzY3JpYmUgbWV0aG9kCiAgICAgICAgICAgICAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIG5lZ2F0aXZlIG51bWJlciB0aGVuIGl0IGlzIGEgU3Vic2NyaXB0aW9uCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gKHR5cGVvZiB1c2VDYXB0dXJlT3JJbmR4ID09PSAnYm9vbGVhbicgfHwgdXNlQ2FwdHVyZU9ySW5keCA+PSAwKSA/ICdkb20nIDogJ291dHB1dCc7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1c2VDYXB0dXJlID0gdHlwZW9mIHVzZUNhcHR1cmVPckluZHggPT09ICdib29sZWFuJyA/IHVzZUNhcHR1cmVPckluZHggOiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IGxpc3RlbmVyRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKHsgZWxlbWVudCwgbmFtZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUsIHR5cGUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBsaXN0ZW5lcnMuc29ydChzb3J0TGlzdGVuZXJzKTsKICAgIHJldHVybiBsaXN0ZW5lcnM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gYQogKiBAcGFyYW0gez99IGIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNvcnRMaXN0ZW5lcnMoYSwgYikgewogICAgaWYgKGEubmFtZSA9PSBiLm5hbWUpCiAgICAgICAgcmV0dXJuIDA7CiAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOwp9Ci8qKgogKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBhIERPTSBFbGVtZW50LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnREb21FbGVtZW50KHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmICEodmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50KSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGluc3RhbmNlIG9mIERPTSBFbGVtZW50Jyk7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBNYXJrcyBhIGNvbXBvbmVudCBmb3IgY2hlY2sgKGluIGNhc2Ugb2YgT25QdXNoIGNvbXBvbmVudHMpIGFuZCBzeW5jaHJvbm91c2x5CiAqIHBlcmZvcm1zIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIGFwcGxpY2F0aW9uIHRoaXMgY29tcG9uZW50IGJlbG9uZ3MgdG8uCiAqCiAqIFxAcHVibGljQXBpCiAqIFxAZ2xvYmFsQXBpIG5nCiAqIEBwYXJhbSB7P30gY29tcG9uZW50IENvbXBvbmVudCB0byB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI21hcmtGb3JDaGVjayBtYXJrIGZvciBjaGVja30uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBseUNoYW5nZXMoY29tcG9uZW50KSB7CiAgICBtYXJrRGlydHkoY29tcG9uZW50KTsKICAgIGdldFJvb3RDb21wb25lbnRzKGNvbXBvbmVudCkuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHJvb3RDb21wb25lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJvb3RDb21wb25lbnQgPT4gZGV0ZWN0Q2hhbmdlcyhyb290Q29tcG9uZW50KSkpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3V0aWwvZ2xvYmFsX3V0aWxzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBUaGlzIHZhbHVlIHJlZmxlY3RzIHRoZSBwcm9wZXJ0eSBvbiB0aGUgd2luZG93IHdoZXJlIHRoZSBkZXYKICogdG9vbHMgYXJlIHBhdGNoZWQgKHdpbmRvdy5uZykuCiAqCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVkgPSAnbmcnOwovKiogQHR5cGUgez99ICovCmxldCBfcHVibGlzaGVkID0gZmFsc2U7Ci8qKgogKiBQdWJsaXNoZXMgYSBjb2xsZWN0aW9uIG9mIGRlZmF1bHQgZGVidWcgdG9vbHMgb250b2B3aW5kb3cubmdgLgogKgogKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSB3aGVuIEFuZ3VsYXIgaXMgaW4gZGV2ZWxvcG1lbnQKICogbW9kZSBhbmQgYXJlIGF1dG9tYXRpY2FsbHkgc3RyaXBwZWQgYXdheSBmcm9tIHByb2QgbW9kZSBpcyBvbi4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMoKSB7CiAgICBpZiAoIV9wdWJsaXNoZWQpIHsKICAgICAgICBfcHVibGlzaGVkID0gdHJ1ZTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29tcG9uZW50JywgZ2V0Q29tcG9uZW50KTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29udGV4dCcsIGdldENvbnRleHQpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRMaXN0ZW5lcnMnLCBnZXRMaXN0ZW5lcnMpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRPd25pbmdDb21wb25lbnQnLCBnZXRPd25pbmdDb21wb25lbnQpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRIb3N0RWxlbWVudCcsIGdldEhvc3RFbGVtZW50KTsKICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0SW5qZWN0b3InLCBnZXRJbmplY3Rvcik7CiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldFJvb3RDb21wb25lbnRzJywgZ2V0Um9vdENvbXBvbmVudHMpOwogICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXREaXJlY3RpdmVzJywgZ2V0RGlyZWN0aXZlcyk7CiAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2FwcGx5Q2hhbmdlcycsIGFwcGx5Q2hhbmdlcyk7CiAgICB9Cn0KLyoqCiAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYHdpbmRvdy5uZ2Agc28gdGhhdCBpdCBjYW4gYmUKICogdXNlZCBmcm9tIHRoZSBicm93c2VyIGNvbnNvbGUgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBub3QgaW4gcHJvZHVjdGlvbi4KICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7P30gZm4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHB1Ymxpc2hHbG9iYWxVdGlsKG5hbWUsIGZuKSB7CiAgICBpZiAodHlwZW9mIENPTVBJTEVEID09PSAndW5kZWZpbmVkJyB8fCAhQ09NUElMRUQpIHsKICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBleHBvcnQgYG5nYCB3aGVuIHVzaW5nIGNsb3N1cmUgZW5oYW5jZWQgb3B0aW1pemF0aW9uIGFzOgogICAgICAgIC8vIC0gY2xvc3VyZSBkZWNsYXJlcyBnbG9iYWxzIGl0c2VsZiBmb3IgbWluaWZpZWQgbmFtZXMsIHdoaWNoIHNvbWV0aW1lcyBjbG9iYmVyIG91ciBgbmdgIGdsb2JhbAogICAgICAgIC8vIC0gd2UgY2FuJ3QgZGVjbGFyZSBhIGNsb3N1cmUgZXh0ZXJuIGFzIHRoZSBuYW1lc3BhY2UgYG5nYCBpcyBhbHJlYWR5IHVzZWQgd2l0aGluIEdvb2dsZQogICAgICAgIC8vICAgZm9yIHR5cGluZ3MgZm9yIEFuZ3VsYXJKUyAodmlhIGBnb29nLnByb3ZpZGUoJ25nLi4uLicpYCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKF9nbG9iYWwpKSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGZuLCAnZnVuY3Rpb24gbm90IGRlZmluZWQnKTsKICAgICAgICBpZiAodykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjb250YWluZXIgPSB3W0dMT0JBTF9QVUJMSVNIX0VYUEFORE9fS0VZXTsKICAgICAgICAgICAgaWYgKCFjb250YWluZXIpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHdbR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVldID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGFpbmVyW25hbWVdID0gZm47CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBDcmVhdGVzIHRoZSByb290IGNvbXBvbmVudCB2aWV3IGFuZCB0aGUgcm9vdCBjb21wb25lbnQgbm9kZS4KICoKICogQHBhcmFtIHs/fSByTm9kZSBSZW5kZXIgaG9zdCBlbGVtZW50LgogKiBAcGFyYW0gez99IGRlZiBDb21wb25lbnREZWYKICogQHBhcmFtIHs/fSByb290VmlldyBUaGUgcGFyZW50IHZpZXcgd2hlcmUgdGhlIGhvc3Qgbm9kZSBpcyBzdG9yZWQKICogQHBhcmFtIHs/fSByZW5kZXJlckZhY3RvcnkKICogQHBhcmFtIHs/fSBob3N0UmVuZGVyZXIgVGhlIGN1cnJlbnQgcmVuZGVyZXIKICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIFRoZSBzYW5pdGl6ZXIsIGlmIHByb3ZpZGVkCiAqCiAqIEByZXR1cm4gez99IENvbXBvbmVudCB2aWV3IGNyZWF0ZWQKICovCmZ1bmN0aW9uIGNyZWF0ZVJvb3RDb21wb25lbnRWaWV3KHJOb2RlLCBkZWYsIHJvb3RWaWV3LCByZW5kZXJlckZhY3RvcnksIGhvc3RSZW5kZXJlciwgc2FuaXRpemVyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IHJvb3RWaWV3W1RWSUVXXTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShyb290VmlldywgMCArIEhFQURFUl9PRkZTRVQpOwogICAgcm9vdFZpZXdbMCArIEhFQURFUl9PRkZTRVRdID0gck5vZGU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIG51bGwsIDAsIDMgLyogRWxlbWVudCAqLywgbnVsbCwgbnVsbCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtZXJnZWRBdHRycyA9IHROb2RlLm1lcmdlZEF0dHJzID0gZGVmLmhvc3RBdHRyczsKICAgIGlmIChtZXJnZWRBdHRycyAhPT0gbnVsbCkgewogICAgICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgaWYgKHJOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIHJOb2RlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgICAgIGlmICh0Tm9kZS5jbGFzc2VzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB3cml0ZURpcmVjdENsYXNzKGhvc3RSZW5kZXJlciwgck5vZGUsIHROb2RlLmNsYXNzZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0Tm9kZS5zdHlsZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHdyaXRlRGlyZWN0U3R5bGUoaG9zdFJlbmRlcmVyLCByTm9kZSwgdE5vZGUuc3R5bGVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZpZXdSZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihyTm9kZSwgZGVmKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBjcmVhdGVMVmlldyhyb290VmlldywgZ2V0T3JDcmVhdGVUQ29tcG9uZW50VmlldyhkZWYpLCBudWxsLCBkZWYub25QdXNoID8gNjQgLyogRGlydHkgKi8gOiAxNiAvKiBDaGVja0Fsd2F5cyAqLywgcm9vdFZpZXdbSEVBREVSX09GRlNFVF0sIHROb2RlLCByZW5kZXJlckZhY3RvcnksIHZpZXdSZW5kZXJlciwgc2FuaXRpemVyKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBkaVB1YmxpY0luSW5qZWN0b3IoZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCByb290VmlldyksIHRWaWV3LCBkZWYudHlwZSk7CiAgICAgICAgbWFya0FzQ29tcG9uZW50SG9zdCh0VmlldywgdE5vZGUpOwogICAgICAgIGluaXRUTm9kZUZsYWdzKHROb2RlLCByb290Vmlldy5sZW5ndGgsIDEpOwogICAgfQogICAgYWRkVG9WaWV3VHJlZShyb290VmlldywgY29tcG9uZW50Vmlldyk7CiAgICAvLyBTdG9yZSBjb21wb25lbnQgdmlldyBhdCBub2RlIGluZGV4LCB3aXRoIG5vZGUgYXMgdGhlIEhPU1QKICAgIHJldHVybiByb290Vmlld1tIRUFERVJfT0ZGU0VUXSA9IGNvbXBvbmVudFZpZXc7Cn0KLyoqCiAqIENyZWF0ZXMgYSByb290IGNvbXBvbmVudCBhbmQgc2V0cyBpdCB1cCB3aXRoIGZlYXR1cmVzIGFuZCBob3N0IGJpbmRpbmdzLiBTaGFyZWQgYnkKICogcmVuZGVyQ29tcG9uZW50KCkgYW5kIFZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KCkuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gY29tcG9uZW50VmlldwogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZgogKiBAcGFyYW0gez99IHJvb3RMVmlldwogKiBAcGFyYW0gez99IHJvb3RDb250ZXh0CiAqIEBwYXJhbSB7P30gaG9zdEZlYXR1cmVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50KGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudERlZiwgcm9vdExWaWV3LCByb290Q29udGV4dCwgaG9zdEZlYXR1cmVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IHJvb3RMVmlld1tUVklFV107CiAgICAvLyBDcmVhdGUgZGlyZWN0aXZlIGluc3RhbmNlIHdpdGggZmFjdG9yeSgpIGFuZCBzdG9yZSBhdCBuZXh0IGluZGV4IGluIHZpZXdEYXRhCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW50aWF0ZVJvb3RDb21wb25lbnQodFZpZXcsIHJvb3RMVmlldywgY29tcG9uZW50RGVmKTsKICAgIHJvb3RDb250ZXh0LmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOwogICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGNvbXBvbmVudDsKICAgIGhvc3RGZWF0dXJlcyAmJiBob3N0RmVhdHVyZXMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChmZWF0dXJlKSA9PiBmZWF0dXJlKGNvbXBvbmVudCwgY29tcG9uZW50RGVmKSkpOwogICAgLy8gV2Ugd2FudCB0byBnZW5lcmF0ZSBhbiBlbXB0eSBRdWVyeUxpc3QgZm9yIHJvb3QgY29udGVudCBxdWVyaWVzIGZvciBiYWNrd2FyZHMKICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBWaWV3RW5naW5lLgogICAgaWYgKGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcykgewogICAgICAgIGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcygxIC8qIENyZWF0ZSAqLywgY29tcG9uZW50LCByb290TFZpZXcubGVuZ3RoIC0gMSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYKICAgICAgICAoY29tcG9uZW50RGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBjb21wb25lbnREZWYuaG9zdEF0dHJzICE9PSBudWxsKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50SW5kZXggPSByb290VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZWxlbWVudEluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdFRWaWV3ID0gcm9vdExWaWV3W1RWSUVXXTsKICAgICAgICBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnMocm9vdFRWaWV3LCBjb21wb25lbnREZWYpOwogICAgICAgIGdyb3dIb3N0VmFyc1NwYWNlKHJvb3RUVmlldywgcm9vdExWaWV3LCBjb21wb25lbnREZWYuaG9zdFZhcnMpOwogICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGNvbXBvbmVudERlZiwgY29tcG9uZW50KTsKICAgIH0KICAgIHJldHVybiBjb21wb25lbnQ7Cn0KLyoqCiAqIEBwYXJhbSB7Pz19IHNjaGVkdWxlcgogKiBAcGFyYW0gez89fSBwbGF5ZXJIYW5kbGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSb290Q29udGV4dChzY2hlZHVsZXIsIHBsYXllckhhbmRsZXIpIHsKICAgIHJldHVybiB7CiAgICAgICAgY29tcG9uZW50czogW10sCiAgICAgICAgc2NoZWR1bGVyOiBzY2hlZHVsZXIgfHwgZGVmYXVsdFNjaGVkdWxlciwKICAgICAgICBjbGVhbjogQ0xFQU5fUFJPTUlTRSwKICAgICAgICBwbGF5ZXJIYW5kbGVyOiBwbGF5ZXJIYW5kbGVyIHx8IG51bGwsCiAgICAgICAgZmxhZ3M6IDAgLyogRW1wdHkgKi8KICAgIH07Cn0KLyoqCiAqIFVzZWQgdG8gZW5hYmxlIGxpZmVjeWNsZSBob29rcyBvbiB0aGUgcm9vdCBjb21wb25lbnQuCiAqCiAqIEluY2x1ZGUgdGhpcyBmZWF0dXJlIHdoZW4gY2FsbGluZyBgcmVuZGVyQ29tcG9uZW50YCBpZiB0aGUgcm9vdCBjb21wb25lbnQKICogeW91IGFyZSByZW5kZXJpbmcgaGFzIGxpZmVjeWNsZSBob29rcyBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBob29rcyB3b24ndAogKiBiZSBjYWxsZWQgcHJvcGVybHkuCiAqCiAqIEV4YW1wbGU6CiAqCiAqIGBgYAogKiByZW5kZXJDb21wb25lbnQoQXBwQ29tcG9uZW50LCB7aG9zdEZlYXR1cmVzOiBbTGlmZWN5Y2xlSG9va3NGZWF0dXJlXX0pOwogKiBgYGAKICogQHBhcmFtIHs/fSBjb21wb25lbnQKICogQHBhcmFtIHs/fSBkZWYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIExpZmVjeWNsZUhvb2tzRmVhdHVyZShjb21wb25lbnQsIGRlZikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgcm9vdFRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlYWRQYXRjaGVkTFZpZXcoY29tcG9uZW50KSkpW1RWSUVXXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRpckluZGV4ID0gcm9vdFRWaWV3LmRhdGEubGVuZ3RoIC0gMTsKICAgIC8vIFRPRE8obWlza28pOiByZXBsYWNlIGBhcyBUTm9kZWAgd2l0aCBjcmVhdGVUTm9kZSBjYWxsLiAobmVlZHMgcmVmYWN0b3JpbmcgdG8gbG9zZSBkZXAgb24KICAgIC8vIExOb2RlKS4KICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3Mocm9vdFRWaWV3LCAoLyoqIEB0eXBlIHs/fSAqLyAoeyBkaXJlY3RpdmVTdGFydDogZGlySW5kZXgsIGRpcmVjdGl2ZUVuZDogZGlySW5kZXggKyAxIH0pKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZmVhdHVyZXMvaW5oZXJpdF9kZWZpbml0aW9uX2ZlYXR1cmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U3VwZXJUeXBlKHR5cGUpIHsKICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yOwp9Ci8qKgogKiBNZXJnZXMgdGhlIGRlZmluaXRpb24gZnJvbSBhIHN1cGVyIGNsYXNzIHRvIGEgc3ViIGNsYXNzLgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIHRoYXQgaXMgYSBTdWJDbGFzcyBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvZiBjb21wb25lbnQKICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyVHlwZSA9IGdldFN1cGVyVHlwZShkZWZpbml0aW9uLnR5cGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNob3VsZEluaGVyaXRGaWVsZHMgPSB0cnVlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5oZXJpdGFuY2VDaGFpbiA9IFtkZWZpbml0aW9uXTsKICAgIHdoaWxlIChzdXBlclR5cGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN1cGVyRGVmID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWZpbml0aW9uKSkgewogICAgICAgICAgICAvLyBEb24ndCB1c2UgZ2V0Q29tcG9uZW50RGVmL2dldERpcmVjdGl2ZURlZi4gVGhpcyBsb2dpYyByZWxpZXMgb24gaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIHN1cGVyRGVmID0gc3VwZXJUeXBlLsm1Y21wIHx8IHN1cGVyVHlwZS7JtWRpcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChzdXBlclR5cGUuybVjbXApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGlyZWN0aXZlcyBjYW5ub3QgaW5oZXJpdCBDb21wb25lbnRzJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgICAgICBzdXBlckRlZiA9IHN1cGVyVHlwZS7JtWRpcjsKICAgICAgICB9CiAgICAgICAgaWYgKHN1cGVyRGVmKSB7CiAgICAgICAgICAgIGlmIChzaG91bGRJbmhlcml0RmllbGRzKSB7CiAgICAgICAgICAgICAgICBpbmhlcml0YW5jZUNoYWluLnB1c2goc3VwZXJEZWYpOwogICAgICAgICAgICAgICAgLy8gU29tZSBmaWVsZHMgaW4gdGhlIGRlZmluaXRpb24gbWF5IGJlIGVtcHR5LCBpZiB0aGVyZSB3ZXJlIG5vIHZhbHVlcyB0byBwdXQgaW4gdGhlbSB0aGF0CiAgICAgICAgICAgICAgICAvLyB3b3VsZCd2ZSBqdXN0aWZpZWQgb2JqZWN0IGNyZWF0aW9uLiBVbndyYXAgdGhlbSBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB3cml0ZWFibGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmlucHV0cyA9IG1heWJlVW53cmFwRW1wdHkoZGVmaW5pdGlvbi5pbnB1dHMpOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmRlY2xhcmVkSW5wdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5vdXRwdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLm91dHB1dHMpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgaG9zdEJpbmRpbmdzCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdXBlckhvc3RCaW5kaW5ncyA9IHN1cGVyRGVmLmhvc3RCaW5kaW5nczsKICAgICAgICAgICAgICAgIHN1cGVySG9zdEJpbmRpbmdzICYmIGluaGVyaXRIb3N0QmluZGluZ3MoZGVmaW5pdGlvbiwgc3VwZXJIb3N0QmluZGluZ3MpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgcXVlcmllcwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3VwZXJWaWV3UXVlcnkgPSBzdXBlckRlZi52aWV3UXVlcnk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdXBlckNvbnRlbnRRdWVyaWVzID0gc3VwZXJEZWYuY29udGVudFF1ZXJpZXM7CiAgICAgICAgICAgICAgICBzdXBlclZpZXdRdWVyeSAmJiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KTsKICAgICAgICAgICAgICAgIHN1cGVyQ29udGVudFF1ZXJpZXMgJiYgaW5oZXJpdENvbnRlbnRRdWVyaWVzKGRlZmluaXRpb24sIHN1cGVyQ29udGVudFF1ZXJpZXMpOwogICAgICAgICAgICAgICAgLy8gTWVyZ2UgaW5wdXRzIGFuZCBvdXRwdXRzCiAgICAgICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLmlucHV0cywgc3VwZXJEZWYuaW5wdXRzKTsKICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24uZGVjbGFyZWRJbnB1dHMsIHN1cGVyRGVmLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24ub3V0cHV0cywgc3VwZXJEZWYub3V0cHV0cyk7CiAgICAgICAgICAgICAgICAvLyBNZXJnZSBhbmltYXRpb25zIG1ldGFkYXRhLgogICAgICAgICAgICAgICAgLy8gSWYgYHN1cGVyRGVmYCBpcyBhIENvbXBvbmVudCwgdGhlIGBkYXRhYCBmaWVsZCBpcyBwcmVzZW50IChkZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QpLgogICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKHN1cGVyRGVmKSAmJiBzdXBlckRlZi5kYXRhLmFuaW1hdGlvbikgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHN1cGVyIGRlZiBpcyBhIENvbXBvbmVudCwgdGhlIGBkZWZpbml0aW9uYCBpcyBhbHNvIGEgQ29tcG9uZW50LCBzaW5jZSBEaXJlY3RpdmVzIGNhbgogICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbmhlcml0IENvbXBvbmVudHMgKHdlIHRocm93IGFuIGVycm9yIGFib3ZlIGFuZCBjYW5ub3QgcmVhY2ggdGhpcyBjb2RlKS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmRGF0YSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpKS5kYXRhOwogICAgICAgICAgICAgICAgICAgIGRlZkRhdGEuYW5pbWF0aW9uID0gKGRlZkRhdGEuYW5pbWF0aW9uIHx8IFtdKS5jb25jYXQoc3VwZXJEZWYuZGF0YS5hbmltYXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW5oZXJpdCBob29rcwogICAgICAgICAgICAgICAgLy8gQXNzdW1lIHN1cGVyIGNsYXNzIGluaGVyaXRhbmNlIGZlYXR1cmUgaGFzIGFscmVhZHkgcnVuLgogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyQ29udGVudENoZWNrZWQgPQogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlckNvbnRlbnRDaGVja2VkIHx8IHN1cGVyRGVmLmFmdGVyQ29udGVudENoZWNrZWQ7CiAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuYWZ0ZXJDb250ZW50SW5pdCA9IGRlZmluaXRpb24uYWZ0ZXJDb250ZW50SW5pdCB8fCBzdXBlckRlZi5hZnRlckNvbnRlbnRJbml0OwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyVmlld0NoZWNrZWQgPSBkZWZpbml0aW9uLmFmdGVyVmlld0NoZWNrZWQgfHwgc3VwZXJEZWYuYWZ0ZXJWaWV3Q2hlY2tlZDsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlclZpZXdJbml0ID0gZGVmaW5pdGlvbi5hZnRlclZpZXdJbml0IHx8IHN1cGVyRGVmLmFmdGVyVmlld0luaXQ7CiAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuZG9DaGVjayA9IGRlZmluaXRpb24uZG9DaGVjayB8fCBzdXBlckRlZi5kb0NoZWNrOwogICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLm9uRGVzdHJveSA9IGRlZmluaXRpb24ub25EZXN0cm95IHx8IHN1cGVyRGVmLm9uRGVzdHJveTsKICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5vbkluaXQgPSBkZWZpbml0aW9uLm9uSW5pdCB8fCBzdXBlckRlZi5vbkluaXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUnVuIHBhcmVudCBmZWF0dXJlcwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gc3VwZXJEZWYuZmVhdHVyZXM7CiAgICAgICAgICAgIGlmIChmZWF0dXJlcykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUgJiYgZmVhdHVyZS5uZ0luaGVyaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChmZWF0dXJlKSkpKGRlZmluaXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJZiBgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlYCBpcyBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgYHN1cGVyRGVmYCwgaXQgbWVhbnMgdGhhdCB0aGlzCiAgICAgICAgICAgICAgICAgICAgLy8gZGVmIGFscmVhZHkgaGFzIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlciBjbGFzcyhlcyksIHNvIHdlCiAgICAgICAgICAgICAgICAgICAgLy8gY2FuIHN0b3AgbWVyZ2luZyBmaWVsZHMgZnJvbSBzdXBlciBjbGFzc2VzLiBIb3dldmVyIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHByb3RvdHlwZSBjaGFpbiB0byBsb29rIGZvciBjbGFzc2VzIHRoYXQgbWlnaHQgY29udGFpbiBvdGhlciAiZmVhdHVyZXMiIChsaWtlCiAgICAgICAgICAgICAgICAgICAgLy8gTmdPbkNoYW5nZXMpLCB3aGljaCB3ZSBzaG91bGQgaW52b2tlIGZvciB0aGUgb3JpZ2luYWwgYGRlZmluaXRpb25gLiBXZSBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gYHNob3VsZEluaGVyaXRGaWVsZHNgIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCwgZXNzZW50aWFsbHkgc2tpcHBpbmcgZmllbGRzIGluaGVyaXRhbmNlCiAgICAgICAgICAgICAgICAgICAgLy8gbG9naWMgYW5kIG9ubHkgaW52b2tpbmcgZnVuY3Rpb25zIGZyb20gdGhlICJmZWF0dXJlcyIgbGlzdC4KICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZSA9PT0gybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmhlcml0RmllbGRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN1cGVyVHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzdXBlclR5cGUpOwogICAgfQogICAgbWVyZ2VIb3N0QXR0cnNBY3Jvc3NJbmhlcml0YW5jZShpbmhlcml0YW5jZUNoYWluKTsKfQovKioKICogTWVyZ2UgdGhlIGBob3N0QXR0cnNgIGFuZCBgaG9zdFZhcnNgIGZyb20gdGhlIGluaGVyaXRlZCBwYXJlbnQgdG8gdGhlIGJhc2UgY2xhc3MuCiAqCiAqIEBwYXJhbSB7P30gaW5oZXJpdGFuY2VDaGFpbiBBIGxpc3Qgb2YgYFdyaXRhYmxlRGVmc2Agc3RhcnRpbmcgYXQgdGhlIHRvcCBtb3N0IHR5cGUgYW5kIGxpc3RpbmcKICogc3ViLXR5cGVzIGluIG9yZGVyLiBGb3IgZWFjaCB0eXBlIHRha2UgdGhlIGBob3N0QXR0cnNgIGFuZCBgaG9zdFZhcnNgIGFuZCBtZXJnZSBpdCB3aXRoIHRoZSBjaGlsZAogKiB0eXBlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cnNBY3Jvc3NJbmhlcml0YW5jZShpbmhlcml0YW5jZUNoYWluKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaG9zdFZhcnMgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGhvc3RBdHRycyA9IG51bGw7CiAgICAvLyBXZSBwcm9jZXNzIHRoZSBpbmhlcml0YW5jZSBvcmRlciBmcm9tIHRoZSBiYXNlIHRvIHRoZSBsZWF2ZXMgaGVyZS4KICAgIGZvciAobGV0IGkgPSBpbmhlcml0YW5jZUNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZiA9IGluaGVyaXRhbmNlQ2hhaW5baV07CiAgICAgICAgLy8gRm9yIGVhY2ggYGhvc3RWYXJzYCwgd2UgbmVlZCB0byBhZGQgdGhlIHN1cGVyY2xhc3MgYW1vdW50LgogICAgICAgIGRlZi5ob3N0VmFycyA9IChob3N0VmFycyArPSBkZWYuaG9zdFZhcnMpOwogICAgICAgIC8vIGZvciBlYWNoIGBob3N0QXR0cnNgIHdlIG5lZWQgdG8gbWVyZ2UgaXQgd2l0aCBzdXBlcmNsYXNzLgogICAgICAgIGRlZi5ob3N0QXR0cnMgPQogICAgICAgICAgICBtZXJnZUhvc3RBdHRycyhkZWYuaG9zdEF0dHJzLCBob3N0QXR0cnMgPSBtZXJnZUhvc3RBdHRycyhob3N0QXR0cnMsIGRlZi5ob3N0QXR0cnMpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF5YmVVbndyYXBFbXB0eSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSBFTVBUWV9PQkopIHsKICAgICAgICByZXR1cm4ge307CiAgICB9CiAgICBlbHNlIGlmICh2YWx1ZSA9PT0gRU1QVFlfQVJSQVkpIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gZGVmaW5pdGlvbgogKiBAcGFyYW0gez99IHN1cGVyVmlld1F1ZXJ5CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2Vmlld1F1ZXJ5ID0gZGVmaW5pdGlvbi52aWV3UXVlcnk7CiAgICBpZiAocHJldlZpZXdRdWVyeSkgewogICAgICAgIGRlZmluaXRpb24udmlld1F1ZXJ5ID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmYKICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJmLCBjdHgpID0+IHsKICAgICAgICAgICAgc3VwZXJWaWV3UXVlcnkocmYsIGN0eCk7CiAgICAgICAgICAgIHByZXZWaWV3UXVlcnkocmYsIGN0eCk7CiAgICAgICAgfSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9IHN1cGVyVmlld1F1ZXJ5OwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBzdXBlckNvbnRlbnRRdWVyaWVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmhlcml0Q29udGVudFF1ZXJpZXMoZGVmaW5pdGlvbiwgc3VwZXJDb250ZW50UXVlcmllcykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldkNvbnRlbnRRdWVyaWVzID0gZGVmaW5pdGlvbi5jb250ZW50UXVlcmllczsKICAgIGlmIChwcmV2Q29udGVudFF1ZXJpZXMpIHsKICAgICAgICBkZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmYKICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZiwgY3R4LCBkaXJlY3RpdmVJbmRleCkgPT4gewogICAgICAgICAgICBzdXBlckNvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICAgICAgcHJldkNvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGRlZmluaXRpb24uY29udGVudFF1ZXJpZXMgPSBzdXBlckNvbnRlbnRRdWVyaWVzOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBzdXBlckhvc3RCaW5kaW5ncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5oZXJpdEhvc3RCaW5kaW5ncyhkZWZpbml0aW9uLCBzdXBlckhvc3RCaW5kaW5ncykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldkhvc3RCaW5kaW5ncyA9IGRlZmluaXRpb24uaG9zdEJpbmRpbmdzOwogICAgaWYgKHByZXZIb3N0QmluZGluZ3MpIHsKICAgICAgICBkZWZpbml0aW9uLmhvc3RCaW5kaW5ncyA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJmCiAgICAgICAgICogQHBhcmFtIHs/fSBjdHgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZiwgY3R4KSA9PiB7CiAgICAgICAgICAgIHN1cGVySG9zdEJpbmRpbmdzKHJmLCBjdHgpOwogICAgICAgICAgICBwcmV2SG9zdEJpbmRpbmdzKHJmLCBjdHgpOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZGVmaW5pdGlvbi5ob3N0QmluZGluZ3MgPSBzdXBlckhvc3RCaW5kaW5nczsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9mZWF0dXJlcy9jb3B5X2RlZmluaXRpb25fZmVhdHVyZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRmllbGRzIHdoaWNoIGV4aXN0IG9uIGVpdGhlciBkaXJlY3RpdmUgb3IgY29tcG9uZW50IGRlZmluaXRpb25zLCBhbmQgbmVlZCB0byBiZSBjb3BpZWQgZnJvbQogKiBwYXJlbnQgdG8gY2hpbGQgY2xhc3NlcyBieSB0aGUgYMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmVgLgogKiBAdHlwZSB7P30KICovCmNvbnN0IENPUFlfRElSRUNUSVZFX0ZJRUxEUyA9IFsKICAgIC8vIFRoZSBjaGlsZCBjbGFzcyBzaG91bGQgdXNlIHRoZSBwcm92aWRlcnMgb2YgaXRzIHBhcmVudC4KICAgICdwcm92aWRlcnNSZXNvbHZlcicsCl07Ci8qKgogKiBGaWVsZHMgd2hpY2ggZXhpc3Qgb25seSBvbiBjb21wb25lbnQgZGVmaW5pdGlvbnMsIGFuZCBuZWVkIHRvIGJlIGNvcGllZCBmcm9tIHBhcmVudCB0byBjaGlsZAogKiBjbGFzc2VzIGJ5IHRoZSBgybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZWAuCiAqCiAqIFRoZSB0eXBlIGhlcmUgYWxsb3dzIGFueSBmaWVsZCBvZiBgQ29tcG9uZW50RGVmYCB3aGljaCBpcyBub3QgYWxzbyBhIHByb3BlcnR5IG9mIGBEaXJlY3RpdmVEZWZgLAogKiBzaW5jZSB0aG9zZSBzaG91bGQgZ28gaW4gYENPUFlfRElSRUNUSVZFX0ZJRUxEU2AgYWJvdmUuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ09QWV9DT01QT05FTlRfRklFTERTID0gWwogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCB1c2UgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIG9mIGl0cyBwYXJlbnQsIGluY2x1ZGluZyBhbGwgdGVtcGxhdGUKICAgIC8vIHNlbWFudGljcy4KICAgICd0ZW1wbGF0ZScsCiAgICAnZGVjbHMnLAogICAgJ2NvbnN0cycsCiAgICAndmFycycsCiAgICAnb25QdXNoJywKICAgICduZ0NvbnRlbnRTZWxlY3RvcnMnLAogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCB1c2UgdGhlIENTUyBzdHlsZXMgb2YgaXRzIHBhcmVudCwgaW5jbHVkaW5nIGFsbCBzdHlsaW5nIHNlbWFudGljcy4KICAgICdzdHlsZXMnLAogICAgJ2VuY2Fwc3VsYXRpb24nLAogICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCBiZSBjaGVja2VkIGJ5IHRoZSBydW50aW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdHMgcGFyZW50LgogICAgJ3NjaGVtYXMnLApdOwovKioKICogQ29waWVzIHRoZSBmaWVsZHMgbm90IGhhbmRsZWQgYnkgdGhlIGDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlYCBmcm9tIHRoZSBzdXBlcnR5cGUgb2YgYQogKiBkZWZpbml0aW9uLgogKgogKiBUaGlzIGV4aXN0cyBwcmltYXJpbHkgdG8gc3VwcG9ydCBuZ2NjIG1pZ3JhdGlvbiBvZiBhbiBleGlzdGluZyBWaWV3IEVuZ2luZSBwYXR0ZXJuLCB3aGVyZSBhbgogKiBlbnRpcmUgZGVjb3JhdG9yIGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IHRvIGEgY2hpbGQgY2xhc3MuIFdoZW4gbmdjYyBkZXRlY3RzIHRoaXMgY2FzZSwgaXQKICogZ2VuZXJhdGVzIGEgc2tlbGV0b24gZGVmaW5pdGlvbiBvbiB0aGUgY2hpbGQgY2xhc3MsIGFuZCBhcHBsaWVzIHRoaXMgZmVhdHVyZS4KICoKICogVGhlIGDJtcm1Q29weURlZmluaXRpb25GZWF0dXJlYCB0aGVuIGNvcGllcyBhbnkgbmVlZGVkIGZpZWxkcyBmcm9tIHRoZSBwYXJlbnQgY2xhc3MnIGRlZmluaXRpb24sCiAqIGluY2x1ZGluZyB0aGluZ3MgbGlrZSB0aGUgY29tcG9uZW50IHRlbXBsYXRlIGZ1bmN0aW9uLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIGEgY2hpbGQgY2xhc3Mgd2hpY2ggaW5oZXJpdHMgZnJvbSBhIHBhcmVudCBjbGFzcyB3aXRoIGl0cwogKiBvd24gZGVmaW5pdGlvbi4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyVHlwZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRTdXBlclR5cGUoZGVmaW5pdGlvbi50eXBlKSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHN1cGVyRGVmID0gdW5kZWZpbmVkOwogICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZmluaXRpb24pKSB7CiAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgIHN1cGVyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHN1cGVyVHlwZS7JtWNtcCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgIHN1cGVyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHN1cGVyVHlwZS7JtWRpcikpOwogICAgfQogICAgLy8gTmVlZGVkIGJlY2F1c2UgYGRlZmluaXRpb25gIGZpZWxkcyBhcmUgcmVhZG9ubHkuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWZBbnkgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZmluaXRpb24pKSk7CiAgICAvLyBDb3B5IG92ZXIgYW55IGZpZWxkcyB0aGF0IGFwcGx5IHRvIGVpdGhlciBkaXJlY3RpdmVzIG9yIGNvbXBvbmVudHMuCiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIENPUFlfRElSRUNUSVZFX0ZJRUxEUykgewogICAgICAgIGRlZkFueVtmaWVsZF0gPSBzdXBlckRlZltmaWVsZF07CiAgICB9CiAgICBpZiAoaXNDb21wb25lbnREZWYoc3VwZXJEZWYpKSB7CiAgICAgICAgLy8gQ29weSBvdmVyIGFueSBjb21wb25lbnQtc3BlY2lmaWMgZmllbGRzLgogICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgQ09QWV9DT01QT05FTlRfRklFTERTKSB7CiAgICAgICAgICAgIGRlZkFueVtmaWVsZF0gPSBzdXBlckRlZltmaWVsZF07CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBSZXByZXNlbnRzIGEgYmFzaWMgY2hhbmdlIGZyb20gYSBwcmV2aW91cyB0byBhIG5ldyB2YWx1ZSBmb3IgYSBzaW5nbGUKICogcHJvcGVydHkgb24gYSBkaXJlY3RpdmUgaW5zdGFuY2UuIFBhc3NlZCBhcyBhIHZhbHVlIGluIGEKICoge0BsaW5rIFNpbXBsZUNoYW5nZXN9IG9iamVjdCB0byB0aGUgYG5nT25DaGFuZ2VzYCBob29rLgogKgogKiBAc2VlIGBPbkNoYW5nZXNgCiAqCiAqIEBwdWJsaWNBcGkKICovCmNsYXNzIFNpbXBsZUNoYW5nZSB7CiAgICBjb25zdHJ1Y3RvcihwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUsIGZpcnN0Q2hhbmdlKSB7CiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gcHJldmlvdXNWYWx1ZTsKICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICAgICAgICB0aGlzLmZpcnN0Q2hhbmdlID0gZmlyc3RDaGFuZ2U7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgZmlyc3QgdmFsdWUgYXNzaWduZWQuCiAgICAgKi8KICAgIGlzRmlyc3RDaGFuZ2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RDaGFuZ2U7CiAgICB9Cn0KLyoqCiAqIFRoZSBOZ09uQ2hhbmdlc0ZlYXR1cmUgZGVjb3JhdGVzIGEgY29tcG9uZW50IHdpdGggc3VwcG9ydCBmb3IgdGhlIG5nT25DaGFuZ2VzCiAqIGxpZmVjeWNsZSBob29rLCBzbyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW55IGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHMKICogdGhhdCBob29rLgogKgogKiBJZiB0aGUgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSB1c2VzIGluaGVyaXRhbmNlLCB0aGUgTmdPbkNoYW5nZXNGZWF0dXJlIE1VU1QKICogYmUgaW5jbHVkZWQgYXMgYSBmZWF0dXJlIEFGVEVSIHtcQGxpbmsgSW5oZXJpdERlZmluaXRpb25GZWF0dXJlfSwgb3RoZXJ3aXNlCiAqIGluaGVyaXRlZCBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIHByb3BhZ2F0ZWQgdG8gdGhlIG5nT25DaGFuZ2VzIGxpZmVjeWNsZQogKiBob29rLgogKgogKiBFeGFtcGxlIHVzYWdlOgogKgogKiBgYGAKICogc3RhdGljIMm1Y21wID0gZGVmaW5lQ29tcG9uZW50KHsKICogICAuLi4KICogICBpbnB1dHM6IHtuYW1lOiAncHVibGljTmFtZSd9LAogKiAgIGZlYXR1cmVzOiBbTmdPbkNoYW5nZXNGZWF0dXJlXQogKiB9KTsKICogYGBgCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGRlZmluaXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmUoZGVmaW5pdGlvbikgewogICAgaWYgKGRlZmluaXRpb24udHlwZS5wcm90b3R5cGUubmdPbkNoYW5nZXMpIHsKICAgICAgICBkZWZpbml0aW9uLnNldElucHV0ID0gbmdPbkNoYW5nZXNTZXRJbnB1dDsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZmluaXRpb24pKSkub25DaGFuZ2VzID0gd3JhcE9uQ2hhbmdlcygpOwogICAgfQp9Ci8vIFRoaXMgb3B0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbmdPbkNoYW5nZXMgbGlmZWN5Y2xlIGhvb2sgd2lsbCBiZSBpbmhlcml0ZWQKLy8gZnJvbSBzdXBlcmNsYXNzZXMgKGluIEluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkuCi8qKiBAbm9jb2xsYXBzZSAqLwovLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCigoLyoqIEB0eXBlIHs/fSAqLyAoybXJtU5nT25DaGFuZ2VzRmVhdHVyZSkpKS5uZ0luaGVyaXQgPSB0cnVlOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdyYXBPbkNoYW5nZXMoKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHRoaXMgez99CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB3cmFwT25DaGFuZ2VzSG9va19pblByZXZpb3VzQ2hhbmdlc1N0b3JhZ2UoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNpbXBsZUNoYW5nZXNTdG9yZSA9IGdldFNpbXBsZUNoYW5nZXNTdG9yZSh0aGlzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudCA9IHNpbXBsZUNoYW5nZXNTdG9yZSAmJiBzaW1wbGVDaGFuZ2VzU3RvcmUuY3VycmVudDsKICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gKC8qKiBAdHlwZSB7P30gKi8gKHNpbXBsZUNoYW5nZXNTdG9yZSkpLnByZXZpb3VzOwogICAgICAgICAgICBpZiAocHJldmlvdXMgPT09IEVNUFRZX09CSikgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHNpbXBsZUNoYW5nZXNTdG9yZSkpLnByZXZpb3VzID0gY3VycmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5ldyBjaGFuZ2VzIGFyZSBjb3BpZWQgdG8gdGhlIHByZXZpb3VzIHN0b3JlLCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgaGlzdG9yeSBmb3IgaW5wdXRzCiAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZXJlIG5vdCBjaGFuZ2VkIHRoaXMgdGltZQogICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1trZXldID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChzaW1wbGVDaGFuZ2VzU3RvcmUpKS5jdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5uZ09uQ2hhbmdlcyhjdXJyZW50KTsKICAgICAgICB9CiAgICB9KTsKfQovKioKICogQHRlbXBsYXRlIFQKICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcGFyYW0gez99IHB1YmxpY05hbWUKICogQHBhcmFtIHs/fSBwcml2YXRlTmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbmdPbkNoYW5nZXNTZXRJbnB1dChpbnN0YW5jZSwgdmFsdWUsIHB1YmxpY05hbWUsIHByaXZhdGVOYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzaW1wbGVDaGFuZ2VzU3RvcmUgPSBnZXRTaW1wbGVDaGFuZ2VzU3RvcmUoaW5zdGFuY2UpIHx8CiAgICAgICAgc2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlLCB7IHByZXZpb3VzOiBFTVBUWV9PQkosIGN1cnJlbnQ6IG51bGwgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjdXJyZW50ID0gc2ltcGxlQ2hhbmdlc1N0b3JlLmN1cnJlbnQgfHwgKHNpbXBsZUNoYW5nZXNTdG9yZS5jdXJyZW50ID0ge30pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXMgPSBzaW1wbGVDaGFuZ2VzU3RvcmUucHJldmlvdXM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJlZE5hbWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVjbGFyZWRJbnB1dHMpKSlbcHVibGljTmFtZV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c0NoYW5nZSA9IHByZXZpb3VzW2RlY2xhcmVkTmFtZV07CiAgICBjdXJyZW50W2RlY2xhcmVkTmFtZV0gPSBuZXcgU2ltcGxlQ2hhbmdlKHByZXZpb3VzQ2hhbmdlICYmIHByZXZpb3VzQ2hhbmdlLmN1cnJlbnRWYWx1ZSwgdmFsdWUsIHByZXZpb3VzID09PSBFTVBUWV9PQkopOwogICAgKCgvKiogQHR5cGUgez99ICovIChpbnN0YW5jZSkpKVtwcml2YXRlTmFtZV0gPSB2YWx1ZTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IFNJTVBMRV9DSEFOR0VTX1NUT1JFID0gJ19fbmdTaW1wbGVDaGFuZ2VzX18nOwovKioKICogQHBhcmFtIHs/fSBpbnN0YW5jZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaW5zdGFuY2VbU0lNUExFX0NIQU5HRVNfU1RPUkVdIHx8IG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICogQHBhcmFtIHs/fSBzdG9yZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlLCBzdG9yZSkgewogICAgcmV0dXJuIGluc3RhbmNlW1NJTVBMRV9DSEFOR0VTX1NUT1JFXSA9IHN0b3JlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RpX3NldHVwLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXNvbHZlcyB0aGUgcHJvdmlkZXJzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHRoZSBEaXJlY3RpdmVEZWYuCiAqCiAqIFdoZW4gaW5zZXJ0aW5nIHRoZSB0b2tlbnMgYW5kIHRoZSBmYWN0b3JpZXMgaW4gdGhlaXIgcmVzcGVjdGl2ZSBhcnJheXMsIHdlIGNhbiBhc3N1bWUgdGhhdAogKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZmlyc3QgZm9yIHRoZSBjb21wb25lbnQgKGlmIGFueSksIGFuZCB0aGVuIGZvciBvdGhlciBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lCiAqIG5vZGUuCiAqIEFzIGEgY29uc2VxdWVuY2UsdGhlIHByb3ZpZGVycyBhcmUgYWx3YXlzIHByb2Nlc3NlZCBpbiB0aGF0IG9yZGVyOgogKiAxKSBUaGUgdmlldyBwcm92aWRlcnMgb2YgdGhlIGNvbXBvbmVudAogKiAyKSBUaGUgcHJvdmlkZXJzIG9mIHRoZSBjb21wb25lbnQKICogMykgVGhlIHByb3ZpZGVycyBvZiB0aGUgb3RoZXIgZGlyZWN0aXZlcwogKiBUaGlzIG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5qZWN0YWJsZXMgYXJyYXlzIG9mIGEgdmlldyAoZm9yIGVhY2ggbm9kZSkuCiAqIFNvIHRoZSB0b2tlbnMgYW5kIHRoZSBmYWN0b3JpZXMgY2FuIGJlIHB1c2hlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheXMsIGV4Y2VwdAogKiBpbiBvbmUgY2FzZSBmb3IgbXVsdGkgcHJvdmlkZXJzLgogKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGRlZiB0aGUgZGlyZWN0aXZlIGRlZmluaXRpb24KICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/fSB2aWV3UHJvdmlkZXJzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwcm92aWRlcnNSZXNvbHZlcihkZWYsIHByb3ZpZGVycywgdmlld1Byb3ZpZGVycykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0NvbXBvbmVudCA9IGlzQ29tcG9uZW50RGVmKGRlZik7CiAgICAgICAgLy8gVGhlIGxpc3Qgb2YgdmlldyBwcm92aWRlcnMgaXMgcHJvY2Vzc2VkIGZpcnN0LCBhbmQgdGhlIGZsYWdzIGFyZSB1cGRhdGVkCiAgICAgICAgcmVzb2x2ZVByb3ZpZGVyJDEodmlld1Byb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgdHJ1ZSk7CiAgICAgICAgLy8gVGhlbiwgdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIGlzIHByb2Nlc3NlZCwgYW5kIHRoZSBmbGFncyBhcmUgdXBkYXRlZAogICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgZmFsc2UpOwogICAgfQp9Ci8qKgogKiBSZXNvbHZlcyBhIHByb3ZpZGVyIGFuZCBwdWJsaXNoZXMgaXQgdG8gdGhlIERJIHN5c3RlbS4KICogQHBhcmFtIHs/fSBwcm92aWRlcgogKiBAcGFyYW0gez99IHRJbmplY3RhYmxlcwogKiBAcGFyYW0gez99IGxJbmplY3RhYmxlc0JsdWVwcmludAogKiBAcGFyYW0gez99IGlzQ29tcG9uZW50CiAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKSB7CiAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTsKICAgIGlmIChBcnJheS5pc0FycmF5KHByb3ZpZGVyKSkgewogICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNhbGwgYHJlc29sdmVQcm92aWRlcmAKICAgICAgICAvLyBSZWN1cnNpb24gaXMgT0sgaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgbm90IGJlIGluIGhvdC1wYXRoIG9uY2Ugd2UgaW1wbGVtZW50CiAgICAgICAgLy8gY2xvbmluZyBvZiB0aGUgaW5pdGlhbCBzdGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyW2ldLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0b2tlbiA9IGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSA/IHByb3ZpZGVyIDogcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcm92aWRlckZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJlZ2luSW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3B0Vmlld1Byb3ZpZGVyc0NvdW50ID0gdE5vZGUucHJvdmlkZXJJbmRleGVzID4+IDE2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ICovOwogICAgICAgIGlmIChpc1R5cGVQcm92aWRlcihwcm92aWRlcikgfHwgIXByb3ZpZGVyLm11bHRpKSB7CiAgICAgICAgICAgIC8vIFNpbmdsZSBwcm92aWRlciBjYXNlOiB0aGUgZmFjdG9yeSBpcyBjcmVhdGVkIGFuZCBwdXNoZWQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE5vZGVJbmplY3RvckZhY3RvcnkocHJvdmlkZXJGYWN0b3J5LCBpc1ZpZXdQcm92aWRlciwgybXJtWRpcmVjdGl2ZUluamVjdCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGlzVmlld1Byb3ZpZGVyID8gYmVnaW5JbmRleCA6IGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQsIGVuZEluZGV4KTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nRmFjdG9yeUluZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpLCB0VmlldywgdG9rZW4pOwogICAgICAgICAgICAgICAgcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIHRJbmplY3RhYmxlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgdEluamVjdGFibGVzLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKzsKICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZUVuZCsrOwogICAgICAgICAgICAgICAgaWYgKGlzVmlld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnQucHVzaChmYWN0b3J5KTsKICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdGYWN0b3J5SW5kZXhdID0gZmFjdG9yeTsKICAgICAgICAgICAgICAgIGxWaWV3W2V4aXN0aW5nRmFjdG9yeUluZGV4XSA9IGZhY3Rvcnk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIE11bHRpIHByb3ZpZGVyIGNhc2U6CiAgICAgICAgICAgIC8vIFdlIGNyZWF0ZSBhIG11bHRpIGZhY3Rvcnkgd2hpY2ggaXMgZ29pbmcgdG8gYWdncmVnYXRlIGFsbCB0aGUgdmFsdWVzLgogICAgICAgICAgICAvLyBTaW5jZSB0aGUgb3V0cHV0IG9mIHN1Y2ggYSBmYWN0b3J5IGRlcGVuZHMgb24gY29udGVudCBvciB2aWV3IGluamVjdGlvbiwKICAgICAgICAgICAgLy8gd2UgY3JlYXRlIHR3byBvZiB0aGVtLCB3aGljaCBhcmUgbGlua2VkIHRvZ2V0aGVyLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUaGUgZmlyc3Qgb25lIChmb3IgdmlldyBwcm92aWRlcnMpIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGluamVjdGFibGVzIGFycmF5LAogICAgICAgICAgICAvLyBhbmQgdGhlIHNlY29uZCBvbmUgKGZvciBwcm92aWRlcnMpIGlzIGFsd2F5cyBpbiB0aGUgc2Vjb25kIGJsb2NrLgogICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHZpZXcgcHJvdmlkZXJzIGhhdmUgaGlnaGVyIHByaW9yaXR5LiBXaGVuIGEgbXVsdGkgdG9rZW4KICAgICAgICAgICAgLy8gaXMgYmVpbmcgbG9va2VkIHVwLCB0aGUgdmlldyBwcm92aWRlcnMgc2hvdWxkIGJlIGZvdW5kIGZpcnN0LgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgYSBtdWx0aSBmYWN0b3J5IGluIHRoZSB0aGlyZCBibG9jayAoZGlyZWN0aXZlIGJsb2NrKS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhlIGFsZ29yaXRobSB0byBwcm9jZXNzIG11bHRpIHByb3ZpZGVycyBpcyBhcyBmb2xsb3dzOgogICAgICAgICAgICAvLyAxKSBJZiB0aGUgbXVsdGkgcHJvdmlkZXIgY29tZXMgZnJvbSB0aGUgYHZpZXdQcm92aWRlcnNgIG9mIHRoZSBjb21wb25lbnQ6CiAgICAgICAgICAgIC8vICAgYSkgSWYgdGhlIHNwZWNpYWwgdmlldyBwcm92aWRlcnMgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwdXNoZWQuCiAgICAgICAgICAgIC8vICAgYikgRWxzZSwgdGhlIG11bHRpIHByb3ZpZGVyIGlzIGFkZGVkIHRvIHRoZSBleGlzdGluZyBtdWx0aSBmYWN0b3J5LgogICAgICAgICAgICAvLyAyKSBJZiB0aGUgbXVsdGkgcHJvdmlkZXIgY29tZXMgZnJvbSB0aGUgYHByb3ZpZGVyc2Agb2YgdGhlIGNvbXBvbmVudCBvciBvZiBhbm90aGVyCiAgICAgICAgICAgIC8vIGRpcmVjdGl2ZToKICAgICAgICAgICAgLy8gICBhKSBJZiB0aGUgbXVsdGkgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwcm92aWRlciBwdXNoZWQgaW50byBpdC4KICAgICAgICAgICAgLy8gICAgICBJdCBpcyBhbHNvIGxpbmtlZCB0byB0aGUgbXVsdGkgZmFjdG9yeSBmb3IgdmlldyBwcm92aWRlcnMsIGlmIGl0IGV4aXN0cy4KICAgICAgICAgICAgLy8gICBiKSBFbHNlLCB0aGUgbXVsdGkgcHJvdmlkZXIgaXMgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIG11bHRpIGZhY3RvcnkuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQsIGVuZEluZGV4KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBleGlzdGluZ1ZpZXdQcm92aWRlcnNGYWN0b3J5SW5kZXggPSBpbmRleE9mKHRva2VuLCB0SW5qZWN0YWJsZXMsIGJlZ2luSW5kZXgsIGJlZ2luSW5kZXggKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QgPSBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA+PSAwICYmCiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXhdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0ID0gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4ID49IDAgJiYKICAgICAgICAgICAgICAgIGxJbmplY3RhYmxlc0JsdWVwcmludFtleGlzdGluZ1ZpZXdQcm92aWRlcnNGYWN0b3J5SW5kZXhdOwogICAgICAgICAgICBpZiAoaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0IHx8CiAgICAgICAgICAgICAgICAhaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgIC8vIENhc2VzIDEuYSBhbmQgMi5hCiAgICAgICAgICAgICAgICBkaVB1YmxpY0luSW5qZWN0b3IoZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCBsVmlldyksIHRWaWV3LCB0b2tlbik7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gbXVsdGlGYWN0b3J5KGlzVmlld1Byb3ZpZGVyID8gbXVsdGlWaWV3UHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyIDogbXVsdGlQcm92aWRlcnNGYWN0b3J5UmVzb2x2ZXIsIGxJbmplY3RhYmxlc0JsdWVwcmludC5sZW5ndGgsIGlzVmlld1Byb3ZpZGVyLCBpc0NvbXBvbmVudCwgcHJvdmlkZXJGYWN0b3J5KTsKICAgICAgICAgICAgICAgIGlmICghaXNWaWV3UHJvdmlkZXIgJiYgZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5wcm92aWRlckZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIHRJbmplY3RhYmxlcy5sZW5ndGgsIDApOwogICAgICAgICAgICAgICAgdEluamVjdGFibGVzLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKzsKICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZUVuZCsrOwogICAgICAgICAgICAgICAgaWYgKGlzVmlld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnQucHVzaChmYWN0b3J5KTsKICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBDYXNlcyAxLmIgYW5kIDIuYgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXhJbkZhY3RvcnkgPSBtdWx0aUZhY3RvcnlBZGQoKC8qKiBAdHlwZSB7P30gKi8gKGxJbmplY3RhYmxlc0JsdWVwcmludCkpW2lzVmlld1Byb3ZpZGVyID8gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4IDoKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleF0sIHByb3ZpZGVyRmFjdG9yeSwgIWlzVmlld1Byb3ZpZGVyICYmIGlzQ29tcG9uZW50KTsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyRGVzdHJveUhvb2tzSWZTdXBwb3J0ZWQodFZpZXcsIHByb3ZpZGVyLCBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA+IC0xID8gZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXggOgogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVmlld1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCwgaW5kZXhJbkZhY3RvcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNWaWV3UHJvdmlkZXIgJiYgaXNDb21wb25lbnQgJiYgZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5jb21wb25lbnRQcm92aWRlcnMpKSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBSZWdpc3RlcnMgdGhlIGBuZ09uRGVzdHJveWAgaG9vayBvZiBhIHByb3ZpZGVyLCBpZiB0aGUgcHJvdmlkZXIgc3VwcG9ydHMgZGVzdHJveSBob29rcy4KICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIGluIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBob29rLgogKiBAcGFyYW0gez99IHByb3ZpZGVyIFByb3ZpZGVyIHdob3NlIGhvb2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCiAqIEBwYXJhbSB7P30gY29udGV4dEluZGV4IEluZGV4IHVuZGVyIHdoaWNoIHRvIGZpbmQgdGhlIGNvbnRleHQgZm9yIHRoZSBob29rIHdoZW4gaXQncyBiZWluZyBpbnZva2VkLgogKiBAcGFyYW0gez89fSBpbmRleEluRmFjdG9yeSBPbmx5IHJlcXVpcmVkIGZvciBgbXVsdGlgIHByb3ZpZGVycy4gSW5kZXggb2YgdGhlIHByb3ZpZGVyIGluIHRoZSBtdWx0aQogKiBwcm92aWRlciBmYWN0b3J5LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIGNvbnRleHRJbmRleCwgaW5kZXhJbkZhY3RvcnkpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByb3ZpZGVySXNUeXBlUHJvdmlkZXIgPSBpc1R5cGVQcm92aWRlcihwcm92aWRlcik7CiAgICBpZiAocHJvdmlkZXJJc1R5cGVQcm92aWRlciB8fCBpc0NsYXNzUHJvdmlkZXIocHJvdmlkZXIpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3RvdHlwZSA9ICgoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyKSkpLnVzZUNsYXNzIHx8IHByb3ZpZGVyKS5wcm90b3R5cGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nT25EZXN0cm95ID0gcHJvdG90eXBlLm5nT25EZXN0cm95OwogICAgICAgIGlmIChuZ09uRGVzdHJveSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSk7CiAgICAgICAgICAgIGlmICghcHJvdmlkZXJJc1R5cGVQcm92aWRlciAmJiAoKCgvKiogQHR5cGUgez99ICovIChwcm92aWRlcikpKSkubXVsdGkpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoaW5kZXhJbkZhY3RvcnksICdpbmRleEluRmFjdG9yeSB3aGVuIHJlZ2lzdGVyaW5nIG11bHRpIGZhY3RvcnkgZGVzdHJveSBob29rJyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0NhbGxiYWNrc0luZGV4ID0gaG9va3MuaW5kZXhPZihjb250ZXh0SW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tzSW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaG9va3MucHVzaChjb250ZXh0SW5kZXgsIFtpbmRleEluRmFjdG9yeSwgbmdPbkRlc3Ryb3ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9va3NbZXhpc3RpbmdDYWxsYmFja3NJbmRleCArIDFdKSkpLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGluZGV4SW5GYWN0b3J5KSksIG5nT25EZXN0cm95KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvb2tzLnB1c2goY29udGV4dEluZGV4LCBuZ09uRGVzdHJveSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEFkZCBhIGZhY3RvcnkgaW4gYSBtdWx0aSBmYWN0b3J5LgogKiBAcGFyYW0gez99IG11bHRpRmFjdG9yeQogKiBAcGFyYW0gez99IGZhY3RvcnkKICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudFByb3ZpZGVyCiAqIEByZXR1cm4gez99IEluZGV4IGF0IHdoaWNoIHRoZSBmYWN0b3J5IHdhcyBpbnNlcnRlZC4KICovCmZ1bmN0aW9uIG11bHRpRmFjdG9yeUFkZChtdWx0aUZhY3RvcnksIGZhY3RvcnksIGlzQ29tcG9uZW50UHJvdmlkZXIpIHsKICAgIGlmIChpc0NvbXBvbmVudFByb3ZpZGVyKSB7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG11bHRpRmFjdG9yeS5jb21wb25lbnRQcm92aWRlcnMpKSsrOwogICAgfQogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChtdWx0aUZhY3RvcnkubXVsdGkpKS5wdXNoKGZhY3RvcnkpIC0gMTsKfQovKioKICogUmV0dXJucyB0aGUgaW5kZXggb2YgaXRlbSBpbiB0aGUgYXJyYXksIGJ1dCBvbmx5IGluIHRoZSBiZWdpbiB0byBlbmQgcmFuZ2UuCiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcGFyYW0gez99IGFycgogKiBAcGFyYW0gez99IGJlZ2luCiAqIEBwYXJhbSB7P30gZW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbmRleE9mKGl0ZW0sIGFyciwgYmVnaW4sIGVuZCkgewogICAgZm9yIChsZXQgaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKICAgICAgICBpZiAoYXJyW2ldID09PSBpdGVtKQogICAgICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKfQovKioKICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGBwcm92aWRlcnNgLgogKiBAdGhpcyB7P30KICogQHBhcmFtIHs/fSBfCiAqIEBwYXJhbSB7P30gdERhdGEKICogQHBhcmFtIHs/fSBsRGF0YQogKiBAcGFyYW0gez99IHROb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtdWx0aVByb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlcihfLCB0RGF0YSwgbERhdGEsIHROb2RlKSB7CiAgICByZXR1cm4gbXVsdGlSZXNvbHZlKCgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSksIFtdKTsKfQovKioKICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGB2aWV3UHJvdmlkZXJzYC4KICoKICogVGhpcyBmYWN0b3J5IGtub3dzIGhvdyB0byBjb25jYXRlbmF0ZSBpdHNlbGYgd2l0aCB0aGUgZXhpc3RpbmcgYG11bHRpYCBgcHJvdmlkZXJzYC4KICogQHRoaXMgez99CiAqIEBwYXJhbSB7P30gXwogKiBAcGFyYW0gez99IHREYXRhCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbXVsdGlWaWV3UHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyKF8sIHREYXRhLCBsVmlldywgdE5vZGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZhY3RvcmllcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcmVzdWx0OwogICAgaWYgKHRoaXMucHJvdmlkZXJGYWN0b3J5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudENvdW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMucHJvdmlkZXJGYWN0b3J5LmNvbXBvbmVudFByb3ZpZGVycykpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtdWx0aVByb3ZpZGVycyA9IGdldE5vZGVJbmplY3RhYmxlKGxWaWV3LCBsVmlld1tUVklFV10sICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wcm92aWRlckZhY3RvcnkpKS5pbmRleCkpLCB0Tm9kZSk7CiAgICAgICAgLy8gQ29weSB0aGUgc2VjdGlvbiBvZiB0aGUgYXJyYXkgd2hpY2ggY29udGFpbnMgYG11bHRpYCBgcHJvdmlkZXJzYCBmcm9tIHRoZSBjb21wb25lbnQKICAgICAgICByZXN1bHQgPSBtdWx0aVByb3ZpZGVycy5zbGljZSgwLCBjb21wb25lbnRDb3VudCk7CiAgICAgICAgLy8gSW5zZXJ0IHRoZSBgdmlld1Byb3ZpZGVyYCBpbnN0YW5jZXMuCiAgICAgICAgbXVsdGlSZXNvbHZlKGZhY3RvcmllcywgcmVzdWx0KTsKICAgICAgICAvLyBDb3B5IHRoZSBzZWN0aW9uIG9mIHRoZSBhcnJheSB3aGljaCBjb250YWlucyBgbXVsdGlgIGBwcm92aWRlcnNgIGZyb20gb3RoZXIgZGlyZWN0aXZlcwogICAgICAgIGZvciAobGV0IGkgPSBjb21wb25lbnRDb3VudDsgaSA8IG11bHRpUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG11bHRpUHJvdmlkZXJzW2ldKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgICAvLyBJbnNlcnQgdGhlIGB2aWV3UHJvdmlkZXJgIGluc3RhbmNlcy4KICAgICAgICBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQovKioKICogTWFwcyBhbiBhcnJheSBvZiBmYWN0b3JpZXMgaW50byBhbiBhcnJheSBvZiB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZmFjdG9yaWVzCiAqIEBwYXJhbSB7P30gcmVzdWx0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGZhY3Rvcmllc1tpXSkpKSk7CiAgICAgICAgcmVzdWx0LnB1c2goZmFjdG9yeSgpKTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIENyZWF0ZXMgYSBtdWx0aSBmYWN0b3J5LgogKiBAcGFyYW0gez99IGZhY3RvcnlGbgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudAogKiBAcGFyYW0gez99IGYKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG11bHRpRmFjdG9yeShmYWN0b3J5Rm4sIGluZGV4LCBpc1ZpZXdQcm92aWRlciwgaXNDb21wb25lbnQsIGYpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShmYWN0b3J5Rm4sIGlzVmlld1Byb3ZpZGVyLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgIGZhY3RvcnkubXVsdGkgPSBbXTsKICAgIGZhY3RvcnkuaW5kZXggPSBpbmRleDsKICAgIGZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzID0gMDsKICAgIG11bHRpRmFjdG9yeUFkZChmYWN0b3J5LCBmLCBpc0NvbXBvbmVudCAmJiAhaXNWaWV3UHJvdmlkZXIpOwogICAgcmV0dXJuIGZhY3Rvcnk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZmVhdHVyZXMvcHJvdmlkZXJzX2ZlYXR1cmUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRoaXMgZmVhdHVyZSByZXNvbHZlcyB0aGUgcHJvdmlkZXJzIG9mIGEgZGlyZWN0aXZlIChvciBjb21wb25lbnQpLAogKiBhbmQgcHVibGlzaCB0aGVtIGludG8gdGhlIERJIHN5c3RlbSwgbWFraW5nIGl0IHZpc2libGUgdG8gb3RoZXJzIGZvciBpbmplY3Rpb24uCiAqCiAqIEZvciBleGFtcGxlOgogKiBgYGB0cwogKiBjbGFzcyBDb21wb25lbnRXaXRoUHJvdmlkZXJzIHsKICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyZWV0ZXI6IEdyZWV0ZXJERSkge30KICoKICogICBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogKiAgICAgdHlwZTogQ29tcG9uZW50V2l0aFByb3ZpZGVycywKICogICAgIHNlbGVjdG9yczogW1snY29tcG9uZW50LXdpdGgtcHJvdmlkZXJzJ11dLAogKiAgICBmYWN0b3J5OiAoKSA9PiBuZXcgQ29tcG9uZW50V2l0aFByb3ZpZGVycyhkaXJlY3RpdmVJbmplY3QoR3JlZXRlckRFIGFzIGFueSkpLAogKiAgICBkZWNsczogMSwKICogICAgdmFyczogMSwKICogICAgdGVtcGxhdGU6IGZ1bmN0aW9uKGZzOiBSZW5kZXJGbGFncywgY3R4OiBDb21wb25lbnRXaXRoUHJvdmlkZXJzKSB7CiAqICAgICAgaWYgKGZzICYgUmVuZGVyRmxhZ3MuQ3JlYXRlKSB7CiAqICAgICAgICDJtcm1dGV4dCgwKTsKICogICAgICB9CiAqICAgICAgaWYgKGZzICYgUmVuZGVyRmxhZ3MuVXBkYXRlKSB7CiAqICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC5ncmVldGVyLmdyZWV0KCkpOwogKiAgICAgIH0KICogICAgfSwKICogICAgZmVhdHVyZXM6IFtQcm92aWRlcnNGZWF0dXJlKFtHcmVldGVyREVdKV0KICogIH0pOwogKiB9CiAqIGBgYAogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICogQHBhcmFtIHs/PX0gdmlld1Byb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtVByb3ZpZGVyc0ZlYXR1cmUocHJvdmlkZXJzLCB2aWV3UHJvdmlkZXJzID0gW10pIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGRlZmluaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChkZWZpbml0aW9uKSA9PiB7CiAgICAgICAgZGVmaW5pdGlvbi5wcm92aWRlcnNSZXNvbHZlciA9CiAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gcHJvY2Vzc1Byb3ZpZGVyc0ZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGVmLCBwcm9jZXNzUHJvdmlkZXJzRm4pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnNSZXNvbHZlcihkZWYsIC8vCiAgICAgICAgICAgICAgICBwcm9jZXNzUHJvdmlkZXJzRm4gPyBwcm9jZXNzUHJvdmlkZXJzRm4ocHJvdmlkZXJzKSA6IHByb3ZpZGVycywgLy8KICAgICAgICAgICAgICAgIHZpZXdQcm92aWRlcnMpOwogICAgICAgICAgICB9KTsKICAgIH0pOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvY29tcG9uZW50X2ZhY3RvcnkudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCBjcmVhdGVkIGJ5IGEgYENvbXBvbmVudEZhY3RvcnlgLgogKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhbmQgcmVsYXRlZCBvYmplY3RzLAogKiBhbmQgcHJvdmlkZXMgdGhlIG1lYW5zIG9mIGRlc3Ryb3lpbmcgdGhlIGluc3RhbmNlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICogQHRlbXBsYXRlIEMKICovCmNsYXNzIENvbXBvbmVudFJlZiB7Cn0KLyoqCiAqIEJhc2UgY2xhc3MgZm9yIGEgZmFjdG9yeSB0aGF0IGNhbiBjcmVhdGUgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuCiAqIEluc3RhbnRpYXRlIGEgZmFjdG9yeSBmb3IgYSBnaXZlbiB0eXBlIG9mIGNvbXBvbmVudCB3aXRoIGByZXNvbHZlQ29tcG9uZW50RmFjdG9yeSgpYC4KICogVXNlIHRoZSByZXN1bHRpbmcgYENvbXBvbmVudEZhY3RvcnkuY3JlYXRlKClgIG1ldGhvZCB0byBjcmVhdGUgYSBjb21wb25lbnQgb2YgdGhhdCB0eXBlLgogKgogKiBAc2VlIFtEeW5hbWljIENvbXBvbmVudHNdKGd1aWRlL2R5bmFtaWMtY29tcG9uZW50LWxvYWRlcikKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBDCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5IHsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2NvbXBvbmVudF9mYWN0b3J5X3Jlc29sdmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBlcnJvciA9IEVycm9yKGBObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgJHtzdHJpbmdpZnkoY29tcG9uZW50KX0uIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/YCk7CiAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX0NPTVBPTkVOVF0gPSBjb21wb25lbnQ7CiAgICByZXR1cm4gZXJyb3I7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBFUlJPUl9DT01QT05FTlQgPSAnbmdDb21wb25lbnQnOwpjbGFzcyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB7CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoY29tcG9uZW50KSB7CiAgICAgICAgdGhyb3cgbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KTsKICAgIH0KfQovKioKICogQSBzaW1wbGUgcmVnaXN0cnkgdGhhdCBtYXBzIGBDb21wb25lbnRzYCB0byBnZW5lcmF0ZWQgYENvbXBvbmVudEZhY3RvcnlgIGNsYXNzZXMKICogdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIGNvbXBvbmVudHMuCiAqIFVzZSB0byBvYnRhaW4gdGhlIGZhY3RvcnkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IHR5cGUsCiAqIHRoZW4gdXNlIHRoZSBmYWN0b3J5J3MgYGNyZWF0ZSgpYCBtZXRob2QgdG8gY3JlYXRlIGEgY29tcG9uZW50IG9mIHRoYXQgdHlwZS4KICoKICogQHNlZSBbRHluYW1pYyBDb21wb25lbnRzXShndWlkZS9keW5hbWljLWNvbXBvbmVudC1sb2FkZXIpCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHsKfQpDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIuTlVMTCA9IG5ldyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2VsZW1lbnRfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIHdyYXBwZXIgYXJvdW5kIGEgbmF0aXZlIGVsZW1lbnQgaW5zaWRlIG9mIGEgVmlldy4KICoKICogQW4gYEVsZW1lbnRSZWZgIGlzIGJhY2tlZCBieSBhIHJlbmRlci1zcGVjaWZpYyBlbGVtZW50LiBJbiB0aGUgYnJvd3NlciwgdGhpcyBpcyB1c3VhbGx5IGEgRE9NCiAqIGVsZW1lbnQuCiAqCiAqIFxAc2VjdXJpdHkgUGVybWl0dGluZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBET00gY2FuIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBtb3JlIHZ1bG5lcmFibGUgdG8KICogWFNTIGF0dGFja3MuIENhcmVmdWxseSByZXZpZXcgYW55IHVzZSBvZiBgRWxlbWVudFJlZmAgaW4geW91ciBjb2RlLiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUKICogW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwovLyBOb3RlOiBXZSBkb24ndCBleHBvc2UgdGhpbmdzIGxpa2UgYEluamVjdG9yYCwgYFZpZXdDb250YWluZXJgLCAuLi4gaGVyZSwKLy8gaS5lLiB1c2VycyBoYXZlIHRvIGFzayBmb3Igd2hhdCB0aGV5IG5lZWQuIFdpdGggdGhhdCwgd2UgY2FuIGJ1aWxkIGJldHRlciBhbmFseXNpcyB0b29scwovLyBhbmQgY291bGQgZG8gYmV0dGVyIGNvZGVnZW4gaW4gdGhlIGZ1dHVyZS4KY2xhc3MgRWxlbWVudFJlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmF0aXZlRWxlbWVudAogICAgICovCiAgICBjb25zdHJ1Y3RvcihuYXRpdmVFbGVtZW50KSB7CiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gbmF0aXZlRWxlbWVudDsKICAgIH0KfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KRWxlbWVudFJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZKEVsZW1lbnRSZWYpKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0RWxlbWVudFJlZjsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWSA9IFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZX19QT1NUX1IzX187CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIvYXBpLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUmVuZGVyZXIySW50ZXJjZXB0b3IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1JlbmRlcmVyMkludGVyY2VwdG9yJyk7Ci8qKgogKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGN1c3RvbSByZW5kZXJlciB0aGF0IGltcGxlbWVudHMgdGhlIGBSZW5kZXJlcjJgIGJhc2UgY2xhc3MuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgUmVuZGVyZXJGYWN0b3J5MiB7Cn0KLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFJlbmRlcmVyU3R5bGVGbGFnczIgPSB7CiAgICAvLyBUT0RPKG1pc2tvKTogVGhpcyBuZWVkcyB0byBiZSByZWZhY3RvcmVkIGludG8gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgaXQgY2FuIGJlIGltcG9ydGVkIGZyb20KICAgIC8vIGBub2RlX21hbmlwdWxhdGlvbi50c2AgQ3VycmVudGx5IGRvaW5nIHRoZSBpbXBvcnQgY2F1c2UgcmVzb2x1dGlvbiBvcmRlciB0byBjaGFuZ2UgYW5kIGZhaWxzCiAgICAvLyB0aGUgdGVzdHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBoYXZlIGhhcmQgY29kZWQgdmFsdWUgaW4gYG5vZGVfbWFuaXB1bGF0aW9uLnRzYCBmb3Igbm93LgogICAgLyoqCiAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIGltcG9ydGFudC4KICAgICAqLwogICAgSW1wb3J0YW50OiAxLAogICAgLyoqCiAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIHVzaW5nIGRhc2ggY2FzZSBuYW1pbmcgKHRoaXMtaXMtZGFzaC1jYXNlKS4KICAgICAqLwogICAgRGFzaENhc2U6IDIsCn07ClJlbmRlcmVyU3R5bGVGbGFnczJbUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnRdID0gJ0ltcG9ydGFudCc7ClJlbmRlcmVyU3R5bGVGbGFnczJbUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZV0gPSAnRGFzaENhc2UnOwovKioKICogRXh0ZW5kIHRoaXMgYmFzZSBjbGFzcyB0byBpbXBsZW1lbnQgY3VzdG9tIHJlbmRlcmluZy4gQnkgZGVmYXVsdCwgQW5ndWxhcgogKiByZW5kZXJzIGEgdGVtcGxhdGUgaW50byBET00uIFlvdSBjYW4gdXNlIGN1c3RvbSByZW5kZXJpbmcgdG8gaW50ZXJjZXB0CiAqIHJlbmRlcmluZyBjYWxscywgb3IgdG8gcmVuZGVyIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIERPTS4KICoKICogQ3JlYXRlIHlvdXIgY3VzdG9tIHJlbmRlcmVyIHVzaW5nIGBSZW5kZXJlckZhY3RvcnkyYC4KICoKICogVXNlIGEgY3VzdG9tIHJlbmRlcmVyIHRvIGJ5cGFzcyBBbmd1bGFyJ3MgdGVtcGxhdGluZyBhbmQKICogbWFrZSBjdXN0b20gVUkgY2hhbmdlcyB0aGF0IGNhbid0IGJlIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LgogKiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwogKiBub3Qgc3RhdGljYWxseSBrbm93biwgdXNlIHRoZSBgc2V0UHJvcGVydHkoKWAgb3IKICogYHNldEF0dHJpYnV0ZSgpYCBtZXRob2QuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgUmVuZGVyZXIyIHsKfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KUmVuZGVyZXIyLl9fTkdfRUxFTUVOVF9JRF9fID0gKC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gU1dJVENIX1JFTkRFUkVSMl9GQUNUT1JZKCkpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0UmVuZGVyZXIyOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWSA9IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXplci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU2FuaXRpemVyIGlzIHVzZWQgYnkgdGhlIHZpZXdzIHRvIHNhbml0aXplIHBvdGVudGlhbGx5IGRhbmdlcm91cyB2YWx1ZXMuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgU2FuaXRpemVyIHsKfQovKiogQG5vY29sbGFwc2UgKi8KU2FuaXRpemVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBTYW5pdGl6ZXIsCiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBudWxsKSwKfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92ZXJzaW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIFxAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBBbmd1bGFyCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBWZXJzaW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmdWxsCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGZ1bGwpIHsKICAgICAgICB0aGlzLmZ1bGwgPSBmdWxsOwogICAgICAgIHRoaXMubWFqb3IgPSBmdWxsLnNwbGl0KCcuJylbMF07CiAgICAgICAgdGhpcy5taW5vciA9IGZ1bGwuc3BsaXQoJy4nKVsxXTsKICAgICAgICB0aGlzLnBhdGNoID0gZnVsbC5zcGxpdCgnLicpLnNsaWNlKDIpLmpvaW4oJy4nKTsKICAgIH0KfQovKioKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9pdGVyYWJsZV9kaWZmZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3VwcG9ydHMob2JqKSB7CiAgICAgICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZSQxKG9iaik7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKiBAcGFyYW0gez89fSB0cmFja0J5Rm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZSh0cmFja0J5Rm4pIHsKICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRJdGVyYWJsZURpZmZlcih0cmFja0J5Rm4pOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgdHJhY2tCeUlkZW50aXR5ID0gKC8qKgogKiBAcGFyYW0gez99IGluZGV4CiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcmV0dXJuIHs/fQogKi8KKGluZGV4LCBpdGVtKSA9PiBpdGVtKTsKLyoqCiAqIEBkZXByZWNhdGVkIHY0LjAuMCAtIFNob3VsZCBub3QgYmUgcGFydCBvZiBwdWJsaWMgQVBJLgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gdHJhY2tCeUZuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHRyYWNrQnlGbikgewogICAgICAgIHRoaXMubGVuZ3RoID0gMDsKICAgICAgICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdXNlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIChkdXJpbmcgJiBhY3Jvc3MgYF9jaGVjaygpYCBjYWxscykKICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbnVsbDsKICAgICAgICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcmVtb3ZlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIGR1cmluZyBgX2NoZWNrKClgIGNhbGxzLgogICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG51bGw7CiAgICAgICAgdGhpcy5fcHJldmlvdXNJdEhlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2l0SGVhZCA9IG51bGw7CiAgICAgICAgdGhpcy5faXRUYWlsID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDsKICAgICAgICB0aGlzLl9tb3Zlc0hlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX21vdmVzVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsOwogICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHJlY29yZHMgd2hlcmUgY3VzdG9tIHRyYWNrIGJ5IGlzIHRoZSBzYW1lLCBidXQgaXRlbSBpZGVudGl0eSBoYXMgY2hhbmdlZAogICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IHRyYWNrQnlGbiB8fCB0cmFja0J5SWRlbnRpdHk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3JFYWNoT3BlcmF0aW9uKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXh0SXQgPSB0aGlzLl9pdEhlYWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXh0UmVtb3ZlID0gdGhpcy5fcmVtb3ZhbHNIZWFkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYWRkUmVtb3ZlT2Zmc2V0ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1vdmVPZmZzZXRzID0gbnVsbDsKICAgICAgICB3aGlsZSAobmV4dEl0IHx8IG5leHRSZW1vdmUpIHsKICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBpcyB0aGUgbmV4dCByZWNvcmQgdG8gcHJvY2VzcwogICAgICAgICAgICAvLyBPcmRlcjogcmVtb3ZlLCBhZGQsIG1vdmUKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWNvcmQgPSAhbmV4dFJlbW92ZSB8fAogICAgICAgICAgICAgICAgbmV4dEl0ICYmCiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdC5jdXJyZW50SW5kZXgpKSA8CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZXZpb3VzSW5kZXgobmV4dFJlbW92ZSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykgPwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdCkpIDoKICAgICAgICAgICAgICAgIG5leHRSZW1vdmU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWRqUHJldmlvdXNJbmRleCA9IGdldFByZXZpb3VzSW5kZXgocmVjb3JkLCBhZGRSZW1vdmVPZmZzZXQsIG1vdmVPZmZzZXRzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4OwogICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBpdGVtLCBhbmQgYWRqdXN0IHRoZSBhZGRSZW1vdmVPZmZzZXQgYW5kIHVwZGF0ZSBtb3ZlRGlzdGFuY2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG5leHRSZW1vdmUpIHsKICAgICAgICAgICAgICAgIGFkZFJlbW92ZU9mZnNldC0tOwogICAgICAgICAgICAgICAgbmV4dFJlbW92ZSA9IG5leHRSZW1vdmUuX25leHRSZW1vdmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dEl0ID0gKC8qKiBAdHlwZSB7P30gKi8gKG5leHRJdCkpLl9uZXh0OwogICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdmVPZmZzZXQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIElOVkFSSUFOVDogIGN1cnJlbnRJbmRleCA8IHByZXZpb3VzSW5kZXgKICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVPZmZzZXRzKQogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlT2Zmc2V0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE1vdmVQcmV2aW91c0luZGV4ID0gYWRqUHJldmlvdXNJbmRleCAtIGFkZFJlbW92ZU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxDdXJyZW50SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudEluZGV4KSkgLSBhZGRSZW1vdmVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTW92ZVByZXZpb3VzSW5kZXggIT0gbG9jYWxDdXJyZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbE1vdmVQcmV2aW91c0luZGV4OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IGkgPCBtb3ZlT2Zmc2V0cy5sZW5ndGggPyBtb3ZlT2Zmc2V0c1tpXSA6IChtb3ZlT2Zmc2V0c1tpXSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQ3VycmVudEluZGV4IDw9IGluZGV4ICYmIGluZGV4IDwgbG9jYWxNb3ZlUHJldmlvdXNJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzW2ldID0gb2Zmc2V0ICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSByZWNvcmQucHJldmlvdXNJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldHNbcHJldmlvdXNJbmRleF0gPSBsb2NhbEN1cnJlbnRJbmRleCAtIGxvY2FsTW92ZVByZXZpb3VzSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhZGpQcmV2aW91c0luZGV4ICE9PSBjdXJyZW50SW5kZXgpIHsKICAgICAgICAgICAgICAgIGZuKHJlY29yZCwgYWRqUHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFByZXZpb3VzSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hBZGRlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hNb3ZlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFJlbW92ZWRJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaElkZW50aXR5Q2hhbmdlKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dElkZW50aXR5Q2hhbmdlKSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpZmYoY29sbGVjdGlvbikgewogICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpCiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBbXTsKICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZSQxKGNvbGxlY3Rpb24pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJyR7c3RyaW5naWZ5KGNvbGxlY3Rpb24pfScuIE9ubHkgYXJyYXlzIGFuZCBpdGVyYWJsZXMgYXJlIGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuY2hlY2soY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNoZWNrKGNvbGxlY3Rpb24pIHsKICAgICAgICB0aGlzLl9yZXNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faXRIZWFkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWF5QmVEaXJ0eSA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpdGVtOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaXRlbVRyYWNrQnk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2xsZWN0aW9uW2luZGV4XTsKICAgICAgICAgICAgICAgIGl0ZW1UcmFja0J5ID0gdGhpcy5fdHJhY2tCeUZuKGluZGV4LCBpdGVtKTsKICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwgfHwgIWxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIGl0ZW1UcmFja0J5KSkgewogICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX21pc21hdGNoKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICBtYXlCZURpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChtYXlCZURpcnR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWNvcmQgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgaXRlcmF0ZUxpc3RMaWtlJDEoY29sbGVjdGlvbiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IHRoaXMuX3RyYWNrQnlGbihpbmRleCwgaXRlbSk7CiAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09PSBudWxsIHx8ICFsb29zZUlkZW50aWNhbChyZWNvcmQudHJhY2tCeUlkLCBpdGVtVHJhY2tCeSkpIHsKICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogY2FuIHdlIGxpbWl0IHRoaXMgdG8gZHVwbGljYXRlcyBvbmx5PwogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSB0aGlzLl92ZXJpZnlSZWluc2VydGlvbihyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0OwogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkubGVuZ3RoID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3RydW5jYXRlKHJlY29yZCk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwogICAgICAgIHJldHVybiB0aGlzLmlzRGlydHk7CiAgICB9CiAgICAvKiBDb2xsZWN0aW9uQ2hhbmdlcyBpcyBjb25zaWRlcmVkIGRpcnR5IGlmIGl0IGhhcyBhbnkgYWRkaXRpb25zLCBtb3ZlcywgcmVtb3ZhbHMsIG9yIGlkZW50aXR5CiAgICAgICAqIGNoYW5nZXMuCiAgICAgICAqLwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaXNEaXJ0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25zSGVhZCAhPT0gbnVsbCB8fCB0aGlzLl9tb3Zlc0hlYWQgIT09IG51bGwgfHwKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgIT09IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2hhbmdlIG9iamVjdHMgdG8gc2hvdyBubyBjaGFuZ2VzLiBUaGlzIG1lYW5zIHNldCBwcmV2aW91c0tleSB0bwogICAgICogY3VycmVudEtleSwgYW5kIGNsZWFyIGFsbCBvZiB0aGUgcXVldWVzIChhZGRpdGlvbnMsIG1vdmVzLCByZW1vdmFscykuCiAgICAgKiBTZXQgdGhlIHByZXZpb3VzSW5kZXhlcyBvZiBtb3ZlZCBhbmQgYWRkZWQgaXRlbXMgdG8gdGhlaXIgY3VycmVudEluZGV4ZXMKICAgICAqIFJlc2V0IHRoZSBsaXN0IG9mIGFkZGl0aW9ucywgbW92ZXMgYW5kIHJlbW92YWxzCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Jlc2V0KCkgewogICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuZXh0UmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzSXRIZWFkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkgewogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7CiAgICAgICAgICAgICAgICBuZXh0UmVjb3JkID0gcmVjb3JkLl9uZXh0TW92ZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbW92ZXNIZWFkID0gdGhpcy5fbW92ZXNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gdGhpcy5fcmVtb3ZhbHNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOiB3aGVuIGFzc2VydCBnZXRzIHN1cHBvcnRlZAogICAgICAgICAgICAvLyBhc3NlcnQoIXRoaXMuaXNEaXJ0eSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIGlzIHRoZSBjb3JlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb2xsZWN0aW9ucy4KICAgICAqCiAgICAgKiAtIGByZWNvcmRgIGlzIHRoZSByZWNvcmQgd2hpY2ggd2Ugc2F3IGF0IHRoaXMgcG9zaXRpb24gbGFzdCB0aW1lLiBJZiBudWxsIHRoZW4gaXQgaXMgYSBuZXcKICAgICAqICAgaXRlbS4KICAgICAqIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24KICAgICAqIC0gYGluZGV4YCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24KICAgICAqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcGFyYW0gez99IGl0ZW1UcmFja0J5CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpdGVtVHJhY2tCeSwgaW5kZXgpIHsKICAgICAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByZXZpb3VzUmVjb3JkOwogICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwpIHsKICAgICAgICAgICAgcHJldmlvdXNSZWNvcmQgPSB0aGlzLl9pdFRhaWw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2aW91c1JlY29yZCA9IHJlY29yZC5fcHJldjsKICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSB0aGUgY29sbGVjdGlvbiBzaW5jZSB3ZSBrbm93IGl0IGRvZXMgbm90IG1hdGNoIHRoZSBpdGVtLgogICAgICAgICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTsKICAgICAgICB9CiAgICAgICAgLy8gQXR0ZW1wdCB0byBzZWUgaWYgd2UgaGF2ZSBzZWVuIHRoZSBpdGVtIGJlZm9yZS4KICAgICAgICByZWNvcmQgPSB0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX2xpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgaWYgKHJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIHNlZW4gdGhpcyBiZWZvcmUsIHdlIG5lZWQgdG8gbW92ZSBpdCBmb3J3YXJkIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKQogICAgICAgICAgICAgICAgdGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UocmVjb3JkLCBpdGVtKTsKICAgICAgICAgICAgdGhpcy5fbW92ZUFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIE5ldmVyIHNlZW4gaXQsIGNoZWNrIGV2aWN0ZWQgbGlzdC4KICAgICAgICAgICAgcmVjb3JkID0gdGhpcy5fdW5saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQoaXRlbVRyYWNrQnksIG51bGwpOwogICAgICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhbiBpdGVtIHdoaWNoIHdlIGhhdmUgZXZpY3RlZCBlYXJsaWVyOiByZWluc2VydCBpdCBiYWNrIGludG8gdGhlIGxpc3QuCiAgICAgICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5fcmVpbnNlcnRBZnRlcihyZWNvcmQsIHByZXZpb3VzUmVjb3JkLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIG5ldyBpdGVtOiBhZGQgaXQuCiAgICAgICAgICAgICAgICByZWNvcmQgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEFmdGVyKG5ldyBJdGVyYWJsZUNoYW5nZVJlY29yZF8oaXRlbSwgaXRlbVRyYWNrQnkpLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgY2hlY2sgaXMgb25seSBuZWVkZWQgaWYgYW4gYXJyYXkgY29udGFpbnMgZHVwbGljYXRlcy4gKFNob3J0IGNpcmN1aXQgb2Ygbm90aGluZyBkaXJ0eSkKICAgICAqCiAgICAgKiBVc2UgY2FzZTogYFthLCBhXWAgPT4gYFtiLCBhLCBhXWAKICAgICAqCiAgICAgKiBJZiB3ZSBkaWQgbm90IGhhdmUgdGhpcyBjaGVjayB0aGVuIHRoZSBpbnNlcnRpb24gb2YgYGJgIHdvdWxkOgogICAgICogICAxKSBldmljdCBmaXJzdCBgYWAKICAgICAqICAgMikgaW5zZXJ0IGBiYCBhdCBgMGAgaW5kZXguCiAgICAgKiAgIDMpIGxlYXZlIGBhYCBhdCBpbmRleCBgMWAgYXMgaXMuIDwtLSB0aGlzIGlzIHdyb25nIQogICAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMi4gPC0tIHRoaXMgaXMgd3JvbmchCiAgICAgKgogICAgICogVGhlIGNvcnJlY3QgYmVoYXZpb3IgaXM6CiAgICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYAogICAgICogICAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC4KICAgICAqICAgMykgcmVpbnNlcnQgYGFgIGF0IGluZGV4IDEuCiAgICAgKiAgIDMpIG1vdmUgYGFgIGF0IGZyb20gYDFgIHRvIGAyYC4KICAgICAqCiAgICAgKgogICAgICogRG91YmxlIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZXZpY3RlZCBhIGR1cGxpY2F0ZSBpdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpdGVtIHR5cGUgbWF5CiAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkOgogICAgICogVGhlIGluc2VydGlvbiBvZiBiIHdpbGwgZXZpY3QgdGhlIGZpcnN0ICdhJy4gSWYgd2UgZG9uJ3QgcmVpbnNlcnQgaXQgbm93IGl0IHdpbGwgYmUgcmVpbnNlcnRlZAogICAgICogYXQgdGhlIGVuZC4gV2hpY2ggd2lsbCBzaG93IHVwIGFzIHRoZSB0d28gJ2EncyBzd2l0Y2hpbmcgcG9zaXRpb24uIFRoaXMgaXMgaW5jb3JyZWN0LCBzaW5jZSBhCiAgICAgKiBiZXR0ZXIgd2F5IHRvIHRoaW5rIG9mIGl0IGlzIGFzIGluc2VydCBvZiAnYicgcmF0aGVyIHRoZW4gc3dpdGNoICdhJyB3aXRoICdiJyBhbmQgdGhlbiBhZGQgJ2EnCiAgICAgKiBhdCB0aGUgZW5kLgogICAgICoKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEBwYXJhbSB7P30gaXRlbVRyYWNrQnkKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF92ZXJpZnlSZWluc2VydGlvbihyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVpbnNlcnRSZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtVHJhY2tCeSwgbnVsbCk7CiAgICAgICAgaWYgKHJlaW5zZXJ0UmVjb3JkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVpbnNlcnRSZWNvcmQsICgvKiogQHR5cGUgez99ICovIChyZWNvcmQuX3ByZXYpKSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyZWNvcmQuY3VycmVudEluZGV4ICE9IGluZGV4KSB7CiAgICAgICAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDsKICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogR2V0IHJpZCBvZiBhbnkgZXhjZXNzIHtcQGxpbmsgSXRlcmFibGVDaGFuZ2VSZWNvcmRffXMgZnJvbSB0aGUgcHJldmlvdXMgY29sbGVjdGlvbgogICAgICoKICAgICAqIC0gYHJlY29yZGAgVGhlIGZpcnN0IGV4Y2VzcyB7XEBsaW5rIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkX30uCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF90cnVuY2F0ZShyZWNvcmQpIHsKICAgICAgICAvLyBBbnl0aGluZyBhZnRlciB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQ7CiAgICAgICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRSZWNvcmQgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpOwogICAgICAgICAgICByZWNvcmQgPSBuZXh0UmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fdW5saW5rZWRSZWNvcmRzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5jbGVhcigpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2l0VGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdFRhaWwuX25leHQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fcmVtb3ZhbHNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2UgPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEBwYXJhbSB7P30gcHJldlJlY29yZAogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkgewogICAgICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkOwogICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpOwogICAgICAgIHRoaXMuX2FkZFRvTW92ZXMocmVjb3JkLCBpbmRleCk7CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEBwYXJhbSB7P30gcHJldlJlY29yZAogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21vdmVBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgdGhpcy5fdW5saW5rKHJlY29yZCk7CiAgICAgICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7CiAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkQWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCkgewogICAgICAgIHRoaXMuX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpOwogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgIC8vIGFzc2VydCh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKTsKICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IHByZXZSZWNvcmQKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpOwogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT09IG51bGwpOwogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXYgPT09IG51bGwpOwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KHJlY29yZCAhPSBwcmV2UmVjb3JkKTsKICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09PSBudWxsKTsKICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2ID09PSBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHByZXZSZWNvcmQgPT09IG51bGwgPyB0aGlzLl9pdEhlYWQgOiBwcmV2UmVjb3JkLl9uZXh0OwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KG5leHQgIT0gcmVjb3JkKTsKICAgICAgICAvLyBhc3NlcnQocHJldlJlY29yZCAhPSByZWNvcmQpOwogICAgICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7CiAgICAgICAgcmVjb3JkLl9wcmV2ID0gcHJldlJlY29yZDsKICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAocHJldlJlY29yZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTsKICAgICAgICByZWNvcmQuY3VycmVudEluZGV4ID0gaW5kZXg7CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmUocmVjb3JkKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VubGluayhyZWNvcmQpIHsKICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9wcmV2ID0gbnVsbCkgPT09IG51bGwpOwogICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9uZXh0ID0gbnVsbCkgPT09IG51bGwpOwogICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2l0SGVhZCA9IG5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKG5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gcHJldjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5leHQuX3ByZXYgPSBwcmV2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHBhcmFtIHs/fSB0b0luZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkVG9Nb3ZlcyhyZWNvcmQsIHRvSW5kZXgpIHsKICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRNb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSB0b0luZGV4KSB7CiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9tb3Zlc1RhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgLy8gYXNzZXJ0KF9tb3Zlc0hlYWQgPT09IG51bGwpOwogICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX21vdmVzVGFpbC5fbmV4dE1vdmVkID09PSBudWxsKTsKICAgICAgICAgICAgdGhpcy5fbW92ZXNUYWlsID0gdGhpcy5fbW92ZXNUYWlsLl9uZXh0TW92ZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZFRvUmVtb3ZhbHMocmVjb3JkKSB7CiAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMgPSBuZXcgX0R1cGxpY2F0ZU1hcCgpOwogICAgICAgIH0KICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7CiAgICAgICAgcmVjb3JkLmN1cnJlbnRJbmRleCA9IG51bGw7CiAgICAgICAgcmVjb3JkLl9uZXh0UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX3JlbW92YWxzSGVhZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDsKICAgICAgICAgICAgcmVjb3JkLl9wcmV2UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQoX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPT09IG51bGwpOwogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSB0aGlzLl9yZW1vdmFsc1RhaWw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZWNvcmQ7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pIHsKICAgICAgICByZWNvcmQuaXRlbSA9IGl0ZW07CiAgICAgICAgaWYgKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgSXRlcmFibGVDaGFuZ2VSZWNvcmRfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcGFyYW0gez99IHRyYWNrQnlJZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihpdGVtLCB0cmFja0J5SWQpIHsKICAgICAgICB0aGlzLml0ZW0gPSBpdGVtOwogICAgICAgIHRoaXMudHJhY2tCeUlkID0gdHJhY2tCeUlkOwogICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gbnVsbDsKICAgICAgICB0aGlzLnByZXZpb3VzSW5kZXggPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0UHJldmlvdXMgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX3ByZXZEdXAgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0RHVwID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fcHJldlJlbW92ZWQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRBZGRlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRNb3ZlZCA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRJZGVudGl0eUNoYW5nZSA9IG51bGw7CiAgICB9Cn0KLy8gQSBsaW5rZWQgbGlzdCBvZiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkcyB3aXRoIHRoZSBzYW1lIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy5pdGVtCi8qKgogKiBAdGVtcGxhdGUgVgogKi8KY2xhc3MgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9oZWFkID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGFpbCA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZCB0aGUgcmVjb3JkIHRvIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCiAgICAgKgogICAgICogTm90ZTogYnkgZGVzaWduIGFsbCByZWNvcmRzIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaG9sZCB0aGUgc2FtZSB2YWx1ZSBpbiByZWNvcmQuaXRlbS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGQocmVjb3JkKSB7CiAgICAgICAgaWYgKHRoaXMuX2hlYWQgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgIHJlY29yZC5fbmV4dER1cCA9IG51bGw7CiAgICAgICAgICAgIHJlY29yZC5fcHJldkR1cCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLml0ZW0gPT0gIF9oZWFkLml0ZW0gfHwKICAgICAgICAgICAgLy8gICAgICAgcmVjb3JkLml0ZW0gaXMgbnVtICYmIHJlY29yZC5pdGVtLmlzTmFOICYmIF9oZWFkLml0ZW0gaXMgbnVtICYmIF9oZWFkLml0ZW0uaXNOYU4pOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGFpbCkpLl9uZXh0RHVwID0gcmVjb3JkOwogICAgICAgICAgICByZWNvcmQuX3ByZXZEdXAgPSB0aGlzLl90YWlsOwogICAgICAgICAgICByZWNvcmQuX25leHREdXAgPSBudWxsOwogICAgICAgICAgICB0aGlzLl90YWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgIH0KICAgIC8vIFJldHVybnMgYSBJdGVyYWJsZUNoYW5nZVJlY29yZF8gaGF2aW5nIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy50cmFja0J5SWQgPT0gdHJhY2tCeUlkIGFuZAogICAgLy8gSXRlcmFibGVDaGFuZ2VSZWNvcmRfLmN1cnJlbnRJbmRleCA+PSBhdE9yQWZ0ZXJJbmRleAogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRyYWNrQnlJZAogICAgICogQHBhcmFtIHs/fSBhdE9yQWZ0ZXJJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0RHVwKSB7CiAgICAgICAgICAgIGlmICgoYXRPckFmdGVySW5kZXggPT09IG51bGwgfHwgYXRPckFmdGVySW5kZXggPD0gKC8qKiBAdHlwZSB7P30gKi8gKHJlY29yZC5jdXJyZW50SW5kZXgpKSkgJiYKICAgICAgICAgICAgICAgIGxvb3NlSWRlbnRpY2FsKHJlY29yZC50cmFja0J5SWQsIHRyYWNrQnlJZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBvbmUge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KICAgICAqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBpcyBlbXB0eS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmUocmVjb3JkKSB7CiAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAvLyBhc3NlcnQoKCkgewogICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuCiAgICAgICAgLy8gIGZvciAoSXRlcmFibGVDaGFuZ2VSZWNvcmRfIGN1cnNvciA9IF9oZWFkOyBjdXJzb3IgIT0gbnVsbDsgY3Vyc29yID0gY3Vyc29yLl9uZXh0RHVwKSB7CiAgICAgICAgLy8gICAgaWYgKGlkZW50aWNhbChjdXJzb3IsIHJlY29yZCkpIHJldHVybiB0cnVlOwogICAgICAgIC8vICB9CiAgICAgICAgLy8gIHJldHVybiBmYWxzZTsKICAgICAgICAvL30pOwogICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgLy8gYXNzZXJ0KCgpIHsKICAgICAgICAvLyAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlY29yZCBiZWluZyByZW1vdmVkIGlzIGluIHRoZSBsaXN0LgogICAgICAgIC8vICBmb3IgKEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBjdXJzb3IgPSBfaGVhZDsgY3Vyc29yICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5fbmV4dER1cCkgewogICAgICAgIC8vICAgIGlmIChpZGVudGljYWwoY3Vyc29yLCByZWNvcmQpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAvLyAgfQogICAgICAgIC8vICByZXR1cm4gZmFsc2U7CiAgICAgICAgLy99KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldkR1cDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dER1cDsKICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9oZWFkID0gbmV4dDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHByZXYuX25leHREdXAgPSBuZXh0OwogICAgICAgIH0KICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl90YWlsID0gcHJldjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5leHQuX3ByZXZEdXAgPSBwcmV2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5faGVhZCA9PT0gbnVsbDsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFYKICovCmNsYXNzIF9EdXBsaWNhdGVNYXAgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwdXQocmVjb3JkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHJlY29yZC50cmFja0J5SWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkdXBsaWNhdGVzID0gdGhpcy5tYXAuZ2V0KGtleSk7CiAgICAgICAgaWYgKCFkdXBsaWNhdGVzKSB7CiAgICAgICAgICAgIGR1cGxpY2F0ZXMgPSBuZXcgX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0KCk7CiAgICAgICAgICAgIHRoaXMubWFwLnNldChrZXksIGR1cGxpY2F0ZXMpOwogICAgICAgIH0KICAgICAgICBkdXBsaWNhdGVzLmFkZChyZWNvcmQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgYHZhbHVlYCB1c2luZyBrZXkuIEJlY2F1c2UgdGhlIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyB2YWx1ZSBtYXkgYmUgb25lIHdoaWNoIHdlCiAgICAgKiBoYXZlIGFscmVhZHkgaXRlcmF0ZWQgb3Zlciwgd2UgdXNlIHRoZSBgYXRPckFmdGVySW5kZXhgIHRvIHByZXRlbmQgaXQgaXMgbm90IHRoZXJlLgogICAgICoKICAgICAqIFVzZSBjYXNlOiBgW2EsIGIsIGMsIGEsIGFdYCBpZiB3ZSBhcmUgYXQgaW5kZXggYDNgIHdoaWNoIGlzIHRoZSBzZWNvbmQgYGFgIHRoZW4gYXNraW5nIGlmIHdlCiAgICAgKiBoYXZlIGFueSBtb3JlIGBhYHMgbmVlZHMgdG8gcmV0dXJuIHRoZSBzZWNvbmQgYGFgLgogICAgICogQHBhcmFtIHs/fSB0cmFja0J5SWQKICAgICAqIEBwYXJhbSB7P30gYXRPckFmdGVySW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCh0cmFja0J5SWQsIGF0T3JBZnRlckluZGV4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHRyYWNrQnlJZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjb3JkTGlzdCA9IHRoaXMubWFwLmdldChrZXkpOwogICAgICAgIHJldHVybiByZWNvcmRMaXN0ID8gcmVjb3JkTGlzdC5nZXQodHJhY2tCeUlkLCBhdE9yQWZ0ZXJJbmRleCkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KICAgICAqCiAgICAgKiBUaGUgbGlzdCBvZiBkdXBsaWNhdGVzIGFsc28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAgaWYgaXQgZ2V0cyBlbXB0eS4KICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmUocmVjb3JkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IHJlY29yZC50cmFja0J5SWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlY29yZExpc3QgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXAuZ2V0KGtleSkpKTsKICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyB3aGVuIGl0IGdldHMgZW1wdHkKICAgICAgICBpZiAocmVjb3JkTGlzdC5yZW1vdmUocmVjb3JkKSkgewogICAgICAgICAgICB0aGlzLm1hcC5kZWxldGUoa2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGlzRW1wdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWFwLnNpemUgPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNsZWFyKCkgewogICAgICAgIHRoaXMubWFwLmNsZWFyKCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gaXRlbQogKiBAcGFyYW0gez99IGFkZFJlbW92ZU9mZnNldAogKiBAcGFyYW0gez99IG1vdmVPZmZzZXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRQcmV2aW91c0luZGV4KGl0ZW0sIGFkZFJlbW92ZU9mZnNldCwgbW92ZU9mZnNldHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBpdGVtLnByZXZpb3VzSW5kZXg7CiAgICBpZiAocHJldmlvdXNJbmRleCA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gcHJldmlvdXNJbmRleDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtb3ZlT2Zmc2V0ID0gMDsKICAgIGlmIChtb3ZlT2Zmc2V0cyAmJiBwcmV2aW91c0luZGV4IDwgbW92ZU9mZnNldHMubGVuZ3RoKSB7CiAgICAgICAgbW92ZU9mZnNldCA9IG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdOwogICAgfQogICAgcmV0dXJuIHByZXZpb3VzSW5kZXggKyBhZGRSZW1vdmVPZmZzZXQgKyBtb3ZlT2Zmc2V0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqLwpjbGFzcyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IHsKICAgIGNvbnN0cnVjdG9yKCkgeyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdXBwb3J0cyhvYmopIHsKICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QkMShvYmopOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgSywgVgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlKCkgewogICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEtleVZhbHVlRGlmZmVyKCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqLwpjbGFzcyBEZWZhdWx0S2V5VmFsdWVEaWZmZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5fcmVjb3JkcyA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLl9tYXBIZWFkID0gbnVsbDsKICAgICAgICAvLyBfYXBwZW5kQWZ0ZXIgaXMgdXNlZCBpbiB0aGUgY2hlY2sgbG9vcAogICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gbnVsbDsKICAgICAgICB0aGlzLl9wcmV2aW91c01hcEhlYWQgPSBudWxsOwogICAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IG51bGw7CiAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7CiAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaXNEaXJ0eSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYWRkaXRpb25zSGVhZCAhPT0gbnVsbCB8fCB0aGlzLl9jaGFuZ2VzSGVhZCAhPT0gbnVsbCB8fAogICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgIT09IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9tYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkgewogICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yRWFjaFByZXZpb3VzSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFByZXZpb3VzKSB7CiAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3JFYWNoQ2hhbmdlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2NoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dENoYW5nZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hBZGRlZEl0ZW0oZm4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2hSZW1vdmVkSXRlbShmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcmVtb3ZhbHNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dFJlbW92ZWQpIHsKICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IG1hcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlmZihtYXApIHsKICAgICAgICBpZiAoIW1hcCkgewogICAgICAgICAgICBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QkMShtYXApKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke3N0cmluZ2lmeShtYXApfScuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZGApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5jaGVjayhtYXApID8gdGhpcyA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFwIHZzIHRoZSBwcmV2aW91cy4KICAgICAqIFRoZSBhbGdvcml0aG0gaXMgb3B0aW1pc2VkIGZvciB3aGVuIHRoZSBrZXlzIGRvIG5vIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gbWFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjaGVjayhtYXApIHsKICAgICAgICB0aGlzLl9yZXNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5zZXJ0QmVmb3JlID0gdGhpcy5fbWFwSGVhZDsKICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IG51bGw7CiAgICAgICAgdGhpcy5fZm9yRWFjaChtYXAsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUgJiYgaW5zZXJ0QmVmb3JlLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhpbnNlcnRCZWZvcmUsIHZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gaW5zZXJ0QmVmb3JlOwogICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlID0gaW5zZXJ0QmVmb3JlLl9uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fZ2V0T3JDcmVhdGVSZWNvcmRGb3JLZXkoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSB0aGlzLl9pbnNlcnRCZWZvcmVPckFwcGVuZChpbnNlcnRCZWZvcmUsIHJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgLy8gSXRlbXMgcmVtYWluaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7CiAgICAgICAgICAgIGlmIChpbnNlcnRCZWZvcmUuX3ByZXYpIHsKICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5fcHJldi5fbmV4dCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gaW5zZXJ0QmVmb3JlOwogICAgICAgICAgICBmb3IgKGxldCByZWNvcmQgPSBpbnNlcnRCZWZvcmU7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gdGhpcy5fbWFwSGVhZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcmVjb3Jkcy5kZWxldGUocmVjb3JkLmtleSk7CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHRSZW1vdmVkID0gcmVjb3JkLl9uZXh0OwogICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBudWxsOwogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBNYWtlIHN1cmUgdGFpbHMgaGF2ZSBubyBuZXh0IHJlY29yZHMgZnJvbSBwcmV2aW91cyBydW5zCiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZXNUYWlsKQogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQgPSBudWxsOwogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsKQogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsOwogICAgICAgIHJldHVybiB0aGlzLmlzRGlydHk7CiAgICB9CiAgICAvKioKICAgICAqIEluc2VydHMgYSByZWNvcmQgYmVmb3JlIGBiZWZvcmVgIG9yIGFwcGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IHdoZW4gYGJlZm9yZWAgaXMgbnVsbC4KICAgICAqCiAgICAgKiBOb3RlczoKICAgICAqIC0gVGhpcyBtZXRob2QgYXBwZW5kcyBhdCBgdGhpcy5fYXBwZW5kQWZ0ZXJgLAogICAgICogLSBUaGlzIG1ldGhvZCB1cGRhdGVzIGB0aGlzLl9hcHBlbmRBZnRlcmAsCiAgICAgKiAtIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGluc2VydGlvbiBwb2ludGVyLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gYmVmb3JlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2luc2VydEJlZm9yZU9yQXBwZW5kKGJlZm9yZSwgcmVjb3JkKSB7CiAgICAgICAgaWYgKGJlZm9yZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSBiZWZvcmUuX3ByZXY7CiAgICAgICAgICAgIHJlY29yZC5fbmV4dCA9IGJlZm9yZTsKICAgICAgICAgICAgcmVjb3JkLl9wcmV2ID0gcHJldjsKICAgICAgICAgICAgYmVmb3JlLl9wcmV2ID0gcmVjb3JkOwogICAgICAgICAgICBpZiAocHJldikgewogICAgICAgICAgICAgICAgcHJldi5fbmV4dCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmVmb3JlID09PSB0aGlzLl9tYXBIZWFkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gYmVmb3JlOwogICAgICAgICAgICByZXR1cm4gYmVmb3JlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fYXBwZW5kQWZ0ZXIpIHsKICAgICAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQgPSByZWNvcmQ7CiAgICAgICAgICAgIHJlY29yZC5fcHJldiA9IHRoaXMuX2FwcGVuZEFmdGVyOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fbWFwSGVhZCA9IHJlY29yZDsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIgPSByZWNvcmQ7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE9yQ3JlYXRlUmVjb3JkRm9yS2V5KGtleSwgdmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5fcmVjb3Jkcy5oYXMoa2V5KSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9yZWNvcmRzLmdldChrZXkpKSk7CiAgICAgICAgICAgIHRoaXMuX21heWJlQWRkVG9DaGFuZ2VzKHJlY29yZCwgdmFsdWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSByZWNvcmQuX3ByZXY7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgICAgIHByZXYuX25leHQgPSBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2ID0gcHJldjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWNvcmQuX25leHQgPSBudWxsOwogICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjb3JkID0gbmV3IEtleVZhbHVlQ2hhbmdlUmVjb3JkXyhrZXkpOwogICAgICAgIHRoaXMuX3JlY29yZHMuc2V0KGtleSwgcmVjb3JkKTsKICAgICAgICByZWNvcmQuY3VycmVudFZhbHVlID0gdmFsdWU7CiAgICAgICAgdGhpcy5fYWRkVG9BZGRpdGlvbnMocmVjb3JkKTsKICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfcmVzZXQoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgICAgIC8vIGxldCBgX3ByZXZpb3VzTWFwSGVhZGAgY29udGFpbiB0aGUgc3RhdGUgb2YgdGhlIG1hcCBiZWZvcmUgdGhlIGNoYW5nZXMKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNNYXBIZWFkID0gdGhpcy5fbWFwSGVhZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHRQcmV2aW91cyA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBVcGRhdGUgYHJlY29yZC5wcmV2aW91c1ZhbHVlYCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBiZWZvcmUgdGhlIGNoYW5nZXMKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgYWxsIGNoYW5nZWQgaXRlbXMgKHRoYXQncyB0aG9zZSB3aGljaCBoYXZlIGJlZW4gYWRkZWQgYW5kIGNoYW5nZWQpCiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fY2hhbmdlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0Q2hhbmdlZCkgewogICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvLyBBZGQgdGhlIHJlY29yZCBvciBhIGdpdmVuIGtleSB0byB0aGUgbGlzdCBvZiBjaGFuZ2VzIG9ubHkgd2hlbiB0aGUgdmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbWF5YmVBZGRUb0NoYW5nZXMocmVjb3JkLCBuZXdWYWx1ZSkgewogICAgICAgIGlmICghbG9vc2VJZGVudGljYWwobmV3VmFsdWUsIHJlY29yZC5jdXJyZW50VmFsdWUpKSB7CiAgICAgICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB0aGlzLl9hZGRUb0NoYW5nZXMocmVjb3JkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZFRvQWRkaXRpb25zKHJlY29yZCkgewogICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2FkZGl0aW9uc1RhaWwpKS5fbmV4dEFkZGVkID0gcmVjb3JkOwogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkVG9DaGFuZ2VzKHJlY29yZCkgewogICAgICAgIGlmICh0aGlzLl9jaGFuZ2VzSGVhZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IHRoaXMuX2NoYW5nZXNUYWlsID0gcmVjb3JkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NoYW5nZXNUYWlsKSkuX25leHRDaGFuZ2VkID0gcmVjb3JkOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VzVGFpbCA9IHJlY29yZDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwcml2YXRlCiAgICAgKiBAdGVtcGxhdGUgSywgVgogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9mb3JFYWNoKG9iaiwgZm4pIHsKICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgIG9iai5mb3JFYWNoKGZuKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gawogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgayA9PiBmbihvYmpba10sIGspKSk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgSywgVgogKi8KY2xhc3MgS2V5VmFsdWVDaGFuZ2VSZWNvcmRfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqLwogICAgY29uc3RydWN0b3Ioa2V5KSB7CiAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgdGhpcy5wcmV2aW91c1ZhbHVlID0gbnVsbDsKICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHRQcmV2aW91cyA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dEFkZGVkID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fbmV4dFJlbW92ZWQgPSBudWxsOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uZXh0Q2hhbmdlZCA9IG51bGw7CiAgICB9Cn0KLyoqCiAqIEEgcmVwb3NpdG9yeSBvZiBkaWZmZXJlbnQgaXRlcmFibGUgZGlmZmluZyBzdHJhdGVnaWVzIHVzZWQgYnkgTmdGb3IsIE5nQ2xhc3MsIGFuZCBvdGhlcnMuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBJdGVyYWJsZURpZmZlcnMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihmYWN0b3JpZXMpIHsKICAgICAgICB0aGlzLmZhY3RvcmllcyA9IGZhY3RvcmllczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGNyZWF0ZShmYWN0b3JpZXMsIHBhcmVudCkgewogICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTsKICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7XEBsaW5rIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGUKICAgICAqIGluaGVyaXRlZCB7XEBsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXcKICAgICAqIHtcQGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsCiAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtcQGxpbmsgSXRlcmFibGVEaWZmZXJ9IGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgdmlld1Byb3ZpZGVyczogWwogICAgICogICAgIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVMaXN0RGlmZmVyKCldKQogICAgICogICBdCiAgICAgKiB9KQogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm92aWRlOiBJdGVyYWJsZURpZmZlcnMsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYXJlbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBJdGVyYWJsZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8gdG8KICAgICAgICAgICAgICAgICAgICAvLyBib290c3RyYXAoKSwgd2hpY2ggd291bGQgb3ZlcnJpZGUgZGVmYXVsdCBwaXBlcyBpbnN0ZWFkIG9mIGV4dGVuZGluZyB0aGVtLgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4dGVuZCBJdGVyYWJsZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlRGlmZmVycy5jcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgLy8gRGVwZW5kZW5jeSB0ZWNobmljYWxseSBpc24ndCBvcHRpb25hbCwgYnV0IHdlIGNhbiBwcm92aWRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhpcyB3YXkuCiAgICAgICAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGYoKSwgbmV3IE9wdGlvbmFsKCldXQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaXRlcmFibGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmQoaXRlcmFibGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZmFjdG9yaWVzLmZpbmQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZiA9PiBmLnN1cHBvcnRzKGl0ZXJhYmxlKSkpOwogICAgICAgIGlmIChmYWN0b3J5ICE9IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICcke2l0ZXJhYmxlfScgb2YgdHlwZSAnJHtnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhpdGVyYWJsZSl9J2ApOwogICAgICAgIH0KICAgIH0KfQovKiogQG5vY29sbGFwc2UgKi8KSXRlcmFibGVEaWZmZXJzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBJdGVyYWJsZURpZmZlcnMsCiAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICBmYWN0b3J5OiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBuZXcgSXRlcmFibGVEaWZmZXJzKFtuZXcgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSgpXSkpCn0pOwovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyh0eXBlKSB7CiAgICByZXR1cm4gdHlwZVsnbmFtZSddIHx8IHR5cGVvZiB0eXBlOwp9Ci8qKgogKiBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IE1hcCBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0NsYXNzLCBOZ1N0eWxlLCBhbmQgb3RoZXJzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgS2V5VmFsdWVEaWZmZXJzIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAqLwogICAgY29uc3RydWN0b3IoZmFjdG9yaWVzKSB7CiAgICAgICAgdGhpcy5mYWN0b3JpZXMgPSBmYWN0b3JpZXM7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBTCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHBhcmFtIHs/PX0gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KSB7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvcGllZCA9IHBhcmVudC5mYWN0b3JpZXMuc2xpY2UoKTsKICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IEtleVZhbHVlRGlmZmVycyhmYWN0b3JpZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7XEBsaW5rIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGUKICAgICAqIGluaGVyaXRlZCB7XEBsaW5rIEtleVZhbHVlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXcKICAgICAqIHtcQGxpbmsgS2V5VmFsdWVEaWZmZXJzfSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsCiAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtcQGxpbmsgS2V5VmFsdWVEaWZmZXJ9IGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgdmlld1Byb3ZpZGVyczogWwogICAgICogICAgIEtleVZhbHVlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVNYXBEaWZmZXIoKV0pCiAgICAgKiAgIF0KICAgICAqIH0pCiAgICAgKiBgYGAKICAgICAqIEB0ZW1wbGF0ZSBTCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYXJlbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS4KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleHRlbmQgS2V5VmFsdWVEaWZmZXJzIHdpdGhvdXQgYSBwYXJlbnQgaW5qZWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBLZXlWYWx1ZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIERlcGVuZGVuY3kgdGVjaG5pY2FsbHkgaXNuJ3Qgb3B0aW9uYWwsIGJ1dCB3ZSBjYW4gcHJvdmlkZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoaXMgd2F5LgogICAgICAgICAgICBkZXBzOiBbW0tleVZhbHVlRGlmZmVycywgbmV3IFNraXBTZWxmKCksIG5ldyBPcHRpb25hbCgpXV0KICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGt2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kKGt2KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGYgPT4gZi5zdXBwb3J0cyhrdikpKTsKICAgICAgICBpZiAoZmFjdG9yeSkgewogICAgICAgICAgICByZXR1cm4gZmFjdG9yeTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHtrdn0nYCk7CiAgICB9Cn0KLyoqIEBub2NvbGxhcHNlICovCktleVZhbHVlRGlmZmVycy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICB0b2tlbjogS2V5VmFsdWVEaWZmZXJzLAogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbmV3IEtleVZhbHVlRGlmZmVycyhbbmV3IERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKV0pKQp9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgT2JqZWN0YHMgYW5kIGBNYXBgcy4KICogQHR5cGUgez99CiAqLwpjb25zdCBrZXlWYWxEaWZmID0gW25ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5KCldOwovKioKICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgSXRlcmFibGVgIHR5cGVzIHN1Y2ggYXMgYEFycmF5YHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgaXRlcmFibGVEaWZmID0gW25ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCldOwovKiogQHR5cGUgez99ICovCmNvbnN0IGRlZmF1bHRJdGVyYWJsZURpZmZlcnMgPSBuZXcgSXRlcmFibGVEaWZmZXJzKGl0ZXJhYmxlRGlmZik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgZGVmYXVsdEtleVZhbHVlRGlmZmVycyA9IG5ldyBLZXlWYWx1ZURpZmZlcnMoa2V5VmFsRGlmZik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvdGVtcGxhdGVfcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXByZXNlbnRzIGFuIGVtYmVkZGVkIHRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZW1iZWRkZWQgdmlld3MuCiAqIFRvIGluc3RhbnRpYXRlIGVtYmVkZGVkIHZpZXdzIGJhc2VkIG9uIGEgdGVtcGxhdGUsIHVzZSB0aGUgYFZpZXdDb250YWluZXJSZWZgCiAqIG1ldGhvZCBgY3JlYXRlRW1iZWRkZWRWaWV3KClgLgogKgogKiBBY2Nlc3MgYSBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGJ5IHBsYWNpbmcgYSBkaXJlY3RpdmUgb24gYW4gYDxuZy10ZW1wbGF0ZT5gCiAqIGVsZW1lbnQgKG9yIGRpcmVjdGl2ZSBwcmVmaXhlZCB3aXRoIGAqYCkuIFRoZSBgVGVtcGxhdGVSZWZgIGZvciB0aGUgZW1iZWRkZWQgdmlldwogKiBpcyBpbmplY3RlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGlyZWN0aXZlLAogKiB1c2luZyB0aGUgYFRlbXBsYXRlUmVmYCB0b2tlbi4KICoKICogWW91IGNhbiBhbHNvIHVzZSBhIGBRdWVyeWAgdG8gZmluZCBhIGBUZW1wbGF0ZVJlZmAgYXNzb2NpYXRlZCB3aXRoCiAqIGEgY29tcG9uZW50IG9yIGEgZGlyZWN0aXZlLgogKgogKiBAc2VlIGBWaWV3Q29udGFpbmVyUmVmYAogKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgQ29tcG9uZW50IFRyZWUgd2l0aCBESV0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24tbmF2dHJlZSkKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqIEB0ZW1wbGF0ZSBDCiAqLwpjbGFzcyBUZW1wbGF0ZVJlZiB7Cn0KLyoqCiAqIFxAaW50ZXJuYWwKICogQG5vY29sbGFwc2UKICovClRlbXBsYXRlUmVmLl9fTkdfRUxFTUVOVF9JRF9fID0gKC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gU1dJVENIX1RFTVBMQVRFX1JFRl9GQUNUT1JZKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX1RFTVBMQVRFX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RUZW1wbGF0ZVJlZjsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJlcHJlc2VudHMgYSBjb250YWluZXIgd2hlcmUgb25lIG9yIG1vcmUgdmlld3MgY2FuIGJlIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LgogKgogKiBDYW4gY29udGFpbiAqaG9zdCB2aWV3cyogKGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyBhCiAqIGNvbXBvbmVudCB3aXRoIHRoZSBgY3JlYXRlQ29tcG9uZW50KClgIG1ldGhvZCksIGFuZCAqZW1iZWRkZWQgdmlld3MqCiAqIChjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgYSBgVGVtcGxhdGVSZWZgIHdpdGggdGhlIGBjcmVhdGVFbWJlZGRlZFZpZXcoKWAgbWV0aG9kKS4KICoKICogQSB2aWV3IGNvbnRhaW5lciBpbnN0YW5jZSBjYW4gY29udGFpbiBvdGhlciB2aWV3IGNvbnRhaW5lcnMsCiAqIGNyZWF0aW5nIGEgW3ZpZXcgaGllcmFyY2h5XShndWlkZS9nbG9zc2FyeSN2aWV3LXRyZWUpLgogKgogKiBAc2VlIGBDb21wb25lbnRSZWZgCiAqIEBzZWUgYEVtYmVkZGVkVmlld1JlZmAKICoKICogXEBwdWJsaWNBcGkKICogQGFic3RyYWN0CiAqLwpjbGFzcyBWaWV3Q29udGFpbmVyUmVmIHsKfQovKioKICogXEBpbnRlcm5hbAogKiBAbm9jb2xsYXBzZQogKi8KVmlld0NvbnRhaW5lclJlZi5fX05HX0VMRU1FTlRfSURfXyA9ICgvKioKICogQHJldHVybiB7P30KICovCigpID0+IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWShWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmKSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX1ZJRVdfQ09OVEFJTkVSX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RWaWV3Q29udGFpbmVyUmVmOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWSA9IFNXSVRDSF9WSUVXX0NPTlRBSU5FUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fOwovKiogQHR5cGUgez99ICovCmNvbnN0IF90b2tlbktleUNhY2hlID0gbmV3IE1hcCgpOwovKioKICogQHBhcmFtIHs/fSB0b2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9rZW5LZXkodG9rZW4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBrZXkgPSBfdG9rZW5LZXlDYWNoZS5nZXQodG9rZW4pOwogICAgaWYgKCFrZXkpIHsKICAgICAgICBrZXkgPSBzdHJpbmdpZnkodG9rZW4pICsgJ18nICsgX3Rva2VuS2V5Q2FjaGUuc2l6ZTsKICAgICAgICBfdG9rZW5LZXlDYWNoZS5zZXQodG9rZW4sIGtleSk7CiAgICB9CiAgICByZXR1cm4ga2V5Owp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSW5qZWN0b3JSZWZUb2tlbktleSA9IHRva2VuS2V5KEluamVjdG9yKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTkpFQ1RPUlJlZlRva2VuS2V5ID0gdG9rZW5LZXkoSU5KRUNUT1IpOwovKiogQHR5cGUgez99ICovCmNvbnN0IE5nTW9kdWxlUmVmVG9rZW5LZXkgPSB0b2tlbktleShOZ01vZHVsZVJlZik7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L3Byb3ZpZGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUmVuZGVyZXIyVG9rZW5LZXkgPSB0b2tlbktleShSZW5kZXJlcjIpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEVsZW1lbnRSZWZUb2tlbktleSA9IHRva2VuS2V5KEVsZW1lbnRSZWYpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFZpZXdDb250YWluZXJSZWZUb2tlbktleSA9IHRva2VuS2V5KFZpZXdDb250YWluZXJSZWYpOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRlbXBsYXRlUmVmVG9rZW5LZXkgPSB0b2tlbktleShUZW1wbGF0ZVJlZik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ2hhbmdlRGV0ZWN0b3JSZWZUb2tlbktleSA9IHRva2VuS2V5KENoYW5nZURldGVjdG9yUmVmKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJbmplY3RvclJlZlRva2VuS2V5JDEgPSB0b2tlbktleShJbmplY3Rvcik7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5KRUNUT1JSZWZUb2tlbktleSQxID0gdG9rZW5LZXkoSU5KRUNUT1IpOwovLyBUaGlzIGRlZmF1bHQgdmFsdWUgaXMgd2hlbiBjaGVja2luZyB0aGUgaGllcmFyY2h5IGZvciBhIHRva2VuLgovLwovLyBJdCBtZWFucyBib3RoOgovLyAtIHRoZSB0b2tlbiBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGN1cnJlbnQgaW5qZWN0b3IsCi8vIC0gb25seSB0aGUgZWxlbWVudCBpbmplY3RvcnMgc2hvdWxkIGJlIGNoZWNrZWQgKGllIGRvIG5vdCBjaGVjayBtb2R1bGUgaW5qZWN0b3JzCi8vCi8vICAgICAgICAgIG1vZDEKLy8gICAgICAgICAvCi8vICAgICAgIGVsMSAgIG1vZDIKLy8gICAgICAgICBcICAvCi8vICAgICAgICAgZWwyCi8vCi8vIFdoZW4gcmVxdWVzdGluZyBlbDIuaW5qZWN0b3IuZ2V0KHRva2VuKSwgd2Ugc2hvdWxkIGNoZWNrIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgYW5kIHJldHVybiB0aGUKLy8gZmlyc3QgZm91bmQgdmFsdWU6Ci8vIC0gZWwyLmluamVjdG9yLmdldCh0b2tlbiwgZGVmYXVsdCkKLy8gLSBlbDEuaW5qZWN0b3IuZ2V0KHRva2VuLCBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKSAtPiBkbyBub3QgY2hlY2sgdGhlIG1vZHVsZQovLyAtIG1vZDIuaW5qZWN0b3IuZ2V0KHRva2VuLCBkZWZhdWx0KQovKiogQHR5cGUgez99ICovCmNvbnN0IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IgPSB7fTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvY29tcG9uZW50X3JlZi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIkMSBleHRlbmRzIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlIFRoZSBOZ01vZHVsZVJlZiB0byB3aGljaCBhbGwgcmVzb2x2ZWQgZmFjdG9yaWVzIGFyZSBib3VuZC4KICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubmdNb2R1bGUgPSBuZ01vZHVsZTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Q29tcG9uZW50VHlwZShjb21wb25lbnQpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnREZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0Q29tcG9uZW50RGVmKGNvbXBvbmVudCkpKTsKICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEZhY3RvcnkkMShjb21wb25lbnREZWYsIHRoaXMubmdNb2R1bGUpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IG1hcAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9SZWZBcnJheShtYXApIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFycmF5ID0gW107CiAgICBmb3IgKGxldCBub25NaW5pZmllZCBpbiBtYXApIHsKICAgICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KG5vbk1pbmlmaWVkKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1pbmlmaWVkID0gbWFwW25vbk1pbmlmaWVkXTsKICAgICAgICAgICAgYXJyYXkucHVzaCh7IHByb3BOYW1lOiBtaW5pZmllZCwgdGVtcGxhdGVOYW1lOiBub25NaW5pZmllZCB9KTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYXJyYXk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZWxlbWVudE5hbWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldE5hbWVzcGFjZSQxKGVsZW1lbnROYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYW1lID0gZWxlbWVudE5hbWUudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiBuYW1lID09PSAnc3ZnJyA/IFNWR19OQU1FU1BBQ0UgOiAobmFtZSA9PT0gJ21hdGgnID8gTUFUSF9NTF9OQU1FU1BBQ0UgOiBudWxsKTsKfQovKioKICogQSBjaGFuZ2UgZGV0ZWN0aW9uIHNjaGVkdWxlciB0b2tlbiBmb3Ige1xAbGluayBSb290Q29udGV4dH0uIFRoaXMgdG9rZW4gaXMgdGhlIGRlZmF1bHQgdmFsdWUgdXNlZAogKiBmb3IgdGhlIGRlZmF1bHQgYFJvb3RDb250ZXh0YCBmb3VuZCBpbiB0aGUge1xAbGluayBST09UX0NPTlRFWFR9IHRva2VuLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFNDSEVEVUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignU0NIRURVTEVSX1RPS0VOJywgewogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gZGVmYXVsdFNjaGVkdWxlciksCn0pOwovKioKICogQHBhcmFtIHs/fSByb290Vmlld0luamVjdG9yCiAqIEBwYXJhbSB7P30gbW9kdWxlSW5qZWN0b3IKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRJbmplY3Rvcihyb290Vmlld0luamVjdG9yLCBtb2R1bGVJbmplY3RvcikgewogICAgcmV0dXJuIHsKICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJvb3RWaWV3SW5qZWN0b3IuZ2V0KHRva2VuLCAoLyoqIEB0eXBlIHs/fSAqLyAoTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikpLCBmbGFncyk7CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiB8fAogICAgICAgICAgICAgICAgbm90Rm91bmRWYWx1ZSA9PT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSByb290IGVsZW1lbnQgaW5qZWN0b3Igd2hlbgogICAgICAgICAgICAgICAgLy8gLSBpdCBwcm92aWRlcyBpdAogICAgICAgICAgICAgICAgLy8gICAodmFsdWUgIT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpCiAgICAgICAgICAgICAgICAvLyAtIHRoZSBtb2R1bGUgaW5qZWN0b3Igc2hvdWxkIG5vdCBiZSBjaGVja2VkCiAgICAgICAgICAgICAgICAvLyAgIChub3RGb3VuZFZhbHVlID09PSBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbmplY3Rvci5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKTsKICAgICAgICB9KQogICAgfTsKfQovKioKICogUmVuZGVyMyBpbXBsZW1lbnRhdGlvbiBvZiB7XEBsaW5rIHZpZXdFbmdpbmVfQ29tcG9uZW50RmFjdG9yeX0uCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBDb21wb25lbnRGYWN0b3J5JDEgZXh0ZW5kcyBDb21wb25lbnRGYWN0b3J5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnREZWYgVGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLgogICAgICogQHBhcmFtIHs/PX0gbmdNb2R1bGUgVGhlIE5nTW9kdWxlUmVmIHRvIHdoaWNoIHRoZSBmYWN0b3J5IGlzIGJvdW5kLgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWYsIG5nTW9kdWxlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmNvbXBvbmVudERlZiA9IGNvbXBvbmVudERlZjsKICAgICAgICB0aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7CiAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50RGVmLnR5cGU7CiAgICAgICAgdGhpcy5zZWxlY3RvciA9IHN0cmluZ2lmeUNTU1NlbGVjdG9yTGlzdChjb21wb25lbnREZWYuc2VsZWN0b3JzKTsKICAgICAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9CiAgICAgICAgICAgIGNvbXBvbmVudERlZi5uZ0NvbnRlbnRTZWxlY3RvcnMgPyBjb21wb25lbnREZWYubmdDb250ZW50U2VsZWN0b3JzIDogW107CiAgICAgICAgdGhpcy5pc0JvdW5kVG9Nb2R1bGUgPSAhIW5nTW9kdWxlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaW5wdXRzKCkgewogICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLmlucHV0cyk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBvdXRwdXRzKCkgewogICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLm91dHB1dHMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgKiBAcGFyYW0gez89fSBwcm9qZWN0YWJsZU5vZGVzCiAgICAgKiBAcGFyYW0gez89fSByb290U2VsZWN0b3JPck5vZGUKICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGUoaW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHJvb3RTZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpIHsKICAgICAgICBuZ01vZHVsZSA9IG5nTW9kdWxlIHx8IHRoaXMubmdNb2R1bGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RWaWV3SW5qZWN0b3IgPSBuZ01vZHVsZSA/IGNyZWF0ZUNoYWluZWRJbmplY3RvcihpbmplY3RvciwgbmdNb2R1bGUuaW5qZWN0b3IpIDogaW5qZWN0b3I7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyRmFjdG9yeSA9ICgvKiogQHR5cGUgez99ICovIChyb290Vmlld0luamVjdG9yLmdldChSZW5kZXJlckZhY3RvcnkyLCBkb21SZW5kZXJlckZhY3RvcnkzKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzYW5pdGl6ZXIgPSByb290Vmlld0luamVjdG9yLmdldChTYW5pdGl6ZXIsIG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0UmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpOwogICAgICAgIC8vIERldGVybWluZSBhIHRhZyBuYW1lIHVzZWQgZm9yIGNyZWF0aW5nIGhvc3QgZWxlbWVudHMgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkCiAgICAgICAgLy8gZHluYW1pY2FsbHkuIERlZmF1bHQgdG8gJ2RpdicgaWYgdGhpcyBjb21wb25lbnQgZGlkIG5vdCBzcGVjaWZ5IGFueSB0YWcgbmFtZSBpbiBpdHMgc2VsZWN0b3IuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY29tcG9uZW50RGVmLnNlbGVjdG9yc1swXVswXSkpIHx8ICdkaXYnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBob3N0Uk5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgPwogICAgICAgICAgICBsb2NhdGVIb3N0RWxlbWVudChob3N0UmVuZGVyZXIsIHJvb3RTZWxlY3Rvck9yTm9kZSwgdGhpcy5jb21wb25lbnREZWYuZW5jYXBzdWxhdGlvbikgOgogICAgICAgICAgICBlbGVtZW50Q3JlYXRlKGVsZW1lbnROYW1lLCByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpLCBnZXROYW1lc3BhY2UkMShlbGVtZW50TmFtZSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290RmxhZ3MgPSB0aGlzLmNvbXBvbmVudERlZi5vblB1c2ggPyA2NCAvKiBEaXJ0eSAqLyB8IDUxMiAvKiBJc1Jvb3QgKi8gOgogICAgICAgICAgICAxNiAvKiBDaGVja0Fsd2F5cyAqLyB8IDUxMiAvKiBJc1Jvb3QgKi87CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIENvbXBvbmVudCBuZWVkcyB0byBiZSBpc29sYXRlZCBmcm9tIG90aGVyIGNvbXBvbmVudHMsIGkuZS4gd2hldGhlciBpdAogICAgICAgIC8vIHNob3VsZCBiZSBwbGFjZWQgaW50byBpdHMgb3duIChlbXB0eSkgcm9vdCBjb250ZXh0IG9yIGV4aXN0aW5nIHJvb3QgY29udGV4dCBzaG91bGQgYmUgdXNlZC4KICAgICAgICAvLyBOb3RlOiB0aGlzIGlzIGludGVybmFsLW9ubHkgY29udmVudGlvbiBhbmQgbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUsIHNvIGl0IHNob3VsZCBub3QgYmUKICAgICAgICAvLyByZWxpZWQgdXBvbiBleHRlcm5hbGx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0lzb2xhdGVkID0gdHlwZW9mIHJvb3RTZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgL14jcm9vdC1uZy1pbnRlcm5hbC1pc29sYXRlZC1cZCsvLnRlc3Qocm9vdFNlbGVjdG9yT3JOb2RlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdENvbnRleHQgPSBjcmVhdGVSb290Q29udGV4dCgpOwogICAgICAgIC8vIENyZWF0ZSB0aGUgcm9vdCB2aWV3LiBVc2VzIGVtcHR5IFRWaWV3IGFuZCBDb250ZW50VGVtcGxhdGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RUVmlldyA9IGNyZWF0ZVRWaWV3KDAgLyogUm9vdCAqLywgLTEsIG51bGwsIDEsIDAsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290TFZpZXcgPSBjcmVhdGVMVmlldyhudWxsLCByb290VFZpZXcsIHJvb3RDb250ZXh0LCByb290RmxhZ3MsIG51bGwsIG51bGwsIHJlbmRlcmVyRmFjdG9yeSwgaG9zdFJlbmRlcmVyLCBzYW5pdGl6ZXIsIHJvb3RWaWV3SW5qZWN0b3IpOwogICAgICAgIC8vIHJvb3RWaWV3IGlzIHRoZSBwYXJlbnQgd2hlbiBib290c3RyYXBwaW5nCiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGVudGVyaW5nIHZpZXcgaGVyZSBidXQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gYXMKICAgICAgICAvLyBgcmVuZGVyVmlld2AgZG9lcyB0aGF0LiBIb3dldmVyIGFzIHRoZSBjb2RlIGlzIHdyaXR0ZW4gaXQgaXMgbmVlZGVkIGJlY2F1c2UKICAgICAgICAvLyBgY3JlYXRlUm9vdENvbXBvbmVudFZpZXdgIGFuZCBgY3JlYXRlUm9vdENvbXBvbmVudGAgYm90aCByZWFkIGdsb2JhbCBzdGF0ZS4gRml4aW5nIHRob3NlCiAgICAgICAgLy8gaXNzdWVzIHdvdWxkIGFsbG93IHVzIHRvIGRyb3AgdGhpcy4KICAgICAgICBlbnRlclZpZXcocm9vdExWaWV3LCBudWxsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbXBvbmVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRFbGVtZW50Tm9kZTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBjcmVhdGVSb290Q29tcG9uZW50Vmlldyhob3N0Uk5vZGUsIHRoaXMuY29tcG9uZW50RGVmLCByb290TFZpZXcsIHJlbmRlcmVyRmFjdG9yeSwgaG9zdFJlbmRlcmVyKTsKICAgICAgICAgICAgaWYgKGhvc3RSTm9kZSkgewogICAgICAgICAgICAgICAgaWYgKHJvb3RTZWxlY3Rvck9yTm9kZSkgewogICAgICAgICAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIGhvc3RSTm9kZSwgWyduZy12ZXJzaW9uJywgVkVSU0lPTi5mdWxsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBob3N0IGVsZW1lbnQgaXMgY3JlYXRlZCBhcyBhIHBhcnQgb2YgdGhpcyBmdW5jdGlvbiBjYWxsIChpLmUuIGByb290U2VsZWN0b3JPck5vZGVgCiAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGRlZmluZWQpLCBhbHNvIGFwcGx5IGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgZXh0cmFjdGVkIGZyb20gY29tcG9uZW50IHNlbGVjdG9yLgogICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBmcm9tIHRoZSBmaXJzdCBzZWxlY3RvciBvbmx5IHRvIG1hdGNoIFZFIGJlaGF2aW9yLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgYXR0cnMsIGNsYXNzZXMgfSA9IGV4dHJhY3RBdHRyc0FuZENsYXNzZXNGcm9tU2VsZWN0b3IodGhpcy5jb21wb25lbnREZWYuc2VsZWN0b3JzWzBdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBBdHRyaWJ1dGVzKGhvc3RSZW5kZXJlciwgaG9zdFJOb2RlLCBhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzICYmIGNsYXNzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZURpcmVjdENsYXNzKGhvc3RSZW5kZXJlciwgaG9zdFJOb2RlLCBjbGFzc2VzLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRFbGVtZW50Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChnZXRUTm9kZShyb290TFZpZXdbVFZJRVddLCAwKSkpOwogICAgICAgICAgICBpZiAocHJvamVjdGFibGVOb2RlcykgewogICAgICAgICAgICAgICAgLy8gcHJvamVjdGFibGUgbm9kZXMgY2FuIGJlIHBhc3NlZCBhcyBhcnJheSBvZiBhcnJheXMgb3IgYW4gYXJyYXkgb2YgaXRlcmFibGVzIChuZ1VwZ3JhZGUKICAgICAgICAgICAgICAgIC8vIGNhc2UpLiBIZXJlIHdlIGRvIG5vcm1hbGl6ZSBwYXNzZWQgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAvLyBjb21wbGV4IGNoZWNrcyBkb3duIHRoZSBsaW5lLgogICAgICAgICAgICAgICAgdEVsZW1lbnROb2RlLnByb2plY3Rpb24gPSBwcm9qZWN0YWJsZU5vZGVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzZm9yU2xvdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKG5vZGVzZm9yU2xvdCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5vZGVzZm9yU2xvdCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIExpZmVjeWNsZUhvb2tzRmVhdHVyZSBhbmQgb3RoZXIgaG9zdCBmZWF0dXJlcyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZAogICAgICAgICAgICAvLyBleGVjdXRlZCBoZXJlPwogICAgICAgICAgICAvLyBBbmd1bGFyIDUgcmVmZXJlbmNlOiBodHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbGlmZWN5Y2xlLWhvb2tzLXZjcmVmCiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVJvb3RDb21wb25lbnQoY29tcG9uZW50VmlldywgdGhpcy5jb21wb25lbnREZWYsIHJvb3RMVmlldywgcm9vdENvbnRleHQsIFtMaWZlY3ljbGVIb29rc0ZlYXR1cmVdKTsKICAgICAgICAgICAgcmVuZGVyVmlldyhyb290VFZpZXcsIHJvb3RMVmlldywgbnVsbCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBsZWF2ZVZpZXcoKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IG5ldyBDb21wb25lbnRSZWYkMSh0aGlzLmNvbXBvbmVudFR5cGUsIGNvbXBvbmVudCwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0RWxlbWVudE5vZGUsIHJvb3RMVmlldyksIHJvb3RMVmlldywgdEVsZW1lbnROb2RlKTsKICAgICAgICBpZiAoIXJvb3RTZWxlY3Rvck9yTm9kZSB8fCBpc0lzb2xhdGVkKSB7CiAgICAgICAgICAgIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGludGVybmFsIG9yIGlzb2xhdGVkIHJvb3QgdmlldyBpcyBhdHRhY2hlZCB0byB0aGUgY29tcG9uZW50J3MgaG9zdAogICAgICAgICAgICAvLyB2aWV3IG5vZGUuCiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRSZWYuaG9zdFZpZXcuX3RWaWV3Tm9kZSkpLmNoaWxkID0gdEVsZW1lbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgfQp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gbmV3IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciQxKCk7Ci8qKgogKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIGEge1xAbGluayBDb21wb25lbnRGYWN0b3J5fS4KICoKICogYENvbXBvbmVudFJlZmAgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBDb21wb25lbnQgSW5zdGFuY2UgYXMgd2VsbCBvdGhlciBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpcwogKiBDb21wb25lbnQgSW5zdGFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVzdHJveSB0aGUgQ29tcG9uZW50IEluc3RhbmNlIHZpYSB0aGUge1xAbGluayAjZGVzdHJveX0KICogbWV0aG9kLgogKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgQ29tcG9uZW50UmVmJDEgZXh0ZW5kcyBDb21wb25lbnRSZWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFR5cGUKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb24KICAgICAqIEBwYXJhbSB7P30gX3Jvb3RMVmlldwogICAgICogQHBhcmFtIHs/fSBfdE5vZGUKICAgICAqLwogICAgY29uc3RydWN0b3IoY29tcG9uZW50VHlwZSwgaW5zdGFuY2UsIGxvY2F0aW9uLCBfcm9vdExWaWV3LCBfdE5vZGUpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICB0aGlzLl9yb290TFZpZXcgPSBfcm9vdExWaWV3OwogICAgICAgIHRoaXMuX3ROb2RlID0gX3ROb2RlOwogICAgICAgIHRoaXMuZGVzdHJveUNicyA9IFtdOwogICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKICAgICAgICB0aGlzLmhvc3RWaWV3ID0gdGhpcy5jaGFuZ2VEZXRlY3RvclJlZiA9IG5ldyBSb290Vmlld1JlZihfcm9vdExWaWV3KTsKICAgICAgICB0aGlzLmhvc3RWaWV3Ll90Vmlld05vZGUgPSBhc3NpZ25UVmlld05vZGVUb0xWaWV3KF9yb290TFZpZXdbVFZJRVddLCBudWxsLCAtMSwgX3Jvb3RMVmlldyk7CiAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiBuZXcgTm9kZUluamVjdG9yKHRoaXMuX3ROb2RlLCB0aGlzLl9yb290TFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYnMpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2JzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7CiAgICAgICAgICAgICF0aGlzLmhvc3RWaWV3LmRlc3Ryb3llZCAmJiB0aGlzLmhvc3RWaWV3LmRlc3Ryb3koKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIGlmICh0aGlzLmRlc3Ryb3lDYnMpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2JzLnB1c2goY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwovKioKICogTk9URTogY2hhbmdlcyB0byB0aGUgYG5nSTE4bkNsb3N1cmVNb2RlYCBuYW1lIG11c3QgYmUgc3luY2VkIHdpdGggYGNvbXBpbGVyLWNsaS9zcmMvdG9vbGluZy50c2AuCiAqLwppZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlID09PSAndW5kZWZpbmVkJykgewogICAgLy8gVGhlc2UgcHJvcGVydHkgYWNjZXNzZXMgY2FuIGJlIGlnbm9yZWQgYmVjYXVzZSBuZ0kxOG5DbG9zdXJlTW9kZSB3aWxsIGJlIHNldCB0byBmYWxzZQogICAgLy8gd2hlbiBvcHRpbWl6aW5nIGNvZGUgYW5kIHRoZSB3aG9sZSBpZiBzdGF0ZW1lbnQgd2lsbCBiZSBkcm9wcGVkLgogICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nSTE4bkNsb3N1cmVNb2RlIGFzIFsnbmdJMThuQ2xvc3VyZU1vZGUnXSBmb3IgY2xvc3VyZS4KICAgIC8vIE5PVEU6IHdlIG5lZWQgdG8gaGF2ZSBpdCBpbiBJSUZFIHNvIHRoYXQgdGhlIHRyZWUtc2hha2VyIGlzIGhhcHB5LgogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgX2dsb2JhbFsnbmdJMThuQ2xvc3VyZU1vZGUnXSA9CiAgICAgICAgICAgIC8vIFRPRE8oRlctMTI1MCk6IHZhbGlkYXRlIHRoYXQgdGhpcyBhY3R1YWxseSwgeW91IGtub3csIHdvcmtzLgogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgICAgIHR5cGVvZiBnb29nICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZ29vZy5nZXRNc2cgPT09ICdmdW5jdGlvbic7CiAgICB9KSgpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9pMThuL2xvY2FsZV9lbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZCi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgdSA9IHVuZGVmaW5lZDsKLyoqCiAqIEBwYXJhbSB7P30gbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGx1cmFsKG4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdiA9IG4udG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcLj8vLCAnJykubGVuZ3RoOwogICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMCkKICAgICAgICByZXR1cm4gMTsKICAgIHJldHVybiA1Owp9CnZhciBsb2NhbGVFbiA9IFsKICAgICdlbicsCiAgICBbWydhJywgJ3AnXSwgWydBTScsICdQTSddLCB1XSwKICAgIFtbJ0FNJywgJ1BNJ10sIHUsIHVdLAogICAgWwogICAgICAgIFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLCBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLAogICAgICAgIFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwKICAgICAgICBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10KICAgIF0sCiAgICB1LAogICAgWwogICAgICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSwKICAgICAgICBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10sCiAgICAgICAgWwogICAgICAgICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLAogICAgICAgICAgICAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcicKICAgICAgICBdCiAgICBdLAogICAgdSwKICAgIFtbJ0InLCAnQSddLCBbJ0JDJywgJ0FEJ10sIFsnQmVmb3JlIENocmlzdCcsICdBbm5vIERvbWluaSddXSwKICAgIDAsCiAgICBbNiwgMF0sCiAgICBbJ00vZC95eScsICdNTU0gZCwgeScsICdNTU1NIGQsIHknLCAnRUVFRSwgTU1NTSBkLCB5J10sCiAgICBbJ2g6bW0gYScsICdoOm1tOnNzIGEnLCAnaDptbTpzcyBhIHonLCAnaDptbTpzcyBhIHp6enonXSwKICAgIFsnezF9LCB7MH0nLCB1LCAnezF9IFwnYXRcJyB7MH0nLCB1XSwKICAgIFsnLicsICcsJywgJzsnLCAnJScsICcrJywgJy0nLCAnRScsICfDlycsICfigLAnLCAn4oieJywgJ05hTicsICc6J10sCiAgICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSwKICAgICdVU0QnLAogICAgJyQnLAogICAgJ1VTIERvbGxhcicsCiAgICB7fSwKICAgICdsdHInLAogICAgcGx1cmFsCl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9pMThuL2xvY2FsZV9kYXRhX2FwaS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhpcyBjb25zdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBsb2NhbGUgZGF0YSByZWdpc3RlcmVkIHdpdGggYHJlZ2lzdGVyTG9jYWxlRGF0YWAKICogQHR5cGUgez99CiAqLwpsZXQgTE9DQUxFX0RBVEEgPSB7fTsKLyoqCiAqIEZpbmRzIHRoZSBsb2NhbGUgZGF0YSBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIEBwYXJhbSB7P30gbG9jYWxlIFRoZSBsb2NhbGUgY29kZS4KICogQHJldHVybiB7P30gVGhlIGxvY2FsZSBkYXRhLgogKi8KZnVuY3Rpb24gZmluZExvY2FsZURhdGEobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBub3JtYWxpemVkTG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2ggPSBnZXRMb2NhbGVEYXRhKG5vcm1hbGl6ZWRMb2NhbGUpOwogICAgaWYgKG1hdGNoKSB7CiAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQogICAgLy8gbGV0J3MgdHJ5IHRvIGZpbmQgYSBwYXJlbnQgbG9jYWxlCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRMb2NhbGUgPSBub3JtYWxpemVkTG9jYWxlLnNwbGl0KCctJylbMF07CiAgICBtYXRjaCA9IGdldExvY2FsZURhdGEocGFyZW50TG9jYWxlKTsKICAgIGlmIChtYXRjaCkgewogICAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICAgIGlmIChwYXJlbnRMb2NhbGUgPT09ICdlbicpIHsKICAgICAgICByZXR1cm4gbG9jYWxlRW47CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgIiR7bG9jYWxlfSIuYCk7Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgcGx1cmFsIGZ1bmN0aW9uIHVzZWQgYnkgSUNVIGV4cHJlc3Npb25zIHRvIGRldGVybWluZSB0aGUgcGx1cmFsIGNhc2UgdG8gdXNlCiAqIGZvciBhIGdpdmVuIGxvY2FsZS4KICogQHNlZSBgTmdQbHVyYWxgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHJldHVybiB7P30gVGhlIHBsdXJhbCBmdW5jdGlvbiBmb3IgdGhlIGxvY2FsZS4KICovCmZ1bmN0aW9uIGdldExvY2FsZVBsdXJhbENhc2UobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIHJldHVybiBkYXRhW0xvY2FsZURhdGFJbmRleC5QbHVyYWxDYXNlXTsKfQovKioKICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgZ2l2ZW4gYG5vcm1hbGl6ZWRMb2NhbGVgIGZyb20gYExPQ0FMRV9EQVRBYAogKiBvciBmcm9tIHRoZSBnbG9iYWwgYG5nLmNvbW1vbi5sb2NhbGVgLgogKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRMb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldExvY2FsZURhdGEobm9ybWFsaXplZExvY2FsZSkgewogICAgaWYgKCEobm9ybWFsaXplZExvY2FsZSBpbiBMT0NBTEVfREFUQSkpIHsKICAgICAgICBMT0NBTEVfREFUQVtub3JtYWxpemVkTG9jYWxlXSA9IF9nbG9iYWwubmcgJiYgX2dsb2JhbC5uZy5jb21tb24gJiYgX2dsb2JhbC5uZy5jb21tb24ubG9jYWxlcyAmJgogICAgICAgICAgICBfZ2xvYmFsLm5nLmNvbW1vbi5sb2NhbGVzW25vcm1hbGl6ZWRMb2NhbGVdOwogICAgfQogICAgcmV0dXJuIExPQ0FMRV9EQVRBW25vcm1hbGl6ZWRMb2NhbGVdOwp9Ci8qKiBAZW51bSB7bnVtYmVyfSAqLwpjb25zdCBMb2NhbGVEYXRhSW5kZXggPSB7CiAgICBMb2NhbGVJZDogMCwKICAgIERheVBlcmlvZHNGb3JtYXQ6IDEsCiAgICBEYXlQZXJpb2RzU3RhbmRhbG9uZTogMiwKICAgIERheXNGb3JtYXQ6IDMsCiAgICBEYXlzU3RhbmRhbG9uZTogNCwKICAgIE1vbnRoc0Zvcm1hdDogNSwKICAgIE1vbnRoc1N0YW5kYWxvbmU6IDYsCiAgICBFcmFzOiA3LAogICAgRmlyc3REYXlPZldlZWs6IDgsCiAgICBXZWVrZW5kUmFuZ2U6IDksCiAgICBEYXRlRm9ybWF0OiAxMCwKICAgIFRpbWVGb3JtYXQ6IDExLAogICAgRGF0ZVRpbWVGb3JtYXQ6IDEyLAogICAgTnVtYmVyU3ltYm9sczogMTMsCiAgICBOdW1iZXJGb3JtYXRzOiAxNCwKICAgIEN1cnJlbmN5Q29kZTogMTUsCiAgICBDdXJyZW5jeVN5bWJvbDogMTYsCiAgICBDdXJyZW5jeU5hbWU6IDE3LAogICAgQ3VycmVuY2llczogMTgsCiAgICBEaXJlY3Rpb25hbGl0eTogMTksCiAgICBQbHVyYWxDYXNlOiAyMCwKICAgIEV4dHJhRGF0YTogMjEsCn07CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTG9jYWxlSWRdID0gJ0xvY2FsZUlkJzsKTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSA9ICdEYXlQZXJpb2RzRm9ybWF0JzsKTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzU3RhbmRhbG9uZV0gPSAnRGF5UGVyaW9kc1N0YW5kYWxvbmUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRheXNGb3JtYXRdID0gJ0RheXNGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRheXNTdGFuZGFsb25lXSA9ICdEYXlzU3RhbmRhbG9uZSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTW9udGhzRm9ybWF0XSA9ICdNb250aHNGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4Lk1vbnRoc1N0YW5kYWxvbmVdID0gJ01vbnRoc1N0YW5kYWxvbmUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkVyYXNdID0gJ0VyYXMnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkZpcnN0RGF5T2ZXZWVrXSA9ICdGaXJzdERheU9mV2Vlayc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguV2Vla2VuZFJhbmdlXSA9ICdXZWVrZW5kUmFuZ2UnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRhdGVGb3JtYXRdID0gJ0RhdGVGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LlRpbWVGb3JtYXRdID0gJ1RpbWVGb3JtYXQnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRhdGVUaW1lRm9ybWF0XSA9ICdEYXRlVGltZUZvcm1hdCc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTnVtYmVyU3ltYm9sc10gPSAnTnVtYmVyU3ltYm9scyc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTnVtYmVyRm9ybWF0c10gPSAnTnVtYmVyRm9ybWF0cyc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY3lDb2RlXSA9ICdDdXJyZW5jeUNvZGUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmN5U3ltYm9sXSA9ICdDdXJyZW5jeVN5bWJvbCc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY3lOYW1lXSA9ICdDdXJyZW5jeU5hbWUnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmNpZXNdID0gJ0N1cnJlbmNpZXMnOwpMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRpcmVjdGlvbmFsaXR5XSA9ICdEaXJlY3Rpb25hbGl0eSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguUGx1cmFsQ2FzZV0gPSAnUGx1cmFsQ2FzZSc7CkxvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXSA9ICdFeHRyYURhdGEnOwovKioKICogUmV0dXJucyB0aGUgY2Fub25pY2FsIGZvcm0gb2YgYSBsb2NhbGUgbmFtZSAtIGxvd2VyY2FzZSB3aXRoIGBfYCByZXBsYWNlZCB3aXRoIGAtYC4KICogQHBhcmFtIHs/fSBsb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpIHsKICAgIHJldHVybiBsb2NhbGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2kxOG4vbG9jYWxpemF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBsb2NhbGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBsdXJhbENhc2UodmFsdWUsIGxvY2FsZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGx1cmFsID0gZ2V0TG9jYWxlUGx1cmFsQ2FzZShsb2NhbGUpKHZhbHVlKTsKICAgIHN3aXRjaCAocGx1cmFsKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICByZXR1cm4gJ3plcm8nOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuICd0d28nOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuICdmZXcnOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuICdtYW55JzsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgIH0KfQovKioKICogVGhlIGxvY2FsZSBpZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBieSBkZWZhdWx0IChmb3IgdHJhbnNsYXRpb25zIGFuZCBJQ1UgZXhwcmVzc2lvbnMpLgogKiBAdHlwZSB7P30KICovCmNvbnN0IERFRkFVTFRfTE9DQUxFX0lEID0gJ2VuLVVTJzsKLyoqCiAqIFVTRCBjdXJyZW5jeSBjb2RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdCBmb3IgQ3VycmVuY3lQaXBlIHdoZW4gbm8KICogREVGQVVMVF9DVVJSRU5DWV9DT0RFIGlzIHByb3ZpZGVkLgogKiBAdHlwZSB7P30KICovCmNvbnN0IFVTRF9DVVJSRU5DWV9DT0RFID0gJ1VTRCc7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2kxOG4udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVJLRVIgPSBg77+9YDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJQ1VfQkxPQ0tfUkVHRVhQID0gL15ccyoo77+9XGQrOj9cZCrvv70pXHMqLFxzKihzZWxlY3R8cGx1cmFsKVxzKiwvOwovKiogQHR5cGUgez99ICovCmNvbnN0IFNVQlRFTVBMQVRFX1JFR0VYUCA9IC/vv71cLz9cKihcZCs6XGQrKe+/vS9naTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQSF9SRUdFWFAgPSAv77+9KFwvP1sjKiFdXGQrKTo/XGQq77+9L2dpOwovKiogQHR5cGUgez99ICovCmNvbnN0IEJJTkRJTkdfUkVHRVhQID0gL++/vShcZCspOj9cZCrvv70vZ2k7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSUNVX1JFR0VYUCA9IC8oe1xzKu+/vVxkKzo/XGQq77+9XHMqLFxzKlxTezZ9XHMqLFtcc1xTXSp9KS9naTsKLy8gaTE4blBvc3Rwcm9jZXNzIGNvbnN0cwovKiogQHR5cGUgez99ICovCmNvbnN0IFJPT1RfVEVNUExBVEVfSUQgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX01VTFRJX1ZBTFVFX1BMQUNFSE9MREVSU19SRUdFWFAgPSAvXFso77+9Lis/77+9PylcXS87Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUFBfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC9cWyjvv70uKz/vv70/KVxdfCjvv71cLz9cKlxkKzpcZCvvv70pL2c7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgUFBfSUNVX1ZBUlNfUkVHRVhQID0gLyh7XHMqKShWQVJfKFBMVVJBTHxTRUxFQ1QpKF9cZCspPykoXHMqLCkvZzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQUF9JQ1VfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC97KFtBLVowLTlfXSspfS9nOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX0lDVVNfUkVHRVhQID0gL++/vUkxOE5fRVhQXyhJQ1UoX1xkKyk/Ke+/vS9nOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUCA9IC9cL1wqLzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBQUF9URU1QTEFURV9JRF9SRUdFWFAgPSAvXGQrXDooXGQrKS87Ci8qKgogKiBCcmVha3MgcGF0dGVybiBpbnRvIHN0cmluZ3MgYW5kIHRvcCBsZXZlbCB7Li4ufSBibG9ja3MuCiAqIENhbiBiZSB1c2VkIHRvIGJyZWFrIGEgbWVzc2FnZSBpbnRvIHRleHQgYW5kIElDVSBleHByZXNzaW9ucywgb3IgdG8gYnJlYWsgYW4gSUNVIGV4cHJlc3Npb24gaW50bwogKiBrZXlzIGFuZCBjYXNlcy4KICogT3JpZ2luYWwgY29kZSBmcm9tIGNsb3N1cmUgbGlicmFyeSwgbW9kaWZpZWQgZm9yIEFuZ3VsYXIuCiAqCiAqIEBwYXJhbSB7P30gcGF0dGVybiAoc3ViKVBhdHRlcm4gdG8gYmUgYnJva2VuLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdFBhcnRzKHBhdHRlcm4pIHsKICAgIGlmICghcGF0dGVybikgewogICAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2UG9zID0gMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJyYWNlU3RhY2sgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJyYWNlcyA9IC9be31dL2c7CiAgICAvLyBsYXN0SW5kZXggZG9lc24ndCBnZXQgc2V0IHRvIDAgc28gd2UgaGF2ZSB0by4KICAgIGJyYWNlcy5sYXN0SW5kZXggPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hdGNoOwogICAgd2hpbGUgKG1hdGNoID0gYnJhY2VzLmV4ZWMocGF0dGVybikpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9zID0gbWF0Y2guaW5kZXg7CiAgICAgICAgaWYgKG1hdGNoWzBdID09ICd9JykgewogICAgICAgICAgICBicmFjZVN0YWNrLnBvcCgpOwogICAgICAgICAgICBpZiAoYnJhY2VTdGFjay5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgLy8gRW5kIG9mIHRoZSBibG9jay4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0gcGF0dGVybi5zdWJzdHJpbmcocHJldlBvcywgcG9zKTsKICAgICAgICAgICAgICAgIGlmIChJQ1VfQkxPQ0tfUkVHRVhQLnRlc3QoYmxvY2spKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSUNVQmxvY2soYmxvY2spKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChibG9jayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcmV2UG9zID0gcG9zICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGJyYWNlU3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MsIHBvcyk7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goc3Vic3RyaW5nKTsKICAgICAgICAgICAgICAgIHByZXZQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyYWNlU3RhY2sucHVzaCgneycpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN1YnN0cmluZyA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MpOwogICAgcmVzdWx0cy5wdXNoKHN1YnN0cmluZyk7CiAgICByZXR1cm4gcmVzdWx0czsKfQovKioKICogUGFyc2VzIHRleHQgY29udGFpbmluZyBhbiBJQ1UgZXhwcmVzc2lvbiBhbmQgcHJvZHVjZXMgYSBKU09OIG9iamVjdCBmb3IgaXQuCiAqIE9yaWdpbmFsIGNvZGUgZnJvbSBjbG9zdXJlIGxpYnJhcnksIG1vZGlmaWVkIGZvciBBbmd1bGFyLgogKgogKiBAcGFyYW0gez99IHBhdHRlcm4gVGV4dCBjb250YWluaW5nIGFuIElDVSBleHByZXNzaW9uIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VJQ1VCbG9jayhwYXR0ZXJuKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjYXNlcyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdmFsdWVzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaWN1VHlwZSA9IDEgLyogcGx1cmFsICovOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1haW5CaW5kaW5nID0gMDsKICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2UoSUNVX0JMT0NLX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdHIKICAgICAqIEBwYXJhbSB7P30gYmluZGluZwogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoc3RyLCBiaW5kaW5nLCB0eXBlKSB7CiAgICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgIGljdVR5cGUgPSAwIC8qIHNlbGVjdCAqLzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGljdVR5cGUgPSAxIC8qIHBsdXJhbCAqLzsKICAgICAgICB9CiAgICAgICAgbWFpbkJpbmRpbmcgPSBwYXJzZUludChiaW5kaW5nLnN1YnN0cigxKSwgMTApOwogICAgICAgIHJldHVybiAnJzsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhcnRzID0gKC8qKiBAdHlwZSB7P30gKi8gKGV4dHJhY3RQYXJ0cyhwYXR0ZXJuKSkpOwogICAgLy8gTG9va2luZyBmb3IgKGtleSBibG9jaykrIHNlcXVlbmNlLiBPbmUgb2YgdGhlIGtleXMgaGFzIHRvIGJlICJvdGhlciIuCiAgICBmb3IgKGxldCBwb3MgPSAwOyBwb3MgPCBwYXJ0cy5sZW5ndGg7KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBrZXkgPSBwYXJ0c1twb3MrK10udHJpbSgpOwogICAgICAgIGlmIChpY3VUeXBlID09PSAxIC8qIHBsdXJhbCAqLykgewogICAgICAgICAgICAvLyBLZXkgY2FuIGJlICI9eCIsIHdlIGp1c3Qgd2FudCAieCIKICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xzKig/Oj0pPyhcdyspXHMqLywgJyQxJyk7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2VzLnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsb2NrcyA9ICgvKiogQHR5cGUgez99ICovIChleHRyYWN0UGFydHMocGFydHNbcG9zKytdKSkpOwogICAgICAgIGlmIChjYXNlcy5sZW5ndGggPiB2YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGJsb2Nrcyk7CiAgICAgICAgfQogICAgfQogICAgLy8gVE9ETyhvY29tYmUpOiBzdXBwb3J0IElDVSBleHByZXNzaW9ucyBpbiBhdHRyaWJ1dGVzLCBzZWUgIzIxNjE1CiAgICByZXR1cm4geyB0eXBlOiBpY3VUeXBlLCBtYWluQmluZGluZzogbWFpbkJpbmRpbmcsIGNhc2VzLCB2YWx1ZXMgfTsKfQovKioKICogUmVtb3ZlcyBldmVyeXRoaW5nIGluc2lkZSB0aGUgc3ViLXRlbXBsYXRlcyBvZiBhIG1lc3NhZ2UuCiAqIEBwYXJhbSB7P30gbWVzc2FnZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlSW5uZXJUZW1wbGF0ZVRyYW5zbGF0aW9uKG1lc3NhZ2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBtYXRjaDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCByZXMgPSAnJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5UZW1wbGF0ZSA9IGZhbHNlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHRhZ01hdGNoZWQ7CiAgICB3aGlsZSAoKG1hdGNoID0gU1VCVEVNUExBVEVfUkVHRVhQLmV4ZWMobWVzc2FnZSkpICE9PSBudWxsKSB7CiAgICAgICAgaWYgKCFpblRlbXBsYXRlKSB7CiAgICAgICAgICAgIHJlcyArPSBtZXNzYWdlLnN1YnN0cmluZyhpbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICB0YWdNYXRjaGVkID0gbWF0Y2hbMV07CiAgICAgICAgICAgIGluVGVtcGxhdGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKG1hdGNoWzBdID09PSBgJHtNQVJLRVJ9Lyoke3RhZ01hdGNoZWR9JHtNQVJLRVJ9YCkgewogICAgICAgICAgICAgICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgICAgICAgICAgICAgIGluVGVtcGxhdGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG5nRGV2TW9kZSAmJgogICAgICAgIGFzc2VydEVxdWFsKGluVGVtcGxhdGUsIGZhbHNlLCBgVGFnIG1pc21hdGNoOiB1bmFibGUgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBzdWItdGVtcGxhdGUgaW4gdGhlIHRyYW5zbGF0aW9uICIke21lc3NhZ2V9ImApOwogICAgcmVzICs9IG1lc3NhZ2Uuc3Vic3RyKGluZGV4KTsKICAgIHJldHVybiByZXM7Cn0KLyoqCiAqIEV4dHJhY3RzIGEgcGFydCBvZiBhIG1lc3NhZ2UgYW5kIHJlbW92ZXMgdGhlIHJlc3QuCiAqCiAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGV4dHJhY3RpbmcgYSBwYXJ0IG9mIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCBhIHRlbXBsYXRlLiBBIHRyYW5zbGF0ZWQKICogbWVzc2FnZSBjYW4gc3BhbiBtdWx0aXBsZSB0ZW1wbGF0ZXMuCiAqCiAqIEV4YW1wbGU6CiAqIGBgYAogKiA8ZGl2IGkxOG4+VHJhbnNsYXRlIDxzcGFuICpuZ0lmPm1lPC9zcGFuPiE8L2Rpdj4KICogYGBgCiAqCiAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBjcm9wCiAqIEBwYXJhbSB7Pz19IHN1YlRlbXBsYXRlSW5kZXggSW5kZXggb2YgdGhlIHN1Yi10ZW1wbGF0ZSB0byBleHRyYWN0LiBJZiB1bmRlZmluZWQgaXQgcmV0dXJucyB0aGUKICogZXh0ZXJuYWwgdGVtcGxhdGUgYW5kIHJlbW92ZXMgYWxsIHN1Yi10ZW1wbGF0ZXMuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbkZvclRlbXBsYXRlKG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgIGlmICh0eXBlb2Ygc3ViVGVtcGxhdGVJbmRleCAhPT0gJ251bWJlcicpIHsKICAgICAgICAvLyBXZSB3YW50IHRoZSByb290IHRlbXBsYXRlIG1lc3NhZ2UsIGlnbm9yZSBhbGwgc3ViLXRlbXBsYXRlcwogICAgICAgIHJldHVybiByZW1vdmVJbm5lclRlbXBsYXRlVHJhbnNsYXRpb24obWVzc2FnZSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSB3YW50IGEgc3BlY2lmaWMgc3ViLXRlbXBsYXRlCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKGA6JHtzdWJUZW1wbGF0ZUluZGV4fSR7TUFSS0VSfWApICsgMiArIHN1YlRlbXBsYXRlSW5kZXgudG9TdHJpbmcoKS5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2Uuc2VhcmNoKG5ldyBSZWdFeHAoYCR7TUFSS0VSfVxcL1xcKlxcZCs6JHtzdWJUZW1wbGF0ZUluZGV4fSR7TUFSS0VSfWApKTsKICAgICAgICByZXR1cm4gcmVtb3ZlSW5uZXJUZW1wbGF0ZVRyYW5zbGF0aW9uKG1lc3NhZ2Uuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKTsKICAgIH0KfQovKioKICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgdG8gdXBkYXRlIHRoZSBiaW5kaW5ncyBvZiBhIHN0cmluZy4KICoKICogQHBhcmFtIHs/fSBzdHIgVGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBiaW5kaW5ncy4KICogQHBhcmFtIHs/fSBkZXN0aW5hdGlvbk5vZGUgSW5kZXggb2YgdGhlIGRlc3RpbmF0aW9uIG5vZGUgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBiaW5kaW5nLgogKiBAcGFyYW0gez89fSBhdHRyTmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGlmIHRoZSBzdHJpbmcgYmVsb25ncyB0byBhbiBhdHRyaWJ1dGUuCiAqIEBwYXJhbSB7Pz19IHNhbml0aXplRm4gU2FuaXRpemF0aW9uIGZ1bmN0aW9uIHVzZWQgdG8gc2FuaXRpemUgdGhlIHN0cmluZyBhZnRlciB1cGRhdGUsIGlmIG5lY2Vzc2FyeS4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXMoc3RyLCBkZXN0aW5hdGlvbk5vZGUsIGF0dHJOYW1lLCBzYW5pdGl6ZUZuID0gbnVsbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdXBkYXRlT3BDb2RlcyA9IFtudWxsLCBudWxsXTsKICAgIC8vIEFsbG9jIHNwYWNlIGZvciBtYXNrIGFuZCBzaXplCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0ZXh0UGFydHMgPSBzdHIuc3BsaXQoQklORElOR19SRUdFWFApOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG1hc2sgPSAwOwogICAgZm9yIChsZXQgaiA9IDA7IGogPCB0ZXh0UGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGV4dFZhbHVlID0gdGV4dFBhcnRzW2pdOwogICAgICAgIGlmIChqICYgMSkgewogICAgICAgICAgICAvLyBPZGQgaW5kZXhlcyBhcmUgYmluZGluZ3MKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBwYXJzZUludCh0ZXh0VmFsdWUsIDEwKTsKICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKC0xIC0gYmluZGluZ0luZGV4KTsKICAgICAgICAgICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQoYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGV4dFZhbHVlICE9PSAnJykgewogICAgICAgICAgICAvLyBFdmVuIGluZGV4ZXMgYXJlIHRleHQKICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRleHRWYWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgdXBkYXRlT3BDb2Rlcy5wdXNoKGRlc3RpbmF0aW9uTm9kZSA8PCAyIC8qIFNISUZUX1JFRiAqLyB8CiAgICAgICAgKGF0dHJOYW1lID8gMSAvKiBBdHRyICovIDogMCAvKiBUZXh0ICovKSk7CiAgICBpZiAoYXR0ck5hbWUpIHsKICAgICAgICB1cGRhdGVPcENvZGVzLnB1c2goYXR0ck5hbWUsIHNhbml0aXplRm4pOwogICAgfQogICAgdXBkYXRlT3BDb2Rlc1swXSA9IG1hc2s7CiAgICB1cGRhdGVPcENvZGVzWzFdID0gdXBkYXRlT3BDb2Rlcy5sZW5ndGggLSAyOwogICAgcmV0dXJuIHVwZGF0ZU9wQ29kZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaWN1RXhwcmVzc2lvbgogKiBAcGFyYW0gez89fSBtYXNrCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRCaW5kaW5nTWFzayhpY3VFeHByZXNzaW9uLCBtYXNrID0gMCkgewogICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQoaWN1RXhwcmVzc2lvbi5tYWluQmluZGluZyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2g7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlQXJyID0gaWN1RXhwcmVzc2lvbi52YWx1ZXNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZUFyci5sZW5ndGg7IGorKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVBcnJbal07CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBCSU5ESU5HX1JFR0VYUC5leGVjKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIG1hc2sgPSBtYXNrIHwgdG9NYXNrQml0KHBhcnNlSW50KG1hdGNoWzFdLCAxMCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbWFzayA9IGdldEJpbmRpbmdNYXNrKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpLCBtYXNrKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBtYXNrOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgaTE4bkluZGV4U3RhY2sgPSBbXTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgaTE4bkluZGV4U3RhY2tQb2ludGVyID0gLTE7Ci8qKgogKiBDb252ZXJ0IGJpbmRpbmcgaW5kZXggdG8gbWFzayBiaXQuCiAqCiAqIEVhY2ggaW5kZXggcmVwcmVzZW50cyBhIHNpbmdsZSBiaXQgb24gdGhlIGJpdC1tYXNrLiBCZWNhdXNlIGJpdC1tYXNrIG9ubHkgaGFzIDMyIGJpdHMsIHdlIG1ha2UKICogdGhlIDMybmQgYml0IHNoYXJlIGFsbCBtYXNrcyBmb3IgYWxsIGJpbmRpbmdzIGhpZ2hlciB0aGFuIDMyLiBTaW5jZSBpdCBpcyBleHRyZW1lbHkgcmFyZSB0byBoYXZlCiAqIG1vcmUgdGhhbiAzMiBiaW5kaW5ncyB0aGlzIHdpbGwgYmUgaGl0IHZlcnkgcmFyZWx5LiBUaGUgZG93bnNpZGUgb2YgaGl0dGluZyB0aGlzIGNvcm5lciBjYXNlIGlzCiAqIHRoYXQgd2Ugd2lsbCBleGVjdXRlIGJpbmRpbmcgY29kZSBtb3JlIG9mdGVuIHRoYW4gbmVjZXNzYXJ5LiAocGVuYWx0eSBvZiBwZXJmb3JtYW5jZSkKICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRvTWFza0JpdChiaW5kaW5nSW5kZXgpIHsKICAgIHJldHVybiAxIDw8IE1hdGgubWluKGJpbmRpbmdJbmRleCwgMzEpOwp9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgcGFyZW50SW5kZXhTdGFjayA9IFtdOwovKioKICogTWFya3MgYSBibG9jayBvZiB0ZXh0IGFzIHRyYW5zbGF0YWJsZS4KICoKICogVGhlIGluc3RydWN0aW9ucyBgaTE4blN0YXJ0YCBhbmQgYGkxOG5FbmRgIG1hcmsgdGhlIHRyYW5zbGF0aW9uIGJsb2NrIGluIHRoZSB0ZW1wbGF0ZS4KICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heQogKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOgogKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmUKICogICBpbnRlcnBvbGF0ZWQgaW50by4gVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaW5kZXguIEFuIG9wdGlvbmFsCiAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nCiAqICAgYW5kIGVuZCBvZiBET00gZWxlbWVudCB0aGF0IHdlcmUgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGJsb2NrLiBUaGUgcGxhY2Vob2xkZXIKICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0CiAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICogLSBg77+9IXtpbmRleH0oOntibG9ja30p77+9YC9g77+9LyF7aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpQcm9qZWN0aW9uIFBsYWNlaG9sZGVyKjogIE1hcmtzIHRoZQogKiAgIGJlZ2lubmluZyBhbmQgZW5kIG9mIDxuZy1jb250ZW50PiB0aGF0IHdhcyBlbWJlZGRlZCBpbiB0aGUgb3JpZ2luYWwgdHJhbnNsYXRpb24gYmxvY2suCiAqICAgVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBlbGVtZW50IGluZGV4IGluIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgc2V0LgogKiAgIEFuIG9wdGlvbmFsIGBibG9ja2AgdGhhdCBtYXRjaGVzIHRoZSBzdWItdGVtcGxhdGUgaW4gd2hpY2ggaXQgd2FzIGRlY2xhcmVkLgogKiAtIGDvv70qe2luZGV4fTp7YmxvY2t977+9YC9g77+9Lyp7aW5kZXh9OntibG9ja33vv71gOiAqU3ViLXRlbXBsYXRlIFBsYWNlaG9sZGVyKjogU3ViLXRlbXBsYXRlcyBtdXN0IGJlCiAqICAgc3BsaXQgdXAgYW5kIHRyYW5zbGF0ZWQgc2VwYXJhdGVseSBpbiBlYWNoIGFuZ3VsYXIgdGVtcGxhdGUgZnVuY3Rpb24uIFRoZSBgaW5kZXhgIHBvaW50cyB0byB0aGUKICogICBgdGVtcGxhdGVgIGluc3RydWN0aW9uIGluZGV4LiBBIGBibG9ja2AgdGhhdCBtYXRjaGVzIHRoZSBzdWItdGVtcGxhdGUgaW4gd2hpY2ggaXQgd2FzIGRlY2xhcmVkLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBBIHVuaXF1ZSBpbmRleCBvZiB0aGUgdHJhbnNsYXRpb24gaW4gdGhlIHN0YXRpYyBibG9jay4KICogQHBhcmFtIHs/fSBtZXNzYWdlIFRoZSB0cmFuc2xhdGlvbiBtZXNzYWdlLgogKiBAcGFyYW0gez89fSBzdWJUZW1wbGF0ZUluZGV4IE9wdGlvbmFsIHN1Yi10ZW1wbGF0ZSBpbmRleCBpbiB0aGUgYG1lc3NhZ2VgLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5TdGFydChpbmRleCwgbWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIGB0VmlldyBzaG91bGQgYmUgZGVmaW5lZGApOwogICAgaTE4bkluZGV4U3RhY2tbKytpMThuSW5kZXhTdGFja1BvaW50ZXJdID0gaW5kZXg7CiAgICAvLyBXZSBuZWVkIHRvIGRlbGF5IHByb2plY3Rpb25zIHVudGlsIGBpMThuRW5kYAogICAgc2V0RGVsYXlQcm9qZWN0aW9uKHRydWUpOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyAmJiB0Vmlldy5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF0gPT09IG51bGwpIHsKICAgICAgICBpMThuU3RhcnRGaXJzdFBhc3MoZ2V0TFZpZXcoKSwgdFZpZXcsIGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIH0KfQovLyBDb3VudCBmb3IgdGhlIG51bWJlciBvZiB2YXJzIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggaTE4biBibG9jay4KLy8gSXQgaXMgZ2xvYmFsIGJlY2F1c2UgdGhpcyBpcyB1c2VkIGluIG11bHRpcGxlIGZ1bmN0aW9ucyB0aGF0IGluY2x1ZGUgbG9vcHMgYW5kIHJlY3Vyc2l2ZSBjYWxscy4KLy8gVGhpcyBpcyByZXNldCB0byAwIHdoZW4gYGkxOG5TdGFydEZpcnN0UGFzc2AgaXMgY2FsbGVkLgovKiogQHR5cGUgez99ICovCmxldCBpMThuVmFyc0NvdW50OwovKioKICogU2VlIGBpMThuU3RhcnRgIGFib3ZlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IG1lc3NhZ2UKICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaTE4blN0YXJ0Rmlyc3RQYXNzKGxWaWV3LCB0VmlldywgaW5kZXgsIG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0Vmlldy5ibHVlcHJpbnQubGVuZ3RoIC0gSEVBREVSX09GRlNFVDsKICAgIGkxOG5WYXJzQ291bnQgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJlbnRUTm9kZSA9IGdldElzUGFyZW50KCkgPyBwcmV2aW91c09yUGFyZW50VE5vZGUgOiBwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwYXJlbnRJbmRleCA9IHBhcmVudFROb2RlICYmIHBhcmVudFROb2RlICE9PSBsVmlld1tUX0hPU1RdID8gcGFyZW50VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUIDogaW5kZXg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcGFyZW50SW5kZXhQb2ludGVyID0gMDsKICAgIHBhcmVudEluZGV4U3RhY2tbcGFyZW50SW5kZXhQb2ludGVyXSA9IHBhcmVudEluZGV4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3JlYXRlT3BDb2RlcyA9IFtdOwogICAgLy8gSWYgdGhlIHByZXZpb3VzIG5vZGUgd2Fzbid0IHRoZSBkaXJlY3QgcGFyZW50IHRoZW4gd2UgaGF2ZSBhIHRyYW5zbGF0aW9uIHdpdGhvdXQgdG9wIGxldmVsCiAgICAvLyBlbGVtZW50IGFuZCB3ZSBuZWVkIHRvIGtlZXAgYSByZWZlcmVuY2Ugb2YgdGhlIHByZXZpb3VzIGVsZW1lbnQgaWYgdGhlcmUgaXMgb25lLiBXZSBzaG91bGQgYWxzbwogICAgLy8ga2VlcCB0cmFjayB3aGV0aGVyIGFuIGVsZW1lbnQgd2FzIGEgcGFyZW50IG5vZGUgb3Igbm90LCBzbyB0aGF0IHRoZSBsb2dpYyB0aGF0IGNvbnN1bWVzCiAgICAvLyB0aGUgZ2VuZXJhdGVkIGBJMThuTXV0YXRlT3BDb2RlYHMgY2FuIGxldmVyYWdlIHRoaXMgaW5mb3JtYXRpb24gdG8gcHJvcGVybHkgc2V0IFROb2RlIHN0YXRlCiAgICAvLyAod2hldGhlciBpdCdzIGEgcGFyZW50IG9yIHNpYmxpbmcpLgogICAgaWYgKGluZGV4ID4gMCAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUgIT09IHBhcmVudFROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcmV2aW91c1ROb2RlSW5kZXggPSBwcmV2aW91c09yUGFyZW50VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIC8vIElmIGN1cnJlbnQgVE5vZGUgaXMgYSBzaWJsaW5nIG5vZGUsIGVuY29kZSBpdCB1c2luZyBhIG5lZ2F0aXZlIGluZGV4LiBUaGlzIGluZm9ybWF0aW9uIGlzCiAgICAgICAgLy8gcmVxdWlyZWQgd2hlbiB0aGUgYFNlbGVjdGAgYWN0aW9uIGlzIHByb2Nlc3NlZCAoc2VlIHRoZSBgcmVhZENyZWF0ZU9wQ29kZXNgIGZ1bmN0aW9uKS4KICAgICAgICBpZiAoIWdldElzUGFyZW50KCkpIHsKICAgICAgICAgICAgcHJldmlvdXNUTm9kZUluZGV4ID0gfnByZXZpb3VzVE5vZGVJbmRleDsKICAgICAgICB9CiAgICAgICAgLy8gQ3JlYXRlIGFuIE9wQ29kZSB0byBzZWxlY3QgdGhlIHByZXZpb3VzIFROb2RlCiAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKHByZXZpb3VzVE5vZGVJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDAgLyogU2VsZWN0ICovKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVwZGF0ZU9wQ29kZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGljdUV4cHJlc3Npb25zID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0ZW1wbGF0ZVRyYW5zbGF0aW9uID0gZ2V0VHJhbnNsYXRpb25Gb3JUZW1wbGF0ZShtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1zZ1BhcnRzID0gcmVwbGFjZU5nc3AodGVtcGxhdGVUcmFuc2xhdGlvbikuc3BsaXQoUEhfUkVHRVhQKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXNnUGFydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHZhbHVlID0gbXNnUGFydHNbaV07CiAgICAgICAgaWYgKGkgJiAxKSB7CiAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBwbGFjZWhvbGRlcnMgKGVsZW1lbnRzIGFuZCBzdWItdGVtcGxhdGVzKQogICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApID09PSAnLycpIHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgY2xvc2luZyB0YWcKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoMSkgPT09ICIjIiAvKiBFTEVNRU5UICovKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBoSW5kZXggPSBwYXJzZUludCh2YWx1ZS5zdWJzdHIoMiksIDEwKTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IHBhcmVudEluZGV4U3RhY2tbLS1wYXJlbnRJbmRleFBvaW50ZXJdOwogICAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wQ29kZXMucHVzaChwaEluZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNSAvKiBFbGVtZW50RW5kICovKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBoSW5kZXggPSBwYXJzZUludCh2YWx1ZS5zdWJzdHIoMSksIDEwKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlzRWxlbWVudCA9IHZhbHVlLmNoYXJBdCgwKSA9PT0gIiMiIC8qIEVMRU1FTlQgKi87CiAgICAgICAgICAgICAgICAvLyBUaGUgdmFsdWUgcmVwcmVzZW50cyBhIHBsYWNlaG9sZGVyIHRoYXQgd2UgbW92ZSB0byB0aGUgZGVzaWduYXRlZCBpbmRleC4KICAgICAgICAgICAgICAgIC8vIE5vdGU6IHBvc2l0aXZlIGluZGljaWVzIGluZGljYXRlIHRoYXQgYSBUTm9kZSB3aXRoIGEgZ2l2ZW4gaW5kZXggc2hvdWxkIGFsc28gYmUgbWFya2VkIGFzCiAgICAgICAgICAgICAgICAvLyBwYXJlbnQgd2hpbGUgZXhlY3V0aW5nIGBTZWxlY3RgIGluc3RydWN0aW9uLgogICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKChpc0VsZW1lbnQgPyBwaEluZGV4IDogfnBoSW5kZXgpIDw8IDMgLyogU0hJRlRfUkVGICovIHwKICAgICAgICAgICAgICAgICAgICAwIC8qIFNlbGVjdCAqLywgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7CiAgICAgICAgICAgICAgICBpZiAoaXNFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5kZXhTdGFja1srK3BhcmVudEluZGV4UG9pbnRlcl0gPSBwYXJlbnRJbmRleCA9IHBoSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzICYgSUNVIGV4cHJlc3Npb25zKQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZXh0cmFjdFBhcnRzKHZhbHVlKTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgaWYgKGogJiAxKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT2RkIGluZGV4ZXMgYXJlIElDVSBleHByZXNzaW9ucwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpY3VFeHByZXNzaW9uID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgSUNVIGV4cHJlc3Npb24gaGFzIHRoZSByaWdodCBzaGFwZS4gVHJhbnNsYXRpb25zIG1pZ2h0IGNvbnRhaW4gaW52YWxpZAogICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdGlvbnMgKHdoaWxlIG9yaWdpbmFsIG1lc3NhZ2VzIHdlcmUgY29ycmVjdCksIHNvIElDVSBwYXJzaW5nIGF0IHJ1bnRpbWUgbWF5IG5vdAogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWQgKHRodXMgYGljdUV4cHJlc3Npb25gIHJlbWFpbnMgYSBzdHJpbmcpLgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWN1RXhwcmVzc2lvbiAhPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgSUNVIGV4cHJlc3Npb24gaW4gIiR7dGVtcGxhdGVUcmFuc2xhdGlvbn0iIG1lc3NhZ2UuYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29tbWVudCBub2RlIHRoYXQgd2lsbCBhbmNob3IgdGhlIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGljdU5vZGVJbmRleCA9IHN0YXJ0SW5kZXggKyBpMThuVmFyc0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKENPTU1FTlRfTUFSS0VSLCBuZ0Rldk1vZGUgPyBgSUNVICR7aWN1Tm9kZUluZGV4fWAgOiAnJywgaWN1Tm9kZUluZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgY29kZXMgZm9yIHRoZSBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gZ2V0QmluZGluZ01hc2soaWN1RXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgaWN1U3RhcnQoaWN1RXhwcmVzc2lvbnMsIGljdUV4cHJlc3Npb24sIGljdU5vZGVJbmRleCwgaWN1Tm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHJlY3Vyc2l2ZSwgdGhlIGxhc3QgVEljdSB0aGF0IHdhcyBwdXNoZWQgaXMgdGhlIG9uZSB3ZSB3YW50CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRJY3VJbmRleCA9IGljdUV4cHJlc3Npb25zLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRvTWFza0JpdChpY3VFeHByZXNzaW9uLm1haW5CaW5kaW5nKSwgLy8gbWFzayBvZiB0aGUgbWFpbiBiaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAtMSAtIGljdUV4cHJlc3Npb24ubWFpbkJpbmRpbmcsIGljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDIgLyogSWN1U3dpdGNoICovLCB0SWN1SW5kZXgsIG1hc2ssIC8vIG1hc2sgb2YgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGlzIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgMiwgLy8gc2tpcCAyIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICBpY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgdEljdUluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRzW2pdICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiBpbmRleGVzIGFyZSB0ZXh0IChpbmNsdWRpbmcgYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSB0ZXh0Lm1hdGNoKEJJTkRJTkdfUkVHRVhQKTsKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGV4dCBub2RlcwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZUluZGV4ID0gc3RhcnRJbmRleCArIGkxOG5WYXJzQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICBjcmVhdGVPcENvZGVzLnB1c2goCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBiaW5kaW5nLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgZHVyaW5nIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgIGhhc0JpbmRpbmcgPyAnJyA6IHRleHQsIHRleHROb2RlSW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgIGlmIChoYXNCaW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2Rlcyh0ZXh0LCB0ZXh0Tm9kZUluZGV4KSwgdXBkYXRlT3BDb2Rlcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKGkxOG5WYXJzQ291bnQgPiAwKSB7CiAgICAgICAgYWxsb2NFeHBhbmRvKHRWaWV3LCBsVmlldywgaTE4blZhcnNDb3VudCk7CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhdHRhY2hJMThuT3BDb2Rlc0RlYnVnKGNyZWF0ZU9wQ29kZXMsIHVwZGF0ZU9wQ29kZXMsIGljdUV4cHJlc3Npb25zLmxlbmd0aCA/IGljdUV4cHJlc3Npb25zIDogbnVsbCwgbFZpZXcpOwogICAgLy8gTk9URTogbG9jYWwgdmFyIG5lZWRlZCB0byBwcm9wZXJseSBhc3NlcnQgdGhlIHR5cGUgb2YgYFRJMThuYC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRJMThuID0gewogICAgICAgIHZhcnM6IGkxOG5WYXJzQ291bnQsCiAgICAgICAgY3JlYXRlOiBjcmVhdGVPcENvZGVzLAogICAgICAgIHVwZGF0ZTogdXBkYXRlT3BDb2RlcywKICAgICAgICBpY3VzOiBpY3VFeHByZXNzaW9ucy5sZW5ndGggPyBpY3VFeHByZXNzaW9ucyA6IG51bGwsCiAgICB9OwogICAgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID0gdEkxOG47Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IHBhcmVudFROb2RlCiAqIEBwYXJhbSB7P30gcHJldmlvdXNUTm9kZQogKiBAcGFyYW0gez99IGxWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBlbmRJMThuTm9kZSh0VmlldywgdE5vZGUsIHBhcmVudFROb2RlLCBwcmV2aW91c1ROb2RlLCBsVmlldykgewogICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlck1vdmVOb2RlKys7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuZXh0Tm9kZSA9IHROb2RlLm5leHQ7CiAgICBpZiAoIXByZXZpb3VzVE5vZGUpIHsKICAgICAgICBwcmV2aW91c1ROb2RlID0gcGFyZW50VE5vZGU7CiAgICB9CiAgICAvLyBSZS1vcmdhbml6ZSBub2RlIHRyZWUgdG8gcHV0IHRoaXMgbm9kZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbi4KICAgIGlmIChwcmV2aW91c1ROb2RlID09PSBwYXJlbnRUTm9kZSAmJiB0Tm9kZSAhPT0gcGFyZW50VE5vZGUuY2hpbGQpIHsKICAgICAgICB0Tm9kZS5uZXh0ID0gcGFyZW50VE5vZGUuY2hpbGQ7CiAgICAgICAgcGFyZW50VE5vZGUuY2hpbGQgPSB0Tm9kZTsKICAgIH0KICAgIGVsc2UgaWYgKHByZXZpb3VzVE5vZGUgIT09IHBhcmVudFROb2RlICYmIHROb2RlICE9PSBwcmV2aW91c1ROb2RlLm5leHQpIHsKICAgICAgICB0Tm9kZS5uZXh0ID0gcHJldmlvdXNUTm9kZS5uZXh0OwogICAgICAgIHByZXZpb3VzVE5vZGUubmV4dCA9IHROb2RlOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdE5vZGUubmV4dCA9IG51bGw7CiAgICB9CiAgICBpZiAocGFyZW50VE5vZGUgIT09IGxWaWV3W1RfSE9TVF0pIHsKICAgICAgICB0Tm9kZS5wYXJlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50VE5vZGUpKTsKICAgIH0KICAgIC8vIElmIHROb2RlIHdhcyBtb3ZlZCBhcm91bmQsIHdlIG1pZ2h0IG5lZWQgdG8gZml4IGEgYnJva2VuIGxpbmsuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3Vyc29yID0gdE5vZGUubmV4dDsKICAgIHdoaWxlIChjdXJzb3IpIHsKICAgICAgICBpZiAoY3Vyc29yLm5leHQgPT09IHROb2RlKSB7CiAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gbmV4dE5vZGU7CiAgICAgICAgfQogICAgICAgIGN1cnNvciA9IGN1cnNvci5uZXh0OwogICAgfQogICAgLy8gSWYgdGhlIHBsYWNlaG9sZGVyIHRvIGFwcGVuZCBpcyBhIHByb2plY3Rpb24sIHdlIG5lZWQgdG8gbW92ZSB0aGUgcHJvamVjdGVkIG5vZGVzIGluc3RlYWQKICAgIGlmICh0Tm9kZS50eXBlID09PSAxIC8qIFByb2plY3Rpb24gKi8pIHsKICAgICAgICBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICAgICAgcmV0dXJuIHROb2RlOwogICAgfQogICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldyksIHROb2RlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNsb3RWYWx1ZSA9IGxWaWV3W3ROb2RlLmluZGV4XTsKICAgIGlmICh0Tm9kZS50eXBlICE9PSAwIC8qIENvbnRhaW5lciAqLyAmJiBpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgIC8vIE5vZGVzIHRoYXQgaW5qZWN0IFZpZXdDb250YWluZXJSZWYgYWxzbyBoYXZlIGEgY29tbWVudCBub2RlIHRoYXQgc2hvdWxkIGJlIG1vdmVkCiAgICAgICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBzbG90VmFsdWVbTkFUSVZFXSwgdE5vZGUpOwogICAgfQogICAgcmV0dXJuIHROb2RlOwp9Ci8qKgogKiBIYW5kbGVzIG1lc3NhZ2Ugc3RyaW5nIHBvc3QtcHJvY2Vzc2luZyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCiAqCiAqIEhhbmRsZXMgbWVzc2FnZSBzdHJpbmcgcG9zdC1wcm9jZXNzaW5nIGJ5IHRyYW5zZm9ybWluZyBpdCBmcm9tIGludGVybWVkaWF0ZQogKiBmb3JtYXQgKHRoYXQgbWlnaHQgY29udGFpbiBzb21lIG1hcmtlcnMgdGhhdCB3ZSBuZWVkIHRvIHJlcGxhY2UpIHRvIHRoZSBmaW5hbAogKiBmb3JtLCBjb25zdW1hYmxlIGJ5IGkxOG5TdGFydCBpbnN0cnVjdGlvbi4gUG9zdCBwcm9jZXNzaW5nIHN0ZXBzIGluY2x1ZGU6CiAqCiAqIDEuIFJlc29sdmUgYWxsIG11bHRpLXZhbHVlIGNhc2VzIChsaWtlIFvvv70qMTox77+977+9IzI6Me+/vXzvv70jNDox77+9fO+/vTXvv71dKQogKiAyLiBSZXBsYWNlIGFsbCBJQ1UgdmFycyAobGlrZSAiVkFSX1BMVVJBTCIpCiAqIDMuIFJlcGxhY2UgYWxsIHBsYWNlaG9sZGVycyB1c2VkIGluc2lkZSBJQ1VzIGluIGEgZm9ybSBvZiB7UExBQ0VIT0xERVJ9CiAqIDQuIFJlcGxhY2UgYWxsIElDVSByZWZlcmVuY2VzIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgKGxpa2Ug77+9SUNVX0VYUF9JQ1VfMe+/vSkKICogICAgaW4gY2FzZSBtdWx0aXBsZSBJQ1VzIGhhdmUgdGhlIHNhbWUgcGxhY2Vob2xkZXIgbmFtZQogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBtZXNzYWdlIFJhdyB0cmFuc2xhdGlvbiBzdHJpbmcgZm9yIHBvc3QgcHJvY2Vzc2luZwogKiBAcGFyYW0gez89fSByZXBsYWNlbWVudHMgU2V0IG9mIHJlcGxhY2VtZW50cyB0aGF0IHNob3VsZCBiZSBhcHBsaWVkCiAqCiAqIEByZXR1cm4gez99IFRyYW5zZm9ybWVkIHN0cmluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBpMThuU3RhcnQgaW5zdHJ1Y3Rpb24KICoKICovCmZ1bmN0aW9uIMm1ybVpMThuUG9zdHByb2Nlc3MobWVzc2FnZSwgcmVwbGFjZW1lbnRzID0ge30pIHsKICAgIC8qKgogICAgICogU3RlcCAxOiByZXNvbHZlIGFsbCBtdWx0aS12YWx1ZSBwbGFjZWhvbGRlcnMgbGlrZSBb77+9IzXvv71877+9KjE6Me+/ve+/vSMyOjHvv71877+9IzQ6Me+/vV0KICAgICAqCiAgICAgKiBOb3RlOiBkdWUgdG8gdGhlIHdheSB3ZSBwcm9jZXNzIG5lc3RlZCB0ZW1wbGF0ZXMgKEJGUyksIG11bHRpLXZhbHVlIHBsYWNlaG9sZGVycyBhcmUgdHlwaWNhbGx5CiAgICAgKiBncm91cGVkIGJ5IHRlbXBsYXRlcywgZm9yIGV4YW1wbGU6IFvvv70jNe+/vXzvv70jNu+/vXzvv70jMTox77+9fO+/vSMzOjLvv71dIHdoZXJlIO+/vSM177+9IGFuZCDvv70jNu+/vSBiZWxvbmcgdG8gcm9vdAogICAgICogdGVtcGxhdGUsIO+/vSMxOjHvv70gYmVsb25nIHRvIG5lc3RlZCB0ZW1wbGF0ZSB3aXRoIGluZGV4IDEgYW5kIO+/vSMxOjLvv70gLSBuZXN0ZWQgdGVtcGxhdGUgd2l0aCBpbmRleAogICAgICogMy4gSG93ZXZlciBpbiByZWFsIHRlbXBsYXRlcyB0aGUgb3JkZXIgbWlnaHQgYmUgZGlmZmVyZW50OiBpLmUuIO+/vSMxOjHvv70gYW5kL29yIO+/vSMzOjLvv70gbWF5IGdvIGluCiAgICAgKiBmcm9udCBvZiDvv70jNu+/vS4gVGhlIHBvc3QgcHJvY2Vzc2luZyBzdGVwIHJlc3RvcmVzIHRoZSByaWdodCBvcmRlciBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZQogICAgICogdGVtcGxhdGUgaWQgc3RhY2sgYW5kIGxvb2tzIGZvciBwbGFjZWhvbGRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgdGVtcGxhdGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IHJlc3VsdCA9IG1lc3NhZ2U7CiAgICBpZiAoUFBfTVVMVElfVkFMVUVfUExBQ0VIT0xERVJTX1JFR0VYUC50ZXN0KG1lc3NhZ2UpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hdGNoZXMgPSB7fTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGVJZHNTdGFjayA9IFtST09UX1RFTVBMQVRFX0lEXTsKICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9QTEFDRUhPTERFUlNfUkVHRVhQLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtCiAgICAgICAgICogQHBhcmFtIHs/fSBwaHMKICAgICAgICAgKiBAcGFyYW0gez99IHRtcGwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtLCBwaHMsIHRtcGwpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZW50ID0gcGhzIHx8IHRtcGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gbWF0Y2hlc1tjb250ZW50XSB8fCBbXTsKICAgICAgICAgICAgaWYgKCFwbGFjZWhvbGRlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb250ZW50LnNwbGl0KCd8JykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYWNlaG9sZGVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocGxhY2Vob2xkZXIpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZWhvbGRlci5tYXRjaChQUF9URU1QTEFURV9JRF9SRUdFWFApOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkID0gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogUk9PVF9URU1QTEFURV9JRDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNDbG9zZVRlbXBsYXRlVGFnID0gUFBfQ0xPU0VfVEVNUExBVEVfUkVHRVhQLnRlc3QocGxhY2Vob2xkZXIpOwogICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKFt0ZW1wbGF0ZUlkLCBpc0Nsb3NlVGVtcGxhdGVUYWcsIHBsYWNlaG9sZGVyXSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBtYXRjaGVzW2NvbnRlbnRdID0gcGxhY2Vob2xkZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpMThuIHBvc3Rwcm9jZXNzOiB1bm1hdGNoZWQgcGxhY2Vob2xkZXIgLSAke2NvbnRlbnR9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdXJyZW50VGVtcGxhdGVJZCA9IHRlbXBsYXRlSWRzU3RhY2tbdGVtcGxhdGVJZHNTdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaWR4ID0gMDsKICAgICAgICAgICAgLy8gZmluZCBwbGFjZWhvbGRlciBpbmRleCB0aGF0IG1hdGNoZXMgY3VycmVudCB0ZW1wbGF0ZSBpZAogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyc1tpXVswXSA9PT0gY3VycmVudFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBpZHggPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHVwZGF0ZSB0ZW1wbGF0ZSBpZCBzdGFjayBiYXNlZCBvbiB0aGUgY3VycmVudCB0YWcgZXh0cmFjdGVkCiAgICAgICAgICAgIGNvbnN0IFt0ZW1wbGF0ZUlkLCBpc0Nsb3NlVGVtcGxhdGVUYWcsIHBsYWNlaG9sZGVyXSA9IHBsYWNlaG9sZGVyc1tpZHhdOwogICAgICAgICAgICBpZiAoaXNDbG9zZVRlbXBsYXRlVGFnKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkc1N0YWNrLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRUZW1wbGF0ZUlkICE9PSB0ZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkc1N0YWNrLnB1c2godGVtcGxhdGVJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIHByb2Nlc3NlZCB0YWcgZnJvbSB0aGUgbGlzdAogICAgICAgICAgICBwbGFjZWhvbGRlcnMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjsKICAgICAgICB9KSk7CiAgICB9CiAgICAvLyByZXR1cm4gY3VycmVudCByZXN1bHQgaWYgbm8gcmVwbGFjZW1lbnRzIHNwZWNpZmllZAogICAgaWYgKCFPYmplY3Qua2V5cyhyZXBsYWNlbWVudHMpLmxlbmd0aCkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFN0ZXAgMjogcmVwbGFjZSBhbGwgSUNVIHZhcnMgKGxpa2UgIlZBUl9QTFVSQUwiKQogICAgICovCiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VfVkFSU19SRUdFWFAsICgvKioKICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAqIEBwYXJhbSB7P30gc3RhcnQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IF90eXBlCiAgICAgKiBAcGFyYW0gez99IF9pZHgKICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAobWF0Y2gsIHN0YXJ0LCBrZXksIF90eXBlLCBfaWR4LCBlbmQpID0+IHsKICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnRzLmhhc093blByb3BlcnR5KGtleSkgPyBgJHtzdGFydH0ke3JlcGxhY2VtZW50c1trZXldfSR7ZW5kfWAgOiBtYXRjaDsKICAgIH0pKTsKICAgIC8qKgogICAgICogU3RlcCAzOiByZXBsYWNlIGFsbCBwbGFjZWhvbGRlcnMgdXNlZCBpbnNpZGUgSUNVcyBpbiBhIGZvcm0gb2Yge1BMQUNFSE9MREVSfQogICAgICovCiAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VfUExBQ0VIT0xERVJTX1JFR0VYUCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChtYXRjaCwga2V5KSA9PiB7CiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gKC8qKiBAdHlwZSB7P30gKi8gKHJlcGxhY2VtZW50c1trZXldKSkgOiBtYXRjaDsKICAgIH0pKTsKICAgIC8qKgogICAgICogU3RlcCA0OiByZXBsYWNlIGFsbCBJQ1UgcmVmZXJlbmNlcyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzIChsaWtlIO+/vUlDVV9FWFBfSUNVXzHvv70pIGluIGNhc2UKICAgICAqIG11bHRpcGxlIElDVXMgaGF2ZSB0aGUgc2FtZSBwbGFjZWhvbGRlciBuYW1lCiAgICAgKi8KICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFBQX0lDVVNfUkVHRVhQLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKG1hdGNoLCBrZXkpID0+IHsKICAgICAgICBpZiAocmVwbGFjZW1lbnRzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaXN0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlcGxhY2VtZW50c1trZXldKSk7CiAgICAgICAgICAgIGlmICghbGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIElDVSAtICR7bWF0Y2h9IHdpdGgga2V5OiAke2tleX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxpc3Quc2hpZnQoKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICB9KSk7CiAgICByZXR1cm4gcmVzdWx0Owp9Ci8qKgogKiBUcmFuc2xhdGVzIGEgdHJhbnNsYXRpb24gYmxvY2sgbWFya2VkIGJ5IGBpMThuU3RhcnRgIGFuZCBgaTE4bkVuZGAuIEl0IGluc2VydHMgdGhlIHRleHQvSUNVIG5vZGVzCiAqIGludG8gdGhlIHJlbmRlciB0cmVlLCBtb3ZlcyB0aGUgcGxhY2Vob2xkZXIgbm9kZXMgYW5kIHJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZXMuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5FbmQoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0VmlldywgYHRWaWV3IHNob3VsZCBiZSBkZWZpbmVkYCk7CiAgICBpMThuRW5kRmlyc3RQYXNzKHRWaWV3LCBsVmlldyk7CiAgICAvLyBTdG9wIGRlbGF5aW5nIHByb2plY3Rpb25zCiAgICBzZXREZWxheVByb2plY3Rpb24oZmFsc2UpOwp9Ci8qKgogKiBTZWUgYGkxOG5FbmRgIGFib3ZlLgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGkxOG5FbmRGaXJzdFBhc3ModFZpZXcsIGxWaWV3KSB7CiAgICBuZ0Rldk1vZGUgJiYKICAgICAgICBhc3NlcnRFcXVhbChnZXRCaW5kaW5nSW5kZXgoKSwgdFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgsICdpMThuRW5kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBiaW5kaW5nJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290SW5kZXggPSBpMThuSW5kZXhTdGFja1tpMThuSW5kZXhTdGFja1BvaW50ZXItLV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0STE4biA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW3Jvb3RJbmRleCArIEhFQURFUl9PRkZTRVRdKSk7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0STE4biwgYFlvdSBzaG91bGQgY2FsbCBpMThuU3RhcnQgYmVmb3JlIGkxOG5FbmRgKTsKICAgIC8vIEZpbmQgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhZGRlZCBiZWZvcmUgYGkxOG5FbmRgCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsYXN0Q3JlYXRlZE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8vIFJlYWQgdGhlIGluc3RydWN0aW9ucyB0byBpbnNlcnQvbW92ZS9yZW1vdmUgRE9NIGVsZW1lbnRzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2aXNpdGVkTm9kZXMgPSByZWFkQ3JlYXRlT3BDb2Rlcyhyb290SW5kZXgsIHRJMThuLmNyZWF0ZSwgdFZpZXcsIGxWaWV3KTsKICAgIC8vIFJlbW92ZSBkZWxldGVkIG5vZGVzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaW5kZXggPSByb290SW5kZXggKyAxOwogICAgd2hpbGUgKGluZGV4IDw9IGxhc3RDcmVhdGVkTm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpIHsKICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmluZGV4T2YoaW5kZXgpID09PSAtMSkgewogICAgICAgICAgICByZW1vdmVOb2RlKHRWaWV3LCBsVmlldywgaW5kZXgsIC8qIG1hcmtBc0RldGFjaGVkICovIHRydWUpOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBpZiBhbiBlbGVtZW50IGhhcyBhbnkgbG9jYWwgcmVmcyBhbmQgc2tpcCB0aGVtCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGluZGV4KTsKICAgICAgICBpZiAodE5vZGUgJiYKICAgICAgICAgICAgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovIHx8IHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fAogICAgICAgICAgICAgICAgdE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSAmJgogICAgICAgICAgICB0Tm9kZS5sb2NhbE5hbWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIERpdmlkZSBieSAyIHRvIGdldCB0aGUgbnVtYmVyIG9mIGxvY2FsIHJlZnMsCiAgICAgICAgICAgIC8vIHNpbmNlIHRoZXkgYXJlIHN0b3JlZCBhcyBhbiBhcnJheSB0aGF0IGFsc28gaW5jbHVkZXMgZGlyZWN0aXZlIGluZGV4ZXMsCiAgICAgICAgICAgIC8vIGkuZS4gWyJsb2NhbFJlZiIsIGRpcmVjdGl2ZUluZGV4LCAuLi5dCiAgICAgICAgICAgIGluZGV4ICs9IHROb2RlLmxvY2FsTmFtZXMubGVuZ3RoID4+IDE7CiAgICAgICAgfQogICAgICAgIGluZGV4Kys7CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYW5kIHN0b3JlcyB0aGUgZHluYW1pYyBUTm9kZSwgYW5kIHVuaG9va3MgaXQgZnJvbSB0aGUgdHJlZSBmb3Igbm93LgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYXRpdmUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVEeW5hbWljTm9kZUF0SW5kZXgodFZpZXcsIGxWaWV3LCBpbmRleCwgdHlwZSwgbmF0aXZlLCBuYW1lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgIGxWaWV3W2luZGV4ICsgSEVBREVSX09GRlNFVF0gPSBuYXRpdmU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0Tm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIGxWaWV3W1RfSE9TVF0sIGluZGV4LCAoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBuYW1lLCBudWxsKTsKICAgIC8vIFdlIGFyZSBjcmVhdGluZyBhIGR5bmFtaWMgbm9kZSwgdGhlIHByZXZpb3VzIHROb2RlIG1pZ2h0IG5vdCBiZSBwb2ludGluZyBhdCB0aGlzIG5vZGUuCiAgICAvLyBXZSB3aWxsIGxpbmsgb3Vyc2VsdmVzIGludG8gdGhlIHRyZWUgbGF0ZXIgd2l0aCBgYXBwZW5kSTE4bk5vZGVgLgogICAgaWYgKHByZXZpb3VzT3JQYXJlbnRUTm9kZSAmJiBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9PT0gdE5vZGUpIHsKICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IG51bGw7CiAgICB9CiAgICByZXR1cm4gdE5vZGU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBjcmVhdGVPcENvZGVzCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZENyZWF0ZU9wQ29kZXMoaW5kZXgsIGNyZWF0ZU9wQ29kZXMsIHRWaWV3LCBsVmlldykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY3VycmVudFROb2RlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBwcmV2aW91c1ROb2RlID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHZpc2l0ZWROb2RlcyA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjcmVhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wQ29kZSA9IGNyZWF0ZU9wQ29kZXNbaV07CiAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Uk5vZGUgPSBjcmVhdGVUZXh0Tm9kZShvcENvZGUsIHJlbmRlcmVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZUluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUrKzsKICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTsKICAgICAgICAgICAgY3VycmVudFROb2RlID0KICAgICAgICAgICAgICAgIGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIHRleHROb2RlSW5kZXgsIDMgLyogRWxlbWVudCAqLywgdGV4dFJOb2RlLCBudWxsKTsKICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2godGV4dE5vZGVJbmRleCk7CiAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiA3IC8qIE1BU0tfT1BDT0RFICovKSB7CiAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uTm9kZUluZGV4ID0gb3BDb2RlID4+PiAxNyAvKiBTSElGVF9QQVJFTlQgKi87CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBkZXN0aW5hdGlvblROb2RlOwogICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbk5vZGVJbmRleCA9PT0gaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgYGkxOG5TdGFydGAsIHdlIGRvbid0IGhhdmUgYQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0b3AtbGV2ZWwgbm9kZSBhbmQgd2Ugc2hvdWxkIHVzZSB0aGUgaG9zdCBub2RlIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25UTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tUX0hPU1RdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGRlc3RpbmF0aW9uTm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpLCBgWW91IG5lZWQgdG8gY3JlYXRlIG9yIHNlbGVjdCBhIG5vZGUgYmVmb3JlIHlvdSBjYW4gaW5zZXJ0IGl0IGludG8gdGhlIERPTWApOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRJMThuTm9kZSh0VmlldywgKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpLCBkZXN0aW5hdGlvblROb2RlLCBwcmV2aW91c1ROb2RlLCBsVmlldyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogU2VsZWN0ICovOgogICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGluZGljaWVzIGluZGljYXRlIHRoYXQgYSBnaXZlbiBUTm9kZSBpcyBhIHNpYmxpbmcgbm9kZSwgbm90IGEgcGFyZW50IG5vZGUKICAgICAgICAgICAgICAgICAgICAvLyAoc2VlIGBpMThuU3RhcnRGaXJzdFBhc3NgIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uKS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNQYXJlbnQgPSBvcENvZGUgPj0gMDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gKGlzUGFyZW50ID8gb3BDb2RlIDogfm9wQ29kZSkgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKG5vZGVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50VE5vZGUgPSBnZXRUTm9kZSh0Vmlldywgbm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShjdXJyZW50VE5vZGUsIGlzUGFyZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDUgLyogRWxlbWVudEVuZCAqLzoKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGVsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKGN1cnJlbnRUTm9kZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0IC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROb2RlSW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0clZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyB1c2VkIGZvciBJQ1UgZXhwcmVzc2lvbnMgb25seSwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZXMvY29tcG9uZW50cyBpbiBJQ1VzLCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGlucHV0cyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKGdldFROb2RlKHRWaWV3LCBlbGVtZW50Tm9kZUluZGV4KSwgbFZpZXcsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7b3BDb2RlfSJgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3dpdGNoIChvcENvZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVF9NQVJLRVI6CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudE5vZGVJbmRleCA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWwodHlwZW9mIGNvbW1lbnRWYWx1ZSwgJ3N0cmluZycsIGBFeHBlY3RlZCAiJHtjb21tZW50VmFsdWV9IiB0byBiZSBhIGNvbW1lbnQgbm9kZSB2YWx1ZWApOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50Uk5vZGUgPSByZW5kZXJlci5jcmVhdGVDb21tZW50KGNvbW1lbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUNvbW1lbnQrKzsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUTm9kZSA9IGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIGNvbW1lbnROb2RlSW5kZXgsIDUgLyogSWN1Q29udGFpbmVyICovLCBjb21tZW50Uk5vZGUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKGNvbW1lbnROb2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21tZW50Uk5vZGUsIGxWaWV3KTsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpKS5hY3RpdmVDYXNlSW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYWRkIHRoZSBjYXNlIG5vZGVzIGxhdGVyLCBkdXJpbmcgdGhlIHVwZGF0ZSBwaGFzZQogICAgICAgICAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVMRU1FTlRfTUFSS0VSOgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROb2RlSW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKHR5cGVvZiB0YWdOYW1lVmFsdWUsICdzdHJpbmcnLCBgRXhwZWN0ZWQgIiR7dGFnTmFtZVZhbHVlfSIgdG8gYmUgYW4gZWxlbWVudCBub2RlIHRhZyBuYW1lYCk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSTm9kZSA9IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnTmFtZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlRWxlbWVudCsrOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFROb2RlID0gY3JlYXRlRHluYW1pY05vZGVBdEluZGV4KHRWaWV3LCBsVmlldywgZWxlbWVudE5vZGVJbmRleCwgMyAvKiBFbGVtZW50ICovLCBlbGVtZW50Uk5vZGUsIHRhZ05hbWVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVzLnB1c2goZWxlbWVudE5vZGVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBtdXRhdGUgb3BlcmF0aW9uIGZvciAiJHtvcENvZGV9ImApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgIHJldHVybiB2aXNpdGVkTm9kZXM7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdXBkYXRlT3BDb2RlcwogKiBAcGFyYW0gez99IGljdXMKICogQHBhcmFtIHs/fSBiaW5kaW5nc1N0YXJ0SW5kZXgKICogQHBhcmFtIHs/fSBjaGFuZ2VNYXNrCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez89fSBieXBhc3NDaGVja0JpdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVhZFVwZGF0ZU9wQ29kZXModXBkYXRlT3BDb2RlcywgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB0VmlldywgbFZpZXcsIGJ5cGFzc0NoZWNrQml0ID0gZmFsc2UpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjYXNlQ3JlYXRlZCA9IGZhbHNlOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gYml0IGNvZGUgdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGFwcGx5IHRoZSBuZXh0IHVwZGF0ZQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGVja0JpdCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzW2ldKSk7CiAgICAgICAgLy8gTnVtYmVyIG9mIG9wQ29kZXMgdG8gc2tpcCB1bnRpbCBuZXh0IHNldCBvZiB1cGRhdGUgY29kZXMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2tpcENvZGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHVwZGF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgIGlmIChieXBhc3NDaGVja0JpdCB8fCAoY2hlY2tCaXQgJiBjaGFuZ2VNYXNrKSkgewogICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSBsYXN0IGNoZWNrZWQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmFsdWUgPSAnJzsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDw9IChpICsgc2tpcENvZGVzKTsgaisrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcENvZGUgPSB1cGRhdGVPcENvZGVzW2pdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBvcENvZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3BDb2RlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wQ29kZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIGJpbmRpbmcgaW5kZXggd2hvc2UgdmFsdWUgaXMgbmVnYXRpdmUKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gcmVuZGVyU3RyaW5naWZ5KGxWaWV3W2JpbmRpbmdzU3RhcnRJbmRleCAtIG9wQ29kZV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3U7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljdVROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDMgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBBdHRyICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVGbiA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgZ2V0VE5vZGUodFZpZXcsIG5vZGVJbmRleCksIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVGbiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIFRleHQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgbm9kZUluZGV4LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogSWN1U3dpdGNoICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gYWN0aXZlIGNhc2UsIGRlbGV0ZSB0aGUgb2xkIG5vZGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNvZGVzID0gdEljdS5yZW1vdmVbaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZW1vdmVDb2Rlcy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlT3BDb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlbW92ZUNvZGVzW2tdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlbW92ZU9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogUmVtb3ZlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IHJlbW92ZU9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBET00gZWxlbWVudCwgYnV0IGRvICpub3QqIG1hcmsgVE5vZGUgYXMgZGV0YWNoZWQsIHNpbmNlIHdlIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHN3aXRjaGluZyBJQ1UgY2FzZXMgKHdoaWxlIGtlZXBpbmcgdGhlIHNhbWUgVE5vZGUpLCBzbyBhIERPTSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGluZyBhIG5ldyBJQ1UgY2FzZSB3aWxsIGJlIHJlLWNyZWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUodFZpZXcsIGxWaWV3LCBub2RlSW5kZXgsIC8qIG1hcmtBc0RldGFjaGVkICovIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2IC8qIFJlbW92ZU5lc3RlZEljdSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VOb2RlSW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAocmVtb3ZlQ29kZXNbayArIDFdKSkgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBuZXN0ZWRJY3VOb2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSBuZXN0ZWRJY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1VEluZGV4ID0gcmVtb3ZlT3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFRJY3UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWN1cykpW25lc3RlZEljdVRJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KG5lc3RlZFRJY3UucmVtb3ZlW2FjdGl2ZUluZGV4XSwgcmVtb3ZlQ29kZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYWN0aXZlIGNhc2VJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXNlSW5kZXggPSBnZXRDYXNlSW5kZXgodEljdSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCA9IGNhc2VJbmRleCAhPT0gLTEgPyBjYXNlSW5kZXggOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNlSW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGVzIGZvciB0aGUgbmV3IGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZENyZWF0ZU9wQ29kZXMoLTEsIHRJY3UuY3JlYXRlW2Nhc2VJbmRleF0sIHRWaWV3LCBsVmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VDcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogSWN1VXBkYXRlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3VJbmRleCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljdVROb2RlLmFjdGl2ZUNhc2VJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVXBkYXRlT3BDb2Rlcyh0SWN1LnVwZGF0ZVtpY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXhdLCBpY3VzLCBiaW5kaW5nc1N0YXJ0SW5kZXgsIGNoYW5nZU1hc2ssIHRWaWV3LCBsVmlldywgY2FzZUNyZWF0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpICs9IHNraXBDb2RlczsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHBhcmFtIHs/fSBtYXJrQXNEZXRhY2hlZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcmVtb3ZlTm9kZSh0VmlldywgbFZpZXcsIGluZGV4LCBtYXJrQXNEZXRhY2hlZCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVtb3ZlZFBoVE5vZGUgPSBnZXRUTm9kZSh0VmlldywgaW5kZXgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVtb3ZlZFBoUk5vZGUgPSBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldyk7CiAgICBpZiAocmVtb3ZlZFBoUk5vZGUpIHsKICAgICAgICBuYXRpdmVSZW1vdmVOb2RlKGxWaWV3W1JFTkRFUkVSXSwgcmVtb3ZlZFBoUk5vZGUpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2xvdFZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxvYWQobFZpZXcsIGluZGV4KSkpOwogICAgaWYgKGlzTENvbnRhaW5lcihzbG90VmFsdWUpKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc2xvdFZhbHVlKSk7CiAgICAgICAgaWYgKHJlbW92ZWRQaFROb2RlLnR5cGUgIT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUobFZpZXdbUkVOREVSRVJdLCBsQ29udGFpbmVyW05BVElWRV0pOwogICAgICAgIH0KICAgIH0KICAgIGlmIChtYXJrQXNEZXRhY2hlZCkgewogICAgICAgIC8vIERlZmluZSB0aGlzIG5vZGUgYXMgZGV0YWNoZWQgdG8gYXZvaWQgcHJvamVjdGluZyBpdCBsYXRlcgogICAgICAgIHJlbW92ZWRQaFROb2RlLmZsYWdzIHw9IDY0IC8qIGlzRGV0YWNoZWQgKi87CiAgICB9CiAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlTm9kZSsrOwp9Ci8qKgogKgogKiBVc2UgdGhpcyBpbnN0cnVjdGlvbiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBibG9jayB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgcGxhY2Vob2xkZXIuCiAqIEl0IGNhbGxzIGJvdGgge1xAbGluayBpMThuU3RhcnR9IGFuZCB7XEBsaW5rIGkxOG5FbmR9IGluIG9uZSBpbnN0cnVjdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heQogKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KICoKICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOgogKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmUKICogICBpbnRlcnBvbGF0ZWQgaW50by4gVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBleHByZXNzaW9uIGJpbmRpbmcgaW5kZXguIEFuIG9wdGlvbmFsCiAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nCiAqICAgYW5kIGVuZCBvZiBET00gZWxlbWVudCB0aGF0IHdlcmUgZW1iZWRkZWQgaW4gdGhlIG9yaWdpbmFsIHRyYW5zbGF0aW9uIGJsb2NrLiBUaGUgcGxhY2Vob2xkZXIKICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0CiAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICogLSBg77+9KntpbmRleH06e2Jsb2Nrfe+/vWAvYO+/vS8qe2luZGV4fTp7YmxvY2t977+9YDogKlN1Yi10ZW1wbGF0ZSBQbGFjZWhvbGRlcio6IFN1Yi10ZW1wbGF0ZXMgbXVzdCBiZQogKiAgIHNwbGl0IHVwIGFuZCB0cmFuc2xhdGVkIHNlcGFyYXRlbHkgaW4gZWFjaCBhbmd1bGFyIHRlbXBsYXRlIGZ1bmN0aW9uLiBUaGUgYGluZGV4YCBwb2ludHMgdG8gdGhlCiAqICAgYHRlbXBsYXRlYCBpbnN0cnVjdGlvbiBpbmRleC4gQSBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggb2YgdGhlIHRyYW5zbGF0aW9uIGluIHRoZSBzdGF0aWMgYmxvY2suCiAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgdHJhbnNsYXRpb24gbWVzc2FnZS4KICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleCBPcHRpb25hbCBzdWItdGVtcGxhdGUgaW5kZXggaW4gdGhlIGBtZXNzYWdlYC4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpMThuKGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KSB7CiAgICDJtcm1aTE4blN0YXJ0KGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgIMm1ybVpMThuRW5kKCk7Cn0KLyoqCiAqIE1hcmtzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGFzIHRyYW5zbGF0YWJsZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggaW4gdGhlIHN0YXRpYyBibG9jawogKiBAcGFyYW0gez99IHZhbHVlcwogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtWkxOG5BdHRyaWJ1dGVzKGluZGV4LCB2YWx1ZXMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LCBgdFZpZXcgc2hvdWxkIGJlIGRlZmluZWRgKTsKICAgIGkxOG5BdHRyaWJ1dGVzRmlyc3RQYXNzKGxWaWV3LCB0VmlldywgaW5kZXgsIHZhbHVlcyk7Cn0KLyoqCiAqIFNlZSBgaTE4bkF0dHJpYnV0ZXNgIGFib3ZlLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcGFyYW0gez99IHZhbHVlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaTE4bkF0dHJpYnV0ZXNGaXJzdFBhc3MobFZpZXcsIHRWaWV3LCBpbmRleCwgdmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcmV2aW91c0VsZW1lbnQgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudEluZGV4ID0gcHJldmlvdXNFbGVtZW50LmluZGV4IC0gSEVBREVSX09GRlNFVDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVwZGF0ZU9wQ29kZXMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHJOYW1lID0gdmFsdWVzW2ldOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXNzYWdlID0gdmFsdWVzW2kgKyAxXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFydHMgPSBtZXNzYWdlLnNwbGl0KElDVV9SRUdFWFApOwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnRzW2pdOwogICAgICAgICAgICBpZiAoaiAmIDEpIHsKICAgICAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBJQ1UgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgIC8vIFRPRE8ob2NvbWJlKTogc3VwcG9ydCBJQ1UgZXhwcmVzc2lvbnMgaW4gYXR0cmlidXRlcwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJQ1UgZXhwcmVzc2lvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzKQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaGFzQmluZGluZyA9ICEhdmFsdWUubWF0Y2goQklORElOR19SRUdFWFApOwogICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzICYmIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXModmFsdWUsIHByZXZpb3VzRWxlbWVudEluZGV4LCBhdHRyTmFtZSksIHVwZGF0ZU9wQ29kZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFROb2RlKHRWaWV3LCBwcmV2aW91c0VsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGF0dHJpYnV0ZXMgZm9yIEVsZW1lbnRzIG9ubHksIGZvciBvdGhlciB0eXBlcyAobGlrZSBFbGVtZW50Q29udGFpbmVyKSwKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHNldCBpbnB1dHMgYmVsb3cKICAgICAgICAgICAgICAgICAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCB2YWx1ZSwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoYXQgYXR0cmlidXRlIGlzIGEgZGlyZWN0aXZlIGlucHV0CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFWYWx1ZSA9IHROb2RlLmlucHV0cyAhPT0gbnVsbCAmJiB0Tm9kZS5pbnB1dHNbYXR0ck5hbWVdOwogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXRzRm9yUHJvcGVydHkodFZpZXcsIGxWaWV3LCBkYXRhVmFsdWUsIGF0dHJOYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlJbmRleChwcmV2aW91c0VsZW1lbnRJbmRleCwgbFZpZXcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZ1JlZmxlY3RQcm9wZXJ0aWVzKGxWaWV3LCBlbGVtZW50LCB0Tm9kZS50eXBlLCBkYXRhVmFsdWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID09PSBudWxsKSB7CiAgICAgICAgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID0gdXBkYXRlT3BDb2RlczsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmxldCBjaGFuZ2VNYXNrID0gMGIwOwovKiogQHR5cGUgez99ICovCmxldCBzaGlmdHNDb3VudGVyID0gMDsKLyoqCiAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBiaW5kaW5ncyBkdXJpbmcgZWFjaCB1cGRhdGUgY3ljbGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8KICogdXBkYXRlIHRoZSB0cmFuc2xhdGVkIG5vZGVzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgYmluZGluZydzIHZhbHVlCiAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogKiAoZS5nLiBgaTE4bkV4cChjdHgubmFtZSkoY3R4LnRpdGxlKWApCiAqCiAqLwpmdW5jdGlvbiDJtcm1aTE4bkV4cCh2YWx1ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgaWYgKGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBuZXh0QmluZGluZ0luZGV4KCksIHZhbHVlKSkgewogICAgICAgIGNoYW5nZU1hc2sgPSBjaGFuZ2VNYXNrIHwgKDEgPDwgc2hpZnRzQ291bnRlcik7CiAgICB9CiAgICBzaGlmdHNDb3VudGVyKys7CiAgICByZXR1cm4gybXJtWkxOG5FeHA7Cn0KLyoqCiAqIFVwZGF0ZXMgYSB0cmFuc2xhdGlvbiBibG9jayBvciBhbiBpMThuIGF0dHJpYnV0ZSB3aGVuIHRoZSBiaW5kaW5ncyBoYXZlIGNoYW5nZWQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIGVpdGhlciB7XEBsaW5rIGkxOG5TdGFydH0gKHRyYW5zbGF0aW9uIGJsb2NrKSBvciB7XEBsaW5rIGkxOG5BdHRyaWJ1dGVzfQogKiAoaTE4biBhdHRyaWJ1dGUpIG9uIHdoaWNoIGl0IHNob3VsZCB1cGRhdGUgdGhlIGNvbnRlbnQuCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1aTE4bkFwcGx5KGluZGV4KSB7CiAgICBpZiAoc2hpZnRzQ291bnRlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIGB0VmlldyBzaG91bGQgYmUgZGVmaW5lZGApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0STE4biA9IHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHVwZGF0ZU9wQ29kZXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpY3VzID0gbnVsbDsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0STE4bikpIHsKICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9ICgvKiogQHR5cGUgez99ICovICh0STE4bikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdXBkYXRlT3BDb2RlcyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodEkxOG4pKSkudXBkYXRlOwogICAgICAgICAgICBpY3VzID0gKCgvKiogQHR5cGUgez99ICovICh0STE4bikpKS5pY3VzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ3NTdGFydEluZGV4ID0gZ2V0QmluZGluZ0luZGV4KCkgLSBzaGlmdHNDb3VudGVyIC0gMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIHJlYWRVcGRhdGVPcENvZGVzKHVwZGF0ZU9wQ29kZXMsIGljdXMsIGJpbmRpbmdzU3RhcnRJbmRleCwgY2hhbmdlTWFzaywgdFZpZXcsIGxWaWV3KTsKICAgICAgICAvLyBSZXNldCBjaGFuZ2VNYXNrICYgbWFza0JpdCB0byBkZWZhdWx0IGZvciB0aGUgbmV4dCB1cGRhdGUgY3ljbGUKICAgICAgICBjaGFuZ2VNYXNrID0gMGIwOwogICAgICAgIHNoaWZ0c0NvdW50ZXIgPSAwOwogICAgfQp9Ci8qKgogKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjYXNlIG9mIGFuIElDVSBleHByZXNzaW9uIGRlcGVuZGluZyBvbiB0aGUgbWFpbiBiaW5kaW5nIHZhbHVlCiAqCiAqIEBwYXJhbSB7P30gaWN1RXhwcmVzc2lvbgogKiBAcGFyYW0gez99IGJpbmRpbmdWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG1haW4gYmluZGluZyB1c2VkIGJ5IHRoaXMgSUNVIGV4cHJlc3Npb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldENhc2VJbmRleChpY3VFeHByZXNzaW9uLCBiaW5kaW5nVmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmRleCA9IGljdUV4cHJlc3Npb24uY2FzZXMuaW5kZXhPZihiaW5kaW5nVmFsdWUpOwogICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgIHN3aXRjaCAoaWN1RXhwcmVzc2lvbi50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgMSAvKiBwbHVyYWwgKi86IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2FzZSA9IGdldFBsdXJhbENhc2UoYmluZGluZ1ZhbHVlLCBnZXRMb2NhbGVJZCgpKTsKICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKHJlc29sdmVkQ2FzZSk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xICYmIHJlc29sdmVkQ2FzZSAhPT0gJ290aGVyJykgewogICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKCdvdGhlcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAwIC8qIHNlbGVjdCAqLzogewogICAgICAgICAgICAgICAgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YoJ290aGVyJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBpbmRleDsKfQovKioKICogR2VuZXJhdGUgdGhlIE9wQ29kZXMgZm9yIElDVSBleHByZXNzaW9ucy4KICoKICogQHBhcmFtIHs/fSB0SWN1cwogKiBAcGFyYW0gez99IGljdUV4cHJlc3Npb24KICogQHBhcmFtIHs/fSBzdGFydEluZGV4CiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGljdVN0YXJ0KHRJY3VzLCBpY3VFeHByZXNzaW9uLCBzdGFydEluZGV4LCBleHBhbmRvU3RhcnRJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3JlYXRlQ29kZXMgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlbW92ZUNvZGVzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1cGRhdGVDb2RlcyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdmFycyA9IFtdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2hpbGRJY3VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gRWFjaCB2YWx1ZSBpcyBhbiBhcnJheSBvZiBzdHJpbmdzICYgb3RoZXIgSUNVIGV4cHJlc3Npb25zCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlQXJyID0gaWN1RXhwcmVzc2lvbi52YWx1ZXNbaV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5lc3RlZEljdXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlQXJyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUFycltqXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzIGFuIG5lc3RlZCBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaWN1SW5kZXggPSBuZXN0ZWRJY3VzLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpIC0gMTsKICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgbmVzdGVkIElDVSBleHByZXNzaW9uIGJ5IGEgY29tbWVudCBub2RlCiAgICAgICAgICAgICAgICB2YWx1ZUFycltqXSA9IGA8IS0t77+9JHtpY3VJbmRleH3vv70tLT5gOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpY3VDYXNlID0gcGFyc2VJY3VDYXNlKHZhbHVlQXJyLmpvaW4oJycpLCBzdGFydEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpOwogICAgICAgIGNyZWF0ZUNvZGVzLnB1c2goaWN1Q2FzZS5jcmVhdGUpOwogICAgICAgIHJlbW92ZUNvZGVzLnB1c2goaWN1Q2FzZS5yZW1vdmUpOwogICAgICAgIHVwZGF0ZUNvZGVzLnB1c2goaWN1Q2FzZS51cGRhdGUpOwogICAgICAgIHZhcnMucHVzaChpY3VDYXNlLnZhcnMpOwogICAgICAgIGNoaWxkSWN1cy5wdXNoKGljdUNhc2UuY2hpbGRJY3VzKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRJY3UgPSB7CiAgICAgICAgdHlwZTogaWN1RXhwcmVzc2lvbi50eXBlLAogICAgICAgIHZhcnMsCiAgICAgICAgY2hpbGRJY3VzLAogICAgICAgIGNhc2VzOiBpY3VFeHByZXNzaW9uLmNhc2VzLAogICAgICAgIGNyZWF0ZTogY3JlYXRlQ29kZXMsCiAgICAgICAgcmVtb3ZlOiByZW1vdmVDb2RlcywKICAgICAgICB1cGRhdGU6IHVwZGF0ZUNvZGVzCiAgICB9OwogICAgdEljdXMucHVzaCh0SWN1KTsKICAgIC8vIEFkZGluZyB0aGUgbWF4aW11bSBwb3NzaWJsZSBvZiB2YXJzIG5lZWRlZCAoYmFzZWQgb24gdGhlIGNhc2VzIHdpdGggdGhlIG1vc3QgdmFycykKICAgIGkxOG5WYXJzQ291bnQgKz0gTWF0aC5tYXgoLi4udmFycyk7Cn0KLyoqCiAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgdGVtcGxhdGUgaW50byBhbiBIVE1MIHRlbXBsYXRlIGFuZCBhIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgdG8gdXBkYXRlCiAqIGF0dHJpYnV0ZXMgb3Igbm9kZXMgdGhhdCBjb250YWluIGJpbmRpbmdzLgogKgogKiBAcGFyYW0gez99IHVuc2FmZUh0bWwgVGhlIHN0cmluZyB0byBwYXJzZQogKiBAcGFyYW0gez99IHBhcmVudEluZGV4CiAqIEBwYXJhbSB7P30gbmVzdGVkSWN1cwogKiBAcGFyYW0gez99IHRJY3VzCiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlSWN1Q2FzZSh1bnNhZmVIdG1sLCBwYXJlbnRJbmRleCwgbmVzdGVkSWN1cywgdEljdXMsIGV4cGFuZG9TdGFydEluZGV4KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbmVydEJvZHlIZWxwZXIgPSBuZXcgSW5lcnRCb2R5SGVscGVyKGdldERvY3VtZW50KCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgaWYgKCFpbmVydEJvZHlFbGVtZW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2VuZXJhdGUgaW5lcnQgYm9keSBlbGVtZW50Jyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB3cmFwcGVyID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFRlbXBsYXRlQ29udGVudCgoLyoqIEB0eXBlIHs/fSAqLyAoaW5lcnRCb2R5RWxlbWVudCkpKSkpIHx8IGluZXJ0Qm9keUVsZW1lbnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvcENvZGVzID0geyB2YXJzOiAwLCBjaGlsZEljdXM6IFtdLCBjcmVhdGU6IFtdLCByZW1vdmU6IFtdLCB1cGRhdGU6IFtdIH07CiAgICBwYXJzZU5vZGVzKHdyYXBwZXIuZmlyc3RDaGlsZCwgb3BDb2RlcywgcGFyZW50SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCk7CiAgICByZXR1cm4gb3BDb2RlczsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IE5FU1RFRF9JQ1UgPSAv77+9KFxkKynvv70vOwovKioKICogUGFyc2VzIGEgbm9kZSwgaXRzIGNoaWxkcmVuIGFuZCBpdHMgc2libGluZ3MsIGFuZCBnZW5lcmF0ZXMgdGhlIG11dGF0ZSAmIHVwZGF0ZSBPcENvZGVzLgogKgogKiBAcGFyYW0gez99IGN1cnJlbnROb2RlIFRoZSBmaXJzdCBub2RlIHRvIHBhcnNlCiAqIEBwYXJhbSB7P30gaWN1Q2FzZSBUaGUgZGF0YSBmb3IgdGhlIElDVSBleHByZXNzaW9uIGNhc2UgdGhhdCBjb250YWlucyB0aG9zZSBub2RlcwogKiBAcGFyYW0gez99IHBhcmVudEluZGV4IEluZGV4IG9mIHRoZSBjdXJyZW50IG5vZGUncyBwYXJlbnQKICogQHBhcmFtIHs/fSBuZXN0ZWRJY3VzIERhdGEgZm9yIHRoZSBuZXN0ZWQgSUNVIGV4cHJlc3Npb25zIHRoYXQgdGhpcyBjYXNlIGNvbnRhaW5zCiAqIEBwYXJhbSB7P30gdEljdXMgRGF0YSBmb3IgYWxsIElDVSBleHByZXNzaW9ucyBvZiB0aGUgY3VycmVudCBtZXNzYWdlCiAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXggRXhwYW5kbyBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgSUNVIGV4cHJlc3Npb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlTm9kZXMoY3VycmVudE5vZGUsIGljdUNhc2UsIHBhcmVudEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpIHsKICAgIGlmIChjdXJyZW50Tm9kZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXN0ZWRJY3VzVG9DcmVhdGUgPSBbXTsKICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0luZGV4ID0gZXhwYW5kb1N0YXJ0SW5kZXggKyArK2ljdUNhc2UudmFyczsKICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5ub2RlVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50Tm9kZSkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgdmFsaWQgZWxlbWVudCwgd2Ugd29uJ3QgY3JlYXRlIGFuIGVsZW1lbnQgZm9yIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChFTEVNRU5UX01BUktFUiwgdGFnTmFtZSwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsQXR0cnMgPSBlbGVtZW50LmF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxBdHRycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ciA9ICgvKiogQHR5cGUgez99ICovIChlbEF0dHJzLml0ZW0oaSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSAhIWF0dHIudmFsdWUubWF0Y2goQklORElOR19SRUdFWFApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBpbnB1dCBzdHJpbmcgaXMgc2FmZSwgdW5sZXNzIGl0J3MgdXNpbmcgYSBiaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmluZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlckF0dHJOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVJJX0FUVFJTW2xvd2VyQXR0ck5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXMoYXR0ci52YWx1ZSwgbmV3SW5kZXgsIGF0dHIubmFtZSwgX3Nhbml0aXplVXJsKSwgaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlckF0dHJOYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUsIHNhbml0aXplU3Jjc2V0KSwgaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUpLCBpY3VDYXNlLnVwZGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBpZ25vcmluZyB1bnNhZmUgYXR0cmlidXRlIHZhbHVlICR7bG93ZXJBdHRyTmFtZX0gb24gZWxlbWVudCAke3RhZ05hbWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UuY3JlYXRlLnB1c2gobmV3SW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCA0IC8qIEF0dHIgKi8sIGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSAoaWYgYW55KQogICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5vZGVzKGN1cnJlbnROb2RlLmZpcnN0Q2hpbGQsIGljdUNhc2UsIG5ld0luZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCBub2RlIGFmdGVyIHRoZSBjaGlsZHJlbgogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnJlbW92ZS5wdXNoKG5ld0luZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgMyAvKiBSZW1vdmUgKi8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSB2YWx1ZS5tYXRjaChCSU5ESU5HX1JFR0VYUCk7CiAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChoYXNCaW5kaW5nID8gJycgOiB2YWx1ZSwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgIGljdUNhc2UucmVtb3ZlLnB1c2gobmV3SW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIFJlbW92ZSAqLyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHZhbHVlLCBuZXdJbmRleCksIGljdUNhc2UudXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb21tZW50IG5vZGUgaXMgYSBwbGFjZWhvbGRlciBmb3IgYSBuZXN0ZWQgSUNVCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gTkVTVEVEX0lDVS5leGVjKGN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VJbmRleCA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3TG9jYWwgPSBuZ0Rldk1vZGUgPyBgbmVzdGVkIElDVSAke25lc3RlZEljdUluZGV4fWAgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tZW50IG5vZGUgdGhhdCB3aWxsIGFuY2hvciB0aGUgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChDT01NRU5UX01BUktFUiwgbmV3TG9jYWwsIG5ld0luZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3UgPSBuZXN0ZWRJY3VzW25lc3RlZEljdUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkSWN1c1RvQ3JlYXRlLnB1c2goW25lc3RlZEljdSwgbmV3SW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnZhcnMtLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgZWxlbWVudAogICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKG5leHROb2RlKSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVzdGVkSWN1c1RvQ3JlYXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1ID0gbmVzdGVkSWN1c1RvQ3JlYXRlW2ldWzBdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdU5vZGVJbmRleCA9IG5lc3RlZEljdXNUb0NyZWF0ZVtpXVsxXTsKICAgICAgICAgICAgaWN1U3RhcnQodEljdXMsIG5lc3RlZEljdSwgbmVzdGVkSWN1Tm9kZUluZGV4LCBleHBhbmRvU3RhcnRJbmRleCArIGljdUNhc2UudmFycyk7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgcmVjdXJzaXZlLCB0aGUgbGFzdCBUSWN1IHRoYXQgd2FzIHB1c2hlZCBpcyB0aGUgb25lIHdlIHdhbnQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXN0VEljdUluZGV4ID0gdEljdXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgaWN1Q2FzZS52YXJzICs9IE1hdGgubWF4KC4uLnRJY3VzW25lc3RUSWN1SW5kZXhdLnZhcnMpOwogICAgICAgICAgICBpY3VDYXNlLmNoaWxkSWN1cy5wdXNoKG5lc3RUSWN1SW5kZXgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBnZXRCaW5kaW5nTWFzayhuZXN0ZWRJY3UpOwogICAgICAgICAgICBpY3VDYXNlLnVwZGF0ZS5wdXNoKHRvTWFza0JpdChuZXN0ZWRJY3UubWFpbkJpbmRpbmcpLCAvLyBtYXNrIG9mIHRoZSBtYWluIGJpbmRpbmcKICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgLTEgLSBuZXN0ZWRJY3UubWFpbkJpbmRpbmcsIG5lc3RlZEljdU5vZGVJbmRleCA8PCAyIC8qIFNISUZUX1JFRiAqLyB8IDIgLyogSWN1U3dpdGNoICovLCBuZXN0VEljdUluZGV4LCBtYXNrLCAvLyBtYXNrIG9mIGFsbCB0aGUgYmluZGluZ3Mgb2YgdGhpcyBJQ1UgZXhwcmVzc2lvbgogICAgICAgICAgICAyLCAvLyBza2lwIDIgb3BDb2RlcyBpZiBub3QgY2hhbmdlZAogICAgICAgICAgICBuZXN0ZWRJY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgbmVzdFRJY3VJbmRleCk7CiAgICAgICAgICAgIGljdUNhc2UucmVtb3ZlLnB1c2gobmVzdFRJY3VJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDYgLyogUmVtb3ZlTmVzdGVkSWN1ICovLCBuZXN0ZWRJY3VOb2RlSW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIFJlbW92ZSAqLyk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBBbmd1bGFyIERhcnQgaW50cm9kdWNlZCAmbmdzcDsgYXMgYSBwbGFjZWhvbGRlciBmb3Igbm9uLXJlbW92YWJsZSBzcGFjZSwgc2VlOgogKiBodHRwczovL2dpdGh1Yi5jb20vZGFydC1sYW5nL2FuZ3VsYXIvYmxvYi8wYmI2MTEzODdkMjlkNjViNWFmN2Y5ZDI1MTVhYjU3MWZkM2ZiZWU0L190ZXN0cy90ZXN0L2NvbXBpbGVyL3ByZXNlcnZlX3doaXRlc3BhY2VfdGVzdC5kYXJ0I0wyNS1MMzIKICogSW4gQW5ndWxhciBEYXJ0ICZuZ3NwOyBpcyBjb252ZXJ0ZWQgdG8gdGhlIDB4RTUwMCBQVUEgKFByaXZhdGUgVXNlIEFyZWFzKSB1bmljb2RlIGNoYXJhY3RlcgogKiBhbmQgbGF0ZXIgb24gcmVwbGFjZWQgYnkgYSBzcGFjZS4gV2UgYXJlIHJlLWltcGxlbWVudGluZyB0aGUgc2FtZSBpZGVhIGhlcmUsIHNpbmNlIHRyYW5zbGF0aW9ucwogKiBtaWdodCBjb250YWluIHRoaXMgc3BlY2lhbCBjaGFyYWN0ZXIuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTkdTUF9VTklDT0RFX1JFR0VYUCA9IC9cdUU1MDAvZzsKLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlcGxhY2VOZ3NwKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShOR1NQX1VOSUNPREVfUkVHRVhQLCAnICcpOwp9Ci8qKgogKiBUaGUgbG9jYWxlIGlkIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGN1cnJlbnRseSB1c2luZyAoZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zKS4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqIEB0eXBlIHs/fQogKi8KbGV0IExPQ0FMRV9JRCA9IERFRkFVTFRfTE9DQUxFX0lEOwovKioKICogU2V0cyB0aGUgbG9jYWxlIGlkIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMgYW5kIElDVSBleHByZXNzaW9ucy4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbG9jYWxlSWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldExvY2FsZUlkKGxvY2FsZUlkKSB7CiAgICBhc3NlcnREZWZpbmVkKGxvY2FsZUlkLCBgRXhwZWN0ZWQgbG9jYWxlSWQgdG8gYmUgZGVmaW5lZGApOwogICAgaWYgKHR5cGVvZiBsb2NhbGVJZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICBMT0NBTEVfSUQgPSBsb2NhbGVJZC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgJy0nKTsKICAgIH0KfQovKioKICogR2V0cyB0aGUgbG9jYWxlIGlkIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMgYW5kIElDVSBleHByZXNzaW9ucy4KICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogKiBidXQgaXMgbm93IGRlZmluZWQgYXMgYSBnbG9iYWwgdmFsdWUuCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVJZCgpIHsKICAgIHJldHVybiBMT0NBTEVfSUQ7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeV9yZWdpc3RyYXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIE1hcCBvZiBtb2R1bGUtaWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmdNb2R1bGUuCiAqIC0gSW4gcHJlIEl2eSB3ZSB0cmFjayBOZ01vZHVsZUZhY3RvcnksCiAqIC0gSW4gcG9zdCBJdnkgd2UgdHJhY2sgdGhlIE5nTW9kdWxlVHlwZQogKiBAdHlwZSB7P30KICovCmNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKCk7Ci8qKgogKiBAcGFyYW0gez99IGlkCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IGluY29taW5nCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhc3NlcnRTYW1lT3JOb3RFeGlzdGluZyhpZCwgdHlwZSwgaW5jb21pbmcpIHsKICAgIGlmICh0eXBlICYmIHR5cGUgIT09IGluY29taW5nKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgbW9kdWxlIHJlZ2lzdGVyZWQgZm9yICR7aWR9IC0gJHtzdHJpbmdpZnkodHlwZSl9IHZzICR7c3RyaW5naWZ5KHR5cGUubmFtZSl9YCk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWdpc3Rlck5nTW9kdWxlVHlwZShuZ01vZHVsZVR5cGUpIHsKICAgIGlmIChuZ01vZHVsZVR5cGUuybVtb2QuaWQgIT09IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWQgPSBuZ01vZHVsZVR5cGUuybVtb2QuaWQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4aXN0aW5nID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZXMuZ2V0KGlkKSkpOwogICAgICAgIGFzc2VydFNhbWVPck5vdEV4aXN0aW5nKGlkLCBleGlzdGluZywgbmdNb2R1bGVUeXBlKTsKICAgICAgICBtb2R1bGVzLnNldChpZCwgbmdNb2R1bGVUeXBlKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbXBvcnRzID0gbmdNb2R1bGVUeXBlLsm1bW9kLmltcG9ydHM7CiAgICBpZiAoaW1wb3J0cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgaW1wb3J0cyA9IGltcG9ydHMoKTsKICAgIH0KICAgIGlmIChpbXBvcnRzKSB7CiAgICAgICAgaW1wb3J0cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGkgPT4gcmVnaXN0ZXJOZ01vZHVsZVR5cGUoKC8qKiBAdHlwZSB7P30gKi8gKGkpKSkpKTsKICAgIH0KfQovKioKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE5nTW9kdWxlUmVmJDEgZXh0ZW5kcyBOZ01vZHVsZVJlZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez99IF9wYXJlbnQKICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGVUeXBlLCBfcGFyZW50KSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50OwogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgIHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMgPSBbXTsKICAgICAgICB0aGlzLmluamVjdG9yID0gdGhpczsKICAgICAgICB0aGlzLmRlc3Ryb3lDYnMgPSBbXTsKICAgICAgICAvLyBXaGVuIGJvb3RzdHJhcHBpbmcgYSBtb2R1bGUgd2UgaGF2ZSBhIGRlcGVuZGVuY3kgZ3JhcGggdGhhdCBsb29rcyBsaWtlIHRoaXM6CiAgICAgICAgLy8gQXBwbGljYXRpb25SZWYgLT4gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIC0+IE5nTW9kdWxlUmVmLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoZQogICAgICAgIC8vIG1vZHVsZSBiZWluZyByZXNvbHZlZCB0cmllcyB0byBpbmplY3QgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgaXQnbGwgY3JlYXRlIGEKICAgICAgICAvLyBjaXJjdWxhciBkZXBlbmRlbmN5IHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgcnVudGltZSBlcnJvciwgYmVjYXVzZSB0aGUgaW5qZWN0b3IgZG9lc24ndAogICAgICAgIC8vIGV4aXN0IHlldC4gV2Ugd29yayBhcm91bmQgdGhlIGlzc3VlIGJ5IGNyZWF0aW5nIHRoZSBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgb3Vyc2VsdmVzCiAgICAgICAgLy8gYW5kIHByb3ZpZGluZyBpdCwgcmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgaW5qZWN0b3IgcmVzb2x2ZSBpdC4KICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IG5ldyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIkMSh0aGlzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZihuZ01vZHVsZVR5cGUpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnREZWZpbmVkKG5nTW9kdWxlRGVmLCBgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICdOZ01vZHVsZVR5cGUnLmApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ0xvY2FsZUlkRGVmID0gZ2V0TmdMb2NhbGVJZERlZihuZ01vZHVsZVR5cGUpOwogICAgICAgIG5nTG9jYWxlSWREZWYgJiYgc2V0TG9jYWxlSWQobmdMb2NhbGVJZERlZik7CiAgICAgICAgdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cyA9IG1heWJlVW53cmFwRm4oKC8qKiBAdHlwZSB7P30gKi8gKG5nTW9kdWxlRGVmKSkuYm9vdHN0cmFwKTsKICAgICAgICB0aGlzLl9yM0luamVjdG9yID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZUluamVjdG9yV2l0aG91dEluamVjdG9ySW5zdGFuY2VzKG5nTW9kdWxlVHlwZSwgX3BhcmVudCwgWwogICAgICAgICAgICB7IHByb3ZpZGU6IE5nTW9kdWxlUmVmLCB1c2VWYWx1ZTogdGhpcyB9LCB7CiAgICAgICAgICAgICAgICBwcm92aWRlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsCiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgICAgfQogICAgICAgIF0sIHN0cmluZ2lmeShuZ01vZHVsZVR5cGUpKSkpOwogICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgaW5qZWN0b3IgdHlwZXMgc2VwYXJhdGVseSBmcm9tIHRoZSBpbmplY3RvciBjcmVhdGlvbiwgYmVjYXVzZQogICAgICAgIC8vIHRoZSBtb2R1bGUgbWlnaHQgYmUgdHJ5aW5nIHRvIHVzZSB0aGlzIHJlZiBpbiBpdHMgY29udHJ1Y3RvciBmb3IgREkgd2hpY2ggd2lsbCBjYXVzZSBhCiAgICAgICAgLy8gY2lyY3VsYXIgZXJyb3IgdGhhdCB3aWxsIGV2ZW50dWFsbHkgZXJyb3Igb3V0LCBiZWNhdXNlIHRoZSBpbmplY3RvciBpc24ndCBjcmVhdGVkIHlldC4KICAgICAgICB0aGlzLl9yM0luamVjdG9yLl9yZXNvbHZlSW5qZWN0b3JEZWZUeXBlcygpOwogICAgICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLmdldChuZ01vZHVsZVR5cGUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlCiAgICAgKiBAcGFyYW0gez89fSBpbmplY3RGbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlID0gSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5ELCBpbmplY3RGbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQpIHsKICAgICAgICBpZiAodG9rZW4gPT09IEluamVjdG9yIHx8IHRva2VuID09PSBOZ01vZHVsZVJlZiB8fCB0b2tlbiA9PT0gSU5KRUNUT1IpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9yM0luamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgaW5qZWN0RmxhZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5fcjNJbmplY3RvcjsKICAgICAgICAhaW5qZWN0b3IuZGVzdHJveWVkICYmIGluamVjdG9yLmRlc3Ryb3koKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5kZXN0cm95Q2JzKSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7CiAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVzdHJveUNicykpLnB1c2goY2FsbGJhY2spOwogICAgfQp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdNb2R1bGVGYWN0b3J5JDEgZXh0ZW5kcyBOZ01vZHVsZUZhY3RvcnkgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqLwogICAgY29uc3RydWN0b3IobW9kdWxlVHlwZSkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5tb2R1bGVUeXBlID0gbW9kdWxlVHlwZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKTsKICAgICAgICBpZiAobmdNb2R1bGVEZWYgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIE5nTW9kdWxlIHdpdGggQW5ndWxhcidzIG1vZHVsZSByZWdpc3RyeS4gVGhlIGxvY2F0aW9uIChhbmQgaGVuY2UgdGltaW5nKSBvZgogICAgICAgICAgICAvLyB0aGlzIGNhbGwgaXMgY3JpdGljYWwgdG8gZW5zdXJlIHRoaXMgd29ya3MgY29ycmVjdGx5IChtb2R1bGVzIGdldCByZWdpc3RlcmVkIHdoZW4gZXhwZWN0ZWQpCiAgICAgICAgICAgIC8vIHdpdGhvdXQgYmxvYXRpbmcgYnVuZGxlcyAobW9kdWxlcyBhcmUgcmVnaXN0ZXJlZCB3aGVuIG90aGVyd2lzZSBub3QgcmVmZXJlbmNlZCkuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEluIFZpZXcgRW5naW5lLCByZWdpc3RyYXRpb24gb2NjdXJzIGluIHRoZSAubmdmYWN0b3J5LmpzIGZpbGUgYXMgYSBzaWRlIGVmZmVjdC4gVGhpcyBoYXMKICAgICAgICAgICAgLy8gc2V2ZXJhbCBwcmFjdGljYWwgY29uc2VxdWVuY2VzOgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAtIElmIGFuIC5uZ2ZhY3RvcnkgZmlsZSBpcyBub3QgaW1wb3J0ZWQgZnJvbSwgdGhlIG1vZHVsZSB3b24ndCBiZSByZWdpc3RlcmVkIChhbmQgY2FuIGJlCiAgICAgICAgICAgIC8vICAgdHJlZSBzaGFrZW4pLgogICAgICAgICAgICAvLyAtIElmIGFuIC5uZ2ZhY3RvcnkgZmlsZSBpcyBpbXBvcnRlZCBmcm9tLCB0aGUgbW9kdWxlIHdpbGwgYmUgcmVnaXN0ZXJlZCBldmVuIGlmIGFuIGluc3RhbmNlCiAgICAgICAgICAgIC8vICAgaXMgbm90IGFjdHVhbGx5IGNyZWF0ZWQgKHZpYSBgY3JlYXRlYCBiZWxvdykuCiAgICAgICAgICAgIC8vIC0gU2luY2UgYW4gLm5nZmFjdG9yeSBmaWxlIGluIFZpZXcgRW5naW5lIHJlZmVyZW5jZXMgdGhlIC5uZ2ZhY3RvcnkgZmlsZXMgb2YgdGhlIE5nTW9kdWxlJ3MKICAgICAgICAgICAgLy8gICBpbXBvcnRzLAogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBJbiBJdnksIHRoaW5ncyBhcmUgYSBiaXQgZGlmZmVyZW50LiAubmdmYWN0b3J5IGZpbGVzIHN0aWxsIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5LCBidXQgYXJlCiAgICAgICAgICAgIC8vIG5vdCBhIHJlcXVpcmVkIEFQSSB0byB1c2UgLSB0aGVyZSBhcmUgb3RoZXIgd2F5cyB0byBvYnRhaW4gYW4gTmdNb2R1bGVGYWN0b3J5IGZvciBhIGdpdmVuCiAgICAgICAgICAgIC8vIE5nTW9kdWxlLiBUaHVzLCByZWx5aW5nIG9uIGEgc2lkZSBlZmZlY3QgaW4gdGhlIC5uZ2ZhY3RvcnkgZmlsZSBpcyBub3Qgc3VmZmljaWVudC4gSW5zdGVhZCwKICAgICAgICAgICAgLy8gdGhlIHNpZGUgZWZmZWN0IG9mIHJlZ2lzdHJhdGlvbiBpcyBhZGRlZCBoZXJlLCBpbiB0aGUgY29uc3RydWN0b3Igb2YgTmdNb2R1bGVGYWN0b3J5LAogICAgICAgICAgICAvLyBlbnN1cmluZyBubyBtYXR0ZXIgaG93IGEgZmFjdG9yeSBpcyBjcmVhdGVkLCB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQgY29ycmVjdGx5LgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBpbmNsdWRlIHRoZSByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3QgaW5saW5lIGZvbGxvd2luZyB0aGUgYWN0dWFsCiAgICAgICAgICAgIC8vIE5nTW9kdWxlIGRlZmluaXRpb24uIFRoaXMgYWxzbyBoYXMgdGhlIGNvcnJlY3QgdGltaW5nLCBidXQgYnJlYWtzIHRyZWUtc2hha2luZyAtIG1vZHVsZXMKICAgICAgICAgICAgLy8gd2lsbCBiZSByZWdpc3RlcmVkIGFuZCByZXRhaW5lZCBldmVuIGlmIHRoZXkncmUgb3RoZXJ3aXNlIG5ldmVyIHJlZmVyZW5jZWQuCiAgICAgICAgICAgIHJlZ2lzdGVyTmdNb2R1bGVUeXBlKCgvKiogQHR5cGUgez99ICovIChtb2R1bGVUeXBlKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXJlbnRJbmplY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlKHBhcmVudEluamVjdG9yKSB7CiAgICAgICAgcmV0dXJuIG5ldyBOZ01vZHVsZVJlZiQxKHRoaXMubW9kdWxlVHlwZSwgcGFyZW50SW5qZWN0b3IpOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3B1cmVfZnVuY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEJpbmRpbmdzIGZvciBwdXJlIGZ1bmN0aW9ucyBhcmUgc3RvcmVkIGFmdGVyIHJlZ3VsYXIgYmluZGluZ3MuCiAqCiAqIHwtLS0tLS0tZGVjbHMtLS0tLS18LS0tLS0tLS0tdmFycy0tLS0tLS0tLXwgICAgICAgICAgICAgICAgIHwtLS0tLSBob3N0VmFycyAoZGlyMSkgLS0tLS0tfAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogfCBub2Rlcy9yZWZzL3BpcGVzIHwgYmluZGluZ3MgfCBmbiBzbG90cyAgfCBpbmplY3RvciB8IGRpcjEgfCBob3N0IGJpbmRpbmdzIHwgaG9zdCBzbG90cyB8CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICBeCiAqICAgICAgVFZpZXcuYmluZGluZ1N0YXJ0SW5kZXggICAgICBUVmlldy5leHBhbmRvU3RhcnRJbmRleAogKgogKiBQdXJlIGZ1bmN0aW9uIGluc3RydWN0aW9ucyBhcmUgZ2l2ZW4gYW4gb2Zmc2V0IGZyb20gdGhlIGJpbmRpbmcgcm9vdC4gQWRkaW5nIHRoZSBvZmZzZXQgdG8gdGhlCiAqIGJpbmRpbmcgcm9vdCBnaXZlcyB0aGUgZmlyc3QgaW5kZXggd2hlcmUgdGhlIGJpbmRpbmdzIGFyZSBzdG9yZWQuIEluIGNvbXBvbmVudCB2aWV3cywgdGhlIGJpbmRpbmcKICogcm9vdCBpcyB0aGUgYmluZGluZ1N0YXJ0SW5kZXguIEluIGhvc3QgYmluZGluZ3MsIHRoZSBiaW5kaW5nIHJvb3QgaXMgdGhlIGV4cGFuZG9TdGFydEluZGV4ICsKICogYW55IGRpcmVjdGl2ZSBpbnN0YW5jZXMgKyBhbnkgaG9zdFZhcnMgaW4gZGlyZWN0aXZlcyBldmFsdWF0ZWQgYmVmb3JlIGl0LgogKgogKiBTZWUgVklFV19EQVRBLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvc3QgYmluZGluZyByZXNvbHV0aW9uLgogKi8KLyoqCiAqIElmIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBzYXZlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gc3RvcmUgYW5kIHJldHVybiB0aGUKICogdmFsdWUuIElmIGl0IGhhcyBiZWVuIHNhdmVkLCByZXR1cm5zIHRoZSBzYXZlZCB2YWx1ZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjAoc2xvdE9mZnNldCwgcHVyZUZuLCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdID09PSBOT19DSEFOR0UgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcpIDogcHVyZUZuKCkpIDoKICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXgpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIHVwZGF0ZWQgdmFsdWUKICogQHBhcmFtIHs/fSBleHAgVXBkYXRlZCBleHByZXNzaW9uIHZhbHVlCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjEoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpIHsKICAgIHJldHVybiBwdXJlRnVuY3Rpb24xSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb24yKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvbjJJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAqCiAqLwpmdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uMyhzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIHRoaXNBcmcpIHsKICAgIHJldHVybiBwdXJlRnVuY3Rpb24zSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKTsKfQovKioKICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuCiAqIEBwYXJhbSB7P30gZXhwMQogKiBAcGFyYW0gez99IGV4cDIKICogQHBhcmFtIHs/fSBleHAzCiAqIEBwYXJhbSB7P30gZXhwNAogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb240KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvbjRJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIHRoaXNBcmcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb241KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIGV4cDUpIHx8IGRpZmZlcmVudCA/CiAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgNSwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpIDoKICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpKSA6CiAgICAgICAgZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgNSk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogKiBAcGFyYW0gez99IHB1cmVGbgogKiBAcGFyYW0gez99IGV4cDEKICogQHBhcmFtIHs/fSBleHAyCiAqIEBwYXJhbSB7P30gZXhwMwogKiBAcGFyYW0gez99IGV4cDQKICogQHBhcmFtIHs/fSBleHA1CiAqIEBwYXJhbSB7P30gZXhwNgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb242KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez99IGV4cDYKICogQHBhcmFtIHs/fSBleHA3CiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjcoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDcsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDcpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7P30gZXhwNQogKiBAcGFyYW0gez99IGV4cDYKICogQHBhcmFtIHs/fSBleHA3CiAqIEBwYXJhbSB7P30gZXhwOAogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb244KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSB8fCBkaWZmZXJlbnQgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSA6CiAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSkgOgogICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDgpOwp9Ci8qKgogKiBwdXJlRnVuY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gc3VwcG9ydCBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzLgogKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXkKICogY29udGFpbmluZyB0aG9zZSB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZXhwcyBBbiBhcnJheSBvZiBiaW5kaW5nIHZhbHVlcwogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICoKICovCmZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb25WKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgcmV0dXJuIHB1cmVGdW5jdGlvblZJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cHMsIHRoaXNBcmcpOwp9Ci8qKgogKiBSZXN1bHRzIG9mIGEgcHVyZSBmdW5jdGlvbiBpbnZvY2F0aW9uIGFyZSBzdG9yZWQgaW4gTFZpZXcgaW4gYSBkZWRpY2F0ZWQgc2xvdCB0aGF0IGlzIGluaXRpYWxpemVkCiAqIHRvIE5PX0NIQU5HRS4gSW4gcmFyZSBzaXR1YXRpb25zIGEgcHVyZSBwaXBlIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbiBvbiB0aGUgdmVyeSBmaXJzdAogKiBpbnZvY2F0aW9uIGFuZCBub3QgcHJvZHVjZSBhbnkgdmFsaWQgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIExWaWV3IHdvdWxkIGtlZXAgaG9sZGluZyB0aGUgTk9fQ0hBTkdFCiAqIHZhbHVlLiBUaGUgTk9fQ0hBTkdFIGlzIG5vdCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gdXNlIGluIGV4cHJlc3Npb25zIC8gYmluZGluZ3MgdGh1cyB3ZSBjb252ZXJ0CiAqIGl0IHRvIGB1bmRlZmluZWRgLgogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gcmV0dXJuVmFsdWVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIHJldHVyblZhbHVlSW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgcmV0dXJuVmFsdWVJbmRleCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsYXN0UmV0dXJuVmFsdWUgPSBsVmlld1tyZXR1cm5WYWx1ZUluZGV4XTsKICAgIHJldHVybiBsYXN0UmV0dXJuVmFsdWUgPT09IE5PX0NIQU5HRSA/IHVuZGVmaW5lZCA6IGxhc3RSZXR1cm5WYWx1ZTsKfQovKioKICogSWYgdGhlIHZhbHVlIG9mIHRoZSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICoKICogQHBhcmFtIHs/fSBsVmlldyBMVmlldyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCiAqIEBwYXJhbSB7P30gYmluZGluZ1Jvb3QgQmluZGluZyByb290IGluZGV4LgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogKiBAcGFyYW0gez99IHB1cmVGbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gdXBkYXRlZCB2YWx1ZQogKiBAcGFyYW0gez99IGV4cCBVcGRhdGVkIGV4cHJlc3Npb24gdmFsdWUKICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAqLwpmdW5jdGlvbiBwdXJlRnVuY3Rpb24xSW50ZXJuYWwobFZpZXcsIGJpbmRpbmdSb290LCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cCwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cCkgPwogICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDEsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHApIDogcHVyZUZuKGV4cCkpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMSk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICovCmZ1bmN0aW9uIHB1cmVGdW5jdGlvbjJJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkMihsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyKSA/CiAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMiwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIpIDogcHVyZUZuKGV4cDEsIGV4cDIpKSA6CiAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCArIDIpOwp9Ci8qKgogKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogKgogKiBAcGFyYW0gez99IGxWaWV3IExWaWV3IGluIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBleGVjdXRlZC4KICogQHBhcmFtIHs/fSBiaW5kaW5nUm9vdCBCaW5kaW5nIHJvb3QgaW5kZXguCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAqIEBwYXJhbSB7P30gcHVyZUZuCiAqIEBwYXJhbSB7P30gZXhwMQogKiBAcGFyYW0gez99IGV4cDIKICogQHBhcmFtIHs/fSBleHAzCiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKi8KZnVuY3Rpb24gcHVyZUZ1bmN0aW9uM0ludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBiaW5kaW5nUm9vdCArIHNsb3RPZmZzZXQ7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMpID8KICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAzLCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMykgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMykpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMyk7Cn0KLyoqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4KICogQHBhcmFtIHs/fSBleHAxCiAqIEBwYXJhbSB7P30gZXhwMgogKiBAcGFyYW0gez99IGV4cDMKICogQHBhcmFtIHs/fSBleHA0CiAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogKgogKi8KZnVuY3Rpb24gcHVyZUZ1bmN0aW9uNEludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCB0aGlzQXJnKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBiaW5kaW5nUm9vdCArIHNsb3RPZmZzZXQ7CiAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpID8KICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkpIDoKICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgNCk7Cn0KLyoqCiAqIHB1cmVGdW5jdGlvbiBpbnN0cnVjdGlvbiB0aGF0IGNhbiBzdXBwb3J0IGFueSBudW1iZXIgb2YgYmluZGluZ3MuCiAqCiAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAqCiAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICogQHBhcmFtIHs/fSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXkKICogY29udGFpbmluZyB0aG9zZSB2YWx1ZXMuCiAqIEBwYXJhbSB7P30gZXhwcyBBbiBhcnJheSBvZiBiaW5kaW5nIHZhbHVlcwogKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICovCmZ1bmN0aW9uIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGJpbmRpbmdJbmRleCA9IGJpbmRpbmdSb290ICsgc2xvdE9mZnNldDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkaWZmZXJlbnQgPSBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgrKywgZXhwc1tpXSkgJiYgKGRpZmZlcmVudCA9IHRydWUpOwogICAgfQogICAgcmV0dXJuIGRpZmZlcmVudCA/IHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgcHVyZUZuLmFwcGx5KHRoaXNBcmcsIGV4cHMpKSA6CiAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ3JlYXRlIGEgcGlwZS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3aWxsIGJlIHN0b3JlZC4KICogQHBhcmFtIHs/fSBwaXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGlwZQogKiBAcmV0dXJuIHs/fSBUIHRoZSBpbnN0YW5jZSBvZiB0aGUgcGlwZS4KICoKICovCmZ1bmN0aW9uIMm1ybVwaXBlKGluZGV4LCBwaXBlTmFtZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBpcGVEZWY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIHBpcGVEZWYgPSBnZXRQaXBlRGVmJDEocGlwZU5hbWUsIHRWaWV3LnBpcGVSZWdpc3RyeSk7CiAgICAgICAgdFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSA9IHBpcGVEZWY7CiAgICAgICAgaWYgKHBpcGVEZWYub25EZXN0cm95KSB7CiAgICAgICAgICAgICh0Vmlldy5kZXN0cm95SG9va3MgfHwgKHRWaWV3LmRlc3Ryb3lIb29rcyA9IFtdKSkucHVzaChhZGp1c3RlZEluZGV4LCBwaXBlRGVmLm9uRGVzdHJveSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgcGlwZURlZiA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlRmFjdG9yeSA9IHBpcGVEZWYuZmFjdG9yeSB8fCAocGlwZURlZi5mYWN0b3J5ID0gZ2V0RmFjdG9yeURlZihwaXBlRGVmLnR5cGUsIHRydWUpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbijJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IHBpcGVGYWN0b3J5KCk7CiAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgIHN0b3JlKHRWaWV3LCBnZXRMVmlldygpLCBpbmRleCwgcGlwZUluc3RhbmNlKTsKICAgIHJldHVybiBwaXBlSW5zdGFuY2U7Cn0KLyoqCiAqIFNlYXJjaGVzIHRoZSBwaXBlIHJlZ2lzdHJ5IGZvciBhIHBpcGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgb25lIGlzIGZvdW5kLAogKiByZXR1cm5zIHRoZSBwaXBlLiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHRocm93biBiZWNhdXNlIHRoZSBwaXBlIGNhbm5vdCBiZSByZXNvbHZlZC4KICoKICogQHBhcmFtIHs/fSBuYW1lIE5hbWUgb2YgcGlwZSB0byByZXNvbHZlCiAqIEBwYXJhbSB7P30gcmVnaXN0cnkgRnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBwaXBlcwogKiBAcmV0dXJuIHs/fSBNYXRjaGluZyBQaXBlRGVmCiAqLwpmdW5jdGlvbiBnZXRQaXBlRGVmJDEobmFtZSwgcmVnaXN0cnkpIHsKICAgIGlmIChyZWdpc3RyeSkgewogICAgICAgIGZvciAobGV0IGkgPSByZWdpc3RyeS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBpcGVEZWYgPSByZWdpc3RyeVtpXTsKICAgICAgICAgICAgaWYgKG5hbWUgPT09IHBpcGVEZWYubmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBpcGVEZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwaXBlICcke25hbWV9JyBjb3VsZCBub3QgYmUgZm91bmQhYCk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggMSBhcmd1bWVudHMuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlCiAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXBpcGVCaW5kMShpbmRleCwgc2xvdE9mZnNldCwgdjEpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IGxvYWQobFZpZXcsIGluZGV4KTsKICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgcHVyZUZ1bmN0aW9uMUludGVybmFsKGxWaWV3LCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgcGlwZUluc3RhbmNlKSA6CiAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSh2MSkpOwp9Ci8qKgogKiBJbnZva2VzIGEgcGlwZSB3aXRoIDIgYXJndW1lbnRzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZwogKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZQogKiBAcGFyYW0gez99IHYxIDFzdCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cGlwZUJpbmQyKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBpcGVJbnN0YW5jZSA9IGxvYWQobFZpZXcsIGluZGV4KTsKICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgcHVyZUZ1bmN0aW9uMkludGVybmFsKGxWaWV3LCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgdjIsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0odjEsIHYyKSk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggMyBhcmd1bWVudHMuCiAqCiAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uCiAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlCiAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKiBAcGFyYW0gez99IHYyIDJuZCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MyA0cmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiDJtcm1cGlwZUJpbmQzKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIsIHYzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPyBwdXJlRnVuY3Rpb24zSW50ZXJuYWwobFZpZXcsIGdldEJpbmRpbmdSb290KCksIHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCB2MiwgdjMsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0odjEsIHYyLCB2MykpOwp9Ci8qKgogKiBJbnZva2VzIGEgcGlwZSB3aXRoIDQgYXJndW1lbnRzLgogKgogKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZwogKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICoKICogXEBjb2RlR2VuQXBpCiAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZQogKiBAcGFyYW0gez99IHYxIDFzdCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAqIEBwYXJhbSB7P30gdjMgM3JkIGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogKiBAcGFyYW0gez99IHY0IDR0aCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICoKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVwaXBlQmluZDQoaW5kZXgsIHNsb3RPZmZzZXQsIHYxLCB2MiwgdjMsIHY0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPyBwdXJlRnVuY3Rpb240SW50ZXJuYWwobFZpZXcsIGdldEJpbmRpbmdSb290KCksIHNsb3RPZmZzZXQsIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0sIHYxLCB2MiwgdjMsIHY0LCBwaXBlSW5zdGFuY2UpIDoKICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0KSk7Cn0KLyoqCiAqIEludm9rZXMgYSBwaXBlIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICoKICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gaW52b2tpbmcKICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi4KICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2UKICogQHBhcmFtIHs/fSB2YWx1ZXMgQXJyYXkgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gbWV0aG9kLgogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXBpcGVCaW5kVihpbmRleCwgc2xvdE9mZnNldCwgdmFsdWVzKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICByZXR1cm4gdW53cmFwVmFsdWUkMShsVmlldywgaXNQdXJlKGxWaWV3LCBpbmRleCkgPwogICAgICAgIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdmFsdWVzLCBwaXBlSW5zdGFuY2UpIDoKICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLmFwcGx5KHBpcGVJbnN0YW5jZSwgdmFsdWVzKSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBpbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNQdXJlKGxWaWV3LCBpbmRleCkgewogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbVFZJRVddLmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSkpKS5wdXJlOwp9Ci8qKgogKiBVbndyYXAgdGhlIG91dHB1dCBvZiBhIHBpcGUgdHJhbnNmb3JtYXRpb24uCiAqIEluIG9yZGVyIHRvIHRyaWNrIGNoYW5nZSBkZXRlY3Rpb24gaW50byBjb25zaWRlcmluZyB0aGF0IHRoZSBuZXcgdmFsdWUgaXMgYWx3YXlzIGRpZmZlcmVudCBmcm9tCiAqIHRoZSBvbGQgb25lLCB0aGUgb2xkIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGJ5IE5PX0NIQU5HRS4KICoKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IG5ld1ZhbHVlIHRoZSBwaXBlIHRyYW5zZm9ybWF0aW9uIG91dHB1dC4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVud3JhcFZhbHVlJDEobFZpZXcsIG5ld1ZhbHVlKSB7CiAgICBpZiAoV3JhcHBlZFZhbHVlLmlzV3JhcHBlZChuZXdWYWx1ZSkpIHsKICAgICAgICBuZXdWYWx1ZSA9IFdyYXBwZWRWYWx1ZS51bndyYXAobmV3VmFsdWUpOwogICAgICAgIC8vIFRoZSBOT19DSEFOR0UgdmFsdWUgbmVlZHMgdG8gYmUgd3JpdHRlbiBhdCB0aGUgaW5kZXggd2hlcmUgdGhlIGltcGFjdGVkIGJpbmRpbmcgdmFsdWUgaXMKICAgICAgICAvLyBzdG9yZWQKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ1RvSW52YWxpZGF0ZUlkeCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgICAgIGxWaWV3W2JpbmRpbmdUb0ludmFsaWRhdGVJZHhdID0gTk9fQ0hBTkdFOwogICAgfQogICAgcmV0dXJuIG5ld1ZhbHVlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9ldmVudF9lbWl0dGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBVc2UgaW4gY29tcG9uZW50cyB3aXRoIHRoZSBgXEBPdXRwdXRgIGRpcmVjdGl2ZSB0byBlbWl0IGN1c3RvbSBldmVudHMKICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSwgYW5kIHJlZ2lzdGVyIGhhbmRsZXJzIGZvciB0aG9zZSBldmVudHMKICogYnkgc3Vic2NyaWJpbmcgdG8gYW4gaW5zdGFuY2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiBFeHRlbmRzCiAqIFtSeEpTIGBTdWJqZWN0YF0oaHR0cHM6Ly9yeGpzLmRldi9hcGkvaW5kZXgvY2xhc3MvU3ViamVjdCkKICogZm9yIEFuZ3VsYXIgYnkgYWRkaW5nIHRoZSBgZW1pdCgpYCBtZXRob2QuCiAqCiAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYSBjb21wb25lbnQgZGVmaW5lcyB0d28gb3V0cHV0IHByb3BlcnRpZXMKICogdGhhdCBjcmVhdGUgZXZlbnQgZW1pdHRlcnMuIFdoZW4gdGhlIHRpdGxlIGlzIGNsaWNrZWQsIHRoZSBlbWl0dGVyCiAqIGVtaXRzIGFuIG9wZW4gb3IgY2xvc2UgZXZlbnQgdG8gdG9nZ2xlIHRoZSBjdXJyZW50IHZpc2liaWxpdHkgc3RhdGUuCiAqCiAqIGBgYGh0bWwKICogXEBDb21wb25lbnQoewogKiAgIHNlbGVjdG9yOiAnemlwcHknLAogKiAgIHRlbXBsYXRlOiBgCiAqICAgPGRpdiBjbGFzcz0iemlwcHkiPgogKiAgICAgPGRpdiAoY2xpY2spPSJ0b2dnbGUoKSI+VG9nZ2xlPC9kaXY+CiAqICAgICA8ZGl2IFtoaWRkZW5dPSIhdmlzaWJsZSI+CiAqICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD4KICogICAgIDwvZGl2PgogKiAgPC9kaXY+YH0pCiAqIGV4cG9ydCBjbGFzcyBaaXBweSB7CiAqICAgdmlzaWJsZTogYm9vbGVhbiA9IHRydWU7CiAqIFxAT3V0cHV0KCkgb3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAqIFxAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogKgogKiAgIHRvZ2dsZSgpIHsKICogICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7CiAqICAgICBpZiAodGhpcy52aXNpYmxlKSB7CiAqICAgICAgIHRoaXMub3Blbi5lbWl0KG51bGwpOwogKiAgICAgfSBlbHNlIHsKICogICAgICAgdGhpcy5jbG9zZS5lbWl0KG51bGwpOwogKiAgICAgfQogKiAgIH0KICogfQogKiBgYGAKICoKICogQWNjZXNzIHRoZSBldmVudCBvYmplY3Qgd2l0aCB0aGUgYCRldmVudGAgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBvdXRwdXQgZXZlbnQKICogaGFuZGxlcjoKICoKICogYGBgaHRtbAogKiA8emlwcHkgKG9wZW4pPSJvbk9wZW4oJGV2ZW50KSIgKGNsb3NlKT0ib25DbG9zZSgkZXZlbnQpIj48L3ppcHB5PgogKiBgYGAKICoKICogQHNlZSBbT2JzZXJ2YWJsZXMgaW4gQW5ndWxhcl0oZ3VpZGUvb2JzZXJ2YWJsZXMtaW4tYW5ndWxhcikKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIEV2ZW50RW1pdHRlciBleHRlbmRzIFN1YmplY3QgewogICAgLy8gdHNsaW50OmRpc2FibGUtbGluZQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBjYW4KICAgICAqIGRlbGl2ZXIgZXZlbnRzIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gaXNBc3luYyBXaGVuIHRydWUsIGRlbGl2ZXIgZXZlbnRzIGFzeW5jaHJvbm91c2x5LgogICAgICoKICAgICAqLwogICAgY29uc3RydWN0b3IoaXNBc3luYyA9IGZhbHNlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9faXNBc3luYyA9IGlzQXN5bmM7CiAgICB9CiAgICAvKioKICAgICAqIEVtaXRzIGFuIGV2ZW50IGNvbnRhaW5pbmcgYSBnaXZlbiB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSB2YWx1ZSB0byBlbWl0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZW1pdCh2YWx1ZSkgewogICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgaGFuZGxlcnMgZm9yIGV2ZW50cyBlbWl0dGVkIGJ5IHRoaXMgaW5zdGFuY2UuCiAgICAgKiBAcGFyYW0gez89fSBnZW5lcmF0b3JPck5leHQgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgZW1pdHRlZCBldmVudHMuCiAgICAgKiBAcGFyYW0gez89fSBlcnJvciBXaGVuIHN1cHBsaWVkLCBhIGN1c3RvbSBoYW5kbGVyIGZvciBhbiBlcnJvciBub3RpZmljYXRpb24KICAgICAqIGZyb20gdGhpcyBlbWl0dGVyLgogICAgICogQHBhcmFtIHs/PX0gY29tcGxldGUgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgYSBjb21wbGV0aW9uCiAgICAgKiBub3RpZmljYXRpb24gZnJvbSB0aGlzIGVtaXR0ZXIuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdWJzY3JpYmUoZ2VuZXJhdG9yT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNjaGVkdWxlckZuOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZXJyb3JGbiA9ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGVycikgPT4gbnVsbCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb21wbGV0ZUZuID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gbnVsbCk7CiAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dCAmJiB0eXBlb2YgZ2VuZXJhdG9yT3JOZXh0ID09PSAnb2JqZWN0JykgewogICAgICAgICAgICBzY2hlZHVsZXJGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpKSk7CiAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuZXJyb3IpIHsKICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBnZW5lcmF0b3JPck5leHQuZXJyb3IoZXJyKSkpOwogICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0LmNvbXBsZXRlKCkpKTsKICAgICAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNjaGVkdWxlckZuID0gdGhpcy5fX2lzQXN5bmMgPyAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBnZW5lcmF0b3JPck5leHQodmFsdWUpKSk7CiAgICAgICAgICAgIH0pIDogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBlcnJvcihlcnIpKSk7CiAgICAgICAgICAgICAgICB9KSA6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb21wbGV0ZSkgewogICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gY29tcGxldGUoKSkpOwogICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzaW5rID0gc3VwZXIuc3Vic2NyaWJlKHNjaGVkdWxlckZuLCBlcnJvckZuLCBjb21wbGV0ZUZuKTsKICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5hZGQoc2luayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzaW5rOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvcXVlcnlfbGlzdC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHRlbXBsYXRlIFQKICogQHRoaXMgez99CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzeW1ib2xJdGVyYXRvcigpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpKS5fcmVzdWx0cykpKVtnZXRTeW1ib2xJdGVyYXRvciQxKCldKCk7Cn0KLyoqCiAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZW1zIHRoYXQgQW5ndWxhciBrZWVwcyB1cCB0byBkYXRlIHdoZW4gdGhlIHN0YXRlCiAqIG9mIHRoZSBhcHBsaWNhdGlvbiBjaGFuZ2VzLgogKgogKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCB7XEBsaW5rIFZpZXdDaGlsZHJlbn0sIHtcQGxpbmsgQ29udGVudENoaWxkcmVufSwgYW5kIHtcQGxpbmsgUXVlcnlMaXN0fQogKiBwcm92aWRlLgogKgogKiBJbXBsZW1lbnRzIGFuIGl0ZXJhYmxlIGludGVyZmFjZSwgdGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIGluIGJvdGggRVM2CiAqIGphdmFzY3JpcHQgYGZvciAodmFyIGkgb2YgaXRlbXMpYCBsb29wcyBhcyB3ZWxsIGFzIGluIEFuZ3VsYXIgdGVtcGxhdGVzIHdpdGgKICogYCpuZ0Zvcj0ibGV0IGkgb2YgbXlMaXN0ImAuCiAqCiAqIENoYW5nZXMgY2FuIGJlIG9ic2VydmVkIGJ5IHN1YnNjcmliaW5nIHRvIHRoZSBjaGFuZ2VzIGBPYnNlcnZhYmxlYC4KICoKICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKiBgYGB0eXBlc2NyaXB0CiAqIFxAQ29tcG9uZW50KHsuLi59KQogKiBjbGFzcyBDb250YWluZXIgewogKiBcQFZpZXdDaGlsZHJlbihJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT47CiAqIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBRdWVyeUxpc3QgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7CiAgICAgICAgdGhpcy5fcmVzdWx0cyA9IFtdOwogICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVjbGFyZWQgb24gdGhlIHByb3RvdHlwZSwgYnV0IGRvaW5nIHNvIHRoZXJlIHdpbGwgY2F1c2UgdGhlIGNsYXNzCiAgICAgICAgLy8gZGVjbGFyYXRpb24gdG8gaGF2ZSBzaWRlLWVmZmVjdHMgYW5kIGJlY29tZSBub3QgdHJlZS1zaGFrYWJsZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvIGl0IGluCiAgICAgICAgLy8gdGhlIGNvbnN0cnVjdG9yLgogICAgICAgIC8vIFtnZXRTeW1ib2xJdGVyYXRvcigpXSgpOiBJdGVyYXRvcjxUPiB7IC4uLiB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN5bWJvbCA9IGdldFN5bWJvbEl0ZXJhdG9yJDEoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoUXVlcnlMaXN0LnByb3RvdHlwZSkpOwogICAgICAgIGlmICghcHJvdG9bc3ltYm9sXSkKICAgICAgICAgICAgcHJvdG9bc3ltYm9sXSA9IHN5bWJvbEl0ZXJhdG9yOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5tYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkKICAgICAqIEB0ZW1wbGF0ZSBVCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtYXAoZm4pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5tYXAoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5maWx0ZXJdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbHRlcikKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbHRlcihmbikgewogICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcihmbik7CiAgICB9CiAgICAvKioKICAgICAqIFNlZQogICAgICogW0FycmF5LmZpbmRdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2ZpbmQpCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kKGZuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmluZChmbik7CiAgICB9CiAgICAvKioKICAgICAqIFNlZQogICAgICogW0FycmF5LnJlZHVjZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvcmVkdWNlKQogICAgICogQHRlbXBsYXRlIFUKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEBwYXJhbSB7P30gaW5pdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVkdWNlKGZuLCBpbml0KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKGZuLCBpbml0KTsKICAgIH0KICAgIC8qKgogICAgICogU2VlCiAgICAgKiBbQXJyYXkuZm9yRWFjaF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCkKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvckVhY2goZm4pIHsKICAgICAgICB0aGlzLl9yZXN1bHRzLmZvckVhY2goZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUKICAgICAqIFtBcnJheS5zb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKQogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc29tZShmbikgewogICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLnNvbWUoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcmVzdWx0cyBsaXN0IGFzIGFuIEFycmF5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9BcnJheSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy50b1N0cmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBzdG9yZWQgZGF0YSBvZiB0aGUgcXVlcnkgbGlzdCwgYW5kIHJlc2V0cyB0aGUgYGRpcnR5YCBmbGFnIHRvIGBmYWxzZWAsIHNvIHRoYXQKICAgICAqIG9uIGNoYW5nZSBkZXRlY3Rpb24sIGl0IHdpbGwgbm90IG5vdGlmeSBvZiBjaGFuZ2VzIHRvIHRoZSBxdWVyaWVzLCB1bmxlc3MgYSBuZXcgY2hhbmdlCiAgICAgKiBvY2N1cnMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByZXN1bHRzVHJlZSBUaGUgcXVlcnkgcmVzdWx0cyB0byBzdG9yZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVzZXQocmVzdWx0c1RyZWUpIHsKICAgICAgICB0aGlzLl9yZXN1bHRzID0gZmxhdHRlbihyZXN1bHRzVHJlZSk7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxlbmd0aCA9IHRoaXMuX3Jlc3VsdHMubGVuZ3RoOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sYXN0ID0gdGhpcy5fcmVzdWx0c1t0aGlzLmxlbmd0aCAtIDFdOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5maXJzdCA9IHRoaXMuX3Jlc3VsdHNbMF07CiAgICB9CiAgICAvKioKICAgICAqIFRyaWdnZXJzIGEgY2hhbmdlIGV2ZW50IGJ5IGVtaXR0aW5nIG9uIHRoZSBgY2hhbmdlc2Age1xAbGluayBFdmVudEVtaXR0ZXJ9LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbm90aWZ5T25DaGFuZ2VzKCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5jaGFuZ2VzKSkpLmVtaXQodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXREaXJ0eSgpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuZGlydHkgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBpbnRlcm5hbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY2hhbmdlcykpKS5jb21wbGV0ZSgpOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5jaGFuZ2VzKSkpLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqLwpjbGFzcyBMUXVlcnlfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBxdWVyeUxpc3QKICAgICAqLwogICAgY29uc3RydWN0b3IocXVlcnlMaXN0KSB7CiAgICAgICAgdGhpcy5xdWVyeUxpc3QgPSBxdWVyeUxpc3Q7CiAgICAgICAgdGhpcy5tYXRjaGVzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xvbmUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMUXVlcnlfKHRoaXMucXVlcnlMaXN0KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0RGlydHkoKSB7CiAgICAgICAgdGhpcy5xdWVyeUxpc3Quc2V0RGlydHkoKTsKICAgIH0KfQpjbGFzcyBMUXVlcmllc18gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBxdWVyaWVzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHF1ZXJpZXMgPSBbXSkgewogICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUVtYmVkZGVkVmlldyh0VmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UXVlcmllcyA9IHRWaWV3LnF1ZXJpZXM7CiAgICAgICAgaWYgKHRRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbm9PZkluaGVyaXRlZFF1ZXJpZXMgPSB0Vmlldy5jb250ZW50UXVlcmllcyAhPT0gbnVsbCA/IHRWaWV3LmNvbnRlbnRRdWVyaWVzWzBdIDogdFF1ZXJpZXMubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdMUXVlcmllcyA9IFtdOwogICAgICAgICAgICAvLyBBbiBlbWJlZGRlZCB2aWV3IGhhcyBxdWVyaWVzIHByb3BhZ2F0ZWQgZnJvbSBhIGRlY2xhcmF0aW9uIHZpZXcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgICAgICAgICAgLy8gVFF1ZXJpZXMgY29sbGVjdGlvbiBhbmQgdXAgdW50aWwgYSBmaXJzdCBjb250ZW50IHF1ZXJ5IGRlY2xhcmVkIGluIHRoZSBlbWJlZGRlZCB2aWV3LiBPbmx5CiAgICAgICAgICAgIC8vIHByb3BhZ2F0ZWQgTFF1ZXJpZXMgYXJlIGNyZWF0ZWQgYXQgdGhpcyBwb2ludCAoTFF1ZXJ5IGNvcnJlc3BvbmRpbmcgdG8gZGVjbGFyZWQgY29udGVudAogICAgICAgICAgICAvLyBxdWVyaWVzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGZyb20gdGhlIGNvbnRlbnQgcXVlcnkgaW5zdHJ1Y3Rpb25zIGZvciBlYWNoIGRpcmVjdGl2ZSkuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9PZkluaGVyaXRlZFF1ZXJpZXM7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdFF1ZXJ5ID0gdFF1ZXJpZXMuZ2V0QnlJbmRleChpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudExRdWVyeSA9IHRoaXMucXVlcmllc1t0UXVlcnkuaW5kZXhJbkRlY2xhcmF0aW9uVmlld107CiAgICAgICAgICAgICAgICB2aWV3TFF1ZXJpZXMucHVzaChwYXJlbnRMUXVlcnkuY2xvbmUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBMUXVlcmllc18odmlld0xRdWVyaWVzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGluc2VydFZpZXcodFZpZXcpIHsKICAgICAgICB0aGlzLmRpcnR5UXVlcmllc1dpdGhNYXRjaGVzKHRWaWV3KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGV0YWNoVmlldyh0VmlldykgewogICAgICAgIHRoaXMuZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModFZpZXcpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZ2V0VFF1ZXJ5KHRWaWV3LCBpKS5tYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0uc2V0RGlydHkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpjbGFzcyBUUXVlcnlNZXRhZGF0YV8gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZQogICAgICogQHBhcmFtIHs/fSBkZXNjZW5kYW50cwogICAgICogQHBhcmFtIHs/fSBpc1N0YXRpYwogICAgICogQHBhcmFtIHs/PX0gcmVhZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihwcmVkaWNhdGUsIGRlc2NlbmRhbnRzLCBpc1N0YXRpYywgcmVhZCA9IG51bGwpIHsKICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHByZWRpY2F0ZTsKICAgICAgICB0aGlzLmRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHM7CiAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogICAgICAgIHRoaXMucmVhZCA9IHJlYWQ7CiAgICB9Cn0KY2xhc3MgVFF1ZXJpZXNfIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gcXVlcmllcwogICAgICovCiAgICBjb25zdHJ1Y3RvcihxdWVyaWVzID0gW10pIHsKICAgICAgICB0aGlzLnF1ZXJpZXMgPSBxdWVyaWVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0VmlldywgJ1F1ZXJpZXMgc2hvdWxkIGNvbGxlY3QgcmVzdWx0cyBvbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcyBvbmx5Jyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5xdWVyaWVzW2ldLmVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZWxlbWVudEVuZCh0Tm9kZSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMucXVlcmllc1tpXS5lbGVtZW50RW5kKHROb2RlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVtYmVkZGVkVFZpZXcodE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZiA9IG51bGw7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hpbGRRdWVyeUluZGV4ID0gcXVlcmllc0ZvclRlbXBsYXRlUmVmICE9PSBudWxsID8gcXVlcmllc0ZvclRlbXBsYXRlUmVmLmxlbmd0aCA6IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHF1ZXJ5Q2xvbmUgPSB0aGlzLmdldEJ5SW5kZXgoaSkuZW1iZWRkZWRUVmlldyh0Tm9kZSwgY2hpbGRRdWVyeUluZGV4KTsKICAgICAgICAgICAgaWYgKHRxdWVyeUNsb25lKSB7CiAgICAgICAgICAgICAgICB0cXVlcnlDbG9uZS5pbmRleEluRGVjbGFyYXRpb25WaWV3ID0gaTsKICAgICAgICAgICAgICAgIGlmIChxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBxdWVyaWVzRm9yVGVtcGxhdGVSZWYucHVzaCh0cXVlcnlDbG9uZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgPSBbdHF1ZXJ5Q2xvbmVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwgPyBuZXcgVFF1ZXJpZXNfKHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZikgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0ZW1wbGF0ZSh0VmlldywgdE5vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3LCAnUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0udGVtcGxhdGUodFZpZXcsIHROb2RlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEJ5SW5kZXgoaW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UodGhpcy5xdWVyaWVzLCBpbmRleCk7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcmllc1tpbmRleF07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcmllcy5sZW5ndGg7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFjayh0cXVlcnkpIHsKICAgICAgICB0aGlzLnF1ZXJpZXMucHVzaCh0cXVlcnkpOwogICAgfQp9CmNsYXNzIFRRdWVyeV8gewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez89fSBub2RlSW5kZXgKICAgICAqLwogICAgY29uc3RydWN0b3IobWV0YWRhdGEsIG5vZGVJbmRleCA9IC0xKSB7CiAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgIHRoaXMubWF0Y2hlcyA9IG51bGw7CiAgICAgICAgdGhpcy5pbmRleEluRGVjbGFyYXRpb25WaWV3ID0gLTE7CiAgICAgICAgdGhpcy5jcm9zc2VzTmdUZW1wbGF0ZSA9IGZhbHNlOwogICAgICAgIC8qKgogICAgICAgICAqIEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgZ2l2ZW4gcXVlcnkgc3RpbGwgYXBwbGllcyB0byBub2RlcyBpdCBpcyBjcm9zc2luZy4gV2UgdXNlIHRoaXMgZmxhZwogICAgICAgICAqIChhbG9uZ3NpZGUgd2l0aCBfZGVjbGFyYXRpb25Ob2RlSW5kZXgpIHRvIGtub3cgd2hlbiB0byBzdG9wIGFwcGx5aW5nIGNvbnRlbnQgcXVlcmllcyB0bwogICAgICAgICAqIGVsZW1lbnRzIGluIGEgdGVtcGxhdGUuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYXBwbGllc1RvTmV4dE5vZGUgPSB0cnVlOwogICAgICAgIHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4ID0gbm9kZUluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuaXNBcHBseWluZ1RvTm9kZSh0Tm9kZSkpIHsKICAgICAgICAgICAgdGhpcy5tYXRjaFROb2RlKHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbGVtZW50RW5kKHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4ID09PSB0Tm9kZS5pbmRleCkgewogICAgICAgICAgICB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZSA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdGVtcGxhdGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgdGhpcy5lbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBjaGlsZFF1ZXJ5SW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGVtYmVkZGVkVFZpZXcodE5vZGUsIGNoaWxkUXVlcnlJbmRleCkgewogICAgICAgIGlmICh0aGlzLmlzQXBwbHlpbmdUb05vZGUodE5vZGUpKSB7CiAgICAgICAgICAgIHRoaXMuY3Jvc3Nlc05nVGVtcGxhdGUgPSB0cnVlOwogICAgICAgICAgICAvLyBBIG1hcmtlciBpbmRpY2F0aW5nIGEgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQgKGEgcGxhY2Vob2xkZXIgZm9yIHF1ZXJ5IHJlc3VsdHMgZnJvbQogICAgICAgICAgICAvLyBlbWJlZGRlZCB2aWV3cyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMgYDxuZy10ZW1wbGF0ZT5gKS4KICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCgtdE5vZGUuaW5kZXgsIGNoaWxkUXVlcnlJbmRleCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVFF1ZXJ5Xyh0aGlzLm1ldGFkYXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc0FwcGx5aW5nVG9Ob2RlKHROb2RlKSB7CiAgICAgICAgaWYgKHRoaXMuX2FwcGxpZXNUb05leHROb2RlICYmIHRoaXMubWV0YWRhdGEuZGVzY2VuZGFudHMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25Ob2RlSWR4ID0gdGhpcy5fZGVjbGFyYXRpb25Ob2RlSW5kZXg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcmVudCA9IHROb2RlLnBhcmVudDsKICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gVE5vZGUgaXMgYSAiZGlyZWN0IiBjaGlsZCBvZiBhIG5vZGUgb24gd2hpY2ggYSBjb250ZW50IHF1ZXJ5IHdhcwogICAgICAgICAgICAvLyBkZWNsYXJlZCAob25seSBkaXJlY3QgY2hpbGRyZW4gb2YgcXVlcnkncyBob3N0IG5vZGUgY2FuIG1hdGNoIHdpdGggdGhlIGRlc2NlbmRhbnRzOiBmYWxzZQogICAgICAgICAgICAvLyBvcHRpb24pLiBUaGVyZSBhcmUgMyBtYWluIHVzZS1jYXNlIC8gY29uZGl0aW9ucyB0byBjb25zaWRlciBoZXJlOgogICAgICAgICAgICAvLyAtIDxuZWVkcy10YXJnZXQ+PGkgI3RhcmdldD48L2k+PC9uZWVkcy10YXJnZXQ+OiBoZXJlIDxpICN0YXJnZXQ+IHBhcmVudCBub2RlIGlzIGEgcXVlcnkKICAgICAgICAgICAgLy8gaG9zdCBub2RlOwogICAgICAgICAgICAvLyAtIDxuZWVkcy10YXJnZXQ+PG5nLXRlbXBsYXRlIFtuZ0lmXT0idHJ1ZSI+PGkgI3RhcmdldD48L2k+PC9uZy10ZW1wbGF0ZT48L25lZWRzLXRhcmdldD46CiAgICAgICAgICAgIC8vIGhlcmUgPGkgI3RhcmdldD4gcGFyZW50IG5vZGUgaXMgbnVsbDsKICAgICAgICAgICAgLy8gLSA8bmVlZHMtdGFyZ2V0PjxuZy1jb250YWluZXI+PGkgI3RhcmdldD48L2k+PC9uZy1jb250YWluZXI+PC9uZWVkcy10YXJnZXQ+OiBoZXJlIHdlIG5lZWQKICAgICAgICAgICAgLy8gdG8gZ28gcGFzdCBgPG5nLWNvbnRhaW5lcj5gIHRvIGRldGVybWluZSA8aSAjdGFyZ2V0PiBwYXJlbnQgbm9kZSAoYnV0IHdlIHNob3VsZG4ndCB0cmF2ZXJzZQogICAgICAgICAgICAvLyB1cCBwYXN0IHRoZSBxdWVyeSdzIGhvc3Qgbm9kZSEpLgogICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gJiYKICAgICAgICAgICAgICAgIHBhcmVudC5pbmRleCAhPT0gZGVjbGFyYXRpb25Ob2RlSWR4KSB7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbk5vZGVJZHggPT09IChwYXJlbnQgIT09IG51bGwgPyBwYXJlbnQuaW5kZXggOiAtMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG1hdGNoVE5vZGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tZXRhZGF0YS5wcmVkaWNhdGUpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHRoaXMubWV0YWRhdGEucHJlZGljYXRlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgZ2V0SWR4T2ZNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBsb2NhbE5hbWVzW2ldKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHlwZVByZWRpY2F0ZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1ldGFkYXRhLnByZWRpY2F0ZSkpOwogICAgICAgICAgICBpZiAodHlwZVByZWRpY2F0ZSA9PT0gVGVtcGxhdGVSZWYpIHsKICAgICAgICAgICAgICAgIGlmICh0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgLTEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odFZpZXcsIHROb2RlLCBsb2NhdGVEaXJlY3RpdmVPclByb3ZpZGVyKHROb2RlLCB0VmlldywgdHlwZVByZWRpY2F0ZSwgZmFsc2UsIGZhbHNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IG5vZGVNYXRjaElkeAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgbm9kZU1hdGNoSWR4KSB7CiAgICAgICAgaWYgKG5vZGVNYXRjaElkeCAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSB0aGlzLm1ldGFkYXRhLnJlYWQ7CiAgICAgICAgICAgIGlmIChyZWFkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAocmVhZCA9PT0gRWxlbWVudFJlZiB8fCByZWFkID09PSBWaWV3Q29udGFpbmVyUmVmIHx8CiAgICAgICAgICAgICAgICAgICAgcmVhZCA9PT0gVGVtcGxhdGVSZWYgJiYgdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hdGNoKHROb2RlLmluZGV4LCAtMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlT3JQcm92aWRlcklkeCA9IGxvY2F0ZURpcmVjdGl2ZU9yUHJvdmlkZXIodE5vZGUsIHRWaWV3LCByZWFkLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmVPclByb3ZpZGVySWR4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2godE5vZGUuaW5kZXgsIGRpcmVjdGl2ZU9yUHJvdmlkZXJJZHgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2godE5vZGUuaW5kZXgsIG5vZGVNYXRjaElkeCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHROb2RlSWR4CiAgICAgKiBAcGFyYW0gez99IG1hdGNoSWR4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRNYXRjaCh0Tm9kZUlkeCwgbWF0Y2hJZHgpIHsKICAgICAgICBpZiAodGhpcy5tYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IFt0Tm9kZUlkeCwgbWF0Y2hJZHhdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5tYXRjaGVzLnB1c2godE5vZGVJZHgsIG1hdGNoSWR4KTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEl0ZXJhdGVzIG92ZXIgbG9jYWwgbmFtZXMgZm9yIGEgZ2l2ZW4gbm9kZSBhbmQgcmV0dXJucyBkaXJlY3RpdmUgaW5kZXgKICogKG9yIC0xIGlmIGEgbG9jYWwgbmFtZSBwb2ludHMgdG8gYW4gZWxlbWVudCkuCiAqCiAqIEBwYXJhbSB7P30gdE5vZGUgc3RhdGljIGRhdGEgb2YgYSBub2RlIHRvIGNoZWNrCiAqIEBwYXJhbSB7P30gc2VsZWN0b3Igc2VsZWN0b3IgdG8gbWF0Y2gKICogQHJldHVybiB7P30gZGlyZWN0aXZlIGluZGV4LCAtMSBvciBudWxsIGlmIGEgc2VsZWN0b3IgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgbG9jYWwgbmFtZXMKICovCmZ1bmN0aW9uIGdldElkeE9mTWF0Y2hpbmdTZWxlY3Rvcih0Tm9kZSwgc2VsZWN0b3IpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2FsTmFtZXMgPSB0Tm9kZS5sb2NhbE5hbWVzOwogICAgaWYgKGxvY2FsTmFtZXMgIT09IG51bGwpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgaWYgKGxvY2FsTmFtZXNbaV0gPT09IHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxvY2FsTmFtZXNbaSArIDFdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQovKioKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGN1cnJlbnRWaWV3CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVSZXN1bHRCeVROb2RlVHlwZSh0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gfHwgdE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKICAgIH0KICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmLCB0Tm9kZSwgY3VycmVudFZpZXcpOwogICAgfQogICAgcmV0dXJuIG51bGw7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IG1hdGNoaW5nSWR4CiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlUmVzdWx0Rm9yTm9kZShsVmlldywgdE5vZGUsIG1hdGNoaW5nSWR4LCByZWFkKSB7CiAgICBpZiAobWF0Y2hpbmdJZHggPT09IC0xKSB7CiAgICAgICAgLy8gaWYgcmVhZCB0b2tlbiBhbmQgLyBvciBzdHJhdGVneSBpcyBub3Qgc3BlY2lmaWVkLCBkZXRlY3QgaXQgdXNpbmcgYXBwcm9wcmlhdGUgdE5vZGUgdHlwZQogICAgICAgIHJldHVybiBjcmVhdGVSZXN1bHRCeVROb2RlVHlwZSh0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgZWxzZSBpZiAobWF0Y2hpbmdJZHggPT09IC0yKSB7CiAgICAgICAgLy8gcmVhZCBhIHNwZWNpYWwgdG9rZW4gZnJvbSBhIG5vZGUgaW5qZWN0b3IKICAgICAgICByZXR1cm4gY3JlYXRlU3BlY2lhbFRva2VuKGxWaWV3LCB0Tm9kZSwgcmVhZCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyByZWFkIGEgdG9rZW4KICAgICAgICByZXR1cm4gZ2V0Tm9kZUluamVjdGFibGUobFZpZXcsIGxWaWV3W1RWSUVXXSwgbWF0Y2hpbmdJZHgsICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpKTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlU3BlY2lhbFRva2VuKGxWaWV3LCB0Tm9kZSwgcmVhZCkgewogICAgaWYgKHJlYWQgPT09IEVsZW1lbnRSZWYpIHsKICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmLCB0Tm9kZSwgbFZpZXcpOwogICAgfQogICAgZWxzZSBpZiAocmVhZCA9PT0gVGVtcGxhdGVSZWYpIHsKICAgICAgICByZXR1cm4gY3JlYXRlVGVtcGxhdGVSZWYoVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYsIHROb2RlLCBsVmlldyk7CiAgICB9CiAgICBlbHNlIGlmIChyZWFkID09PSBWaWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmLCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIHRocm93RXJyb3IkMShgU3BlY2lhbCB0b2tlbiB0byByZWFkIHNob3VsZCBiZSBvbmUgb2YgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgb3IgVmlld0NvbnRhaW5lclJlZiBidXQgZ290ICR7c3RyaW5naWZ5KHJlYWQpfS5gKTsKICAgIH0KfQovKioKICogQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHF1ZXJ5IHJlc3VsdHMgZm9yIGEgZ2l2ZW4gdmlldy4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBkbyB0aGUKICogcHJvY2Vzc2luZyBvbmNlIGFuZCBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gdmlldyBpbnN0YW5jZSAoYSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBnaXZlbiB2aWV3CiAqIGRvZXNuJ3QgY2hhbmdlKS4KICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSB0VmlldwogKiBAcGFyYW0gez99IGxWaWV3CiAqIEBwYXJhbSB7P30gdFF1ZXJ5CiAqIEBwYXJhbSB7P30gcXVlcnlJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbWF0ZXJpYWxpemVWaWV3UmVzdWx0cyh0VmlldywgbFZpZXcsIHRRdWVyeSwgcXVlcnlJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFF1ZXJ5ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXMpKVtxdWVyeUluZGV4XTsKICAgIGlmIChsUXVlcnkubWF0Y2hlcyA9PT0gbnVsbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Vmlld0RhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UXVlcnlNYXRjaGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHRRdWVyeS5tYXRjaGVzKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFF1ZXJ5TWF0Y2hlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROb2RlSWR4ID0gdFF1ZXJ5TWF0Y2hlc1tpXTsKICAgICAgICAgICAgaWYgKG1hdGNoZWROb2RlSWR4IDwgMCkgewogICAgICAgICAgICAgICAgLy8gd2UgYXQgdGhlIDxuZy10ZW1wbGF0ZT4gbWFya2VyIHdoaWNoIG1pZ2h0IGhhdmUgcmVzdWx0cyBpbiB2aWV3cyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMKICAgICAgICAgICAgICAgIC8vIDxuZy10ZW1wbGF0ZT4gLSB0aG9zZSByZXN1bHRzIHdpbGwgYmUgaW4gc2VwYXJhdGUgdmlld3MgdGhvdWdoLCBzbyBoZXJlIHdlIGp1c3QgbGVhdmUKICAgICAgICAgICAgICAgIC8vIG51bGwgYXMgYSBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UodFZpZXdEYXRhLCBtYXRjaGVkTm9kZUlkeCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlld0RhdGFbbWF0Y2hlZE5vZGVJZHhdKSk7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjcmVhdGVSZXN1bHRGb3JOb2RlKGxWaWV3LCB0Tm9kZSwgdFF1ZXJ5TWF0Y2hlc1tpICsgMV0sIHRRdWVyeS5tZXRhZGF0YS5yZWFkKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbFF1ZXJ5Lm1hdGNoZXMgPSByZXN1bHQ7CiAgICB9CiAgICByZXR1cm4gbFF1ZXJ5Lm1hdGNoZXM7Cn0KLyoqCiAqIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29sbGVjdHMgKGFscmVhZHkgbWF0ZXJpYWxpemVkKSBxdWVyeSByZXN1bHRzIGZyb20gYSB0cmVlIG9mIHZpZXdzLAogKiBzdGFydGluZyB3aXRoIGEgcHJvdmlkZWQgTFZpZXcuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHF1ZXJ5SW5kZXgKICogQHBhcmFtIHs/fSByZXN1bHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbGxlY3RRdWVyeVJlc3VsdHModFZpZXcsIGxWaWV3LCBxdWVyeUluZGV4LCByZXN1bHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRRdWVyeSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkuZ2V0QnlJbmRleChxdWVyeUluZGV4KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRRdWVyeU1hdGNoZXMgPSB0UXVlcnkubWF0Y2hlczsKICAgIGlmICh0UXVlcnlNYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3UmVzdWx0cyA9IG1hdGVyaWFsaXplVmlld1Jlc3VsdHModFZpZXcsIGxWaWV3LCB0UXVlcnksIHF1ZXJ5SW5kZXgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFF1ZXJ5TWF0Y2hlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlSWR4ID0gdFF1ZXJ5TWF0Y2hlc1tpXTsKICAgICAgICAgICAgaWYgKHROb2RlSWR4ID4gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3UmVzdWx0c1tpIC8gMl0pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFF1ZXJ5SW5kZXggPSB0UXVlcnlNYXRjaGVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1stdE5vZGVJZHhdKSk7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkxDb250YWluZXIpOwogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBtYXRjaGVzIGZvciB2aWV3cyBpbnNlcnRlZCBpbiB0aGlzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOyBpIDwgZGVjbGFyYXRpb25MQ29udGFpbmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBkZWNsYXJhdGlvbkxDb250YWluZXJbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtYmVkZGVkTFZpZXdbREVDTEFSQVRJT05fTENPTlRBSU5FUl0gPT09IGVtYmVkZGVkTFZpZXdbUEFSRU5UXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0UXVlcnlSZXN1bHRzKGVtYmVkZGVkTFZpZXdbVFZJRVddLCBlbWJlZGRlZExWaWV3LCBjaGlsZFF1ZXJ5SW5kZXgsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gY29sbGVjdCBtYXRjaGVzIGZvciB2aWV3cyBjcmVhdGVkIGZyb20gdGhpcyBkZWNsYXJhdGlvbiBjb250YWluZXIgYW5kIGluc2VydGVkIGludG8KICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250YWluZXJzCiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb25MQ29udGFpbmVyW01PVkVEX1ZJRVdTXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZExWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbkxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbWJlZGRlZExWaWV3cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBlbWJlZGRlZExWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdFF1ZXJ5UmVzdWx0cyhlbWJlZGRlZExWaWV3W1RWSUVXXSwgZW1iZWRkZWRMVmlldywgY2hpbGRRdWVyeUluZGV4LCByZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn0KLyoqCiAqIFJlZnJlc2hlcyBhIHF1ZXJ5IGJ5IGNvbWJpbmluZyBtYXRjaGVzIGZyb20gYWxsIGFjdGl2ZSB2aWV3cyBhbmQgcmVtb3ZpbmcgbWF0Y2hlcyBmcm9tIGRlbGV0ZWQKICogdmlld3MuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHF1ZXJ5TGlzdAogKiBAcmV0dXJuIHs/fSBgdHJ1ZWAgaWYgYSBxdWVyeSBnb3QgZGlydHkgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gb3IgaWYgdGhpcyBpcyBhIHN0YXRpYyBxdWVyeQogKiByZXNvbHZpbmcgaW4gY3JlYXRpb24gbW9kZSwgYGZhbHNlYCBvdGhlcndpc2UuCiAqCiAqLwpmdW5jdGlvbiDJtcm1cXVlcnlSZWZyZXNoKHF1ZXJ5TGlzdCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcXVlcnlJbmRleCA9IGdldEN1cnJlbnRRdWVyeUluZGV4KCk7CiAgICBzZXRDdXJyZW50UXVlcnlJbmRleChxdWVyeUluZGV4ICsgMSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB0UXVlcnkgPSBnZXRUUXVlcnkodFZpZXcsIHF1ZXJ5SW5kZXgpOwogICAgaWYgKHF1ZXJ5TGlzdC5kaXJ0eSAmJiAoaXNDcmVhdGlvbk1vZGUobFZpZXcpID09PSB0UXVlcnkubWV0YWRhdGEuaXNTdGF0aWMpKSB7CiAgICAgICAgaWYgKHRRdWVyeS5tYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIHF1ZXJ5TGlzdC5yZXNldChbXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRRdWVyeS5jcm9zc2VzTmdUZW1wbGF0ZSA/CiAgICAgICAgICAgICAgICBjb2xsZWN0UXVlcnlSZXN1bHRzKHRWaWV3LCBsVmlldywgcXVlcnlJbmRleCwgW10pIDoKICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplVmlld1Jlc3VsdHModFZpZXcsIGxWaWV3LCB0UXVlcnksIHF1ZXJ5SW5kZXgpOwogICAgICAgICAgICBxdWVyeUxpc3QucmVzZXQocmVzdWx0KTsKICAgICAgICAgICAgcXVlcnlMaXN0Lm5vdGlmeU9uQ2hhbmdlcygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQovKioKICogQ3JlYXRlcyBuZXcgUXVlcnlMaXN0IGZvciBhIHN0YXRpYyB2aWV3IHF1ZXJ5LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXN0YXRpY1ZpZXdRdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHsKICAgIHZpZXdRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgdHJ1ZSk7Cn0KLyoqCiAqIENyZWF0ZXMgbmV3IFF1ZXJ5TGlzdCwgc3RvcmVzIHRoZSByZWZlcmVuY2UgaW4gTFZpZXcgYW5kIHJldHVybnMgUXVlcnlMaXN0LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gybXJtXZpZXdRdWVyeShwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQpIHsKICAgIHZpZXdRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgZmFsc2UpOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUKICogQHBhcmFtIHs/fSBkZXNjZW5kCiAqIEBwYXJhbSB7P30gcmVhZAogKiBAcGFyYW0gez99IGlzU3RhdGljCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2aWV3UXVlcnlJbnRlcm5hbCh0VmlldywgbFZpZXcsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgaXNTdGF0aWMpIHsKICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICBjcmVhdGVUUXVlcnkodFZpZXcsIG5ldyBUUXVlcnlNZXRhZGF0YV8ocHJlZGljYXRlLCBkZXNjZW5kLCBpc1N0YXRpYywgcmVhZCksIC0xKTsKICAgICAgICBpZiAoaXNTdGF0aWMpIHsKICAgICAgICAgICAgdFZpZXcuc3RhdGljVmlld1F1ZXJpZXMgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpOwp9Ci8qKgogKiBSZWdpc3RlcnMgYSBRdWVyeUxpc3QsIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoIChwYXJ0IG9mIGEgdmlldwogKiByZWZyZXNoKS4KICoKICogXEBjb2RlR2VuQXBpCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5kZXggQ3VycmVudCBkaXJlY3RpdmUgaW5kZXgKICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogKiBAcmV0dXJuIHs/fSBRdWVyeUxpc3Q8VD4KICoKICovCmZ1bmN0aW9uIMm1ybVjb250ZW50UXVlcnkoZGlyZWN0aXZlSW5kZXgsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkgewogICAgY29udGVudFF1ZXJ5SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkLCBmYWxzZSwgZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGRpcmVjdGl2ZUluZGV4KTsKfQovKioKICogUmVnaXN0ZXJzIGEgUXVlcnlMaXN0LCBhc3NvY2lhdGVkIHdpdGggYSBzdGF0aWMgY29udGVudCBxdWVyeSwgZm9yIGxhdGVyIHJlZnJlc2gKICogKHBhcnQgb2YgYSB2aWV3IHJlZnJlc2gpLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBDdXJyZW50IGRpcmVjdGl2ZSBpbmRleAogKiBAcGFyYW0gez99IHByZWRpY2F0ZSBUaGUgdHlwZSBmb3Igd2hpY2ggdGhlIHF1ZXJ5IHdpbGwgc2VhcmNoCiAqIEBwYXJhbSB7P30gZGVzY2VuZCBXaGV0aGVyIG9yIG5vdCB0byBkZXNjZW5kIGludG8gY2hpbGRyZW4KICogQHBhcmFtIHs/PX0gcmVhZCBXaGF0IHRvIHNhdmUgaW4gdGhlIHF1ZXJ5CiAqIEByZXR1cm4gez99IFF1ZXJ5TGlzdDxUPgogKgogKi8KZnVuY3Rpb24gybXJtXN0YXRpY0NvbnRlbnRRdWVyeShkaXJlY3RpdmVJbmRleCwgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkKSB7CiAgICBjb250ZW50UXVlcnlJbnRlcm5hbChnZXRUVmlldygpLCBnZXRMVmlldygpLCBwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQsIHRydWUsIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBkaXJlY3RpdmVJbmRleCk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBsVmlldwogKiBAcGFyYW0gez99IHByZWRpY2F0ZQogKiBAcGFyYW0gez99IGRlc2NlbmQKICogQHBhcmFtIHs/fSByZWFkCiAqIEBwYXJhbSB7P30gaXNTdGF0aWMKICogQHBhcmFtIHs/fSB0Tm9kZQogKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb250ZW50UXVlcnlJbnRlcm5hbCh0VmlldywgbFZpZXcsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgaXNTdGF0aWMsIHROb2RlLCBkaXJlY3RpdmVJbmRleCkgewogICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgIGNyZWF0ZVRRdWVyeSh0VmlldywgbmV3IFRRdWVyeU1ldGFkYXRhXyhwcmVkaWNhdGUsIGRlc2NlbmQsIGlzU3RhdGljLCByZWFkKSwgdE5vZGUuaW5kZXgpOwogICAgICAgIHNhdmVDb250ZW50UXVlcnlBbmREaXJlY3RpdmVJbmRleCh0VmlldywgZGlyZWN0aXZlSW5kZXgpOwogICAgICAgIGlmIChpc1N0YXRpYykgewogICAgICAgICAgICB0Vmlldy5zdGF0aWNDb250ZW50UXVlcmllcyA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgY3JlYXRlTFF1ZXJ5KHRWaWV3LCBsVmlldyk7Cn0KLyoqCiAqIExvYWRzIGEgUXVlcnlMaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgdmlldyBvciBjb250ZW50IHF1ZXJ5LgogKgogKiBcQGNvZGVHZW5BcGkKICogQHRlbXBsYXRlIFQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVsb2FkUXVlcnkoKSB7CiAgICByZXR1cm4gbG9hZFF1ZXJ5SW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0Q3VycmVudFF1ZXJ5SW5kZXgoKSk7Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHBhcmFtIHs/fSBxdWVyeUluZGV4CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBsb2FkUXVlcnlJbnRlcm5hbChsVmlldywgcXVlcnlJbmRleCkgewogICAgbmdEZXZNb2RlICYmCiAgICAgICAgYXNzZXJ0RGVmaW5lZChsVmlld1tRVUVSSUVTXSwgJ0xRdWVyaWVzIHNob3VsZCBiZSBkZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGxvYWQgYSBxdWVyeScpOwogICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKCgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXMsIHF1ZXJ5SW5kZXgpOwogICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXNbcXVlcnlJbmRleF0ucXVlcnlMaXN0Owp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gbFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHF1ZXJ5TGlzdCA9IG5ldyBRdWVyeUxpc3QoKTsKICAgIHN0b3JlQ2xlYW51cFdpdGhDb250ZXh0KHRWaWV3LCBsVmlldywgcXVlcnlMaXN0LCBxdWVyeUxpc3QuZGVzdHJveSk7CiAgICBpZiAobFZpZXdbUVVFUklFU10gPT09IG51bGwpCiAgICAgICAgbFZpZXdbUVVFUklFU10gPSBuZXcgTFF1ZXJpZXNfKCk7CiAgICAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUVVFUklFU10pKS5xdWVyaWVzLnB1c2gobmV3IExRdWVyeV8ocXVlcnlMaXN0KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBtZXRhZGF0YQogKiBAcGFyYW0gez99IG5vZGVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVFF1ZXJ5KHRWaWV3LCBtZXRhZGF0YSwgbm9kZUluZGV4KSB7CiAgICBpZiAodFZpZXcucXVlcmllcyA9PT0gbnVsbCkKICAgICAgICB0Vmlldy5xdWVyaWVzID0gbmV3IFRRdWVyaWVzXygpOwogICAgdFZpZXcucXVlcmllcy50cmFjayhuZXcgVFF1ZXJ5XyhtZXRhZGF0YSwgbm9kZUluZGV4KSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdFZpZXcKICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2F2ZUNvbnRlbnRRdWVyeUFuZERpcmVjdGl2ZUluZGV4KHRWaWV3LCBkaXJlY3RpdmVJbmRleCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdFZpZXdDb250ZW50UXVlcmllcyA9IHRWaWV3LmNvbnRlbnRRdWVyaWVzIHx8ICh0Vmlldy5jb250ZW50UXVlcmllcyA9IFtdKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxhc3RTYXZlZERpcmVjdGl2ZUluZGV4ID0gdFZpZXcuY29udGVudFF1ZXJpZXMubGVuZ3RoID8gdFZpZXdDb250ZW50UXVlcmllc1t0Vmlld0NvbnRlbnRRdWVyaWVzLmxlbmd0aCAtIDFdIDogLTE7CiAgICBpZiAoZGlyZWN0aXZlSW5kZXggIT09IGxhc3RTYXZlZERpcmVjdGl2ZUluZGV4KSB7CiAgICAgICAgdFZpZXdDb250ZW50UXVlcmllcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkubGVuZ3RoIC0gMSwgZGlyZWN0aXZlSW5kZXgpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRWaWV3CiAqIEBwYXJhbSB7P30gaW5kZXgKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFRRdWVyeSh0VmlldywgaW5kZXgpIHsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LnF1ZXJpZXMsICdUUXVlcmllcyBtdXN0IGJlIGRlZmluZWQgdG8gcmV0cmlldmUgYSBUUXVlcnknKTsKICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcucXVlcmllcykpLmdldEJ5SW5kZXgoaW5kZXgpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3ZpZXdfZW5naW5lX2NvbXBhdGliaWxpdHlfcHJlYm91bmQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFJldHJpZXZlcyBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGZyb20gYEluamVjdG9yYCB3aGVuIGEgbG9jYWwgcmVmZXJlbmNlIGlzIHBsYWNlZCBvbiB0aGUKICogYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuCiAqCiAqIFxAY29kZUdlbkFwaQogKiBAcGFyYW0gez99IHROb2RlCiAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcih0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZiwgRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKfQovKioKICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgYENoYW5nZURldGVjdG9yUmVmYCBmb3IgYSBwaXBlLgogKgogKiBcQGNvZGVHZW5BcGkKICogQHBhcmFtIHs/PX0gZmxhZ3MKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYoZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB2YWx1ZSA9IGluamVjdENoYW5nZURldGVjdG9yUmVmKHRydWUpOwogICAgaWYgKHZhbHVlID09IG51bGwgJiYgIShmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcHJvdmlkZXIgZm9yIENoYW5nZURldGVjdG9yUmVmIWApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ppdC9lbnZpcm9ubWVudC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCDJtTAkZCA9IC8qKgogKiBAcmV0dXJuIHs/fQogKi8KKCkgPT4gKHsKICAgICfJtcm1YXR0cmlidXRlJzogybXJtWF0dHJpYnV0ZSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUxJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMiwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUzJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMywKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNCwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNSwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU2JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNiwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNywKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlOCwKICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlViwKICAgICfJtcm1ZGVmaW5lQ29tcG9uZW50JzogybXJtWRlZmluZUNvbXBvbmVudCwKICAgICfJtcm1ZGVmaW5lRGlyZWN0aXZlJzogybXJtWRlZmluZURpcmVjdGl2ZSwKICAgICfJtcm1ZGVmaW5lSW5qZWN0YWJsZSc6IMm1ybVkZWZpbmVJbmplY3RhYmxlLAogICAgJ8m1ybVkZWZpbmVJbmplY3Rvcic6IMm1ybVkZWZpbmVJbmplY3RvciwKICAgICfJtcm1ZGVmaW5lTmdNb2R1bGUnOiDJtcm1ZGVmaW5lTmdNb2R1bGUsCiAgICAnybXJtWRlZmluZVBpcGUnOiDJtcm1ZGVmaW5lUGlwZSwKICAgICfJtcm1ZGlyZWN0aXZlSW5qZWN0JzogybXJtWRpcmVjdGl2ZUluamVjdCwKICAgICfJtcm1Z2V0RmFjdG9yeU9mJzogybXJtWdldEZhY3RvcnlPZiwKICAgICfJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeSc6IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5LAogICAgJ8m1ybVpbmplY3QnOiDJtcm1aW5qZWN0LAogICAgJ8m1ybVpbmplY3RBdHRyaWJ1dGUnOiDJtcm1aW5qZWN0QXR0cmlidXRlLAogICAgJ8m1ybVpbnZhbGlkRmFjdG9yeSc6IMm1ybVpbnZhbGlkRmFjdG9yeSwKICAgICfJtcm1aW52YWxpZEZhY3RvcnlEZXAnOiDJtcm1aW52YWxpZEZhY3RvcnlEZXAsCiAgICAnybXJtWluamVjdFBpcGVDaGFuZ2VEZXRlY3RvclJlZic6IMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYsCiAgICAnybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yJzogybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yLAogICAgJ8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmUnOiDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlLAogICAgJ8m1ybVQcm92aWRlcnNGZWF0dXJlJzogybXJtVByb3ZpZGVyc0ZlYXR1cmUsCiAgICAnybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmUsCiAgICAnybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsCiAgICAnybXJtWNvbnRhaW5lcic6IMm1ybVjb250YWluZXIsCiAgICAnybXJtW5leHRDb250ZXh0JzogybXJtW5leHRDb250ZXh0LAogICAgJ8m1ybVjb250YWluZXJSZWZyZXNoU3RhcnQnOiDJtcm1Y29udGFpbmVyUmVmcmVzaFN0YXJ0LAogICAgJ8m1ybVjb250YWluZXJSZWZyZXNoRW5kJzogybXJtWNvbnRhaW5lclJlZnJlc2hFbmQsCiAgICAnybXJtW5hbWVzcGFjZUhUTUwnOiDJtcm1bmFtZXNwYWNlSFRNTCwKICAgICfJtcm1bmFtZXNwYWNlTWF0aE1MJzogybXJtW5hbWVzcGFjZU1hdGhNTCwKICAgICfJtcm1bmFtZXNwYWNlU1ZHJzogybXJtW5hbWVzcGFjZVNWRywKICAgICfJtcm1ZW5hYmxlQmluZGluZ3MnOiDJtcm1ZW5hYmxlQmluZGluZ3MsCiAgICAnybXJtWRpc2FibGVCaW5kaW5ncyc6IMm1ybVkaXNhYmxlQmluZGluZ3MsCiAgICAnybXJtWVsZW1lbnRTdGFydCc6IMm1ybVlbGVtZW50U3RhcnQsCiAgICAnybXJtWVsZW1lbnRFbmQnOiDJtcm1ZWxlbWVudEVuZCwKICAgICfJtcm1ZWxlbWVudCc6IMm1ybVlbGVtZW50LAogICAgJ8m1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQnOiDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0LAogICAgJ8m1ybVlbGVtZW50Q29udGFpbmVyRW5kJzogybXJtWVsZW1lbnRDb250YWluZXJFbmQsCiAgICAnybXJtWVsZW1lbnRDb250YWluZXInOiDJtcm1ZWxlbWVudENvbnRhaW5lciwKICAgICfJtcm1cHVyZUZ1bmN0aW9uMCc6IMm1ybVwdXJlRnVuY3Rpb24wLAogICAgJ8m1ybVwdXJlRnVuY3Rpb24xJzogybXJtXB1cmVGdW5jdGlvbjEsCiAgICAnybXJtXB1cmVGdW5jdGlvbjInOiDJtcm1cHVyZUZ1bmN0aW9uMiwKICAgICfJtcm1cHVyZUZ1bmN0aW9uMyc6IMm1ybVwdXJlRnVuY3Rpb24zLAogICAgJ8m1ybVwdXJlRnVuY3Rpb240JzogybXJtXB1cmVGdW5jdGlvbjQsCiAgICAnybXJtXB1cmVGdW5jdGlvbjUnOiDJtcm1cHVyZUZ1bmN0aW9uNSwKICAgICfJtcm1cHVyZUZ1bmN0aW9uNic6IMm1ybVwdXJlRnVuY3Rpb242LAogICAgJ8m1ybVwdXJlRnVuY3Rpb243JzogybXJtXB1cmVGdW5jdGlvbjcsCiAgICAnybXJtXB1cmVGdW5jdGlvbjgnOiDJtcm1cHVyZUZ1bmN0aW9uOCwKICAgICfJtcm1cHVyZUZ1bmN0aW9uVic6IMm1ybVwdXJlRnVuY3Rpb25WLAogICAgJ8m1ybVnZXRDdXJyZW50Vmlldyc6IMm1ybVnZXRDdXJyZW50VmlldywKICAgICfJtcm1cmVzdG9yZVZpZXcnOiDJtcm1cmVzdG9yZVZpZXcsCiAgICAnybXJtWxpc3RlbmVyJzogybXJtWxpc3RlbmVyLAogICAgJ8m1ybVwcm9qZWN0aW9uJzogybXJtXByb2plY3Rpb24sCiAgICAnybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nJzogybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nLAogICAgJ8m1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXInOiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyLAogICAgJ8m1ybVwaXBlQmluZDEnOiDJtcm1cGlwZUJpbmQxLAogICAgJ8m1ybVwaXBlQmluZDInOiDJtcm1cGlwZUJpbmQyLAogICAgJ8m1ybVwaXBlQmluZDMnOiDJtcm1cGlwZUJpbmQzLAogICAgJ8m1ybVwaXBlQmluZDQnOiDJtcm1cGlwZUJpbmQ0LAogICAgJ8m1ybVwaXBlQmluZFYnOiDJtcm1cGlwZUJpbmRWLAogICAgJ8m1ybVwcm9qZWN0aW9uRGVmJzogybXJtXByb2plY3Rpb25EZWYsCiAgICAnybXJtWhvc3RQcm9wZXJ0eSc6IMm1ybVob3N0UHJvcGVydHksCiAgICAnybXJtXByb3BlcnR5JzogybXJtXByb3BlcnR5LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxLAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlMic6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMiwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNSc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNSwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYsCiAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3LAogICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlOCc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOCwKICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYsCiAgICAnybXJtXBpcGUnOiDJtcm1cGlwZSwKICAgICfJtcm1cXVlcnlSZWZyZXNoJzogybXJtXF1ZXJ5UmVmcmVzaCwKICAgICfJtcm1dmlld1F1ZXJ5JzogybXJtXZpZXdRdWVyeSwKICAgICfJtcm1c3RhdGljVmlld1F1ZXJ5JzogybXJtXN0YXRpY1ZpZXdRdWVyeSwKICAgICfJtcm1c3RhdGljQ29udGVudFF1ZXJ5JzogybXJtXN0YXRpY0NvbnRlbnRRdWVyeSwKICAgICfJtcm1bG9hZFF1ZXJ5JzogybXJtWxvYWRRdWVyeSwKICAgICfJtcm1Y29udGVudFF1ZXJ5JzogybXJtWNvbnRlbnRRdWVyeSwKICAgICfJtcm1cmVmZXJlbmNlJzogybXJtXJlZmVyZW5jZSwKICAgICfJtcm1Y2xhc3NNYXAnOiDJtcm1Y2xhc3NNYXAsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUxJzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUxLAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlMic6IMm1ybVjbGFzc01hcEludGVycG9sYXRlMiwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0LAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlNSc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlNSwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYsCiAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3LAogICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlOCc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlOCwKICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYsCiAgICAnybXJtXN0eWxlTWFwJzogybXJtXN0eWxlTWFwLAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlMSc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlMSwKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTInOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUzJzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUzLAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlNCc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlNCwKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2JzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2LAogICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlNyc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlNywKICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgsCiAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWJzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWLAogICAgJ8m1ybVzdHlsZVByb3AnOiDJtcm1c3R5bGVQcm9wLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTInOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUzLAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTUnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU2LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTcnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTgnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4LAogICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGVWLAogICAgJ8m1ybVzdHlsZVNhbml0aXplcic6IMm1ybVzdHlsZVNhbml0aXplciwKICAgICfJtcm1Y2xhc3NQcm9wJzogybXJtWNsYXNzUHJvcCwKICAgICfJtcm1c2VsZWN0JzogybXJtXNlbGVjdCwKICAgICfJtcm1YWR2YW5jZSc6IMm1ybVhZHZhbmNlLAogICAgJ8m1ybV0ZW1wbGF0ZSc6IMm1ybV0ZW1wbGF0ZSwKICAgICfJtcm1dGV4dCc6IMm1ybV0ZXh0LAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGUnOiDJtcm1dGV4dEludGVycG9sYXRlLAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGUxJzogybXJtXRleHRJbnRlcnBvbGF0ZTEsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTInOiDJtcm1dGV4dEludGVycG9sYXRlMiwKICAgICfJtcm1dGV4dEludGVycG9sYXRlMyc6IMm1ybV0ZXh0SW50ZXJwb2xhdGUzLAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGU0JzogybXJtXRleHRJbnRlcnBvbGF0ZTQsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTUnOiDJtcm1dGV4dEludGVycG9sYXRlNSwKICAgICfJtcm1dGV4dEludGVycG9sYXRlNic6IMm1ybV0ZXh0SW50ZXJwb2xhdGU2LAogICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGU3JzogybXJtXRleHRJbnRlcnBvbGF0ZTcsCiAgICAnybXJtXRleHRJbnRlcnBvbGF0ZTgnOiDJtcm1dGV4dEludGVycG9sYXRlOCwKICAgICfJtcm1dGV4dEludGVycG9sYXRlVic6IMm1ybV0ZXh0SW50ZXJwb2xhdGVWLAogICAgJ8m1ybVlbWJlZGRlZFZpZXdTdGFydCc6IMm1ybVlbWJlZGRlZFZpZXdTdGFydCwKICAgICfJtcm1ZW1iZWRkZWRWaWV3RW5kJzogybXJtWVtYmVkZGVkVmlld0VuZCwKICAgICfJtcm1aTE4bic6IMm1ybVpMThuLAogICAgJ8m1ybVpMThuQXR0cmlidXRlcyc6IMm1ybVpMThuQXR0cmlidXRlcywKICAgICfJtcm1aTE4bkV4cCc6IMm1ybVpMThuRXhwLAogICAgJ8m1ybVpMThuU3RhcnQnOiDJtcm1aTE4blN0YXJ0LAogICAgJ8m1ybVpMThuRW5kJzogybXJtWkxOG5FbmQsCiAgICAnybXJtWkxOG5BcHBseSc6IMm1ybVpMThuQXBwbHksCiAgICAnybXJtWkxOG5Qb3N0cHJvY2Vzcyc6IMm1ybVpMThuUG9zdHByb2Nlc3MsCiAgICAnybXJtXJlc29sdmVXaW5kb3cnOiDJtcm1cmVzb2x2ZVdpbmRvdywKICAgICfJtcm1cmVzb2x2ZURvY3VtZW50JzogybXJtXJlc29sdmVEb2N1bWVudCwKICAgICfJtcm1cmVzb2x2ZUJvZHknOiDJtcm1cmVzb2x2ZUJvZHksCiAgICAnybXJtXNldENvbXBvbmVudFNjb3BlJzogybXJtXNldENvbXBvbmVudFNjb3BlLAogICAgJ8m1ybVzZXROZ01vZHVsZVNjb3BlJzogybXJtXNldE5nTW9kdWxlU2NvcGUsCiAgICAnybXJtXNhbml0aXplSHRtbCc6IMm1ybVzYW5pdGl6ZUh0bWwsCiAgICAnybXJtXNhbml0aXplU3R5bGUnOiDJtcm1c2FuaXRpemVTdHlsZSwKICAgICfJtcm1ZGVmYXVsdFN0eWxlU2FuaXRpemVyJzogybXJtWRlZmF1bHRTdHlsZVNhbml0aXplciwKICAgICfJtcm1c2FuaXRpemVSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsLAogICAgJ8m1ybVzYW5pdGl6ZVNjcmlwdCc6IMm1ybVzYW5pdGl6ZVNjcmlwdCwKICAgICfJtcm1c2FuaXRpemVVcmwnOiDJtcm1c2FuaXRpemVVcmwsCiAgICAnybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVVybE9yUmVzb3VyY2VVcmwsCn0pOwovKioKICogQSBtYXBwaW5nIG9mIHRoZSBcQGFuZ3VsYXIvY29yZSBBUEkgc3VyZmFjZSB1c2VkIGluIGdlbmVyYXRlZCBleHByZXNzaW9ucyB0byB0aGUgYWN0dWFsIHN5bWJvbHMuCiAqCiAqIFRoaXMgc2hvdWxkIGJlIGtlcHQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBwdWJsaWMgZXhwb3J0cyBvZiBcQGFuZ3VsYXIvY29yZS4KICogQHR5cGUgez99CiAqLwpjb25zdCBhbmd1bGFyQ29yZUVudiA9ICgoybUwJGQpKSgpOwovKiogQHR5cGUgez99ICovCmxldCBqaXRPcHRpb25zID0gbnVsbDsKLyoqCiAqIEBwYXJhbSB7P30gb3B0aW9ucwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc2V0Sml0T3B0aW9ucyhvcHRpb25zKSB7CiAgICBpZiAoaml0T3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRFbmNhcHN1bGF0aW9uICE9PSBqaXRPcHRpb25zLmRlZmF1bHRFbmNhcHN1bGF0aW9uKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUHJvdmlkZWQgdmFsdWUgZm9yIGBkZWZhdWx0RW5jYXBzdWxhdGlvbmAgY2FuIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaGFzIGJlZW4gc2V0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXMgIT09IGppdE9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlcykgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIHZhbHVlIGZvciBgcHJlc2VydmVXaGl0ZXNwYWNlc2AgY2FuIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaGFzIGJlZW4gc2V0LicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaml0T3B0aW9ucyA9IG9wdGlvbnM7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRKaXRPcHRpb25zKCkgewogICAgcmV0dXJuIGppdE9wdGlvbnM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaml0L21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IEVNUFRZX0FSUkFZJDUgPSBbXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBtb2R1bGVRdWV1ZSA9IFtdOwovKioKICogRW5xdWV1ZXMgbW9kdWxlRGVmIHRvIGJlIGNoZWNrZWQgbGF0ZXIgdG8gc2VlIGlmIHNjb3BlIGNhbiBiZSBzZXQgb24gaXRzCiAqIGNvbXBvbmVudCBkZWNsYXJhdGlvbnMuCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcGFyYW0gez99IG5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBlbnF1ZXVlTW9kdWxlRm9yRGVsYXllZFNjb3BpbmcobW9kdWxlVHlwZSwgbmdNb2R1bGUpIHsKICAgIG1vZHVsZVF1ZXVlLnB1c2goeyBtb2R1bGVUeXBlLCBuZ01vZHVsZSB9KTsKfQovKiogQHR5cGUgez99ICovCmxldCBmbHVzaGluZ01vZHVsZVF1ZXVlID0gZmFsc2U7Ci8qKgogKiBMb29wcyBvdmVyIHF1ZXVlZCBtb2R1bGUgZGVmaW5pdGlvbnMsIGlmIGEgZ2l2ZW4gbW9kdWxlIGRlZmluaXRpb24gaGFzIGFsbCBvZiBpdHMKICogZGVjbGFyYXRpb25zIHJlc29sdmVkLCBpdCBkZXF1ZXVlcyB0aGF0IG1vZHVsZSBkZWZpbml0aW9uIGFuZCBzZXRzIHRoZSBzY29wZSBvbgogKiBpdHMgZGVjbGFyYXRpb25zLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlKCkgewogICAgaWYgKCFmbHVzaGluZ01vZHVsZVF1ZXVlKSB7CiAgICAgICAgZmx1c2hpbmdNb2R1bGVRdWV1ZSA9IHRydWU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1vZHVsZVF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IG1vZHVsZVR5cGUsIG5nTW9kdWxlIH0gPSBtb2R1bGVRdWV1ZVtpXTsKICAgICAgICAgICAgICAgIGlmIChuZ01vZHVsZS5kZWNsYXJhdGlvbnMgJiYgbmdNb2R1bGUuZGVjbGFyYXRpb25zLmV2ZXJ5KGlzUmVzb2x2ZWREZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBkZXF1ZXVlCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgIHNldFNjb3BlT25EZWNsYXJlZENvbXBvbmVudHMobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBmbHVzaGluZ01vZHVsZVF1ZXVlID0gZmFsc2U7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBSZXR1cm5zIHRydXRoeSBpZiBhIGRlY2xhcmF0aW9uIGhhcyByZXNvbHZlZC4gSWYgdGhlIGRlY2xhcmF0aW9uIGhhcHBlbnMgdG8gYmUKICogYW4gYXJyYXkgb2YgZGVjbGFyYXRpb25zLCBpdCB3aWxsIHJlY3Vyc2UgdG8gY2hlY2sgZWFjaCBkZWNsYXJhdGlvbiBpbiB0aGF0IGFycmF5CiAqICh3aGljaCBtYXkgYWxzbyBiZSBhcnJheXMpLgogKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc1Jlc29sdmVkRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uKSkgewogICAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5ldmVyeShpc1Jlc29sdmVkRGVjbGFyYXRpb24pOwogICAgfQogICAgcmV0dXJuICEhcmVzb2x2ZUZvcndhcmRSZWYoZGVjbGFyYXRpb24pOwp9Ci8qKgogKiBDb21waWxlcyBhIG1vZHVsZSBpbiBKSVQgbW9kZS4KICoKICogVGhpcyBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IGdldHMgY2FsbGVkIHdoZW4gYSBjbGFzcyBoYXMgYSBgXEBOZ01vZHVsZWAgZGVjb3JhdG9yLgogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHBhcmFtIHs/PX0gbmdNb2R1bGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZShtb2R1bGVUeXBlLCBuZ01vZHVsZSA9IHt9KSB7CiAgICBjb21waWxlTmdNb2R1bGVEZWZzKCgvKiogQHR5cGUgez99ICovIChtb2R1bGVUeXBlKSksIG5nTW9kdWxlKTsKICAgIC8vIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbGwgZGVjbGFyYXRpb25zIGhhdmUgcmVzb2x2ZWQgeWV0IGF0IHRoZSBtb21lbnQgdGhlCiAgICAvLyBOZ01vZHVsZSBkZWNvcmF0b3IgaXMgZXhlY3V0aW5nLCB3ZSdyZSBlbnF1ZXVlaW5nIHRoZSBzZXR0aW5nIG9mIG1vZHVsZSBzY29wZQogICAgLy8gb24gaXRzIGRlY2xhcmF0aW9ucyB0byBiZSBydW4gYXQgYSBsYXRlciB0aW1lIHdoZW4gYWxsIGRlY2xhcmF0aW9ucyBmb3IgdGhlIG1vZHVsZSwKICAgIC8vIGluY2x1ZGluZyBmb3J3YXJkIHJlZnMsIGhhdmUgcmVzb2x2ZWQuCiAgICBlbnF1ZXVlTW9kdWxlRm9yRGVsYXllZFNjb3BpbmcobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwp9Ci8qKgogKiBDb21waWxlcyBhbmQgYWRkcyB0aGUgYMm1bW9kYCBhbmQgYMm1aW5qYCBwcm9wZXJ0aWVzIHRvIHRoZSBtb2R1bGUgY2xhc3MuCiAqCiAqIEl0J3MgcG9zc2libGUgdG8gY29tcGlsZSBhIG1vZHVsZSB2aWEgdGhpcyBBUEkgd2hpY2ggd2lsbCBhbGxvdyBkdXBsaWNhdGUgZGVjbGFyYXRpb25zIGluIGl0cwogKiByb290LgogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHBhcmFtIHs/fSBuZ01vZHVsZQogKiBAcGFyYW0gez89fSBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlRGVmcyhtb2R1bGVUeXBlLCBuZ01vZHVsZSwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QgPSBmYWxzZSkgewogICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobW9kdWxlVHlwZSwgJ1JlcXVpcmVkIHZhbHVlIG1vZHVsZVR5cGUnKTsKICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG5nTW9kdWxlLCAnUmVxdWlyZWQgdmFsdWUgbmdNb2R1bGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGZsYXR0ZW4obmdNb2R1bGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZJDUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nTW9kdWxlRGVmID0gbnVsbDsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGVUeXBlLCBOR19NT0RfREVGLCB7CiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdNb2R1bGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUgJiYgbmdNb2R1bGUuaW1wb3J0cyAmJiBuZ01vZHVsZS5pbXBvcnRzLmluZGV4T2YobW9kdWxlVHlwZSkgPiAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYXNzZXJ0IHRoaXMgaW1tZWRpYXRlbHksIGJlY2F1c2UgYWxsb3dpbmcgaXQgdG8gY29udGludWUgd2lsbCBjYXVzZSBpdCB0bwogICAgICAgICAgICAgICAgICAgIC8vIGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCBiZWZvcmUgd2UndmUgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgd2UgdGhyb3cgYWxsIHRoZSBlcnJvcnMuCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKX0nIG1vZHVsZSBjYW4ndCBpbXBvcnQgaXRzZWxmYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZ01vZHVsZURlZiA9IGdldENvbXBpbGVyRmFjYWRlKCkuY29tcGlsZU5nTW9kdWxlKGFuZ3VsYXJDb3JlRW52LCBgbmc6Ly8vJHttb2R1bGVUeXBlLm5hbWV9L8m1bW9kLmpzYCwgewogICAgICAgICAgICAgICAgICAgIHR5cGU6IG1vZHVsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwOiBmbGF0dGVuKG5nTW9kdWxlLmJvb3RzdHJhcCB8fCBFTVBUWV9BUlJBWSQ1KS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogZGVjbGFyYXRpb25zLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogZmxhdHRlbihuZ01vZHVsZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZXhwYW5kTW9kdWxlV2l0aFByb3ZpZGVycyksCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogZmxhdHRlbihuZ01vZHVsZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZXhwYW5kTW9kdWxlV2l0aFByb3ZpZGVycyksCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hczogbmdNb2R1bGUuc2NoZW1hcyA/IGZsYXR0ZW4obmdNb2R1bGUuc2NoZW1hcykgOiBudWxsLAogICAgICAgICAgICAgICAgICAgIGlkOiBuZ01vZHVsZS5pZCB8fCBudWxsLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBTZXQgYHNjaGVtYXNgIG9uIG5nTW9kdWxlRGVmIHRvIGFuIGVtcHR5IGFycmF5IGluIEpJVCBtb2RlIHRvIGluZGljYXRlIHRoYXQgcnVudGltZQogICAgICAgICAgICAgICAgLy8gc2hvdWxkIHZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyB1bmtub3duIGVsZW1lbnRzIGluIGEgdGVtcGxhdGUuIEluIEFPVCBtb2RlLCB0aGF0IGNoZWNrCiAgICAgICAgICAgICAgICAvLyBoYXBwZW5zIGF0IGNvbXBpbGUgdGltZSBhbmQgYHNjaGVtYXNgIGluZm9ybWF0aW9uIGlzIG5vdCBwcmVzZW50IG9uIENvbXBvbmVudCBhbmQgTW9kdWxlCiAgICAgICAgICAgICAgICAvLyBkZWZzIGFmdGVyIGNvbXBpbGF0aW9uIChzbyB0aGUgY2hlY2sgZG9lc24ndCBoYXBwZW4gdGhlIHNlY29uZCB0aW1lIGF0IHJ1bnRpbWUpLgogICAgICAgICAgICAgICAgaWYgKCFuZ01vZHVsZURlZi5zY2hlbWFzKSB7CiAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVEZWYuc2NoZW1hcyA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ01vZHVsZURlZjsKICAgICAgICB9KQogICAgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdJbmplY3RvckRlZiA9IG51bGw7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlVHlwZSwgTkdfSU5KX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdJbmplY3RvckRlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZURlZigoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVR5cGUpKSkpLCBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZVR5cGUubmFtZSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiBtb2R1bGVUeXBlLAogICAgICAgICAgICAgICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXMobW9kdWxlVHlwZSksCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBuZ01vZHVsZS5wcm92aWRlcnMgfHwgRU1QVFlfQVJSQVkkNSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5leHBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBuZ0luamVjdG9yRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlSW5qZWN0b3IoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke21vZHVsZVR5cGUubmFtZX0vybVpbmouanNgLCBtZXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdJbmplY3RvckRlZjsKICAgICAgICB9KSwKICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0cwogICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICB9KTsKfQovKioKICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAqIEBwYXJhbSB7P30gYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QKICogQHBhcmFtIHs/PX0gaW1wb3J0aW5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZHVsZVR5cGUsIGFsbG93RHVwbGljYXRlRGVjbGFyYXRpb25zSW5Sb290LCBpbXBvcnRpbmdNb2R1bGUpIHsKICAgIGlmICh2ZXJpZmllZE5nTW9kdWxlLmdldChtb2R1bGVUeXBlKSkKICAgICAgICByZXR1cm47CiAgICB2ZXJpZmllZE5nTW9kdWxlLnNldChtb2R1bGVUeXBlLCB0cnVlKTsKICAgIG1vZHVsZVR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZihtb2R1bGVUeXBlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ01vZHVsZURlZjsKICAgIGlmIChpbXBvcnRpbmdNb2R1bGUpIHsKICAgICAgICBuZ01vZHVsZURlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKSkpOwogICAgICAgIGlmICghbmdNb2R1bGVEZWYpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlICcke21vZHVsZVR5cGUubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7aW1wb3J0aW5nTW9kdWxlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUsIHRydWUpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJyb3JzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmRlY2xhcmF0aW9ucyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbXBvcnRzID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5pbXBvcnRzKTsKICAgIGZsYXR0ZW4oaW1wb3J0cykubWFwKHVud3JhcE1vZHVsZVdpdGhQcm92aWRlcnNJbXBvcnRzKS5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gbW9kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBtb2QgPT4gewogICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQobW9kLCBtb2R1bGVUeXBlKTsKICAgICAgICB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZCwgZmFsc2UsIG1vZHVsZVR5cGUpOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXhwb3J0cyA9IG1heWJlVW53cmFwRm4obmdNb2R1bGVEZWYuZXhwb3J0cyk7CiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnMpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2godmVyaWZ5RGlyZWN0aXZlc0hhdmVTZWxlY3Rvcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21iaW5lZERlY2xhcmF0aW9ucyA9IFsKICAgICAgICAuLi5kZWNsYXJhdGlvbnMubWFwKHJlc29sdmVGb3J3YXJkUmVmKSwKICAgICAgICAuLi5mbGF0dGVuKGltcG9ydHMubWFwKGNvbXB1dGVDb21iaW5lZEV4cG9ydHMpKS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgXTsKICAgIGV4cG9ydHMuZm9yRWFjaCh2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZWNsID0+IHZlcmlmeURlY2xhcmF0aW9uSXNVbmlxdWUoZGVjbCwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QpKSk7CiAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlID0gZ2V0QW5ub3RhdGlvbihtb2R1bGVUeXBlLCAnTmdNb2R1bGUnKTsKICAgIGlmIChuZ01vZHVsZSkgewogICAgICAgIG5nTW9kdWxlLmltcG9ydHMgJiYKICAgICAgICAgICAgZmxhdHRlbihuZ01vZHVsZS5pbXBvcnRzKS5tYXAodW53cmFwTW9kdWxlV2l0aFByb3ZpZGVyc0ltcG9ydHMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbW9kID0+IHsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQobW9kLCBtb2R1bGVUeXBlKTsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYobW9kLCBmYWxzZSwgbW9kdWxlVHlwZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICBuZ01vZHVsZS5ib290c3RyYXAgJiYgZGVlcEZvckVhY2gobmdNb2R1bGUuYm9vdHN0cmFwLCB2ZXJpZnlDb3JyZWN0Qm9vdHN0cmFwVHlwZSk7CiAgICAgICAgbmdNb2R1bGUuYm9vdHN0cmFwICYmIGRlZXBGb3JFYWNoKG5nTW9kdWxlLmJvb3RzdHJhcCwgdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7CiAgICAgICAgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzICYmCiAgICAgICAgICAgIGRlZXBGb3JFYWNoKG5nTW9kdWxlLmVudHJ5Q29tcG9uZW50cywgdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7CiAgICB9CiAgICAvLyBUaHJvdyBFcnJvciBpZiBhbnkgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQuCiAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnMuam9pbignXG4nKSk7CiAgICB9CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnModHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlKSB8fCBnZXRQaXBlRGVmKHR5cGUpOwogICAgICAgIGlmICghZGVmKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBVbmV4cGVjdGVkIHZhbHVlICcke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfScgZGVjbGFyZWQgYnkgdGhlIG1vZHVsZSAnJHtzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKX0nLiBQbGVhc2UgYWRkIGEgQFBpcGUvQERpcmVjdGl2ZS9AQ29tcG9uZW50IGFubm90YXRpb24uYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHZlcmlmeURpcmVjdGl2ZXNIYXZlU2VsZWN0b3IodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgICAgIGlmICghZ2V0Q29tcG9uZW50RGVmKHR5cGUpICYmIGRlZiAmJiBkZWYuc2VsZWN0b3JzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBEaXJlY3RpdmUgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gaGFzIG5vIHNlbGVjdG9yLCBwbGVhc2UgYWRkIGl0IWApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2luZCA9IGdldENvbXBvbmVudERlZih0eXBlKSAmJiAnY29tcG9uZW50JyB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkgJiYgJ2RpcmVjdGl2ZScgfHwKICAgICAgICAgICAgZ2V0UGlwZURlZih0eXBlKSAmJiAncGlwZSc7CiAgICAgICAgaWYgKGtpbmQpIHsKICAgICAgICAgICAgLy8gb25seSBjaGVja2VkIGlmIHdlIGFyZSBkZWNsYXJlZCBhcyBDb21wb25lbnQsIERpcmVjdGl2ZSwgb3IgUGlwZQogICAgICAgICAgICAvLyBNb2R1bGVzIGRvbid0IG5lZWQgdG8gYmUgZGVjbGFyZWQgb3IgaW1wb3J0ZWQuCiAgICAgICAgICAgIGlmIChjb21iaW5lZERlY2xhcmF0aW9ucy5sYXN0SW5kZXhPZih0eXBlKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBvcnRpbmcgc29tZXRoaW5nIHdoaWNoIHdlIGRvbid0IGV4cGxpY2l0bHkgZGVjbGFyZSBvciBpbXBvcnQuCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgQ2FuJ3QgZXhwb3J0ICR7a2luZH0gJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gZnJvbSAke3N0cmluZ2lmeUZvckVycm9yKG1vZHVsZVR5cGUpfSBhcyBpdCB3YXMgbmVpdGhlciBkZWNsYXJlZCBub3IgaW1wb3J0ZWQhYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBzdXBwcmVzc0Vycm9ycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5RGVjbGFyYXRpb25Jc1VuaXF1ZSh0eXBlLCBzdXBwcmVzc0Vycm9ycykgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhpc3RpbmdNb2R1bGUgPSBvd25lck5nTW9kdWxlLmdldCh0eXBlKTsKICAgICAgICBpZiAoZXhpc3RpbmdNb2R1bGUgJiYgZXhpc3RpbmdNb2R1bGUgIT09IG1vZHVsZVR5cGUpIHsKICAgICAgICAgICAgaWYgKCFzdXBwcmVzc0Vycm9ycykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtleGlzdGluZ01vZHVsZSwgbW9kdWxlVHlwZV0ubWFwKHN0cmluZ2lmeUZvckVycm9yKS5zb3J0KCk7CiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgVHlwZSAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBpcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbnMgb2YgMiBtb2R1bGVzOiAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19ISBgICsKICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIGNvbnNpZGVyIG1vdmluZyAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSB0byBhIGhpZ2hlciBtb2R1bGUgdGhhdCBpbXBvcnRzICR7bW9kdWxlc1swXX0gYW5kICR7bW9kdWxlc1sxXX0uIGAgKwogICAgICAgICAgICAgICAgICAgIGBZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19LmApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBNYXJrIHR5cGUgYXMgaGF2aW5nIG93bmVyLgogICAgICAgICAgICBvd25lck5nTW9kdWxlLnNldCh0eXBlLCBtb2R1bGVUeXBlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSh0eXBlKSB7CiAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleGlzdGluZ01vZHVsZSA9IG93bmVyTmdNb2R1bGUuZ2V0KHR5cGUpOwogICAgICAgIGlmICghZXhpc3RpbmdNb2R1bGUpIHsKICAgICAgICAgICAgZXJyb3JzLnB1c2goYENvbXBvbmVudCAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBpcyBub3QgcGFydCBvZiBhbnkgTmdNb2R1bGUgb3IgdGhlIG1vZHVsZSBoYXMgbm90IGJlZW4gaW1wb3J0ZWQgaW50byB5b3VyIG1vZHVsZS5gKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5Q29ycmVjdEJvb3RzdHJhcFR5cGUodHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICBpZiAoIWdldENvbXBvbmVudERlZih0eXBlKSkgewogICAgICAgICAgICBlcnJvcnMucHVzaChgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gY2Fubm90IGJlIHVzZWQgYXMgYW4gZW50cnkgY29tcG9uZW50LmApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKHR5cGUpIHsKICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSkgewogICAgICAgICAgICAvLyBXZSBrbm93IHdlIGFyZSBjb21wb25lbnQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBnZXRBbm5vdGF0aW9uKHR5cGUsICdDb21wb25lbnQnKTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuZW50cnlDb21wb25lbnRzKSB7CiAgICAgICAgICAgICAgICBkZWVwRm9yRWFjaChjb21wb25lbnQuZW50cnlDb21wb25lbnRzLCB2ZXJpZnlDb21wb25lbnRJc1BhcnRPZk5nTW9kdWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IGltcG9ydGluZ01vZHVsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZUltcG9ydCh0eXBlLCBpbXBvcnRpbmdNb2R1bGUpIHsKICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGRpcmVjdGl2ZSAnJHt0eXBlLm5hbWV9JyBpbXBvcnRlZCBieSB0aGUgbW9kdWxlICcke2ltcG9ydGluZ01vZHVsZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7CiAgICAgICAgfQogICAgICAgIGlmIChnZXRQaXBlRGVmKHR5cGUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBwaXBlICcke3R5cGUubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7aW1wb3J0aW5nTW9kdWxlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKTsKICAgICAgICB9CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZU9yV2l0aFByb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdW53cmFwTW9kdWxlV2l0aFByb3ZpZGVyc0ltcG9ydHModHlwZU9yV2l0aFByb3ZpZGVycykgewogICAgdHlwZU9yV2l0aFByb3ZpZGVycyA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGVPcldpdGhQcm92aWRlcnMpOwogICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZU9yV2l0aFByb3ZpZGVycykpKS5uZ01vZHVsZSB8fCB0eXBlT3JXaXRoUHJvdmlkZXJzOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBuYW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRBbm5vdGF0aW9uKHR5cGUsIG5hbWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBhbm5vdGF0aW9uID0gbnVsbDsKICAgIGNvbGxlY3QodHlwZS5fX2Fubm90YXRpb25zX18pOwogICAgY29sbGVjdCh0eXBlLmRlY29yYXRvcnMpOwogICAgcmV0dXJuIGFubm90YXRpb247CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbGxlY3QoYW5ub3RhdGlvbnMpIHsKICAgICAgICBpZiAoYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgYW5ub3RhdGlvbnMuZm9yRWFjaChyZWFkQW5ub3RhdGlvbik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlY29yYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVhZEFubm90YXRpb24oZGVjb3JhdG9yKSB7CiAgICAgICAgaWYgKCFhbm5vdGF0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGVjb3JhdG9yKTsKICAgICAgICAgICAgaWYgKHByb3RvLm5nTWV0YWRhdGFOYW1lID09IG5hbWUpIHsKICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVjb3JhdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGVjb3JhdG9yLnR5cGUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRlY29yYXRvci50eXBlKTsKICAgICAgICAgICAgICAgIGlmIChwcm90by5uZ01ldGFkYXRhTmFtZSA9PSBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGRlY29yYXRvci5hcmdzWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBLZWVwIHRyYWNrIG9mIGNvbXBpbGVkIGNvbXBvbmVudHMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gdGVzdHMgd2Ugb2Z0ZW4gd2FudCB0byBjb21waWxlIHRoZQogKiBzYW1lIGNvbXBvbmVudCB3aXRoIG1vcmUgdGhhbiBvbmUgTmdNb2R1bGUuIFRoaXMgd291bGQgY2F1c2UgYW4gZXJyb3IgdW5sZXNzIHdlIHJlc2V0IHdoaWNoCiAqIE5nTW9kdWxlIHRoZSBjb21wb25lbnQgYmVsb25ncyB0by4gV2Uga2VlcCB0aGUgbGlzdCBvZiBjb21waWxlZCBjb21wb25lbnRzIGhlcmUgc28gdGhhdCB0aGUKICogVGVzdEJlZCBjYW4gcmVzZXQgaXQgbGF0ZXIuCiAqIEB0eXBlIHs/fQogKi8KbGV0IG93bmVyTmdNb2R1bGUgPSBuZXcgTWFwKCk7Ci8qKiBAdHlwZSB7P30gKi8KbGV0IHZlcmlmaWVkTmdNb2R1bGUgPSBuZXcgTWFwKCk7Ci8qKgogKiBDb21wdXRlcyB0aGUgY29tYmluZWQgZGVjbGFyYXRpb25zIG9mIGV4cGxpY2l0IGRlY2xhcmF0aW9ucywgYXMgd2VsbCBhcyBkZWNsYXJhdGlvbnMgaW5oZXJpdGVkIGJ5CiAqIHRyYXZlcnNpbmcgdGhlIGV4cG9ydHMgb2YgaW1wb3J0ZWQgbW9kdWxlcy4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21wdXRlQ29tYmluZWRFeHBvcnRzKHR5cGUpIHsKICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYodHlwZSwgdHJ1ZSk7CiAgICByZXR1cm4gWy4uLmZsYXR0ZW4obWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5leHBvcnRzKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHR5cGUpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKHR5cGUpOwogICAgICAgICAgICBpZiAobmdNb2R1bGVEZWYpIHsKICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0pKSldOwp9Ci8qKgogKiBTb21lIGRlY2xhcmVkIGNvbXBvbmVudHMgbWF5IGJlIGNvbXBpbGVkIGFzeW5jaHJvbm91c2x5LCBhbmQgdGh1cyBtYXkgbm90IGhhdmUgdGhlaXIKICogybVjbXAgc2V0IHlldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIGlzIHdyaXR0ZW4gaW50bwogKiB0aGUgYG5nU2VsZWN0b3JTY29wZWAgcHJvcGVydHkgb2YgdGhlIGRlY2xhcmVkIHR5cGUuCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcGFyYW0gez99IG5nTW9kdWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRTY29wZU9uRGVjbGFyZWRDb21wb25lbnRzKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBmbGF0dGVuKG5nTW9kdWxlLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSQ1KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRyYW5zaXRpdmVTY29wZXMgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKG1vZHVsZVR5cGUpOwogICAgZGVjbGFyYXRpb25zLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjbGFyYXRpb24gPT4gewogICAgICAgIGlmIChkZWNsYXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShOR19DT01QX0RFRikpIHsKICAgICAgICAgICAgLy8gQSBgybVjbXBgIGZpZWxkIGV4aXN0cyAtIGdvIGFoZWFkIGFuZCBwYXRjaCB0aGUgY29tcG9uZW50IGRpcmVjdGx5LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbikpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoY29tcG9uZW50KSkpOwogICAgICAgICAgICBwYXRjaENvbXBvbmVudERlZldpdGhTY29wZShjb21wb25lbnREZWYsIHRyYW5zaXRpdmVTY29wZXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghZGVjbGFyYXRpb24uaGFzT3duUHJvcGVydHkoTkdfRElSX0RFRikgJiYgIWRlY2xhcmF0aW9uLmhhc093blByb3BlcnR5KE5HX1BJUEVfREVGKSkgewogICAgICAgICAgICAvLyBTZXQgYG5nU2VsZWN0b3JTY29wZWAgZm9yIGZ1dHVyZSByZWZlcmVuY2Ugd2hlbiB0aGUgY29tcG9uZW50IGNvbXBpbGF0aW9uIGZpbmlzaGVzLgogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmF0aW9uKSkpLm5nU2VsZWN0b3JTY29wZSA9IG1vZHVsZVR5cGU7CiAgICAgICAgfQogICAgfSkpOwp9Ci8qKgogKiBQYXRjaCB0aGUgZGVmaW5pdGlvbiBvZiBhIGNvbXBvbmVudCB3aXRoIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGZyb20gdGhlIGNvbXBpbGF0aW9uIHNjb3BlIG9mCiAqIGEgZ2l2ZW4gbW9kdWxlLgogKiBAdGVtcGxhdGUgQwogKiBAcGFyYW0gez99IGNvbXBvbmVudERlZgogKiBAcGFyYW0gez99IHRyYW5zaXRpdmVTY29wZXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhdGNoQ29tcG9uZW50RGVmV2l0aFNjb3BlKGNvbXBvbmVudERlZiwgdHJhbnNpdGl2ZVNjb3BlcykgewogICAgY29tcG9uZW50RGVmLmRpcmVjdGl2ZURlZnMgPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBBcnJheS5mcm9tKHRyYW5zaXRpdmVTY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcykKICAgICAgICAubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXIgPT4gZGlyLmhhc093blByb3BlcnR5KE5HX0NPTVBfREVGKSA/ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoZGlyKSkpIDogKC8qKiBAdHlwZSB7P30gKi8gKGdldERpcmVjdGl2ZURlZihkaXIpKSkpKQogICAgICAgIC5maWx0ZXIoKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlZiA9PiAhIWRlZikpKTsKICAgIGNvbXBvbmVudERlZi5waXBlRGVmcyA9ICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IEFycmF5LmZyb20odHJhbnNpdGl2ZVNjb3Blcy5jb21waWxhdGlvbi5waXBlcykubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcGlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGlwZSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0UGlwZURlZihwaXBlKSkpKSkpOwogICAgY29tcG9uZW50RGVmLnNjaGVtYXMgPSB0cmFuc2l0aXZlU2NvcGVzLnNjaGVtYXM7CiAgICAvLyBTaW5jZSB3ZSBhdm9pZCBDb21wb25lbnRzL0RpcmVjdGl2ZXMvUGlwZXMgcmVjb21waWxpbmcgaW4gY2FzZSB0aGVyZSBhcmUgbm8gb3ZlcnJpZGVzLCB3ZQogICAgLy8gbWF5IGZhY2UgYSBwcm9ibGVtIHdoZXJlIHByZXZpb3VzbHkgY29tcGlsZWQgZGVmcyBhdmFpbGFibGUgdG8gYSBnaXZlbiBDb21wb25lbnQvRGlyZWN0aXZlCiAgICAvLyBhcmUgY2FjaGVkIGluIFRWaWV3IGFuZCBtYXkgYmVjb21lIHN0YWxlIChpbiBjYXNlIGFueSBvZiB0aGVzZSBkZWZzIGdldHMgcmVjb21waWxlZCkuIEluCiAgICAvLyBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGZvcmNlIGZyZXNoIFRWaWV3IHRvIGJlIGNyZWF0ZWQuCiAgICBjb21wb25lbnREZWYudFZpZXcgPSBudWxsOwp9Ci8qKgogKiBDb21wdXRlIHRoZSBwYWlyIG9mIHRyYW5zaXRpdmUgc2NvcGVzIChjb21waWxhdGlvbiBzY29wZSBhbmQgZXhwb3J0ZWQgc2NvcGUpIGZvciBhIGdpdmVuIG1vZHVsZS4KICoKICogVGhpcyBvcGVyYXRpb24gaXMgbWVtb2l6ZWQgYW5kIHRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBtb2R1bGUncyBkZWZpbml0aW9uLiBUaGlzIGZ1bmN0aW9uIGNhbgogKiBiZSBjYWxsZWQgb24gbW9kdWxlcyB3aXRoIGNvbXBvbmVudHMgdGhhdCBoYXZlIG5vdCBmdWxseSBjb21waWxlZCB5ZXQsIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBub3QKICogYmUgdXNlZCB1bnRpbCB0aGV5IGhhdmUuCiAqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZSBtb2R1bGUgdGhhdCB0cmFuc2l0aXZlIHNjb3BlIHNob3VsZCBiZSBjYWxjdWxhdGVkIGZvci4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHRyYW5zaXRpdmVTY29wZXNGb3IobW9kdWxlVHlwZSkgewogICAgaWYgKCFpc05nTW9kdWxlKG1vZHVsZVR5cGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZVR5cGUubmFtZX0gZG9lcyBub3QgaGF2ZSBhIG1vZHVsZSBkZWYgKMm1bW9kIHByb3BlcnR5KWApOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUpKSk7CiAgICBpZiAoZGVmLnRyYW5zaXRpdmVDb21waWxlU2NvcGVzICE9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGRlZi50cmFuc2l0aXZlQ29tcGlsZVNjb3BlczsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjb3BlcyA9IHsKICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLAogICAgICAgIGNvbXBpbGF0aW9uOiB7CiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSwKICAgICAgICB9LAogICAgICAgIGV4cG9ydGVkOiB7CiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSwKICAgICAgICB9LAogICAgfTsKICAgIG1heWJlVW53cmFwRm4oZGVmLmltcG9ydHMpLmZvckVhY2goKC8qKgogICAgICogQHRlbXBsYXRlIEkKICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChpbXBvcnRlZCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbXBvcnRlZFR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW1wb3J0ZWQpKTsKICAgICAgICBpZiAoIWlzTmdNb2R1bGUoaW1wb3J0ZWRUeXBlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEltcG9ydGluZyAke2ltcG9ydGVkVHlwZS5uYW1lfSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgybVtb2QgcHJvcGVydHlgKTsKICAgICAgICB9CiAgICAgICAgLy8gV2hlbiB0aGlzIG1vZHVsZSBpbXBvcnRzIGFub3RoZXIsIHRoZSBpbXBvcnRlZCBtb2R1bGUncyBleHBvcnRlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhcmUKICAgICAgICAvLyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24gc2NvcGUgb2YgdGhpcyBtb2R1bGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGltcG9ydGVkU2NvcGUgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKGltcG9ydGVkVHlwZSk7CiAgICAgICAgaW1wb3J0ZWRTY29wZS5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHNjb3Blcy5jb21waWxhdGlvbi5kaXJlY3RpdmVzLmFkZChlbnRyeSkpKTsKICAgICAgICBpbXBvcnRlZFNjb3BlLmV4cG9ydGVkLnBpcGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVudHJ5ID0+IHNjb3Blcy5jb21waWxhdGlvbi5waXBlcy5hZGQoZW50cnkpKSk7CiAgICB9KSk7CiAgICBtYXliZVVud3JhcEZuKGRlZi5kZWNsYXJhdGlvbnMpLmZvckVhY2goKC8qKgogICAgICogQHBhcmFtIHs/fSBkZWNsYXJlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjbGFyZWQgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJlZFdpdGhEZWZzID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmVkKSk7CiAgICAgICAgaWYgKGdldFBpcGVEZWYoZGVjbGFyZWRXaXRoRGVmcykpIHsKICAgICAgICAgICAgc2NvcGVzLmNvbXBpbGF0aW9uLnBpcGVzLmFkZChkZWNsYXJlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBFaXRoZXIgZGVjbGFyZWQgaGFzIGEgybVjbXAgb3IgybVkaXIsIG9yIGl0J3MgYSBjb21wb25lbnQgd2hpY2ggaGFzbid0CiAgICAgICAgICAgIC8vIGhhZCBpdHMgdGVtcGxhdGUgY29tcGlsZWQgeWV0LiBJbiBlaXRoZXIgY2FzZSwgaXQgZ2V0cyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24ncwogICAgICAgICAgICAvLyBkaXJlY3RpdmVzLgogICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZGVjbGFyZWQpOwogICAgICAgIH0KICAgIH0pKTsKICAgIG1heWJlVW53cmFwRm4oZGVmLmV4cG9ydHMpLmZvckVhY2goKC8qKgogICAgICogQHRlbXBsYXRlIEUKICAgICAqIEBwYXJhbSB7P30gZXhwb3J0ZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleHBvcnRlZCkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleHBvcnRlZFR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwb3J0ZWQpKTsKICAgICAgICAvLyBFaXRoZXIgdGhlIHR5cGUgaXMgYSBtb2R1bGUsIGEgcGlwZSwgb3IgYSBjb21wb25lbnQvZGlyZWN0aXZlICh3aGljaCBtYXkgbm90IGhhdmUgYQogICAgICAgIC8vIMm1Y21wIGFzIGl0IG1pZ2h0IGJlIGNvbXBpbGVkIGFzeW5jaHJvbm91c2x5KS4KICAgICAgICBpZiAoaXNOZ01vZHVsZShleHBvcnRlZFR5cGUpKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdGhpcyBtb2R1bGUgZXhwb3J0cyBhbm90aGVyLCB0aGUgZXhwb3J0ZWQgbW9kdWxlJ3MgZXhwb3J0ZWQgZGlyZWN0aXZlcyBhbmQgcGlwZXMgYXJlCiAgICAgICAgICAgIC8vIGFkZGVkIHRvIGJvdGggdGhlIGNvbXBpbGF0aW9uIGFuZCBleHBvcnRlZCBzY29wZXMgb2YgdGhpcyBtb2R1bGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhwb3J0ZWRTY29wZSA9IHRyYW5zaXRpdmVTY29wZXNGb3IoZXhwb3J0ZWRUeXBlKTsKICAgICAgICAgICAgZXhwb3J0ZWRTY29wZS5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcy5hZGQoZW50cnkpOwogICAgICAgICAgICAgICAgc2NvcGVzLmV4cG9ydGVkLmRpcmVjdGl2ZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBleHBvcnRlZFNjb3BlLmV4cG9ydGVkLnBpcGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgICAgIHNjb3Blcy5leHBvcnRlZC5waXBlcy5hZGQoZW50cnkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGdldFBpcGVEZWYoZXhwb3J0ZWRUeXBlKSkgewogICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQucGlwZXMuYWRkKGV4cG9ydGVkVHlwZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQuZGlyZWN0aXZlcy5hZGQoZXhwb3J0ZWRUeXBlKTsKICAgICAgICB9CiAgICB9KSk7CiAgICBkZWYudHJhbnNpdGl2ZUNvbXBpbGVTY29wZXMgPSBzY29wZXM7CiAgICByZXR1cm4gc2NvcGVzOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHBhbmRNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSB7CiAgICBpZiAoaXNNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZS5uZ01vZHVsZTsKICAgIH0KICAgIHJldHVybiB2YWx1ZTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSB7CiAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKS5uZ01vZHVsZSAhPT0gdW5kZWZpbmVkOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc05nTW9kdWxlKHZhbHVlKSB7CiAgICByZXR1cm4gISFnZXROZ01vZHVsZURlZih2YWx1ZSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaml0L2RpcmVjdGl2ZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ29tcGlsZSBhbiBBbmd1bGFyIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICogY29tcG9uZW50IGRlZiAoybVjbXApIG9udG8gdGhlIGNvbXBvbmVudCB0eXBlLgogKgogKiBDb21waWxhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzIChkdWUgdG8gdGhlIG5lZWQgdG8gcmVzb2x2ZSBVUkxzIGZvciB0aGUgY29tcG9uZW50IHRlbXBsYXRlIG9yCiAqIG90aGVyIHJlc291cmNlcywgZm9yIGV4YW1wbGUpLiBJbiB0aGUgZXZlbnQgdGhhdCBjb21waWxhdGlvbiBpcyBub3QgaW1tZWRpYXRlLCBgY29tcGlsZUNvbXBvbmVudGAKICogd2lsbCBlbnF1ZXVlIHJlc291cmNlIHJlc29sdXRpb24gaW50byBhIGdsb2JhbCBxdWV1ZSBhbmQgd2lsbCBmYWlsIHRvIHJldHVybiB0aGUgYMm1Y21wYAogKiB1bnRpbCB0aGUgZ2xvYmFsIHF1ZXVlIGhhcyBiZWVuIHJlc29sdmVkIHdpdGggYSBjYWxsIHRvIGByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzYC4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGNvbXBpbGVDb21wb25lbnQodHlwZSwgbWV0YWRhdGEpIHsKICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBjb21waWxlQ29tcG9uZW50LgogICAgLy8gU2VlIHRoZSBgaW5pdE5nRGV2TW9kZWAgZG9jc3RyaW5nIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiYgaW5pdE5nRGV2TW9kZSgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nQ29tcG9uZW50RGVmID0gbnVsbDsKICAgIC8vIE1ldGFkYXRhIG1heSBoYXZlIHJlc291cmNlcyB3aGljaCBuZWVkIHRvIGJlIHJlc29sdmVkLgogICAgbWF5YmVRdWV1ZVJlc29sdXRpb25PZkNvbXBvbmVudFJlc291cmNlcyh0eXBlLCBtZXRhZGF0YSk7CiAgICAvLyBOb3RlIHRoYXQgd2UncmUgdXNpbmcgdGhlIHNhbWUgZnVuY3Rpb24gYXMgYERpcmVjdGl2ZWAsIGJlY2F1c2UgdGhhdCdzIG9ubHkgc3Vic2V0IG9mIG1ldGFkYXRhCiAgICAvLyB0aGF0IHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZ0ZhY3RvcnlEZWYuIFdlJ3JlIGF2b2lkaW5nIHVzaW5nIHRoZSBjb21wb25lbnQgbWV0YWRhdGEKICAgIC8vIGJlY2F1c2Ugd2UnZCBoYXZlIHRvIHJlc29sdmUgdGhlIGFzeW5jaHJvbm91cyB0ZW1wbGF0ZXMuCiAgICBhZGREaXJlY3RpdmVGYWN0b3J5RGVmKHR5cGUsIG1ldGFkYXRhKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19DT01QX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdDb21wb25lbnREZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnROZWVkc1Jlc29sdXRpb24obWV0YWRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gW2BDb21wb25lbnQgJyR7dHlwZS5uYW1lfScgaXMgbm90IHJlc29sdmVkOmBdOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS50ZW1wbGF0ZVVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGAgLSB0ZW1wbGF0ZVVybDogJHttZXRhZGF0YS50ZW1wbGF0ZVVybH1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnN0eWxlVXJscyAmJiBtZXRhZGF0YS5zdHlsZVVybHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnB1c2goYCAtIHN0eWxlVXJsczogJHtKU09OLnN0cmluZ2lmeShtZXRhZGF0YS5zdHlsZVVybHMpfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlcnJvci5wdXNoKGBEaWQgeW91IHJ1biBhbmQgd2FpdCBmb3IgJ3Jlc29sdmVDb21wb25lbnRSZXNvdXJjZXMoKSc/YCk7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLmpvaW4oJ1xuJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhpcyBjb25zdCB3YXMgY2FsbGVkIGBqaXRPcHRpb25zYCBwcmV2aW91c2x5IGJ1dCBoYWQgdG8gYmUgcmVuYW1lZCB0byBgb3B0aW9uc2AgYmVjYXVzZQogICAgICAgICAgICAgICAgLy8gb2YgYSBidWcgd2l0aCBUZXJzZXIgdGhhdCBjYXVzZWQgb3B0aW1pemVkIEpJVCBidWlsZHMgdG8gdGhyb3cgYSBgUmVmZXJlbmNlRXJyb3JgLgogICAgICAgICAgICAgICAgLy8gVGhpcyBidWcgd2FzIGludmVzdGlnYXRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9pc3N1ZXMvMTcyNjQuCiAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IHJlbmFtZSBpdCBiYWNrIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJzZXIvdGVyc2VyL2lzc3Vlcy82MTUgaXMgZml4ZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0Sml0T3B0aW9ucygpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHByZXNlcnZlV2hpdGVzcGFjZXMgPSBtZXRhZGF0YS5wcmVzZXJ2ZVdoaXRlc3BhY2VzOwogICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlV2hpdGVzcGFjZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGVuY2Fwc3VsYXRpb24gPSBtZXRhZGF0YS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAgICAgaWYgKGVuY2Fwc3VsYXRpb24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uID0gb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24gPSBWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlVXJsID0gbWV0YWRhdGEudGVtcGxhdGVVcmwgfHwgYG5nOi8vLyR7dHlwZS5uYW1lfS90ZW1wbGF0ZS5odG1sYDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIG1ldGFkYXRhKSksIHsgdHlwZVNvdXJjZVNwYW46IGNvbXBpbGVyLmNyZWF0ZVBhcnNlU291cmNlU3BhbignQ29tcG9uZW50JywgdHlwZS5uYW1lLCB0ZW1wbGF0ZVVybCksIHRlbXBsYXRlOiBtZXRhZGF0YS50ZW1wbGF0ZSB8fCAnJywgcHJlc2VydmVXaGl0ZXNwYWNlcywgc3R5bGVzOiBtZXRhZGF0YS5zdHlsZXMgfHwgRU1QVFlfQVJSQVksIGFuaW1hdGlvbnM6IG1ldGFkYXRhLmFuaW1hdGlvbnMsIGRpcmVjdGl2ZXM6IFtdLCBjaGFuZ2VEZXRlY3Rpb246IG1ldGFkYXRhLmNoYW5nZURldGVjdGlvbiwgcGlwZXM6IG5ldyBNYXAoKSwgZW5jYXBzdWxhdGlvbiwgaW50ZXJwb2xhdGlvbjogbWV0YWRhdGEuaW50ZXJwb2xhdGlvbiwgdmlld1Byb3ZpZGVyczogbWV0YWRhdGEudmlld1Byb3ZpZGVycyB8fCBudWxsIH0pOwogICAgICAgICAgICAgICAgaWYgKG1ldGEudXNlc0luaGVyaXRhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgYWRkRGlyZWN0aXZlRGVmVG9VbmRlY29yYXRlZFBhcmVudHModHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZ0NvbXBvbmVudERlZiA9IGNvbXBpbGVyLmNvbXBpbGVDb21wb25lbnQoYW5ndWxhckNvcmVFbnYsIHRlbXBsYXRlVXJsLCBtZXRhKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gTmdNb2R1bGUgZGVjb3JhdG9yIGV4ZWN1dGVkLCB3ZSBlbnF1ZXVlZCB0aGUgbW9kdWxlIGRlZmluaXRpb24gc3VjaCB0aGF0CiAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBvbmx5IGRlcXVldWUgYW5kIGFkZCBpdHNlbGYgYXMgbW9kdWxlIHNjb3BlIHRvIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zLAogICAgICAgICAgICAgICAgLy8gYnV0IG9ubHkgaWYgIGlmIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zIGhhZCByZXNvbHZlZC4gVGhpcyBjYWxsIHJ1bnMgdGhlIGNoZWNrCiAgICAgICAgICAgICAgICAvLyB0byBzZWUgaWYgYW55IG1vZHVsZXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlIGNhbiBiZSBkZXF1ZXVlZCBhbmQgYWRkIHNjb3BlIHRvCiAgICAgICAgICAgICAgICAvLyB0aGVpciBkZWNsYXJhdGlvbnMuCiAgICAgICAgICAgICAgICBmbHVzaE1vZHVsZVNjb3BpbmdRdWV1ZUFzTXVjaEFzUG9zc2libGUoKTsKICAgICAgICAgICAgICAgIC8vIElmIGNvbXBvbmVudCBjb21waWxhdGlvbiBpcyBhc3luYywgdGhlbiB0aGUgQE5nTW9kdWxlIGFubm90YXRpb24gd2hpY2ggZGVjbGFyZXMgdGhlCiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGV4ZWN1dGUgYW5kIHNldCBhbiBuZ1NlbGVjdG9yU2NvcGUgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudCB0eXBlLiBUaGlzCiAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbXBvbmVudCB0byBwYXRjaCBpdHNlbGYgd2l0aCBkaXJlY3RpdmVEZWZzIGZyb20gdGhlIG1vZHVsZSBhZnRlciBpdAogICAgICAgICAgICAgICAgLy8gZmluaXNoZXMgY29tcGlsaW5nLgogICAgICAgICAgICAgICAgaWYgKGhhc1NlbGVjdG9yU2NvcGUodHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVzID0gdHJhbnNpdGl2ZVNjb3Blc0Zvcih0eXBlLm5nU2VsZWN0b3JTY29wZSk7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUobmdDb21wb25lbnREZWYsIHNjb3Blcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5nQ29tcG9uZW50RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwp9Ci8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IGNvbXBvbmVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaGFzU2VsZWN0b3JTY29wZShjb21wb25lbnQpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudCkpKS5uZ1NlbGVjdG9yU2NvcGUgIT09IHVuZGVmaW5lZDsKfQovKioKICogQ29tcGlsZSBhbiBBbmd1bGFyIGRpcmVjdGl2ZSBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICogZGlyZWN0aXZlIGRlZiBvbnRvIHRoZSBjb21wb25lbnQgdHlwZS4KICoKICogSW4gdGhlIGV2ZW50IHRoYXQgY29tcGlsYXRpb24gaXMgbm90IGltbWVkaWF0ZSwgYGNvbXBpbGVEaXJlY3RpdmVgIHdpbGwgcmV0dXJuIGEgYFByb21pc2VgIHdoaWNoCiAqIHdpbGwgcmVzb2x2ZSB3aGVuIGNvbXBpbGF0aW9uIGNvbXBsZXRlcyBhbmQgdGhlIGRpcmVjdGl2ZSBiZWNvbWVzIHVzYWJsZS4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gZGlyZWN0aXZlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21waWxlRGlyZWN0aXZlKHR5cGUsIGRpcmVjdGl2ZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5nRGlyZWN0aXZlRGVmID0gbnVsbDsKICAgIGFkZERpcmVjdGl2ZUZhY3RvcnlEZWYodHlwZSwgZGlyZWN0aXZlIHx8IHt9KTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19ESVJfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ0RpcmVjdGl2ZURlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gYGRpcmVjdGl2ZWAgY2FuIGJlIG51bGwgaW4gdGhlIGNhc2Ugb2YgYWJzdHJhY3QgZGlyZWN0aXZlcyBhcyBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgICAgIC8vIHRoYXQgdXNlIGBARGlyZWN0aXZlKClgIHdpdGggbm8gc2VsZWN0b3IuIEluIHRoYXQgY2FzZSwgcGFzcyBlbXB0eSBvYmplY3QgdG8gdGhlCiAgICAgICAgICAgICAgICAvLyBgZGlyZWN0aXZlTWV0YWRhdGFgIGZ1bmN0aW9uIGluc3RlYWQgb2YgbnVsbC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBnZXREaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBkaXJlY3RpdmUgfHwge30pOwogICAgICAgICAgICAgICAgbmdEaXJlY3RpdmVEZWYgPQogICAgICAgICAgICAgICAgICAgIGdldENvbXBpbGVyRmFjYWRlKCkuY29tcGlsZURpcmVjdGl2ZShhbmd1bGFyQ29yZUVudiwgbWV0YS5zb3VyY2VNYXBVcmwsIG1ldGEubWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ0RpcmVjdGl2ZURlZjsKICAgICAgICB9KSwKICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0cwogICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICB9KTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIG1ldGFkYXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBuYW1lID0gdHlwZSAmJiB0eXBlLm5hbWU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzb3VyY2VNYXBVcmwgPSBgbmc6Ly8vJHtuYW1lfS/JtWRpci5qc2A7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmYWNhZGUgPSBkaXJlY3RpdmVNZXRhZGF0YSgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpLCBtZXRhZGF0YSk7CiAgICBmYWNhZGUudHlwZVNvdXJjZVNwYW4gPSBjb21waWxlci5jcmVhdGVQYXJzZVNvdXJjZVNwYW4oJ0RpcmVjdGl2ZScsIG5hbWUsIHNvdXJjZU1hcFVybCk7CiAgICBpZiAoZmFjYWRlLnVzZXNJbmhlcml0YW5jZSkgewogICAgICAgIGFkZERpcmVjdGl2ZURlZlRvVW5kZWNvcmF0ZWRQYXJlbnRzKHR5cGUpOwogICAgfQogICAgcmV0dXJuIHsgbWV0YWRhdGE6IGZhY2FkZSwgc291cmNlTWFwVXJsIH07Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREaXJlY3RpdmVGYWN0b3J5RGVmKHR5cGUsIG1ldGFkYXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdGYWN0b3J5RGVmID0gbnVsbDsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19GQUNUT1JZX0RFRiwgewogICAgICAgIGdldDogKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gZ2V0RGlyZWN0aXZlTWV0YWRhdGEodHlwZSwgbWV0YWRhdGEpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke3R5cGUubmFtZX0vybVmYWMuanNgLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1ldGEubWV0YWRhdGEpLCB7IGluamVjdEZuOiAnZGlyZWN0aXZlSW5qZWN0JywgdGFyZ2V0OiBjb21waWxlci5SM0ZhY3RvcnlUYXJnZXQuRGlyZWN0aXZlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdGYWN0b3J5RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dGVuZHNEaXJlY3RseUZyb21PYmplY3QodHlwZSkgewogICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGU7Cn0KLyoqCiAqIEV4dHJhY3QgdGhlIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYCBmb3IgYSBwYXJ0aWN1bGFyIGRpcmVjdGl2ZSAoZWl0aGVyIGEgYERpcmVjdGl2ZWAgb3IgYQogKiBgQ29tcG9uZW50YCkuCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGFkYXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBtZXRhZGF0YSkgewogICAgLy8gUmVmbGVjdCBpbnB1dHMgYW5kIG91dHB1dHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWZsZWN0ID0gZ2V0UmVmbGVjdCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcHJvcE1ldGFkYXRhID0gcmVmbGVjdC5vd25Qcm9wTWV0YWRhdGEodHlwZSk7CiAgICByZXR1cm4gewogICAgICAgIG5hbWU6IHR5cGUubmFtZSwKICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgIHNlbGVjdG9yOiBtZXRhZGF0YS5zZWxlY3RvciAhPT0gdW5kZWZpbmVkID8gbWV0YWRhdGEuc2VsZWN0b3IgOiBudWxsLAogICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgaG9zdDogbWV0YWRhdGEuaG9zdCB8fCBFTVBUWV9PQkosCiAgICAgICAgcHJvcE1ldGFkYXRhOiBwcm9wTWV0YWRhdGEsCiAgICAgICAgaW5wdXRzOiBtZXRhZGF0YS5pbnB1dHMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgb3V0cHV0czogbWV0YWRhdGEub3V0cHV0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICBxdWVyaWVzOiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNDb250ZW50UXVlcnkpLAogICAgICAgIGxpZmVjeWNsZTogeyB1c2VzT25DaGFuZ2VzOiByZWZsZWN0Lmhhc0xpZmVjeWNsZUhvb2sodHlwZSwgJ25nT25DaGFuZ2VzJykgfSwKICAgICAgICB0eXBlU291cmNlU3BhbjogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICB1c2VzSW5oZXJpdGFuY2U6ICFleHRlbmRzRGlyZWN0bHlGcm9tT2JqZWN0KHR5cGUpLAogICAgICAgIGV4cG9ydEFzOiBleHRyYWN0RXhwb3J0QXMobWV0YWRhdGEuZXhwb3J0QXMpLAogICAgICAgIHByb3ZpZGVyczogbWV0YWRhdGEucHJvdmlkZXJzIHx8IG51bGwsCiAgICAgICAgdmlld1F1ZXJpZXM6IGV4dHJhY3RRdWVyaWVzTWV0YWRhdGEodHlwZSwgcHJvcE1ldGFkYXRhLCBpc1ZpZXdRdWVyeSkKICAgIH07Cn0KLyoqCiAqIEFkZHMgYSBkaXJlY3RpdmUgZGVmaW5pdGlvbiB0byBhbGwgcGFyZW50IGNsYXNzZXMgb2YgYSB0eXBlIHRoYXQgZG9uJ3QgaGF2ZSBhbiBBbmd1bGFyIGRlY29yYXRvci4KICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREaXJlY3RpdmVEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvYmpQcm90b3R5cGUgPSBPYmplY3QucHJvdG90eXBlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkuY29uc3RydWN0b3I7CiAgICAvLyBHbyB1cCB0aGUgcHJvdG90eXBlIHVudGlsIHdlIGhpdCBgT2JqZWN0YC4KICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBvYmpQcm90b3R5cGUpIHsKICAgICAgICAvLyBTaW5jZSBpbmhlcml0YW5jZSB3b3JrcyBpZiB0aGUgY2xhc3Mgd2FzIGFubm90YXRlZCBhbHJlYWR5LCB3ZSBvbmx5IG5lZWQgdG8gYWRkCiAgICAgICAgLy8gdGhlIGRlZiBpZiB0aGVyZSBhcmUgbm8gYW5ub3RhdGlvbnMgYW5kIHRoZSBkZWYgaGFzbid0IGJlZW4gY3JlYXRlZCBhbHJlYWR5LgogICAgICAgIGlmICghZ2V0RGlyZWN0aXZlRGVmKHBhcmVudCkgJiYgIWdldENvbXBvbmVudERlZihwYXJlbnQpICYmCiAgICAgICAgICAgIHNob3VsZEFkZEFic3RyYWN0RGlyZWN0aXZlKHBhcmVudCkpIHsKICAgICAgICAgICAgY29tcGlsZURpcmVjdGl2ZShwYXJlbnQsIG51bGwpOwogICAgICAgIH0KICAgICAgICBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSBzZWxlY3RvcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydFRvUjNRdWVyeVByZWRpY2F0ZShzZWxlY3RvcikgewogICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBzcGxpdEJ5Q29tbWEoc2VsZWN0b3IpIDogcmVzb2x2ZUZvcndhcmRSZWYoc2VsZWN0b3IpOwp9Ci8qKgogKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZQogKiBAcGFyYW0gez99IGFubgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29udmVydFRvUjNRdWVyeU1ldGFkYXRhKHByb3BlcnR5TmFtZSwgYW5uKSB7CiAgICByZXR1cm4gewogICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLAogICAgICAgIHByZWRpY2F0ZTogY29udmVydFRvUjNRdWVyeVByZWRpY2F0ZShhbm4uc2VsZWN0b3IpLAogICAgICAgIGRlc2NlbmRhbnRzOiBhbm4uZGVzY2VuZGFudHMsCiAgICAgICAgZmlyc3Q6IGFubi5maXJzdCwKICAgICAgICByZWFkOiBhbm4ucmVhZCA/IGFubi5yZWFkIDogbnVsbCwKICAgICAgICBzdGF0aWM6ICEhYW5uLnN0YXRpYwogICAgfTsKfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gcHJvcE1ldGFkYXRhCiAqIEBwYXJhbSB7P30gaXNRdWVyeUFubgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXh0cmFjdFF1ZXJpZXNNZXRhZGF0YSh0eXBlLCBwcm9wTWV0YWRhdGEsIGlzUXVlcnlBbm4pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHF1ZXJpZXNNZXRhID0gW107CiAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHByb3BNZXRhZGF0YSkgewogICAgICAgIGlmIChwcm9wTWV0YWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBwcm9wTWV0YWRhdGFbZmllbGRdOwogICAgICAgICAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFubiA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaXNRdWVyeUFubihhbm4pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbm4uc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBjb25zdHJ1Y3QgYSBxdWVyeSBmb3IgdGhlIHByb3BlcnR5ICIke2ZpZWxkfSIgb2YgYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIiR7c3RyaW5naWZ5Rm9yRXJyb3IodHlwZSl9IiBzaW5jZSB0aGUgcXVlcnkgc2VsZWN0b3Igd2Fzbid0IGRlZmluZWQuYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucy5zb21lKGlzSW5wdXRBbm5vdGF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21iaW5lIEBJbnB1dCBkZWNvcmF0b3JzIHdpdGggcXVlcnkgZGVjb3JhdG9yc2ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxdWVyaWVzTWV0YS5wdXNoKGNvbnZlcnRUb1IzUXVlcnlNZXRhZGF0YShmaWVsZCwgYW5uKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcXVlcmllc01ldGE7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXhwb3J0QXMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRBcyhleHBvcnRBcykgewogICAgcmV0dXJuIGV4cG9ydEFzID09PSB1bmRlZmluZWQgPyBudWxsIDogc3BsaXRCeUNvbW1hKGV4cG9ydEFzKTsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNDb250ZW50UXVlcnkodmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgIHJldHVybiBuYW1lID09PSAnQ29udGVudENoaWxkJyB8fCBuYW1lID09PSAnQ29udGVudENoaWxkcmVuJzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNWaWV3UXVlcnkodmFsdWUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgIHJldHVybiBuYW1lID09PSAnVmlld0NoaWxkJyB8fCBuYW1lID09PSAnVmlld0NoaWxkcmVuJzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNJbnB1dEFubm90YXRpb24odmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZS5uZ01ldGFkYXRhTmFtZSA9PT0gJ0lucHV0JzsKfQovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gc3BsaXRCeUNvbW1hKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAoKC8qKgogICAgICogQHBhcmFtIHs/fSBwaWVjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGllY2UgPT4gcGllY2UudHJpbSgpKSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBMSUZFQ1lDTEVfSE9PS1MgPSBbCiAgICAnbmdPbkNoYW5nZXMnLCAnbmdPbkluaXQnLCAnbmdPbkRlc3Ryb3knLCAnbmdEb0NoZWNrJywgJ25nQWZ0ZXJWaWV3SW5pdCcsICduZ0FmdGVyVmlld0NoZWNrZWQnLAogICAgJ25nQWZ0ZXJDb250ZW50SW5pdCcsICduZ0FmdGVyQ29udGVudENoZWNrZWQnCl07Ci8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNob3VsZEFkZEFic3RyYWN0RGlyZWN0aXZlKHR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlZmxlY3QgPSBnZXRSZWZsZWN0KCk7CiAgICBpZiAoTElGRUNZQ0xFX0hPT0tTLnNvbWUoKC8qKgogICAgICogQHBhcmFtIHs/fSBob29rTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaG9va05hbWUgPT4gcmVmbGVjdC5oYXNMaWZlY3ljbGVIb29rKHR5cGUsIGhvb2tOYW1lKSkpKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSByZWZsZWN0LnByb3BNZXRhZGF0YSh0eXBlKTsKICAgIGZvciAoY29uc3QgZmllbGQgaW4gcHJvcE1ldGFkYXRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gcHJvcE1ldGFkYXRhW2ZpZWxkXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGFubm90YXRpb25zW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhTmFtZSA9IGN1cnJlbnQubmdNZXRhZGF0YU5hbWU7CiAgICAgICAgICAgIGlmIChpc0lucHV0QW5ub3RhdGlvbihjdXJyZW50KSB8fCBpc0NvbnRlbnRRdWVyeShjdXJyZW50KSB8fCBpc1ZpZXdRdWVyeShjdXJyZW50KSB8fAogICAgICAgICAgICAgICAgbWV0YWRhdGFOYW1lID09PSAnT3V0cHV0JyB8fCBtZXRhZGF0YU5hbWUgPT09ICdIb3N0QmluZGluZycgfHwKICAgICAgICAgICAgICAgIG1ldGFkYXRhTmFtZSA9PT0gJ0hvc3RMaXN0ZW5lcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ppdC9waXBlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb21waWxlUGlwZSh0eXBlLCBtZXRhKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmdQaXBlRGVmID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ0ZhY3RvcnlEZWYgPSBudWxsOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX0ZBQ1RPUllfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ0ZhY3RvcnlEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UGlwZU1ldGFkYXRhKHR5cGUsIG1ldGEpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke21ldGFkYXRhLm5hbWV9L8m1ZmFjLmpzYCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXRhZGF0YSksIHsgaW5qZWN0Rm46ICdkaXJlY3RpdmVJbmplY3QnLCB0YXJnZXQ6IGNvbXBpbGVyLlIzRmFjdG9yeVRhcmdldC5QaXBlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmdGYWN0b3J5RGVmOwogICAgICAgIH0pLAogICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgIH0pOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX1BJUEVfREVGLCB7CiAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChuZ1BpcGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UGlwZU1ldGFkYXRhKHR5cGUsIG1ldGEpOwogICAgICAgICAgICAgICAgbmdQaXBlRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlUGlwZShhbmd1bGFyQ29yZUVudiwgYG5nOi8vLyR7bWV0YWRhdGEubmFtZX0vybVwaXBlLmpzYCwgbWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZ1BpcGVEZWY7CiAgICAgICAgfSksCiAgICAgICAgLy8gTWFrZSB0aGUgcHJvcGVydHkgY29uZmlndXJhYmxlIGluIGRldiBtb2RlIHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gdGVzdHMKICAgICAgICBjb25maWd1cmFibGU6ICEhbmdEZXZNb2RlLAogICAgfSk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldFBpcGVNZXRhZGF0YSh0eXBlLCBtZXRhKSB7CiAgICByZXR1cm4gewogICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgdHlwZUFyZ3VtZW50Q291bnQ6IDAsCiAgICAgICAgbmFtZTogdHlwZS5uYW1lLAogICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgcGlwZU5hbWU6IG1ldGEubmFtZSwKICAgICAgICBwdXJlOiBtZXRhLnB1cmUgIT09IHVuZGVmaW5lZCA/IG1ldGEucHVyZSA6IHRydWUKICAgIH07Cn0KLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTAkZSA9IC8qKgogKiBAcGFyYW0gez89fSBkaXIKICogQHJldHVybiB7P30KICovCihkaXIgPSB7fSkgPT4gZGlyLCDJtTEkMyA9IC8qKgogKiBAcGFyYW0gez99IHR5cGUKICogQHBhcmFtIHs/fSBtZXRhCiAqIEByZXR1cm4gez99CiAqLwoodHlwZSwgbWV0YSkgPT4gU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFKHR5cGUsIG1ldGEpOwovKioKICogVHlwZSBvZiB0aGUgRGlyZWN0aXZlIG1ldGFkYXRhLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IERpcmVjdGl2ZSA9IG1ha2VEZWNvcmF0b3IoJ0RpcmVjdGl2ZScsICjJtTAkZSksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUxJDMpKTsKLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdApjb25zdCDJtTIkMSA9IC8qKgogKiBAcGFyYW0gez89fSBjCiAqIEByZXR1cm4gez99CiAqLwooYyA9IHt9KSA9PiAoT2JqZWN0LmFzc2lnbih7IGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCB9LCBjKSksIMm1MyQxID0gLyoqCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCih0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlQodHlwZSwgbWV0YSk7Ci8qKgogKiBDb21wb25lbnQgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICoKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ29tcG9uZW50ID0gbWFrZURlY29yYXRvcignQ29tcG9uZW50JywgKMm1MiQxKSwgRGlyZWN0aXZlLCB1bmRlZmluZWQsICjJtTMkMSkpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NCA9IC8qKgogKiBAcGFyYW0gez99IHAKICogQHJldHVybiB7P30KICovCihwKSA9PiAoT2JqZWN0LmFzc2lnbih7IHB1cmU6IHRydWUgfSwgcCkpLCDJtTUgPSAvKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gbWV0YQogKiBAcmV0dXJuIHs/fQogKi8KKHR5cGUsIG1ldGEpID0+IFNXSVRDSF9DT01QSUxFX1BJUEUodHlwZSwgbWV0YSk7Ci8qKgogKiBcQEFubm90YXRpb24KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBQaXBlID0gbWFrZURlY29yYXRvcignUGlwZScsICjJtTQpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKMm1NSkpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NiA9IC8qKgogKiBAcGFyYW0gez89fSBiaW5kaW5nUHJvcGVydHlOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYmluZGluZ1Byb3BlcnR5TmFtZSkgPT4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IElucHV0ID0gbWFrZVByb3BEZWNvcmF0b3IoJ0lucHV0JywgKMm1NikpOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1NyA9IC8qKgogKiBAcGFyYW0gez89fSBiaW5kaW5nUHJvcGVydHlOYW1lCiAqIEByZXR1cm4gez99CiAqLwooYmluZGluZ1Byb3BlcnR5TmFtZSkgPT4gKHsgYmluZGluZ1Byb3BlcnR5TmFtZSB9KTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE91dHB1dCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdPdXRwdXQnLCAoybU3KSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybU4ID0gLyoqCiAqIEBwYXJhbSB7Pz19IGhvc3RQcm9wZXJ0eU5hbWUKICogQHJldHVybiB7P30KICovCihob3N0UHJvcGVydHlOYW1lKSA9PiAoeyBob3N0UHJvcGVydHlOYW1lIH0pOwovKioKICogXEBBbm5vdGF0aW9uCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSG9zdEJpbmRpbmcgPSBtYWtlUHJvcERlY29yYXRvcignSG9zdEJpbmRpbmcnLCAoybU4KSk7Ci8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKY29uc3QgybU5ID0gLyoqCiAqIEBwYXJhbSB7Pz19IGV2ZW50TmFtZQogKiBAcGFyYW0gez89fSBhcmdzCiAqIEByZXR1cm4gez99CiAqLwooZXZlbnROYW1lLCBhcmdzKSA9PiAoeyBldmVudE5hbWUsIGFyZ3MgfSk7Ci8qKgogKiBEZWNvcmF0b3IgdGhhdCBiaW5kcyBhIERPTSBldmVudCB0byBhIGhvc3QgbGlzdGVuZXIgYW5kIHN1cHBsaWVzIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCiAqIEFuZ3VsYXIgaW52b2tlcyB0aGUgc3VwcGxpZWQgaGFuZGxlciBtZXRob2Qgd2hlbiB0aGUgaG9zdCBlbGVtZW50IGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQsCiAqIGFuZCB1cGRhdGVzIHRoZSBib3VuZCBlbGVtZW50IHdpdGggdGhlIHJlc3VsdC4KICoKICogSWYgdGhlIGhhbmRsZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIGFwcGxpZXMgYHByZXZlbnREZWZhdWx0YCBvbiB0aGUgYm91bmQgZWxlbWVudC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZQogKiB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gYSBidXR0b24gYW5kIGNvdW50cyBjbGlja3MuCiAqCiAqIGBgYHRzCiAqIFxARGlyZWN0aXZlKHtzZWxlY3RvcjogJ2J1dHRvbltjb3VudGluZ10nfSkKICogY2xhc3MgQ291bnRDbGlja3MgewogKiAgIG51bWJlck9mQ2xpY2tzID0gMDsKICoKICogXEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pCiAqICAgb25DbGljayhidG4pIHsKICogICAgIGNvbnNvbGUubG9nKCdidXR0b24nLCBidG4sICdudW1iZXIgb2YgY2xpY2tzOicsIHRoaXMubnVtYmVyT2ZDbGlja3MrKyk7CiAqICB9CiAqIH0KICoKICogXEBDb21wb25lbnQoewogKiAgIHNlbGVjdG9yOiAnYXBwJywKICogICB0ZW1wbGF0ZTogJzxidXR0b24gY291bnRpbmc+SW5jcmVtZW50PC9idXR0b24+JywKICogfSkKICogY2xhc3MgQXBwIHt9CiAqCiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmVnaXN0ZXJzIGFub3RoZXIgRE9NIGV2ZW50IGhhbmRsZXIgdGhhdCBsaXN0ZW5zIGZvciBrZXktcHJlc3MgZXZlbnRzLgogKiBgYGAgdHMKICogaW1wb3J0IHsgSG9zdExpc3RlbmVyLCBDb21wb25lbnQgfSBmcm9tICJcQGFuZ3VsYXIvY29yZSI7CiAqCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ2FwcCcsCiAqICAgdGVtcGxhdGU6IGA8aDE+SGVsbG8sIHlvdSBoYXZlIHByZXNzZWQga2V5cyB7e2NvdW50ZXJ9fSBudW1iZXIgb2YgdGltZXMhPC9oMT4gUHJlc3MgYW55IGtleSB0bwogKiBpbmNyZW1lbnQgdGhlIGNvdW50ZXIuCiAqICAgPGJ1dHRvbiAoY2xpY2spPSJyZXNldENvdW50ZXIoKSI+UmVzZXQgQ291bnRlcjwvYnV0dG9uPmAKICogfSkKICogY2xhc3MgQXBwQ29tcG9uZW50IHsKICogICBjb3VudGVyID0gMDsKICogXEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSkKICogICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7CiAqICAgICB0aGlzLmNvdW50ZXIrKzsKICogICB9CiAqICAgcmVzZXRDb3VudGVyKCkgewogKiAgICAgdGhpcy5jb3VudGVyID0gMDsKICogICB9CiAqIH0KICogYGBgCiAqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEhvc3RMaXN0ZW5lciA9IG1ha2VQcm9wRGVjb3JhdG9yKCdIb3N0TGlzdGVuZXInLCAoybU5KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NPTVBJTEVfQ09NUE9ORU5UX19QT1NUX1IzX18gPSBjb21waWxlQ29tcG9uZW50OwovKiogQHR5cGUgez99ICovCmNvbnN0IFNXSVRDSF9DT01QSUxFX0RJUkVDVElWRV9fUE9TVF9SM19fID0gY29tcGlsZURpcmVjdGl2ZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFX19QT1NUX1IzX18gPSBjb21waWxlUGlwZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlQgPSBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlRfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkUgPSBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFID0gU1dJVENIX0NPTVBJTEVfUElQRV9fUE9TVF9SM19fOwovLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CmNvbnN0IMm1MCRmID0gLyoqCiAqIEBwYXJhbSB7P30gbmdNb2R1bGUKICogQHJldHVybiB7P30KICovCihuZ01vZHVsZSkgPT4gbmdNb2R1bGUsIMm1MSQ0ID0gLyoqCiAqIERlY29yYXRvciB0aGF0IG1hcmtzIHRoZSBmb2xsb3dpbmcgY2xhc3MgYXMgYW4gTmdNb2R1bGUsIGFuZCBzdXBwbGllcwogKiBjb25maWd1cmF0aW9uIG1ldGFkYXRhIGZvciBpdC4KICoKICogKiBUaGUgYGRlY2xhcmF0aW9uc2AgYW5kIGBlbnRyeUNvbXBvbmVudHNgIG9wdGlvbnMgY29uZmlndXJlIHRoZSBjb21waWxlcgogKiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYmVsb25ncyB0byB0aGUgTmdNb2R1bGUuCiAqICogVGhlIGBwcm92aWRlcnNgIG9wdGlvbnMgY29uZmlndXJlcyB0aGUgTmdNb2R1bGUncyBpbmplY3RvciB0byBwcm92aWRlCiAqIGRlcGVuZGVuY2llcyB0aGUgTmdNb2R1bGUgbWVtYmVycy4KICogKiBUaGUgYGltcG9ydHNgIGFuZCBgZXhwb3J0c2Agb3B0aW9ucyBicmluZyBpbiBtZW1iZXJzIGZyb20gb3RoZXIgbW9kdWxlcywgYW5kIG1ha2UKICogdGhpcyBtb2R1bGUncyBtZW1iZXJzIGF2YWlsYWJsZSB0byBvdGhlcnMuCiAqIEBwYXJhbSB7P30gdHlwZQogKiBAcGFyYW0gez99IG1ldGEKICogQHJldHVybiB7P30KICovCih0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRSh0eXBlLCBtZXRhKTsKLyoqCiAqIFxAQW5ub3RhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IE5nTW9kdWxlID0gbWFrZURlY29yYXRvcignTmdNb2R1bGUnLCAoybUwJGYpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKMm1MSQ0KSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0NPTVBJTEVfTkdNT0RVTEVfX1BPU1RfUjNfXyA9IGNvbXBpbGVOZ01vZHVsZTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRSA9IFNXSVRDSF9DT01QSUxFX05HTU9EVUxFX19QT1NUX1IzX187CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9tZXRhZGF0YS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25faW5pdC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gaW5qZWN0aW9uIHRva2VuIHRoYXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIG9uZSBvciBtb3JlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KICogVGhlc2UgZnVuY3Rpb24gYXJlIGluamVjdGVkIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgYW5kIGV4ZWN1dGVkIGR1cmluZwogKiBhcHAgaW5pdGlhbGl6YXRpb24uIElmIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgcmV0dXJucyBhIFByb21pc2UsIGluaXRpYWxpemF0aW9uCiAqIGRvZXMgbm90IGNvbXBsZXRlIHVudGlsIHRoZSBQcm9taXNlIGlzIHJlc29sdmVkLgogKgogKiBZb3UgY2FuLCBmb3IgZXhhbXBsZSwgY3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGxvYWRzIGxhbmd1YWdlIGRhdGEKICogb3IgYW4gZXh0ZXJuYWwgY29uZmlndXJhdGlvbiwgYW5kIHByb3ZpZGUgdGhhdCBmdW5jdGlvbiB0byB0aGUgYEFQUF9JTklUSUFMSVpFUmAgdG9rZW4uCiAqIFRoYXQgd2F5LCB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZHVyaW5nIHRoZSBhcHBsaWNhdGlvbiBib290c3RyYXAgcHJvY2VzcywKICogYW5kIHRoZSBuZWVkZWQgZGF0YSBpcyBhdmFpbGFibGUgb24gc3RhcnR1cC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSU5JVElBTElaRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcGxpY2F0aW9uIEluaXRpYWxpemVyJyk7Ci8qKgogKiBBIGNsYXNzIHRoYXQgcmVmbGVjdHMgdGhlIHN0YXRlIG9mIHJ1bm5pbmcge1xAbGluayBBUFBfSU5JVElBTElaRVJ9cy4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEFwcGxpY2F0aW9uSW5pdFN0YXR1cyB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXBwSW5pdHMKICAgICAqLwogICAgY29uc3RydWN0b3IoYXBwSW5pdHMpIHsKICAgICAgICB0aGlzLmFwcEluaXRzID0gYXBwSW5pdHM7CiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgICAgIHRoaXMuZG9uZVByb21pc2UgPSBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXMKICAgICAgICAgKiBAcGFyYW0gez99IHJlagogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlcywgcmVqKSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVzb2x2ZSA9IHJlczsKICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWo7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5Jbml0aWFsaXplcnMoKSB7CiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXN5bmNJbml0UHJvbWlzZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcGxldGUgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5kb25lID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZXNvbHZlKCk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHRoaXMuYXBwSW5pdHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFwcEluaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gdGhpcy5hcHBJbml0c1tpXSgpOwogICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZSQxKGluaXRSZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgYXN5bmNJbml0UHJvbWlzZXMucHVzaChpbml0UmVzdWx0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBQcm9taXNlLmFsbChhc3luY0luaXRQcm9taXNlcykKICAgICAgICAgICAgLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBjb21wbGV0ZSgpOwogICAgICAgIH0pKQogICAgICAgICAgICAuY2F0Y2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZSA9PiB7CiAgICAgICAgICAgIHRoaXMucmVqZWN0KGUpOwogICAgICAgIH0pKTsKICAgICAgICBpZiAoYXN5bmNJbml0UHJvbWlzZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgfQp9CkFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtWZhYyA9IGZ1bmN0aW9uIEFwcGxpY2F0aW9uSW5pdFN0YXR1c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcHBsaWNhdGlvbkluaXRTdGF0dXMpKMm1ybVpbmplY3QoQVBQX0lOSVRJQUxJWkVSLCA4KSk7IH07CkFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsIGZhY3Rvcnk6IEFwcGxpY2F0aW9uSW5pdFN0YXR1cy7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFwcGxpY2F0aW9uSW5pdFN0YXR1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0FQUF9JTklUSUFMSVpFUixdIH0sIHsgdHlwZTogT3B0aW9uYWwgfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyBhIHVuaXF1ZSBzdHJpbmcgaWQgYXNzaWduZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGJ5IEFuZ3VsYXIgYW5kIHVzZWQKICogcHJpbWFyaWx5IGZvciBwcmVmaXhpbmcgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhbmQgQ1NTIHN0eWxlcyB3aGVuCiAqIHtcQGxpbmsgVmlld0VuY2Fwc3VsYXRpb24jRW11bGF0ZWQgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWR9IGlzIGJlaW5nIHVzZWQuCiAqCiAqIElmIHlvdSBuZWVkIHRvIGF2b2lkIHJhbmRvbWx5IGdlbmVyYXRlZCB2YWx1ZSB0byBiZSB1c2VkIGFzIGFuIGFwcGxpY2F0aW9uIGlkLCB5b3UgY2FuIHByb3ZpZGUKICogYSBjdXN0b20gdmFsdWUgdmlhIGEgREkgcHJvdmlkZXIgPCEtLSBUT0RPOiBwcm92aWRlciAtLT4gY29uZmlndXJpbmcgdGhlIHJvb3Qge1xAbGluayBJbmplY3Rvcn0KICogdXNpbmcgdGhpcyB0b2tlbi4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcElkJyk7Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5KCkgewogICAgcmV0dXJuIGAke19yYW5kb21DaGFyKCl9JHtfcmFuZG9tQ2hhcigpfSR7X3JhbmRvbUNoYXIoKX1gOwp9Ci8qKgogKiBQcm92aWRlcnMgdGhhdCB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIEFQUF9JRF9UT0tFTi4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfSURfUkFORE9NX1BST1ZJREVSID0gewogICAgcHJvdmlkZTogQVBQX0lELAogICAgdXNlRmFjdG9yeTogX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5LAogICAgZGVwczogKC8qKiBAdHlwZSB7P30gKi8gKFtdKSksCn07Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3JhbmRvbUNoYXIoKSB7CiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDI1KSk7Cn0KLyoqCiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBwbGF0Zm9ybSBpcyBpbml0aWFsaXplZC4KICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBQTEFURk9STV9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignUGxhdGZvcm0gSW5pdGlhbGl6ZXInKTsKLyoqCiAqIEEgdG9rZW4gdGhhdCBpbmRpY2F0ZXMgYW4gb3BhcXVlIHBsYXRmb3JtIGlkLgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFBMQVRGT1JNX0lEID0gbmV3IEluamVjdGlvblRva2VuKCdQbGF0Zm9ybSBJRCcpOwovKioKICogQWxsIGNhbGxiYWNrcyBwcm92aWRlZCB2aWEgdGhpcyB0b2tlbiB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgY29tcG9uZW50IHRoYXQgaXMgYm9vdHN0cmFwcGVkLgogKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrOgogKgogKiBgKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmKSA9PiB2b2lkYC4KICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSID0gbmV3IEluamVjdGlvblRva2VuKCdhcHBCb290c3RyYXBMaXN0ZW5lcicpOwovKioKICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFBBQ0tBR0VfUk9PVF9VUkwgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FwcGxpY2F0aW9uIFBhY2thZ2VzIFJvb3QgVVJMJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb25zb2xlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIENvbnNvbGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvZyhtZXNzYWdlKSB7CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGUKICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTsKICAgIH0KICAgIC8vIE5vdGU6IGZvciByZXBvcnRpbmcgZXJyb3JzIHVzZSBgRE9NLmxvZ0Vycm9yKClgIGFzIGl0IGlzIHBsYXRmb3JtIHNwZWNpZmljCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgd2FybihtZXNzYWdlKSB7CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGUKICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7CiAgICB9Cn0KQ29uc29sZS7JtWZhYyA9IGZ1bmN0aW9uIENvbnNvbGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29uc29sZSkoKTsgfTsKQ29uc29sZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBDb25zb2xlLCBmYWN0b3J5OiBDb25zb2xlLsm1ZmFjIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaTE4bi90b2tlbnMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBzZXQgdGhlIGxvY2FsZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgogKiBJdCBpcyB1c2VkIGZvciBpMThuIGV4dHJhY3Rpb24sIGJ5IGkxOG4gcGlwZXMgKERhdGVQaXBlLCBJMThuUGx1cmFsUGlwZSwgQ3VycmVuY3lQaXBlLAogKiBEZWNpbWFsUGlwZSBhbmQgUGVyY2VudFBpcGUpIGFuZCBieSBJQ1UgZXhwcmVzc2lvbnMuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC1sb2NhbGUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBpbXBvcnQgeyBMT0NBTEVfSUQgfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IExPQ0FMRV9JRCwgdXNlVmFsdWU6ICdlbi1VUycgfV0KICogfSk7CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IExPQ0FMRV9JRCQxID0gbmV3IEluamVjdGlvblRva2VuKCdMb2NhbGVJZCcpOwovKioKICogUHJvdmlkZSB0aGlzIHRva2VuIHRvIHNldCB0aGUgZGVmYXVsdCBjdXJyZW5jeSBjb2RlIHlvdXIgYXBwbGljYXRpb24gdXNlcyBmb3IKICogQ3VycmVuY3lQaXBlIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVuY3kgY29kZSBwYXNzZWQgaW50byBpdC4gVGhpcyBpcyBvbmx5IHVzZWQgYnkKICogQ3VycmVuY3lQaXBlIGFuZCBoYXMgbm8gcmVsYXRpb24gdG8gbG9jYWxlIGN1cnJlbmN5LiBEZWZhdWx0cyB0byBVU0QgaWYgbm90IGNvbmZpZ3VyZWQuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC1sb2NhbGUpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiA8ZGl2IGNsYXNzPSJhbGVydCBpcy1oZWxwZnVsIj4KICoKICogKipEZXByZWNhdGlvbiBub3RpY2U6KioKICoKICogVGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSBpcyBjdXJyZW50bHkgYWx3YXlzIGBVU0RgIGJ1dCB0aGlzIGlzIGRlcHJlY2F0ZWQgZnJvbSB2OS4KICoKICogKipJbiB2MTAgdGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSB3aWxsIGJlIHRha2VuIGZyb20gdGhlIGN1cnJlbnQgbG9jYWxlLioqCiAqCiAqIElmIHlvdSBuZWVkIHRoZSBwcmV2aW91cyBiZWhhdmlvciB0aGVuIHNldCBpdCBieSBjcmVhdGluZyBhIGBERUZBVUxUX0NVUlJFTkNZX0NPREVgIHByb3ZpZGVyIGluCiAqIHlvdXIgYXBwbGljYXRpb24gYE5nTW9kdWxlYDoKICoKICogYGBgdHMKICoge3Byb3ZpZGU6IERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSwgdXNlVmFsdWU6ICdVU0QnfQogKiBgYGAKICoKICogPC9kaXY+CiAqCiAqIFxAdXNhZ2VOb3RlcwogKiAjIyMgRXhhbXBsZQogKgogKiBgYGB0eXBlc2NyaXB0CiAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAvYXBwLm1vZHVsZSc7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSwgdXNlVmFsdWU6ICdFVVInIH1dCiAqIH0pOwogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBERUZBVUxUX0NVUlJFTkNZX0NPREUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0RlZmF1bHRDdXJyZW5jeUNvZGUnKTsKLyoqCiAqIFVzZSB0aGlzIHRva2VuIGF0IGJvb3RzdHJhcCB0byBwcm92aWRlIHRoZSBjb250ZW50IG9mIHlvdXIgdHJhbnNsYXRpb24gZmlsZSAoYHh0YmAsCiAqIGB4bGZgIG9yIGB4bGYyYCkgd2hlbiB5b3Ugd2FudCB0byB0cmFuc2xhdGUgeW91ciBhcHBsaWNhdGlvbiBpbiBhbm90aGVyIGxhbmd1YWdlLgogKgogKiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI21lcmdlKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogaW1wb3J0IHsgVFJBTlNMQVRJT05TIH0gZnJvbSAnXEBhbmd1bGFyL2NvcmUnOwogKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogKgogKiAvLyBjb250ZW50IG9mIHlvdXIgdHJhbnNsYXRpb24gZmlsZQogKiBjb25zdCB0cmFuc2xhdGlvbnMgPSAnLi4uLic7CiAqCiAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRSQU5TTEFUSU9OUywgdXNlVmFsdWU6IHRyYW5zbGF0aW9ucyB9XQogKiB9KTsKICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVFJBTlNMQVRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdUcmFuc2xhdGlvbnMnKTsKLyoqCiAqIFByb3ZpZGUgdGhpcyB0b2tlbiBhdCBib290c3RyYXAgdG8gc2V0IHRoZSBmb3JtYXQgb2YgeW91ciB7XEBsaW5rIFRSQU5TTEFUSU9OU306IGB4dGJgLAogKiBgeGxmYCBvciBgeGxmMmAuCiAqCiAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jbWVyZ2UpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogKgogKiBcQHVzYWdlTm90ZXMKICogIyMjIEV4YW1wbGUKICoKICogYGBgdHlwZXNjcmlwdAogKiBpbXBvcnQgeyBUUkFOU0xBVElPTlNfRk9STUFUIH0gZnJvbSAnXEBhbmd1bGFyL2NvcmUnOwogKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogKgogKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwgewogKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBUUkFOU0xBVElPTlNfRk9STUFULCB1c2VWYWx1ZTogJ3hsZicgfV0KICogfSk7CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IFRSQU5TTEFUSU9OU19GT1JNQVQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RyYW5zbGF0aW9uc0Zvcm1hdCcpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaXZ5X3N3aXRjaC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgU1dJVENIX0lWWV9FTkFCTEVEX19QT1NUX1IzX18gPSB0cnVlOwovKiogQHR5cGUgez99ICovCmNvbnN0IGl2eUVuYWJsZWQgPSBTV0lUQ0hfSVZZX0VOQUJMRURfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9jb21waWxlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQ29tYmluYXRpb24gb2YgTmdNb2R1bGVGYWN0b3J5IGFuZCBDb21wb25lbnRGYWN0b3J5cy4KICoKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE1vZHVsZVdpdGhDb21wb25lbnRGYWN0b3JpZXMgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlRmFjdG9yeQogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3JpZXMKICAgICAqLwogICAgY29uc3RydWN0b3IobmdNb2R1bGVGYWN0b3J5LCBjb21wb25lbnRGYWN0b3JpZXMpIHsKICAgICAgICB0aGlzLm5nTW9kdWxlRmFjdG9yeSA9IG5nTW9kdWxlRmFjdG9yeTsKICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcmllcyA9IGNvbXBvbmVudEZhY3RvcmllczsKICAgIH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18gPSAoLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgIHJldHVybiBuZXcgTmdNb2R1bGVGYWN0b3J5JDEobW9kdWxlVHlwZSk7Cn0pOwovKiogQHR5cGUgez99ICovCmNvbnN0IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZVN5bmNfX1BPU1RfUjNfXzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlQXN5bmNfX1BPU1RfUjNfXyA9ICgvKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiAobW9kdWxlVHlwZSkgewogICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QT1NUX1IzX18gPSAoLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5nTW9kdWxlRmFjdG9yeSA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18obW9kdWxlVHlwZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb2R1bGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcmllcyA9IG1heWJlVW53cmFwRm4obW9kdWxlRGVmLmRlY2xhcmF0aW9ucykKICAgICAgICAucmVkdWNlKCgvKioKICAgICAqIEBwYXJhbSB7P30gZmFjdG9yaWVzCiAgICAgKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZmFjdG9yaWVzLCBkZWNsYXJhdGlvbikgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnREZWYgPSBnZXRDb21wb25lbnREZWYoZGVjbGFyYXRpb24pOwogICAgICAgIGNvbXBvbmVudERlZiAmJiBmYWN0b3JpZXMucHVzaChuZXcgQ29tcG9uZW50RmFjdG9yeSQxKGNvbXBvbmVudERlZikpOwogICAgICAgIHJldHVybiBmYWN0b3JpZXM7CiAgICB9KSwgKC8qKiBAdHlwZSB7P30gKi8gKFtdKSkpOwogICAgcmV0dXJuIG5ldyBNb2R1bGVXaXRoQ29tcG9uZW50RmFjdG9yaWVzKG5nTW9kdWxlRmFjdG9yeSwgY29tcG9uZW50RmFjdG9yaWVzKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luY19fUE9TVF9SM19fID0gKC8qKgogKiBAdGVtcGxhdGUgVAogKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7CiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKfSk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmNfX1BPU1RfUjNfXzsKLyoqCiAqIExvdy1sZXZlbCBzZXJ2aWNlIGZvciBydW5uaW5nIHRoZSBhbmd1bGFyIGNvbXBpbGVyIGR1cmluZyBydW50aW1lCiAqIHRvIGNyZWF0ZSB7XEBsaW5rIENvbXBvbmVudEZhY3Rvcnl9cywgd2hpY2gKICogY2FuIGxhdGVyIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCByZW5kZXIgYSBDb21wb25lbnQgaW5zdGFuY2UuCiAqCiAqIEVhY2ggYFxATmdNb2R1bGVgIHByb3ZpZGVzIGFuIG93biBgQ29tcGlsZXJgIHRvIGl0cyBpbmplY3RvciwKICogdGhhdCB3aWxsIHVzZSB0aGUgZGlyZWN0aXZlcy9waXBlcyBvZiB0aGUgbmcgbW9kdWxlIGZvciBjb21waWxhdGlvbgogKiBvZiBjb21wb25lbnRzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQ29tcGlsZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGlsZXMgdGhlIGdpdmVuIE5nTW9kdWxlIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuIEFsbCB0ZW1wbGF0ZXMgb2YgdGhlIGNvbXBvbmVudHMgbGlzdGVkCiAgICAgICAgICogaW4gYGVudHJ5Q29tcG9uZW50c2AgaGF2ZSB0byBiZSBpbmxpbmVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZVN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlU3luYzsKICAgICAgICAvKioKICAgICAgICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gTmdNb2R1bGUgYW5kIGFsbCBvZiBpdHMgY29tcG9uZW50cwogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jOwogICAgICAgIC8qKgogICAgICAgICAqIFNhbWUgYXMge1xAbGluayAjY29tcGlsZU1vZHVsZVN5bmN9IGJ1dCBhbHNvIGNyZWF0ZXMgQ29tcG9uZW50RmFjdG9yaWVzIGZvciBhbGwgY29tcG9uZW50cy4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmNvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYzsKICAgICAgICAvKioKICAgICAgICAgKiBTYW1lIGFzIHtcQGxpbmsgI2NvbXBpbGVNb2R1bGVBc3luY30gYnV0IGFsc28gY3JlYXRlcyBDb21wb25lbnRGYWN0b3JpZXMgZm9yIGFsbCBjb21wb25lbnRzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmM7CiAgICB9CiAgICAvKioKICAgICAqIENsZWFycyBhbGwgY2FjaGVzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY2xlYXJDYWNoZSgpIHsgfQogICAgLyoqCiAgICAgKiBDbGVhcnMgdGhlIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50L25nTW9kdWxlLgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjbGVhckNhY2hlRm9yKHR5cGUpIHsgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpZCBmb3IgYSBnaXZlbiBOZ01vZHVsZSwgaWYgb25lIGlzIGRlZmluZWQgYW5kIGtub3duIHRvIHRoZSBjb21waWxlci4KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0TW9kdWxlSWQobW9kdWxlVHlwZSkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9Cn0KQ29tcGlsZXIuybVmYWMgPSBmdW5jdGlvbiBDb21waWxlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDb21waWxlcikoKTsgfTsKQ29tcGlsZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQ29tcGlsZXIsIGZhY3Rvcnk6IENvbXBpbGVyLsm1ZmFjIH0pOwovKioKICogVG9rZW4gdG8gcHJvdmlkZSBDb21waWxlck9wdGlvbnMgaW4gdGhlIHBsYXRmb3JtIGluamVjdG9yLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IENPTVBJTEVSX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2NvbXBpbGVyT3B0aW9ucycpOwoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpjb25zdCBwcm9taXNlID0gKCgpID0+IFByb21pc2UucmVzb2x2ZSgwKSkoKTsKZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2soZm4pIHsKICAgIGlmICh0eXBlb2YgWm9uZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyB1c2UgcHJvbWlzZSB0byBzY2hlZHVsZSBtaWNyb1Rhc2sgaW5zdGVhZCBvZiB1c2UgWm9uZQogICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgIGZuICYmIGZuLmFwcGx5KG51bGwsIG51bGwpOwogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgWm9uZS5jdXJyZW50LnNjaGVkdWxlTWljcm9UYXNrKCdzY2hlZHVsZU1pY3JvdGFzaycsIGZuKTsKICAgIH0KfQoKLyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAqLwpmdW5jdGlvbiBnZXROYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSB7CiAgICBsZXQgbmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gX2dsb2JhbFsncmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107CiAgICBsZXQgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBfZ2xvYmFsWydjYW5jZWxBbmltYXRpb25GcmFtZSddOwogICAgaWYgKHR5cGVvZiBab25lICE9PSAndW5kZWZpbmVkJyAmJiBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAvLyB1c2UgdW5wYXRjaGVkIHZlcnNpb24gb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5hdGl2ZSBkZWxlZ2F0ZSkgaWYgcG9zc2libGUKICAgICAgICAvLyB0byBhdm9pZCBhbm90aGVyIENoYW5nZSBkZXRlY3Rpb24KICAgICAgICBjb25zdCB1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWVbWm9uZS5fX3N5bWJvbF9fKCdPcmlnaW5hbERlbGVnYXRlJyldOwogICAgICAgIGlmICh1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgICAgbmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gdW5wYXRjaGVkUmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgICAgIH0KICAgICAgICBjb25zdCB1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZSA9IG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lW1pvbmUuX19zeW1ib2xfXygnT3JpZ2luYWxEZWxlZ2F0ZScpXTsKICAgICAgICBpZiAodW5wYXRjaGVkQ2FuY2VsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgICAgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4geyBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lIH07Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3pvbmUvbmdfem9uZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIGZvciBleGVjdXRpbmcgd29yayBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNlIG9mIHRoaXMgc2VydmljZSBpcyB0byBvcHRpbWl6ZSBwZXJmb3JtYW5jZSB3aGVuIHN0YXJ0aW5nIGEgd29yayBjb25zaXN0aW5nIG9mCiAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5CiAqIEFuZ3VsYXIuIFN1Y2ggdGFza3MgY2FuIGJlIGtpY2tlZCBvZmYgdmlhIHtcQGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrcwogKiBjYW4gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIHZpYSB7XEBsaW5rICNydW59LgogKgogKiA8IS0tIFRPRE86IGFkZC9maXggbGlua3MgdG86CiAqICAgLSBkb2NzIGV4cGxhaW5pbmcgem9uZXMgYW5kIHRoZSB1c2Ugb2Ygem9uZXMgaW4gQW5ndWxhciBhbmQgY2hhbmdlLWRldGVjdGlvbgogKiAgIC0gbGluayB0byBydW5PdXRzaWRlQW5ndWxhci9ydW4gKHRocm91Z2hvdXQgdGhpcyBmaWxlISkKICogICAtLT4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlCiAqCiAqIGBgYAogKiBpbXBvcnQge0NvbXBvbmVudCwgTmdab25lfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7TmdJZn0gZnJvbSAnXEBhbmd1bGFyL2NvbW1vbic7CiAqCiAqIFxAQ29tcG9uZW50KHsKICogICBzZWxlY3RvcjogJ25nLXpvbmUtZGVtbycsCiAqICAgdGVtcGxhdGU6IGAKICogICAgIDxoMj5EZW1vOiBOZ1pvbmU8L2gyPgogKgogKiAgICAgPHA+UHJvZ3Jlc3M6IHt7cHJvZ3Jlc3N9fSU8L3A+CiAqICAgICA8cCAqbmdJZj0icHJvZ3Jlc3MgPj0gMTAwIj5Eb25lIHByb2Nlc3Npbmcge3tsYWJlbH19IG9mIEFuZ3VsYXIgem9uZSE8L3A+CiAqCiAqICAgICA8YnV0dG9uIChjbGljayk9InByb2Nlc3NXaXRoaW5Bbmd1bGFyWm9uZSgpIj5Qcm9jZXNzIHdpdGhpbiBBbmd1bGFyIHpvbmU8L2J1dHRvbj4KICogICAgIDxidXR0b24gKGNsaWNrKT0icHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKCkiPlByb2Nlc3Mgb3V0c2lkZSBvZiBBbmd1bGFyIHpvbmU8L2J1dHRvbj4KICogICBgLAogKiB9KQogKiBleHBvcnQgY2xhc3MgTmdab25lRGVtbyB7CiAqICAgcHJvZ3Jlc3M6IG51bWJlciA9IDA7CiAqICAgbGFiZWw6IHN0cmluZzsKICoKICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge30KICoKICogICAvLyBMb29wIGluc2lkZSB0aGUgQW5ndWxhciB6b25lCiAqICAgLy8gc28gdGhlIFVJIERPRVMgcmVmcmVzaCBhZnRlciBlYWNoIHNldFRpbWVvdXQgY3ljbGUKICogICBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7CiAqICAgICB0aGlzLmxhYmVsID0gJ2luc2lkZSc7CiAqICAgICB0aGlzLnByb2dyZXNzID0gMDsKICogICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTsKICogICB9CiAqCiAqICAgLy8gTG9vcCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUKICogICAvLyBzbyB0aGUgVUkgRE9FUyBOT1QgcmVmcmVzaCBhZnRlciBlYWNoIHNldFRpbWVvdXQgY3ljbGUKICogICBwcm9jZXNzT3V0c2lkZU9mQW5ndWxhclpvbmUoKSB7CiAqICAgICB0aGlzLmxhYmVsID0gJ291dHNpZGUnOwogKiAgICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAqICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gewogKiAgICAgICB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHsKICogICAgICAgICAvLyByZWVudGVyIHRoZSBBbmd1bGFyIHpvbmUgYW5kIGRpc3BsYXkgZG9uZQogKiAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4geyBjb25zb2xlLmxvZygnT3V0c2lkZSBEb25lIScpOyB9KTsKICogICAgICAgfSk7CiAqICAgICB9KTsKICogICB9CiAqCiAqICAgX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7CiAqICAgICB0aGlzLnByb2dyZXNzICs9IDE7CiAqICAgICBjb25zb2xlLmxvZyhgQ3VycmVudCBwcm9ncmVzczogJHt0aGlzLnByb2dyZXNzfSVgKTsKICoKICogICAgIGlmICh0aGlzLnByb2dyZXNzIDwgMTAwKSB7CiAqICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrKSwgMTApOwogKiAgICAgfSBlbHNlIHsKICogICAgICAgZG9uZUNhbGxiYWNrKCk7CiAqICAgICB9CiAqICAgfQogKiB9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdab25lIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAqLwogICAgY29uc3RydWN0b3IoeyBlbmFibGVMb25nU3RhY2tUcmFjZSA9IGZhbHNlLCBzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uID0gZmFsc2UgfSkgewogICAgICAgIHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3MgPSBmYWxzZTsKICAgICAgICB0aGlzLmhhc1BlbmRpbmdNaWNyb3Rhc2tzID0gZmFsc2U7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgbWljcm90YXNrcyBvciBtYWNyb3Rhc2tzLgogICAgICAgICAqLwogICAgICAgIHRoaXMuaXNTdGFibGUgPSB0cnVlOwogICAgICAgIC8qKgogICAgICAgICAqIE5vdGlmaWVzIHdoZW4gY29kZSBlbnRlcnMgQW5ndWxhciBab25lLiBUaGlzIGdldHMgZmlyZWQgZmlyc3Qgb24gVk0gVHVybi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uVW5zdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTsKICAgICAgICAvKioKICAgICAgICAgKiBOb3RpZmllcyB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgbWljcm90YXNrcyBlbnF1ZXVlZCBpbiB0aGUgY3VycmVudCBWTSBUdXJuLgogICAgICAgICAqIFRoaXMgaXMgYSBoaW50IGZvciBBbmd1bGFyIHRvIGRvIGNoYW5nZSBkZXRlY3Rpb24sIHdoaWNoIG1heSBlbnF1ZXVlIG1vcmUgbWljcm90YXNrcy4KICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24gdGhpcyBldmVudCBjYW4gZmlyZSBtdWx0aXBsZSB0aW1lcyBwZXIgVk0gVHVybi4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uTWljcm90YXNrRW1wdHkgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTsKICAgICAgICAvKioKICAgICAgICAgKiBOb3RpZmllcyB3aGVuIHRoZSBsYXN0IGBvbk1pY3JvdGFza0VtcHR5YCBoYXMgcnVuIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBtaWNyb3Rhc2tzLCB3aGljaAogICAgICAgICAqIGltcGxpZXMgd2UgYXJlIGFib3V0IHRvIHJlbGlucXVpc2ggVk0gdHVybi4KICAgICAgICAgKiBUaGlzIGV2ZW50IGdldHMgY2FsbGVkIGp1c3Qgb25jZS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm9uU3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgLyoqCiAgICAgICAgICogTm90aWZpZXMgdGhhdCBhbiBlcnJvciBoYXMgYmVlbiBkZWxpdmVyZWQuCiAgICAgICAgICovCiAgICAgICAgdGhpcy5vbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgaWYgKHR5cGVvZiBab25lID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW4gdGhpcyBjb25maWd1cmF0aW9uIEFuZ3VsYXIgcmVxdWlyZXMgWm9uZS5qc2ApOwogICAgICAgIH0KICAgICAgICBab25lLmFzc2VydFpvbmVQYXRjaGVkKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNlbGYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpOwogICAgICAgIHNlbGYuX25lc3RpbmcgPSAwOwogICAgICAgIHNlbGYuX291dGVyID0gc2VsZi5faW5uZXIgPSBab25lLmN1cnJlbnQ7CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnd3RmWm9uZVNwZWMnXSkgewogICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsoKCgvKiogQHR5cGUgez99ICovIChab25lKSkpWyd3dGZab25lU3BlYyddKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnVGFza1RyYWNraW5nWm9uZVNwZWMnXSkgewogICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsobmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChab25lKSkpWydUYXNrVHJhY2tpbmdab25lU3BlYyddKSkpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVuYWJsZUxvbmdTdGFja1RyYWNlICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnbG9uZ1N0YWNrVHJhY2Vab25lU3BlYyddKSB7CiAgICAgICAgICAgIHNlbGYuX2lubmVyID0gc2VsZi5faW5uZXIuZm9yaygoKC8qKiBAdHlwZSB7P30gKi8gKFpvbmUpKSlbJ2xvbmdTdGFja1RyYWNlWm9uZVNwZWMnXSk7CiAgICAgICAgfQogICAgICAgIHNlbGYuc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbiA9IHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb247CiAgICAgICAgc2VsZi5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSAtMTsKICAgICAgICBzZWxmLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGdldE5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSgpLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZTsKICAgICAgICBmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcihzZWxmKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3RhdGljIGlzSW5Bbmd1bGFyWm9uZSgpIHsKICAgICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmdldCgnaXNBbmd1bGFyWm9uZScpID09PSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpIHsKICAgICAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGJlIGluIEFuZ3VsYXIgWm9uZSwgYnV0IGl0IGlzIG5vdCEnKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBhc3NlcnROb3RJbkFuZ3VsYXJab25lKCkgewogICAgICAgIGlmIChOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhJyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IHdpdGhpbiB0aGUgQW5ndWxhciB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5CiAgICAgKiB0aGUgZnVuY3Rpb24uCiAgICAgKgogICAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIGBydW5gIGFsbG93cyB5b3UgdG8gcmVlbnRlciBBbmd1bGFyIHpvbmUgZnJvbSBhIHRhc2sgdGhhdCB3YXMgZXhlY3V0ZWQKICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtcQGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSkuCiAgICAgKgogICAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb20KICAgICAqIHdpdGhpbiB0aGUgQW5ndWxhciB6b25lLgogICAgICoKICAgICAqIElmIGEgc3luY2hyb25vdXMgZXJyb3IgaGFwcGVucyBpdCB3aWxsIGJlIHJldGhyb3duIGFuZCBub3QgcmVwb3J0ZWQgdmlhIGBvbkVycm9yYC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW4oZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IHdpdGhpbiB0aGUgQW5ndWxhciB6b25lIGFzIGEgdGFzayBhbmQgcmV0dXJucyB2YWx1ZQogICAgICogcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLgogICAgICoKICAgICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkCiAgICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUgKHR5cGljYWxseSBzdGFydGVkIHZpYSB7XEBsaW5rICNydW5PdXRzaWRlQW5ndWxhcn0pLgogICAgICoKICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgKiB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS4KICAgICAqCiAgICAgKiBJZiBhIHN5bmNocm9ub3VzIGVycm9yIGhhcHBlbnMgaXQgd2lsbCBiZSByZXRocm93biBhbmQgbm90IHJlcG9ydGVkIHZpYSBgb25FcnJvcmAuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgKiBAcGFyYW0gez89fSBhcHBseUFyZ3MKICAgICAqIEBwYXJhbSB7Pz19IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJ1blRhc2soZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHpvbmUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpKSkuX2lubmVyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YXNrID0gem9uZS5zY2hlZHVsZUV2ZW50VGFzaygnTmdab25lRXZlbnQ6ICcgKyBuYW1lLCBmbiwgRU1QVFlfUEFZTE9BRCwgbm9vcCQxLCBub29wJDEpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoem9uZS5ydW5UYXNrKHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSkpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgem9uZS5jYW5jZWxUYXNrKHRhc2spOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2FtZSBhcyBgcnVuYCwgZXhjZXB0IHRoYXQgc3luY2hyb25vdXMgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIGZvcndhcmRlZCB2aWEgYG9uRXJyb3JgIGFuZCBub3QKICAgICAqIHJldGhyb3duLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5VGhpcwogICAgICogQHBhcmFtIHs/PX0gYXBwbHlBcmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykpKTsKICAgIH0KICAgIC8qKgogICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSBpbiBBbmd1bGFyJ3MgcGFyZW50IHpvbmUgYW5kIHJldHVybnMgdmFsdWUgcmV0dXJuZWQgYnkKICAgICAqIHRoZSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBSdW5uaW5nIGZ1bmN0aW9ucyB2aWEge1xAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9IGFsbG93cyB5b3UgdG8gZXNjYXBlIEFuZ3VsYXIncyB6b25lIGFuZCBkbwogICAgICogd29yayB0aGF0CiAgICAgKiBkb2Vzbid0IHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UtZGV0ZWN0aW9uIG9yIGlzIHN1YmplY3QgdG8gQW5ndWxhcidzIGVycm9yIGhhbmRsaW5nLgogICAgICoKICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuCiAgICAgKgogICAgICogVXNlIHtcQGxpbmsgI3J1bn0gdG8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkbyB3b3JrIHRoYXQgdXBkYXRlcyB0aGUgYXBwbGljYXRpb24gbW9kZWwuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuT3V0c2lkZUFuZ3VsYXIoZm4pIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpKS5fb3V0ZXIucnVuKGZuKSkpOwogICAgfQp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gbm9vcCQxKCkgeyB9Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRU1QVFlfUEFZTE9BRCA9IHt9OwovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja1N0YWJsZSh6b25lKSB7CiAgICBpZiAoem9uZS5fbmVzdGluZyA9PSAwICYmICF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzICYmICF6b25lLmlzU3RhYmxlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgem9uZS5fbmVzdGluZysrOwogICAgICAgICAgICB6b25lLm9uTWljcm90YXNrRW1wdHkuZW1pdChudWxsKTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHpvbmUuX25lc3RpbmctLTsKICAgICAgICAgICAgaWYgKCF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gem9uZS5vblN0YWJsZS5lbWl0KG51bGwpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICB6b25lLmlzU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50cyh6b25lKSB7CiAgICBpZiAoem9uZS5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgIT09IC0xKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgem9uZS5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSB6b25lLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZS5jYWxsKF9nbG9iYWwsICgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICB6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IC0xOwogICAgICAgIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKTsKICAgICAgICBjaGVja1N0YWJsZSh6b25lKTsKICAgIH0pKTsKICAgIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKTsKfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcih6b25lKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50c0RlbGVnYXRlID0gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gewogICAgICAgIGRlbGF5Q2hhbmdlRGV0ZWN0aW9uRm9yRXZlbnRzKHpvbmUpOwogICAgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtYXliZURlbGF5Q2hhbmdlRGV0ZWN0aW9uID0gISF6b25lLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb24gJiYKICAgICAgICB6b25lLm5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSAmJiBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50c0RlbGVnYXRlOwogICAgem9uZS5faW5uZXIgPSB6b25lLl9pbm5lci5mb3JrKHsKICAgICAgICBuYW1lOiAnYW5ndWxhcicsCiAgICAgICAgcHJvcGVydGllczogKC8qKiBAdHlwZSB7P30gKi8gKHsgJ2lzQW5ndWxhclpvbmUnOiB0cnVlLCAnbWF5YmVEZWxheUNoYW5nZURldGVjdGlvbic6IG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24gfSkpLAogICAgICAgIG9uSW52b2tlVGFzazogKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gdGFzawogICAgICAgICAqIEBwYXJhbSB7P30gYXBwbHlUaGlzCiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBseUFyZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgPT4gewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgb25FbnRlcih6b25lKTsKICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VUYXNrKHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24gJiYgdGFzay50eXBlID09PSAnZXZlbnRUYXNrJykgewogICAgICAgICAgICAgICAgICAgIG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkludm9rZTogKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcGFyYW0gez99IGFwcGx5VGhpcwogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICAgICAqIEBwYXJhbSB7Pz19IHNvdXJjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvbkVudGVyKHpvbmUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZSh0YXJnZXQsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkhhc1Rhc2s6ICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAgICAgKiBAcGFyYW0gez99IGhhc1Rhc2tTdGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGhhc1Rhc2tTdGF0ZSkgPT4gewogICAgICAgICAgICBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHRhcmdldCkgewogICAgICAgICAgICAgICAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBoYXNUYXNrIGV2ZW50cyB3aGljaCBvcmlnaW5hdGUgZnJvbSBvdXIgem9uZQogICAgICAgICAgICAgICAgLy8gKEEgY2hpbGQgaGFzVGFzayBldmVudCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMpCiAgICAgICAgICAgICAgICBpZiAoaGFzVGFza1N0YXRlLmNoYW5nZSA9PSAnbWljcm9UYXNrJykgewogICAgICAgICAgICAgICAgICAgIHpvbmUuX2hhc1BlbmRpbmdNaWNyb3Rhc2tzID0gaGFzVGFza1N0YXRlLm1pY3JvVGFzazsKICAgICAgICAgICAgICAgICAgICB1cGRhdGVNaWNyb1Rhc2tTdGF0dXMoem9uZSk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGFibGUoem9uZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNUYXNrU3RhdGUuY2hhbmdlID09ICdtYWNyb1Rhc2snKSB7CiAgICAgICAgICAgICAgICAgICAgem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGhhc1Rhc2tTdGF0ZS5tYWNyb1Rhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KSwKICAgICAgICBvbkhhbmRsZUVycm9yOiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGVycm9yKSA9PiB7CiAgICAgICAgICAgIGRlbGVnYXRlLmhhbmRsZUVycm9yKHRhcmdldCwgZXJyb3IpOwogICAgICAgICAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHpvbmUub25FcnJvci5lbWl0KGVycm9yKSkpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSkKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHpvbmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVwZGF0ZU1pY3JvVGFza1N0YXR1cyh6b25lKSB7CiAgICBpZiAoem9uZS5faGFzUGVuZGluZ01pY3JvdGFza3MgfHwKICAgICAgICAoem9uZS5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uICYmIHpvbmUubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkICE9PSAtMSkpIHsKICAgICAgICB6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzID0gdHJ1ZTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB6b25lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBvbkVudGVyKHpvbmUpIHsKICAgIHpvbmUuX25lc3RpbmcrKzsKICAgIGlmICh6b25lLmlzU3RhYmxlKSB7CiAgICAgICAgem9uZS5pc1N0YWJsZSA9IGZhbHNlOwogICAgICAgIHpvbmUub25VbnN0YWJsZS5lbWl0KG51bGwpOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHpvbmUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG9uTGVhdmUoem9uZSkgewogICAgem9uZS5fbmVzdGluZy0tOwogICAgY2hlY2tTdGFibGUoem9uZSk7Cn0KLyoqCiAqIFByb3ZpZGVzIGEgbm9vcCBpbXBsZW1lbnRhdGlvbiBvZiBgTmdab25lYCB3aGljaCBkb2VzIG5vdGhpbmcuIFRoaXMgem9uZSByZXF1aXJlcyBleHBsaWNpdCBjYWxscwogKiB0byBmcmFtZXdvcmsgdG8gcGVyZm9ybSByZW5kZXJpbmcuCiAqLwpjbGFzcyBOb29wTmdab25lIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTsKICAgICAgICB0aGlzLmhhc1BlbmRpbmdNYWNyb3Rhc2tzID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1N0YWJsZSA9IHRydWU7CiAgICAgICAgdGhpcy5vblVuc3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25NaWNyb3Rhc2tFbXB0eSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB0aGlzLm9uU3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgKiBAcGFyYW0gez89fSBhcHBseUFyZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJ1bihmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuR3VhcmRlZChmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBydW5PdXRzaWRlQW5ndWxhcihmbikgewogICAgICAgIHJldHVybiBmbigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICogQHBhcmFtIHs/PX0gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcnVuVGFzayhmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIG5hbWUpIHsKICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgfQp9Ci8qKgogKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20KICogdGhlIGJyb3dzZXIgYW5kIGJ5IHNlcnZpY2VzIHN1Y2ggYXMgUHJvdHJhY3Rvci4gRWFjaCBib290c3RyYXBwZWQgQW5ndWxhcgogKiBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSB3aWxsIGhhdmUgYW4gaW5zdGFuY2Ugb2YgVGVzdGFiaWxpdHkuCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBUZXN0YWJpbGl0eSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICovCiAgICBjb25zdHJ1Y3Rvcihfbmdab25lKSB7CiAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICB0aGlzLl9wZW5kaW5nQ291bnQgPSAwOwogICAgICAgIHRoaXMuX2lzWm9uZVN0YWJsZSA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBhbnkgd29yayB3YXMgZG9uZSBzaW5jZSB0aGUgbGFzdCAnd2hlblN0YWJsZScgY2FsbGJhY2suIFRoaXMgaXMKICAgICAgICAgKiB1c2VmdWwgdG8gZGV0ZWN0IGlmIHRoaXMgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBkZXN0YWJpbGl6ZWQgYW5vdGhlcgogICAgICAgICAqIGNvbXBvbmVudCB3aGlsZSBpdCBpcyBzdGFiaWxpemluZy4KICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fZGlkV29yayA9IGZhbHNlOwogICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdOwogICAgICAgIHRoaXMudGFza1RyYWNraW5nWm9uZSA9IG51bGw7CiAgICAgICAgdGhpcy5fd2F0Y2hBbmd1bGFyRXZlbnRzKCk7CiAgICAgICAgX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLnRhc2tUcmFja2luZ1pvbmUgPQogICAgICAgICAgICAgICAgdHlwZW9mIFpvbmUgPT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogWm9uZS5jdXJyZW50LmdldCgnVGFza1RyYWNraW5nWm9uZScpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF93YXRjaEFuZ3VsYXJFdmVudHMoKSB7CiAgICAgICAgdGhpcy5fbmdab25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZGlkV29yayA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9pc1pvbmVTdGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNab25lU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogSW5jcmVhc2VzIHRoZSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0CiAgICAgKiBAZGVwcmVjYXRlZCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBub3cgdHJhY2tlZCB3aXRoIHpvbmVzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCArPSAxOwogICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlOwogICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7CiAgICB9CiAgICAvKioKICAgICAqIERlY3JlYXNlcyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdAogICAgICogQGRlcHJlY2F0ZWQgcGVuZGluZyByZXF1ZXN0cyBhcmUgbm93IHRyYWNrZWQgd2l0aCB6b25lcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCAtPSAxOwogICAgICAgIGlmICh0aGlzLl9wZW5kaW5nQ291bnQgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvJyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTsKICAgICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50OwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIGFuIGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaXMgc3RhYmxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc1N0YWJsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5faXNab25lU3RhYmxlICYmIHRoaXMuX3BlbmRpbmdDb3VudCA9PT0gMCAmJiAhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3J1bkNhbGxiYWNrc0lmUmVhZHkoKSB7CiAgICAgICAgaWYgKHRoaXMuaXNTdGFibGUoKSkgewogICAgICAgICAgICAvLyBTY2hlZHVsZXMgdGhlIGNhbGwgYmFja3MgaW4gYSBuZXcgZnJhbWUgc28gdGhhdCBpdCBpcyBhbHdheXMgYXN5bmMuCiAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9jYWxsYmFja3MubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBjYiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9jYWxsYmFja3MucG9wKCkpKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY2IudGltZW91dElkKTsKICAgICAgICAgICAgICAgICAgICBjYi5kb25lQ2IodGhpcy5fZGlkV29yayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9kaWRXb3JrID0gZmFsc2U7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFN0aWxsIG5vdCBzdGFibGUsIHNlbmQgdXBkYXRlcy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGVuZGluZyA9IHRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCk7CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNiCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2IpID0+IHsKICAgICAgICAgICAgICAgIGlmIChjYi51cGRhdGVDYiAmJiBjYi51cGRhdGVDYihwZW5kaW5nKSkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYi50aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2RpZFdvcmsgPSB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFBlbmRpbmdUYXNrcygpIHsKICAgICAgICBpZiAoIXRoaXMudGFza1RyYWNraW5nWm9uZSkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIC8vIENvcHkgdGhlIHRhc2tzIGRhdGEgc28gdGhhdCB3ZSBkb24ndCBsZWFrIHRhc2tzLgogICAgICAgIHJldHVybiB0aGlzLnRhc2tUcmFja2luZ1pvbmUubWFjcm9UYXNrcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNvdXJjZTogdC5zb3VyY2UsCiAgICAgICAgICAgICAgICAvLyBGcm9tIFRhc2tUcmFja2luZ1pvbmU6CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2Jsb2IvbWFzdGVyL2xpYi96b25lLXNwZWMvdGFzay10cmFja2luZy50cyNMNDAKICAgICAgICAgICAgICAgIGNyZWF0aW9uTG9jYXRpb246ICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHQpKSkuY3JlYXRpb25Mb2NhdGlvbikpLAogICAgICAgICAgICAgICAgZGF0YTogdC5kYXRhCiAgICAgICAgICAgIH07CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjYgogICAgICogQHBhcmFtIHs/PX0gdGltZW91dAogICAgICogQHBhcmFtIHs/PX0gdXBkYXRlQ2IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZENhbGxiYWNrKGNiLCB0aW1lb3V0LCB1cGRhdGVDYikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGltZW91dElkID0gLTE7CiAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCA+IDApIHsKICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChjYikgPT4gY2IudGltZW91dElkICE9PSB0aW1lb3V0SWQpKTsKICAgICAgICAgICAgICAgIGNiKHRoaXMuX2RpZFdvcmssIHRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCkpOwogICAgICAgICAgICB9KSwgdGltZW91dCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh7IGRvbmVDYjogY2IsIHRpbWVvdXRJZDogdGltZW91dElkLCB1cGRhdGVDYjogdXBkYXRlQ2IgfSkpKTsKICAgIH0KICAgIC8qKgogICAgICogV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YWJsZSB3aXRoIGEgdGltZW91dC4gSWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhhdAogICAgICogaGFwcGVucywgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIGEgbGlzdCBvZiB0aGUgbWFjcm8gdGFza3MgdGhhdCB3ZXJlIHBlbmRpbmcsIG90aGVyd2lzZSBudWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZG9uZUNiIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiBBbmd1bGFyIGlzIHN0YWJsZSBvciB0aGUgdGltZW91dCBleHBpcmVzCiAgICAgKiAgICB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCiAgICAgKiBAcGFyYW0gez89fSB0aW1lb3V0IE9wdGlvbmFsLiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIEFuZ3VsYXIgdG8gYmVjb21lIHN0YWJsZS4gSWYgbm90CiAgICAgKiAgICBzcGVjaWZpZWQsIHdoZW5TdGFibGUoKSB3aWxsIHdhaXQgZm9yZXZlci4KICAgICAqIEBwYXJhbSB7Pz19IHVwZGF0ZUNiIE9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBzZXQgb2YKICAgICAqICAgIHBlbmRpbmcgbWFjcm90YXNrcyBjaGFuZ2VzLiBJZiB0aGlzIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSBkb25lQ2Igd2lsbCBub3QgYmUgaW52b2tlZAogICAgICogICAgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyB3aWxsIGJlIGlzc3VlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHdoZW5TdGFibGUoZG9uZUNiLCB0aW1lb3V0LCB1cGRhdGVDYikgewogICAgICAgIGlmICh1cGRhdGVDYiAmJiAhdGhpcy50YXNrVHJhY2tpbmdab25lKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayB0cmFja2luZyB6b25lIGlzIHJlcXVpcmVkIHdoZW4gcGFzc2luZyBhbiB1cGRhdGUgY2FsbGJhY2sgdG8gJyArCiAgICAgICAgICAgICAgICAnd2hlblN0YWJsZSgpLiBJcyAiem9uZS5qcy9kaXN0L3Rhc2stdHJhY2tpbmcuanMiIGxvYWRlZD8nKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlc2UgYXJndW1lbnRzIGFyZSAnRnVuY3Rpb24nIGFib3ZlIHRvIGtlZXAgdGhlIHB1YmxpYyBBUEkgc2ltcGxlLgogICAgICAgIHRoaXMuYWRkQ2FsbGJhY2soKC8qKiBAdHlwZSB7P30gKi8gKGRvbmVDYikpLCB0aW1lb3V0LCAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlQ2IpKSk7CiAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzCiAgICAgKiBAZGVwcmVjYXRlZCBwZW5kaW5nIHJlcXVlc3RzIGFyZSBub3cgdHJhY2tlZCB3aXRoIHpvbmVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgcHJvdmlkZXJzIGJ5IG5hbWUKICAgICAqIEBwYXJhbSB7P30gdXNpbmcgVGhlIHJvb3QgZWxlbWVudCB0byBzZWFyY2ggZnJvbQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlciBUaGUgbmFtZSBvZiBiaW5kaW5nIHZhcmlhYmxlCiAgICAgKiBAcGFyYW0gez99IGV4YWN0TWF0Y2ggV2hldGhlciB1c2luZyBleGFjdE1hdGNoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kUHJvdmlkZXJzKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCkgewogICAgICAgIC8vIFRPRE8oanVsaWVtcik6IGltcGxlbWVudC4KICAgICAgICByZXR1cm4gW107CiAgICB9Cn0KVGVzdGFiaWxpdHkuybVmYWMgPSBmdW5jdGlvbiBUZXN0YWJpbGl0eV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXN0YWJpbGl0eSkoybXJtWluamVjdChOZ1pvbmUpKTsgfTsKVGVzdGFiaWxpdHkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVGVzdGFiaWxpdHksIGZhY3Rvcnk6IFRlc3RhYmlsaXR5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KVGVzdGFiaWxpdHkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE5nWm9uZSB9Cl07Ci8qKgogKiBBIGdsb2JhbCByZWdpc3RyeSBvZiB7XEBsaW5rIFRlc3RhYmlsaXR5fSBpbnN0YW5jZXMgZm9yIHNwZWNpZmljIGVsZW1lbnRzLgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVGVzdGFiaWxpdHlSZWdpc3RyeSB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYXBwbGljYXRpb25zID0gbmV3IE1hcCgpOwogICAgICAgIF90ZXN0YWJpbGl0eUdldHRlci5hZGRUb1dpbmRvdyh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGFuIGFwcGxpY2F0aW9uIHdpdGggYSB0ZXN0YWJpbGl0eSBob29rIHNvIHRoYXQgaXQgY2FuIGJlIHRyYWNrZWQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4gdG9rZW4gb2YgYXBwbGljYXRpb24sIHJvb3QgZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0ZXN0YWJpbGl0eSBUZXN0YWJpbGl0eSBob29rCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZWdpc3RlckFwcGxpY2F0aW9uKHRva2VuLCB0ZXN0YWJpbGl0eSkgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5zZXQodG9rZW4sIHRlc3RhYmlsaXR5KTsKICAgIH0KICAgIC8qKgogICAgICogVW5yZWdpc3RlcnMgYW4gYXBwbGljYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHRva2VuIHRva2VuIG9mIGFwcGxpY2F0aW9uLCByb290IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVucmVnaXN0ZXJBcHBsaWNhdGlvbih0b2tlbikgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5kZWxldGUodG9rZW4pOwogICAgfQogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgYXBwbGljYXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zKCkgewogICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5jbGVhcigpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYSB0ZXN0YWJpbGl0eSBob29rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24KICAgICAqIEBwYXJhbSB7P30gZWxlbSByb290IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFRlc3RhYmlsaXR5KGVsZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zLmdldChlbGVtKSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgdGVzdGFiaWxpdGllcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QWxsVGVzdGFiaWxpdGllcygpIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9hcHBsaWNhdGlvbnMudmFsdWVzKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zKHJvb3QgZWxlbWVudHMpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRBbGxSb290RWxlbWVudHMoKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgdGVzdGFiaWxpdHkgb2YgYSBub2RlIGluIHRoZSBUcmVlCiAgICAgKiBAcGFyYW0gez99IGVsZW0gbm9kZQogICAgICogQHBhcmFtIHs/PX0gZmluZEluQW5jZXN0b3JzIHdoZXRoZXIgZmluZGluZyB0ZXN0YWJpbGl0eSBpbiBhbmNlc3RvcnMgaWYgdGVzdGFiaWxpdHkgd2FzIG5vdCBmb3VuZCBpbgogICAgICogY3VycmVudCBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kVGVzdGFiaWxpdHlJblRyZWUoZWxlbSwgZmluZEluQW5jZXN0b3JzID0gdHJ1ZSkgewogICAgICAgIHJldHVybiBfdGVzdGFiaWxpdHlHZXR0ZXIuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHRoaXMsIGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7CiAgICB9Cn0KVGVzdGFiaWxpdHlSZWdpc3RyeS7JtWZhYyA9IGZ1bmN0aW9uIFRlc3RhYmlsaXR5UmVnaXN0cnlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGVzdGFiaWxpdHlSZWdpc3RyeSkoKTsgfTsKVGVzdGFiaWxpdHlSZWdpc3RyeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBmYWN0b3J5OiBUZXN0YWJpbGl0eVJlZ2lzdHJ5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KVGVzdGFiaWxpdHlSZWdpc3RyeS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwpjbGFzcyBfTm9vcEdldFRlc3RhYmlsaXR5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByZWdpc3RyeQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkVG9XaW5kb3cocmVnaXN0cnkpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgKiBAcGFyYW0gez99IGVsZW0KICAgICAqIEBwYXJhbSB7P30gZmluZEluQW5jZXN0b3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmaW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9Ci8qKgogKiBTZXQgdGhlIHtcQGxpbmsgR2V0VGVzdGFiaWxpdHl9IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEFuZ3VsYXIgdGVzdGluZyBmcmFtZXdvcmsuCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gZ2V0dGVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzZXRUZXN0YWJpbGl0eUdldHRlcihnZXR0ZXIpIHsKICAgIF90ZXN0YWJpbGl0eUdldHRlciA9IGdldHRlcjsKfQovKiogQHR5cGUgez99ICovCmxldCBfdGVzdGFiaWxpdHlHZXR0ZXIgPSBuZXcgX05vb3BHZXRUZXN0YWJpbGl0eSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fcmVmLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KbGV0IF9wbGF0Zm9ybTsKLyoqIEB0eXBlIHs/fSAqLwpsZXQgY29tcGlsZU5nTW9kdWxlRmFjdG9yeSA9IGNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BPU1RfUjNfXzsKLyoqCiAqIEB0ZW1wbGF0ZSBNCiAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICogQHBhcmFtIHs/fSBvcHRpb25zCiAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlRmFjdG9yeV9fUE9TVF9SM19fKGluamVjdG9yLCBvcHRpb25zLCBtb2R1bGVUeXBlKSB7CiAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TmdNb2R1bGVUeXBlKG1vZHVsZVR5cGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gaW5qZWN0b3IuZ2V0KENPTVBJTEVSX09QVElPTlMsIFtdKS5jb25jYXQob3B0aW9ucyk7CiAgICBpZiAodHlwZW9mIG5nSml0TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdKaXRNb2RlKSB7CiAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBjb21waWxlciB0byB1c2UgdGhlIHByb3ZpZGVkIG9wdGlvbnMuIFRoaXMgY2FsbCBtYXkgZmFpbCB3aGVuIG11bHRpcGxlIG1vZHVsZXMKICAgICAgICAvLyBhcmUgYm9vdHN0cmFwcGVkIHdpdGggaW5jb21wYXRpYmxlIG9wdGlvbnMsIGFzIGEgY29tcG9uZW50IGNhbiBvbmx5IGJlIGNvbXBpbGVkIGFjY29yZGluZyB0bwogICAgICAgIC8vIGEgc2luZ2xlIHNldCBvZiBvcHRpb25zLgogICAgICAgIHNldEppdE9wdGlvbnMoewogICAgICAgICAgICBkZWZhdWx0RW5jYXBzdWxhdGlvbjogX2xhc3REZWZpbmVkKGNvbXBpbGVyT3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbnMgPT4gb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbikpKSwKICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogX2xhc3REZWZpbmVkKGNvbXBpbGVyT3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbnMgPT4gb3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2VzKSkpLAogICAgICAgIH0pOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW9kdWxlRmFjdG9yeSA9IG5ldyBOZ01vZHVsZUZhY3RvcnkkMShtb2R1bGVUeXBlKTsKICAgIGlmIChpc0NvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlRW1wdHkoKSkgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobW9kdWxlRmFjdG9yeSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21waWxlclByb3ZpZGVycyA9IF9tZXJnZUFycmF5cyhjb21waWxlck9wdGlvbnMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gbwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbyA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoby5wcm92aWRlcnMpKSkpKTsKICAgIC8vIEluIGNhc2UgdGhlcmUgYXJlIG5vIGNvbXBpbGVyIHByb3ZpZGVycywgd2UganVzdCByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IGFzCiAgICAvLyB0aGVyZSB3b24ndCBiZSBhbnkgcmVzb3VyY2UgbG9hZGVyLiBUaGlzIGNhbiBoYXBwZW4gd2l0aCBJdnksIGJlY2F1c2UgQU9UIGNvbXBpbGVkCiAgICAvLyBtb2R1bGVzIGNhbiBiZSBzdGlsbCBwYXNzZWQgdGhyb3VnaCAiYm9vdHN0cmFwTW9kdWxlIi4gSW4gdGhhdCBjYXNlIHdlIHNob3VsZG4ndAogICAgLy8gdW5uZWNlc3NhcmlseSByZXF1aXJlIHRoZSBKSVQgY29tcGlsZXIuCiAgICBpZiAoY29tcGlsZXJQcm92aWRlcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtb2R1bGVGYWN0b3J5KTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBpbGVySW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IGNvbXBpbGVyUHJvdmlkZXJzIH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzb3VyY2VMb2FkZXIgPSBjb21waWxlckluamVjdG9yLmdldChjb21waWxlci5SZXNvdXJjZUxvYWRlcik7CiAgICAvLyBUaGUgcmVzb3VyY2UgbG9hZGVyIGNhbiBhbHNvIHJldHVybiBhIHN0cmluZyB3aGlsZSB0aGUgInJlc29sdmVDb21wb25lbnRSZXNvdXJjZXMiCiAgICAvLyBhbHdheXMgZXhwZWN0cyBhIHByb21pc2UuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHdyYXAgdGhlIHJldHVybmVkIHZhbHVlIGluIGEgcHJvbWlzZS4KICAgIHJldHVybiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCgvKioKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB1cmwgPT4gUHJvbWlzZS5yZXNvbHZlKHJlc291cmNlTG9hZGVyLmdldCh1cmwpKSkpCiAgICAgICAgLnRoZW4oKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbW9kdWxlRmFjdG9yeSkpOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcHVibGlzaERlZmF1bHRHbG9iYWxVdGlsc19fUE9TVF9SM19fKCkgewogICAgbmdEZXZNb2RlICYmIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMoKTsKfQovKiogQHR5cGUgez99ICovCmxldCBwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzJDEgPSBwdWJsaXNoRGVmYXVsdEdsb2JhbFV0aWxzX19QT1NUX1IzX187Ci8qKiBAdHlwZSB7P30gKi8KbGV0IGlzQm91bmRUb01vZHVsZSA9IGlzQm91bmRUb01vZHVsZV9fUE9TVF9SM19fOwovKioKICogQHRlbXBsYXRlIEMKICogQHBhcmFtIHs/fSBjZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNCb3VuZFRvTW9kdWxlX19QT1NUX1IzX18oY2YpIHsKICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGNmKSkpLmlzQm91bmRUb01vZHVsZTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQWxsb3dNdWx0aXBsZVRva2VuJyk7Ci8qKgogKiBBIHRva2VuIGZvciB0aGlyZC1wYXJ0eSBjb21wb25lbnRzIHRoYXQgY2FuIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgd2l0aCBOZ1Byb2JlLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdQcm9iZVRva2VuIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5hbWUsIHRva2VuKSB7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CiAgICB9Cn0KLyoqCiAqIENyZWF0ZXMgYSBwbGF0Zm9ybS4KICogUGxhdGZvcm1zIGhhdmUgdG8gYmUgZWFnZXJseSBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVQbGF0Zm9ybShpbmplY3RvcikgewogICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCAmJgogICAgICAgICFfcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUywgZmFsc2UpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBjYW4gYmUgb25seSBvbmUgcGxhdGZvcm0uIERlc3Ryb3kgdGhlIHByZXZpb3VzIG9uZSB0byBjcmVhdGUgYSBuZXcgb25lLicpOwogICAgfQogICAgcHVibGlzaERlZmF1bHRHbG9iYWxVdGlscyQxKCk7CiAgICBfcGxhdGZvcm0gPSBpbmplY3Rvci5nZXQoUGxhdGZvcm1SZWYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdHMgPSBpbmplY3Rvci5nZXQoUExBVEZPUk1fSU5JVElBTElaRVIsIG51bGwpOwogICAgaWYgKGluaXRzKQogICAgICAgIGluaXRzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5pdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGluaXQpID0+IGluaXQoKSkpOwogICAgcmV0dXJuIF9wbGF0Zm9ybTsKfQovKioKICogQ3JlYXRlcyBhIGZhY3RvcnkgZm9yIGEgcGxhdGZvcm0KICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBwYXJlbnRQbGF0Zm9ybUZhY3RvcnkKICogQHBhcmFtIHs/fSBuYW1lCiAqIEBwYXJhbSB7Pz19IHByb3ZpZGVycwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlUGxhdGZvcm1GYWN0b3J5KHBhcmVudFBsYXRmb3JtRmFjdG9yeSwgbmFtZSwgcHJvdmlkZXJzID0gW10pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRlc2MgPSBgUGxhdGZvcm06ICR7bmFtZX1gOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWFya2VyID0gbmV3IEluamVjdGlvblRva2VuKGRlc2MpOwogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7Pz19IGV4dHJhUHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXh0cmFQcm92aWRlcnMgPSBbXSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpOwogICAgICAgIGlmICghcGxhdGZvcm0gfHwgcGxhdGZvcm0uaW5qZWN0b3IuZ2V0KEFMTE9XX01VTFRJUExFX1BMQVRGT1JNUywgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmIChwYXJlbnRQbGF0Zm9ybUZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIHBhcmVudFBsYXRmb3JtRmFjdG9yeShwcm92aWRlcnMuY29uY2F0KGV4dHJhUHJvdmlkZXJzKS5jb25jYXQoeyBwcm92aWRlOiBtYXJrZXIsIHVzZVZhbHVlOiB0cnVlIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdGVkUHJvdmlkZXJzID0gcHJvdmlkZXJzLmNvbmNhdChleHRyYVByb3ZpZGVycykuY29uY2F0KHsgcHJvdmlkZTogbWFya2VyLCB1c2VWYWx1ZTogdHJ1ZSB9LCB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSU5KRUNUT1JfU0NPUEUsCiAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdwbGF0Zm9ybScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY3JlYXRlUGxhdGZvcm0oSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBpbmplY3RlZFByb3ZpZGVycywgbmFtZTogZGVzYyB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFzc2VydFBsYXRmb3JtKG1hcmtlcik7CiAgICB9KTsKfQovKioKICogQ2hlY2tzIHRoYXQgdGhlcmUgY3VycmVudGx5IGlzIGEgcGxhdGZvcm0gd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIHRva2VuIGFzIGEgcHJvdmlkZXIuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gcmVxdWlyZWRUb2tlbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0UGxhdGZvcm0ocmVxdWlyZWRUb2tlbikgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpOwogICAgaWYgKCFwbGF0Zm9ybSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGxhdGZvcm0gZXhpc3RzIScpOwogICAgfQogICAgaWYgKCFwbGF0Zm9ybS5pbmplY3Rvci5nZXQocmVxdWlyZWRUb2tlbiwgbnVsbCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcGxhdGZvcm0gd2l0aCBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQuIFBsZWFzZSBkZXN0cm95IGl0IGZpcnN0LicpOwogICAgfQogICAgcmV0dXJuIHBsYXRmb3JtOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogKgogKiBcQHB1YmxpY0FwaQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UGxhdGZvcm0oKSB7CiAgICByZXR1cm4gX3BsYXRmb3JtICYmICFfcGxhdGZvcm0uZGVzdHJveWVkID8gX3BsYXRmb3JtIDogbnVsbDsKfQovKioKICogVGhlIEFuZ3VsYXIgcGxhdGZvcm0gaXMgdGhlIGVudHJ5IHBvaW50IGZvciBBbmd1bGFyIG9uIGEgd2ViIHBhZ2UuIEVhY2ggcGFnZQogKiBoYXMgZXhhY3RseSBvbmUgcGxhdGZvcm0sIGFuZCBzZXJ2aWNlcyAoc3VjaCBhcyByZWZsZWN0aW9uKSB3aGljaCBhcmUgY29tbW9uCiAqIHRvIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiB0aGUgcGFnZSBhcmUgYm91bmQgaW4gaXRzIHNjb3BlLgogKgogKiBBIHBhZ2UncyBwbGF0Zm9ybSBpcyBpbml0aWFsaXplZCBpbXBsaWNpdGx5IHdoZW4gYSBwbGF0Zm9ybSBpcyBjcmVhdGVkIHZpYSBhIHBsYXRmb3JtIGZhY3RvcnkKICogKGUuZy4ge1xAbGluayBwbGF0Zm9ybUJyb3dzZXJ9KSwgb3IgZXhwbGljaXRseSBieSBjYWxsaW5nIHRoZSB7XEBsaW5rIGNyZWF0ZVBsYXRmb3JtfSBmdW5jdGlvbi4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFBsYXRmb3JtUmVmIHsKICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAqLwogICAgY29uc3RydWN0b3IoX2luamVjdG9yKSB7CiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgdGhpcy5fbW9kdWxlcyA9IFtdOwogICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybQogICAgICogZm9yIG9mZmxpbmUgY29tcGlsYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBteV9tb2R1bGUudHM6CiAgICAgKgogICAgICogXEBOZ01vZHVsZSh7CiAgICAgKiAgIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlXQogICAgICogfSkKICAgICAqIGNsYXNzIE15TW9kdWxlIHt9CiAgICAgKgogICAgICogbWFpbi50czoKICAgICAqIGltcG9ydCB7TXlNb2R1bGVOZ0ZhY3Rvcnl9IGZyb20gJy4vbXlfbW9kdWxlLm5nZmFjdG9yeSc7CiAgICAgKiBpbXBvcnQge3BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInOwogICAgICoKICAgICAqIGxldCBtb2R1bGVSZWYgPSBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KE15TW9kdWxlTmdGYWN0b3J5KTsKICAgICAqIGBgYAogICAgICogQHRlbXBsYXRlIE0KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlRmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShtb2R1bGVGYWN0b3J5LCBvcHRpb25zKSB7CiAgICAgICAgLy8gTm90ZTogV2UgbmVlZCB0byBjcmVhdGUgdGhlIE5nWm9uZSBfYmVmb3JlXyB3ZSBpbnN0YW50aWF0ZSB0aGUgbW9kdWxlLAogICAgICAgIC8vIGFzIGluc3RhbnRpYXRpbmcgdGhlIG1vZHVsZSBjcmVhdGVzIHNvbWUgcHJvdmlkZXJzIGVhZ2VybHkuCiAgICAgICAgLy8gU28gd2UgY3JlYXRlIGEgbWluaSBwYXJlbnQgaW5qZWN0b3IgdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBuZXcgTmdab25lIGFuZAogICAgICAgIC8vIHBhc3MgdGhhdCBhcyBwYXJlbnQgdG8gdGhlIE5nTW9kdWxlRmFjdG9yeS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbmdab25lT3B0aW9uID0gb3B0aW9ucyA/IG9wdGlvbnMubmdab25lIDogdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZ1pvbmVFdmVudENvYWxlc2NpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLm5nWm9uZUV2ZW50Q29hbGVzY2luZykgfHwgZmFsc2U7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nWm9uZSA9IGdldE5nWm9uZShuZ1pvbmVPcHRpb24sIG5nWm9uZUV2ZW50Q29hbGVzY2luZyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3ZpZGVycyA9IFt7IHByb3ZpZGU6IE5nWm9uZSwgdXNlVmFsdWU6IG5nWm9uZSB9XTsKICAgICAgICAvLyBBdHRlbnRpb246IERvbid0IHVzZSBBcHBsaWNhdGlvblJlZi5ydW4gaGVyZSwKICAgICAgICAvLyBhcyB3ZSB3YW50IHRvIGJlIHN1cmUgdGhhdCBhbGwgcG9zc2libGUgY29uc3RydWN0b3IgY2FsbHMgYXJlIGluc2lkZSBgbmdab25lLnJ1bmAhCiAgICAgICAgcmV0dXJuIG5nWm9uZS5ydW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nWm9uZUluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBwcm92aWRlcnMsIHBhcmVudDogdGhpcy5pbmplY3RvciwgbmFtZTogbW9kdWxlRmFjdG9yeS5tb2R1bGVUeXBlLm5hbWUgfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbW9kdWxlUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZUZhY3RvcnkuY3JlYXRlKG5nWm9uZUluamVjdG9yKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbkhhbmRsZXIgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEVycm9ySGFuZGxlciwgbnVsbCk7CiAgICAgICAgICAgIGlmICghZXhjZXB0aW9uSGFuZGxlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbW9kdWxlUmVmLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiByZW1vdmUodGhpcy5fbW9kdWxlcywgbW9kdWxlUmVmKSkpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAobmdab25lKSkucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLm9uRXJyb3Iuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlcnJvcikgPT4gewogICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgcmV0dXJuIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlciwgKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLCAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbml0U3RhdHVzID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChBcHBsaWNhdGlvbkluaXRTdGF0dXMpOwogICAgICAgICAgICAgICAgaW5pdFN0YXR1cy5ydW5Jbml0aWFsaXplcnMoKTsKICAgICAgICAgICAgICAgIHJldHVybiBpbml0U3RhdHVzLmRvbmVQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChpdnlFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBgTE9DQUxFX0lEYCBwcm92aWRlciBpcyBkZWZpbmVkIGF0IGJvb3RzdHJhcCB0aGVuIHdlIHNldCB0aGUgdmFsdWUgZm9yIGl2eQogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZUlkID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChMT0NBTEVfSUQkMSwgREVGQVVMVF9MT0NBTEVfSUQpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGVJZCB8fCBERUZBVUxUX0xPQ0FMRV9JRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZHVsZURvQm9vdHN0cmFwKG1vZHVsZVJlZik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVJlZjsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0gdXNpbmcgdGhlIGdpdmVuIHJ1bnRpbWUgY29tcGlsZXIuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAqICAgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGVdCiAgICAgKiB9KQogICAgICogY2xhc3MgTXlNb2R1bGUge30KICAgICAqCiAgICAgKiBsZXQgbW9kdWxlUmVmID0gcGxhdGZvcm1Ccm93c2VyKCkuYm9vdHN0cmFwTW9kdWxlKE15TW9kdWxlKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBNCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqIEBwYXJhbSB7Pz19IGNvbXBpbGVyT3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYm9vdHN0cmFwTW9kdWxlKG1vZHVsZVR5cGUsIGNvbXBpbGVyT3B0aW9ucyA9IFtdKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zUmVkdWNlcih7fSwgY29tcGlsZXJPcHRpb25zKTsKICAgICAgICByZXR1cm4gY29tcGlsZU5nTW9kdWxlRmFjdG9yeSh0aGlzLmluamVjdG9yLCBvcHRpb25zLCBtb2R1bGVUeXBlKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVGYWN0b3J5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb2R1bGVGYWN0b3J5ID0+IHRoaXMuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShtb2R1bGVGYWN0b3J5LCBvcHRpb25zKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBtb2R1bGVSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9tb2R1bGVEb0Jvb3RzdHJhcChtb2R1bGVSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXBwUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVJlZi5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpKSk7CiAgICAgICAgaWYgKG1vZHVsZVJlZi5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG1vZHVsZVJlZi5fYm9vdHN0cmFwQ29tcG9uZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmID0+IGFwcFJlZi5ib290c3RyYXAoZikpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXApIHsKICAgICAgICAgICAgbW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXAoYXBwUmVmKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1vZHVsZSAke3N0cmluZ2lmeShtb2R1bGVSZWYuaW5zdGFuY2UKICAgICAgICAgICAgICAgIC5jb25zdHJ1Y3Rvcil9IHdhcyBib290c3RyYXBwZWQsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlICJATmdNb2R1bGUuYm9vdHN0cmFwIiBjb21wb25lbnRzIG5vciBhICJuZ0RvQm9vdHN0cmFwIiBtZXRob2QuIGAgKwogICAgICAgICAgICAgICAgYFBsZWFzZSBkZWZpbmUgb25lIG9mIHRoZXNlLmApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tb2R1bGVzLnB1c2gobW9kdWxlUmVmKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXMgZGlzcG9zZWQuCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koY2FsbGJhY2spIHsKICAgICAgICB0aGlzLl9kZXN0cm95TGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ge1xAbGluayBJbmplY3Rvcn0sIHdoaWNoIGlzIHRoZSBwYXJlbnQgaW5qZWN0b3IgZm9yCiAgICAgKiBldmVyeSBBbmd1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIGFuZCBwcm92aWRlcyBzaW5nbGV0b24gcHJvdmlkZXJzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgIHJldHVybiB0aGlzLl9pbmplY3RvcjsKICAgIH0KICAgIC8qKgogICAgICogRGVzdHJveSB0aGUgQW5ndWxhciBwbGF0Zm9ybSBhbmQgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsKICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIScpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9tb2R1bGVzLnNsaWNlKCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1vZHVsZSA9PiBtb2R1bGUuZGVzdHJveSgpKSk7CiAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaXN0ZW5lciA9PiBsaXN0ZW5lcigpKSk7CiAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGRlc3Ryb3llZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkOwogICAgfQp9ClBsYXRmb3JtUmVmLsm1ZmFjID0gZnVuY3Rpb24gUGxhdGZvcm1SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGxhdGZvcm1SZWYpKMm1ybVpbmplY3QoSW5qZWN0b3IpKTsgfTsKUGxhdGZvcm1SZWYuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUGxhdGZvcm1SZWYsIGZhY3Rvcnk6IFBsYXRmb3JtUmVmLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KUGxhdGZvcm1SZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEluamVjdG9yIH0KXTsKLyoqCiAqIEBwYXJhbSB7P30gbmdab25lT3B0aW9uCiAqIEBwYXJhbSB7P30gbmdab25lRXZlbnRDb2FsZXNjaW5nCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXROZ1pvbmUobmdab25lT3B0aW9uLCBuZ1pvbmVFdmVudENvYWxlc2NpbmcpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZ1pvbmU7CiAgICBpZiAobmdab25lT3B0aW9uID09PSAnbm9vcCcpIHsKICAgICAgICBuZ1pvbmUgPSBuZXcgTm9vcE5nWm9uZSgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbmdab25lID0gKG5nWm9uZU9wdGlvbiA9PT0gJ3pvbmUuanMnID8gdW5kZWZpbmVkIDogbmdab25lT3B0aW9uKSB8fCBuZXcgTmdab25lKHsKICAgICAgICAgICAgZW5hYmxlTG9uZ1N0YWNrVHJhY2U6IGlzRGV2TW9kZSgpLAogICAgICAgICAgICBzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOiBuZ1pvbmVFdmVudENvYWxlc2NpbmcKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiBuZ1pvbmU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZXJyb3JIYW5kbGVyCiAqIEBwYXJhbSB7P30gbmdab25lCiAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyLCBuZ1pvbmUsIGNhbGxiYWNrKSB7CiAgICB0cnkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjaygpOwogICAgICAgIGlmIChpc1Byb21pc2UkMShyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlKSA9PiB7CiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGUpKSk7CiAgICAgICAgICAgICAgICAvLyByZXRocm93IGFzIHRoZSBleGNlcHRpb24gaGFuZGxlciBtaWdodCBub3QgZG8gaXQKICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGNhdGNoIChlKSB7CiAgICAgICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlKSkpOwogICAgICAgIC8vIHJldGhyb3cgYXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIG1pZ2h0IG5vdCBkbyBpdAogICAgICAgIHRocm93IGU7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gZHN0CiAqIEBwYXJhbSB7P30gb2JqcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gb3B0aW9uc1JlZHVjZXIoZHN0LCBvYmpzKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpzKSkgewogICAgICAgIGRzdCA9IG9ianMucmVkdWNlKG9wdGlvbnNSZWR1Y2VyLCBkc3QpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgZHN0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkc3QpLCAoKC8qKiBAdHlwZSB7P30gKi8gKG9ianMpKSkpOwogICAgfQogICAgcmV0dXJuIGRzdDsKfQovKioKICogQSByZWZlcmVuY2UgdG8gYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIGEgcGFnZS4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIHtcQGEgaXMtc3RhYmxlLWV4YW1wbGVzfQogKiAjIyMgaXNTdGFibGUgZXhhbXBsZXMgYW5kIGNhdmVhdHMKICoKICogTm90ZSB0d28gaW1wb3J0YW50IHBvaW50cyBhYm91dCBgaXNTdGFibGVgLCBkZW1vbnN0cmF0ZWQgaW4gdGhlIGV4YW1wbGVzIGJlbG93OgogKiAtIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlIHN0YWJsZSBpZiB5b3Ugc3RhcnQgYW55IGtpbmQKICogb2YgcmVjdXJyZW50IGFzeW5jaHJvbm91cyB0YXNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cwogKiAoZm9yIGV4YW1wbGUgZm9yIGEgcG9sbGluZyBwcm9jZXNzLCBzdGFydGVkIHdpdGggYSBgc2V0SW50ZXJ2YWxgLCBhIGBzZXRUaW1lb3V0YAogKiBvciB1c2luZyBSeEpTIG9wZXJhdG9ycyBsaWtlIGBpbnRlcnZhbGApOwogKiAtIHRoZSBgaXNTdGFibGVgIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuCiAqCiAqIExldCdzIGltYWdpbmUgdGhhdCB5b3Ugc3RhcnQgYSByZWN1cnJlbnQgdGFzawogKiAoaGVyZSBpbmNyZW1lbnRpbmcgYSBjb3VudGVyLCB1c2luZyBSeEpTIGBpbnRlcnZhbGApLAogKiBhbmQgYXQgdGhlIHNhbWUgdGltZSBzdWJzY3JpYmUgdG8gYGlzU3RhYmxlYC4KICoKICogYGBgCiAqIGNvbnN0cnVjdG9yKGFwcFJlZjogQXBwbGljYXRpb25SZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgICBmaWx0ZXIoc3RhYmxlID0+IHN0YWJsZSkKICogICApLnN1YnNjcmliZSgoKSA9PiBjb25zb2xlLmxvZygnQXBwIGlzIHN0YWJsZSBub3cnKTsKICogICBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqIEluIHRoaXMgZXhhbXBsZSwgYGlzU3RhYmxlYCB3aWxsIG5ldmVyIGVtaXQgYHRydWVgLAogKiBhbmQgdGhlIHRyYWNlICJBcHAgaXMgc3RhYmxlIG5vdyIgd2lsbCBuZXZlciBnZXQgbG9nZ2VkLgogKgogKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNvbWV0aGluZyB3aGVuIHRoZSBhcHAgaXMgc3RhYmxlLAogKiB5b3UgaGF2ZSB0byB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gYmUgc3RhYmxlCiAqIGJlZm9yZSBzdGFydGluZyB5b3VyIHBvbGxpbmcgcHJvY2Vzcy4KICoKICogYGBgCiAqIGNvbnN0cnVjdG9yKGFwcFJlZjogQXBwbGljYXRpb25SZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLAogKiAgICAgdGFwKHN0YWJsZSA9PiBjb25zb2xlLmxvZygnQXBwIGlzIHN0YWJsZSBub3cnKSksCiAqICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkpCiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIHRyYWNlICJBcHAgaXMgc3RhYmxlIG5vdyIgd2lsbCBiZSBsb2dnZWQKICogYW5kIHRoZW4gdGhlIGNvdW50ZXIgc3RhcnRzIGluY3JlbWVudGluZyBldmVyeSBzZWNvbmQuCiAqCiAqIE5vdGUgYWxzbyB0aGF0IHRoaXMgT2JzZXJ2YWJsZSBydW5zIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSwKICogd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBpbiB0aGUgc3Vic2NyaXB0aW9uCiAqIHRvIHRoaXMgT2JzZXJ2YWJsZSB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLgogKgogKiBMZXQncyBpbWFnaW5lIHRoYXQgaW5zdGVhZCBvZiBsb2dnaW5nIHRoZSBjb3VudGVyIHZhbHVlLAogKiB5b3UgdXBkYXRlIGEgZmllbGQgb2YgeW91ciBjb21wb25lbnQKICogYW5kIGRpc3BsYXkgaXQgaW4gaXRzIHRlbXBsYXRlLgogKgogKiBgYGAKICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikgewogKiAgIGFwcFJlZi5pc1N0YWJsZS5waXBlKAogKiAgICAgZmlyc3Qoc3RhYmxlID0+IHN0YWJsZSksCiAqICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkpCiAqICAgKS5zdWJzY3JpYmUoY291bnRlciA9PiB0aGlzLnZhbHVlID0gY291bnRlcik7CiAqIH0KICogYGBgCiAqIEFzIHRoZSBgaXNTdGFibGVgIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIHRoZSB6b25lLAogKiB0aGUgYHZhbHVlYCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgcHJvcGVybHksCiAqIGJ1dCB0aGUgdGVtcGxhdGUgd2lsbCBub3QgYmUgcmVmcmVzaGVkIQogKgogKiBZb3UnbGwgaGF2ZSB0byBtYW51YWxseSB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUuCiAqCiAqIGBgYAogKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsKICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICogICAgIGZpcnN0KHN0YWJsZSA9PiBzdGFibGUpLAogKiAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApKQogKiAgICkuc3Vic2NyaWJlKGNvdW50ZXIgPT4gewogKiAgICAgdGhpcy52YWx1ZSA9IGNvdW50ZXI7CiAqICAgICBjZC5kZXRlY3RDaGFuZ2VzKCk7CiAqICAgfSk7CiAqIH0KICogYGBgCiAqCiAqIE9yIG1ha2UgdGhlIHN1YnNjcmlwdGlvbiBjYWxsYmFjayBydW4gaW5zaWRlIHRoZSB6b25lLgogKgogKiBgYGAKICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZiwgem9uZTogTmdab25lKSB7CiAqICAgYXBwUmVmLmlzU3RhYmxlLnBpcGUoCiAqICAgICBmaXJzdChzdGFibGUgPT4gc3RhYmxlKSwKICogICAgIHN3aXRjaE1hcCgoKSA9PiBpbnRlcnZhbCgxMDAwKSkKICogICApLnN1YnNjcmliZShjb3VudGVyID0+IHpvbmUucnVuKCgpID0+IHRoaXMudmFsdWUgPSBjb3VudGVyKSk7CiAqIH0KICogYGBgCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBBcHBsaWNhdGlvblJlZiB7CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gX3pvbmUKICAgICAqIEBwYXJhbSB7P30gX2NvbnNvbGUKICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yCiAgICAgKiBAcGFyYW0gez99IF9leGNlcHRpb25IYW5kbGVyCiAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAqIEBwYXJhbSB7P30gX2luaXRTdGF0dXMKICAgICAqLwogICAgY29uc3RydWN0b3IoX3pvbmUsIF9jb25zb2xlLCBfaW5qZWN0b3IsIF9leGNlcHRpb25IYW5kbGVyLCBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBfaW5pdFN0YXR1cykgewogICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTsKICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7CiAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgdGhpcy5fZXhjZXB0aW9uSGFuZGxlciA9IF9leGNlcHRpb25IYW5kbGVyOwogICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgdGhpcy5faW5pdFN0YXR1cyA9IF9pbml0U3RhdHVzOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl92aWV3cyA9IFtdOwogICAgICAgIHRoaXMuX3J1bm5pbmdUaWNrID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX3N0YWJsZSA9IHRydWU7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IGEgbGlzdCBvZiBjb21wb25lbnQgdHlwZXMgcmVnaXN0ZXJlZCB0byB0aGlzIGFwcGxpY2F0aW9uLgogICAgICAgICAqIFRoaXMgbGlzdCBpcyBwb3B1bGF0ZWQgZXZlbiBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcG9uZW50VHlwZXMgPSBbXTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCB0byB0aGlzIGFwcGxpY2F0aW9uLgogICAgICAgICAqLwogICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOwogICAgICAgIHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMgPSBpc0Rldk1vZGUoKTsKICAgICAgICB0aGlzLl96b25lLm9uTWljcm90YXNrRW1wdHkuc3Vic2NyaWJlKHsKICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fem9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMudGljaygpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0N1cnJlbnRseVN0YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgdGhpcy5fc3RhYmxlID0gdGhpcy5fem9uZS5pc1N0YWJsZSAmJiAhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyAmJgogICAgICAgICAgICAgICAgIXRoaXMuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3M7CiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLl9zdGFibGUpOwogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNTdGFibGUgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvYnNlcnZlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG9ic2VydmVyKSA9PiB7CiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uIHRvIG9uU3RhYmxlIG91dHNpZGUgdGhlIEFuZ3VsYXIgWm9uZSBzbyB0aGF0CiAgICAgICAgICAgIC8vIHRoZSBjYWxsYmFjayBpcyBydW4gb3V0c2lkZSB0aGUgQW5ndWxhciBab25lLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdGFibGVTdWI7CiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgc3RhYmxlU3ViID0gdGhpcy5fem9uZS5vblN0YWJsZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIE5nWm9uZS5hc3NlcnROb3RJbkFuZ3VsYXJab25lKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgbm8gcGVuZGluZyBtYWNyby9taWNybyB0YXNrcyBpbiB0aGUgbmV4dCB0aWNrCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgZm9yIE5nWm9uZSB0byB1cGRhdGUgdGhlIHN0YXRlLgogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdGFibGUgJiYgIXRoaXMuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl96b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVuc3RhYmxlU3ViID0gdGhpcy5fem9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHN0YWJsZVN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdW5zdGFibGVTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkpOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5pc1N0YWJsZSA9CiAgICAgICAgICAgIG1lcmdlKGlzQ3VycmVudGx5U3RhYmxlLCBpc1N0YWJsZS5waXBlKHNoYXJlKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgQm9vdHN0cmFwIHByb2Nlc3MKICAgICAqCiAgICAgKiBXaGVuIGJvb3RzdHJhcHBpbmcgYSBuZXcgcm9vdCBjb21wb25lbnQgaW50byBhbiBhcHBsaWNhdGlvbiwgQW5ndWxhciBtb3VudHMgdGhlCiAgICAgKiBzcGVjaWZpZWQgYXBwbGljYXRpb24gY29tcG9uZW50IG9udG8gRE9NIGVsZW1lbnRzIGlkZW50aWZpZWQgYnkgdGhlIGNvbXBvbmVudFR5cGUncwogICAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuCiAgICAgKgogICAgICogT3B0aW9uYWxseSwgYSBjb21wb25lbnQgY2FuIGJlIG1vdW50ZWQgb250byBhIERPTSBlbGVtZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCiAgICAgKiBjb21wb25lbnRUeXBlJ3Mgc2VsZWN0b3IuCiAgICAgKgogICAgICogIyMjIEV4YW1wbGUKICAgICAqIHtcQGV4YW1wbGUgY29yZS90cy9wbGF0Zm9ybS9wbGF0Zm9ybS50cyByZWdpb249J2xvbmdmb3JtJ30KICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudE9yRmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gcm9vdFNlbGVjdG9yT3JOb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBib290c3RyYXAoY29tcG9uZW50T3JGYWN0b3J5LCByb290U2VsZWN0b3JPck5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX2luaXRTdGF0dXMuZG9uZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBib290c3RyYXAgYXMgdGhlcmUgYXJlIHN0aWxsIGFzeW5jaHJvbm91cyBpbml0aWFsaXplcnMgcnVubmluZy4gQm9vdHN0cmFwIGNvbXBvbmVudHMgaW4gdGhlIGBuZ0RvQm9vdHN0cmFwYCBtZXRob2Qgb2YgdGhlIHJvb3QgbW9kdWxlLicpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbXBvbmVudEZhY3Rvcnk7CiAgICAgICAgaWYgKGNvbXBvbmVudE9yRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvbmVudEZhY3RvcnkpIHsKICAgICAgICAgICAgY29tcG9uZW50RmFjdG9yeSA9IGNvbXBvbmVudE9yRmFjdG9yeTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnkgPQogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnRPckZhY3RvcnkpKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuY29tcG9uZW50VHlwZXMucHVzaChjb21wb25lbnRGYWN0b3J5LmNvbXBvbmVudFR5cGUpOwogICAgICAgIC8vIENyZWF0ZSBhIGZhY3RvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG1vZHVsZSBpZiBpdCdzIG5vdCBib3VuZCB0byBzb21lIG90aGVyCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlID0gaXNCb3VuZFRvTW9kdWxlKGNvbXBvbmVudEZhY3RvcnkpID8gdW5kZWZpbmVkIDogdGhpcy5faW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2VsZWN0b3JPck5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgfHwgY29tcG9uZW50RmFjdG9yeS5zZWxlY3RvcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKEluamVjdG9yLk5VTEwsIFtdLCBzZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpOwogICAgICAgIGNvbXBSZWYub25EZXN0cm95KCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgdGhpcy5fdW5sb2FkQ29tcG9uZW50KGNvbXBSZWYpOwogICAgICAgIH0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGVzdGFiaWxpdHkgPSBjb21wUmVmLmluamVjdG9yLmdldChUZXN0YWJpbGl0eSwgbnVsbCk7CiAgICAgICAgaWYgKHRlc3RhYmlsaXR5KSB7CiAgICAgICAgICAgIGNvbXBSZWYuaW5qZWN0b3IuZ2V0KFRlc3RhYmlsaXR5UmVnaXN0cnkpCiAgICAgICAgICAgICAgICAucmVnaXN0ZXJBcHBsaWNhdGlvbihjb21wUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsIHRlc3RhYmlsaXR5KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wUmVmKTsKICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICAgICAgdGhpcy5fY29uc29sZS5sb2coYEFuZ3VsYXIgaXMgcnVubmluZyBpbiB0aGUgZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSB0aGUgcHJvZHVjdGlvbiBtb2RlLmApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcFJlZjsKICAgIH0KICAgIC8qKgogICAgICogSW52b2tlIHRoaXMgbWV0aG9kIHRvIGV4cGxpY2l0bHkgcHJvY2VzcyBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBpdHMgc2lkZS1lZmZlY3RzLgogICAgICoKICAgICAqIEluIGRldmVsb3BtZW50IG1vZGUsIGB0aWNrKClgIGFsc28gcGVyZm9ybXMgYSBzZWNvbmQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSB0byBlbnN1cmUgdGhhdCBubwogICAgICogZnVydGhlciBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4gSWYgYWRkaXRpb25hbCBjaGFuZ2VzIGFyZSBwaWNrZWQgdXAgZHVyaW5nIHRoaXMgc2Vjb25kIGN5Y2xlLAogICAgICogYmluZGluZ3MgaW4gdGhlIGFwcCBoYXZlIHNpZGUtZWZmZWN0cyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiBhIHNpbmdsZSBjaGFuZ2UgZGV0ZWN0aW9uCiAgICAgKiBwYXNzLgogICAgICogSW4gdGhpcyBjYXNlLCBBbmd1bGFyIHRocm93cyBhbiBlcnJvciwgc2luY2UgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBjYW4gb25seSBoYXZlIG9uZSBjaGFuZ2UKICAgICAqIGRldGVjdGlvbiBwYXNzIGR1cmluZyB3aGljaCBhbGwgY2hhbmdlIGRldGVjdGlvbiBtdXN0IGNvbXBsZXRlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdGljaygpIHsKICAgICAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBsaWNhdGlvblJlZi50aWNrIGlzIGNhbGxlZCByZWN1cnNpdmVseScpOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IHRydWU7CiAgICAgICAgICAgIGZvciAobGV0IHZpZXcgb2YgdGhpcy5fdmlld3MpIHsKICAgICAgICAgICAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMuX3ZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmlldy5jaGVja05vQ2hhbmdlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgcmV0aHJvdyBhcyBpdCBjb3VsZCBjYW5jZWwgc3Vic2NyaXB0aW9ucyB0byBPYnNlcnZhYmxlcyEKICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9leGNlcHRpb25IYW5kbGVyLmhhbmRsZUVycm9yKGUpKSk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXR0YWNoZXMgYSB2aWV3IHNvIHRoYXQgaXQgd2lsbCBiZSBkaXJ0eSBjaGVja2VkLgogICAgICogVGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGFjaGVkIHdoZW4gaXQgaXMgZGVzdHJveWVkLgogICAgICogVGhpcyB3aWxsIHRocm93IGlmIHRoZSB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyLgogICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRhY2hWaWV3KHZpZXdSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmlldyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKTsKICAgICAgICB0aGlzLl92aWV3cy5wdXNoKHZpZXcpOwogICAgICAgIHZpZXcuYXR0YWNoVG9BcHBSZWYodGhpcyk7CiAgICB9CiAgICAvKioKICAgICAqIERldGFjaGVzIGEgdmlldyBmcm9tIGRpcnR5IGNoZWNraW5nIGFnYWluLgogICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXRhY2hWaWV3KHZpZXdSZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmlldyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKTsKICAgICAgICByZW1vdmUodGhpcy5fdmlld3MsIHZpZXcpOwogICAgICAgIHZpZXcuZGV0YWNoRnJvbUFwcFJlZigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgIHRoaXMuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpOwogICAgICAgIHRoaXMudGljaygpOwogICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudFJlZik7CiAgICAgICAgLy8gR2V0IHRoZSBsaXN0ZW5lcnMgbGF6aWx5IHRvIHByZXZlbnQgREkgY3ljbGVzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9pbmplY3Rvci5nZXQoQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgW10pLmNvbmNhdCh0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMpOwogICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobGlzdGVuZXIpID0+IGxpc3RlbmVyKGNvbXBvbmVudFJlZikpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50UmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdW5sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgIHRoaXMuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpOwogICAgICAgIHJlbW92ZSh0aGlzLmNvbXBvbmVudHMsIGNvbXBvbmVudFJlZik7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25EZXN0cm95KCkgewogICAgICAgIC8vIFRPRE8oYWx4aHViKTogRGlzcG9zZSBvZiB0aGUgTmdab25lLgogICAgICAgIHRoaXMuX3ZpZXdzLnNsaWNlKCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmlldykgPT4gdmlldy5kZXN0cm95KCkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dGFjaGVkIHZpZXdzLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHZpZXdDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RoOwogICAgfQp9CkFwcGxpY2F0aW9uUmVmLsm1ZmFjID0gZnVuY3Rpb24gQXBwbGljYXRpb25SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwbGljYXRpb25SZWYpKMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChDb25zb2xlKSwgybXJtWluamVjdChJbmplY3RvciksIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyKSwgybXJtWluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1aW5qZWN0KEFwcGxpY2F0aW9uSW5pdFN0YXR1cykpOyB9OwpBcHBsaWNhdGlvblJlZi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBcHBsaWNhdGlvblJlZiwgZmFjdG9yeTogQXBwbGljYXRpb25SZWYuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpBcHBsaWNhdGlvblJlZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogTmdab25lIH0sCiAgICB7IHR5cGU6IENvbnNvbGUgfSwKICAgIHsgdHlwZTogSW5qZWN0b3IgfSwKICAgIHsgdHlwZTogRXJyb3JIYW5kbGVyIH0sCiAgICB7IHR5cGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9LAogICAgeyB0eXBlOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMgfQpdOwovKioKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBsaXN0CiAqIEBwYXJhbSB7P30gZWwKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJlbW92ZShsaXN0LCBlbCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWwpOwogICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7CiAgICB9Cn0KLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwYXJhbSB7P30gYXJncwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2xhc3REZWZpbmVkKGFyZ3MpIHsKICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgaWYgKGFyZ3NbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gYXJnc1tpXTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcnRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbWVyZ2VBcnJheXMocGFydHMpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgcGFydHMuZm9yRWFjaCgoLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwYXJ0KSA9PiBwYXJ0ICYmIHJlc3VsdC5wdXNoKC4uLnBhcnQpKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvc3lzdGVtX2pzX25nX21vZHVsZV9mYWN0b3J5X2xvYWRlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IF9TRVBBUkFUT1IgPSAnIyc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRkFDVE9SWV9DTEFTU19TVUZGSVggPSAnTmdGYWN0b3J5JzsKLyoqCiAqIENvbmZpZ3VyYXRpb24gZm9yIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuCiAqIHRva2VuLgogKgogKiBcQHB1YmxpY0FwaQogKiBAZGVwcmVjYXRlZCB0aGUgYHN0cmluZ2AgZm9ybSBvZiBgbG9hZENoaWxkcmVuYCBpcyBkZXByZWNhdGVkLCBhbmQgYFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWdgCiAqIGlzIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy4KICogQGFic3RyYWN0CiAqLwpjbGFzcyBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnIHsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IERFRkFVTFRfQ09ORklHID0gewogICAgZmFjdG9yeVBhdGhQcmVmaXg6ICcnLAogICAgZmFjdG9yeVBhdGhTdWZmaXg6ICcubmdmYWN0b3J5JywKfTsKLyoqCiAqIE5nTW9kdWxlRmFjdG9yeUxvYWRlciB0aGF0IHVzZXMgU3lzdGVtSlMgdG8gbG9hZCBOZ01vZHVsZUZhY3RvcnkKICogXEBwdWJsaWNBcGkKICogQGRlcHJlY2F0ZWQgdGhlIGBzdHJpbmdgIGZvcm0gb2YgYGxvYWRDaGlsZHJlbmAgaXMgZGVwcmVjYXRlZCwgYW5kIGBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyYCBpcwogKiBwYXJ0IG9mIGl0cyBpbXBsZW1lbnRhdGlvbi4gU2VlIGBMb2FkQ2hpbGRyZW5gIGZvciBtb3JlIGRldGFpbHMuCiAqLwpjbGFzcyBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfY29tcGlsZXIKICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfY29tcGlsZXIsIGNvbmZpZykgewogICAgICAgIHRoaXMuX2NvbXBpbGVyID0gX2NvbXBpbGVyOwogICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZyB8fCBERUZBVUxUX0NPTkZJRzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBsb2FkKHBhdGgpIHsKICAgICAgICByZXR1cm4gIHRoaXMubG9hZEFuZENvbXBpbGUocGF0aCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRBbmRDb21waWxlKHBhdGgpIHsKICAgICAgICBsZXQgW21vZHVsZSwgZXhwb3J0TmFtZV0gPSBwYXRoLnNwbGl0KF9TRVBBUkFUT1IpOwogICAgICAgIGlmIChleHBvcnROYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZXhwb3J0TmFtZSA9ICdkZWZhdWx0JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQobW9kdWxlKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtb2R1bGUpID0+IG1vZHVsZVtleHBvcnROYW1lXSkpCiAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0eXBlKSA9PiBjaGVja05vdEVtcHR5KHR5cGUsIG1vZHVsZSwgZXhwb3J0TmFtZSkpKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodHlwZSkgPT4gdGhpcy5fY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKHR5cGUpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGxvYWRGYWN0b3J5KHBhdGgpIHsKICAgICAgICBsZXQgW21vZHVsZSwgZXhwb3J0TmFtZV0gPSBwYXRoLnNwbGl0KF9TRVBBUkFUT1IpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZmFjdG9yeUNsYXNzU3VmZml4ID0gRkFDVE9SWV9DTEFTU19TVUZGSVg7CiAgICAgICAgaWYgKGV4cG9ydE5hbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnOwogICAgICAgICAgICBmYWN0b3J5Q2xhc3NTdWZmaXggPSAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQodGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoUHJlZml4ICsgbW9kdWxlICsgdGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoU3VmZml4KQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtb2R1bGUpID0+IG1vZHVsZVtleHBvcnROYW1lICsgZmFjdG9yeUNsYXNzU3VmZml4XSkpCiAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmYWN0b3J5KSA9PiBjaGVja05vdEVtcHR5KGZhY3RvcnksIG1vZHVsZSwgZXhwb3J0TmFtZSkpKTsKICAgIH0KfQpTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLsm1ZmFjID0gZnVuY3Rpb24gU3lzdGVtSnNOZ01vZHVsZUxvYWRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyKSjJtcm1aW5qZWN0KENvbXBpbGVyKSwgybXJtWluamVjdChTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnLCA4KSk7IH07ClN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3lzdGVtSnNOZ01vZHVsZUxvYWRlciwgZmFjdG9yeTogU3lzdGVtSnNOZ01vZHVsZUxvYWRlci7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovClN5c3RlbUpzTmdNb2R1bGVMb2FkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IENvbXBpbGVyIH0sCiAgICB7IHR5cGU6IFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KXTsKLyoqCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBtb2R1bGVQYXRoCiAqIEBwYXJhbSB7P30gZXhwb3J0TmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2hlY2tOb3RFbXB0eSh2YWx1ZSwgbW9kdWxlUGF0aCwgZXhwb3J0TmFtZSkgewogICAgaWYgKCF2YWx1ZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgJyR7ZXhwb3J0TmFtZX0nIGluICcke21vZHVsZVBhdGh9J2ApOwogICAgfQogICAgcmV0dXJuIHZhbHVlOwp9Ci8qKgogKiBAcGFyYW0gez99IF9uYXRpdmVOb2RlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREZWJ1Z05vZGVSMl9fUE9TVF9SM19fKF9uYXRpdmVOb2RlKSB7CiAgICByZXR1cm4gbnVsbDsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IGdldERlYnVnTm9kZVIyID0gZ2V0RGVidWdOb2RlUjJfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3BsYXRmb3JtX2NvcmVfcHJvdmlkZXJzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgX0NPUkVfUExBVEZPUk1fUFJPVklERVJTID0gWwogICAgLy8gU2V0IGEgZGVmYXVsdCBwbGF0Zm9ybSBuYW1lIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzZXQgaXQgZXhwbGljaXRseS4KICAgIHsgcHJvdmlkZTogUExBVEZPUk1fSUQsIHVzZVZhbHVlOiAndW5rbm93bicgfSwKICAgIHsgcHJvdmlkZTogUGxhdGZvcm1SZWYsIGRlcHM6IFtJbmplY3Rvcl0gfSwKICAgIHsgcHJvdmlkZTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZGVwczogW10gfSwKICAgIHsgcHJvdmlkZTogQ29uc29sZSwgZGVwczogW10gfSwKXTsKLyoqCiAqIFRoaXMgcGxhdGZvcm0gaGFzIHRvIGJlIGluY2x1ZGVkIGluIGFueSBvdGhlciBwbGF0Zm9ybQogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IHBsYXRmb3JtQ29yZSA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShudWxsLCAnY29yZScsIF9DT1JFX1BMQVRGT1JNX1BST1ZJREVSUyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9hcHBsaWNhdGlvbl9tb2R1bGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfaXRlcmFibGVEaWZmZXJzRmFjdG9yeSgpIHsKICAgIHJldHVybiBkZWZhdWx0SXRlcmFibGVEaWZmZXJzOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkoKSB7CiAgICByZXR1cm4gZGVmYXVsdEtleVZhbHVlRGlmZmVyczsKfQovKioKICogQHBhcmFtIHs/PX0gbG9jYWxlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbG9jYWxlRmFjdG9yeShsb2NhbGUpIHsKICAgIGxvY2FsZSA9IGxvY2FsZSB8fCBnZXRHbG9iYWxMb2NhbGUoKTsKICAgIHsKICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGUpOwogICAgfQogICAgcmV0dXJuIGxvY2FsZTsKfQovKioKICogV29yayBvdXQgdGhlIGxvY2FsZSBmcm9tIHRoZSBwb3RlbnRpYWwgZ2xvYmFsIHByb3BlcnRpZXMuCiAqCiAqICogQ2xvc3VyZSBDb21waWxlcjogdXNlIGBnb29nLkxPQ0FMRWAuCiAqICogSXZ5IGVuYWJsZWQ6IHVzZSBgJGxvY2FsaXplLmxvY2FsZWAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEdsb2JhbExvY2FsZSgpIHsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nSTE4bkNsb3N1cmVNb2RlICYmCiAgICAgICAgdHlwZW9mIGdvb2cgIT09ICd1bmRlZmluZWQnICYmIGdvb2cuTE9DQUxFICE9PSAnZW4nKSB7CiAgICAgICAgLy8gKiBUaGUgZGVmYXVsdCBgZ29vZy5MT0NBTEVgIHZhbHVlIGlzIGBlbmAsIHdoaWxlIEFuZ3VsYXIgdXNlZCBgZW4tVVNgLgogICAgICAgIC8vICogSW4gb3JkZXIgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHVzZSBBbmd1bGFyIGRlZmF1bHQgdmFsdWUgb3ZlcgogICAgICAgIC8vICAgQ2xvc3VyZSBDb21waWxlcidzIG9uZS4KICAgICAgICByZXR1cm4gZ29vZy5MT0NBTEU7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBLRUVQIGB0eXBlb2YgJGxvY2FsaXplICE9PSAndW5kZWZpbmVkJyAmJiAkbG9jYWxpemUubG9jYWxlYCBJTiBTWU5DIFdJVEggVEhFIExPQ0FMSVpFCiAgICAgICAgLy8gQ09NUElMRS1USU1FIElOTElORVIuCiAgICAgICAgLy8KICAgICAgICAvLyAqIER1cmluZyBjb21waWxlIHRpbWUgaW5saW5pbmcgb2YgdHJhbnNsYXRpb25zIHRoZSBleHByZXNzaW9uIHdpbGwgYmUgcmVwbGFjZWQKICAgICAgICAvLyAgIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0aGF0IGlzIHRoZSBjdXJyZW50IGxvY2FsZS4gT3RoZXIgZm9ybXMgb2YgdGhpcyBleHByZXNzaW9uIGFyZSBub3QKICAgICAgICAvLyAgIGd1YXJhbnRlZWQgdG8gYmUgcmVwbGFjZWQuCiAgICAgICAgLy8KICAgICAgICAvLyAqIER1cmluZyBydW50aW1lIHRyYW5zbGF0aW9uIGV2YWx1YXRpb24sIHRoZSBkZXZlbG9wZXIgaXMgcmVxdWlyZWQgdG8gc2V0IGAkbG9jYWxpemUubG9jYWxlYAogICAgICAgIC8vICAgaWYgcmVxdWlyZWQsIG9yIGp1c3QgdG8gcHJvdmlkZSB0aGVpciBvd24gYExPQ0FMRV9JRGAgcHJvdmlkZXIuCiAgICAgICAgcmV0dXJuICggdHlwZW9mICRsb2NhbGl6ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgJGxvY2FsaXplLmxvY2FsZSkgfHwKICAgICAgICAgICAgREVGQVVMVF9MT0NBTEVfSUQ7CiAgICB9Cn0KY29uc3QgybUwJGcgPSBVU0RfQ1VSUkVOQ1lfQ09ERTsKLyoqCiAqIEEgYnVpbHQtaW4gW2RlcGVuZGVuY3kgaW5qZWN0aW9uIHRva2VuXShndWlkZS9nbG9zc2FyeSNkaS10b2tlbikKICogdGhhdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcm9vdCBpbmplY3RvciBmb3IgYm9vdHN0cmFwcGluZy4KICogQHR5cGUgez99CiAqLwpjb25zdCBBUFBMSUNBVElPTl9NT0RVTEVfUFJPVklERVJTID0gWwogICAgewogICAgICAgIHByb3ZpZGU6IEFwcGxpY2F0aW9uUmVmLAogICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvblJlZiwKICAgICAgICBkZXBzOiBbTmdab25lLCBDb25zb2xlLCBJbmplY3RvciwgRXJyb3JIYW5kbGVyLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEFwcGxpY2F0aW9uSW5pdFN0YXR1c10KICAgIH0sCiAgICB7IHByb3ZpZGU6IFNDSEVEVUxFUiwgZGVwczogW05nWm9uZV0sIHVzZUZhY3Rvcnk6IHpvbmVTY2hlZHVsZXJGYWN0b3J5IH0sCiAgICB7CiAgICAgICAgcHJvdmlkZTogQXBwbGljYXRpb25Jbml0U3RhdHVzLAogICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsCiAgICAgICAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgQVBQX0lOSVRJQUxJWkVSXV0KICAgIH0sCiAgICB7IHByb3ZpZGU6IENvbXBpbGVyLCB1c2VDbGFzczogQ29tcGlsZXIsIGRlcHM6IFtdIH0sCiAgICBBUFBfSURfUkFORE9NX1BST1ZJREVSLAogICAgeyBwcm92aWRlOiBJdGVyYWJsZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LAogICAgeyBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9rZXlWYWx1ZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LAogICAgewogICAgICAgIHByb3ZpZGU6IExPQ0FMRV9JRCQxLAogICAgICAgIHVzZUZhY3Rvcnk6IF9sb2NhbGVGYWN0b3J5LAogICAgICAgIGRlcHM6IFtbbmV3IEluamVjdChMT0NBTEVfSUQkMSksIG5ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKV1dCiAgICB9LAogICAgeyBwcm92aWRlOiBERUZBVUxUX0NVUlJFTkNZX0NPREUsIHVzZVZhbHVlOiDJtTAkZyB9LApdOwovKioKICogU2NoZWR1bGUgd29yayBhdCBuZXh0IGF2YWlsYWJsZSBzbG90LgogKgogKiBJbiBJdnkgdGhpcyBpcyBqdXN0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLiBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIHdoZW4gYm9vdHN0cmFwcGVkCiAqIHVzaW5nIGBwbGF0Zm9ybVJlZi5ib290c3RyYXBgIHdlIG5lZWQgdG8gdXNlIGBOZ1pvbmUub25TdGFibGVgIGFzIHRoZSBzY2hlZHVsaW5nIG1lY2hhbmlzbS4KICogVGhpcyBvdmVycmlkZXMgdGhlIHNjaGVkdWxpbmcgbWVjaGFuaXNtIGluIEl2eSB0byBgTmdab25lLm9uU3RhYmxlYC4KICoKICogQHBhcmFtIHs/fSBuZ1pvbmUgTmdab25lIHRvIHVzZSBmb3Igc2NoZWR1bGluZy4KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHpvbmVTY2hlZHVsZXJGYWN0b3J5KG5nWm9uZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHF1ZXVlID0gW107CiAgICBuZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IHsKICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChxdWV1ZS5wb3AoKSkpKCk7CiAgICAgICAgfQogICAgfSkpOwogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChmbikgewogICAgICAgIHF1ZXVlLnB1c2goZm4pOwogICAgfSk7Cn0KLyoqCiAqIENvbmZpZ3VyZXMgdGhlIHJvb3QgaW5qZWN0b3IgZm9yIGFuIGFwcCB3aXRoCiAqIHByb3ZpZGVycyBvZiBgXEBhbmd1bGFyL2NvcmVgIGRlcGVuZGVuY2llcyB0aGF0IGBBcHBsaWNhdGlvblJlZmAgbmVlZHMKICogdG8gYm9vdHN0cmFwIGNvbXBvbmVudHMuCiAqCiAqIFJlLWV4cG9ydGVkIGJ5IGBCcm93c2VyTW9kdWxlYCwgd2hpY2ggaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBpbiB0aGUgcm9vdAogKiBgQXBwTW9kdWxlYCB3aGVuIHlvdSBjcmVhdGUgYSBuZXcgYXBwIHdpdGggdGhlIENMSSBgbmV3YCBjb21tYW5kLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQXBwbGljYXRpb25Nb2R1bGUgewogICAgLy8gSW5qZWN0IEFwcGxpY2F0aW9uUmVmIHRvIG1ha2UgaXQgZWFnZXIuLi4KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhcHBSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoYXBwUmVmKSB7IH0KfQpBcHBsaWNhdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFwcGxpY2F0aW9uTW9kdWxlIH0pOwpBcHBsaWNhdGlvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFwcGxpY2F0aW9uTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFwcGxpY2F0aW9uTW9kdWxlKSjJtcm1aW5qZWN0KEFwcGxpY2F0aW9uUmVmKSk7IH0sIHByb3ZpZGVyczogQVBQTElDQVRJT05fTU9EVUxFX1BST1ZJREVSUyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFwcGxpY2F0aW9uTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBcHBsaWNhdGlvblJlZiB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlX3ByaXZhdGVfZXhwb3J0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlX3JlbmRlcjNfcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NvZGVnZW5fcHJpdmF0ZV9leHBvcnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmlmIChuZ0Rldk1vZGUpIHsKICAgIC8vIFRoaXMgaGVscGVyIGlzIHRvIGdpdmUgYSByZWFzb25hYmxlIGVycm9yIG1lc3NhZ2UgdG8gcGVvcGxlIHVwZ3JhZGluZyB0byB2OSB0aGF0IGhhdmUgbm90IHlldAogICAgLy8gaW5zdGFsbGVkIGBAYW5ndWxhci9sb2NhbGl6ZWAgaW4gdGhlaXIgYXBwLgogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgIF9nbG9iYWwuJGxvY2FsaXplID0gX2dsb2JhbC4kbG9jYWxpemUgfHwgKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgbG9va3MgbGlrZSB5b3VyIGFwcGxpY2F0aW9uIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGlzIHVzaW5nIGkxOG4uXG4nICsKICAgICAgICAgICAgJ0FuZ3VsYXIgOSBpbnRyb2R1Y2VkIGEgZ2xvYmFsIGAkbG9jYWxpemUoKWAgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQuXG4nICsKICAgICAgICAgICAgJ1BsZWFzZSBydW4gYG5nIGFkZCBAYW5ndWxhci9sb2NhbGl6ZWAgZnJvbSB0aGUgQW5ndWxhciBDTEkuXG4nICsKICAgICAgICAgICAgJyhGb3Igbm9uLUNMSSBwcm9qZWN0cywgYWRkIGBpbXBvcnQgXCdAYW5ndWxhci9sb2NhbGl6ZS9pbml0XCc7YCB0byB5b3VyIGBwb2x5ZmlsbHMudHNgIGZpbGUuXG4nICsKICAgICAgICAgICAgJ0ZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYXBwbGljYXRpb25zIGFkZCB0aGUgaW1wb3J0IHRvIHlvdXIgYG1haW4uc2VydmVyLnRzYCBmaWxlLiknKTsKICAgIH0pOwp9CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KbGV0IF9ET00gPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldERPTSgpIHsKICAgIHJldHVybiBfRE9NOwp9Ci8qKgogKiBAcGFyYW0gez99IGFkYXB0ZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHNldFJvb3REb21BZGFwdGVyKGFkYXB0ZXIpIHsKICAgIGlmICghX0RPTSkgewogICAgICAgIF9ET00gPSBhZGFwdGVyOwogICAgfQp9Ci8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlICovCi8qKgogKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbiBlbnZpcm9ubWVudC1hZ25vc3RpYyB3YXkuCiAqCiAqIFxAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZAogKiBjYW4gaW50cm9kdWNlIFhTUyByaXNrcy4KICogQGFic3RyYWN0CiAqLwpjbGFzcyBEb21BZGFwdGVyIHsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kb21fdG9rZW5zLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyB0aGUgbWFpbiByZW5kZXJpbmcgY29udGV4dC4gSW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIERPTSBEb2N1bWVudC4KICoKICogTm90ZTogRG9jdW1lbnQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBpbiB0aGUgQXBwbGljYXRpb24gQ29udGV4dCB3aGVuIEFwcGxpY2F0aW9uIGFuZCBSZW5kZXJpbmcKICogQ29udGV4dHMgYXJlIG5vdCB0aGUgc2FtZSAoZS5nLiB3aGVuIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGluIGEgV2ViIFdvcmtlcikuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgRE9DVU1FTlQkMSA9IG5ldyBJbmplY3Rpb25Ub2tlbignRG9jdW1lbnRUb2tlbicpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9sb2NhdGlvbi9wbGF0Zm9ybV9sb2NhdGlvbi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyLiBJbnN0ZWFkLCB1c2UKICoge1xAbGluayBMb2NhdGlvbn0uCiAqCiAqIGBQbGF0Zm9ybUxvY2F0aW9uYCBlbmNhcHN1bGF0ZXMgYWxsIGNhbGxzIHRvIERPTSBhcGlzLCB3aGljaCBhbGxvd3MgdGhlIFJvdXRlciB0byBiZSBwbGF0Zm9ybQogKiBhZ25vc3RpYy4KICogVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBoYXZlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBgUGxhdGZvcm1Mb2NhdGlvbmAgZm9yIHRoZSBkaWZmZXJlbnQKICogcGxhdGZvcm1zIHRoYXQgYW5ndWxhciBzdXBwb3J0cy4gRm9yIGV4YW1wbGUsIGBcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcmAgcHJvdmlkZXMgYW4KICogaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgdG8gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQsIHdoaWxlIGBcQGFuZ3VsYXIvcGxhdGZvcm0td2Vid29ya2VyYCBwcm92aWRlcwogKiBvbmUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHdlYiB3b3JrZXJzLgogKgogKiBUaGUgYFBsYXRmb3JtTG9jYXRpb25gIGNsYXNzIGlzIHVzZWQgZGlyZWN0bHkgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBvZiB7XEBsaW5rIExvY2F0aW9uU3RyYXRlZ3l9CiAqIHdoZW4gdGhleSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIERPTSBhcGlzIGxpa2UgcHVzaFN0YXRlLCBwb3BTdGF0ZSwgZXRjLi4uCiAqCiAqIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gaW4gdHVybiBpcyB1c2VkIGJ5IHRoZSB7XEBsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHdoaWNoIGlzIHVzZWQgZGlyZWN0bHkKICogYnkgdGhlIHtcQGxpbmsgUm91dGVyfSBpbiBvcmRlciB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHJvdXRlcy4gU2luY2UgYWxsIGludGVyYWN0aW9ucyBiZXR3ZWVuIHtcQGxpbmsKICogUm91dGVyfSAvCiAqIHtcQGxpbmsgTG9jYXRpb259IC8ge1xAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBhbmQgRE9NIGFwaXMgZmxvdyB0aHJvdWdoIHRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAKICogY2xhc3MgdGhleSBhcmUgYWxsIHBsYXRmb3JtIGluZGVwZW5kZW50LgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIFBsYXRmb3JtTG9jYXRpb24gewp9ClBsYXRmb3JtTG9jYXRpb24uybVmYWMgPSBmdW5jdGlvbiBQbGF0Zm9ybUxvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsYXRmb3JtTG9jYXRpb24pKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBQbGF0Zm9ybUxvY2F0aW9uLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogdXNlQnJvd3NlclBsYXRmb3JtTG9jYXRpb24sIHRva2VuOiBQbGF0Zm9ybUxvY2F0aW9uLCBwcm92aWRlZEluOiAicGxhdGZvcm0iIH0pOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHVzZUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uKCkgewogICAgcmV0dXJuIMm1ybVpbmplY3QoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24pOwp9Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEluZGljYXRlcyB3aGVuIGEgbG9jYXRpb24gaXMgaW5pdGlhbGl6ZWQuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTE9DQVRJT05fSU5JVElBTElaRUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0xvY2F0aW9uIEluaXRpYWxpemVkJyk7Ci8qKgogKiBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuCiAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uIGRldmVsb3Blci4gSW5zdGVhZCwgdXNlCiAqIHtcQGxpbmsgTG9jYXRpb259LgogKi8KY2xhc3MgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24gZXh0ZW5kcyBQbGF0Zm9ybUxvY2F0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7CiAgICAgICAgdGhpcy5faW5pdCgpOwogICAgfQogICAgLy8gVGhpcyBpcyBtb3ZlZCB0byBpdHMgb3duIG1ldGhvZCBzbyB0aGF0IGBNb2NrUGxhdGZvcm1Mb2NhdGlvblN0cmF0ZWd5YCBjYW4gb3ZlcndyaXRlIGl0CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9pbml0KCkgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sb2NhdGlvbiA9IGdldERPTSgpLmdldExvY2F0aW9uKCk7CiAgICAgICAgdGhpcy5faGlzdG9yeSA9IGdldERPTSgpLmdldEhpc3RvcnkoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QmFzZUhyZWZGcm9tRE9NKCkgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0RE9NKCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvblBvcFN0YXRlKGZuKSB7CiAgICAgICAgZ2V0RE9NKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCAnd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmbiwgZmFsc2UpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkhhc2hDaGFuZ2UoZm4pIHsKICAgICAgICBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsICd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGhyZWYoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaHJlZjsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHByb3RvY29sKCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByb3RvY29sOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgaG9zdG5hbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaG9zdG5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwb3J0KCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnBvcnQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBwYXRobmFtZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IHNlYXJjaCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5zZWFyY2g7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBoYXNoKCkgewogICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmhhc2g7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmV3UGF0aAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IHBhdGhuYW1lKG5ld1BhdGgpIHsKICAgICAgICB0aGlzLmxvY2F0aW9uLnBhdGhuYW1lID0gbmV3UGF0aDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCkgewogICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHsKICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gdXJsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCkgewogICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHsKICAgICAgICAgICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gdXJsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yd2FyZCgpIHsKICAgICAgICB0aGlzLl9oaXN0b3J5LmZvcndhcmQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmFjaygpIHsKICAgICAgICB0aGlzLl9oaXN0b3J5LmJhY2soKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGU7CiAgICB9Cn0KQnJvd3NlclBsYXRmb3JtTG9jYXRpb24uybVmYWMgPSBmdW5jdGlvbiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbikoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLwpCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gQnJvd3NlclBsYXRmb3JtTG9jYXRpb24uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjcmVhdGVCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiwgdG9rZW46IEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLCBwcm92aWRlZEluOiAicGxhdGZvcm0iIH0pOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHN1cHBvcnRzU3RhdGUoKSB7CiAgICByZXR1cm4gISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7Cn0KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjcmVhdGVCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbigpIHsKICAgIHJldHVybiBuZXcgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24oybXJtWluamVjdChET0NVTUVOVCQxKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vdXRpbC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKgogKiBKb2lucyB0d28gcGFydHMgb2YgYSBVUkwgd2l0aCBhIHNsYXNoIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHs/fSBzdGFydCAgVVJMIHN0cmluZwogKiBAcGFyYW0gez99IGVuZCAgICBVUkwgc3RyaW5nCiAqCiAqCiAqIEByZXR1cm4gez99IFRoZSBqb2luZWQgVVJMIHN0cmluZy4KICovCmZ1bmN0aW9uIGpvaW5XaXRoU2xhc2goc3RhcnQsIGVuZCkgewogICAgaWYgKHN0YXJ0Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIGVuZDsKICAgIH0KICAgIGlmIChlbmQubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc2xhc2hlcyA9IDA7CiAgICBpZiAoc3RhcnQuZW5kc1dpdGgoJy8nKSkgewogICAgICAgIHNsYXNoZXMrKzsKICAgIH0KICAgIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgc2xhc2hlcysrOwogICAgfQogICAgaWYgKHNsYXNoZXMgPT0gMikgewogICAgICAgIHJldHVybiBzdGFydCArIGVuZC5zdWJzdHJpbmcoMSk7CiAgICB9CiAgICBpZiAoc2xhc2hlcyA9PSAxKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kOwogICAgfQogICAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kOwp9Ci8qKgogKiBSZW1vdmVzIGEgdHJhaWxpbmcgc2xhc2ggZnJvbSBhIFVSTCBzdHJpbmcgaWYgbmVlZGVkLgogKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWl0aGVyIGAjYCwgYD9gLCBvciB0aGUgZW5kIG9mIHRoZQogKiBsaW5lIGFzIGAvYCBjaGFyYWN0ZXJzIGFuZCByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBvbmUgZXhpc3RzLgogKgogKiBAcGFyYW0gez99IHVybCBVUkwgc3RyaW5nLgogKgogKiBAcmV0dXJuIHs/fSBUaGUgVVJMIHN0cmluZywgbW9kaWZpZWQgaWYgbmVlZGVkLgogKi8KZnVuY3Rpb24gc3RyaXBUcmFpbGluZ1NsYXNoKHVybCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goLyN8XD98JC8pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0aEVuZElkeCA9IG1hdGNoICYmIG1hdGNoLmluZGV4IHx8IHVybC5sZW5ndGg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkcm9wcGVkU2xhc2hJZHggPSBwYXRoRW5kSWR4IC0gKHVybFtwYXRoRW5kSWR4IC0gMV0gPT09ICcvJyA/IDEgOiAwKTsKICAgIHJldHVybiB1cmwuc2xpY2UoMCwgZHJvcHBlZFNsYXNoSWR4KSArIHVybC5zbGljZShwYXRoRW5kSWR4KTsKfQovKioKICogTm9ybWFsaXplcyBVUkwgcGFyYW1ldGVycyBieSBwcmVwZW5kaW5nIHdpdGggYD9gIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHs/fSBwYXJhbXMgU3RyaW5nIG9mIFVSTCBwYXJhbWV0ZXJzLgogKgogKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgcGFyYW1ldGVycyBzdHJpbmcuCiAqLwpmdW5jdGlvbiBub3JtYWxpemVRdWVyeVBhcmFtcyhwYXJhbXMpIHsKICAgIHJldHVybiBwYXJhbXMgJiYgcGFyYW1zWzBdICE9PSAnPycgPyAnPycgKyBwYXJhbXMgOiBwYXJhbXM7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vbG9jYXRpb25fc3RyYXRlZ3kudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEVuYWJsZXMgdGhlIGBMb2NhdGlvbmAgc2VydmljZSB0byByZWFkIHJvdXRlIHN0YXRlIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuCiAqIEFuZ3VsYXIgcHJvdmlkZXMgdHdvIHN0cmF0ZWdpZXM6CiAqIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgYW5kIGBQYXRoTG9jYXRpb25TdHJhdGVneWAuCiAqCiAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBgUm91dGVyYCBvciBgTG9jYXRpb25gIHNlcnZpY2VzIHRvCiAqIGludGVyYWN0IHdpdGggYXBwbGljYXRpb24gcm91dGUgc3RhdGUuCiAqCiAqIEZvciBpbnN0YW5jZSwgYEhhc2hMb2NhdGlvblN0cmF0ZWd5YCBwcm9kdWNlcyBVUkxzIGxpa2UKICogPGNvZGUgY2xhc3M9Im5vLWF1dG8tbGluayI+aHR0cDovL2V4YW1wbGUuY29tIy9mb288L2NvZGU+LAogKiBhbmQgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBwcm9kdWNlcwogKiA8Y29kZSBjbGFzcz0ibm8tYXV0by1saW5rIj5odHRwOi8vZXhhbXBsZS5jb20vZm9vPC9jb2RlPiBhcyBhbiBlcXVpdmFsZW50IFVSTC4KICoKICogU2VlIHRoZXNlIHR3byBjbGFzc2VzIGZvciBtb3JlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIExvY2F0aW9uU3RyYXRlZ3kgewp9CkxvY2F0aW9uU3RyYXRlZ3kuybVmYWMgPSBmdW5jdGlvbiBMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvY2F0aW9uU3RyYXRlZ3kpKCk7IH07Ci8qKiBAbm9jb2xsYXBzZSAqLyBMb2NhdGlvblN0cmF0ZWd5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogcHJvdmlkZUxvY2F0aW9uU3RyYXRlZ3ksIHRva2VuOiBMb2NhdGlvblN0cmF0ZWd5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcGFyYW0gez99IHBsYXRmb3JtTG9jYXRpb24KICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHByb3ZpZGVMb2NhdGlvblN0cmF0ZWd5KHBsYXRmb3JtTG9jYXRpb24pIHsKICAgIC8vIFNlZSAjMjM5MTcKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2F0aW9uID0gybXJtWluamVjdChET0NVTUVOVCQxKS5sb2NhdGlvbjsKICAgIHJldHVybiBuZXcgUGF0aExvY2F0aW9uU3RyYXRlZ3koybXJtWluamVjdCgoLyoqIEB0eXBlIHs/fSAqLyAoUGxhdGZvcm1Mb2NhdGlvbikpKSwgbG9jYXRpb24gJiYgbG9jYXRpb24ub3JpZ2luIHx8ICcnKTsKfQovKioKICogQSBwcmVkZWZpbmVkIFtESSB0b2tlbl0oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pIGZvciB0aGUgYmFzZSBocmVmCiAqIHRvIGJlIHVzZWQgd2l0aCB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YC4KICogVGhlIGJhc2UgaHJlZiBpcyB0aGUgVVJMIHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBnZW5lcmF0aW5nCiAqIGFuZCByZWNvZ25pemluZyBVUkxzLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgdGhpcyB0b2tlbiB0byBjb25maWd1cmUgdGhlIHJvb3QgYXBwIGluamVjdG9yCiAqIHdpdGggYSBiYXNlIGhyZWYgdmFsdWUsIHNvIHRoYXQgdGhlIERJIGZyYW1ld29yayBjYW4gc3VwcGx5IHRoZSBkZXBlbmRlbmN5IGFueXdoZXJlIGluIHRoZSBhcHAuCiAqCiAqIGBgYHR5cGVzY3JpcHQKICogaW1wb3J0IHtDb21wb25lbnQsIE5nTW9kdWxlfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAqIGltcG9ydCB7QVBQX0JBU0VfSFJFRn0gZnJvbSAnXEBhbmd1bGFyL2NvbW1vbic7CiAqCiAqIFxATmdNb2R1bGUoewogKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBBUFBfQkFTRV9IUkVGLCB1c2VWYWx1ZTogJy9teS9hcHAnfV0KICogfSkKICogY2xhc3MgQXBwTW9kdWxlIHt9CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEFQUF9CQVNFX0hSRUYgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2FwcEJhc2VIcmVmJyk7Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqIEEge1xAbGluayBMb2NhdGlvblN0cmF0ZWd5fSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUge1xAbGluayBMb2NhdGlvbn0gc2VydmljZSB0bwogKiByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZQogKiBbcGF0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkgb2YgdGhlCiAqIGJyb3dzZXIncyBVUkwuCiAqCiAqIElmIHlvdSdyZSB1c2luZyBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgLCB5b3UgbXVzdCBwcm92aWRlIGEge1xAbGluayBBUFBfQkFTRV9IUkVGfQogKiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LiBUaGlzIFVSTCBwcmVmaXggdGhhdCB3aWxsIGJlIHByZXNlcnZlZAogKiB3aGVuIGdlbmVyYXRpbmcgYW5kIHJlY29nbml6aW5nIFVSTHMuCiAqCiAqIEZvciBpbnN0YW5jZSwgaWYgeW91IHByb3ZpZGUgYW4gYEFQUF9CQVNFX0hSRUZgIG9mIGAnL215L2FwcCdgIGFuZCBjYWxsCiAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWUKICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLgogKgogKiBTaW1pbGFybHksIGlmIHlvdSBhZGQgYDxiYXNlIGhyZWY9Jy9teS9hcHAnLz5gIHRvIHRoZSBkb2N1bWVudCBhbmQgY2FsbAogKiBgbG9jYXRpb24uZ28oJy9mb28nKWAsIHRoZSBicm93c2VyJ3MgVVJMIHdpbGwgYmVjb21lCiAqIGBleGFtcGxlLmNvbS9teS9hcHAvZm9vYC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL2xvY2F0aW9uL3RzL3BhdGhfbG9jYXRpb25fY29tcG9uZW50LnRzIHJlZ2lvbj0nTG9jYXRpb25Db21wb25lbnQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgUGF0aExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm1Mb2NhdGlvbgogICAgICogQHBhcmFtIHs/PX0gaHJlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcGxhdGZvcm1Mb2NhdGlvbiwgaHJlZikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIGlmIChocmVmID09IG51bGwpIHsKICAgICAgICAgICAgaHJlZiA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0QmFzZUhyZWZGcm9tRE9NKCk7CiAgICAgICAgfQogICAgICAgIGlmIChocmVmID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBiYXNlIGhyZWYgc2V0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQVBQX0JBU0VfSFJFRiB0b2tlbiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LmApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9iYXNlSHJlZiA9IGhyZWY7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uUG9wU3RhdGUoZm4pIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUoZm4pOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QmFzZUhyZWYoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2VIcmVmOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWwpIHsKICAgICAgICByZXR1cm4gam9pbldpdGhTbGFzaCh0aGlzLl9iYXNlSHJlZiwgaW50ZXJuYWwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBpbmNsdWRlSGFzaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGF0aChpbmNsdWRlSGFzaCA9IGZhbHNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhdGhuYW1lID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICByZXR1cm4gaGFzaCAmJiBpbmNsdWRlSGFzaCA/IGAke3BhdGhuYW1lfSR7aGFzaH1gIDogcGF0aG5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gdGl0bGUKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIGV4dGVybmFsVXJsKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCwgcXVlcnlQYXJhbXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmb3J3YXJkKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiYWNrKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpOwogICAgfQp9ClBhdGhMb2NhdGlvblN0cmF0ZWd5Lsm1ZmFjID0gZnVuY3Rpb24gUGF0aExvY2F0aW9uU3RyYXRlZ3lfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGF0aExvY2F0aW9uU3RyYXRlZ3kpKMm1ybVpbmplY3QoUGxhdGZvcm1Mb2NhdGlvbiksIMm1ybVpbmplY3QoQVBQX0JBU0VfSFJFRiwgOCkpOyB9OwpQYXRoTG9jYXRpb25TdHJhdGVneS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBQYXRoTG9jYXRpb25TdHJhdGVneSwgZmFjdG9yeTogUGF0aExvY2F0aW9uU3RyYXRlZ3kuybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpQYXRoTG9jYXRpb25TdHJhdGVneS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogUGxhdGZvcm1Mb2NhdGlvbiB9LAogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vaGFzaF9sb2NhdGlvbl9zdHJhdGVneS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBkZXNjcmlwdGlvbgogKiBBIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdXNlZCB0byBjb25maWd1cmUgdGhlIHtcQGxpbmsgTG9jYXRpb259IHNlcnZpY2UgdG8KICogcmVwcmVzZW50IGl0cyBzdGF0ZSBpbiB0aGUKICogW2hhc2ggZnJhZ21lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpCiAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLgogKgogKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBjYWxsIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWUKICogYGV4YW1wbGUuY29tIy9mb29gLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvaGFzaF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBIYXNoTG9jYXRpb25TdHJhdGVneSBleHRlbmRzIExvY2F0aW9uU3RyYXRlZ3kgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybUxvY2F0aW9uCiAgICAgKiBAcGFyYW0gez89fSBfYmFzZUhyZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3BsYXRmb3JtTG9jYXRpb24sIF9iYXNlSHJlZikgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbiA9IF9wbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gJyc7CiAgICAgICAgaWYgKF9iYXNlSHJlZiAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gX2Jhc2VIcmVmOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25Qb3BTdGF0ZShmbikgewogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UoZm4pOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRCYXNlSHJlZigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUhyZWY7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IGluY2x1ZGVIYXNoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwYXRoKGluY2x1ZGVIYXNoID0gZmFsc2UpIHsKICAgICAgICAvLyB0aGUgaGFzaCB2YWx1ZSBpcyBhbHdheXMgcHJlZml4ZWQgd2l0aCBhIGAjYAogICAgICAgIC8vIGFuZCBpZiBpdCBpcyBlbXB0eSB0aGVuIGl0IHdpbGwgc3RheSBlbXB0eQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGF0aCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICBpZiAocGF0aCA9PSBudWxsKQogICAgICAgICAgICBwYXRoID0gJyMnOwogICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW50ZXJuYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHByZXBhcmVFeHRlcm5hbFVybChpbnRlcm5hbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB1cmwgPSBqb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7CiAgICAgICAgcmV0dXJuIHVybC5sZW5ndGggPiAwID8gKCcjJyArIHVybCkgOiB1cmw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gdGl0bGUKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgcGF0aCwgcXVlcnlQYXJhbXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHVybCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgIGlmICh1cmwubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IHRpdGxlCiAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTsKICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIHVybCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZm9yd2FyZCgpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYmFjaygpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmJhY2soKTsKICAgIH0KfQpIYXNoTG9jYXRpb25TdHJhdGVneS7JtWZhYyA9IGZ1bmN0aW9uIEhhc2hMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhhc2hMb2NhdGlvblN0cmF0ZWd5KSjJtcm1aW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pLCDJtcm1aW5qZWN0KEFQUF9CQVNFX0hSRUYsIDgpKTsgfTsKSGFzaExvY2F0aW9uU3RyYXRlZ3kuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSGFzaExvY2F0aW9uU3RyYXRlZ3ksIGZhY3Rvcnk6IEhhc2hMb2NhdGlvblN0cmF0ZWd5Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSGFzaExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24gfSwKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FQUF9CQVNFX0hSRUYsXSB9XSB9Cl07Ci8qKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEEgc2VydmljZSB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGludGVyYWN0IHdpdGggYSBicm93c2VyJ3MgVVJMLgogKgogKiBEZXBlbmRpbmcgb24gdGhlIGBMb2NhdGlvblN0cmF0ZWd5YCB1c2VkLCBgTG9jYXRpb25gIHBlcnNpc3RzCiAqIHRvIHRoZSBVUkwncyBwYXRoIG9yIHRoZSBVUkwncyBoYXNoIHNlZ21lbnQuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiBJdCdzIGJldHRlciB0byB1c2UgdGhlIGBSb3V0ZXIjbmF2aWdhdGVgIHNlcnZpY2UgdG8gdHJpZ2dlciByb3V0ZSBjaGFuZ2VzLiBVc2UKICogYExvY2F0aW9uYCBvbmx5IGlmIHlvdSBuZWVkIHRvIGludGVyYWN0IHdpdGggb3IgY3JlYXRlIG5vcm1hbGl6ZWQgVVJMcyBvdXRzaWRlIG9mCiAqIHJvdXRpbmcuCiAqCiAqIGBMb2NhdGlvbmAgaXMgcmVzcG9uc2libGUgZm9yIG5vcm1hbGl6aW5nIHRoZSBVUkwgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24ncyBiYXNlIGhyZWYuCiAqIEEgbm9ybWFsaXplZCBVUkwgaXMgYWJzb2x1dGUgZnJvbSB0aGUgVVJMIGhvc3QsIGluY2x1ZGVzIHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZiwgYW5kIGhhcyBubwogKiB0cmFpbGluZyBzbGFzaDoKICogLSBgL215L2FwcC91c2VyLzEyM2AgaXMgbm9ybWFsaXplZAogKiAtIGBteS9hcHAvdXNlci8xMjNgICoqaXMgbm90Kiogbm9ybWFsaXplZAogKiAtIGAvbXkvYXBwL3VzZXIvMTIzL2AgKippcyBub3QqKiBub3JtYWxpemVkCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0nY29tbW9uL2xvY2F0aW9uL3RzL3BhdGhfbG9jYXRpb25fY29tcG9uZW50LnRzJwogKiByZWdpb249J0xvY2F0aW9uQ29tcG9uZW50Jz48L2NvZGUtZXhhbXBsZT4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIExvY2F0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybVN0cmF0ZWd5CiAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtTG9jYXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IocGxhdGZvcm1TdHJhdGVneSwgcGxhdGZvcm1Mb2NhdGlvbikgewogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9zdWJqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMgPSBbXTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5ID0gcGxhdGZvcm1TdHJhdGVneTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYnJvd3NlckJhc2VIcmVmID0gdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5nZXRCYXNlSHJlZigpOwogICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24gPSBwbGF0Zm9ybUxvY2F0aW9uOwogICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEluZGV4SHRtbChicm93c2VyQmFzZUhyZWYpKTsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChldikgPT4gewogICAgICAgICAgICB0aGlzLl9zdWJqZWN0LmVtaXQoewogICAgICAgICAgICAgICAgJ3VybCc6IHRoaXMucGF0aCh0cnVlKSwKICAgICAgICAgICAgICAgICdwb3AnOiB0cnVlLAogICAgICAgICAgICAgICAgJ3N0YXRlJzogZXYuc3RhdGUsCiAgICAgICAgICAgICAgICAndHlwZSc6IGV2LnR5cGUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyB0aGUgVVJMIHBhdGggZm9yIHRoaXMgbG9jYXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUhhc2ggVHJ1ZSB0byBpbmNsdWRlIGFuIGFuY2hvciBmcmFnbWVudCBpbiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgcGF0aC4KICAgICAqLwogICAgLy8gVE9ETzogdnNhdmtpbi4gUmVtb3ZlIHRoZSBib29sZWFuIGZsYWcgYW5kIGFsd2F5cyBpbmNsdWRlIGhhc2ggb25jZSB0aGUgZGVwcmVjYXRlZCByb3V0ZXIgaXMKICAgIC8vIHJlbW92ZWQuCiAgICBwYXRoKGluY2x1ZGVIYXNoID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKGluY2x1ZGVIYXNoKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlcG9ydHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvY2F0aW9uIGhpc3RvcnkuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYGhpc3Rvcnkuc3RhdGVgIG9iamVjdC4KICAgICAqLwogICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0U3RhdGUoKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gcGF0aCBhbmQgY29tcGFyZXMgdG8gdGhlIGN1cnJlbnQgbm9ybWFsaXplZCBwYXRoLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcGF0aCBUaGUgZ2l2ZW4gVVJMIHBhdGguCiAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGdpdmVuIFVSTCBwYXRoIGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50IG5vcm1hbGl6ZWQgcGF0aCwgZmFsc2UKICAgICAqIG90aGVyd2lzZS4KICAgICAqLwogICAgaXNDdXJyZW50UGF0aEVxdWFsVG8ocGF0aCwgcXVlcnkgPSAnJykgewogICAgICAgIHJldHVybiB0aGlzLnBhdGgoKSA9PSB0aGlzLm5vcm1hbGl6ZShwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKTsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyBhIFVSTCBwYXRoIGJ5IHN0cmlwcGluZyBhbnkgdHJhaWxpbmcgc2xhc2hlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHVybCBTdHJpbmcgcmVwcmVzZW50aW5nIGEgVVJMLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRoZSBub3JtYWxpemVkIFVSTCBzdHJpbmcuCiAgICAgKi8KICAgIG5vcm1hbGl6ZSh1cmwpIHsKICAgICAgICByZXR1cm4gTG9jYXRpb24uc3RyaXBUcmFpbGluZ1NsYXNoKF9zdHJpcEJhc2VIcmVmKHRoaXMuX2Jhc2VIcmVmLCBfc3RyaXBJbmRleEh0bWwodXJsKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBOb3JtYWxpemVzIGFuIGV4dGVybmFsIFVSTCBwYXRoLgogICAgICogSWYgdGhlIGdpdmVuIFVSTCBkb2Vzbid0IGJlZ2luIHdpdGggYSBsZWFkaW5nIHNsYXNoIChgJy8nYCksIGFkZHMgb25lCiAgICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIEFkZHMgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXMKICAgICAqIGluIHVzZSwgb3IgdGhlIGBBUFBfQkFTRV9IUkVGYCBpZiB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBpcyBpbiB1c2UuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB1cmwgU3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBIG5vcm1hbGl6ZWQgcGxhdGZvcm0tc3BlY2lmaWMgVVJMLgogICAgICovCiAgICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsKSB7CiAgICAgICAgaWYgKHVybCAmJiB1cmxbMF0gIT09ICcvJykgewogICAgICAgICAgICB1cmwgPSAnLycgKyB1cmw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh1cmwpOwogICAgfQogICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgbWV0aG9kIHRvIHB1c2hTdGF0ZQogICAgLyoqCiAgICAgKiBDaGFuZ2VzIHRoZSBicm93c2VyJ3MgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gVVJMLCBhbmQgcHVzaGVzIGEKICAgICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHBhdGggIFVSTCBwYXRoIHRvIG5vcm1hbGl6ZS4KICAgICAqIEBwYXJhbSB7Pz19IHF1ZXJ5IFF1ZXJ5IHBhcmFtZXRlcnMuCiAgICAgKiBAcGFyYW0gez89fSBzdGF0ZSBMb2NhdGlvbiBoaXN0b3J5IHN0YXRlLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdvKHBhdGgsIHF1ZXJ5ID0gJycsIHN0YXRlID0gbnVsbCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucHVzaFN0YXRlKHN0YXRlLCAnJywgcGF0aCwgcXVlcnkpOwogICAgICAgIHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKSwgc3RhdGUpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGFuZ2VzIHRoZSBicm93c2VyJ3MgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBVUkwsIGFuZCByZXBsYWNlcwogICAgICogdGhlIHRvcCBpdGVtIG9uIHRoZSBwbGF0Zm9ybSdzIGhpc3Rvcnkgc3RhY2suCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwYXRoICBVUkwgcGF0aCB0byBub3JtYWxpemUuCiAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICogQHBhcmFtIHs/PX0gc3RhdGUgTG9jYXRpb24gaGlzdG9yeSBzdGF0ZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlcGxhY2VTdGF0ZShwYXRoLCBxdWVyeSA9ICcnLCBzdGF0ZSA9IG51bGwpIHsKICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnJlcGxhY2VTdGF0ZShzdGF0ZSwgJycsIHBhdGgsIHF1ZXJ5KTsKICAgICAgICB0aGlzLl9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnModGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5KSksIHN0YXRlKTsKICAgIH0KICAgIC8qKgogICAgICogTmF2aWdhdGVzIGZvcndhcmQgaW4gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZvcndhcmQoKSB7CiAgICAgICAgdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5mb3J3YXJkKCk7CiAgICB9CiAgICAvKioKICAgICAqIE5hdmlnYXRlcyBiYWNrIGluIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiYWNrKCkgewogICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuYmFjaygpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBVUkwgY2hhbmdlIGxpc3RlbmVyLiBVc2UgdG8gY2F0Y2ggdXBkYXRlcyBwZXJmb3JtZWQgYnkgdGhlIEFuZ3VsYXIKICAgICAqIGZyYW1ld29yayB0aGF0IGFyZSBub3QgZGV0ZWN0aWJsZSB0aHJvdWdoICJwb3BzdGF0ZSIgb3IgImhhc2hjaGFuZ2UiIGV2ZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjaGFuZ2UgaGFuZGxlciBmdW5jdGlvbiwgd2hpY2ggdGFrZSBhIFVSTCBhbmQgYSBsb2NhdGlvbiBoaXN0b3J5IHN0YXRlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25VcmxDaGFuZ2UoZm4pIHsKICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7CiAgICAgICAgdGhpcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdiA9PiB7CiAgICAgICAgICAgIHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh2LnVybCwgdi5zdGF0ZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez89fSB1cmwKICAgICAqIEBwYXJhbSB7Pz19IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHVybCA9ICcnLCBzdGF0ZSkgewogICAgICAgIHRoaXMuX3VybENoYW5nZUxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbiA9PiBmbih1cmwsIHN0YXRlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBwbGF0Zm9ybSdzIGBwb3BTdGF0ZWAgZXZlbnRzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gb25OZXh0CiAgICAgKiBAcGFyYW0gez89fSBvblRocm93CiAgICAgKiBAcGFyYW0gez89fSBvblJldHVybgogICAgICogQHJldHVybiB7P30gU3Vic2NyaWJlZCBldmVudHMuCiAgICAgKi8KICAgIHN1YnNjcmliZShvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKHsgbmV4dDogb25OZXh0LCBlcnJvcjogb25UaHJvdywgY29tcGxldGU6IG9uUmV0dXJuIH0pOwogICAgfQp9CkxvY2F0aW9uLsm1ZmFjID0gZnVuY3Rpb24gTG9jYXRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTG9jYXRpb24pKMm1ybVpbmplY3QoTG9jYXRpb25TdHJhdGVneSksIMm1ybVpbmplY3QoUGxhdGZvcm1Mb2NhdGlvbikpOyB9OwovKioKICogTm9ybWFsaXplcyBVUkwgcGFyYW1ldGVycyBieSBwcmVwZW5kaW5nIHdpdGggYD9gIGlmIG5lZWRlZC4KICoKICogQHBhcmFtIHBhcmFtcyBTdHJpbmcgb2YgVVJMIHBhcmFtZXRlcnMuCiAqCiAqIEByZXR1cm4gVGhlIG5vcm1hbGl6ZWQgVVJMIHBhcmFtZXRlcnMgc3RyaW5nLgogKi8KTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMgPSBub3JtYWxpemVRdWVyeVBhcmFtczsKLyoqCiAqIEpvaW5zIHR3byBwYXJ0cyBvZiBhIFVSTCB3aXRoIGEgc2xhc2ggaWYgbmVlZGVkLgogKgogKiBAcGFyYW0gc3RhcnQgIFVSTCBzdHJpbmcKICogQHBhcmFtIGVuZCAgICBVUkwgc3RyaW5nCiAqCiAqCiAqIEByZXR1cm4gVGhlIGpvaW5lZCBVUkwgc3RyaW5nLgogKi8KTG9jYXRpb24uam9pbldpdGhTbGFzaCA9IGpvaW5XaXRoU2xhc2g7Ci8qKgogKiBSZW1vdmVzIGEgdHJhaWxpbmcgc2xhc2ggZnJvbSBhIFVSTCBzdHJpbmcgaWYgbmVlZGVkLgogKiBMb29rcyBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWl0aGVyIGAjYCwgYD9gLCBvciB0aGUgZW5kIG9mIHRoZQogKiBsaW5lIGFzIGAvYCBjaGFyYWN0ZXJzIGFuZCByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBvbmUgZXhpc3RzLgogKgogKiBAcGFyYW0gdXJsIFVSTCBzdHJpbmcuCiAqCiAqIEByZXR1cm4gVGhlIFVSTCBzdHJpbmcsIG1vZGlmaWVkIGlmIG5lZWRlZC4KICovCkxvY2F0aW9uLnN0cmlwVHJhaWxpbmdTbGFzaCA9IHN0cmlwVHJhaWxpbmdTbGFzaDsKLyoqIEBub2NvbGxhcHNlICovCkxvY2F0aW9uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBMb2NhdGlvblN0cmF0ZWd5IH0sCiAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gTG9jYXRpb24uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjcmVhdGVMb2NhdGlvbiwgdG9rZW46IExvY2F0aW9uLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24oKSB7CiAgICByZXR1cm4gbmV3IExvY2F0aW9uKMm1ybVpbmplY3QoKC8qKiBAdHlwZSB7P30gKi8gKExvY2F0aW9uU3RyYXRlZ3kpKSksIMm1ybVpbmplY3QoKC8qKiBAdHlwZSB7P30gKi8gKFBsYXRmb3JtTG9jYXRpb24pKSkpOwp9Ci8qKgogKiBAcGFyYW0gez99IGJhc2VIcmVmCiAqIEBwYXJhbSB7P30gdXJsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfc3RyaXBCYXNlSHJlZihiYXNlSHJlZiwgdXJsKSB7CiAgICByZXR1cm4gYmFzZUhyZWYgJiYgdXJsLnN0YXJ0c1dpdGgoYmFzZUhyZWYpID8gdXJsLnN1YnN0cmluZyhiYXNlSHJlZi5sZW5ndGgpIDogdXJsOwp9Ci8qKgogKiBAcGFyYW0gez99IHVybAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gX3N0cmlwSW5kZXhIdG1sKHVybCkgewogICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cL2luZGV4Lmh0bWwkLywgJycpOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2xvY2F0aW9uL2luZGV4LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vY3VycmVuY2llcy50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8vIFRISVMgQ09ERSBJUyBHRU5FUkFURUQgLSBETyBOT1QgTU9ESUZZCi8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCi8qKgogKiBcQGludGVybmFsCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgQ1VSUkVOQ0lFU19FTiA9IHsKICAgICdBRFAnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0FGTic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnQUxMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdBTUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDJdLAogICAgJ0FPQSc6IFt1bmRlZmluZWQsICdLeiddLAogICAgJ0FSUyc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQVVEJzogWydBJCcsICckJ10sCiAgICAnQkFNJzogW3VuZGVmaW5lZCwgJ0tNJ10sCiAgICAnQkJEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCRFQnOiBbdW5kZWZpbmVkLCAn4KezJ10sCiAgICAnQkhEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICdCSUYnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0JNRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQk5EJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCT0InOiBbdW5kZWZpbmVkLCAnQnMnXSwKICAgICdCUkwnOiBbJ1IkJ10sCiAgICAnQlNEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdCV1AnOiBbdW5kZWZpbmVkLCAnUCddLAogICAgJ0JZTic6IFt1bmRlZmluZWQsICfRgC4nLCAyXSwKICAgICdCWVInOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0JaRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQ0FEJzogWydDQSQnLCAnJCcsIDJdLAogICAgJ0NIRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAnQ0xGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCA0XSwKICAgICdDTFAnOiBbdW5kZWZpbmVkLCAnJCcsIDBdLAogICAgJ0NOWSc6IFsnQ07CpScsICfCpSddLAogICAgJ0NPUCc6IFt1bmRlZmluZWQsICckJywgMl0sCiAgICAnQ1JDJzogW3VuZGVmaW5lZCwgJ+KCoScsIDJdLAogICAgJ0NVQyc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnQ1VQJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdDWksnOiBbdW5kZWZpbmVkLCAnS8SNJywgMl0sCiAgICAnREpGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdES0snOiBbdW5kZWZpbmVkLCAna3InLCAyXSwKICAgICdET1AnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0VHUCc6IFt1bmRlZmluZWQsICdFwqMnXSwKICAgICdFU1AnOiBbdW5kZWZpbmVkLCAn4oKnJywgMF0sCiAgICAnRVVSJzogWyfigqwnXSwKICAgICdGSkQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0ZLUCc6IFt1bmRlZmluZWQsICfCoyddLAogICAgJ0dCUCc6IFsnwqMnXSwKICAgICdHRUwnOiBbdW5kZWZpbmVkLCAn4oK+J10sCiAgICAnR0lQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnR05GJzogW3VuZGVmaW5lZCwgJ0ZHJywgMF0sCiAgICAnR1RRJzogW3VuZGVmaW5lZCwgJ1EnXSwKICAgICdHWUQnOiBbdW5kZWZpbmVkLCAnJCcsIDJdLAogICAgJ0hLRCc6IFsnSEskJywgJyQnXSwKICAgICdITkwnOiBbdW5kZWZpbmVkLCAnTCddLAogICAgJ0hSSyc6IFt1bmRlZmluZWQsICdrbiddLAogICAgJ0hVRic6IFt1bmRlZmluZWQsICdGdCcsIDJdLAogICAgJ0lEUic6IFt1bmRlZmluZWQsICdScCcsIDJdLAogICAgJ0lMUyc6IFsn4oKqJ10sCiAgICAnSU5SJzogWyfigrknXSwKICAgICdJUUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ0lSUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnSVNLJzogW3VuZGVmaW5lZCwgJ2tyJywgMF0sCiAgICAnSVRMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdKTUQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0pPRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAnSlBZJzogWyfCpScsIHVuZGVmaW5lZCwgMF0sCiAgICAnS0hSJzogW3VuZGVmaW5lZCwgJ+GfmyddLAogICAgJ0tNRic6IFt1bmRlZmluZWQsICdDRicsIDBdLAogICAgJ0tQVyc6IFt1bmRlZmluZWQsICfigqknLCAwXSwKICAgICdLUlcnOiBbJ+KCqScsIHVuZGVmaW5lZCwgMF0sCiAgICAnS1dEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICdLWUQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ0taVCc6IFt1bmRlZmluZWQsICfigrgnXSwKICAgICdMQUsnOiBbdW5kZWZpbmVkLCAn4oKtJywgMF0sCiAgICAnTEJQJzogW3VuZGVmaW5lZCwgJ0zCoycsIDBdLAogICAgJ0xLUic6IFt1bmRlZmluZWQsICdScyddLAogICAgJ0xSRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnTFRMJzogW3VuZGVmaW5lZCwgJ0x0J10sCiAgICAnTFVGJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdMVkwnOiBbdW5kZWZpbmVkLCAnTHMnXSwKICAgICdMWUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgJ01HQSc6IFt1bmRlZmluZWQsICdBcicsIDBdLAogICAgJ01HRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnTU1LJzogW3VuZGVmaW5lZCwgJ0snLCAwXSwKICAgICdNTlQnOiBbdW5kZWZpbmVkLCAn4oKuJywgMl0sCiAgICAnTVJPJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdNVVInOiBbdW5kZWZpbmVkLCAnUnMnLCAyXSwKICAgICdNWE4nOiBbJ01YJCcsICckJ10sCiAgICAnTVlSJzogW3VuZGVmaW5lZCwgJ1JNJ10sCiAgICAnTkFEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICdOR04nOiBbdW5kZWZpbmVkLCAn4oKmJ10sCiAgICAnTklPJzogW3VuZGVmaW5lZCwgJ0MkJ10sCiAgICAnTk9LJzogW3VuZGVmaW5lZCwgJ2tyJywgMl0sCiAgICAnTlBSJzogW3VuZGVmaW5lZCwgJ1JzJ10sCiAgICAnTlpEJzogWydOWiQnLCAnJCddLAogICAgJ09NUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAnUEhQJzogW3VuZGVmaW5lZCwgJ+KCsSddLAogICAgJ1BLUic6IFt1bmRlZmluZWQsICdScycsIDJdLAogICAgJ1BMTic6IFt1bmRlZmluZWQsICd6xYInXSwKICAgICdQWUcnOiBbdW5kZWZpbmVkLCAn4oKyJywgMF0sCiAgICAnUk9OJzogW3VuZGVmaW5lZCwgJ2xlaSddLAogICAgJ1JTRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnUlVCJzogW3VuZGVmaW5lZCwgJ+KCvSddLAogICAgJ1JVUic6IFt1bmRlZmluZWQsICfRgC4nXSwKICAgICdSV0YnOiBbdW5kZWZpbmVkLCAnUkYnLCAwXSwKICAgICdTQkQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ1NFSyc6IFt1bmRlZmluZWQsICdrcicsIDJdLAogICAgJ1NHRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnU0hQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnU0xMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdTT1MnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgJ1NSRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnU1NQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAnU1REJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdTVE4nOiBbdW5kZWZpbmVkLCAnRGInXSwKICAgICdTWVAnOiBbdW5kZWZpbmVkLCAnwqMnLCAwXSwKICAgICdUSEInOiBbdW5kZWZpbmVkLCAn4Li/J10sCiAgICAnVE1NJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdUTkQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgJ1RPUCc6IFt1bmRlZmluZWQsICdUJCddLAogICAgJ1RSTCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnVFJZJzogW3VuZGVmaW5lZCwgJ+KCuiddLAogICAgJ1RURCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAnVFdEJzogWydOVCQnLCAnJCcsIDJdLAogICAgJ1RaUyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAnVUFIJzogW3VuZGVmaW5lZCwgJ+KCtCddLAogICAgJ1VHWCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnVVNEJzogWyckJ10sCiAgICAnVVlJJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdVWVUnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgJ1VZVyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgNF0sCiAgICAnVVpTJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAyXSwKICAgICdWRUYnOiBbdW5kZWZpbmVkLCAnQnMnLCAyXSwKICAgICdWTkQnOiBbJ+KCqycsIHVuZGVmaW5lZCwgMF0sCiAgICAnVlVWJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdYQUYnOiBbJ0ZDRkEnLCB1bmRlZmluZWQsIDBdLAogICAgJ1hDRCc6IFsnRUMkJywgJyQnXSwKICAgICdYT0YnOiBbJ0NGQScsIHVuZGVmaW5lZCwgMF0sCiAgICAnWFBGJzogWydDRlBGJywgdW5kZWZpbmVkLCAwXSwKICAgICdYWFgnOiBbJ8KkJ10sCiAgICAnWUVSJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICdaQVInOiBbdW5kZWZpbmVkLCAnUiddLAogICAgJ1pNSyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAnWk1XJzogW3VuZGVmaW5lZCwgJ1pLJ10sCiAgICAnWldEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXQp9OwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2xvY2FsZV9kYXRhX2FwaS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgTnVtYmVyRm9ybWF0U3R5bGUgPSB7CiAgICBEZWNpbWFsOiAwLAogICAgUGVyY2VudDogMSwKICAgIEN1cnJlbmN5OiAyLAogICAgU2NpZW50aWZpYzogMywKfTsKTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbF0gPSAnRGVjaW1hbCc7Ck51bWJlckZvcm1hdFN0eWxlW051bWJlckZvcm1hdFN0eWxlLlBlcmNlbnRdID0gJ1BlcmNlbnQnOwpOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeV0gPSAnQ3VycmVuY3knOwpOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5TY2llbnRpZmljXSA9ICdTY2llbnRpZmljJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFBsdXJhbCA9IHsKICAgIFplcm86IDAsCiAgICBPbmU6IDEsCiAgICBUd286IDIsCiAgICBGZXc6IDMsCiAgICBNYW55OiA0LAogICAgT3RoZXI6IDUsCn07ClBsdXJhbFtQbHVyYWwuWmVyb10gPSAnWmVybyc7ClBsdXJhbFtQbHVyYWwuT25lXSA9ICdPbmUnOwpQbHVyYWxbUGx1cmFsLlR3b10gPSAnVHdvJzsKUGx1cmFsW1BsdXJhbC5GZXddID0gJ0Zldyc7ClBsdXJhbFtQbHVyYWwuTWFueV0gPSAnTWFueSc7ClBsdXJhbFtQbHVyYWwuT3RoZXJdID0gJ090aGVyJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IEZvcm1TdHlsZSA9IHsKICAgIEZvcm1hdDogMCwKICAgIFN0YW5kYWxvbmU6IDEsCn07CkZvcm1TdHlsZVtGb3JtU3R5bGUuRm9ybWF0XSA9ICdGb3JtYXQnOwpGb3JtU3R5bGVbRm9ybVN0eWxlLlN0YW5kYWxvbmVdID0gJ1N0YW5kYWxvbmUnOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgVHJhbnNsYXRpb25XaWR0aCA9IHsKICAgIC8qKiAxIGNoYXJhY3RlciBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICdTJyAqLwogICAgTmFycm93OiAwLAogICAgLyoqIDMgY2hhcmFjdGVycyBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICdTdW4nICovCiAgICBBYmJyZXZpYXRlZDogMSwKICAgIC8qKiBGdWxsIGxlbmd0aCBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICJTdW5kYXkiICovCiAgICBXaWRlOiAyLAogICAgLyoqIDIgY2hhcmFjdGVycyBmb3IgYGVuLVVTYCwgRm9yIGV4YW1wbGU6ICJTdSIgKi8KICAgIFNob3J0OiAzLAp9OwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguTmFycm93XSA9ICdOYXJyb3cnOwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWRdID0gJ0FiYnJldmlhdGVkJzsKVHJhbnNsYXRpb25XaWR0aFtUcmFuc2xhdGlvbldpZHRoLldpZGVdID0gJ1dpZGUnOwpUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguU2hvcnRdID0gJ1Nob3J0JzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IEZvcm1hdFdpZHRoID0gewogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgJ00vZC95eSwgaDptbSBhJ2AKICAgICAqIChFeGFtcGxlOiBgNi8xNS8xNSwgOTowMyBBTWApCiAgICAgKi8KICAgIFNob3J0OiAwLAogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgYCdNTU0gZCwgeSwgaDptbTpzcyBhJ2AKICAgICAqIChFeGFtcGxlOiBgSnVuIDE1LCAyMDE1LCA5OjAzOjAxIEFNYCkKICAgICAqLwogICAgTWVkaXVtOiAxLAogICAgLyoqCiAgICAgKiBGb3IgYGVuLVVTYCwgYCdNTU1NIGQsIHksIGg6bW06c3MgYSB6J2AKICAgICAqIChFeGFtcGxlOiBgSnVuZSAxNSwgMjAxNSBhdCA5OjAzOjAxIEFNIEdNVCsxYCkKICAgICAqLwogICAgTG9uZzogMiwKICAgIC8qKgogICAgICogRm9yIGBlbi1VU2AsIGAnRUVFRSwgTU1NTSBkLCB5LCBoOm1tOnNzIGEgenp6eidgCiAgICAgKiAoRXhhbXBsZTogYE1vbmRheSwgSnVuZSAxNSwgMjAxNSBhdCA5OjAzOjAxIEFNIEdNVCswMTowMGApCiAgICAgKi8KICAgIEZ1bGw6IDMsCn07CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLlNob3J0XSA9ICdTaG9ydCc7CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLk1lZGl1bV0gPSAnTWVkaXVtJzsKRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGguTG9uZ10gPSAnTG9uZyc7CkZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLkZ1bGxdID0gJ0Z1bGwnOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgTnVtYmVyU3ltYm9sID0gewogICAgLyoqCiAgICAgKiBEZWNpbWFsIHNlcGFyYXRvci4KICAgICAqIEZvciBgZW4tVVNgLCB0aGUgZG90IGNoYXJhY3Rlci4KICAgICAqIEV4YW1wbGUgOiAyLDM0NWAuYDY3CiAgICAgKi8KICAgIERlY2ltYWw6IDAsCiAgICAvKioKICAgICAqIEdyb3VwaW5nIHNlcGFyYXRvciwgdHlwaWNhbGx5IGZvciB0aG91c2FuZHMuCiAgICAgKiBGb3IgYGVuLVVTYCwgdGhlIGNvbW1hIGNoYXJhY3Rlci4KICAgICAqIEV4YW1wbGU6IDJgLGAzNDUuNjcKICAgICAqLwogICAgR3JvdXA6IDEsCiAgICAvKioKICAgICAqIExpc3QtaXRlbSBzZXBhcmF0b3IuCiAgICAgKiBFeGFtcGxlOiAib25lLCB0d28sIGFuZCB0aHJlZSIKICAgICAqLwogICAgTGlzdDogMiwKICAgIC8qKgogICAgICogU2lnbiBmb3IgcGVyY2VudGFnZSAob3V0IG9mIDEwMCkuCiAgICAgKiBFeGFtcGxlOiAyMy40JQogICAgICovCiAgICBQZXJjZW50U2lnbjogMywKICAgIC8qKgogICAgICogU2lnbiBmb3IgcG9zaXRpdmUgbnVtYmVycy4KICAgICAqIEV4YW1wbGU6ICsyMwogICAgICovCiAgICBQbHVzU2lnbjogNCwKICAgIC8qKgogICAgICogU2lnbiBmb3IgbmVnYXRpdmUgbnVtYmVycy4KICAgICAqIEV4YW1wbGU6IC0yMwogICAgICovCiAgICBNaW51c1NpZ246IDUsCiAgICAvKioKICAgICAqIENvbXB1dGVyIG5vdGF0aW9uIGZvciBleHBvbmVudGlhbCB2YWx1ZSAobiB0aW1lcyBhIHBvd2VyIG9mIDEwKS4KICAgICAqIEV4YW1wbGU6IDEuMkUzCiAgICAgKi8KICAgIEV4cG9uZW50aWFsOiA2LAogICAgLyoqCiAgICAgKiBIdW1hbi1yZWFkYWJsZSBmb3JtYXQgb2YgZXhwb25lbnRpYWwuCiAgICAgKiBFeGFtcGxlOiAxLjJ4MTAzCiAgICAgKi8KICAgIFN1cGVyc2NyaXB0aW5nRXhwb25lbnQ6IDcsCiAgICAvKioKICAgICAqIFNpZ24gZm9yIHBlcm1pbGxlIChvdXQgb2YgMTAwMCkuCiAgICAgKiBFeGFtcGxlOiAyMy404oCwCiAgICAgKi8KICAgIFBlck1pbGxlOiA4LAogICAgLyoqCiAgICAgKiBJbmZpbml0eSwgY2FuIGJlIHVzZWQgd2l0aCBwbHVzIGFuZCBtaW51cy4KICAgICAqIEV4YW1wbGU6IOKIniwgK+KIniwgLeKIngogICAgICovCiAgICBJbmZpbml0eTogOSwKICAgIC8qKgogICAgICogTm90IGEgbnVtYmVyLgogICAgICogRXhhbXBsZTogTmFOCiAgICAgKi8KICAgIE5hTjogMTAsCiAgICAvKioKICAgICAqIFN5bWJvbCB1c2VkIGJldHdlZW4gdGltZSB1bml0cy4KICAgICAqIEV4YW1wbGU6IDEwOjUyCiAgICAgKi8KICAgIFRpbWVTZXBhcmF0b3I6IDExLAogICAgLyoqCiAgICAgKiBEZWNpbWFsIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgRGVjaW1hbGApLgogICAgICogRXhhbXBsZTogJDIsMzQ1LjY3CiAgICAgKi8KICAgIEN1cnJlbmN5RGVjaW1hbDogMTIsCiAgICAvKioKICAgICAqIEdyb3VwIHNlcGFyYXRvciBmb3IgY3VycmVuY3kgdmFsdWVzIChmYWxsYmFjayB0byBgR3JvdXBgKS4KICAgICAqIEV4YW1wbGU6ICQyLDM0NS42NwogICAgICovCiAgICBDdXJyZW5jeUdyb3VwOiAxMywKfTsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5EZWNpbWFsXSA9ICdEZWNpbWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5Hcm91cF0gPSAnR3JvdXAnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkxpc3RdID0gJ0xpc3QnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlBlcmNlbnRTaWduXSA9ICdQZXJjZW50U2lnbic7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuUGx1c1NpZ25dID0gJ1BsdXNTaWduJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5NaW51c1NpZ25dID0gJ01pbnVzU2lnbic7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuRXhwb25lbnRpYWxdID0gJ0V4cG9uZW50aWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5TdXBlcnNjcmlwdGluZ0V4cG9uZW50XSA9ICdTdXBlcnNjcmlwdGluZ0V4cG9uZW50JzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5QZXJNaWxsZV0gPSAnUGVyTWlsbGUnOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkluZmluaXR5XSA9ICdJbmZpbml0eSc7Ck51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuTmFOXSA9ICdOYU4nOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlRpbWVTZXBhcmF0b3JdID0gJ1RpbWVTZXBhcmF0b3InOwpOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkN1cnJlbmN5RGVjaW1hbF0gPSAnQ3VycmVuY3lEZWNpbWFsJzsKTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5DdXJyZW5jeUdyb3VwXSA9ICdDdXJyZW5jeUdyb3VwJzsKLyoqCiAqIFJldHJpZXZlcyB0aGUgbG9jYWxlIElEIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlLgogKiBUaGUgbG9hZGVkIGxvY2FsZSBjb3VsZCBiZSwgZm9yIGV4YW1wbGUsIGEgZ2xvYmFsIG9uZSByYXRoZXIgdGhhbiBhIHJlZ2lvbmFsIG9uZS4KICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSwgc3VjaCBhcyBgZnItRlJgLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxlIGNvZGUuIEZvciBleGFtcGxlLCBgZnJgLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlSWQkMShsb2NhbGUpIHsKICAgIHJldHVybiBmaW5kTG9jYWxlRGF0YShsb2NhbGUpW0xvY2FsZURhdGFJbmRleC5Mb2NhbGVJZF07Cn0KLyoqCiAqIFJldHJpZXZlcyBkYXkgcGVyaW9kIHN0cmluZ3MgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIHBlcmlvZCBzdHJpbmdzLiBGb3IgZXhhbXBsZSwgYFtBTSwgUE1dYCBmb3IgYGVuLVVTYC4KICovCmZ1bmN0aW9uIGdldExvY2FsZURheVBlcmlvZHMobG9jYWxlLCBmb3JtU3R5bGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFtUG1EYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKFsKICAgICAgICBkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF5UGVyaW9kc1N0YW5kYWxvbmVdCiAgICBdKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhbVBtID0gZ2V0TGFzdERlZmluZWRWYWx1ZShhbVBtRGF0YSwgZm9ybVN0eWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGFtUG0sIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGRheXMgb2YgdGhlIHdlZWsgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHVzaW5nIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIG5hbWUgc3RyaW5ncy4KICogRm9yIGV4YW1wbGUsYFtTdW5kYXksIE1vbmRheSwgLi4uIFNhdHVyZGF5XWAgZm9yIGBlbi1VU2AuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVEYXlOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF5c0RhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW2RhdGFbTG9jYWxlRGF0YUluZGV4LkRheXNGb3JtYXRdLCBkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlzU3RhbmRhbG9uZV1dKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXlzID0gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlzRGF0YSwgZm9ybVN0eWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheXMsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIG1vbnRocyBvZiB0aGUgeWVhciBmb3IgdGhlIGdpdmVuIGxvY2FsZSwgdXNpbmcgdGhlIEdyZWdvcmlhbiBjYWxlbmRhci4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez99IGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS4KICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLgogKiBAcmV0dXJuIHs/fSBBbiBhcnJheSBvZiBsb2NhbGl6ZWQgbmFtZSBzdHJpbmdzLgogKiBGb3IgZXhhbXBsZSwgIGBbSmFudWFyeSwgRmVicnVhcnksIC4uLl1gIGZvciBgZW4tVVNgLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTW9udGhOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbW9udGhzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChbZGF0YVtMb2NhbGVEYXRhSW5kZXguTW9udGhzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguTW9udGhzU3RhbmRhbG9uZV1dKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtb250aHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKG1vbnRoc0RhdGEsIGZvcm1TdHlsZSk7CiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShtb250aHMsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIEdyZWdvcmlhbi1jYWxlbmRhciBlcmFzIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLgogKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIGVyYSBzdHJpbmdzLgogKiBGb3IgZXhhbXBsZSwgYFtBRCwgQkNdYCBmb3IgYGVuLVVTYC4KICovCmZ1bmN0aW9uIGdldExvY2FsZUVyYU5hbWVzKGxvY2FsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZXJhc0RhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVtMb2NhbGVEYXRhSW5kZXguRXJhc10pKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGVyYXNEYXRhLCB3aWR0aCk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXZhbHVlIGZvcm1hdGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdGluZyBzdHJpbmcuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZUZvcm1hdF0sIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGEgbG9jYWxpemVkIHRpbWUtdmFsdWUgZm9ybWF0dGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlVGltZUZvcm1hdChsb2NhbGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGRhdGFbTG9jYWxlRGF0YUluZGV4LlRpbWVGb3JtYXRdLCB3aWR0aCk7Cn0KLyoqCiAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXRpbWUgZm9ybWF0dGluZyBzdHJpbmcuCiAqCiAqIEBzZWUgYEZvcm1hdFdpZHRoYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB3aWR0aCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlVGltZUZvcm1hdERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZVRpbWVGb3JtYXRdKSk7CiAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRlVGltZUZvcm1hdERhdGEsIHdpZHRoKTsKfQovKioKICogUmV0cmlldmVzIGEgbG9jYWxpemVkIG51bWJlciBzeW1ib2wgdGhhdCBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVycyBpbiBudW1iZXIgZm9ybWF0cy4KICogQHNlZSBgTnVtYmVyU3ltYm9sYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGxvY2FsZSBUaGUgbG9jYWxlIGNvZGUuCiAqIEBwYXJhbSB7P30gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9jYWxpemUuCiAqIEByZXR1cm4gez99IFRoZSBjaGFyYWN0ZXIgZm9yIHRoZSBsb2NhbGl6ZWQgc3ltYm9sLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgc3ltYm9sKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcyA9IGRhdGFbTG9jYWxlRGF0YUluZGV4Lk51bWJlclN5bWJvbHNdW3N5bWJvbF07CiAgICBpZiAodHlwZW9mIHJlcyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoc3ltYm9sID09PSBOdW1iZXJTeW1ib2wuQ3VycmVuY3lEZWNpbWFsKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhW0xvY2FsZURhdGFJbmRleC5OdW1iZXJTeW1ib2xzXVtOdW1iZXJTeW1ib2wuRGVjaW1hbF07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGFbTG9jYWxlRGF0YUluZGV4Lk51bWJlclN5bWJvbHNdW051bWJlclN5bWJvbC5Hcm91cF07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlczsKfQovKioKICogUmV0cmlldmVzIGEgbnVtYmVyIGZvcm1hdCBmb3IgYSBnaXZlbiBsb2NhbGUuCiAqCiAqIE51bWJlcnMgYXJlIGZvcm1hdHRlZCB1c2luZyBwYXR0ZXJucywgbGlrZSBgIywjIyMuMDBgLiBGb3IgZXhhbXBsZSwgdGhlIHBhdHRlcm4gYCMsIyMjLjAwYAogKiB3aGVuIHVzZWQgdG8gZm9ybWF0IHRoZSBudW1iZXIgMTIzNDUuNjc4IGNvdWxkIHJlc3VsdCBpbiAiMTInMzQ1LDY3OCIuIFRoYXQgd291bGQgaGFwcGVuIGlmIHRoZQogKiBncm91cGluZyBzZXBhcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgaXMgYW4gYXBvc3Ryb3BoZSwgYW5kIHRoZSBkZWNpbWFsIHNlcGFyYXRvciBpcyBhIGNvbW1hLgogKgogKiA8Yj5JbXBvcnRhbnQ6PC9iPiBUaGUgY2hhcmFjdGVycyBgLmAgYCxgIGAwYCBgI2AgKGFuZCBvdGhlcnMgYmVsb3cpIGFyZSBzcGVjaWFsIHBsYWNlaG9sZGVycwogKiB0aGF0IHN0YW5kIGZvciB0aGUgZGVjaW1hbCBzZXBhcmF0b3IsIGFuZCBzbyBvbiwgYW5kIGFyZSBOT1QgcmVhbCBjaGFyYWN0ZXJzLgogKiBZb3UgbXVzdCBOT1QgInRyYW5zbGF0ZSIgdGhlIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUsIGRvbid0IGNoYW5nZSBgLmAgdG8gYCxgIGV2ZW4gdGhvdWdoIGluCiAqIHlvdXIgbGFuZ3VhZ2UgdGhlIGRlY2ltYWwgcG9pbnQgaXMgd3JpdHRlbiB3aXRoIGEgY29tbWEuIFRoZSBzeW1ib2xzIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUKICogbG9jYWwgZXF1aXZhbGVudHMsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBgTnVtYmVyU3ltYm9sYCBmb3IgeW91ciBsYW5ndWFnZS4KICoKICogSGVyZSBhcmUgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB1c2VkIGluIG51bWJlciBwYXR0ZXJuczoKICoKICogfCBTeW1ib2wgfCBNZWFuaW5nIHwKICogfC0tLS0tLS0tfC0tLS0tLS0tLXwKICogfCAuIHwgUmVwbGFjZWQgYXV0b21hdGljYWxseSBieSB0aGUgY2hhcmFjdGVyIHVzZWQgZm9yIHRoZSBkZWNpbWFsIHBvaW50LiB8CiAqIHwgLCB8IFJlcGxhY2VkIGJ5IHRoZSAiZ3JvdXBpbmciICh0aG91c2FuZHMpIHNlcGFyYXRvci4gfAogKiB8IDAgfCBSZXBsYWNlZCBieSBhIGRpZ2l0IChvciB6ZXJvIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggZGlnaXRzKS4gfAogKiB8ICMgfCBSZXBsYWNlZCBieSBhIGRpZ2l0IChvciBub3RoaW5nIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2gpLiB8CiAqIHwgwqQgfCBSZXBsYWNlZCBieSBhIGN1cnJlbmN5IHN5bWJvbCwgc3VjaCBhcyAkIG9yIFVTRC4gfAogKiB8ICUgfCBNYXJrcyBhIHBlcmNlbnQgZm9ybWF0LiBUaGUgJSBzeW1ib2wgbWF5IGNoYW5nZSBwb3NpdGlvbiwgYnV0IG11c3QgYmUgcmV0YWluZWQuIHwKICogfCBFIHwgTWFya3MgYSBzY2llbnRpZmljIGZvcm1hdC4gVGhlIEUgc3ltYm9sIG1heSBjaGFuZ2UgcG9zaXRpb24sIGJ1dCBtdXN0IGJlIHJldGFpbmVkLiB8CiAqIHwgJyB8IFNwZWNpYWwgY2hhcmFjdGVycyB1c2VkIGFzIGxpdGVyYWwgY2hhcmFjdGVycyBhcmUgcXVvdGVkIHdpdGggQVNDSUkgc2luZ2xlIHF1b3Rlcy4gfAogKgogKiBAc2VlIGBOdW1iZXJGb3JtYXRTdHlsZWAgLyBbQ0xEUiB3ZWJzaXRlXShodHRwOi8vY2xkci51bmljb2RlLm9yZy90cmFuc2xhdGlvbi9udW1iZXItcGF0dGVybnMpIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/fSB0eXBlIFRoZSB0eXBlIG9mIG51bWVyaWMgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIChzdWNoIGFzIGBEZWNpbWFsYCBvciBgQ3VycmVuY3lgLikKICogQHJldHVybiB7P30gVGhlIGxvY2FsaXplZCBmb3JtYXQgc3RyaW5nLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgdHlwZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguTnVtYmVyRm9ybWF0c11bdHlwZV07Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgY3VycmVuY3kgdmFsdWVzIGZvciBhIGdpdmVuIGxvY2FsZS4KICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVuY3kgdmFsdWVzLgogKi8KZnVuY3Rpb24gZ2V0TG9jYWxlQ3VycmVuY2llcyhsb2NhbGUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgcmV0dXJuIGRhdGFbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmNpZXNdOwp9Ci8qKgogKiBcQGFsaWFzIGNvcmUvybVnZXRMb2NhbGVQbHVyYWxDYXNlCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgZ2V0TG9jYWxlUGx1cmFsQ2FzZSQxID0gZ2V0TG9jYWxlUGx1cmFsQ2FzZTsKLyoqCiAqIEBwYXJhbSB7P30gZGF0YQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY2hlY2tGdWxsRGF0YShkYXRhKSB7CiAgICBpZiAoIWRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV0pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXh0cmEgbG9jYWxlIGRhdGEgZm9yIHRoZSBsb2NhbGUgIiR7ZGF0YVtMb2NhbGVEYXRhSW5kZXgKICAgICAgICAgICAgLkxvY2FsZUlkXX0iLiBVc2UgInJlZ2lzdGVyTG9jYWxlRGF0YSIgdG8gbG9hZCBuZXcgZGF0YS4gU2VlIHRoZSAiSTE4biBndWlkZSIgb24gYW5ndWxhci5pbyB0byBrbm93IG1vcmUuYCk7CiAgICB9Cn0KLyoqCiAqIFJldHJpZXZlcyBsb2NhbGUtc3BlY2lmaWMgcnVsZXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZGF5IHBlcmlvZCB0byB1c2UKICogd2hlbiBtb3JlIHRoYW4gb25lIHBlcmlvZCBpcyBkZWZpbmVkIGZvciBhIGxvY2FsZS4KICoKICogVGhlcmUgaXMgYSBydWxlIGZvciBlYWNoIGRlZmluZWQgZGF5IHBlcmlvZC4gVGhlCiAqIGZpcnN0IHJ1bGUgaXMgYXBwbGllZCB0byB0aGUgZmlyc3QgZGF5IHBlcmlvZCBhbmQgc28gb24uCiAqIEZhbGwgYmFjayB0byBBTS9QTSB3aGVuIG5vIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqCiAqIEEgcnVsZSBjYW4gc3BlY2lmeSBhIHBlcmlvZCBhcyB0aW1lIHJhbmdlLCBvciBhcyBhIHNpbmdsZSB0aW1lIHZhbHVlLgogKgogKiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBhdmFpbGFibGUgd2hlbiB5b3UgaGF2ZSBsb2FkZWQgdGhlIGZ1bGwgbG9jYWxlIGRhdGEuCiAqIFNlZSB0aGUgWyJJMThuIGd1aWRlIl0oZ3VpZGUvaTE4biNpMThuLXBpcGVzKS4KICoKICogQHNlZSBgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKClgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHJldHVybiB7P30gVGhlIHJ1bGVzIGZvciB0aGUgbG9jYWxlLCBhIHNpbmdsZSB0aW1lIHZhbHVlIG9yIGFycmF5IG9mICpmcm9tLXRpbWUsIHRvLXRpbWUqLAogKiBvciBudWxsIGlmIG5vIHBlcmlvZHMgYXJlIGF2YWlsYWJsZS4KICoKICovCmZ1bmN0aW9uIGdldExvY2FsZUV4dHJhRGF5UGVyaW9kUnVsZXMobG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIGNoZWNrRnVsbERhdGEoZGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBydWxlcyA9IGRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV1bMiAvKiBFeHRyYURheVBlcmlvZHNSdWxlcyAqL10gfHwgW107CiAgICByZXR1cm4gcnVsZXMubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30gcnVsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHJ1bGUpID0+IHsKICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0VGltZShydWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtleHRyYWN0VGltZShydWxlWzBdKSwgZXh0cmFjdFRpbWUocnVsZVsxXSldOwogICAgfSkpOwp9Ci8qKgogKiBSZXRyaWV2ZXMgbG9jYWxlLXNwZWNpZmljIGRheSBwZXJpb2RzLCB3aGljaCBpbmRpY2F0ZSByb3VnaGx5IGhvdyBhIGRheSBpcyBicm9rZW4gdXAKICogaW4gZGlmZmVyZW50IGxhbmd1YWdlcy4KICogRm9yIGV4YW1wbGUsIGZvciBgZW4tVVNgLCBwZXJpb2RzIGFyZSBtb3JuaW5nLCBub29uLCBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtaWRuaWdodC4KICoKICogVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4geW91IGhhdmUgbG9hZGVkIHRoZSBmdWxsIGxvY2FsZSBkYXRhLgogKiBTZWUgdGhlIFsiSTE4biBndWlkZSJdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykuCiAqCiAqIEBzZWUgYGdldExvY2FsZUV4dHJhRGF5UGVyaW9kUnVsZXMoKWAgLyBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez99IGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS4KICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLgogKiBAcmV0dXJuIHs/fSBUaGUgdHJhbnNsYXRlZCBkYXktcGVyaW9kIHN0cmluZ3MuCiAqLwpmdW5jdGlvbiBnZXRMb2NhbGVFeHRyYURheVBlcmlvZHMobG9jYWxlLCBmb3JtU3R5bGUsIHdpZHRoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgIGNoZWNrRnVsbERhdGEoZGF0YSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXlQZXJpb2RzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChbCiAgICAgICAgZGF0YVtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXVswIC8qIEV4dHJhRGF5UGVyaW9kRm9ybWF0cyAqL10sCiAgICAgICAgZGF0YVtMb2NhbGVEYXRhSW5kZXguRXh0cmFEYXRhXVsxIC8qIEV4dHJhRGF5UGVyaW9kU3RhbmRhbG9uZSAqL10KICAgIF0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRheVBlcmlvZHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKGRheVBlcmlvZHNEYXRhLCBmb3JtU3R5bGUpIHx8IFtdOwogICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF5UGVyaW9kcywgd2lkdGgpIHx8IFtdOwp9Ci8qKgogKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgZGVmaW5lZCBpbiBhbiBhcnJheSwgZ29pbmcgYmFja3dhcmRzIGZyb20gYW4gaW5kZXggcG9zaXRpb24uCiAqCiAqIFRvIGF2b2lkIHJlcGVhdGluZyB0aGUgc2FtZSBkYXRhIChhcyB3aGVuIHRoZSAiZm9ybWF0IiBhbmQgInN0YW5kYWxvbmUiIGZvcm1zIGFyZSB0aGUgc2FtZSkKICogYWRkIHRoZSBmaXJzdCB2YWx1ZSB0byB0aGUgbG9jYWxlIGRhdGEgYXJyYXlzLCBhbmQgYWRkIG90aGVyIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICogQHBhcmFtIHs/fSBkYXRhIFRoZSBkYXRhIGFycmF5IHRvIHJldHJpZXZlIGZyb20uCiAqIEBwYXJhbSB7P30gaW5kZXggQSAwLWJhc2VkIGluZGV4IGludG8gdGhlIGFycmF5IHRvIHN0YXJ0IGZyb20uCiAqIEByZXR1cm4gez99IFRoZSB2YWx1ZSBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGdpdmVuIGluZGV4IHBvc2l0aW9uLgogKi8KZnVuY3Rpb24gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXRhLCBpbmRleCkgewogICAgZm9yIChsZXQgaSA9IGluZGV4OyBpID4gLTE7IGktLSkgewogICAgICAgIGlmICh0eXBlb2YgZGF0YVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGFbaV07CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgZGF0YSBBUEk6IGxvY2FsZSBkYXRhIHVuZGVmaW5lZCcpOwp9Ci8qKgogKiBFeHRyYWN0cyB0aGUgaG91cnMgYW5kIG1pbnV0ZXMgZnJvbSBhIHN0cmluZyBsaWtlICIxNTo0NSIKICogQHBhcmFtIHs/fSB0aW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBleHRyYWN0VGltZSh0aW1lKSB7CiAgICBjb25zdCBbaCwgbV0gPSB0aW1lLnNwbGl0KCc6Jyk7CiAgICByZXR1cm4geyBob3VyczogK2gsIG1pbnV0ZXM6ICttIH07Cn0KLyoqCiAqIFJldHJpZXZlcyB0aGUgY3VycmVuY3kgc3ltYm9sIGZvciBhIGdpdmVuIGN1cnJlbmN5IGNvZGUuCiAqCiAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGRlZmF1bHQgYGVuLVVTYCBsb2NhbGUsIHRoZSBjb2RlIGBVU0RgIGNhbgogKiBiZSByZXByZXNlbnRlZCBieSB0aGUgbmFycm93IHN5bWJvbCBgJGAgb3IgdGhlIHdpZGUgc3ltYm9sIGBVUyRgLgogKgogKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IGNvZGUgVGhlIGN1cnJlbmN5IGNvZGUuCiAqIEBwYXJhbSB7P30gZm9ybWF0IFRoZSBmb3JtYXQsIGB3aWRlYCBvciBgbmFycm93YC4KICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICoKICogQHJldHVybiB7P30gVGhlIHN5bWJvbCwgb3IgdGhlIGN1cnJlbmN5IGNvZGUgaWYgbm8gc3ltYm9sIGlzIGF2YWlsYWJsZS4KICovCmZ1bmN0aW9uIGdldEN1cnJlbmN5U3ltYm9sKGNvZGUsIGZvcm1hdCwgbG9jYWxlID0gJ2VuJykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY3VycmVuY3kgPSBnZXRMb2NhbGVDdXJyZW5jaWVzKGxvY2FsZSlbY29kZV0gfHwgQ1VSUkVOQ0lFU19FTltjb2RlXSB8fCBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHN5bWJvbE5hcnJvdyA9IGN1cnJlbmN5WzEgLyogU3ltYm9sTmFycm93ICovXTsKICAgIGlmIChmb3JtYXQgPT09ICduYXJyb3cnICYmIHR5cGVvZiBzeW1ib2xOYXJyb3cgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIHN5bWJvbE5hcnJvdzsKICAgIH0KICAgIHJldHVybiBjdXJyZW5jeVswIC8qIFN5bWJvbCAqL10gfHwgY29kZTsKfQovLyBNb3N0IGN1cnJlbmNpZXMgaGF2ZSBjZW50cywgdGhhdCdzIHdoeSB0aGUgZGVmYXVsdCBpcyAyCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVGQVVMVF9OQl9PRl9DVVJSRU5DWV9ESUdJVFMgPSAyOwovKioKICogUmVwb3J0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIGZvciBhIGdpdmVuIGN1cnJlbmN5LgogKiBUaGUgdmFsdWUgZGVwZW5kcyB1cG9uIHRoZSBwcmVzZW5jZSBvZiBjZW50cyBpbiB0aGF0IHBhcnRpY3VsYXIgY3VycmVuY3kuCiAqCiAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqCiAqIFxAcHVibGljQXBpCiAqIEBwYXJhbSB7P30gY29kZSBUaGUgY3VycmVuY3kgY29kZS4KICogQHJldHVybiB7P30gVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgdHlwaWNhbGx5IDAgb3IgMi4KICovCmZ1bmN0aW9uIGdldE51bWJlck9mQ3VycmVuY3lEaWdpdHMoY29kZSkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGN1cnJlbmN5ID0gQ1VSUkVOQ0lFU19FTltjb2RlXTsKICAgIGlmIChjdXJyZW5jeSkgewogICAgICAgIGRpZ2l0cyA9IGN1cnJlbmN5WzIgLyogTmJPZkRpZ2l0cyAqL107CiAgICB9CiAgICByZXR1cm4gdHlwZW9mIGRpZ2l0cyA9PT0gJ251bWJlcicgPyBkaWdpdHMgOiBERUZBVUxUX05CX09GX0NVUlJFTkNZX0RJR0lUUzsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2Zvcm1hdF9kYXRlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgSVNPODYwMV9EQVRFX1JFR0VYID0gL14oXGR7NH0pLT8oXGRcZCktPyhcZFxkKSg/OlQoXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86XC4oXGQrKSk/KT8pPyhafChbKy1dKShcZFxkKTo/KFxkXGQpKT8pPyQvOwovLyAgICAxICAgICAgICAyICAgICAgIDMgICAgICAgICA0ICAgICAgICAgIDUgICAgICAgICAgNiAgICAgICAgICA3ICAgICAgICAgIDggIDkgICAgIDEwICAgICAgMTEKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOQU1FRF9GT1JNQVRTID0ge307Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREFURV9GT1JNQVRTX1NQTElUID0gLygoPzpbXkd5TUx3V2RFYWJCaEhtc1N6Wk8nXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpHezEsNX18eXsxLDR9fE17MSw1fXxMezEsNX18d3sxLDJ9fFd7MX18ZHsxLDJ9fEV7MSw2fXxhezEsNX18YnsxLDV9fEJ7MSw1fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18U3sxLDN9fHp7MSw0fXxaezEsNX18T3sxLDR9KSkoW1xzXFNdKikvOwovKiogQGVudW0ge251bWJlcn0gKi8KY29uc3QgWm9uZVdpZHRoID0gewogICAgU2hvcnQ6IDAsCiAgICBTaG9ydEdNVDogMSwKICAgIExvbmc6IDIsCiAgICBFeHRlbmRlZDogMywKfTsKWm9uZVdpZHRoW1pvbmVXaWR0aC5TaG9ydF0gPSAnU2hvcnQnOwpab25lV2lkdGhbWm9uZVdpZHRoLlNob3J0R01UXSA9ICdTaG9ydEdNVCc7ClpvbmVXaWR0aFtab25lV2lkdGguTG9uZ10gPSAnTG9uZyc7ClpvbmVXaWR0aFtab25lV2lkdGguRXh0ZW5kZWRdID0gJ0V4dGVuZGVkJzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IERhdGVUeXBlID0gewogICAgRnVsbFllYXI6IDAsCiAgICBNb250aDogMSwKICAgIERhdGU6IDIsCiAgICBIb3VyczogMywKICAgIE1pbnV0ZXM6IDQsCiAgICBTZWNvbmRzOiA1LAogICAgRnJhY3Rpb25hbFNlY29uZHM6IDYsCiAgICBEYXk6IDcsCn07CkRhdGVUeXBlW0RhdGVUeXBlLkZ1bGxZZWFyXSA9ICdGdWxsWWVhcic7CkRhdGVUeXBlW0RhdGVUeXBlLk1vbnRoXSA9ICdNb250aCc7CkRhdGVUeXBlW0RhdGVUeXBlLkRhdGVdID0gJ0RhdGUnOwpEYXRlVHlwZVtEYXRlVHlwZS5Ib3Vyc10gPSAnSG91cnMnOwpEYXRlVHlwZVtEYXRlVHlwZS5NaW51dGVzXSA9ICdNaW51dGVzJzsKRGF0ZVR5cGVbRGF0ZVR5cGUuU2Vjb25kc10gPSAnU2Vjb25kcyc7CkRhdGVUeXBlW0RhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzXSA9ICdGcmFjdGlvbmFsU2Vjb25kcyc7CkRhdGVUeXBlW0RhdGVUeXBlLkRheV0gPSAnRGF5JzsKLyoqIEBlbnVtIHtudW1iZXJ9ICovCmNvbnN0IFRyYW5zbGF0aW9uVHlwZSA9IHsKICAgIERheVBlcmlvZHM6IDAsCiAgICBEYXlzOiAxLAogICAgTW9udGhzOiAyLAogICAgRXJhczogMywKfTsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzXSA9ICdEYXlQZXJpb2RzJzsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5EYXlzXSA9ICdEYXlzJzsKVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5Nb250aHNdID0gJ01vbnRocyc7ClRyYW5zbGF0aW9uVHlwZVtUcmFuc2xhdGlvblR5cGUuRXJhc10gPSAnRXJhcyc7Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBkYXRlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAqCiAqIEBzZWUgYERhdGVQaXBlYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSBkYXRlIHRvIGZvcm1hdCwgYXMgYSBEYXRlLCBvciBhIG51bWJlciAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCkKICogb3IgYW4gW0lTTyBkYXRlLXRpbWUgc3RyaW5nXShodHRwczovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSkuCiAqIEBwYXJhbSB7P30gZm9ybWF0IFRoZSBkYXRlLXRpbWUgY29tcG9uZW50cyB0byBpbmNsdWRlLiBTZWUgYERhdGVQaXBlYCBmb3IgZGV0YWlscy4KICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez89fSB0aW1lem9uZSBUaGUgdGltZSB6b25lLiBBIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwKICogb3IgYSBzdGFuZGFyZCBVVEMvR01UIG9yIGNvbnRpbmVudGFsIFVTIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uCiAqIElmIG5vdCBzcGVjaWZpZWQsIHVzZXMgaG9zdCBzeXN0ZW0gc2V0dGluZ3MuCiAqCiAqIEByZXR1cm4gez99IFRoZSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCiAqCiAqLwpmdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlLCBmb3JtYXQsIGxvY2FsZSwgdGltZXpvbmUpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkYXRlID0gdG9EYXRlKHZhbHVlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5hbWVkRm9ybWF0ID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCBmb3JtYXQpOwogICAgZm9ybWF0ID0gbmFtZWRGb3JtYXQgfHwgZm9ybWF0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHBhcnRzID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWF0Y2g7CiAgICB3aGlsZSAoZm9ybWF0KSB7CiAgICAgICAgbWF0Y2ggPSBEQVRFX0ZPUk1BVFNfU1BMSVQuZXhlYyhmb3JtYXQpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBwYXJ0cyA9IHBhcnRzLmNvbmNhdChtYXRjaC5zbGljZSgxKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBpZiAoIXBhcnQpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcm1hdCA9IHBhcnQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwYXJ0cy5wdXNoKGZvcm1hdCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBkYXRlVGltZXpvbmVPZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICBpZiAodGltZXpvbmUpIHsKICAgICAgICBkYXRlVGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpOwogICAgICAgIGRhdGUgPSBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCB0cnVlKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0ZXh0ID0gJyc7CiAgICBwYXJ0cy5mb3JFYWNoKCgvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHZhbHVlID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0ZUZvcm1hdHRlciA9IGdldERhdGVGb3JtYXR0ZXIodmFsdWUpOwogICAgICAgIHRleHQgKz0gZGF0ZUZvcm1hdHRlciA/CiAgICAgICAgICAgIGRhdGVGb3JtYXR0ZXIoZGF0ZSwgbG9jYWxlLCBkYXRlVGltZXpvbmVPZmZzZXQpIDoKICAgICAgICAgICAgdmFsdWUgPT09ICdcJ1wnJyA/ICdcJycgOiB2YWx1ZS5yZXBsYWNlKC8oXid8JyQpL2csICcnKS5yZXBsYWNlKC8nJy9nLCAnXCcnKTsKICAgIH0pKTsKICAgIHJldHVybiB0ZXh0Owp9Ci8qKgogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IGZvcm1hdAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCBmb3JtYXQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGxvY2FsZUlkID0gZ2V0TG9jYWxlSWQkMShsb2NhbGUpOwogICAgTkFNRURfRk9STUFUU1tsb2NhbGVJZF0gPSBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXSB8fCB7fTsKICAgIGlmIChOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdKSB7CiAgICAgICAgcmV0dXJuIE5BTUVEX0ZPUk1BVFNbbG9jYWxlSWRdW2Zvcm1hdF07CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm9ybWF0VmFsdWUgPSAnJzsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgY2FzZSAnc2hvcnREYXRlJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtZWRpdW1EYXRlJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbG9uZ0RhdGUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZnVsbERhdGUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZURhdGVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnc2hvcnRUaW1lJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtZWRpdW1UaW1lJzoKICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTWVkaXVtKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbG9uZ1RpbWUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZnVsbFRpbWUnOgogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGdldExvY2FsZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5GdWxsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnc2hvcnQnOgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNob3J0VGltZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ3Nob3J0VGltZScpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNob3J0RGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ3Nob3J0RGF0ZScpOwogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9IGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguU2hvcnQpLCBbc2hvcnRUaW1lLCBzaG9ydERhdGVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbWVkaXVtJzoKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZWRpdW1UaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnbWVkaXVtVGltZScpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lZGl1bURhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdtZWRpdW1EYXRlJyk7CiAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5NZWRpdW0pLCBbbWVkaXVtVGltZSwgbWVkaXVtRGF0ZV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdsb25nJzoKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsb25nVGltZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2xvbmdUaW1lJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9uZ0RhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdsb25nRGF0ZScpOwogICAgICAgICAgICBmb3JtYXRWYWx1ZSA9CiAgICAgICAgICAgICAgICBmb3JtYXREYXRlVGltZShnZXRMb2NhbGVEYXRlVGltZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLkxvbmcpLCBbbG9uZ1RpbWUsIGxvbmdEYXRlXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2Z1bGwnOgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZ1bGxUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnZnVsbFRpbWUnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmdWxsRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ2Z1bGxEYXRlJyk7CiAgICAgICAgICAgIGZvcm1hdFZhbHVlID0KICAgICAgICAgICAgICAgIGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguRnVsbCksIFtmdWxsVGltZSwgZnVsbERhdGVdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoZm9ybWF0VmFsdWUpIHsKICAgICAgICBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdID0gZm9ybWF0VmFsdWU7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0VmFsdWU7Cn0KLyoqCiAqIEBwYXJhbSB7P30gc3RyCiAqIEBwYXJhbSB7P30gb3B0X3ZhbHVlcwogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWUoc3RyLCBvcHRfdmFsdWVzKSB7CiAgICBpZiAob3B0X3ZhbHVlcykgewogICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ceyhbXn1dKyl9L2csICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChtYXRjaCwga2V5KSB7CiAgICAgICAgICAgIHJldHVybiAob3B0X3ZhbHVlcyAhPSBudWxsICYmIGtleSBpbiBvcHRfdmFsdWVzKSA/IG9wdF92YWx1ZXNba2V5XSA6IG1hdGNoOwogICAgICAgIH0pKTsKICAgIH0KICAgIHJldHVybiBzdHI7Cn0KLyoqCiAqIEBwYXJhbSB7P30gbnVtCiAqIEBwYXJhbSB7P30gZGlnaXRzCiAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogKiBAcGFyYW0gez89fSB0cmltCiAqIEBwYXJhbSB7Pz19IG5lZ1dyYXAKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhZE51bWJlcihudW0sIGRpZ2l0cywgbWludXNTaWduID0gJy0nLCB0cmltLCBuZWdXcmFwKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmVnID0gJyc7CiAgICBpZiAobnVtIDwgMCB8fCAobmVnV3JhcCAmJiBudW0gPD0gMCkpIHsKICAgICAgICBpZiAobmVnV3JhcCkgewogICAgICAgICAgICBudW0gPSAtbnVtICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG51bSA9IC1udW07CiAgICAgICAgICAgIG5lZyA9IG1pbnVzU2lnbjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc3RyTnVtID0gU3RyaW5nKG51bSk7CiAgICB3aGlsZSAoc3RyTnVtLmxlbmd0aCA8IGRpZ2l0cykgewogICAgICAgIHN0ck51bSA9ICcwJyArIHN0ck51bTsKICAgIH0KICAgIGlmICh0cmltKSB7CiAgICAgICAgc3RyTnVtID0gc3RyTnVtLnN1YnN0cihzdHJOdW0ubGVuZ3RoIC0gZGlnaXRzKTsKICAgIH0KICAgIHJldHVybiBuZWcgKyBzdHJOdW07Cn0KLyoqCiAqIEBwYXJhbSB7P30gbWlsbGlzZWNvbmRzCiAqIEBwYXJhbSB7P30gZGlnaXRzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBmb3JtYXRGcmFjdGlvbmFsU2Vjb25kcyhtaWxsaXNlY29uZHMsIGRpZ2l0cykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc3RyTXMgPSBwYWROdW1iZXIobWlsbGlzZWNvbmRzLCAzKTsKICAgIHJldHVybiBzdHJNcy5zdWJzdHIoMCwgZGlnaXRzKTsKfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIGRpZ2l0IHJlcHJlc2VudGF0aW9uCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IHNpemUKICogQHBhcmFtIHs/PX0gb2Zmc2V0CiAqIEBwYXJhbSB7Pz19IHRyaW0KICogQHBhcmFtIHs/PX0gbmVnV3JhcAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZGF0ZUdldHRlcihuYW1lLCBzaXplLCBvZmZzZXQgPSAwLCB0cmltID0gZmFsc2UsIG5lZ1dyYXAgPSBmYWxzZSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcnQgPSBnZXREYXRlUGFydChuYW1lLCBkYXRlKTsKICAgICAgICBpZiAob2Zmc2V0ID4gMCB8fCBwYXJ0ID4gLW9mZnNldCkgewogICAgICAgICAgICBwYXJ0ICs9IG9mZnNldDsKICAgICAgICB9CiAgICAgICAgaWYgKG5hbWUgPT09IERhdGVUeXBlLkhvdXJzKSB7CiAgICAgICAgICAgIGlmIChwYXJ0ID09PSAwICYmIG9mZnNldCA9PT0gLTEyKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gMTI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzKHBhcnQsIHNpemUpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxlTWludXMgPSBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKTsKICAgICAgICByZXR1cm4gcGFkTnVtYmVyKHBhcnQsIHNpemUsIGxvY2FsZU1pbnVzLCB0cmltLCBuZWdXcmFwKTsKICAgIH0pOwp9Ci8qKgogKiBAcGFyYW0gez99IHBhcnQKICogQHBhcmFtIHs/fSBkYXRlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREYXRlUGFydChwYXJ0LCBkYXRlKSB7CiAgICBzd2l0Y2ggKHBhcnQpIHsKICAgICAgICBjYXNlIERhdGVUeXBlLkZ1bGxZZWFyOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICAgIGNhc2UgRGF0ZVR5cGUuTW9udGg6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7CiAgICAgICAgY2FzZSBEYXRlVHlwZS5EYXRlOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCk7CiAgICAgICAgY2FzZSBEYXRlVHlwZS5Ib3VyczoKICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLk1pbnV0ZXM6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLlNlY29uZHM6CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldFNlY29uZHMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzOgogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTsKICAgICAgICBjYXNlIERhdGVUeXBlLkRheToKICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIERhdGVUeXBlIHZhbHVlICIke3BhcnR9Ii5gKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIHN0cmluZyByZXByZXNlbnRhdGlvbgogKiBAcGFyYW0gez99IG5hbWUKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcGFyYW0gez89fSBmb3JtCiAqIEBwYXJhbSB7Pz19IGV4dGVuZGVkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkYXRlU3RyR2V0dGVyKG5hbWUsIHdpZHRoLCBmb3JtID0gRm9ybVN0eWxlLkZvcm1hdCwgZXh0ZW5kZWQgPSBmYWxzZSkgewogICAgcmV0dXJuICgvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChkYXRlLCBsb2NhbGUpIHsKICAgICAgICByZXR1cm4gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKTsKICAgIH0pOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBsb2NhbGUgdHJhbnNsYXRpb24gb2YgYSBkYXRlIGZvciBhIGdpdmVuIGZvcm0sIHR5cGUgYW5kIHdpZHRoCiAqIEBwYXJhbSB7P30gZGF0ZQogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IG5hbWUKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcGFyYW0gez99IGZvcm0KICogQHBhcmFtIHs/fSBleHRlbmRlZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKSB7CiAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICBjYXNlIFRyYW5zbGF0aW9uVHlwZS5Nb250aHM6CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVNb250aE5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0TW9udGgoKV07CiAgICAgICAgY2FzZSBUcmFuc2xhdGlvblR5cGUuRGF5czoKICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsZURheU5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0RGF5KCldOwogICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHM6CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudEhvdXJzID0gZGF0ZS5nZXRIb3VycygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICAgICAgICAgIGlmIChleHRlbmRlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcnVsZXMgPSBnZXRMb2NhbGVFeHRyYURheVBlcmlvZFJ1bGVzKGxvY2FsZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkYXlQZXJpb2RzID0gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybSwgd2lkdGgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydWxlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVsZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JuaW5nLCBhZnRlcm5vb24sIGV2ZW5pbmcsIG5pZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnM6IGhvdXJzRnJvbSwgbWludXRlczogbWludXRlc0Zyb20gfSA9IHJ1bGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnM6IGhvdXJzVG8sIG1pbnV0ZXM6IG1pbnV0ZXNUbyB9ID0gcnVsZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRIb3VycyA+PSBob3Vyc0Zyb20gJiYgY3VycmVudE1pbnV0ZXMgPj0gbWludXRlc0Zyb20gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50SG91cnMgPCBob3Vyc1RvIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRIb3VycyA9PT0gaG91cnNUbyAmJiBjdXJyZW50TWludXRlcyA8IG1pbnV0ZXNUbykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXlQZXJpb2RzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gbm9vbiBvciBtaWRuaWdodAogICAgICAgICAgICAgICAgICAgICAgICAvLyBub29uIG9yIG1pZG5pZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMgfSA9IHJ1bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob3VycyA9PT0gY3VycmVudEhvdXJzICYmIG1pbnV0ZXMgPT09IGN1cnJlbnRNaW51dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkYXlQZXJpb2RzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIG5vIHJ1bGVzIGZvciB0aGUgZGF5IHBlcmlvZHMsIHdlIHVzZSBhbS9wbSBieSBkZWZhdWx0CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybSwgKC8qKiBAdHlwZSB7P30gKi8gKHdpZHRoKSkpW2N1cnJlbnRIb3VycyA8IDEyID8gMCA6IDFdOwogICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkVyYXM6CiAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVFcmFOYW1lcyhsb2NhbGUsICgvKiogQHR5cGUgez99ICovICh3aWR0aCkpKVtkYXRlLmdldEZ1bGxZZWFyKCkgPD0gMCA/IDAgOiAxXTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvLyBUaGlzIGRlZmF1bHQgY2FzZSBpcyBub3QgbmVlZGVkIGJ5IFR5cGVTY3JpcHQgY29tcGlsZXIsIGFzIHRoZSBzd2l0Y2ggaXMgZXhoYXVzdGl2ZS4KICAgICAgICAgICAgLy8gSG93ZXZlciBDbG9zdXJlIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgdGhhdCBhbmQgcmVwb3J0cyBhbiBlcnJvciBpbiB0eXBlZCBtb2RlLgogICAgICAgICAgICAvLyBUaGUgYHRocm93IG5ldyBFcnJvcmAgYmVsb3cgd29ya3MgYXJvdW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlIHVuZXhwZWN0ZWQ6IG5ldmVyIHZhcmlhYmxlCiAgICAgICAgICAgIC8vIG1ha2VzIHN1cmUgdHNjIHN0aWxsIGNoZWNrcyB0aGlzIGNvZGUgaXMgdW5yZWFjaGFibGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdW5leHBlY3RlZCA9IG5hbWU7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCB0cmFuc2xhdGlvbiB0eXBlICR7dW5leHBlY3RlZH1gKTsKICAgIH0KfQovKioKICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgYW5kIGFuIG9mZnNldCBpbnRvIGEgdGltZXpvbmUgd2l0aCBJU084NjAxIG9yCiAqIEdNVCBmb3JtYXQgZGVwZW5kaW5nIG9uIHRoZSB3aWR0aCAoZWc6IHNob3J0ID0gKzA0MzAsIHNob3J0OkdNVCA9IEdNVCs0LCBsb25nID0gR01UKzA0OjMwLAogKiBleHRlbmRlZCA9ICswNDozMCkKICogQHBhcmFtIHs/fSB3aWR0aAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGltZVpvbmVHZXR0ZXIod2lkdGgpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKiBAcGFyYW0gez99IG9mZnNldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSwgb2Zmc2V0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHpvbmUgPSAtMSAqIG9mZnNldDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWludXNTaWduID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvdXJzID0gem9uZSA+IDAgPyBNYXRoLmZsb29yKHpvbmUgLyA2MCkgOiBNYXRoLmNlaWwoem9uZSAvIDYwKTsKICAgICAgICBzd2l0Y2ggKHdpZHRoKSB7CiAgICAgICAgICAgIGNhc2UgWm9uZVdpZHRoLlNob3J0OgogICAgICAgICAgICAgICAgcmV0dXJuICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArCiAgICAgICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIsIG1pbnVzU2lnbik7CiAgICAgICAgICAgIGNhc2UgWm9uZVdpZHRoLlNob3J0R01UOgogICAgICAgICAgICAgICAgcmV0dXJuICdHTVQnICsgKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAxLCBtaW51c1NpZ24pOwogICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5Mb25nOgogICAgICAgICAgICAgICAgcmV0dXJuICdHTVQnICsgKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAyLCBtaW51c1NpZ24pICsgJzonICsKICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTsKICAgICAgICAgICAgY2FzZSBab25lV2lkdGguRXh0ZW5kZWQ6CiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdaJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoKHpvbmUgPj0gMCkgPyAnKycgOiAnJykgKyBwYWROdW1iZXIoaG91cnMsIDIsIG1pbnVzU2lnbikgKyAnOicgKwogICAgICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB6b25lIHdpZHRoICIke3dpZHRofSJgKTsKICAgICAgICB9CiAgICB9KTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IEpBTlVBUlkgPSAwOwovKiogQHR5cGUgez99ICovCmNvbnN0IFRIVVJTREFZID0gNDsKLyoqCiAqIEBwYXJhbSB7P30geWVhcgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmaXJzdERheU9mWWVhciA9IChuZXcgRGF0ZSh5ZWFyLCBKQU5VQVJZLCAxKSkuZ2V0RGF5KCk7CiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgMSArICgoZmlyc3REYXlPZlllYXIgPD0gVEhVUlNEQVkpID8gVEhVUlNEQVkgOiBUSFVSU0RBWSArIDcpIC0gZmlyc3REYXlPZlllYXIpOwp9Ci8qKgogKiBAcGFyYW0gez99IGRhdGV0aW1lCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGV0aW1lKSB7CiAgICByZXR1cm4gbmV3IERhdGUoZGF0ZXRpbWUuZ2V0RnVsbFllYXIoKSwgZGF0ZXRpbWUuZ2V0TW9udGgoKSwgZGF0ZXRpbWUuZ2V0RGF0ZSgpICsgKFRIVVJTREFZIC0gZGF0ZXRpbWUuZ2V0RGF5KCkpKTsKfQovKioKICogQHBhcmFtIHs/fSBzaXplCiAqIEBwYXJhbSB7Pz19IG1vbnRoQmFzZWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHdlZWtHZXR0ZXIoc2l6ZSwgbW9udGhCYXNlZCA9IGZhbHNlKSB7CiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKGRhdGUsIGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIGlmIChtb250aEJhc2VkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmJEYXlzQmVmb3JlMXN0RGF5T2ZNb250aCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKS5nZXREYXkoKSAtIDE7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBkYXRlLmdldERhdGUoKTsKICAgICAgICAgICAgcmVzdWx0ID0gMSArIE1hdGguZmxvb3IoKHRvZGF5ICsgbmJEYXlzQmVmb3JlMXN0RGF5T2ZNb250aCkgLyA3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3RUaHVycyA9IGdldEZpcnN0VGh1cnNkYXlPZlllYXIoZGF0ZS5nZXRGdWxsWWVhcigpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aGlzVGh1cnMgPSBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzVGh1cnMuZ2V0VGltZSgpIC0gZmlyc3RUaHVycy5nZXRUaW1lKCk7CiAgICAgICAgICAgIHJlc3VsdCA9IDEgKyBNYXRoLnJvdW5kKGRpZmYgLyA2LjA0OGU4KTsgLy8gNi4wNDhlOCBtcyBwZXIgd2VlawogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFkTnVtYmVyKHJlc3VsdCwgc2l6ZSwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgfSk7Cn0KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBEQVRFX0ZPUk1BVFMgPSB7fTsKLy8gQmFzZWQgb24gQ0xEUiBmb3JtYXRzOgovLyBTZWUgY29tcGxldGUgbGlzdDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlCi8vIFNlZSBhbHNvIGV4cGxhbmF0aW9uczogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lCi8vIFRPRE8ob2NvbWJlKTogc3VwcG9ydCBhbGwgbWlzc2luZyBjbGRyIGZvcm1hdHM6IFksIFUsIFEsIEQsIEYsIGUsIGMsIGosIEosIEMsIEEsIHYsIFYsIFgsIHgKLyoqCiAqIEBwYXJhbSB7P30gZm9ybWF0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXREYXRlRm9ybWF0dGVyKGZvcm1hdCkgewogICAgaWYgKERBVEVfRk9STUFUU1tmb3JtYXRdKSB7CiAgICAgICAgcmV0dXJuIERBVEVfRk9STUFUU1tmb3JtYXRdOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZvcm1hdHRlcjsKICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgICAgLy8gRXJhIG5hbWUgKEFEL0JDKQogICAgICAgIGNhc2UgJ0cnOgogICAgICAgIGNhc2UgJ0dHJzoKICAgICAgICBjYXNlICdHR0cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5FcmFzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnR0dHRyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkVyYXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0dHR0dHJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRXJhcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyAxIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB5ZWFyLCBlLmcuIChBRCAxID0+IDEsIEFEIDE5OSA9PiAxOTkpCiAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDEsIDAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gMiBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApCiAgICAgICAgY2FzZSAneXknOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAyLCAwLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gMyBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMDAtOTk5KS4gKGUuZy4gQUQgMjAwMSA9PiAwMSwgQUQgMjAxMCA9PiAxMCkKICAgICAgICBjYXNlICd5eXknOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAzLCAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIDQgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIgKGUuZy4gQUQgMSA9PiAwMDAxLCBBRCAyMDEwID0+IDIwMTApCiAgICAgICAgY2FzZSAneXl5eSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDQsIDAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKDEtMTIpLCBudW1lcmljCiAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTW9udGgsIDEsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdNTSc6CiAgICAgICAgY2FzZSAnTEwnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLk1vbnRoLCAyLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgZm9ybWF0CiAgICAgICAgY2FzZSAnTU1NJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTU1NTSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTU1NTU0nOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgc3RhbmRhbG9uZQogICAgICAgIGNhc2UgJ0xMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQsIEZvcm1TdHlsZS5TdGFuZGFsb25lKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnTExMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSwgRm9ybVN0eWxlLlN0YW5kYWxvbmUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdMTExMTCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFdlZWsgb2YgdGhlIHllYXIgKDEsIC4uLiA1MikKICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gd2Vla0dldHRlcigxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnd3cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB3ZWVrR2V0dGVyKDIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBXZWVrIG9mIHRoZSBtb250aCAoMSwgLi4uKQogICAgICAgIGNhc2UgJ1cnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB3ZWVrR2V0dGVyKDEsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBEYXkgb2YgdGhlIG1vbnRoICgxLTMxKQogICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkRhdGUsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdkZCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRGF0ZSwgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIERheSBvZiB0aGUgV2VlawogICAgICAgIGNhc2UgJ0UnOgogICAgICAgIGNhc2UgJ0VFJzoKICAgICAgICBjYXNlICdFRUUnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnRUVFRSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0VFRUVFJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5cywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdFRUVFRUUnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLlNob3J0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gR2VuZXJpYyBwZXJpb2Qgb2YgdGhlIGRheSAoYW0tcG0pCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgY2FzZSAnYWEnOgogICAgICAgIGNhc2UgJ2FhYSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdhYWFhJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYWFhYWEnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIEV4dGVuZGVkIHBlcmlvZCBvZiB0aGUgZGF5IChtaWRuaWdodCwgYXQgbmlnaHQsIC4uLiksIHN0YW5kYWxvbmUKICAgICAgICBjYXNlICdiJzoKICAgICAgICBjYXNlICdiYic6CiAgICAgICAgY2FzZSAnYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZCwgRm9ybVN0eWxlLlN0YW5kYWxvbmUsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSwgdHJ1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2JiYmJiJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3csIEZvcm1TdHlsZS5TdGFuZGFsb25lLCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gRXh0ZW5kZWQgcGVyaW9kIG9mIHRoZSBkYXkgKG1pZG5pZ2h0LCBuaWdodCwgLi4uKSwgc3RhbmRhbG9uZQogICAgICAgIGNhc2UgJ0InOgogICAgICAgIGNhc2UgJ0JCJzoKICAgICAgICBjYXNlICdCQkInOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnQkJCQic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLldpZGUsIEZvcm1TdHlsZS5Gb3JtYXQsIHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdCQkJCQic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBpbiBBTS9QTSwgKDEtMTIpCiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuSG91cnMsIDEsIC0xMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2hoJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMiwgLTEyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBvZiB0aGUgZGF5ICgwLTIzKQogICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gSG91ciBpbiBkYXksIHBhZGRlZCAoMDAtMjMpCiAgICAgICAgY2FzZSAnSEgnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gTWludXRlIG9mIHRoZSBob3VyICgwLTU5KQogICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLk1pbnV0ZXMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdtbSc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTWludXRlcywgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFNlY29uZCBvZiB0aGUgbWludXRlICgwLTU5KQogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLlNlY29uZHMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdzcyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuU2Vjb25kcywgMik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIEZyYWN0aW9uYWwgc2Vjb25kCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMsIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTUyc6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMsIDIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdTU1MnOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gVGltZXpvbmUgSVNPODYwMSBzaG9ydCBmb3JtYXQgKC0wNDMwKQogICAgICAgIGNhc2UgJ1onOgogICAgICAgIGNhc2UgJ1paJzoKICAgICAgICBjYXNlICdaWlonOgogICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguU2hvcnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAvLyBUaW1lem9uZSBJU084NjAxIGV4dGVuZGVkIGZvcm1hdCAoLTA0OjMwKQogICAgICAgIGNhc2UgJ1paWlpaJzoKICAgICAgICAgICAgZm9ybWF0dGVyID0gdGltZVpvbmVHZXR0ZXIoWm9uZVdpZHRoLkV4dGVuZGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgLy8gVGltZXpvbmUgR01UIHNob3J0IGZvcm1hdCAoR01UKzQpCiAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgY2FzZSAnT08nOgogICAgICAgIGNhc2UgJ09PTyc6CiAgICAgICAgLy8gU2hvdWxkIGJlIGxvY2F0aW9uLCBidXQgZmFsbGJhY2sgdG8gZm9ybWF0IE8gaW5zdGVhZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGRhdGEgeWV0CiAgICAgICAgY2FzZSAneic6CiAgICAgICAgY2FzZSAnenonOgogICAgICAgIGNhc2UgJ3p6eic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5TaG9ydEdNVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIC8vIFRpbWV6b25lIEdNVCBsb25nIGZvcm1hdCAoR01UKzA0MzApCiAgICAgICAgY2FzZSAnT09PTyc6CiAgICAgICAgY2FzZSAnWlpaWic6CiAgICAgICAgLy8gU2hvdWxkIGJlIGxvY2F0aW9uLCBidXQgZmFsbGJhY2sgdG8gZm9ybWF0IE8gaW5zdGVhZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGRhdGEgeWV0CiAgICAgICAgY2FzZSAnenp6eic6CiAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5Mb25nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBEQVRFX0ZPUk1BVFNbZm9ybWF0XSA9IGZvcm1hdHRlcjsKICAgIHJldHVybiBmb3JtYXR0ZXI7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdGltZXpvbmUKICogQHBhcmFtIHs/fSBmYWxsYmFjawogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdGltZXpvbmVUb09mZnNldCh0aW1lem9uZSwgZmFsbGJhY2spIHsKICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seSwgRWRnZSAxMy0xNSsKICAgIC8vIElFL0VkZ2UgZG8gbm90ICJ1bmRlcnN0YW5kIiBjb2xvbiAoYDpgKSBpbiB0aW1lem9uZQogICAgdGltZXpvbmUgPSB0aW1lem9uZS5yZXBsYWNlKC86L2csICcnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0ID0gRGF0ZS5wYXJzZSgnSmFuIDAxLCAxOTcwIDAwOjAwOjAwICcgKyB0aW1lem9uZSkgLyA2MDAwMDsKICAgIHJldHVybiBpc05hTihyZXF1ZXN0ZWRUaW1lem9uZU9mZnNldCkgPyBmYWxsYmFjayA6IHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0Owp9Ci8qKgogKiBAcGFyYW0gez99IGRhdGUKICogQHBhcmFtIHs/fSBtaW51dGVzCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhZGREYXRlTWludXRlcyhkYXRlLCBtaW51dGVzKSB7CiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwogICAgZGF0ZS5zZXRNaW51dGVzKGRhdGUuZ2V0TWludXRlcygpICsgbWludXRlcyk7CiAgICByZXR1cm4gZGF0ZTsKfQovKioKICogQHBhcmFtIHs/fSBkYXRlCiAqIEBwYXJhbSB7P30gdGltZXpvbmUKICogQHBhcmFtIHs/fSByZXZlcnNlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjb252ZXJ0VGltZXpvbmVUb0xvY2FsKGRhdGUsIHRpbWV6b25lLCByZXZlcnNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZXZlcnNlVmFsdWUgPSByZXZlcnNlID8gLTEgOiAxOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpOwogICAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2VWYWx1ZSAqICh0aW1lem9uZU9mZnNldCAtIGRhdGVUaW1lem9uZU9mZnNldCkpOwp9Ci8qKgogKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGRhdGUuCiAqCiAqIFN1cHBvcnRlZCBpbnB1dCBmb3JtYXRzOgogKiAtIGBEYXRlYAogKiAtIG51bWJlcjogdGltZXN0YW1wCiAqIC0gc3RyaW5nOiBudW1lcmljIChlLmcuICIxMjM0IiksIElTTyBhbmQgZGF0ZSBzdHJpbmdzIGluIGEgZm9ybWF0IHN1cHBvcnRlZCBieQogKiAgIFtEYXRlLnBhcnNlKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2UpLgogKiAgIE5vdGU6IElTTyBzdHJpbmdzIHdpdGhvdXQgdGltZSByZXR1cm4gYSBkYXRlIHdpdGhvdXQgdGltZW9mZnNldC4KICoKICogVGhyb3dzIGlmIHVuYWJsZSB0byBjb252ZXJ0IHRvIGEgZGF0ZS4KICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gdG9EYXRlKHZhbHVlKSB7CiAgICBpZiAoaXNEYXRlKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpOwogICAgfQogICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyc2VkTmIgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAvLyBhbnkgc3RyaW5nIHRoYXQgb25seSBjb250YWlucyBudW1iZXJzLCBsaWtlICIxMjM0IiBidXQgbm90IGxpa2UgIjEyMzRoZWxsbyIKICAgICAgICBpZiAoIWlzTmFOKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpIC0gcGFyc2VkTmIpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWROYik7CiAgICAgICAgfQogICAgICAgIGlmICgvXihcZHs0fS1cZHsxLDJ9LVxkezEsMn0pJC8udGVzdCh2YWx1ZSkpIHsKICAgICAgICAgICAgLyogRm9yIElTTyBTdHJpbmdzIHdpdGhvdXQgdGltZSB0aGUgZGF5LCBtb250aCBhbmQgeWVhciBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBJU08gU3RyaW5nCiAgICAgICAgICAgICAgICAgIGJlZm9yZSBEYXRlIGNyZWF0aW9uIHRvIGF2b2lkIHRpbWUgb2Zmc2V0IGFuZCBlcnJvcnMgaW4gdGhlIG5ldyBEYXRlLgogICAgICAgICAgICAgICAgICBJZiB3ZSBvbmx5IHJlcGxhY2UgJy0nIHdpdGggJywnIGluIHRoZSBJU08gU3RyaW5nICgiMjAxNSwwMSwwMSIpLCBhbmQgdHJ5IHRvIGNyZWF0ZSBhIG5ldwogICAgICAgICAgICAgICAgICBkYXRlLCBzb21lIGJyb3dzZXJzIChlLmcuIElFIDkpIHdpbGwgdGhyb3cgYW4gaW52YWxpZCBEYXRlIGVycm9yLgogICAgICAgICAgICAgICAgICBJZiB3ZSBsZWF2ZSB0aGUgJy0nICgiMjAxNS0wMS0wMSIpIGFuZCB0cnkgdG8gY3JlYXRlIGEgbmV3IERhdGUoIjIwMTUtMDEtMDEiKSB0aGUgdGltZW9mZnNldAogICAgICAgICAgICAgICAgICBpcyBhcHBsaWVkLgogICAgICAgICAgICAgICAgICBOb3RlOiBJU08gbW9udGhzIGFyZSAwIGZvciBKYW51YXJ5LCAxIGZvciBGZWJydWFyeSwgLi4uICovCiAgICAgICAgICAgIGNvbnN0IFt5LCBtLCBkXSA9IHZhbHVlLnNwbGl0KCctJykubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWwKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWwpID0+ICt2YWwpKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICBpZiAobWF0Y2ggPSB2YWx1ZS5tYXRjaChJU084NjAxX0RBVEVfUkVHRVgpKSB7CiAgICAgICAgICAgIHJldHVybiBpc29TdHJpbmdUb0RhdGUobWF0Y2gpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICBpZiAoIWlzRGF0ZShkYXRlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgIiR7dmFsdWV9IiBpbnRvIGEgZGF0ZWApOwogICAgfQogICAgcmV0dXJuIGRhdGU7Cn0KLyoqCiAqIENvbnZlcnRzIGEgZGF0ZSBpbiBJU084NjAxIHRvIGEgRGF0ZS4KICogVXNlZCBpbnN0ZWFkIG9mIGBEYXRlLnBhcnNlYCBiZWNhdXNlIG9mIGJyb3dzZXIgZGlzY3JlcGFuY2llcy4KICogQHBhcmFtIHs/fSBtYXRjaAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgdHpIb3VyID0gMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB0ek1pbiA9IDA7CiAgICAvLyBtYXRjaFs4XSBtZWFucyB0aGF0IHRoZSBzdHJpbmcgY29udGFpbnMgIloiIChVVEMpIG9yIGEgdGltZXpvbmUgbGlrZSAiKzAxOjAwIiBvciAiKzAxMDAiCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkYXRlU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0Z1bGxZZWFyIDogZGF0ZS5zZXRGdWxsWWVhcjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHRpbWVTZXR0ZXIgPSBtYXRjaFs4XSA/IGRhdGUuc2V0VVRDSG91cnMgOiBkYXRlLnNldEhvdXJzOwogICAgLy8gaWYgdGhlcmUgaXMgYSB0aW1lem9uZSBkZWZpbmVkIGxpa2UgIiswMTowMCIgb3IgIiswMTAwIgogICAgaWYgKG1hdGNoWzldKSB7CiAgICAgICAgdHpIb3VyID0gTnVtYmVyKG1hdGNoWzldICsgbWF0Y2hbMTBdKTsKICAgICAgICB0ek1pbiA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzExXSk7CiAgICB9CiAgICBkYXRlU2V0dGVyLmNhbGwoZGF0ZSwgTnVtYmVyKG1hdGNoWzFdKSwgTnVtYmVyKG1hdGNoWzJdKSAtIDEsIE51bWJlcihtYXRjaFszXSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaCA9IE51bWJlcihtYXRjaFs0XSB8fCAwKSAtIHR6SG91cjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG0gPSBOdW1iZXIobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHMgPSBOdW1iZXIobWF0Y2hbNl0gfHwgMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtcyA9IE1hdGgucm91bmQocGFyc2VGbG9hdCgnMC4nICsgKG1hdGNoWzddIHx8IDApKSAqIDEwMDApOwogICAgdGltZVNldHRlci5jYWxsKGRhdGUsIGgsIG0sIHMsIG1zKTsKICAgIHJldHVybiBkYXRlOwp9Ci8qKgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvaTE4bi9mb3JtYXRfbnVtYmVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgTlVNQkVSX0ZPUk1BVF9SRUdFWFAgPSAvXihcZCspP1wuKChcZCspKC0oXGQrKSk/KT8kLzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBNQVhfRElHSVRTID0gMjI7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgREVDSU1BTF9TRVAgPSAnLic7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgWkVST19DSEFSID0gJzAnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBBVFRFUk5fU0VQID0gJzsnOwovKiogQHR5cGUgez99ICovCmNvbnN0IEdST1VQX1NFUCA9ICcsJzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBESUdJVF9DSEFSID0gJyMnOwovKiogQHR5cGUgez99ICovCmNvbnN0IENVUlJFTkNZX0NIQVIgPSAnwqQnOwovKiogQHR5cGUgez99ICovCmNvbnN0IFBFUkNFTlRfQ0hBUiA9ICclJzsKLyoqCiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgdG8gYSBsb2NhbGUgc3RyaW5nIGJhc2VkIG9uIGEgc3R5bGUgYW5kIGEgZm9ybWF0LgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEBwYXJhbSB7P30gcGF0dGVybgogKiBAcGFyYW0gez99IGxvY2FsZQogKiBAcGFyYW0gez99IGdyb3VwU3ltYm9sCiAqIEBwYXJhbSB7P30gZGVjaW1hbFN5bWJvbAogKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAqIEBwYXJhbSB7Pz19IGlzUGVyY2VudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgZ3JvdXBTeW1ib2wsIGRlY2ltYWxTeW1ib2wsIGRpZ2l0c0luZm8sIGlzUGVyY2VudCA9IGZhbHNlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZm9ybWF0dGVkVGV4dCA9ICcnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGlzWmVybyA9IGZhbHNlOwogICAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLkluZmluaXR5KTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyc2VkTnVtYmVyID0gcGFyc2VOdW1iZXIodmFsdWUpOwogICAgICAgIGlmIChpc1BlcmNlbnQpIHsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyID0gdG9QZXJjZW50KHBhcnNlZE51bWJlcik7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWluSW50ID0gcGF0dGVybi5taW5JbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtaW5GcmFjdGlvbiA9IHBhdHRlcm4ubWluRnJhYzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1heEZyYWN0aW9uID0gcGF0dGVybi5tYXhGcmFjOwogICAgICAgIGlmIChkaWdpdHNJbmZvKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydHMgPSBkaWdpdHNJbmZvLm1hdGNoKE5VTUJFUl9GT1JNQVRfUkVHRVhQKTsKICAgICAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZGlnaXRzSW5mb30gaXMgbm90IGEgdmFsaWQgZGlnaXQgaW5mb2ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWluSW50UGFydCA9IHBhcnRzWzFdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1pbkZyYWN0aW9uUGFydCA9IHBhcnRzWzNdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heEZyYWN0aW9uUGFydCA9IHBhcnRzWzVdOwogICAgICAgICAgICBpZiAobWluSW50UGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBtaW5JbnQgPSBwYXJzZUludEF1dG9SYWRpeChtaW5JbnRQYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWluRnJhY3Rpb25QYXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1pbkZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWluRnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWF4RnJhY3Rpb25QYXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWF4RnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChtaW5GcmFjdGlvblBhcnQgIT0gbnVsbCAmJiBtaW5GcmFjdGlvbiA+IG1heEZyYWN0aW9uKSB7CiAgICAgICAgICAgICAgICBtYXhGcmFjdGlvbiA9IG1pbkZyYWN0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhY3Rpb24sIG1heEZyYWN0aW9uKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZ2l0cyA9IHBhcnNlZE51bWJlci5kaWdpdHM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbnRlZ2VyTGVuID0gcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4cG9uZW50ID0gcGFyc2VkTnVtYmVyLmV4cG9uZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGVjaW1hbHMgPSBbXTsKICAgICAgICBpc1plcm8gPSBkaWdpdHMuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZCA9PiAhZCkpOwogICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVycwogICAgICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgbWluSW50OyBpbnRlZ2VyTGVuKyspIHsKICAgICAgICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7CiAgICAgICAgfQogICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVycwogICAgICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgMDsgaW50ZWdlckxlbisrKSB7CiAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgIH0KICAgICAgICAvLyBleHRyYWN0IGRlY2ltYWxzIGRpZ2l0cwogICAgICAgIGlmIChpbnRlZ2VyTGVuID4gMCkgewogICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0cy5zcGxpY2UoaW50ZWdlckxlbiwgZGlnaXRzLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0czsKICAgICAgICAgICAgZGlnaXRzID0gWzBdOwogICAgICAgIH0KICAgICAgICAvLyBmb3JtYXQgdGhlIGludGVnZXIgZGlnaXRzIHdpdGggZ3JvdXBpbmcgc2VwYXJhdG9ycwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBncm91cHMgPSBbXTsKICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+PSBwYXR0ZXJuLmxnU2l6ZSkgewogICAgICAgICAgICBncm91cHMudW5zaGlmdChkaWdpdHMuc3BsaWNlKC1wYXR0ZXJuLmxnU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IHBhdHRlcm4uZ1NpemUpIHsKICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5nU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpOwogICAgICAgIH0KICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCkgewogICAgICAgICAgICBncm91cHMudW5zaGlmdChkaWdpdHMuam9pbignJykpOwogICAgICAgIH0KICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ3JvdXBzLmpvaW4oZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgZ3JvdXBTeW1ib2wpKTsKICAgICAgICAvLyBhcHBlbmQgdGhlIGRlY2ltYWwgZGlnaXRzCiAgICAgICAgaWYgKGRlY2ltYWxzLmxlbmd0aCkgewogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIGRlY2ltYWxTeW1ib2wpICsgZGVjaW1hbHMuam9pbignJyk7CiAgICAgICAgfQogICAgICAgIGlmIChleHBvbmVudCkgewogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5FeHBvbmVudGlhbCkgKyAnKycgKyBleHBvbmVudDsKICAgICAgICB9CiAgICB9CiAgICBpZiAodmFsdWUgPCAwICYmICFpc1plcm8pIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gcGF0dGVybi5uZWdQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5uZWdTdWY7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gcGF0dGVybi5wb3NQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5wb3NTdWY7CiAgICB9CiAgICByZXR1cm4gZm9ybWF0dGVkVGV4dDsKfQovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGN1cnJlbmN5IHVzaW5nIGxvY2FsZSBydWxlcy4KICoKICogQHNlZSBgZm9ybWF0TnVtYmVyKClgIC8gYERlY2ltYWxQaXBlYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogKgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHZhbHVlIFRoZSBudW1iZXIgdG8gZm9ybWF0LgogKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAqIEBwYXJhbSB7P30gY3VycmVuY3kgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY3VycmVuY3kgc3ltYm9sIG9yIGl0cyBuYW1lLAogKiBzdWNoIGFzICIkIiBvciAiQ2FuYWRpYW4gRG9sbGFyIi4gVXNlZCBpbiBvdXRwdXQgc3RyaW5nLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBvcGVyYXRpb24KICogb2YgdGhlIGZ1bmN0aW9uLgogKiBAcGFyYW0gez89fSBjdXJyZW5jeUNvZGUgVGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpCiAqIGN1cnJlbmN5IGNvZGUsIHN1Y2ggYXMgYFVTRGAgZm9yIHRoZSBVUyBkb2xsYXIgYW5kIGBFVVJgIGZvciB0aGUgZXVyby4KICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGRlY2ltYWwgcGFydC4KICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbwogKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIGN1cnJlbmN5IHZhbHVlLgogKgogKi8KZnVuY3Rpb24gZm9ybWF0Q3VycmVuY3kodmFsdWUsIGxvY2FsZSwgY3VycmVuY3ksIGN1cnJlbmN5Q29kZSwgZGlnaXRzSW5mbykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgcGF0dGVybi5taW5GcmFjID0gZ2V0TnVtYmVyT2ZDdXJyZW5jeURpZ2l0cygoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVuY3lDb2RlKSkpOwogICAgcGF0dGVybi5tYXhGcmFjID0gcGF0dGVybi5taW5GcmFjOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzID0gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXAsIE51bWJlclN5bWJvbC5DdXJyZW5jeURlY2ltYWwsIGRpZ2l0c0luZm8pOwogICAgcmV0dXJuIHJlcwogICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsIGN1cnJlbmN5KQogICAgICAgIC8vIGlmIHdlIGhhdmUgMiB0aW1lIHRoZSBjdXJyZW5jeSBjaGFyYWN0ZXIsIHRoZSBzZWNvbmQgb25lIGlzIGlnbm9yZWQKICAgICAgICAucmVwbGFjZShDVVJSRU5DWV9DSEFSLCAnJykKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNpbmcgYmV0d2VlbiBjdXJyZW5jeSBjaGFyYWN0ZXIgYW5kIHRoZSB2YWx1ZSBhbmQKICAgICAgICAvLyB0aGUgY3VycmVuY3kgY2hhcmFjdGVyIGlzIHN1cHJlc3NlZCBieSBwYXNzaW5nIGFuIGVtcHR5IHN0cmluZywgdGhlCiAgICAgICAgLy8gc3BhY2luZyBjaGFyYWN0ZXIgd291bGQgcmVtYWluIGFzIHBhcnQgb2YgdGhlIHN0cmluZy4gVGhlbiB3ZQogICAgICAgIC8vIHNob3VsZCByZW1vdmUgaXQuCiAgICAgICAgLnRyaW0oKTsKfQovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGEgcGVyY2VudGFnZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLgogKgogKiBAc2VlIGBmb3JtYXROdW1iZXIoKWAgLyBgRGVjaW1hbFBpcGVgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAqIFxAcHVibGljQXBpCiAqCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuCiAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbwogKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIHBlcmNlbnRhZ2UgdmFsdWUuCiAqCiAqLwpmdW5jdGlvbiBmb3JtYXRQZXJjZW50KHZhbHVlLCBsb2NhbGUsIGRpZ2l0c0luZm8pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIE51bWJlckZvcm1hdFN0eWxlLlBlcmNlbnQpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVzID0gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbywgdHJ1ZSk7CiAgICByZXR1cm4gcmVzLnJlcGxhY2UobmV3IFJlZ0V4cChQRVJDRU5UX0NIQVIsICdnJyksIGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5QZXJjZW50U2lnbikpOwp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgdGV4dCwgd2l0aCBncm91cCBzaXppbmcsIHNlcGFyYXRvciwgYW5kIG90aGVyCiAqIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIGxvY2FsZS4KICoKICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICoKICogXEBwdWJsaWNBcGkKICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbnVtYmVyIHRvIGZvcm1hdC4KICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAqIEByZXR1cm4gez99IFRoZSBmb3JtYXR0ZWQgdGV4dCBzdHJpbmcuCiAqLwpmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsdWUsIGxvY2FsZSwgZGlnaXRzSW5mbykgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuRGVjaW1hbCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXR0ZXJuID0gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuTWludXNTaWduKSk7CiAgICByZXR1cm4gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbyk7Cn0KLyoqCiAqIEBwYXJhbSB7P30gZm9ybWF0CiAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBtaW51c1NpZ24gPSAnLScpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHAgPSB7CiAgICAgICAgbWluSW50OiAxLAogICAgICAgIG1pbkZyYWM6IDAsCiAgICAgICAgbWF4RnJhYzogMCwKICAgICAgICBwb3NQcmU6ICcnLAogICAgICAgIHBvc1N1ZjogJycsCiAgICAgICAgbmVnUHJlOiAnJywKICAgICAgICBuZWdTdWY6ICcnLAogICAgICAgIGdTaXplOiAwLAogICAgICAgIGxnU2l6ZTogMAogICAgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IGZvcm1hdC5zcGxpdChQQVRURVJOX1NFUCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwb3NpdGl2ZSA9IHBhdHRlcm5QYXJ0c1swXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG5lZ2F0aXZlID0gcGF0dGVyblBhcnRzWzFdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcG9zaXRpdmVQYXJ0cyA9IHBvc2l0aXZlLmluZGV4T2YoREVDSU1BTF9TRVApICE9PSAtMSA/CiAgICAgICAgcG9zaXRpdmUuc3BsaXQoREVDSU1BTF9TRVApIDoKICAgICAgICBbCiAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZygwLCBwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSksCiAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZyhwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSkKICAgICAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW50ZWdlciA9IHBvc2l0aXZlUGFydHNbMF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmcmFjdGlvbiA9IHBvc2l0aXZlUGFydHNbMV0gfHwgJyc7CiAgICBwLnBvc1ByZSA9IGludGVnZXIuc3Vic3RyKDAsIGludGVnZXIuaW5kZXhPZihESUdJVF9DSEFSKSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyYWN0aW9uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNoID0gZnJhY3Rpb24uY2hhckF0KGkpOwogICAgICAgIGlmIChjaCA9PT0gWkVST19DSEFSKSB7CiAgICAgICAgICAgIHAubWluRnJhYyA9IHAubWF4RnJhYyA9IGkgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjaCA9PT0gRElHSVRfQ0hBUikgewogICAgICAgICAgICBwLm1heEZyYWMgPSBpICsgMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHAucG9zU3VmICs9IGNoOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdyb3VwcyA9IGludGVnZXIuc3BsaXQoR1JPVVBfU0VQKTsKICAgIHAuZ1NpemUgPSBncm91cHNbMV0gPyBncm91cHNbMV0ubGVuZ3RoIDogMDsKICAgIHAubGdTaXplID0gKGdyb3Vwc1syXSB8fCBncm91cHNbMV0pID8gKGdyb3Vwc1syXSB8fCBncm91cHNbMV0pLmxlbmd0aCA6IDA7CiAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdHJ1bmtMZW4gPSBwb3NpdGl2ZS5sZW5ndGggLSBwLnBvc1ByZS5sZW5ndGggLSBwLnBvc1N1Zi5sZW5ndGg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvcyA9IG5lZ2F0aXZlLmluZGV4T2YoRElHSVRfQ0hBUik7CiAgICAgICAgcC5uZWdQcmUgPSBuZWdhdGl2ZS5zdWJzdHIoMCwgcG9zKS5yZXBsYWNlKC8nL2csICcnKTsKICAgICAgICBwLm5lZ1N1ZiA9IG5lZ2F0aXZlLnN1YnN0cihwb3MgKyB0cnVua0xlbikucmVwbGFjZSgvJy9nLCAnJyk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwLm5lZ1ByZSA9IG1pbnVzU2lnbiArIHAucG9zUHJlOwogICAgICAgIHAubmVnU3VmID0gcC5wb3NTdWY7CiAgICB9CiAgICByZXR1cm4gcDsKfQovLyBUcmFuc2Zvcm1zIGEgcGFyc2VkIG51bWJlciBpbnRvIGEgcGVyY2VudGFnZSBieSBtdWx0aXBseWluZyBpdCBieSAxMDAKLyoqCiAqIEBwYXJhbSB7P30gcGFyc2VkTnVtYmVyCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB0b1BlcmNlbnQocGFyc2VkTnVtYmVyKSB7CiAgICAvLyBpZiB0aGUgbnVtYmVyIGlzIDAsIGRvbid0IGRvIGFueXRoaW5nCiAgICBpZiAocGFyc2VkTnVtYmVyLmRpZ2l0c1swXSA9PT0gMCkgewogICAgICAgIHJldHVybiBwYXJzZWROdW1iZXI7CiAgICB9CiAgICAvLyBHZXR0aW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBkZWNpbWFscwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZnJhY3Rpb25MZW4gPSBwYXJzZWROdW1iZXIuZGlnaXRzLmxlbmd0aCAtIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgaWYgKHBhcnNlZE51bWJlci5leHBvbmVudCkgewogICAgICAgIHBhcnNlZE51bWJlci5leHBvbmVudCArPSAyOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYgKGZyYWN0aW9uTGVuID09PSAwKSB7CiAgICAgICAgICAgIHBhcnNlZE51bWJlci5kaWdpdHMucHVzaCgwLCAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZnJhY3Rpb25MZW4gPT09IDEpIHsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmRpZ2l0cy5wdXNoKDApOwogICAgICAgIH0KICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbiArPSAyOwogICAgfQogICAgcmV0dXJuIHBhcnNlZE51bWJlcjsKfQovKioKICogUGFyc2VzIGEgbnVtYmVyLgogKiBTaWduaWZpY2FudCBiaXRzIG9mIHRoaXMgcGFyc2UgYWxnb3JpdGhtIGNhbWUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTWlrZU1jbC9iaWcuanMvCiAqIEBwYXJhbSB7P30gbnVtCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBwYXJzZU51bWJlcihudW0pIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBudW1TdHIgPSBNYXRoLmFicyhudW0pICsgJyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZXhwb25lbnQgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbnRlZ2VyTGVuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgajsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB6ZXJvczsKICAgIC8vIERlY2ltYWwgcG9pbnQ/CiAgICBpZiAoKGludGVnZXJMZW4gPSBudW1TdHIuaW5kZXhPZihERUNJTUFMX1NFUCkpID4gLTEpIHsKICAgICAgICBudW1TdHIgPSBudW1TdHIucmVwbGFjZShERUNJTUFMX1NFUCwgJycpOwogICAgfQogICAgLy8gRXhwb25lbnRpYWwgZm9ybT8KICAgIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkgewogICAgICAgIC8vIFdvcmsgb3V0IHRoZSBleHBvbmVudC4KICAgICAgICBpZiAoaW50ZWdlckxlbiA8IDApCiAgICAgICAgICAgIGludGVnZXJMZW4gPSBpOwogICAgICAgIGludGVnZXJMZW4gKz0gK251bVN0ci5zbGljZShpICsgMSk7CiAgICAgICAgbnVtU3RyID0gbnVtU3RyLnN1YnN0cmluZygwLCBpKTsKICAgIH0KICAgIGVsc2UgaWYgKGludGVnZXJMZW4gPCAwKSB7CiAgICAgICAgLy8gVGhlcmUgd2FzIG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQgc28gaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICBpbnRlZ2VyTGVuID0gbnVtU3RyLmxlbmd0aDsKICAgIH0KICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcy4KICAgIGZvciAoaSA9IDA7IG51bVN0ci5jaGFyQXQoaSkgPT09IFpFUk9fQ0hBUjsgaSsrKSB7IC8qIGVtcHR5ICovCiAgICB9CiAgICBpZiAoaSA9PT0gKHplcm9zID0gbnVtU3RyLmxlbmd0aCkpIHsKICAgICAgICAvLyBUaGUgZGlnaXRzIGFyZSBhbGwgemVyby4KICAgICAgICBkaWdpdHMgPSBbMF07CiAgICAgICAgaW50ZWdlckxlbiA9IDE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zCiAgICAgICAgemVyb3MtLTsKICAgICAgICB3aGlsZSAobnVtU3RyLmNoYXJBdCh6ZXJvcykgPT09IFpFUk9fQ0hBUikKICAgICAgICAgICAgemVyb3MtLTsKICAgICAgICAvLyBUcmFpbGluZyB6ZXJvcyBhcmUgaW5zaWduaWZpY2FudCBzbyBpZ25vcmUgdGhlbQogICAgICAgIGludGVnZXJMZW4gLT0gaTsKICAgICAgICBkaWdpdHMgPSBbXTsKICAgICAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBhcnJheSBvZiBkaWdpdHMgd2l0aG91dCBsZWFkaW5nL3RyYWlsaW5nIHplcm9zLgogICAgICAgIGZvciAoaiA9IDA7IGkgPD0gemVyb3M7IGkrKywgaisrKSB7CiAgICAgICAgICAgIGRpZ2l0c1tqXSA9IE51bWJlcihudW1TdHIuY2hhckF0KGkpKTsKICAgICAgICB9CiAgICB9CiAgICAvLyBJZiB0aGUgbnVtYmVyIG92ZXJmbG93cyB0aGUgbWF4aW11bSBhbGxvd2VkIGRpZ2l0cyB0aGVuIHVzZSBhbiBleHBvbmVudC4KICAgIGlmIChpbnRlZ2VyTGVuID4gTUFYX0RJR0lUUykgewogICAgICAgIGRpZ2l0cyA9IGRpZ2l0cy5zcGxpY2UoMCwgTUFYX0RJR0lUUyAtIDEpOwogICAgICAgIGV4cG9uZW50ID0gaW50ZWdlckxlbiAtIDE7CiAgICAgICAgaW50ZWdlckxlbiA9IDE7CiAgICB9CiAgICByZXR1cm4geyBkaWdpdHMsIGV4cG9uZW50LCBpbnRlZ2VyTGVuIH07Cn0KLyoqCiAqIFJvdW5kIHRoZSBwYXJzZWQgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCiAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcGFyc2VkTnVtYmVyIGluLXBsYWNlCiAqIEBwYXJhbSB7P30gcGFyc2VkTnVtYmVyCiAqIEBwYXJhbSB7P30gbWluRnJhYwogKiBAcGFyYW0gez99IG1heEZyYWMKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhYywgbWF4RnJhYykgewogICAgaWYgKG1pbkZyYWMgPiBtYXhGcmFjKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uICgke21pbkZyYWN9KSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSAoJHttYXhGcmFjfSkuYCk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0czsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBmcmFjdGlvbkxlbiA9IGRpZ2l0cy5sZW5ndGggLSBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZyYWN0aW9uU2l6ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbkZyYWMsIGZyYWN0aW9uTGVuKSwgbWF4RnJhYyk7CiAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGRpZ2l0IHRvIHdoZXJlIHJvdW5kaW5nIGlzIHRvIG9jY3VyCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRpZ2l0ID0gZGlnaXRzW3JvdW5kQXRdOwogICAgaWYgKHJvdW5kQXQgPiAwKSB7CiAgICAgICAgLy8gRHJvcCBmcmFjdGlvbmFsIGRpZ2l0cyBiZXlvbmQgYHJvdW5kQXRgCiAgICAgICAgZGlnaXRzLnNwbGljZShNYXRoLm1heChwYXJzZWROdW1iZXIuaW50ZWdlckxlbiwgcm91bmRBdCkpOwogICAgICAgIC8vIFNldCBub24tZnJhY3Rpb25hbCBkaWdpdHMgYmV5b25kIGByb3VuZEF0YCB0byAwCiAgICAgICAgZm9yIChsZXQgaiA9IHJvdW5kQXQ7IGogPCBkaWdpdHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgZGlnaXRzW2pdID0gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAvLyBXZSByb3VuZGVkIHRvIHplcm8gc28gcmVzZXQgdGhlIHBhcnNlZE51bWJlcgogICAgICAgIGZyYWN0aW9uTGVuID0gTWF0aC5tYXgoMCwgZnJhY3Rpb25MZW4pOwogICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuID0gMTsKICAgICAgICBkaWdpdHMubGVuZ3RoID0gTWF0aC5tYXgoMSwgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIDEpOwogICAgICAgIGRpZ2l0c1swXSA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3VuZEF0OyBpKyspCiAgICAgICAgICAgIGRpZ2l0c1tpXSA9IDA7CiAgICB9CiAgICBpZiAoZGlnaXQgPj0gNSkgewogICAgICAgIGlmIChyb3VuZEF0IC0gMSA8IDApIHsKICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPiByb3VuZEF0OyBrLS0pIHsKICAgICAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBkaWdpdHMudW5zaGlmdCgxKTsKICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRpZ2l0c1tyb3VuZEF0IC0gMV0rKzsKICAgICAgICB9CiAgICB9CiAgICAvLyBQYWQgb3V0IHdpdGggemVyb3MgdG8gZ2V0IHRoZSByZXF1aXJlZCBmcmFjdGlvbiBsZW5ndGgKICAgIGZvciAoOyBmcmFjdGlvbkxlbiA8IE1hdGgubWF4KDAsIGZyYWN0aW9uU2l6ZSk7IGZyYWN0aW9uTGVuKyspCiAgICAgICAgZGlnaXRzLnB1c2goMCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgZHJvcFRyYWlsaW5nWmVyb3MgPSBmcmFjdGlvblNpemUgIT09IDA7CiAgICAvLyBNaW5pbWFsIGxlbmd0aCA9IG5iIG9mIGRlY2ltYWxzIHJlcXVpcmVkICsgY3VycmVudCBuYiBvZiBpbnRlZ2VycwogICAgLy8gQW55IG51bWJlciBiZXNpZGVzIHRoYXQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmIGl0J3MgYSB0cmFpbGluZyAwCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBtaW5MZW4gPSBtaW5GcmFjICsgcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAvLyBEbyBhbnkgY2FycnlpbmcsIGUuZy4gYSBkaWdpdCB3YXMgcm91bmRlZCB1cCB0byAxMAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgY2FycnkgPSBkaWdpdHMucmVkdWNlUmlnaHQoKC8qKgogICAgICogQHBhcmFtIHs/fSBjYXJyeQogICAgICogQHBhcmFtIHs/fSBkCiAgICAgKiBAcGFyYW0gez99IGkKICAgICAqIEBwYXJhbSB7P30gZGlnaXRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiAoY2FycnksIGQsIGksIGRpZ2l0cykgewogICAgICAgIGQgPSBkICsgY2Fycnk7CiAgICAgICAgZGlnaXRzW2ldID0gZCA8IDEwID8gZCA6IGQgLSAxMDsgLy8gZCAlIDEwCiAgICAgICAgaWYgKGRyb3BUcmFpbGluZ1plcm9zKSB7CiAgICAgICAgICAgIC8vIERvIG5vdCBrZWVwIG1lYW5pbmdsZXNzIGZyYWN0aW9uYWwgdHJhaWxpbmcgemVyb3MgKGUuZy4gMTUuNTIwMDAgLS0+IDE1LjUyKQogICAgICAgICAgICBpZiAoZGlnaXRzW2ldID09PSAwICYmIGkgPj0gbWluTGVuKSB7CiAgICAgICAgICAgICAgICBkaWdpdHMucG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkcm9wVHJhaWxpbmdaZXJvcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkID49IDEwID8gMSA6IDA7IC8vIE1hdGguZmxvb3IoZCAvIDEwKTsKICAgIH0pLCAwKTsKICAgIGlmIChjYXJyeSkgewogICAgICAgIGRpZ2l0cy51bnNoaWZ0KGNhcnJ5KTsKICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbisrOwogICAgfQp9Ci8qKgogKiBAcGFyYW0gez99IHRleHQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIHBhcnNlSW50QXV0b1JhZGl4KHRleHQpIHsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlSW50KHRleHQpOwogICAgaWYgKGlzTmFOKHJlc3VsdCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyAnICsgdGV4dCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vbG9jYWxpemF0aW9uLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKiBAYWJzdHJhY3QKICovCmNsYXNzIE5nTG9jYWxpemF0aW9uIHsKfQovKioKICogUmV0dXJucyB0aGUgcGx1cmFsIGNhdGVnb3J5IGZvciBhIGdpdmVuIHZhbHVlLgogKiAtICI9dmFsdWUiIHdoZW4gdGhlIGNhc2UgZXhpc3RzLAogKiAtIHRoZSBwbHVyYWwgY2F0ZWdvcnkgb3RoZXJ3aXNlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHBhcmFtIHs/fSBjYXNlcwogKiBAcGFyYW0gez99IG5nTG9jYWxpemF0aW9uCiAqIEBwYXJhbSB7Pz19IGxvY2FsZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIGNhc2VzLCBuZ0xvY2FsaXphdGlvbiwgbG9jYWxlKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQga2V5ID0gYD0ke3ZhbHVlfWA7CiAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAga2V5ID0gbmdMb2NhbGl6YXRpb24uZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIGxvY2FsZSk7CiAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgfQogICAgaWYgKGNhc2VzLmluZGV4T2YoJ290aGVyJykgPiAtMSkgewogICAgICAgIHJldHVybiAnb3RoZXInOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVyYWwgbWVzc2FnZSBmb3VuZCBmb3IgdmFsdWUgIiR7dmFsdWV9ImApOwp9Ci8qKgogKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ0xvY2FsZUxvY2FsaXphdGlvbiBleHRlbmRzIE5nTG9jYWxpemF0aW9uIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqLwogICAgY29uc3RydWN0b3IobG9jYWxlKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgbG9jYWxlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsdXJhbCA9IGdldExvY2FsZVBsdXJhbENhc2UkMShsb2NhbGUgfHwgdGhpcy5sb2NhbGUpKHZhbHVlKTsKICAgICAgICBzd2l0Y2ggKHBsdXJhbCkgewogICAgICAgICAgICBjYXNlIFBsdXJhbC5aZXJvOgogICAgICAgICAgICAgICAgcmV0dXJuICd6ZXJvJzsKICAgICAgICAgICAgY2FzZSBQbHVyYWwuT25lOgogICAgICAgICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgICAgICBjYXNlIFBsdXJhbC5Ud286CiAgICAgICAgICAgICAgICByZXR1cm4gJ3R3byc7CiAgICAgICAgICAgIGNhc2UgUGx1cmFsLkZldzoKICAgICAgICAgICAgICAgIHJldHVybiAnZmV3JzsKICAgICAgICAgICAgY2FzZSBQbHVyYWwuTWFueToKICAgICAgICAgICAgICAgIHJldHVybiAnbWFueSc7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgICAgICB9CiAgICB9Cn0KTmdMb2NhbGVMb2NhbGl6YXRpb24uybVmYWMgPSBmdW5jdGlvbiBOZ0xvY2FsZUxvY2FsaXphdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0xvY2FsZUxvY2FsaXphdGlvbikoybXJtWluamVjdChMT0NBTEVfSUQkMSkpOyB9OwpOZ0xvY2FsZUxvY2FsaXphdGlvbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBOZ0xvY2FsZUxvY2FsaXphdGlvbiwgZmFjdG9yeTogTmdMb2NhbGVMb2NhbGl6YXRpb24uybVmYWMgfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0xvY2FsZUxvY2FsaXphdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvY29va2llLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogKi8KLyoqCiAqIEBwYXJhbSB7P30gY29va2llU3RyCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gcGFyc2VDb29raWVWYWx1ZShjb29raWVTdHIsIG5hbWUpIHsKICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICBmb3IgKGNvbnN0IGNvb2tpZSBvZiBjb29raWVTdHIuc3BsaXQoJzsnKSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlcUluZGV4ID0gY29va2llLmluZGV4T2YoJz0nKTsKICAgICAgICBjb25zdCBbY29va2llTmFtZSwgY29va2llVmFsdWVdID0gZXFJbmRleCA9PSAtMSA/IFtjb29raWUsICcnXSA6IFtjb29raWUuc2xpY2UoMCwgZXFJbmRleCksIGNvb2tpZS5zbGljZShlcUluZGV4ICsgMSldOwogICAgICAgIGlmIChjb29raWVOYW1lLnRyaW0oKSA9PT0gbmFtZSkgewogICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX2NsYXNzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQHVzYWdlTm90ZXMKICogYGBgCiAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT0iJ2ZpcnN0IHNlY29uZCciPi4uLjwvc29tZS1lbGVtZW50PgogKgogKiAgICAgPHNvbWUtZWxlbWVudCBbbmdDbGFzc109IlsnZmlyc3QnLCAnc2Vjb25kJ10iPi4uLjwvc29tZS1lbGVtZW50PgogKgogKiAgICAgPHNvbWUtZWxlbWVudCBbbmdDbGFzc109InsnZmlyc3QnOiB0cnVlLCAnc2Vjb25kJzogdHJ1ZSwgJ3RoaXJkJzogZmFsc2V9Ij4uLi48L3NvbWUtZWxlbWVudD4KICoKICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJzdHJpbmdFeHB8YXJyYXlFeHB8b2JqRXhwIj4uLi48L3NvbWUtZWxlbWVudD4KICoKICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJ7J2NsYXNzMSBjbGFzczIgY2xhc3MzJyA6IHRydWV9Ij4uLi48L3NvbWUtZWxlbWVudD4KICogYGBgCiAqCiAqIFxAZGVzY3JpcHRpb24KICoKICogQWRkcyBhbmQgcmVtb3ZlcyBDU1MgY2xhc3NlcyBvbiBhbiBIVE1MIGVsZW1lbnQuCiAqCiAqIFRoZSBDU1MgY2xhc3NlcyBhcmUgdXBkYXRlZCBhcyBmb2xsb3dzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbjoKICogLSBgc3RyaW5nYCAtIHRoZSBDU1MgY2xhc3NlcyBsaXN0ZWQgaW4gdGhlIHN0cmluZyAoc3BhY2UgZGVsaW1pdGVkKSBhcmUgYWRkZWQsCiAqIC0gYEFycmF5YCAtIHRoZSBDU1MgY2xhc3NlcyBkZWNsYXJlZCBhcyBBcnJheSBlbGVtZW50cyBhcmUgYWRkZWQsCiAqIC0gYE9iamVjdGAgLSBrZXlzIGFyZSBDU1MgY2xhc3NlcyB0aGF0IGdldCBhZGRlZCB3aGVuIHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSB2YWx1ZQogKiAgICAgICAgICAgICAgZXZhbHVhdGVzIHRvIGEgdHJ1dGh5IHZhbHVlLCBvdGhlcndpc2UgdGhleSBhcmUgcmVtb3ZlZC4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nQ2xhc3MgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9pdGVyYWJsZURpZmZlcnMKICAgICAqIEBwYXJhbSB7P30gX2tleVZhbHVlRGlmZmVycwogICAgICogQHBhcmFtIHs/fSBfbmdFbAogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoX2l0ZXJhYmxlRGlmZmVycywgX2tleVZhbHVlRGlmZmVycywgX25nRWwsIF9yZW5kZXJlcikgewogICAgICAgIHRoaXMuX2l0ZXJhYmxlRGlmZmVycyA9IF9pdGVyYWJsZURpZmZlcnM7CiAgICAgICAgdGhpcy5fa2V5VmFsdWVEaWZmZXJzID0gX2tleVZhbHVlRGlmZmVyczsKICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsOwogICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9pbml0aWFsQ2xhc3NlcyA9IFtdOwogICAgICAgIHRoaXMuX3Jhd0NsYXNzID0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IGtsYXNzKHZhbHVlKSB7CiAgICAgICAgdGhpcy5fcmVtb3ZlQ2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7CiAgICAgICAgdGhpcy5faW5pdGlhbENsYXNzZXMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUuc3BsaXQoL1xzKy8pIDogW107CiAgICAgICAgdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX2luaXRpYWxDbGFzc2VzKTsKICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdDbGFzcyh2YWx1ZSkgewogICAgICAgIHRoaXMuX3JlbW92ZUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpOwogICAgICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7CiAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsOwogICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9yYXdDbGFzcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5zcGxpdCgvXHMrLykgOiB2YWx1ZTsKICAgICAgICBpZiAodGhpcy5fcmF3Q2xhc3MpIHsKICAgICAgICAgICAgaWYgKGlzTGlzdExpa2VJdGVyYWJsZSQxKHRoaXMuX3Jhd0NsYXNzKSkgewogICAgICAgICAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9yYXdDbGFzcykuY3JlYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZURpZmZlciA9IHRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdEb0NoZWNrKCkgewogICAgICAgIGlmICh0aGlzLl9pdGVyYWJsZURpZmZlcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZXJhYmxlQ2hhbmdlcyA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVyLmRpZmYoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Jhd0NsYXNzKSkpOwogICAgICAgICAgICBpZiAoaXRlcmFibGVDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyhpdGVyYWJsZUNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuX2tleVZhbHVlRGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5VmFsdWVDaGFuZ2VzID0gdGhpcy5fa2V5VmFsdWVEaWZmZXIuZGlmZigoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcmF3Q2xhc3MpKSk7CiAgICAgICAgICAgIGlmIChrZXlWYWx1ZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKGtleVZhbHVlQ2hhbmdlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSkpKTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWNvcmQpID0+IHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpKSk7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgIGlmIChyZWNvcmQucHJldmlvdXNWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLmtleSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlJdGVyYWJsZUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWNvcmQpID0+IHsKICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQuaXRlbSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTmdDbGFzcyBjYW4gb25seSB0b2dnbGUgQ1NTIGNsYXNzZXMgZXhwcmVzc2VkIGFzIHN0cmluZ3MsIGdvdCAke3N0cmluZ2lmeShyZWNvcmQuaXRlbSl9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQuaXRlbSwgZmFsc2UpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGxpZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIHRvIHRoZSBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBTZXQgYW5kIEFycmF5IENTUyBjbGFzcyBuYW1lcyBjb250YWluZWQgaW4gdGhvc2UgY29sbGVjdGlvbnMgYXJlIGFsd2F5cwogICAgICogYWRkZWQuCiAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBNYXAgQ1NTIGNsYXNzIG5hbWUgaW4gdGhlIG1hcCdzIGtleSBpcyB0b2dnbGVkIGJhc2VkIG9uIHRoZSB2YWx1ZSAoYWRkZWQKICAgICAqIGZvciB0cnV0aHkgYW5kIHJlbW92ZWQgZm9yIGZhbHN5KS4KICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHJhd0NsYXNzVmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYXBwbHlDbGFzc2VzKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgaWYgKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0NsYXNzVmFsKSB8fCByYXdDbGFzc1ZhbCBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyYXdDbGFzc1ZhbCkpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChrbGFzcykgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIHRydWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyYXdDbGFzc1ZhbCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtsYXNzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBrbGFzcyA9PiB0aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgISFyYXdDbGFzc1ZhbFtrbGFzc10pKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIGZyb20gdGhlIERPTSBlbGVtZW50LiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGNsZWFudXAKICAgICAqIHB1cnBvc2VzLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcmF3Q2xhc3NWYWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9yZW1vdmVDbGFzc2VzKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgaWYgKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0NsYXNzVmFsKSB8fCByYXdDbGFzc1ZhbCBpbnN0YW5jZW9mIFNldCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyYXdDbGFzc1ZhbCkpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChrbGFzcykgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIGZhbHNlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmF3Q2xhc3NWYWwpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAga2xhc3MgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIGZhbHNlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICogQHBhcmFtIHs/fSBlbmFibGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdG9nZ2xlQ2xhc3Moa2xhc3MsIGVuYWJsZWQpIHsKICAgICAgICBrbGFzcyA9IGtsYXNzLnRyaW0oKTsKICAgICAgICBpZiAoa2xhc3MpIHsKICAgICAgICAgICAga2xhc3Muc3BsaXQoL1xzKy9nKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2xhc3MgPT4gewogICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsIGtsYXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwga2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQp9Ck5nQ2xhc3MuybVmYWMgPSBmdW5jdGlvbiBOZ0NsYXNzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ2xhc3MpKMm1ybVkaXJlY3RpdmVJbmplY3QoSXRlcmFibGVEaWZmZXJzKSwgybXJtWRpcmVjdGl2ZUluamVjdChLZXlWYWx1ZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMikpOyB9OwpOZ0NsYXNzLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nQ2xhc3MsIHNlbGVjdG9yczogW1siIiwgIm5nQ2xhc3MiLCAiIl1dLCBpbnB1dHM6IHsga2xhc3M6IFsiY2xhc3MiLCAia2xhc3MiXSwgbmdDbGFzczogIm5nQ2xhc3MiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0NsYXNzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfSwKICAgIHsgdHlwZTogS2V5VmFsdWVEaWZmZXJzIH0sCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogUmVuZGVyZXIyIH0KXTsKTmdDbGFzcy5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIGtsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjbGFzcycsXSB9XSwKICAgIG5nQ2xhc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nQ2xhc3MnLF0gfV0KfTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19jb21wb25lbnRfb3V0bGV0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBJbnN0YW50aWF0ZXMgYSBzaW5nbGUge1xAbGluayBDb21wb25lbnR9IHR5cGUgYW5kIGluc2VydHMgaXRzIEhvc3QgVmlldyBpbnRvIGN1cnJlbnQgVmlldy4KICogYE5nQ29tcG9uZW50T3V0bGV0YCBwcm92aWRlcyBhIGRlY2xhcmF0aXZlIGFwcHJvYWNoIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbi4KICoKICogYE5nQ29tcG9uZW50T3V0bGV0YCByZXF1aXJlcyBhIGNvbXBvbmVudCB0eXBlLCBpZiBhIGZhbHN5IHZhbHVlIGlzIHNldCB0aGUgdmlldyB3aWxsIGNsZWFyIGFuZAogKiBhbnkgZXhpc3RpbmcgY29tcG9uZW50IHdpbGwgZ2V0IGRlc3Ryb3llZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBGaW5lIHR1bmUgY29udHJvbAogKgogKiBZb3UgY2FuIGNvbnRyb2wgdGhlIGNvbXBvbmVudCBjcmVhdGlvbiBwcm9jZXNzIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgYXR0cmlidXRlczoKICoKICogKiBgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcmA6IE9wdGlvbmFsIGN1c3RvbSB7XEBsaW5rIEluamVjdG9yfSB0aGF0IHdpbGwgYmUgdXNlZCBhcyBwYXJlbnQgZm9yCiAqIHRoZSBDb21wb25lbnQuIERlZmF1bHRzIHRvIHRoZSBpbmplY3RvciBvZiB0aGUgY3VycmVudCB2aWV3IGNvbnRhaW5lci4KICoKICogKiBgbmdDb21wb25lbnRPdXRsZXRDb250ZW50YDogT3B0aW9uYWwgbGlzdCBvZiBwcm9qZWN0YWJsZSBub2RlcyB0byBpbnNlcnQgaW50byB0aGUgY29udGVudAogKiBzZWN0aW9uIG9mIHRoZSBjb21wb25lbnQsIGlmIGV4aXN0cy4KICoKICogKiBgbmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnlgOiBPcHRpb25hbCBtb2R1bGUgZmFjdG9yeSB0byBhbGxvdyBkeW5hbWljYWxseSBsb2FkaW5nIG90aGVyCiAqIG1vZHVsZSwgdGhlbiBsb2FkIGEgY29tcG9uZW50IGZyb20gdGhhdCBtb2R1bGUuCiAqCiAqICMjIyBTeW50YXgKICoKICogU2ltcGxlCiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb24iPjwvbmctY29udGFpbmVyPgogKiBgYGAKICoKICogQ3VzdG9taXplZCBpbmplY3Rvci9jb250ZW50CiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb247CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3JFeHByZXNzaW9uOwogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29udGVudE5vZGVzRXhwcmVzc2lvbjsiPgogKiA8L25nLWNvbnRhaW5lcj4KICogYGBgCiAqCiAqIEN1c3RvbWl6ZWQgbmdNb2R1bGVGYWN0b3J5CiAqIGBgYAogKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb247CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZUZhY3Rvcnk6IG1vZHVsZUZhY3Rvcnk7Ij4KICogPC9uZy1jb250YWluZXI+CiAqIGBgYAogKgogKiAjIyMgQSBzaW1wbGUgZXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0NvbXBvbmVudE91dGxldC90cy9tb2R1bGUudHMgcmVnaW9uPSdTaW1wbGVFeGFtcGxlJ30KICoKICogQSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6CiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL25nQ29tcG9uZW50T3V0bGV0L3RzL21vZHVsZS50cyByZWdpb249J0NvbXBsZXRlRXhhbXBsZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqLwpjbGFzcyBOZ0NvbXBvbmVudE91dGxldCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7CiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDsKICAgICAgICBpZiAodGhpcy5uZ0NvbXBvbmVudE91dGxldCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsSW5qZWN0b3IgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3IgfHwgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvcjsKICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ25nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5J10pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2R1bGVSZWYpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1vZHVsZSA9IGVsSW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSB0aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5LmNyZWF0ZShwYXJlbnRNb2R1bGUuaW5qZWN0b3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IHRoaXMuX21vZHVsZVJlZiA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgOgogICAgICAgICAgICAgICAgZWxJbmplY3Rvci5nZXQoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMubmdDb21wb25lbnRPdXRsZXQpOwogICAgICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCwgZWxJbmplY3RvciwgdGhpcy5uZ0NvbXBvbmVudE91dGxldENvbnRlbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX21vZHVsZVJlZikKICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTsKICAgIH0KfQpOZ0NvbXBvbmVudE91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIE5nQ29tcG9uZW50T3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ29tcG9uZW50T3V0bGV0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpKTsgfTsKTmdDb21wb25lbnRPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdDb21wb25lbnRPdXRsZXQsIHNlbGVjdG9yczogW1siIiwgIm5nQ29tcG9uZW50T3V0bGV0IiwgIiJdXSwgaW5wdXRzOiB7IG5nQ29tcG9uZW50T3V0bGV0OiAibmdDb21wb25lbnRPdXRsZXQiLCBuZ0NvbXBvbmVudE91dGxldEluamVjdG9yOiAibmdDb21wb25lbnRPdXRsZXRJbmplY3RvciIsIG5nQ29tcG9uZW50T3V0bGV0Q29udGVudDogIm5nQ29tcG9uZW50T3V0bGV0Q29udGVudCIsIG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5OiAibmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0NvbXBvbmVudE91dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9Cl07Ck5nQ29tcG9uZW50T3V0bGV0LnByb3BEZWNvcmF0b3JzID0gewogICAgbmdDb21wb25lbnRPdXRsZXQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBuZ0NvbXBvbmVudE91dGxldENvbnRlbnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3Rvcnk6IFt7IHR5cGU6IElucHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfZm9yX29mLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVCwgVQogKi8KY2xhc3MgTmdGb3JPZkNvbnRleHQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99ICRpbXBsaWNpdAogICAgICogQHBhcmFtIHs/fSBuZ0Zvck9mCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IGNvdW50CiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKCRpbXBsaWNpdCwgbmdGb3JPZiwgaW5kZXgsIGNvdW50KSB7CiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAkaW1wbGljaXQ7CiAgICAgICAgdGhpcy5uZ0Zvck9mID0gbmdGb3JPZjsKICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgZmlyc3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBsYXN0KCkgewogICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSB0aGlzLmNvdW50IC0gMTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0IGV2ZW4oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggJSAyID09PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXQgb2RkKCkgewogICAgICAgIHJldHVybiAhdGhpcy5ldmVuOwogICAgfQp9Ci8qKgogKiBBIFtzdHJ1Y3R1cmFsIGRpcmVjdGl2ZV0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKSB0aGF0IHJlbmRlcnMKICogYSB0ZW1wbGF0ZSBmb3IgZWFjaCBpdGVtIGluIGEgY29sbGVjdGlvbi4KICogVGhlIGRpcmVjdGl2ZSBpcyBwbGFjZWQgb24gYW4gZWxlbWVudCwgd2hpY2ggYmVjb21lcyB0aGUgcGFyZW50CiAqIG9mIHRoZSBjbG9uZWQgdGVtcGxhdGVzLgogKgogKiBUaGUgYG5nRm9yT2ZgIGRpcmVjdGl2ZSBpcyBnZW5lcmFsbHkgdXNlZCBpbiB0aGUKICogW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIGAqbmdGb3JgLgogKiBJbiB0aGlzIGZvcm0sIHRoZSB0ZW1wbGF0ZSB0byBiZSByZW5kZXJlZCBmb3IgZWFjaCBpdGVyYXRpb24gaXMgdGhlIGNvbnRlbnQKICogb2YgYW4gYW5jaG9yIGVsZW1lbnQgY29udGFpbmluZyB0aGUgZGlyZWN0aXZlLgogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHNob3J0aGFuZCBzeW50YXggd2l0aCBzb21lIG9wdGlvbnMsCiAqIGNvbnRhaW5lZCBpbiBhbiBgPGxpPmAgZWxlbWVudC4KICoKICogYGBgCiAqIDxsaSAqbmdGb3I9ImxldCBpdGVtIG9mIGl0ZW1zOyBpbmRleCBhcyBpOyB0cmFja0J5OiB0cmFja0J5Rm4iPi4uLjwvbGk+CiAqIGBgYAogKgogKiBUaGUgc2hvcnRoYW5kIGZvcm0gZXhwYW5kcyBpbnRvIGEgbG9uZyBmb3JtIHRoYXQgdXNlcyB0aGUgYG5nRm9yT2ZgIHNlbGVjdG9yCiAqIG9uIGFuIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LgogKiBUaGUgY29udGVudCBvZiB0aGUgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQgaXMgdGhlIGA8bGk+YCBlbGVtZW50IHRoYXQgaGVsZCB0aGUKICogc2hvcnQtZm9ybSBkaXJlY3RpdmUuCiAqCiAqIEhlcmUgaXMgdGhlIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIHNob3J0LWZvcm0gZXhhbXBsZS4KICoKICogYGBgCiAqIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09Iml0ZW1zIiBsZXQtaT0iaW5kZXgiIFtuZ0ZvclRyYWNrQnldPSJ0cmFja0J5Rm4iPgogKiAgIDxsaT4uLi48L2xpPgogKiA8L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IGV4cGFuZHMgdGhlIHNob3J0aGFuZCBzeW50YXggYXMgaXQgY29tcGlsZXMgdGhlIHRlbXBsYXRlLgogKiBUaGUgY29udGV4dCBmb3IgZWFjaCBlbWJlZGRlZCB2aWV3IGlzIGxvZ2ljYWxseSBtZXJnZWQgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50CiAqIGNvbnRleHQgYWNjb3JkaW5nIHRvIGl0cyBsZXhpY2FsIHBvc2l0aW9uLgogKgogKiBXaGVuIHVzaW5nIHRoZSBzaG9ydGhhbmQgc3ludGF4LCBBbmd1bGFyIGFsbG93cyBvbmx5IFtvbmUgc3RydWN0dXJhbCBkaXJlY3RpdmUKICogb24gYW4gZWxlbWVudF0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1zdHJ1Y3R1cmFsLWRpcmVjdGl2ZS1wZXItaG9zdC1lbGVtZW50KS4KICogSWYgeW91IHdhbnQgdG8gaXRlcmF0ZSBjb25kaXRpb25hbGx5LCBmb3IgZXhhbXBsZSwKICogcHV0IHRoZSBgKm5nSWZgIG9uIGEgY29udGFpbmVyIGVsZW1lbnQgdGhhdCB3cmFwcyB0aGUgYCpuZ0ZvcmAgZWxlbWVudC4KICogRm9yIGZ1dGhlciBkaXNjdXNzaW9uLCBzZWUKICogW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1wZXItZWxlbWVudCkuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgTG9jYWwgdmFyaWFibGVzCiAqCiAqIGBOZ0Zvck9mYCBwcm92aWRlcyBleHBvcnRlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXMuCiAqIEZvciBleGFtcGxlOgogKgogKiAgYGBgCiAqIDxsaSAqbmdGb3I9ImxldCB1c2VyIG9mIHVzZXJzOyBpbmRleCBhcyBpOyBmaXJzdCBhcyBpc0ZpcnN0Ij4KICogICAge3tpfX0ve3t1c2Vycy5sZW5ndGh9fS4ge3t1c2VyfX0gPHNwYW4gKm5nSWY9ImlzRmlyc3QiPmRlZmF1bHQ8L3NwYW4+CiAqIDwvbGk+CiAqIGBgYAogKgogKiBUaGUgZm9sbG93aW5nIGV4cG9ydGVkIHZhbHVlcyBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXM6CiAqCiAqIC0gYCRpbXBsaWNpdDogVGA6IFRoZSB2YWx1ZSBvZiB0aGUgaW5kaXZpZHVhbCBpdGVtcyBpbiB0aGUgaXRlcmFibGUgKGBuZ0Zvck9mYCkuCiAqIC0gYG5nRm9yT2Y6IE5nSXRlcmFibGU8VD5gOiBUaGUgdmFsdWUgb2YgdGhlIGl0ZXJhYmxlIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHRoZSBleHByZXNzaW9uIGlzCiAqIG1vcmUgY29tcGxleCB0aGVuIGEgcHJvcGVydHkgYWNjZXNzLCBmb3IgZXhhbXBsZSB3aGVuIHVzaW5nIHRoZSBhc3luYyBwaXBlIChgdXNlclN0cmVhbXMgfAogKiBhc3luY2ApLgogKiAtIGBpbmRleDogbnVtYmVyYDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhYmxlLgogKiAtIGBjb3VudDogbnVtYmVyYDogVGhlIGxlbmd0aCBvZiB0aGUgaXRlcmFibGUuCiAqIC0gYGZpcnN0OiBib29sZWFuYDogVHJ1ZSB3aGVuIHRoZSBpdGVtIGlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICogLSBgbGFzdDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICogLSBgZXZlbjogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBoYXMgYW4gZXZlbiBpbmRleCBpbiB0aGUgaXRlcmFibGUuCiAqIC0gYG9kZDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBoYXMgYW4gb2RkIGluZGV4IGluIHRoZSBpdGVyYWJsZS4KICoKICogIyMjIENoYW5nZSBwcm9wYWdhdGlvbgogKgogKiBXaGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRlcmF0b3IgY2hhbmdlcywgYE5nRm9yT2ZgIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIERPTToKICoKICogKiBXaGVuIGFuIGl0ZW0gaXMgYWRkZWQsIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBpcyBhZGRlZCB0byB0aGUgRE9NLgogKiAqIFdoZW4gYW4gaXRlbSBpcyByZW1vdmVkLCBpdHMgdGVtcGxhdGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCiAqICogV2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkLCB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlcyBhcmUgcmVvcmRlcmVkIGluIHRoZSBET00uCiAqCiAqIEFuZ3VsYXIgdXNlcyBvYmplY3QgaWRlbnRpdHkgdG8gdHJhY2sgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIHdpdGhpbiB0aGUgaXRlcmF0b3IgYW5kIHJlcHJvZHVjZQogKiB0aG9zZSBjaGFuZ2VzIGluIHRoZSBET00uIFRoaXMgaGFzIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgZm9yIGFuaW1hdGlvbnMgYW5kIGFueSBzdGF0ZWZ1bAogKiBjb250cm9scyB0aGF0IGFyZSBwcmVzZW50LCBzdWNoIGFzIGA8aW5wdXQ+YCBlbGVtZW50cyB0aGF0IGFjY2VwdCB1c2VyIGlucHV0LiBJbnNlcnRlZCByb3dzIGNhbgogKiBiZSBhbmltYXRlZCBpbiwgZGVsZXRlZCByb3dzIGNhbiBiZSBhbmltYXRlZCBvdXQsIGFuZCB1bmNoYW5nZWQgcm93cyByZXRhaW4gYW55IHVuc2F2ZWQgc3RhdGUKICogc3VjaCBhcyB1c2VyIGlucHV0LgogKiBGb3IgbW9yZSBvbiBhbmltYXRpb25zLCBzZWUgW1RyYW5zaXRpb25zIGFuZCBUcmlnZ2Vyc10oZ3VpZGUvdHJhbnNpdGlvbi1hbmQtdHJpZ2dlcnMpLgogKgogKiBUaGUgaWRlbnRpdGllcyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgY2FuIGNoYW5nZSB3aGlsZSB0aGUgZGF0YSBkb2VzIG5vdC4KICogVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIGlzIHByb2R1Y2VkIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0CiAqIFJQQyBpcyByZS1ydW4uIEV2ZW4gaWYgdGhlIGRhdGEgaGFzbid0IGNoYW5nZWQsIHRoZSBzZWNvbmQgcmVzcG9uc2UgcHJvZHVjZXMgb2JqZWN0cyB3aXRoCiAqIGRpZmZlcmVudCBpZGVudGl0aWVzLCBhbmQgQW5ndWxhciBtdXN0IHRlYXIgZG93biB0aGUgZW50aXJlIERPTSBhbmQgcmVidWlsZCBpdCAoYXMgaWYgYWxsIG9sZAogKiBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgYW5kIGFsbCBuZXcgZWxlbWVudHMgaW5zZXJ0ZWQpLgogKgogKiBUbyBhdm9pZCB0aGlzIGV4cGVuc2l2ZSBvcGVyYXRpb24sIHlvdSBjYW4gY3VzdG9taXplIHRoZSBkZWZhdWx0IHRyYWNraW5nIGFsZ29yaXRobS4KICogYnkgc3VwcGx5aW5nIHRoZSBgdHJhY2tCeWAgb3B0aW9uIHRvIGBOZ0Zvck9mYC4KICogYHRyYWNrQnlgIHRha2VzIGEgZnVuY3Rpb24gdGhhdCBoYXMgdHdvIGFyZ3VtZW50czogYGluZGV4YCBhbmQgYGl0ZW1gLgogKiBJZiBgdHJhY2tCeWAgaXMgZ2l2ZW4sIEFuZ3VsYXIgdHJhY2tzIGNoYW5nZXMgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uCiAqCiAqIEBzZWUgW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKQogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVCwgVQogKi8KY2xhc3MgTmdGb3JPZiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gX3RlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyLCBfdGVtcGxhdGUsIF9kaWZmZXJzKSB7CiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lciA9IF92aWV3Q29udGFpbmVyOwogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gX3RlbXBsYXRlOwogICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICB0aGlzLl9uZ0Zvck9mID0gbnVsbDsKICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSB0cnVlOwogICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaXRlcmFibGUgZXhwcmVzc2lvbiwgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYQogICAgICogW3RlbXBsYXRlIGlucHV0IHZhcmlhYmxlXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGVtcGxhdGUtaW5wdXQtdmFyaWFibGUpLgogICAgICogQHBhcmFtIHs/fSBuZ0Zvck9mCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdGb3JPZihuZ0Zvck9mKSB7CiAgICAgICAgdGhpcy5fbmdGb3JPZiA9IG5nRm9yT2Y7CiAgICAgICAgdGhpcy5fbmdGb3JPZkRpcnR5ID0gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIHRyYWNrIGNoYW5nZXMgZm9yIGl0ZW1zIGluIHRoZSBpdGVyYWJsZS4KICAgICAqCiAgICAgKiBXaGVuIGl0ZW1zIGFyZSBhZGRlZCwgbW92ZWQsIG9yIHJlbW92ZWQgaW4gdGhlIGl0ZXJhYmxlLAogICAgICogdGhlIGRpcmVjdGl2ZSBtdXN0IHJlLXJlbmRlciB0aGUgYXBwcm9wcmlhdGUgRE9NIG5vZGVzLgogICAgICogVG8gbWluaW1pemUgY2h1cm4gaW4gdGhlIERPTSwgb25seSBub2RlcyB0aGF0IGhhdmUgY2hhbmdlZAogICAgICogYXJlIHJlLXJlbmRlcmVkLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYXNzdW1lcyB0aGF0CiAgICAgKiB0aGUgb2JqZWN0IGluc3RhbmNlIGlkZW50aWZpZXMgdGhlIG5vZGUgaW4gdGhlIGl0ZXJhYmxlLgogICAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLCB0aGUgZGlyZWN0aXZlIHVzZXMKICAgICAqIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRvIGlkZW50aWZ5IHRoZSBpdGVtIG5vZGUsCiAgICAgKiByYXRoZXIgdGhhbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdCBpdHNlbGYuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHR3byBpbnB1dHMsCiAgICAgKiB0aGUgaXRlcmF0aW9uIGluZGV4IGFuZCB0aGUgbm9kZSBvYmplY3QgSUQuCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdGb3JUcmFja0J5KGZuKSB7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIGZuICE9IG51bGwgJiYgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6IHVzZSBhIGxvZyBzZXJ2aWNlIG9uY2UgdGhlcmUgaXMgYSBwdWJsaWMgb25lIGF2YWlsYWJsZQogICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnNvbGUpKSAmJiAoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS53YXJuKSkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgdHJhY2tCeSBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGZuKX0uIGAgKwogICAgICAgICAgICAgICAgICAgIGBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vTmdGb3JPZiNjaGFuZ2UtcHJvcGFnYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fdHJhY2tCeUZuID0gZm47CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldCBuZ0ZvclRyYWNrQnkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrQnlGbjsKICAgIH0KICAgIC8qKgogICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRlbXBsYXRlIHRoYXQgaXMgc3RhbXBlZCBvdXQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUuCiAgICAgKiBAc2VlIFt0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGVdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCN0ZW1wbGF0ZS1yZWZlcmVuY2UtdmFyaWFibGVzLS12YXItKQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0IG5nRm9yVGVtcGxhdGUodmFsdWUpIHsKICAgICAgICAvLyBUT0RPKFRTMi4xKTogbWFrZSBUZW1wbGF0ZVJlZjxQYXJ0aWFsPE5nRm9yUm93T2Y8VD4+PiBvbmNlIHdlIG1vdmUgdG8gVFMgdjIuMQogICAgICAgIC8vIFRoZSBjdXJyZW50IHR5cGUgaXMgdG9vIHJlc3RyaWN0aXZlOyBhIHRlbXBsYXRlIHRoYXQganVzdCB1c2VzIGluZGV4LCBmb3IgZXhhbXBsZSwKICAgICAgICAvLyBzaG91bGQgYmUgYWNjZXB0YWJsZS4KICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFwcGxpZXMgdGhlIGNoYW5nZXMgd2hlbiBuZWVkZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgaWYgKHRoaXMuX25nRm9yT2ZEaXJ0eSkgewogICAgICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUmVhY3Qgb24gbmdGb3JPZiBjaGFuZ2VzIG9ubHkgb25jZSBhbGwgaW5wdXRzIGhhdmUgYmVlbiBpbml0aWFsaXplZAogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbmdGb3JPZjsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5uZ0ZvclRyYWNrQnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt2YWx1ZX0nIG9mIHR5cGUgJyR7Z2V0VHlwZU5hbWUkMSh2YWx1ZSl9Jy4gTmdGb3Igb25seSBzdXBwb3J0cyBiaW5kaW5nIHRvIEl0ZXJhYmxlcyBzdWNoIGFzIEFycmF5cy5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fZGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX25nRm9yT2YpOwogICAgICAgICAgICBpZiAoY2hhbmdlcykKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnNlcnRUdXBsZXMgPSBbXTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEBwYXJhbSB7P30gYWRqdXN0ZWRQcmV2aW91c0luZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50SW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChpdGVtLCBhZGp1c3RlZFByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCkgPT4gewogICAgICAgICAgICBpZiAoaXRlbS5wcmV2aW91c0luZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIE5nRm9yT2YgaXMgbmV2ZXIgIm51bGwiIG9yICJ1bmRlZmluZWQiIGhlcmUgYmVjYXVzZSB0aGUgZGlmZmVyIGRldGVjdGVkCiAgICAgICAgICAgICAgICAvLyB0aGF0IGEgbmV3IGl0ZW0gbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgZnJvbSB0aGUgaXRlcmFibGUuIFRoaXMgaW1wbGllcyB0aGF0CiAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBpdGVyYWJsZSB2YWx1ZSBmb3IgIl9uZ0Zvck9mIi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZSwgbmV3IE5nRm9yT2ZDb250ZXh0KCgvKiogQHR5cGUgez99ICovIChudWxsKSksICgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ0Zvck9mKSksIC0xLCAtMSksIGN1cnJlbnRJbmRleCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGN1cnJlbnRJbmRleCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0dXBsZSA9IG5ldyBSZWNvcmRWaWV3VHVwbGUoaXRlbSwgdmlldyk7CiAgICAgICAgICAgICAgICBpbnNlcnRUdXBsZXMucHVzaCh0dXBsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIucmVtb3ZlKGFkanVzdGVkUHJldmlvdXNJbmRleCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGFkanVzdGVkUHJldmlvdXNJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYWRqdXN0ZWRQcmV2aW91c0luZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KGFkanVzdGVkUHJldmlvdXNJbmRleCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIubW92ZSh2aWV3LCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHVwbGUgPSBuZXcgUmVjb3JkVmlld1R1cGxlKGl0ZW0sICgvKiogQHR5cGUgez99ICovICh2aWV3KSkpOwogICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2godHVwbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuX3BlclZpZXdDaGFuZ2UoaW5zZXJ0VHVwbGVzW2ldLnZpZXcsIGluc2VydFR1cGxlc1tpXS5yZWNvcmQpOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld1JlZiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyLmdldChpKSkpOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuaW5kZXggPSBpOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuY291bnQgPSBpbGVuOwogICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQubmdGb3JPZiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ0Zvck9mKSk7CiAgICAgICAgfQogICAgICAgIGNoYW5nZXMuZm9yRWFjaElkZW50aXR5Q2hhbmdlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld0NvbnRhaW5lci5nZXQocmVjb3JkLmN1cnJlbnRJbmRleCkpKTsKICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9wZXJWaWV3Q2hhbmdlKHZpZXcsIHJlY29yZCkgewogICAgICAgIHZpZXcuY29udGV4dC4kaW1wbGljaXQgPSByZWNvcmQuaXRlbTsKICAgIH0KICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgdGVtcGxhdGUgdGhhdCBgTmdGb3JPZmAgd2lsbCByZW5kZXIuCiAgICAgKgogICAgICogVGhlIHByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgc2lnbmFsIHRvIHRoZSBJdnkgdGVtcGxhdGUgdHlwZS1jaGVjayBjb21waWxlciB0aGF0IHRoZQogICAgICogYE5nRm9yT2ZgIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHJlbmRlcnMgaXRzIHRlbXBsYXRlIHdpdGggYSBzcGVjaWZpYyBjb250ZXh0IHR5cGUuCiAgICAgKiBAdGVtcGxhdGUgVCwgVQogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXIsIGN0eCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ck5nRm9yT2YuybVmYWMgPSBmdW5jdGlvbiBOZ0Zvck9mX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nRm9yT2YpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEl0ZXJhYmxlRGlmZmVycykpOyB9OwpOZ0Zvck9mLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nRm9yT2YsIHNlbGVjdG9yczogW1siIiwgIm5nRm9yIiwgIiIsICJuZ0Zvck9mIiwgIiJdXSwgaW5wdXRzOiB7IG5nRm9yT2Y6ICJuZ0Zvck9mIiwgbmdGb3JUcmFja0J5OiAibmdGb3JUcmFja0J5IiwgbmdGb3JUZW1wbGF0ZTogIm5nRm9yVGVtcGxhdGUiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0Zvck9mLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IEl0ZXJhYmxlRGlmZmVycyB9Cl07Ck5nRm9yT2YucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ0Zvck9mOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5nRm9yVHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICBuZ0ZvclRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKioKICogQHRlbXBsYXRlIFQsIFUKICovCmNsYXNzIFJlY29yZFZpZXdUdXBsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqLwogICAgY29uc3RydWN0b3IocmVjb3JkLCB2aWV3KSB7CiAgICAgICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7CiAgICAgICAgdGhpcy52aWV3ID0gdmlldzsKICAgIH0KfQovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRUeXBlTmFtZSQxKHR5cGUpIHsKICAgIHJldHVybiB0eXBlWyduYW1lJ10gfHwgdHlwZW9mIHR5cGU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19pZi50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQSBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB0aGF0IGNvbmRpdGlvbmFsbHkgaW5jbHVkZXMgYSB0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YKICogYW4gZXhwcmVzc2lvbiBjb2VyY2VkIHRvIEJvb2xlYW4uCiAqIFdoZW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUsIEFuZ3VsYXIgcmVuZGVycyB0aGUgdGVtcGxhdGUKICogcHJvdmlkZWQgaW4gYSBgdGhlbmAgY2xhdXNlLCBhbmQgd2hlbiAgZmFsc2Ugb3IgbnVsbCwKICogQW5ndWxhciByZW5kZXJzIHRoZSB0ZW1wbGF0ZSBwcm92aWRlZCBpbiBhbiBvcHRpb25hbCBgZWxzZWAgY2xhdXNlLiBUaGUgZGVmYXVsdAogKiB0ZW1wbGF0ZSBmb3IgdGhlIGBlbHNlYCBjbGF1c2UgaXMgYmxhbmsuCiAqCiAqIEEgW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIG9mIHRoZSBkaXJlY3RpdmUsCiAqIGAqbmdJZj0iY29uZGl0aW9uImAsIGlzIGdlbmVyYWxseSB1c2VkLCBwcm92aWRlZAogKiBhcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGFuY2hvciBlbGVtZW50IGZvciB0aGUgaW5zZXJ0ZWQgdGVtcGxhdGUuCiAqIEFuZ3VsYXIgZXhwYW5kcyB0aGlzIGludG8gYSBtb3JlIGV4cGxpY2l0IHZlcnNpb24sIGluIHdoaWNoIHRoZSBhbmNob3IgZWxlbWVudAogKiBpcyBjb250YWluZWQgaW4gYW4gYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuCiAqCiAqIFNpbXBsZSBmb3JtIHdpdGggc2hvcnRoYW5kIHN5bnRheDoKICoKICogYGBgCiAqIDxkaXYgKm5nSWY9ImNvbmRpdGlvbiI+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgdHJ1ZS48L2Rpdj4KICogYGBgCiAqCiAqIFNpbXBsZSBmb3JtIHdpdGggZXhwYW5kZWQgc3ludGF4OgogKgogKiBgYGAKICogPG5nLXRlbXBsYXRlIFtuZ0lmXT0iY29uZGl0aW9uIj48ZGl2PkNvbnRlbnQgdG8gcmVuZGVyIHdoZW4gY29uZGl0aW9uIGlzCiAqIHRydWUuPC9kaXY+PC9uZy10ZW1wbGF0ZT4KICogYGBgCiAqCiAqIEZvcm0gd2l0aCBhbiAiZWxzZSIgYmxvY2s6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb247IGVsc2UgZWxzZUJsb2NrIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PgogKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogU2hvcnRoYW5kIGZvcm0gd2l0aCAidGhlbiIgYW5kICJlbHNlIiBibG9ja3M6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb247IHRoZW4gdGhlbkJsb2NrIGVsc2UgZWxzZUJsb2NrIj48L2Rpdj4KICogPG5nLXRlbXBsYXRlICN0aGVuQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgdHJ1ZS48L25nLXRlbXBsYXRlPgogKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogRm9ybSB3aXRoIHN0b3JpbmcgdGhlIHZhbHVlIGxvY2FsbHk6CiAqCiAqIGBgYAogKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb24gYXMgdmFsdWU7IGVsc2UgZWxzZUJsb2NrIj57e3ZhbHVlfX08L2Rpdj4KICogPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiB2YWx1ZSBpcyBudWxsLjwvbmctdGVtcGxhdGU+CiAqIGBgYAogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGAqbmdJZmAgZGlyZWN0aXZlIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBjb25kaXRpb25hbGx5IHNob3cgYW4gaW5saW5lIHRlbXBsYXRlLAogKiBhcyBzZWVuIGluIHRoZSBmb2xsb3dpbmcgIGV4YW1wbGUuCiAqIFRoZSBkZWZhdWx0IGBlbHNlYCB0ZW1wbGF0ZSBpcyBibGFuay4KICoKICoge1xAZXhhbXBsZSBjb21tb24vbmdJZi90cy9tb2R1bGUudHMgcmVnaW9uPSdOZ0lmU2ltcGxlJ30KICoKICogIyMjIFNob3dpbmcgYW4gYWx0ZXJuYXRpdmUgdGVtcGxhdGUgdXNpbmcgYGVsc2VgCiAqCiAqIFRvIGRpc3BsYXkgYSB0ZW1wbGF0ZSB3aGVuIGBleHByZXNzaW9uYCBldmFsdWF0ZXMgdG8gZmFsc2UsIHVzZSBhbiBgZWxzZWAgdGVtcGxhdGUKICogYmluZGluZyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCiAqIFRoZSBgZWxzZWAgYmluZGluZyBwb2ludHMgdG8gYW4gYDxuZy10ZW1wbGF0ZT5gICBlbGVtZW50IGxhYmVsZWQgYCNlbHNlQmxvY2tgLgogKiBUaGUgdGVtcGxhdGUgY2FuIGJlIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIGNvbXBvbmVudCB2aWV3LCBidXQgaXMgdHlwaWNhbGx5IHBsYWNlZCByaWdodCBhZnRlcgogKiBgbmdJZmAgZm9yIHJlYWRhYmlsaXR5LgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZFbHNlJ30KICoKICogIyMjIFVzaW5nIGFuIGV4dGVybmFsIGB0aGVuYCB0ZW1wbGF0ZQogKgogKiBJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIHRoZW4tY2xhdXNlIHRlbXBsYXRlIGlzIHNwZWNpZmllZCBpbmxpbmUsIGFzIHRoZSBjb250ZW50IG9mIHRoZQogKiB0YWcgdGhhdCBjb250YWlucyB0aGUgYG5nSWZgIGRpcmVjdGl2ZS4gWW91IGNhbiBhbHNvIHNwZWNpZnkgYSB0ZW1wbGF0ZSB0aGF0IGlzIGRlZmluZWQKICogZXh0ZXJuYWxseSwgYnkgcmVmZXJlbmNpbmcgYSBsYWJlbGVkIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LiBXaGVuIHlvdSBkbyB0aGlzLCB5b3UgY2FuCiAqIGNoYW5nZSB3aGljaCB0ZW1wbGF0ZSB0byB1c2UgYXQgcnVudGltZSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZUaGVuRWxzZSd9CiAqCiAqICMjIyBTdG9yaW5nIGEgY29uZGl0aW9uYWwgcmVzdWx0IGluIGEgdmFyaWFibGUKICoKICogWW91IG1pZ2h0IHdhbnQgdG8gc2hvdyBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNhbWUgb2JqZWN0LiBJZiB5b3UgYXJlIHdhaXRpbmcKICogZm9yIGFzeW5jaHJvbm91cyBkYXRhLCB0aGUgb2JqZWN0IGNhbiBiZSB1bmRlZmluZWQuCiAqIEluIHRoaXMgY2FzZSwgeW91IGNhbiB1c2UgYG5nSWZgIGFuZCBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24gaW4gYSBsb2NhbAogKiB2YXJpYWJsZSBhcyBzaG93biBpbiB0aGUgdGhlIGZvbGxvd2luZyBleGFtcGxlLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ0lmL3RzL21vZHVsZS50cyByZWdpb249J05nSWZBcyd9CiAqCiAqIFRoaXMgY29kZSB1c2VzIG9ubHkgb25lIGBBc3luY1BpcGVgLCBzbyBvbmx5IG9uZSBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZC4KICogVGhlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBgdXNlclN0cmVhbXxhc3luY2AgaW4gdGhlIGxvY2FsIHZhcmlhYmxlIGB1c2VyYC4KICogWW91IGNhbiB0aGVuIGJpbmQgdGhlIGxvY2FsIGB1c2VyYCByZXBlYXRlZGx5LgogKgogKiBUaGUgY29uZGl0aW9uYWwgZGlzcGxheXMgdGhlIGRhdGEgb25seSBpZiBgdXNlclN0cmVhbWAgcmV0dXJucyBhIHZhbHVlLAogKiBzbyB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhlCiAqIFtzYWZlLW5hdmlnYXRpb24tb3BlcmF0b3JdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCNzYWZlLW5hdmlnYXRpb24tb3BlcmF0b3IpIChgPy5gKQogKiB0byBndWFyZCBhZ2FpbnN0IG51bGwgdmFsdWVzIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXMuCiAqIFlvdSBjYW4gZGlzcGxheSBhbiBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZGF0YS4KICoKICogIyMjIFNob3J0aGFuZCBzeW50YXgKICoKICogVGhlIHNob3J0aGFuZCBzeW50YXggYCpuZ0lmYCBleHBhbmRzIGludG8gdHdvIHNlcGFyYXRlIHRlbXBsYXRlIHNwZWNpZmljYXRpb25zCiAqIGZvciB0aGUgInRoZW4iIGFuZCAiZWxzZSIgY2xhdXNlcy4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc2hvcnRoYW5kIHN0YXRlbWVudCwKICogdGhhdCBpcyBtZWFudCB0byBzaG93IGEgbG9hZGluZyBwYWdlIHdoaWxlIHdhaXRpbmcgZm9yIGRhdGEgdG8gYmUgbG9hZGVkLgogKgogKiBgYGAKICogPGRpdiBjbGFzcz0iaGVyby1saXN0IiAqbmdJZj0iaGVyb2VzIGVsc2UgbG9hZGluZyI+CiAqICAuLi4KICogPC9kaXY+CiAqCiAqIDxuZy10ZW1wbGF0ZSAjbG9hZGluZz4KICogIDxkaXY+TG9hZGluZy4uLjwvZGl2PgogKiA8L25nLXRlbXBsYXRlPgogKiBgYGAKICoKICogWW91IGNhbiBzZWUgdGhhdCB0aGUgImVsc2UiIGNsYXVzZSByZWZlcmVuY2VzIHRoZSBgPG5nLXRlbXBsYXRlPmAKICogd2l0aCB0aGUgYCNsb2FkaW5nYCBsYWJlbCwgYW5kIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlICJ0aGVuIiBjbGF1c2UKICogaXMgcHJvdmlkZWQgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIGFuY2hvciBlbGVtZW50LgogKgogKiBIb3dldmVyLCB3aGVuIEFuZ3VsYXIgZXhwYW5kcyB0aGUgc2hvcnRoYW5kIHN5bnRheCwgaXQgY3JlYXRlcwogKiBhbm90aGVyIGA8bmctdGVtcGxhdGU+YCB0YWcsIHdpdGggYG5nSWZgIGFuZCBgbmdJZkVsc2VgIGRpcmVjdGl2ZXMuCiAqIFRoZSBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlICJ0aGVuIiBjbGF1c2UgYmVjb21lcwogKiB0aGUgY29udGVudCBvZiB0aGlzIHVubGFiZWxlZCBgPG5nLXRlbXBsYXRlPmAgdGFnLgogKgogKiBgYGAKICogPG5nLXRlbXBsYXRlIFtuZ0lmXT0iaGVyb2VzIiBbbmdJZkVsc2VdPSJsb2FkaW5nIj4KICogIDxkaXYgY2xhc3M9Imhlcm8tbGlzdCI+CiAqICAgLi4uCiAqICA8L2Rpdj4KICogPC9uZy10ZW1wbGF0ZT4KICoKICogPG5nLXRlbXBsYXRlICNsb2FkaW5nPgogKiAgPGRpdj5Mb2FkaW5nLi4uPC9kaXY+CiAqIDwvbmctdGVtcGxhdGU+CiAqIGBgYAogKgogKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcGxpY2l0IHRlbXBsYXRlIG9iamVjdCBoYXMgaW1wbGljYXRpb25zIGZvciB0aGUgbmVzdGluZyBvZgogKiBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMuIEZvciBtb3JlIG9uIHRoaXMgc3ViamVjdCwgc2VlCiAqIFtTdHJ1Y3R1cmFsIERpcmVjdGl2ZXNdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjb25lLXBlci1lbGVtZW50KS4KICoKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBwdWJsaWNBcGkKICogQHRlbXBsYXRlIFQKICovCmNsYXNzIE5nSWYgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZikgewogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIgPSBfdmlld0NvbnRhaW5lcjsKICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV3IE5nSWZDb250ZXh0KCk7CiAgICAgICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9lbHNlVGVtcGxhdGVSZWYgPSBudWxsOwogICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0gbnVsbDsKICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7CiAgICAgICAgdGhpcy5fdGhlblRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBCb29sZWFuIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUgYXMgdGhlIGNvbmRpdGlvbiBmb3Igc2hvd2luZyBhIHRlbXBsYXRlLgogICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ0lmKGNvbmRpdGlvbikgewogICAgICAgIHRoaXMuX2NvbnRleHQuJGltcGxpY2l0ID0gdGhpcy5fY29udGV4dC5uZ0lmID0gY29uZGl0aW9uOwogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4KICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ0lmVGhlbih0ZW1wbGF0ZVJlZikgewogICAgICAgIGFzc2VydFRlbXBsYXRlKCduZ0lmVGhlbicsIHRlbXBsYXRlUmVmKTsKICAgICAgICB0aGlzLl90aGVuVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjsKICAgICAgICB0aGlzLl90aGVuVmlld1JlZiA9IG51bGw7IC8vIGNsZWFyIHByZXZpb3VzIHZpZXcgaWYgYW55LgogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSB0byBzaG93IGlmIHRoZSBjb25kaXRpb24gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdJZkVsc2UodGVtcGxhdGVSZWYpIHsKICAgICAgICBhc3NlcnRUZW1wbGF0ZSgnbmdJZkVsc2UnLCB0ZW1wbGF0ZVJlZik7CiAgICAgICAgdGhpcy5fZWxzZVRlbXBsYXRlUmVmID0gdGVtcGxhdGVSZWY7CiAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOyAvLyBjbGVhciBwcmV2aW91cyB2aWV3IGlmIGFueS4KICAgICAgICB0aGlzLl91cGRhdGVWaWV3KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmlldygpIHsKICAgICAgICBpZiAodGhpcy5fY29udGV4dC4kaW1wbGljaXQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl90aGVuVmlld1JlZikgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RoZW5UZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGhlblRlbXBsYXRlUmVmLCB0aGlzLl9jb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9lbHNlVmlld1JlZikgewogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5fdGhlblZpZXdSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vsc2VWaWV3UmVmID0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fZWxzZVRlbXBsYXRlUmVmLCB0aGlzLl9jb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgdGVtcGxhdGUgdGhhdCBgTmdJZmAgd2lsbCByZW5kZXIuCiAgICAgKgogICAgICogVGhlIHByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGlzIGEgc2lnbmFsIHRvIHRoZSBJdnkgdGVtcGxhdGUgdHlwZS1jaGVjayBjb21waWxlciB0aGF0IHRoZQogICAgICogYE5nSWZgIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHJlbmRlcnMgaXRzIHRlbXBsYXRlIHdpdGggYSBzcGVjaWZpYyBjb250ZXh0IHR5cGUuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXIsIGN0eCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Ck5nSWYuybVmYWMgPSBmdW5jdGlvbiBOZ0lmX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nSWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpKTsgfTsKTmdJZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ0lmLCBzZWxlY3RvcnM6IFtbIiIsICJuZ0lmIiwgIiJdXSwgaW5wdXRzOiB7IG5nSWY6ICJuZ0lmIiwgbmdJZlRoZW46ICJuZ0lmVGhlbiIsIG5nSWZFbHNlOiAibmdJZkVsc2UiIH0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ0lmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0KXTsKTmdJZi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5nSWY6IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdJZlRoZW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgbmdJZkVsc2U6IFt7IHR5cGU6IElucHV0IH1dCn07Ci8qKgogKiBcQHB1YmxpY0FwaQogKiBAdGVtcGxhdGUgVAogKi8KY2xhc3MgTmdJZkNvbnRleHQgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIHRoaXMubmdJZiA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICB9Cn0KLyoqCiAqIEBwYXJhbSB7P30gcHJvcGVydHkKICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gYXNzZXJ0VGVtcGxhdGUocHJvcGVydHksIHRlbXBsYXRlUmVmKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpc1RlbXBsYXRlUmVmT3JOdWxsID0gISEoIXRlbXBsYXRlUmVmIHx8IHRlbXBsYXRlUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyk7CiAgICBpZiAoIWlzVGVtcGxhdGVSZWZPck51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cHJvcGVydHl9IG11c3QgYmUgYSBUZW1wbGF0ZVJlZiwgYnV0IHJlY2VpdmVkICcke3N0cmluZ2lmeSh0ZW1wbGF0ZVJlZil9Jy5gKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3N3aXRjaC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjbGFzcyBTd2l0Y2hWaWV3IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lclJlZgogICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGVSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYsIF90ZW1wbGF0ZVJlZikgewogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICB0aGlzLl90ZW1wbGF0ZVJlZiA9IF90ZW1wbGF0ZVJlZjsKICAgICAgICB0aGlzLl9jcmVhdGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZSgpIHsKICAgICAgICB0aGlzLl9jcmVhdGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRlc3Ryb3koKSB7CiAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjcmVhdGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmZvcmNlU3RhdGUoY3JlYXRlZCkgewogICAgICAgIGlmIChjcmVhdGVkICYmICF0aGlzLl9jcmVhdGVkKSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCFjcmVhdGVkICYmIHRoaXMuX2NyZWF0ZWQpIHsKICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgfQogICAgfQp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQGRlc2NyaXB0aW9uIEEgc3RydWN0dXJhbCBkaXJlY3RpdmUgdGhhdCBhZGRzIG9yIHJlbW92ZXMgdGVtcGxhdGVzIChkaXNwbGF5aW5nIG9yIGhpZGluZyB2aWV3cykKICogd2hlbiB0aGUgbmV4dCBtYXRjaCBleHByZXNzaW9uIG1hdGNoZXMgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogKgogKiBUaGUgYFtuZ1N3aXRjaF1gIGRpcmVjdGl2ZSBvbiBhIGNvbnRhaW5lciBzcGVjaWZpZXMgYW4gZXhwcmVzc2lvbiB0byBtYXRjaCBhZ2FpbnN0LgogKiBUaGUgZXhwcmVzc2lvbnMgdG8gbWF0Y2ggYXJlIHByb3ZpZGVkIGJ5IGBuZ1N3aXRjaENhc2VgIGRpcmVjdGl2ZXMgb24gdmlld3Mgd2l0aGluIHRoZSBjb250YWluZXIuCiAqIC0gRXZlcnkgdmlldyB0aGF0IG1hdGNoZXMgaXMgcmVuZGVyZWQuCiAqIC0gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsIGEgdmlldyB3aXRoIHRoZSBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgaXMgcmVuZGVyZWQuCiAqIC0gRWxlbWVudHMgd2l0aGluIHRoZSBgW05nU3dpdGNoXWAgc3RhdGVtZW50IGJ1dCBvdXRzaWRlIG9mIGFueSBgTmdTd2l0Y2hDYXNlYAogKiBvciBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgYXJlIHByZXNlcnZlZCBhdCB0aGUgbG9jYXRpb24uCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBEZWZpbmUgYSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIGRpcmVjdGl2ZSwgYW5kIHNwZWNpZnkgdGhlIHN3aXRjaCBleHByZXNzaW9uCiAqIHRvIG1hdGNoIGFnYWluc3QgYXMgYW4gYXR0cmlidXRlOgogKgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogYGBgCiAqCiAqIFdpdGhpbiB0aGUgY29udGFpbmVyLCBgKm5nU3dpdGNoQ2FzZWAgc3RhdGVtZW50cyBzcGVjaWZ5IHRoZSBtYXRjaCBleHByZXNzaW9ucwogKiBhcyBhdHRyaWJ1dGVzLiBJbmNsdWRlIGAqbmdTd2l0Y2hEZWZhdWx0YCBhcyB0aGUgZmluYWwgY2FzZS4KICoKICogYGBgCiAqIDxjb250YWluZXItZWxlbWVudCBbbmdTd2l0Y2hdPSJzd2l0Y2hfZXhwcmVzc2lvbiI+CiAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8xIj4uLi48L3NvbWUtZWxlbWVudD4KICogLi4uCiAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdD4uLi48L3NvbWUtZWxlbWVudD4KICogPC9jb250YWluZXItZWxlbWVudD4KICogYGBgCiAqCiAqICMjIyBVc2FnZSBFeGFtcGxlcwogKgogKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBtb3JlIHRoYW4gb25lIGNhc2UgdG8gZGlzcGxheSB0aGUgc2FtZSB2aWV3OgogKgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogICA8IS0tIHRoZSBzYW1lIHZpZXcgY2FuIGJlIHNob3duIGluIG1vcmUgdGhhbiBvbmUgY2FzZSAtLT4KICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzIiPi4uLjwvc29tZS1lbGVtZW50PgogKiAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8zIj4uLi48L3NvbWUtb3RoZXItZWxlbWVudD4KICogICA8IS0tZGVmYXVsdCBjYXNlIHdoZW4gdGhlcmUgYXJlIG5vIG1hdGNoZXMgLS0+CiAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1lbGVtZW50PgogKiA8L2NvbnRhaW5lci1lbGVtZW50PgogKiBgYGAKICoKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBjYXNlcyBjYW4gYmUgbmVzdGVkOgogKiBgYGAKICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzEiPi4uLjwvc29tZS1lbGVtZW50PgogKiAgICAgICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMiI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqICAgICAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8zIj4uLi48L3NvbWUtb3RoZXItZWxlbWVudD4KICogICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzMiPgogKiAgICAgICAgIDwhLS0gdXNlIGEgbmctY29udGFpbmVyIHRvIGdyb3VwIG11bHRpcGxlIHJvb3Qgbm9kZXMgLS0+CiAqICAgICAgICAgPGlubmVyLWVsZW1lbnQ+PC9pbm5lci1lbGVtZW50PgogKiAgICAgICAgIDxpbm5lci1vdGhlci1lbGVtZW50PjwvaW5uZXItb3RoZXItZWxlbWVudD4KICogICAgICAgPC9uZy1jb250YWluZXI+CiAqICAgICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoRGVmYXVsdD4uLi48L3NvbWUtZWxlbWVudD4KICogICAgIDwvY29udGFpbmVyLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBcQHB1YmxpY0FwaQogKiBAc2VlIGBOZ1N3aXRjaENhc2VgCiAqIEBzZWUgYE5nU3dpdGNoRGVmYXVsdGAKICogQHNlZSBbU3RydWN0dXJhbCBEaXJlY3RpdmVzXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMpCiAqCiAqLwpjbGFzcyBOZ1N3aXRjaCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuX2Nhc2VDb3VudCA9IDA7CiAgICAgICAgdGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID0gMDsKICAgICAgICB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldCBuZ1N3aXRjaChuZXdWYWx1ZSkgewogICAgICAgIHRoaXMuX25nU3dpdGNoID0gbmV3VmFsdWU7CiAgICAgICAgaWYgKHRoaXMuX2Nhc2VDb3VudCA9PT0gMCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXModHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfYWRkQ2FzZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fY2FzZUNvdW50Kys7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2FkZERlZmF1bHQodmlldykgewogICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFZpZXdzKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRWaWV3cyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kZWZhdWx0Vmlld3MucHVzaCh2aWV3KTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX21hdGNoQ2FzZSh2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaGVkID0gdmFsdWUgPT0gdGhpcy5fbmdTd2l0Y2g7CiAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgfHwgbWF0Y2hlZDsKICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXgrKzsKICAgICAgICBpZiAodGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID09PSB0aGlzLl9jYXNlQ291bnQpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGVmYXVsdENhc2VzKCF0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkKTsKICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID0gMDsKICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF0Y2hlZDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdXNlRGVmYXVsdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZURlZmF1bHRDYXNlcyh1c2VEZWZhdWx0KSB7CiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRWaWV3cyAmJiB1c2VEZWZhdWx0ICE9PSB0aGlzLl9kZWZhdWx0VXNlZCkgewogICAgICAgICAgICB0aGlzLl9kZWZhdWx0VXNlZCA9IHVzZURlZmF1bHQ7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGVmYXVsdFZpZXdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0VmlldyA9IHRoaXMuX2RlZmF1bHRWaWV3c1tpXTsKICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3LmVuZm9yY2VTdGF0ZSh1c2VEZWZhdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQpOZ1N3aXRjaC7JtWZhYyA9IGZ1bmN0aW9uIE5nU3dpdGNoX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nU3dpdGNoKSgpOyB9OwpOZ1N3aXRjaC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1N3aXRjaCwgc2VsZWN0b3JzOiBbWyIiLCAibmdTd2l0Y2giLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2g6ICJuZ1N3aXRjaCIgfSB9KTsKTmdTd2l0Y2gucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1N3aXRjaDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAZGVzY3JpcHRpb24KICogUHJvdmlkZXMgYSBzd2l0Y2ggY2FzZSBleHByZXNzaW9uIHRvIG1hdGNoIGFnYWluc3QgYW4gZW5jbG9zaW5nIGBuZ1N3aXRjaGAgZXhwcmVzc2lvbi4KICogV2hlbiB0aGUgZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBnaXZlbiBgTmdTd2l0Y2hDYXNlYCB0ZW1wbGF0ZSBpcyByZW5kZXJlZC4KICogSWYgbXVsdGlwbGUgbWF0Y2ggZXhwcmVzc2lvbnMgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uIHZhbHVlLCBhbGwgb2YgdGhlbSBhcmUgZGlzcGxheWVkLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogV2l0aGluIGEgc3dpdGNoIGNvbnRhaW5lciwgYCpuZ1N3aXRjaENhc2VgIHN0YXRlbWVudHMgc3BlY2lmeSB0aGUgbWF0Y2ggZXhwcmVzc2lvbnMKICogYXMgYXR0cmlidXRlcy4gSW5jbHVkZSBgKm5nU3dpdGNoRGVmYXVsdGAgYXMgdGhlIGZpbmFsIGNhc2UuCiAqCiAqIGBgYAogKiA8Y29udGFpbmVyLWVsZW1lbnQgW25nU3dpdGNoXT0ic3dpdGNoX2V4cHJlc3Npb24iPgogKiAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8xIj4uLi48L3NvbWUtZWxlbWVudD4KICogICAuLi4KICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+CiAqIDwvY29udGFpbmVyLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBFYWNoIHN3aXRjaC1jYXNlIHN0YXRlbWVudCBjb250YWlucyBhbiBpbi1saW5lIEhUTUwgdGVtcGxhdGUgb3IgdGVtcGxhdGUgcmVmZXJlbmNlCiAqIHRoYXQgZGVmaW5lcyB0aGUgc3VidHJlZSB0byBiZSBzZWxlY3RlZCBpZiB0aGUgdmFsdWUgb2YgdGhlIG1hdGNoIGV4cHJlc3Npb24KICogbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogKgogKiBVbmxpa2UgSmF2YVNjcmlwdCwgd2hpY2ggdXNlcyBzdHJpY3QgZXF1YWxpdHksIEFuZ3VsYXIgdXNlcyBsb29zZSBlcXVhbGl0eS4KICogVGhpcyBtZWFucyB0aGF0IHRoZSBlbXB0eSBzdHJpbmcsIGAiImAgbWF0Y2hlcyAwLgogKgogKiBcQHB1YmxpY0FwaQogKiBAc2VlIGBOZ1N3aXRjaGAKICogQHNlZSBgTmdTd2l0Y2hEZWZhdWx0YAogKgogKi8KY2xhc3MgTmdTd2l0Y2hDYXNlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlUmVmCiAgICAgKiBAcGFyYW0gez99IG5nU3dpdGNoCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmLCBuZ1N3aXRjaCkgewogICAgICAgIHRoaXMubmdTd2l0Y2ggPSBuZ1N3aXRjaDsKICAgICAgICBuZ1N3aXRjaC5fYWRkQ2FzZSgpOwogICAgICAgIHRoaXMuX3ZpZXcgPSBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZik7CiAgICB9CiAgICAvKioKICAgICAqIFBlcmZvcm1zIGNhc2UgbWF0Y2hpbmcuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nRG9DaGVjaygpIHsKICAgICAgICB0aGlzLl92aWV3LmVuZm9yY2VTdGF0ZSh0aGlzLm5nU3dpdGNoLl9tYXRjaENhc2UodGhpcy5uZ1N3aXRjaENhc2UpKTsKICAgIH0KfQpOZ1N3aXRjaENhc2UuybVmYWMgPSBmdW5jdGlvbiBOZ1N3aXRjaENhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTd2l0Y2hDYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1N3aXRjaCwgMSkpOyB9OwpOZ1N3aXRjaENhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTd2l0Y2hDYXNlLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N3aXRjaENhc2UiLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2hDYXNlOiAibmdTd2l0Y2hDYXNlIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdTd2l0Y2hDYXNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IE5nU3dpdGNoLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0KXTsKTmdTd2l0Y2hDYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgbmdTd2l0Y2hDYXNlOiBbeyB0eXBlOiBJbnB1dCB9XQp9OwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICoKICogXEBkZXNjcmlwdGlvbgogKgogKiBDcmVhdGVzIGEgdmlldyB0aGF0IGlzIHJlbmRlcmVkIHdoZW4gbm8gYE5nU3dpdGNoQ2FzZWAgZXhwcmVzc2lvbnMKICogbWF0Y2ggdGhlIGBOZ1N3aXRjaGAgZXhwcmVzc2lvbi4KICogVGhpcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIHRoZSBmaW5hbCBjYXNlIGluIGFuIGBOZ1N3aXRjaGAuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBzZWUgYE5nU3dpdGNoYAogKiBAc2VlIGBOZ1N3aXRjaENhc2VgCiAqCiAqLwpjbGFzcyBOZ1N3aXRjaERlZmF1bHQgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAqIEBwYXJhbSB7P30gbmdTd2l0Y2gKICAgICAqLwogICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYsIG5nU3dpdGNoKSB7CiAgICAgICAgbmdTd2l0Y2guX2FkZERlZmF1bHQobmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpKTsKICAgIH0KfQpOZ1N3aXRjaERlZmF1bHQuybVmYWMgPSBmdW5jdGlvbiBOZ1N3aXRjaERlZmF1bHRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTd2l0Y2hEZWZhdWx0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1N3aXRjaCwgMSkpOyB9OwpOZ1N3aXRjaERlZmF1bHQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTd2l0Y2hEZWZhdWx0LCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N3aXRjaERlZmF1bHQiLCAiIl1dIH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdTd2l0Y2hEZWZhdWx0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IE5nU3dpdGNoLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0KXTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19wbHVyYWwudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPSJ2YWx1ZSI+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0iPTAiPnRoZXJlIGlzIG5vdGhpbmc8L25nLXRlbXBsYXRlPgogKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9Ij0xIj50aGVyZSBpcyBvbmU8L25nLXRlbXBsYXRlPgogKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9ImZldyI+dGhlcmUgYXJlIGEgZmV3PC9uZy10ZW1wbGF0ZT4KICogPC9zb21lLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEFkZHMgLyByZW1vdmVzIERPTSBzdWItdHJlZXMgYmFzZWQgb24gYSBudW1lcmljIHZhbHVlLiBUYWlsb3JlZCBmb3IgcGx1cmFsaXphdGlvbi4KICoKICogRGlzcGxheXMgRE9NIHN1Yi10cmVlcyB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgb3IgZmFpbGluZyB0aGF0LCBET00gc3ViLXRyZWVzCiAqIHRoYXQgbWF0Y2ggdGhlIHN3aXRjaCBleHByZXNzaW9uJ3MgcGx1cmFsaXphdGlvbiBjYXRlZ29yeS4KICoKICogVG8gdXNlIHRoaXMgZGlyZWN0aXZlIHlvdSBtdXN0IHByb3ZpZGUgYSBjb250YWluZXIgZWxlbWVudCB0aGF0IHNldHMgdGhlIGBbbmdQbHVyYWxdYCBhdHRyaWJ1dGUKICogdG8gYSBzd2l0Y2ggZXhwcmVzc2lvbi4gSW5uZXIgZWxlbWVudHMgd2l0aCBhIGBbbmdQbHVyYWxDYXNlXWAgd2lsbCBkaXNwbGF5IGJhc2VkIG9uIHRoZWlyCiAqIGV4cHJlc3Npb246CiAqIC0gaWYgYFtuZ1BsdXJhbENhc2VdYCBpcyBzZXQgdG8gYSB2YWx1ZSBzdGFydGluZyB3aXRoIGA9YCwgaXQgd2lsbCBvbmx5IGRpc3BsYXkgaWYgdGhlIHZhbHVlCiAqICAgbWF0Y2hlcyB0aGUgc3dpdGNoIGV4cHJlc3Npb24gZXhhY3RseSwKICogLSBvdGhlcndpc2UsIHRoZSB2aWV3IHdpbGwgYmUgdHJlYXRlZCBhcyBhICJjYXRlZ29yeSBtYXRjaCIsIGFuZCB3aWxsIG9ubHkgZGlzcGxheSBpZiBleGFjdAogKiAgIHZhbHVlIG1hdGNoZXMgYXJlbid0IGZvdW5kIGFuZCB0aGUgdmFsdWUgbWFwcyB0byBpdHMgY2F0ZWdvcnkgZm9yIHRoZSBkZWZpbmVkIGxvY2FsZS4KICoKICogU2VlIGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL2luZGV4L2NsZHItc3BlYy9wbHVyYWwtcnVsZXMKICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIE5nUGx1cmFsIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfbG9jYWxpemF0aW9uCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sb2NhbGl6YXRpb24pIHsKICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb24gPSBfbG9jYWxpemF0aW9uOwogICAgICAgIHRoaXMuX2Nhc2VWaWV3cyA9IHt9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdQbHVyYWwodmFsdWUpIHsKICAgICAgICB0aGlzLl9zd2l0Y2hWYWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuX3VwZGF0ZVZpZXcoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBzd2l0Y2hWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRDYXNlKHZhbHVlLCBzd2l0Y2hWaWV3KSB7CiAgICAgICAgdGhpcy5fY2FzZVZpZXdzW3ZhbHVlXSA9IHN3aXRjaFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlVmlldygpIHsKICAgICAgICB0aGlzLl9jbGVhclZpZXdzKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNhc2VzID0gT2JqZWN0LmtleXModGhpcy5fY2FzZVZpZXdzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ID0gZ2V0UGx1cmFsQ2F0ZWdvcnkodGhpcy5fc3dpdGNoVmFsdWUsIGNhc2VzLCB0aGlzLl9sb2NhbGl6YXRpb24pOwogICAgICAgIHRoaXMuX2FjdGl2YXRlVmlldyh0aGlzLl9jYXNlVmlld3Nba2V5XSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfY2xlYXJWaWV3cygpIHsKICAgICAgICBpZiAodGhpcy5fYWN0aXZlVmlldykKICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmlldy5kZXN0cm95KCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hY3RpdmF0ZVZpZXcodmlldykgewogICAgICAgIGlmICh2aWV3KSB7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVZpZXcgPSB2aWV3OwogICAgICAgICAgICB0aGlzLl9hY3RpdmVWaWV3LmNyZWF0ZSgpOwogICAgICAgIH0KICAgIH0KfQpOZ1BsdXJhbC7JtWZhYyA9IGZ1bmN0aW9uIE5nUGx1cmFsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nUGx1cmFsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nTG9jYWxpemF0aW9uKSk7IH07Ck5nUGx1cmFsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nUGx1cmFsLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1BsdXJhbCIsICIiXV0sIGlucHV0czogeyBuZ1BsdXJhbDogIm5nUGx1cmFsIiB9IH0pOwovKiogQG5vY29sbGFwc2UgKi8KTmdQbHVyYWwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IE5nTG9jYWxpemF0aW9uIH0KXTsKTmdQbHVyYWwucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1BsdXJhbDogW3sgdHlwZTogSW5wdXQgfV0KfTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqCiAqIFxAZGVzY3JpcHRpb24KICoKICogQ3JlYXRlcyBhIHZpZXcgdGhhdCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgcGFyZW50IHtcQGxpbmsgTmdQbHVyYWx9IHdoZW4gdGhlCiAqIGdpdmVuIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcGx1cmFsIGV4cHJlc3Npb24gYWNjb3JkaW5nIHRvIENMRFIgcnVsZXMuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPSJ2YWx1ZSI+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0iPTAiPi4uLjwvbmctdGVtcGxhdGU+CiAqICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT0ib3RoZXIiPi4uLjwvbmctdGVtcGxhdGU+CiAqIDwvc29tZS1lbGVtZW50PgogKiBgYGAKICoKICogU2VlIHtcQGxpbmsgTmdQbHVyYWx9IGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGUuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ1BsdXJhbENhc2UgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gbmdQbHVyYWwKICAgICAqLwogICAgY29uc3RydWN0b3IodmFsdWUsIHRlbXBsYXRlLCB2aWV3Q29udGFpbmVyLCBuZ1BsdXJhbCkgewogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNBTnVtYmVyID0gIWlzTmFOKE51bWJlcih2YWx1ZSkpOwogICAgICAgIG5nUGx1cmFsLmFkZENhc2UoaXNBTnVtYmVyID8gYD0ke3ZhbHVlfWAgOiB2YWx1ZSwgbmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGUpKTsKICAgIH0KfQpOZ1BsdXJhbENhc2UuybVmYWMgPSBmdW5jdGlvbiBOZ1BsdXJhbENhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdQbHVyYWxDYXNlKSjJtcm1aW5qZWN0QXR0cmlidXRlKCduZ1BsdXJhbENhc2UnKSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdQbHVyYWwsIDEpKTsgfTsKTmdQbHVyYWxDYXNlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nUGx1cmFsQ2FzZSwgc2VsZWN0b3JzOiBbWyIiLCAibmdQbHVyYWxDYXNlIiwgIiJdXSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nUGx1cmFsQ2FzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsnbmdQbHVyYWxDYXNlJyxdIH1dIH0sCiAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgIHsgdHlwZTogTmdQbHVyYWwsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3N0eWxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQHVzYWdlTm90ZXMKICoKICogU2V0IHRoZSBmb250IG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQgdG8gdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLgogKgogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdTdHlsZV09InsnZm9udC1zdHlsZSc6IHN0eWxlRXhwfSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAqIGBgYAogKgogKiBTZXQgdGhlIHdpZHRoIG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQgdG8gYSBwaXhlbCB2YWx1ZSByZXR1cm5lZCBieSBhbiBleHByZXNzaW9uLgogKgogKiBgYGAKICogPHNvbWUtZWxlbWVudCBbbmdTdHlsZV09InsnbWF4LXdpZHRoLnB4Jzogd2lkdGhFeHB9Ij4uLi48L3NvbWUtZWxlbWVudD4KICogYGBgCiAqCiAqIFNldCBhIGNvbGxlY3Rpb24gb2Ygc3R5bGUgdmFsdWVzIHVzaW5nIGFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIGtleS12YWx1ZSBwYWlycy4KICoKICogYGBgCiAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPSJvYmpFeHAiPi4uLjwvc29tZS1lbGVtZW50PgogKiBgYGAKICoKICogXEBkZXNjcmlwdGlvbgogKgogKiBBbiBhdHRyaWJ1dGUgZGlyZWN0aXZlIHRoYXQgdXBkYXRlcyBzdHlsZXMgZm9yIHRoZSBjb250YWluaW5nIEhUTUwgZWxlbWVudC4KICogU2V0cyBvbmUgb3IgbW9yZSBzdHlsZSBwcm9wZXJ0aWVzLCBzcGVjaWZpZWQgYXMgY29sb24tc2VwYXJhdGVkIGtleS12YWx1ZSBwYWlycy4KICogVGhlIGtleSBpcyBhIHN0eWxlIG5hbWUsIHdpdGggYW4gb3B0aW9uYWwgYC48dW5pdD5gIHN1ZmZpeAogKiAoc3VjaCBhcyAndG9wLnB4JywgJ2ZvbnQtc3R5bGUuZW0nKS4KICogVGhlIHZhbHVlIGlzIGFuIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLgogKiBUaGUgcmVzdWx0aW5nIG5vbi1udWxsIHZhbHVlLCBleHByZXNzZWQgaW4gdGhlIGdpdmVuIHVuaXQsCiAqIGlzIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBzdHlsZSBwcm9wZXJ0eS4KICogSWYgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW9uIGlzIG51bGwsIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIGlzIHJlbW92ZWQuCiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBOZ1N0eWxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfbmdFbAogICAgICogQHBhcmFtIHs/fSBfZGlmZmVycwogICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoX25nRWwsIF9kaWZmZXJzLCBfcmVuZGVyZXIpIHsKICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgdGhpcy5fZGlmZmVycyA9IF9kaWZmZXJzOwogICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIHRoaXMuX25nU3R5bGUgPSBudWxsOwogICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXQgbmdTdHlsZSh2YWx1ZXMpIHsKICAgICAgICB0aGlzLl9uZ1N0eWxlID0gdmFsdWVzOwogICAgICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlcykgewogICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodmFsdWVzKS5jcmVhdGUoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG5nRG9DaGVjaygpIHsKICAgICAgICBpZiAodGhpcy5fZGlmZmVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9uZ1N0eWxlKSkpOwogICAgICAgICAgICBpZiAoY2hhbmdlcykgewogICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBuYW1lQW5kVW5pdAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NldFN0eWxlKG5hbWVBbmRVbml0LCB2YWx1ZSkgewogICAgICAgIGNvbnN0IFtuYW1lLCB1bml0XSA9IG5hbWVBbmRVbml0LnNwbGl0KCcuJyk7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsICYmIHVuaXQgPyBgJHt2YWx1ZX0ke3VuaXR9YCA6IHZhbHVlOwogICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwgbmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hcHBseUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgbnVsbCkpKTsKICAgICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl9zZXRTdHlsZShyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKSkpOwogICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSkpKTsKICAgIH0KfQpOZ1N0eWxlLsm1ZmFjID0gZnVuY3Rpb24gTmdTdHlsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ1N0eWxlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEtleVZhbHVlRGlmZmVycyksIMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSk7IH07Ck5nU3R5bGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTdHlsZSwgc2VsZWN0b3JzOiBbWyIiLCAibmdTdHlsZSIsICIiXV0sIGlucHV0czogeyBuZ1N0eWxlOiAibmdTdHlsZSIgfSB9KTsKLyoqIEBub2NvbGxhcHNlICovCk5nU3R5bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgIHsgdHlwZTogS2V5VmFsdWVEaWZmZXJzIH0sCiAgICB7IHR5cGU6IFJlbmRlcmVyMiB9Cl07Ck5nU3R5bGUucHJvcERlY29yYXRvcnMgPSB7CiAgICBuZ1N0eWxlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ1N0eWxlJyxdIH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfdGVtcGxhdGVfb3V0bGV0LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKgogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEluc2VydHMgYW4gZW1iZWRkZWQgdmlldyBmcm9tIGEgcHJlcGFyZWQgYFRlbXBsYXRlUmVmYC4KICoKICogWW91IGNhbiBhdHRhY2ggYSBjb250ZXh0IG9iamVjdCB0byB0aGUgYEVtYmVkZGVkVmlld1JlZmAgYnkgc2V0dGluZyBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAuCiAqIGBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdYCBzaG91bGQgYmUgYW4gb2JqZWN0LCB0aGUgb2JqZWN0J3Mga2V5cyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgYmluZGluZwogKiBieSB0aGUgbG9jYWwgdGVtcGxhdGUgYGxldGAgZGVjbGFyYXRpb25zLgogKgogKiBcQHVzYWdlTm90ZXMKICogYGBgCiAqIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9InRlbXBsYXRlUmVmRXhwOyBjb250ZXh0OiBjb250ZXh0RXhwIj48L25nLWNvbnRhaW5lcj4KICogYGBgCiAqCiAqIFVzaW5nIHRoZSBrZXkgYCRpbXBsaWNpdGAgaW4gdGhlIGNvbnRleHQgb2JqZWN0IHdpbGwgc2V0IGl0cyB2YWx1ZSBhcyBkZWZhdWx0LgogKgogKiAjIyMgRXhhbXBsZQogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9uZ1RlbXBsYXRlT3V0bGV0L3RzL21vZHVsZS50cyByZWdpb249J05nVGVtcGxhdGVPdXRsZXQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTmdUZW1wbGF0ZU91dGxldCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAqLwogICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgdGhpcy5fdmlld1JlZiA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBjb250ZXh0IG9iamVjdCB0byBhdHRhY2ggdG8gdGhlIHtcQGxpbmsgRW1iZWRkZWRWaWV3UmVmfS4gVGhpcyBzaG91bGQgYmUgYW4KICAgICAgICAgKiBvYmplY3QsIHRoZSBvYmplY3QncyBrZXlzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBiaW5kaW5nIGJ5IHRoZSBsb2NhbCB0ZW1wbGF0ZSBgbGV0YAogICAgICAgICAqIGRlY2xhcmF0aW9ucy4KICAgICAgICAgKiBVc2luZyB0aGUga2V5IGAkaW1wbGljaXRgIGluIHRoZSBjb250ZXh0IG9iamVjdCB3aWxsIHNldCBpdHMgdmFsdWUgYXMgZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0ID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBBIHN0cmluZyBkZWZpbmluZyB0aGUgdGVtcGxhdGUgcmVmZXJlbmNlIGFuZCBvcHRpb25hbGx5IHRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIHRlbXBsYXRlLgogICAgICAgICAqLwogICAgICAgIHRoaXMubmdUZW1wbGF0ZU91dGxldCA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWNyZWF0ZVZpZXcgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7CiAgICAgICAgaWYgKHJlY3JlYXRlVmlldykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICBpZiAodGhpcy5fdmlld1JlZikgewogICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZi5yZW1vdmUodmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX3ZpZXdSZWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92aWV3UmVmID0gdGhpcy5uZ1RlbXBsYXRlT3V0bGV0ID8KICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMubmdUZW1wbGF0ZU91dGxldCwgdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCkgOgogICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5fdmlld1JlZiAmJiB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFdlIG5lZWQgdG8gcmUtY3JlYXRlIGV4aXN0aW5nIGVtYmVkZGVkIHZpZXcgaWY6CiAgICAgKiAtIHRlbXBsYXRlUmVmIGhhcyBjaGFuZ2VkCiAgICAgKiAtIGNvbnRleHQgaGFzIGNoYW5nZXMKICAgICAqCiAgICAgKiBXZSBtYXJrIGNvbnRleHQgb2JqZWN0IGFzIGNoYW5nZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBvYmplY3QKICAgICAqIHNoYXBlIGNoYW5nZXMgKG5ldyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCBvciBleGlzdGluZyBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkKS4KICAgICAqIEluIG90aGVyIHdvcmRzIHdlIGNvbnNpZGVyIGNvbnRleHQgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzICJ0aGUgc2FtZSIgZXZlbgogICAgICogaWYgb2JqZWN0IHJlZmVyZW5jZSBjaGFuZ2VzIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM0MDcpLgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3Nob3VsZFJlY3JlYXRlVmlldyhjaGFuZ2VzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN0eENoYW5nZSA9IGNoYW5nZXNbJ25nVGVtcGxhdGVPdXRsZXRDb250ZXh0J107CiAgICAgICAgcmV0dXJuICEhY2hhbmdlc1snbmdUZW1wbGF0ZU91dGxldCddIHx8IChjdHhDaGFuZ2UgJiYgdGhpcy5faGFzQ29udGV4dFNoYXBlQ2hhbmdlZChjdHhDaGFuZ2UpKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3R4Q2hhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfaGFzQ29udGV4dFNoYXBlQ2hhbmdlZChjdHhDaGFuZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldkN0eEtleXMgPSBPYmplY3Qua2V5cyhjdHhDaGFuZ2UucHJldmlvdXNWYWx1ZSB8fCB7fSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7CiAgICAgICAgaWYgKHByZXZDdHhLZXlzLmxlbmd0aCA9PT0gY3VyckN0eEtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAobGV0IHByb3BOYW1lIG9mIGN1cnJDdHhLZXlzKSB7CiAgICAgICAgICAgICAgICBpZiAocHJldkN0eEtleXMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBfdXBkYXRlRXhpc3RpbmdDb250ZXh0KGN0eCkgewogICAgICAgIGZvciAobGV0IHByb3BOYW1lIG9mIE9iamVjdC5rZXlzKGN0eCkpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld1JlZikpLmNvbnRleHQpKSlbcHJvcE5hbWVdID0gKCgvKiogQHR5cGUgez99ICovICh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSkpW3Byb3BOYW1lXTsKICAgICAgICB9CiAgICB9Cn0KTmdUZW1wbGF0ZU91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIE5nVGVtcGxhdGVPdXRsZXRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdUZW1wbGF0ZU91dGxldCkoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSk7IH07Ck5nVGVtcGxhdGVPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdUZW1wbGF0ZU91dGxldCwgc2VsZWN0b3JzOiBbWyIiLCAibmdUZW1wbGF0ZU91dGxldCIsICIiXV0sIGlucHV0czogeyBuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDogIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IiwgbmdUZW1wbGF0ZU91dGxldDogIm5nVGVtcGxhdGVPdXRsZXQiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpOZ1RlbXBsYXRlT3V0bGV0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0KXTsKTmdUZW1wbGF0ZU91dGxldC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgIG5nVGVtcGxhdGVPdXRsZXRDb250ZXh0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgIG5nVGVtcGxhdGVPdXRsZXQ6IFt7IHR5cGU6IElucHV0IH1dCn07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2ludmFsaWRfcGlwZV9hcmd1bWVudF9lcnJvci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQHBhcmFtIHs/fSB0eXBlCiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGludmFsaWRQaXBlQXJndW1lbnRFcnJvcih0eXBlLCB2YWx1ZSkgewogICAgcmV0dXJuIEVycm9yKGBJbnZhbGlkUGlwZUFyZ3VtZW50OiAnJHt2YWx1ZX0nIGZvciBwaXBlICcke3N0cmluZ2lmeSh0eXBlKX0nYCk7Cn0KY2xhc3MgT2JzZXJ2YWJsZVN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgIHJldHVybiBhc3luYy5zdWJzY3JpYmUoewogICAgICAgICAgICBuZXh0OiB1cGRhdGVMYXRlc3RWYWx1ZSwKICAgICAgICAgICAgZXJyb3I6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZSkgPT4gewogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdWJzY3JpcHRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICB9Cn0KY2xhc3MgUHJvbWlzZVN0cmF0ZWd5IHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgIHJldHVybiBhc3luYy50aGVuKHVwZGF0ZUxhdGVzdFZhbHVlLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlID0+IHsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwb3NlKHN1YnNjcmlwdGlvbikgeyB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBvbkRlc3Ryb3koc3Vic2NyaXB0aW9uKSB7IH0KfQovKiogQHR5cGUgez99ICovCmNvbnN0IF9wcm9taXNlU3RyYXRlZ3kgPSBuZXcgUHJvbWlzZVN0cmF0ZWd5KCk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgX29ic2VydmFibGVTdHJhdGVneSA9IG5ldyBPYnNlcnZhYmxlU3RyYXRlZ3koKTsKLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogVW53cmFwcyBhIHZhbHVlIGZyb20gYW4gYXN5bmNocm9ub3VzIHByaW1pdGl2ZS4KICoKICogVGhlIGBhc3luY2AgcGlwZSBzdWJzY3JpYmVzIHRvIGFuIGBPYnNlcnZhYmxlYCBvciBgUHJvbWlzZWAgYW5kIHJldHVybnMgdGhlIGxhdGVzdCB2YWx1ZSBpdCBoYXMKICogZW1pdHRlZC4gV2hlbiBhIG5ldyB2YWx1ZSBpcyBlbWl0dGVkLCB0aGUgYGFzeW5jYCBwaXBlIG1hcmtzIHRoZSBjb21wb25lbnQgdG8gYmUgY2hlY2tlZCBmb3IKICogY2hhbmdlcy4gV2hlbiB0aGUgY29tcG9uZW50IGdldHMgZGVzdHJveWVkLCB0aGUgYGFzeW5jYCBwaXBlIHVuc3Vic2NyaWJlcyBhdXRvbWF0aWNhbGx5IHRvIGF2b2lkCiAqIHBvdGVudGlhbCBtZW1vcnkgbGVha3MuCiAqCiAqIFxAdXNhZ2VOb3RlcwogKgogKiAjIyMgRXhhbXBsZXMKICoKICogVGhpcyBleGFtcGxlIGJpbmRzIGEgYFByb21pc2VgIHRvIHRoZSB2aWV3LiBDbGlja2luZyB0aGUgYFJlc29sdmVgIGJ1dHRvbiByZXNvbHZlcyB0aGUKICogcHJvbWlzZS4KICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZVByb21pc2UnfQogKgogKiBJdCdzIGFsc28gcG9zc2libGUgdG8gdXNlIGBhc3luY2Agd2l0aCBPYnNlcnZhYmxlcy4gVGhlIGV4YW1wbGUgYmVsb3cgYmluZHMgdGhlIGB0aW1lYCBPYnNlcnZhYmxlCiAqIHRvIHRoZSB2aWV3LiBUaGUgT2JzZXJ2YWJsZSBjb250aW51b3VzbHkgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2FzeW5jX3BpcGUudHMgcmVnaW9uPSdBc3luY1BpcGVPYnNlcnZhYmxlJ30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEFzeW5jUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX3JlZgogICAgICovCiAgICBjb25zdHJ1Y3RvcihfcmVmKSB7CiAgICAgICAgdGhpcy5fcmVmID0gX3JlZjsKICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLl9vYmogPSBudWxsOwogICAgICAgIHRoaXMuX3N0cmF0ZWd5ID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbikgewogICAgICAgICAgICB0aGlzLl9kaXNwb3NlKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKG9iaikgewogICAgICAgIGlmICghdGhpcy5fb2JqKSB7CiAgICAgICAgICAgIGlmIChvYmopIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSB0aGlzLl9sYXRlc3RWYWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAob2JqICE9PSB0aGlzLl9vYmopIHsKICAgICAgICAgICAgdGhpcy5fZGlzcG9zZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oKC8qKiBAdHlwZSB7P30gKi8gKG9iaikpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxvb3NlSWRlbnRpY2FsKHRoaXMuX2xhdGVzdFZhbHVlLCB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgIHJldHVybiBXcmFwcGVkVmFsdWUud3JhcCh0aGlzLl9sYXRlc3RWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3N1YnNjcmliZShvYmopIHsKICAgICAgICB0aGlzLl9vYmogPSBvYmo7CiAgICAgICAgdGhpcy5fc3RyYXRlZ3kgPSB0aGlzLl9zZWxlY3RTdHJhdGVneShvYmopOwogICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuX3N0cmF0ZWd5LmNyZWF0ZVN1YnNjcmlwdGlvbihvYmosICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsdWUpID0+IHRoaXMuX3VwZGF0ZUxhdGVzdFZhbHVlKG9iaiwgdmFsdWUpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3NlbGVjdFN0cmF0ZWd5KG9iaikgewogICAgICAgIGlmIChpc1Byb21pc2UkMShvYmopKSB7CiAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZVN0cmF0ZWd5OwogICAgICAgIH0KICAgICAgICBpZiAoaXNPYnNlcnZhYmxlJDEob2JqKSkgewogICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVTdHJhdGVneTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEFzeW5jUGlwZSwgb2JqKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9kaXNwb3NlKCkgewogICAgICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N1YnNjcmlwdGlvbikpKTsKICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB0aGlzLl9vYmogPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBhc3luYwogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3VwZGF0ZUxhdGVzdFZhbHVlKGFzeW5jLCB2YWx1ZSkgewogICAgICAgIGlmIChhc3luYyA9PT0gdGhpcy5fb2JqKSB7CiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX3JlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICB9Cn0KQXN5bmNQaXBlLsm1ZmFjID0gZnVuY3Rpb24gQXN5bmNQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFzeW5jUGlwZSkoybXJtWluamVjdFBpcGVDaGFuZ2VEZXRlY3RvclJlZigpKTsgfTsKQXN5bmNQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImFzeW5jIiwgdHlwZTogQXN5bmNQaXBlLCBwdXJlOiBmYWxzZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkFzeW5jUGlwZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9jYXNlX2NvbnZlcnNpb25fcGlwZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFRyYW5zZm9ybXMgdGV4dCB0byBhbGwgbG93ZXIgY2FzZS4KICoKICogQHNlZSBgVXBwZXJDYXNlUGlwZWAKICogQHNlZSBgVGl0bGVDYXNlUGlwZWAKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgdmlldyB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBlbnRlcgogKiB0ZXh0LCBhbmQgdGhlbiB1c2VzIHRoZSBwaXBlIHRvIGNvbnZlcnQgdGhlIGlucHV0IHRleHQgdG8gYWxsIGxvd2VyIGNhc2UuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL2xvd2VydXBwZXJfcGlwZS50cyIgcmVnaW9uPSdMb3dlclVwcGVyUGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBMb3dlckNhc2VQaXBlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHRyYW5zZm9ybSB0byBsb3dlciBjYXNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlKSB7CiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihMb3dlckNhc2VQaXBlLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgfQp9Ckxvd2VyQ2FzZVBpcGUuybVmYWMgPSBmdW5jdGlvbiBMb3dlckNhc2VQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvd2VyQ2FzZVBpcGUpKCk7IH07Ckxvd2VyQ2FzZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAibG93ZXJjYXNlIiwgdHlwZTogTG93ZXJDYXNlUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLy8KLy8gUmVnZXggYmVsb3cgbWF0Y2hlcyBhbnkgVW5pY29kZSB3b3JkIGFuZCBjb21wYXRpYmxlIHdpdGggRVM1LiBJbiBFUzIwMTggdGhlIHNhbWUgcmVzdWx0Ci8vIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyAvXHB7TH1cUyovZ3UgYW5kIGFsc28ga25vd24gYXMgVW5pY29kZSBQcm9wZXJ0eSBFc2NhcGVzCi8vIChodHRwOi8vMmFsaXR5LmNvbS8yMDE3LzA3L3JlZ2V4cC11bmljb2RlLXByb3BlcnR5LWVzY2FwZXMuaHRtbCkuIFNpbmNlIHRoZXJlIGlzIG5vCi8vIHRyYW5zcGlsYXRpb24gb2YgdGhpcyBmdW5jdGlvbmFsaXR5IGRvd24gdG8gRVM1IHdpdGhvdXQgZXh0ZXJuYWwgdG9vbCwgdGhlIG9ubHkgc29sdXRpb24gaXMKLy8gdG8gdXNlIGFscmVhZHkgdHJhbnNwaWxlZCBmb3JtLiBFeGFtcGxlIGNhbiBiZSBmb3VuZCBoZXJlIC0KLy8gaHR0cHM6Ly9tb3RoZXJlZmYuaW4vcmVnZXhwdSNpbnB1dD12YXIrcmVnZXgrJTNEKy8lNUNwJTdCTCU3RC91JTNCJnVuaWNvZGVQcm9wZXJ0eUVzY2FwZT0xCi8vCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgdW5pY29kZVdvcmRNYXRjaCA9IC8oPzpbQS1aYS16XHhBQVx4QjVceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDM3MC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4QS1cdTA1MkZcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4N1x1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIwLVx1MDY0QVx1MDY2RVx1MDY2Rlx1MDY3MS1cdTA2RDNcdTA2RDVcdTA2RTVcdTA2RTZcdTA2RUVcdTA2RUZcdTA2RkEtXHUwNkZDXHUwNkZGXHUwNzEwXHUwNzEyLVx1MDcyRlx1MDc0RC1cdTA3QTVcdTA3QjFcdTA3Q0EtXHUwN0VBXHUwN0Y0XHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgxNVx1MDgxQVx1MDgyNFx1MDgyOFx1MDg0MC1cdTA4NThcdTA4NjAtXHUwODZBXHUwOEEwLVx1MDhCNFx1MDhCNi1cdTA4QkRcdTA5MDQtXHUwOTM5XHUwOTNEXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5ODBcdTA5ODUtXHUwOThDXHUwOThGXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOUJEXHUwOUNFXHUwOURDXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMFx1MDlGMVx1MDlGQ1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRDBcdTBBRTBcdTBBRTFcdTBBRjlcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNEXHUwQjVDXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI3MVx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkQwXHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzOVx1MEMzRFx1MEM1OC1cdTBDNUFcdTBDNjBcdTBDNjFcdTBDODBcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENCRFx1MENERVx1MENFMFx1MENFMVx1MENGMVx1MENGMlx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQzQVx1MEQzRFx1MEQ0RVx1MEQ1NC1cdTBENTZcdTBENUYtXHUwRDYxXHUwRDdBLVx1MEQ3Rlx1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBFMDEtXHUwRTMwXHUwRTMyXHUwRTMzXHUwRTQwLVx1MEU0Nlx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQVx1MEVBQlx1MEVBRC1cdTBFQjBcdTBFQjJcdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRUM2XHUwRURDLVx1MEVERlx1MEYwMFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjZDXHUwRjg4LVx1MEY4Q1x1MTAwMC1cdTEwMkFcdTEwM0ZcdTEwNTAtXHUxMDU1XHUxMDVBLVx1MTA1RFx1MTA2MVx1MTA2NVx1MTA2Nlx1MTA2RS1cdTEwNzBcdTEwNzUtXHUxMDgxXHUxMDhFXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM4MC1cdTEzOEZcdTEzQTAtXHUxM0Y1XHUxM0Y4LVx1MTNGRFx1MTQwMS1cdTE2NkNcdTE2NkYtXHUxNjdGXHUxNjgxLVx1MTY5QVx1MTZBMC1cdTE2RUFcdTE2RjEtXHUxNkY4XHUxNzAwLVx1MTcwQ1x1MTcwRS1cdTE3MTFcdTE3MjAtXHUxNzMxXHUxNzQwLVx1MTc1MVx1MTc2MC1cdTE3NkNcdTE3NkUtXHUxNzcwXHUxNzgwLVx1MTdCM1x1MTdEN1x1MTdEQ1x1MTgyMC1cdTE4NzdcdTE4ODAtXHUxODg0XHUxODg3LVx1MThBOFx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTUwLVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MUEwMC1cdTFBMTZcdTFBMjAtXHUxQTU0XHUxQUE3XHUxQjA1LVx1MUIzM1x1MUI0NS1cdTFCNEJcdTFCODMtXHUxQkEwXHUxQkFFXHUxQkFGXHUxQkJBLVx1MUJFNVx1MUMwMC1cdTFDMjNcdTFDNEQtXHUxQzRGXHUxQzVBLVx1MUM3RFx1MUM4MC1cdTFDODhcdTFDRTktXHUxQ0VDXHUxQ0VFLVx1MUNGMVx1MUNGNVx1MUNGNlx1MUQwMC1cdTFEQkZcdTFFMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIwNzFcdTIwN0ZcdTIwOTAtXHUyMDlDXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTgzXHUyMTg0XHUyQzAwLVx1MkMyRVx1MkMzMC1cdTJDNUVcdTJDNjAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1XHUzMDA2XHUzMDMxLVx1MzAzNVx1MzAzQlx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJFXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRUFcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkU1XHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2NVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURFODAtXHVERTlDXHVERUEwLVx1REVEMFx1REYwMC1cdURGMUZcdURGMkQtXHVERjQwXHVERjQyLVx1REY0OVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZdfFx1RDgwMVtcdURDMDAtXHVEQzlEXHVEQ0IwLVx1RENEM1x1RENEOC1cdURDRkJcdUREMDAtXHVERDI3XHVERDMwLVx1REQ2M1x1REUwMC1cdURGMzZcdURGNDAtXHVERjU1XHVERjYwLVx1REY2N118XHVEODAyW1x1REMwMC1cdURDMDVcdURDMDhcdURDMEEtXHVEQzM1XHVEQzM3XHVEQzM4XHVEQzNDXHVEQzNGLVx1REM1NVx1REM2MC1cdURDNzZcdURDODAtXHVEQzlFXHVEQ0UwLVx1RENGMlx1RENGNFx1RENGNVx1REQwMC1cdUREMTVcdUREMjAtXHVERDM5XHVERDgwLVx1RERCN1x1RERCRVx1RERCRlx1REUwMFx1REUxMC1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzM1x1REU2MC1cdURFN0NcdURFODAtXHVERTlDXHVERUMwLVx1REVDN1x1REVDOS1cdURFRTRcdURGMDAtXHVERjM1XHVERjQwLVx1REY1NVx1REY2MC1cdURGNzJcdURGODAtXHVERjkxXXxcdUQ4MDNbXHVEQzAwLVx1REM0OFx1REM4MC1cdURDQjJcdURDQzAtXHVEQ0YyXXxcdUQ4MDRbXHVEQzAzLVx1REMzN1x1REM4My1cdURDQUZcdURDRDAtXHVEQ0U4XHVERDAzLVx1REQyNlx1REQ1MC1cdURENzJcdURENzZcdUREODMtXHVEREIyXHVEREMxLVx1RERDNFx1REREQVx1REREQ1x1REUwMC1cdURFMTFcdURFMTMtXHVERTJCXHVERTgwLVx1REU4Nlx1REU4OFx1REU4QS1cdURFOERcdURFOEYtXHVERTlEXHVERTlGLVx1REVBOFx1REVCMC1cdURFREVcdURGMDUtXHVERjBDXHVERjBGXHVERjEwXHVERjEzLVx1REYyOFx1REYyQS1cdURGMzBcdURGMzJcdURGMzNcdURGMzUtXHVERjM5XHVERjNEXHVERjUwXHVERjVELVx1REY2MV18XHVEODA1W1x1REMwMC1cdURDMzRcdURDNDctXHVEQzRBXHVEQzgwLVx1RENBRlx1RENDNFx1RENDNVx1RENDN1x1REQ4MC1cdUREQUVcdURERDgtXHVERERCXHVERTAwLVx1REUyRlx1REU0NFx1REU4MC1cdURFQUFcdURGMDAtXHVERjE5XXxcdUQ4MDZbXHVEQ0EwLVx1RENERlx1RENGRlx1REUwMFx1REUwQi1cdURFMzJcdURFM0FcdURFNTBcdURFNUMtXHVERTgzXHVERTg2LVx1REU4OVx1REVDMC1cdURFRjhdfFx1RDgwN1tcdURDMDAtXHVEQzA4XHVEQzBBLVx1REMyRVx1REM0MFx1REM3Mi1cdURDOEZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzMFx1REQ0Nl18XHVEODA4W1x1REMwMC1cdURGOTldfFx1RDgwOVtcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzldW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJFXXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERUQwLVx1REVFRFx1REYwMC1cdURGMkZcdURGNDAtXHVERjQzXHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURGMDAtXHVERjQ0XHVERjUwXHVERjkzLVx1REY5Rlx1REZFMFx1REZFMV18XHVEODIxW1x1REMwMC1cdURGRUNdfFx1RDgyMltcdURDMDAtXHVERUYyXXxcdUQ4MkNbXHVEQzAwLVx1REQxRVx1REQ3MC1cdURFRkJdfFx1RDgyRltcdURDMDAtXHVEQzZBXHVEQzcwLVx1REM3Q1x1REM4MC1cdURDODhcdURDOTAtXHVEQzk5XXxcdUQ4MzVbXHVEQzAwLVx1REM1NFx1REM1Ni1cdURDOUNcdURDOUVcdURDOUZcdURDQTJcdURDQTVcdURDQTZcdURDQTktXHVEQ0FDXHVEQ0FFLVx1RENCOVx1RENCQlx1RENCRC1cdURDQzNcdURDQzUtXHVERDA1XHVERDA3LVx1REQwQVx1REQwRC1cdUREMTRcdUREMTYtXHVERDFDXHVERDFFLVx1REQzOVx1REQzQi1cdUREM0VcdURENDAtXHVERDQ0XHVERDQ2XHVERDRBLVx1REQ1MFx1REQ1Mi1cdURFQTVcdURFQTgtXHVERUMwXHVERUMyLVx1REVEQVx1REVEQy1cdURFRkFcdURFRkMtXHVERjE0XHVERjE2LVx1REYzNFx1REYzNi1cdURGNEVcdURGNTAtXHVERjZFXHVERjcwLVx1REY4OFx1REY4QS1cdURGQThcdURGQUEtXHVERkMyXHVERkM0LVx1REZDQl18XHVEODNBW1x1REMwMC1cdURDQzRcdUREMDAtXHVERDQzXXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXSlcUyovZzsKLyoqCiAqIFRyYW5zZm9ybXMgdGV4dCB0byB0aXRsZSBjYXNlLgogKiBDYXBpdGFsaXplcyB0aGUgZmlyc3QgbGV0dGVyIG9mIGVhY2ggd29yZCwgYW5kIHRyYW5zZm9ybXMgdGhlCiAqIHJlc3Qgb2YgdGhlIHdvcmQgdG8gbG93ZXIgY2FzZS4KICogV29yZHMgYXJlIGRlbGltaXRlZCBieSBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHN1Y2ggYXMgYSBzcGFjZSwgdGFiLCBvciBsaW5lLWZlZWQgY2hhcmFjdGVyLgogKgogKiBAc2VlIGBMb3dlckNhc2VQaXBlYAogKiBAc2VlIGBVcHBlckNhc2VQaXBlYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSByZXN1bHQgb2YgdHJhbnNmb3JtaW5nIHZhcmlvdXMgc3RyaW5ncyBpbnRvIHRpdGxlIGNhc2UuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL3RpdGxlY2FzZV9waXBlLnRzIiByZWdpb249J1RpdGxlQ2FzZVBpcGUnPjwvY29kZS1leGFtcGxlPgogKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVGl0bGVDYXNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdGl0bGUgY2FzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVGl0bGVDYXNlUGlwZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSh1bmljb2RlV29yZE1hdGNoLCAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0eHQgPT4gdHh0WzBdLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpKSk7CiAgICB9Cn0KVGl0bGVDYXNlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFRpdGxlQ2FzZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGVDYXNlUGlwZSkoKTsgfTsKVGl0bGVDYXNlUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJ0aXRsZWNhc2UiLCB0eXBlOiBUaXRsZUNhc2VQaXBlLCBwdXJlOiB0cnVlIH0pOwovKioKICogVHJhbnNmb3JtcyB0ZXh0IHRvIGFsbCB1cHBlciBjYXNlLgogKiBAc2VlIGBMb3dlckNhc2VQaXBlYAogKiBAc2VlIGBUaXRsZUNhc2VQaXBlYAogKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgVXBwZXJDYXNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdXBwZXIgY2FzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVXBwZXJDYXNlUGlwZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgIH0KfQpVcHBlckNhc2VQaXBlLsm1ZmFjID0gZnVuY3Rpb24gVXBwZXJDYXNlUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBVcHBlckNhc2VQaXBlKSgpOyB9OwpVcHBlckNhc2VQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInVwcGVyY2FzZSIsIHR5cGU6IFVwcGVyQ2FzZVBpcGUsIHB1cmU6IHRydWUgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2RhdGVfcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBjbGFuZy1mb3JtYXQgb2ZmCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIEZvcm1hdHMgYSBkYXRlIHZhbHVlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAqCiAqIE9ubHkgdGhlIGBlbi1VU2AgbG9jYWxlIGRhdGEgY29tZXMgd2l0aCBBbmd1bGFyLiBUbyBsb2NhbGl6ZSBkYXRlcwogKiBpbiBhbm90aGVyIGxhbmd1YWdlLCB5b3UgbXVzdCBpbXBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWxlIGRhdGEuCiAqIFNlZSB0aGUgW0kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEBzZWUgYGZvcm1hdERhdGUoKWAKICoKICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIFRoZSByZXN1bHQgb2YgdGhpcyBwaXBlIGlzIG5vdCByZWV2YWx1YXRlZCB3aGVuIHRoZSBpbnB1dCBpcyBtdXRhdGVkLiBUbyBhdm9pZCB0aGUgbmVlZCB0bwogKiByZWZvcm1hdCB0aGUgZGF0ZSBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB0cmVhdCB0aGUgZGF0ZSBhcyBhbiBpbW11dGFibGUgb2JqZWN0CiAqIGFuZCBjaGFuZ2UgdGhlIHJlZmVyZW5jZSB3aGVuIHRoZSBwaXBlIG5lZWRzIHRvIHJ1biBhZ2Fpbi4KICoKICogIyMjIFByZS1kZWZpbmVkIGZvcm1hdCBvcHRpb25zCiAqCiAqIEV4YW1wbGVzIGFyZSBnaXZlbiBpbiBgZW4tVVNgIGxvY2FsZS4KICoKICogLSBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXksIGg6bW0gYSdgIChgNi8xNS8xNSwgOTowMyBBTWApLgogKiAtIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSwgaDptbTpzcyBhJ2AgKGBKdW4gMTUsIDIwMTUsIDk6MDM6MDEgQU1gKS4KICogLSBgJ2xvbmcnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSwgaDptbTpzcyBhIHonYCAoYEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTQogKiBHTVQrMWApLgogKiAtIGAnZnVsbCdgOiBlcXVpdmFsZW50IHRvIGAnRUVFRSwgTU1NTSBkLCB5LCBoOm1tOnNzIGEgenp6eidgIChgTW9uZGF5LCBKdW5lIDE1LCAyMDE1IGF0CiAqIDk6MDM6MDEgQU0gR01UKzAxOjAwYCkuCiAqIC0gYCdzaG9ydERhdGUnYDogZXF1aXZhbGVudCB0byBgJ00vZC95eSdgIChgNi8xNS8xNWApLgogKiAtIGAnbWVkaXVtRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAnTU1NIGQsIHknYCAoYEp1biAxNSwgMjAxNWApLgogKiAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSdgIChgSnVuZSAxNSwgMjAxNWApLgogKiAtIGAnZnVsbERhdGUnYDogZXF1aXZhbGVudCB0byBgJ0VFRUUsIE1NTU0gZCwgeSdgIChgTW9uZGF5LCBKdW5lIDE1LCAyMDE1YCkuCiAqIC0gYCdzaG9ydFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW0gYSdgIChgOTowMyBBTWApLgogKiAtIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgKGA5OjAzOjAxIEFNYCkuCiAqIC0gYCdsb25nVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhIHonYCAoYDk6MDM6MDEgQU0gR01UKzFgKS4KICogLSBgJ2Z1bGxUaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdoOm1tOnNzIGEgenp6eidgIChgOTowMzowMSBBTSBHTVQrMDE6MDBgKS4KICoKICogIyMjIEN1c3RvbSBmb3JtYXQgb3B0aW9ucwogKgogKiBZb3UgY2FuIGNvbnN0cnVjdCBhIGZvcm1hdCBzdHJpbmcgdXNpbmcgc3ltYm9scyB0byBzcGVjaWZ5IHRoZSBjb21wb25lbnRzCiAqIG9mIGEgZGF0ZS10aW1lIHZhbHVlLCBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4KICogRm9ybWF0IGRldGFpbHMgZGVwZW5kIG9uIHRoZSBsb2NhbGUuCiAqIEZpZWxkcyBtYXJrZWQgd2l0aCAoKikgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBleHRyYSBkYXRhIHNldCBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KICoKICogIHwgRmllbGQgdHlwZSAgICAgICAgIHwgRm9ybWF0ICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogKiAgfCBFcmEgICAgICAgICAgICAgICAgfCBHLCBHRyAmIEdHRyB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgR0dHRyAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQW5ubyBEb21pbmkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBZZWFyICAgICAgICAgICAgICAgfCB5ICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLCAyMCwgMjAxLCAyMDE3LCAyMDE3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgeXkgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDIsIDIwLCAwMSwgMTcsIDczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwMiwgMDIwLCAyMDEsIDIwMTcsIDIwMTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB5eXl5ICAgICAgICB8IE51bWVyaWM6IDQgZGlnaXRzIG9yIG1vcmUgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgfCAwMDAyLCAwMDIwLCAwMjAxLCAyMDE3LCAyMDE3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgTW9udGggICAgICAgICAgICAgIHwgTSAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBNTU0gICAgICAgICB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTU1NTSAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwdGVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBNb250aCBzdGFuZGFsb25lICAgfCBMICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDksIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgICAgIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXB0ZW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFdlZWsgb2YgeWVhciAgICAgICB8IHcgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB3dyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMS4uLiA1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgV2VlayBvZiBtb250aCAgICAgIHwgVyAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMS4uLiA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IERheSBvZiBtb250aCAgICAgICB8IGQgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBkZCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFdlZWsgZGF5ICAgICAgICAgICB8IEUsIEVFICYgRUVFIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFR1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUdWVzZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgRUVFRUUgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEVFRUVFRSAgICAgIHwgU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFR1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2QgICAgICAgICAgICAgfCBhLCBhYSAmIGFhYSB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbS9wbSBvciBBTS9QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICAgICAgfCBXaWRlIChmYWxsYmFjayB0byBgYWAgd2hlbiBtaXNzaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW50ZSBtZXJpZGllbS9wb3N0IG1lcmlkaWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2QqICAgICAgICAgICAgfCBCLCBCQiAmIEJCQiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgQkJCQiAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW0sIHBtLCBtaWRuaWdodCwgbm9vbiwgbW9ybmluZywgYWZ0ZXJub29uLCBldmVuaW5nLCBuaWdodCB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IEJCQkJCICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBQZXJpb2Qgc3RhbmRhbG9uZSogfCBiLCBiYiAmIGJiYiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgYmJiYiAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW0sIHBtLCBtaWRuaWdodCwgbm9vbiwgbW9ybmluZywgYWZ0ZXJub29uLCBldmVuaW5nLCBuaWdodCB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IGJiYmJiICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBIb3VyIDEtMTIgICAgICAgICAgfCBoICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgaGggICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEsIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IEhvdXIgMC0yMyAgICAgICAgICB8IEggICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAsIDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgTWludXRlICAgICAgICAgICAgIHwgbSAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOCwgNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IG1tICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA4LCA1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCBTZWNvbmQgICAgICAgICAgICAgfCBzICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgc3MgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDAuLi4gNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IEZyYWN0aW9uYWwgc2Vjb25kcyB8IFMgICAgICAgICAgIHwgTnVtZXJpYzogMSBkaWdpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAuLi4gOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMC4uLiA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgU1NTICAgICAgICAgfCBOdW1lcmljOiAzIGRpZ2l0cyArIHplcm8gcGFkZGVkICg9IG1pbGxpc2Vjb25kcykgICAgICAgICAgICAgIHwgMDAwLi4uIDk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8IFpvbmUgICAgICAgICAgICAgICB8IHosIHp6ICYgenp6IHwgU2hvcnQgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gTykgICAgICAgICAgICB8IEdNVC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgICAgICB8IExvbmcgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gT09PTykgICAgICAgICAgfCBHTVQtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgWiwgWlogJiBaWlogfCBJU084NjAxIGJhc2ljIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLTA4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IFpaWlogICAgICAgIHwgTG9uZyBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC04OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgfCAgICAgICAgICAgICAgICAgICAgfCBaWlpaWiAgICAgICB8IElTTzg2MDEgZXh0ZW5kZWQgZm9ybWF0ICsgWiBpbmRpY2F0b3IgZm9yIG9mZnNldCAwICg9IFhYWFhYKSAgfCAtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICogIHwgICAgICAgICAgICAgICAgICAgIHwgTywgT08gJiBPT08gfCBTaG9ydCBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAqICB8ICAgICAgICAgICAgICAgICAgICB8IE9PT08gICAgICAgIHwgTG9uZyBsb2NhbGl6ZWQgR01UIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC0wODowMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogKgogKiBOb3RlIHRoYXQgdGltZXpvbmUgY29ycmVjdGlvbiBpcyBub3QgYXBwbGllZCB0byBhbiBJU08gc3RyaW5nIHRoYXQgaGFzIG5vIHRpbWUgY29tcG9uZW50LCBzdWNoIGFzICIyMDE2LTA5LTE5IgogKgogKiAjIyMgRm9ybWF0IGV4YW1wbGVzCiAqCiAqIFRoZXNlIGV4YW1wbGVzIHRyYW5zZm9ybSBhIGRhdGUgaW50byB2YXJpb3VzIGZvcm1hdHMsCiAqIGFzc3VtaW5nIHRoYXQgYGRhdGVPYmpgIGlzIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0IGZvcgogKiB5ZWFyOiAyMDE1LCBtb250aDogNiwgZGF5OiAxNSwgaG91cjogMjEsIG1pbnV0ZTogNDMsIHNlY29uZDogMTEsCiAqIGdpdmVuIGluIHRoZSBsb2NhbCB0aW1lIGZvciB0aGUgYGVuLVVTYCBsb2NhbGUuCiAqCiAqIGBgYAogKiB7eyBkYXRlT2JqIHwgZGF0ZSB9fSAgICAgICAgICAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1JwogKiB7eyBkYXRlT2JqIHwgZGF0ZTonbWVkaXVtJyB9fSAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1LCA5OjQzOjExIFBNJwogKiB7eyBkYXRlT2JqIHwgZGF0ZTonc2hvcnRUaW1lJyB9fSAgIC8vIG91dHB1dCBpcyAnOTo0MyBQTScKICoge3sgZGF0ZU9iaiB8IGRhdGU6J21tOnNzJyB9fSAgICAgICAvLyBvdXRwdXQgaXMgJzQzOjExJwogKiBgYGAKICoKICogIyMjIFVzYWdlIGV4YW1wbGUKICoKICogVGhlIGZvbGxvd2luZyBjb21wb25lbnQgdXNlcyBhIGRhdGUgcGlwZSB0byBkaXNwbGF5IHRoZSBjdXJyZW50IGRhdGUgaW4gZGlmZmVyZW50IGZvcm1hdHMuCiAqCiAqIGBgYAogKiBcQENvbXBvbmVudCh7CiAqICBzZWxlY3RvcjogJ2RhdGUtcGlwZScsCiAqICB0ZW1wbGF0ZTogYDxkaXY+CiAqICAgIDxwPlRvZGF5IGlzIHt7dG9kYXkgfCBkYXRlfX08L3A+CiAqICAgIDxwPk9yIGlmIHlvdSBwcmVmZXIsIHt7dG9kYXkgfCBkYXRlOidmdWxsRGF0ZSd9fTwvcD4KICogICAgPHA+VGhlIHRpbWUgaXMge3t0b2RheSB8IGRhdGU6J2g6bW0gYSB6J319PC9wPgogKiAgPC9kaXY+YAogKiB9KQogKiAvLyBHZXQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcyBhIGRhdGUtdGltZSB2YWx1ZS4KICogZXhwb3J0IGNsYXNzIERhdGVQaXBlQ29tcG9uZW50IHsKICogICB0b2RheTogbnVtYmVyID0gRGF0ZS5ub3coKTsKICogfQogKiBgYGAKICoKICogXEBwdWJsaWNBcGkKICovCi8vIGNsYW5nLWZvcm1hdCBvbgpjbGFzcyBEYXRlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGxvY2FsZSkgewogICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBkYXRlIGV4cHJlc3Npb246IGEgYERhdGVgIG9iamVjdCwgIGEgbnVtYmVyCiAgICAgKiAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCksIG9yIGFuIElTTyBzdHJpbmcgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lKS4KICAgICAqIEBwYXJhbSB7Pz19IGZvcm1hdCBUaGUgZGF0ZS90aW1lIGNvbXBvbmVudHMgdG8gaW5jbHVkZSwgdXNpbmcgcHJlZGVmaW5lZCBvcHRpb25zIG9yIGEKICAgICAqIGN1c3RvbSBmb3JtYXQgc3RyaW5nLgogICAgICogQHBhcmFtIHs/PX0gdGltZXpvbmUgQSB0aW1lem9uZSBvZmZzZXQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwgb3IgYSBzdGFuZGFyZAogICAgICogVVRDL0dNVCBvciBjb250aW5lbnRhbCBVUyB0aW1lem9uZSBhYmJyZXZpYXRpb24uCiAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgZW5kLXVzZXIncyBsb2NhbCBzeXN0ZW0gdGltZXpvbmUuCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIGBMT0NBTEVfSURgLCB3aGljaCBpcyBgZW4tVVNgIGJ5IGRlZmF1bHQuCiAgICAgKiBTZWUgW1NldHRpbmcgeW91ciBhcHAgbG9jYWxlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGRhdGUgc3RyaW5nIGluIHRoZSBkZXNpcmVkIGZvcm1hdC4KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBmb3JtYXQgPSAnbWVkaXVtRGF0ZScsIHRpbWV6b25lLCBsb2NhbGUpIHsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0LCBsb2NhbGUgfHwgdGhpcy5sb2NhbGUsIHRpbWV6b25lKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEYXRlUGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgfQogICAgfQp9CkRhdGVQaXBlLsm1ZmFjID0gZnVuY3Rpb24gRGF0ZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGF0ZVBpcGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTE9DQUxFX0lEJDEpKTsgfTsKRGF0ZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiZGF0ZSIsIHR5cGU6IERhdGVQaXBlLCBwdXJlOiB0cnVlIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRGF0ZVBpcGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTE9DQUxFX0lEJDEsXSB9XSB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2kxOG5fcGx1cmFsX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfSU5URVJQT0xBVElPTl9SRUdFWFAgPSAvIy9nOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBNYXBzIGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBwbHVyYWxpemVzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogIyMjIEV4YW1wbGUKICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvaTE4bl9waXBlLnRzIHJlZ2lvbj0nSTE4blBsdXJhbFBpcGVDb21wb25lbnQnfQogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSTE4blBsdXJhbFBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGl6YXRpb24KICAgICAqLwogICAgY29uc3RydWN0b3IoX2xvY2FsaXphdGlvbikgewogICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbiA9IF9sb2NhbGl6YXRpb247CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQKICAgICAqIEBwYXJhbSB7P30gcGx1cmFsTWFwIGFuIG9iamVjdCB0aGF0IG1pbWljcyB0aGUgSUNVIGZvcm1hdCwgc2VlCiAgICAgKiBodHRwOi8vdXNlcmd1aWRlLmljdS1wcm9qZWN0Lm9yZy9mb3JtYXRwYXJzZS9tZXNzYWdlcy4KICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBhIGBzdHJpbmdgIGRlZmluaW5nIHRoZSBsb2NhbGUgdG8gdXNlICh1c2VzIHRoZSBjdXJyZW50IHtcQGxpbmsgTE9DQUxFX0lEfSBieQogICAgICogZGVmYXVsdCkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFuc2Zvcm0odmFsdWUsIHBsdXJhbE1hcCwgbG9jYWxlKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICBpZiAodHlwZW9mIHBsdXJhbE1hcCAhPT0gJ29iamVjdCcgfHwgcGx1cmFsTWFwID09PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuUGx1cmFsUGlwZSwgcGx1cmFsTWFwKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleSA9IGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBPYmplY3Qua2V5cyhwbHVyYWxNYXApLCB0aGlzLl9sb2NhbGl6YXRpb24sIGxvY2FsZSk7CiAgICAgICAgcmV0dXJuIHBsdXJhbE1hcFtrZXldLnJlcGxhY2UoX0lOVEVSUE9MQVRJT05fUkVHRVhQLCB2YWx1ZS50b1N0cmluZygpKTsKICAgIH0KfQpJMThuUGx1cmFsUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEkxOG5QbHVyYWxQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEkxOG5QbHVyYWxQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nTG9jYWxpemF0aW9uKSk7IH07CkkxOG5QbHVyYWxQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImkxOG5QbHVyYWwiLCB0eXBlOiBJMThuUGx1cmFsUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkkxOG5QbHVyYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBOZ0xvY2FsaXphdGlvbiB9Cl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2kxOG5fc2VsZWN0X3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogR2VuZXJpYyBzZWxlY3RvciB0aGF0IGRpc3BsYXlzIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHZhbHVlLgogKgogKiBJZiBub25lIG9mIHRoZSBrZXlzIG9mIHRoZSBgbWFwcGluZ2AgbWF0Y2ggdGhlIGB2YWx1ZWAsIHRoZW4gdGhlIGNvbnRlbnQKICogb2YgdGhlIGBvdGhlcmAga2V5IGlzIHJldHVybmVkIHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2kxOG5fcGlwZS50cyByZWdpb249J0kxOG5TZWxlY3RQaXBlQ29tcG9uZW50J30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIEkxOG5TZWxlY3RQaXBlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBhIHN0cmluZyB0byBiZSBpbnRlcm5hdGlvbmFsaXplZC4KICAgICAqIEBwYXJhbSB7P30gbWFwcGluZyBhbiBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgdGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkCiAgICAgKiBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgcHJvdmlkZWQgYHZhbHVlYC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSwgbWFwcGluZykgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuU2VsZWN0UGlwZSwgbWFwcGluZyk7CiAgICAgICAgfQogICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbWFwcGluZ1t2YWx1ZV07CiAgICAgICAgfQogICAgICAgIGlmIChtYXBwaW5nLmhhc093blByb3BlcnR5KCdvdGhlcicpKSB7CiAgICAgICAgICAgIHJldHVybiBtYXBwaW5nWydvdGhlciddOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9Cn0KSTE4blNlbGVjdFBpcGUuybVmYWMgPSBmdW5jdGlvbiBJMThuU2VsZWN0UGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBJMThuU2VsZWN0UGlwZSkoKTsgfTsKSTE4blNlbGVjdFBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiaTE4blNlbGVjdCIsIHR5cGU6IEkxOG5TZWxlY3RQaXBlLCBwdXJlOiB0cnVlIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9qc29uX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAqIFxAZGVzY3JpcHRpb24KICoKICogQ29udmVydHMgYSB2YWx1ZSBpbnRvIGl0cyBKU09OLWZvcm1hdCByZXByZXNlbnRhdGlvbi4gIFVzZWZ1bCBmb3IgZGVidWdnaW5nLgogKgogKiBcQHVzYWdlTm90ZXMKICoKICogVGhlIGZvbGxvd2luZyBjb21wb25lbnQgdXNlcyBhIEpTT04gcGlwZSB0byBjb252ZXJ0IGFuIG9iamVjdAogKiB0byBKU09OIGZvcm1hdCwgYW5kIGRpc3BsYXlzIHRoZSBzdHJpbmcgaW4gYm90aCBmb3JtYXRzIGZvciBjb21wYXJpc29uLgogKgogKiB7XEBleGFtcGxlIGNvbW1vbi9waXBlcy90cy9qc29uX3BpcGUudHMgcmVnaW9uPSdKc29uUGlwZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBKc29uUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgQSB2YWx1ZSBvZiBhbnkgdHlwZSB0byBjb252ZXJ0IGludG8gYSBKU09OLWZvcm1hdCBzdHJpbmcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICB0cmFuc2Zvcm0odmFsdWUpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpOwogICAgfQp9Ckpzb25QaXBlLsm1ZmFjID0gZnVuY3Rpb24gSnNvblBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSnNvblBpcGUpKCk7IH07Ckpzb25QaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogImpzb24iLCB0eXBlOiBKc29uUGlwZSwgcHVyZTogZmFsc2UgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2tleXZhbHVlX3BpcGUudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEB0ZW1wbGF0ZSBLLCBWCiAqIEBwYXJhbSB7P30ga2V5CiAqIEBwYXJhbSB7P30gdmFsdWUKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIG1ha2VLZXlWYWx1ZVBhaXIoa2V5LCB2YWx1ZSkgewogICAgcmV0dXJuIHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9Owp9Ci8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIFRyYW5zZm9ybXMgT2JqZWN0IG9yIE1hcCBpbnRvIGFuIGFycmF5IG9mIGtleSB2YWx1ZSBwYWlycy4KICoKICogVGhlIG91dHB1dCBhcnJheSB3aWxsIGJlIG9yZGVyZWQgYnkga2V5cy4KICogQnkgZGVmYXVsdCB0aGUgY29tcGFyYXRvciB3aWxsIGJlIGJ5IFVuaWNvZGUgcG9pbnQgdmFsdWUuCiAqIFlvdSBjYW4gb3B0aW9uYWxseSBwYXNzIGEgY29tcGFyZUZuIGlmIHlvdXIga2V5cyBhcmUgY29tcGxleCB0eXBlcy4KICoKICogXEB1c2FnZU5vdGVzCiAqICMjIyBFeGFtcGxlcwogKgogKiBUaGlzIGV4YW1wbGVzIHNob3cgaG93IGFuIE9iamVjdCBvciBhIE1hcCBjYW4gYmUgaXRlcmF0ZWQgYnkgbmdGb3Igd2l0aCB0aGUgdXNlIG9mIHRoaXMga2V5dmFsdWUKICogcGlwZS4KICoKICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMva2V5dmFsdWVfcGlwZS50cyByZWdpb249J0tleVZhbHVlUGlwZSd9CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBLZXlWYWx1ZVBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRpZmZlcnMKICAgICAqLwogICAgY29uc3RydWN0b3IoZGlmZmVycykgewogICAgICAgIHRoaXMuZGlmZmVycyA9IGRpZmZlcnM7CiAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIEssIFYKICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAqIEBwYXJhbSB7Pz19IGNvbXBhcmVGbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKGlucHV0LCBjb21wYXJlRm4gPSBkZWZhdWx0Q29tcGFyYXRvcikgewogICAgICAgIGlmICghaW5wdXQgfHwgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApICYmIHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuZGlmZmVyKSB7CiAgICAgICAgICAgIC8vIG1ha2UgYSBkaWZmZXIgZm9yIHdoYXRldmVyIHR5cGUgd2UndmUgYmVlbiBwYXNzZWQgaW4KICAgICAgICAgICAgdGhpcy5kaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChpbnB1dCkuY3JlYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaWZmZXJDaGFuZ2VzID0gdGhpcy5kaWZmZXIuZGlmZigoLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpKSk7CiAgICAgICAgaWYgKGRpZmZlckNoYW5nZXMpIHsKICAgICAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTsKICAgICAgICAgICAgZGlmZmVyQ2hhbmdlcy5mb3JFYWNoSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHIpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMua2V5VmFsdWVzLnB1c2gobWFrZUtleVZhbHVlUGFpcihyLmtleSwgKC8qKiBAdHlwZSB7P30gKi8gKHIuY3VycmVudFZhbHVlKSkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLmtleVZhbHVlcy5zb3J0KGNvbXBhcmVGbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmtleVZhbHVlczsKICAgIH0KfQpLZXlWYWx1ZVBpcGUuybVmYWMgPSBmdW5jdGlvbiBLZXlWYWx1ZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgS2V5VmFsdWVQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEtleVZhbHVlRGlmZmVycykpOyB9OwpLZXlWYWx1ZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAia2V5dmFsdWUiLCB0eXBlOiBLZXlWYWx1ZVBpcGUsIHB1cmU6IGZhbHNlIH0pOwovKiogQG5vY29sbGFwc2UgKi8KS2V5VmFsdWVQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBLZXlWYWx1ZURpZmZlcnMgfQpdOwovKioKICogQHRlbXBsYXRlIEssIFYKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUEKICogQHBhcmFtIHs/fSBrZXlWYWx1ZUIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGtleVZhbHVlQSwga2V5VmFsdWVCKSB7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBhID0ga2V5VmFsdWVBLmtleTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGIgPSBrZXlWYWx1ZUIua2V5OwogICAgLy8gaWYgc2FtZSBleGl0IHdpdGggMDsKICAgIGlmIChhID09PSBiKQogICAgICAgIHJldHVybiAwOwogICAgLy8gbWFrZSBzdXJlIHRoYXQgdW5kZWZpbmVkIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzb3J0LgogICAgaWYgKGEgPT09IHVuZGVmaW5lZCkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChiID09PSB1bmRlZmluZWQpCiAgICAgICAgcmV0dXJuIC0xOwogICAgLy8gbWFrZSBzdXJlIHRoYXQgbnVsbHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNvcnQuCiAgICBpZiAoYSA9PT0gbnVsbCkKICAgICAgICByZXR1cm4gMTsKICAgIGlmIChiID09PSBudWxsKQogICAgICAgIHJldHVybiAtMTsKICAgIGlmICh0eXBlb2YgYSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgYiA9PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTsKICAgIH0KICAgIGlmICh0eXBlb2YgYSA9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYiA9PSAnbnVtYmVyJykgewogICAgICAgIHJldHVybiBhIC0gYjsKICAgIH0KICAgIGlmICh0eXBlb2YgYSA9PSAnYm9vbGVhbicgJiYgdHlwZW9mIGIgPT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxOwogICAgfQogICAgLy8gYGFgIGFuZCBgYmAgYXJlIG9mIGRpZmZlcmVudCB0eXBlcy4gQ29tcGFyZSB0aGVpciBzdHJpbmcgdmFsdWVzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgYVN0cmluZyA9IFN0cmluZyhhKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJTdHJpbmcgPSBTdHJpbmcoYik7CiAgICByZXR1cm4gYVN0cmluZyA9PSBiU3RyaW5nID8gMCA6IGFTdHJpbmcgPCBiU3RyaW5nID8gLTEgOiAxOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL251bWJlcl9waXBlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogKiBcQGRlc2NyaXB0aW9uCiAqCiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgaW50byBhIHN0cmluZywKICogZm9ybWF0dGVkIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMgdGhhdCBkZXRlcm1pbmUgZ3JvdXAgc2l6aW5nIGFuZAogKiBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljCiAqIGNvbmZpZ3VyYXRpb25zLgogKgogKiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiByb3VuZHMgb2ZmIHRvIHRoZSBuZWFyZXN0IHZhbHVlIHVzaW5nIHRoaXMKICogW3JvdW5kaW5nIG1ldGhvZF0oaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvQXJpdGhtZXRpYy9Sb3VuZGluZykuCiAqIFRoZSBiZWhhdmlvciBkaWZmZXJzIGZyb20gdGhhdCBvZiB0aGUgSmF2YVNjcmlwdCBgYGBNYXRoLnJvdW5kKClgYGAgZnVuY3Rpb24uCiAqIEluIHRoZSBmb2xsb3dpbmcgY2FzZSBmb3IgZXhhbXBsZSwgdGhlIHBpcGUgcm91bmRzIGRvd24gd2hlcmUKICogYGBgTWF0aC5yb3VuZCgpYGBgIHJvdW5kcyB1cDoKICoKICogYGBgaHRtbAogKiAtMi41IHwgbnVtYmVyOicxLjAtMCcKICogPiAtMwogKiBNYXRoLnJvdW5kKC0yLjUpCiAqID4gLTIKICogYGBgCiAqCiAqIEBzZWUgYGZvcm1hdE51bWJlcigpYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICogaW50byB0ZXh0IHN0cmluZ3MsIGFjY29yZGluZyB0byB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKICogd2hlcmUgdGhlIGNhbGxlcidzIGRlZmF1bHQgbG9jYWxlIGlzIGBlbi1VU2AuCiAqCiAqICMjIyBFeGFtcGxlCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL251bWJlcl9waXBlLnRzIiByZWdpb249J051bWJlclBpcGUnPjwvY29kZS1leGFtcGxlPgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgRGVjaW1hbFBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAqLwogICAgY29uc3RydWN0b3IoX2xvY2FsZSkgewogICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo8YnI+CiAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi4KICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAxYC4KICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMGAuCiAgICAgKiAgIC0gYG1heEZyYWN0aW9uRGlnaXRzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDNgLgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LgogICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvLCBsb2NhbGUpIHsKICAgICAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGxvY2FsZSA9IGxvY2FsZSB8fCB0aGlzLl9sb2NhbGU7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBmb3JtYXROdW1iZXIobnVtLCBsb2NhbGUsIGRpZ2l0c0luZm8pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKERlY2ltYWxQaXBlLCBlcnJvci5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9Cn0KRGVjaW1hbFBpcGUuybVmYWMgPSBmdW5jdGlvbiBEZWNpbWFsUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWNpbWFsUGlwZSkoybXJtWRpcmVjdGl2ZUluamVjdChMT0NBTEVfSUQkMSkpOyB9OwpEZWNpbWFsUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJudW1iZXIiLCB0eXBlOiBEZWNpbWFsUGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRlY2ltYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0xPQ0FMRV9JRCQxLF0gfV0gfQpdOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgcGVyY2VudGFnZQogKiBzdHJpbmcsIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzIHRoYXQgZGV0ZXJtaW5lIGdyb3VwIHNpemluZyBhbmQKICogc2VwYXJhdG9yLCBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciwgYW5kIG90aGVyIGxvY2FsZS1zcGVjaWZpYwogKiBjb25maWd1cmF0aW9ucy4KICoKICogQHNlZSBgZm9ybWF0UGVyY2VudCgpYAogKgogKiBcQHVzYWdlTm90ZXMKICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICogaW50byB0ZXh0IHN0cmluZ3MsIGFjY29yZGluZyB0byB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKICogd2hlcmUgdGhlIGNhbGxlcidzIGRlZmF1bHQgbG9jYWxlIGlzIGBlbi1VU2AuCiAqCiAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL3BlcmNlbnRfcGlwZS50cyIgcmVnaW9uPSdQZXJjZW50UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBQZXJjZW50UGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2xvY2FsZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihfbG9jYWxlKSB7CiAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgYSBwZXJjZW50YWdlLgogICAgICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbyBEZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9wdGlvbnMsIHNwZWNpZmllZCBieSBhIHN0cmluZwogICAgICogaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PGJyPgogICAgICogPGNvZGU+e21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfTwvY29kZT4uCiAgICAgKiAgIC0gYG1pbkludGVnZXJEaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMWAuCiAgICAgKiAgIC0gYG1pbkZyYWN0aW9uRGlnaXRzYDogVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDBgLgogICAgICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2A6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAwYC4KICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgYExPQ0FMRV9JRGAsIHdoaWNoIGlzIGBlbi1VU2AgYnkgZGVmYXVsdC4KICAgICAqIFNlZSBbU2V0dGluZyB5b3VyIGFwcCBsb2NhbGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC10aGUtbG9jYWxlLW9mLXlvdXItYXBwKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHRyYW5zZm9ybSh2YWx1ZSwgZGlnaXRzSW5mbywgbG9jYWxlKSB7CiAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5fbG9jYWxlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnVtID0gc3RyVG9OdW1iZXIodmFsdWUpOwogICAgICAgICAgICByZXR1cm4gZm9ybWF0UGVyY2VudChudW0sIGxvY2FsZSwgZGlnaXRzSW5mbyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoUGVyY2VudFBpcGUsIGVycm9yLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0KfQpQZXJjZW50UGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFBlcmNlbnRQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07ClBlcmNlbnRQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInBlcmNlbnQiLCB0eXBlOiBQZXJjZW50UGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovClBlcmNlbnRQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0xPQ0FMRV9JRCQxLF0gfV0gfQpdOwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgY3VycmVuY3kgc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcwogKiB0aGF0IGRldGVybWluZSBncm91cCBzaXppbmcgYW5kIHNlcGFyYXRvciwgZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIsCiAqIGFuZCBvdGhlciBsb2NhbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuCiAqCiAqIHtcQGEgY3VycmVuY3ktY29kZS1kZXByZWNhdGlvbn0KICogPGRpdiBjbGFzcz0iYWxlcnQgaXMtaGVscGZ1bCI+CiAqCiAqICoqRGVwcmVjYXRpb24gbm90aWNlOioqCiAqCiAqIFRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgaXMgY3VycmVudGx5IGFsd2F5cyBgVVNEYCBidXQgdGhpcyBpcyBkZXByZWNhdGVkIGZyb20gdjkuCiAqCiAqICoqSW4gdjExIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IGxvY2FsZSBpZGVudGlmaWVkIGJ5CiAqIHRoZSBgTE9DQUxfSURgIHRva2VuLiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkgZm9yCiAqIG1vcmUgaW5mb3JtYXRpb24uKioKICoKICogSWYgeW91IG5lZWQgdGhlIHByZXZpb3VzIGJlaGF2aW9yIHRoZW4gc2V0IGl0IGJ5IGNyZWF0aW5nIGEgYERFRkFVTFRfQ1VSUkVOQ1lfQ09ERWAgcHJvdmlkZXIgaW4KICogeW91ciBhcHBsaWNhdGlvbiBgTmdNb2R1bGVgOgogKgogKiBgYGB0cwogKiB7cHJvdmlkZTogREVGQVVMVF9DVVJSRU5DWV9DT0RFLCB1c2VWYWx1ZTogJ1VTRCd9CiAqIGBgYAogKgogKiA8L2Rpdj4KICoKICogQHNlZSBgZ2V0Q3VycmVuY3lTeW1ib2woKWAKICogQHNlZSBgZm9ybWF0Q3VycmVuY3koKWAKICoKICogXEB1c2FnZU5vdGVzCiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIHBpcGUgdHJhbnNmb3JtcyBudW1iZXJzCiAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsCiAqIHdoZXJlIHRoZSBjYWxsZXIncyBkZWZhdWx0IGxvY2FsZSBpcyBgZW4tVVNgLgogKgogKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvbW1vbi9waXBlcy90cy9jdXJyZW5jeV9waXBlLnRzIiByZWdpb249J0N1cnJlbmN5UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAqCiAqIFxAcHVibGljQXBpCiAqLwpjbGFzcyBDdXJyZW5jeVBpcGUgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAqIEBwYXJhbSB7Pz19IF9kZWZhdWx0Q3VycmVuY3lDb2RlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9sb2NhbGUsIF9kZWZhdWx0Q3VycmVuY3lDb2RlID0gJ1VTRCcpIHsKICAgICAgICB0aGlzLl9sb2NhbGUgPSBfbG9jYWxlOwogICAgICAgIHRoaXMuX2RlZmF1bHRDdXJyZW5jeUNvZGUgPSBfZGVmYXVsdEN1cnJlbmN5Q29kZTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgY3VycmVuY3kuCiAgICAgKiBAcGFyYW0gez89fSBjdXJyZW5jeUNvZGUgVGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpIGN1cnJlbmN5IGNvZGUsCiAgICAgKiBzdWNoIGFzIGBVU0RgIGZvciB0aGUgVVMgZG9sbGFyIGFuZCBgRVVSYCBmb3IgdGhlIGV1cm8uIFRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgY2FuIGJlCiAgICAgKiBjb25maWd1cmVkIHVzaW5nIHRoZSBgREVGQVVMVF9DVVJSRU5DWV9DT0RFYCBpbmplY3Rpb24gdG9rZW4uCiAgICAgKiBAcGFyYW0gez89fSBkaXNwbGF5IFRoZSBmb3JtYXQgZm9yIHRoZSBjdXJyZW5jeSBpbmRpY2F0b3IuIE9uZSBvZiB0aGUgZm9sbG93aW5nOgogICAgICogICAtIGBjb2RlYDogU2hvdyB0aGUgY29kZSAoc3VjaCBhcyBgVVNEYCkuCiAgICAgKiAgIC0gYHN5bWJvbGAoZGVmYXVsdCk6IFNob3cgdGhlIHN5bWJvbCAoc3VjaCBhcyBgJGApLgogICAgICogICAtIGBzeW1ib2wtbmFycm93YDogVXNlIHRoZSBuYXJyb3cgc3ltYm9sIGZvciBsb2NhbGVzIHRoYXQgaGF2ZSB0d28gc3ltYm9scyBmb3IgdGhlaXIKICAgICAqIGN1cnJlbmN5LgogICAgICogRm9yIGV4YW1wbGUsIHRoZSBDYW5hZGlhbiBkb2xsYXIgQ0FEIGhhcyB0aGUgc3ltYm9sIGBDQSRgIGFuZCB0aGUgc3ltYm9sLW5hcnJvdyBgJGAuIElmIHRoZQogICAgICogbG9jYWxlIGhhcyBubyBuYXJyb3cgc3ltYm9sLCB1c2VzIHRoZSBzdGFuZGFyZCBzeW1ib2wgZm9yIHRoZSBsb2NhbGUuCiAgICAgKiAgIC0gU3RyaW5nOiBVc2UgdGhlIGdpdmVuIHN0cmluZyB2YWx1ZSBpbnN0ZWFkIG9mIGEgY29kZSBvciBhIHN5bWJvbC4KICAgICAqIEZvciBleGFtcGxlLCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBzdXBwcmVzcyB0aGUgY3VycmVuY3kgJiBzeW1ib2wuCiAgICAgKiAgIC0gQm9vbGVhbiAobWFya2VkIGRlcHJlY2F0ZWQgaW4gdjUpOiBgdHJ1ZWAgZm9yIHN5bWJvbCBhbmQgZmFsc2UgZm9yIGBjb2RlYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDo8YnI+CiAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi4KICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgKiBEZWZhdWx0IGlzIGAxYC4KICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICogRGVmYXVsdCBpcyBgMmAuCiAgICAgKiAgIC0gYG1heEZyYWN0aW9uRGlnaXRzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4KICAgICAqIERlZmF1bHQgaXMgYDJgLgogICAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgbnVtYmVyIHdpbGwgYmUgZm9ybWF0dGVkIHdpdGggdGhlIHByb3BlciBhbW91bnQgb2YgZGlnaXRzLAogICAgICogZGVwZW5kaW5nIG9uIHdoYXQgdGhlIFtJU08gNDIxN10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzQyMTcpIHNwZWNpZmllcy4KICAgICAqIEZvciBleGFtcGxlLCB0aGUgQ2FuYWRpYW4gZG9sbGFyIGhhcyAyIGRpZ2l0cywgd2hlcmVhcyB0aGUgQ2hpbGVhbiBwZXNvIGhhcyBub25lLgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LgogICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBjdXJyZW5jeUNvZGUsIGRpc3BsYXkgPSAnc3ltYm9sJywgZGlnaXRzSW5mbywgbG9jYWxlKSB7CiAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5fbG9jYWxlOwogICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgIGlmICgoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZSkpICYmICgvKiogQHR5cGUgez99ICovIChjb25zb2xlLndhcm4pKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiB0aGUgY3VycmVuY3kgcGlwZSBoYXMgYmVlbiBjaGFuZ2VkIGluIEFuZ3VsYXIgdjUuIFRoZSBzeW1ib2xEaXNwbGF5IG9wdGlvbiAodGhpcmQgcGFyYW1ldGVyKSBpcyBub3cgYSBzdHJpbmcgaW5zdGVhZCBvZiBhIGJvb2xlYW4uIFRoZSBhY2NlcHRlZCB2YWx1ZXMgYXJlICJjb2RlIiwgInN5bWJvbCIgb3IgInN5bWJvbC1uYXJyb3ciLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpc3BsYXkgPSBkaXNwbGF5ID8gJ3N5bWJvbCcgOiAnY29kZSc7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY3VycmVuY3kgPSBjdXJyZW5jeUNvZGUgfHwgdGhpcy5fZGVmYXVsdEN1cnJlbmN5Q29kZTsKICAgICAgICBpZiAoZGlzcGxheSAhPT0gJ2NvZGUnKSB7CiAgICAgICAgICAgIGlmIChkaXNwbGF5ID09PSAnc3ltYm9sJyB8fCBkaXNwbGF5ID09PSAnc3ltYm9sLW5hcnJvdycpIHsKICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gZ2V0Q3VycmVuY3lTeW1ib2woY3VycmVuY3ksIGRpc3BsYXkgPT09ICdzeW1ib2wnID8gJ3dpZGUnIDogJ25hcnJvdycsIGxvY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyZW5jeSA9IGRpc3BsYXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeShudW0sIGxvY2FsZSwgY3VycmVuY3ksIGN1cnJlbmN5Q29kZSwgZGlnaXRzSW5mbyk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoQ3VycmVuY3lQaXBlLCBlcnJvci5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9Cn0KQ3VycmVuY3lQaXBlLsm1ZmFjID0gZnVuY3Rpb24gQ3VycmVuY3lQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEN1cnJlbmN5UGlwZSkoybXJtWRpcmVjdGl2ZUluamVjdChMT0NBTEVfSUQkMSksIMm1ybVkaXJlY3RpdmVJbmplY3QoREVGQVVMVF9DVVJSRU5DWV9DT0RFKSk7IH07CkN1cnJlbmN5UGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJjdXJyZW5jeSIsIHR5cGU6IEN1cnJlbmN5UGlwZSwgcHVyZTogdHJ1ZSB9KTsKLyoqIEBub2NvbGxhcHNlICovCkN1cnJlbmN5UGlwZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbREVGQVVMVF9DVVJSRU5DWV9DT0RFLF0gfV0gfQpdOwovKioKICogQHBhcmFtIHs/fSB2YWx1ZQogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlICE9PSB2YWx1ZTsKfQovKioKICogVHJhbnNmb3JtcyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyIChpZiBuZWVkZWQpLgogKiBAcGFyYW0gez99IHZhbHVlCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzdHJUb051bWJlcih2YWx1ZSkgewogICAgLy8gQ29udmVydCBzdHJpbmdzIHRvIG51bWJlcnMKICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpc05hTihOdW1iZXIodmFsdWUpIC0gcGFyc2VGbG9hdCh2YWx1ZSkpKSB7CiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7CiAgICB9CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgbnVtYmVyYCk7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGlwZXMvc2xpY2VfcGlwZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICogXEBkZXNjcmlwdGlvbgogKgogKiBDcmVhdGVzIGEgbmV3IGBBcnJheWAgb3IgYFN0cmluZ2AgY29udGFpbmluZyBhIHN1YnNldCAoc2xpY2UpIG9mIHRoZSBlbGVtZW50cy4KICoKICogXEB1c2FnZU5vdGVzCiAqCiAqIEFsbCBiZWhhdmlvciBpcyBiYXNlZCBvbiB0aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIEphdmFTY3JpcHQgQVBJIGBBcnJheS5wcm90b3R5cGUuc2xpY2UoKWAKICogYW5kIGBTdHJpbmcucHJvdG90eXBlLnNsaWNlKClgLgogKgogKiBXaGVuIG9wZXJhdGluZyBvbiBhbiBgQXJyYXlgLCB0aGUgcmV0dXJuZWQgYEFycmF5YCBpcyBhbHdheXMgYSBjb3B5IGV2ZW4gd2hlbiBhbGwKICogdGhlIGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZC4KICoKICogV2hlbiBvcGVyYXRpbmcgb24gYSBibGFuayB2YWx1ZSwgdGhlIHBpcGUgcmV0dXJucyB0aGUgYmxhbmsgdmFsdWUuCiAqCiAqICMjIyBMaXN0IEV4YW1wbGUKICoKICogVGhpcyBgbmdGb3JgIGV4YW1wbGU6CiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL3NsaWNlX3BpcGUudHMgcmVnaW9uPSdTbGljZVBpcGVfbGlzdCd9CiAqCiAqIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CiAqCiAqIGBgYGh0bWwKICogPGxpPmI8L2xpPgogKiA8bGk+YzwvbGk+CiAqIGBgYAogKgogKiAjIyMgU3RyaW5nIEV4YW1wbGVzCiAqCiAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL3NsaWNlX3BpcGUudHMgcmVnaW9uPSdTbGljZVBpcGVfc3RyaW5nJ30KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFNsaWNlUGlwZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gc3RhcnQKICAgICAqIEBwYXJhbSB7Pz19IGVuZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdHJhbnNmb3JtKHZhbHVlLCBzdGFydCwgZW5kKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHModmFsdWUpKSB7CiAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihTbGljZVBpcGUsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKG9iaikgewogICAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KG9iaik7CiAgICB9Cn0KU2xpY2VQaXBlLsm1ZmFjID0gZnVuY3Rpb24gU2xpY2VQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNsaWNlUGlwZSkoKTsgfTsKU2xpY2VQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInNsaWNlIiwgdHlwZTogU2xpY2VQaXBlLCBwdXJlOiBmYWxzZSB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvY29tbW9uX21vZHVsZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovLyBOb3RlOiBUaGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvY2F0aW9uIHByb3ZpZGVycywKLy8gYXMgdGhleSBuZWVkIHNvbWUgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIHRvIHdvcmsuCi8qKgogKiBFeHBvcnRzIGFsbCB0aGUgYmFzaWMgQW5ndWxhciBkaXJlY3RpdmVzIGFuZCBwaXBlcywKICogc3VjaCBhcyBgTmdJZmAsIGBOZ0Zvck9mYCwgYERlY2ltYWxQaXBlYCwgYW5kIHNvIG9uLgogKiBSZS1leHBvcnRlZCBieSBgQnJvd3Nlck1vZHVsZWAsIHdoaWNoIGlzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgaW4gdGhlIHJvb3QKICogYEFwcE1vZHVsZWAgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcCB3aXRoIHRoZSBDTEkgYG5ld2AgY29tbWFuZC4KICoKICogKiBUaGUgYHByb3ZpZGVyc2Agb3B0aW9ucyBjb25maWd1cmUgdGhlIE5nTW9kdWxlJ3MgaW5qZWN0b3IgdG8gcHJvdmlkZQogKiBsb2NhbGl6YXRpb24gZGVwZW5kZW5jaWVzIHRvIG1lbWJlcnMuCiAqICogVGhlIGBleHBvcnRzYCBvcHRpb25zIG1ha2UgdGhlIGRlY2xhcmVkIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGF2YWlsYWJsZSBmb3IgaW1wb3J0CiAqIGJ5IG90aGVyIE5nTW9kdWxlcy4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIENvbW1vbk1vZHVsZSB7Cn0KQ29tbW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQ29tbW9uTW9kdWxlIH0pOwpDb21tb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBDb21tb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29tbW9uTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICB7IHByb3ZpZGU6IE5nTG9jYWxpemF0aW9uLCB1c2VDbGFzczogTmdMb2NhbGVMb2NhbGl6YXRpb24gfSwKICAgIF0gfSk7CihmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENvbW1vbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtOZ0NsYXNzLAogICAgICAgIE5nQ29tcG9uZW50T3V0bGV0LAogICAgICAgIE5nRm9yT2YsCiAgICAgICAgTmdJZiwKICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LAogICAgICAgIE5nU3R5bGUsCiAgICAgICAgTmdTd2l0Y2gsCiAgICAgICAgTmdTd2l0Y2hDYXNlLAogICAgICAgIE5nU3dpdGNoRGVmYXVsdCwKICAgICAgICBOZ1BsdXJhbCwKICAgICAgICBOZ1BsdXJhbENhc2UsCiAgICAgICAgQXN5bmNQaXBlLAogICAgICAgIFVwcGVyQ2FzZVBpcGUsCiAgICAgICAgTG93ZXJDYXNlUGlwZSwKICAgICAgICBKc29uUGlwZSwKICAgICAgICBTbGljZVBpcGUsCiAgICAgICAgRGVjaW1hbFBpcGUsCiAgICAgICAgUGVyY2VudFBpcGUsCiAgICAgICAgVGl0bGVDYXNlUGlwZSwKICAgICAgICBDdXJyZW5jeVBpcGUsCiAgICAgICAgRGF0ZVBpcGUsCiAgICAgICAgSTE4blBsdXJhbFBpcGUsCiAgICAgICAgSTE4blNlbGVjdFBpcGUsCiAgICAgICAgS2V5VmFsdWVQaXBlXSwgZXhwb3J0czogW05nQ2xhc3MsCiAgICAgICAgTmdDb21wb25lbnRPdXRsZXQsCiAgICAgICAgTmdGb3JPZiwKICAgICAgICBOZ0lmLAogICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsCiAgICAgICAgTmdTdHlsZSwKICAgICAgICBOZ1N3aXRjaCwKICAgICAgICBOZ1N3aXRjaENhc2UsCiAgICAgICAgTmdTd2l0Y2hEZWZhdWx0LAogICAgICAgIE5nUGx1cmFsLAogICAgICAgIE5nUGx1cmFsQ2FzZSwKICAgICAgICBBc3luY1BpcGUsCiAgICAgICAgVXBwZXJDYXNlUGlwZSwKICAgICAgICBMb3dlckNhc2VQaXBlLAogICAgICAgIEpzb25QaXBlLAogICAgICAgIFNsaWNlUGlwZSwKICAgICAgICBEZWNpbWFsUGlwZSwKICAgICAgICBQZXJjZW50UGlwZSwKICAgICAgICBUaXRsZUNhc2VQaXBlLAogICAgICAgIEN1cnJlbmN5UGlwZSwKICAgICAgICBEYXRlUGlwZSwKICAgICAgICBJMThuUGx1cmFsUGlwZSwKICAgICAgICBJMThuU2VsZWN0UGlwZSwKICAgICAgICBLZXlWYWx1ZVBpcGVdIH0pOyB9KSgpOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9wbGF0Zm9ybV9pZC50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICovCi8qKiBAdHlwZSB7P30gKi8KY29uc3QgUExBVEZPUk1fQlJPV1NFUl9JRCA9ICdicm93c2VyJzsKLyoqCiAqIFJldHVybnMgd2hldGhlciBhIHBsYXRmb3JtIGlkIHJlcHJlc2VudHMgYSBicm93c2VyIHBsYXRmb3JtLgogKiBcQHB1YmxpY0FwaQogKiBAcGFyYW0gez99IHBsYXRmb3JtSWQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpIHsKICAgIHJldHVybiBwbGF0Zm9ybUlkID09PSBQTEFURk9STV9CUk9XU0VSX0lEOwp9CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ZlcnNpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkVSU0lPTiQxID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ZpZXdwb3J0X3Njcm9sbGVyLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBEZWZpbmVzIGEgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZXIuIEltcGxlbWVudGVkIGJ5IGBCcm93c2VyVmlld3BvcnRTY3JvbGxlcmAuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgVmlld3BvcnRTY3JvbGxlciB7Cn0KLy8gRGUtc3VnYXJlZCB0cmVlLXNoYWthYmxlIGluamVjdGlvbgovLyBTZWUgIzIzOTE3Ci8qKiBAbm9jb2xsYXBzZSAqLwpWaWV3cG9ydFNjcm9sbGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgIHRva2VuOiBWaWV3cG9ydFNjcm9sbGVyLAogICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgZmFjdG9yeTogKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gbmV3IEJyb3dzZXJWaWV3cG9ydFNjcm9sbGVyKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIHdpbmRvdywgybXJtWluamVjdChFcnJvckhhbmRsZXIpKSkKfSk7Ci8qKgogKiBNYW5hZ2VzIHRoZSBzY3JvbGwgcG9zaXRpb24gZm9yIGEgYnJvd3NlciB3aW5kb3cuCiAqLwpjbGFzcyBCcm93c2VyVmlld3BvcnRTY3JvbGxlciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gd2luZG93CiAgICAgKiBAcGFyYW0gez99IGVycm9ySGFuZGxlcgogICAgICovCiAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgd2luZG93LCBlcnJvckhhbmRsZXIpIHsKICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7CiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgICAgdGhpcy5vZmZzZXQgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBbMCwgMF0pOwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHRoZSB0b3Agb2Zmc2V0IHVzZWQgd2hlbiBzY3JvbGxpbmcgdG8gYW4gYW5jaG9yLgogICAgICogQHBhcmFtIHs/fSBvZmZzZXQgQSBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMgKGEgdHVwbGUgd2l0aCB4IGFuZCB5IHZhbHVlcykKICAgICAqIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0b3Agb2Zmc2V0IHBvc2l0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldE9mZnNldChvZmZzZXQpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvZmZzZXQpKSB7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gb2Zmc2V0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4KICAgICAqIEByZXR1cm4gez99IFRoZSBwb3NpdGlvbiBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuCiAgICAgKi8KICAgIGdldFNjcm9sbFBvc2l0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnN1cHBvcnRTY3JvbGxSZXN0b3JhdGlvbigpKSB7CiAgICAgICAgICAgIHJldHVybiBbdGhpcy53aW5kb3cuc2Nyb2xsWCwgdGhpcy53aW5kb3cuc2Nyb2xsWV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gWzAsIDBdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgc2Nyb2xsIHBvc2l0aW9uLgogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbiBUaGUgbmV3IHBvc2l0aW9uIGluIHNjcmVlbiBjb29yZGluYXRlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNjcm9sbFRvUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICB0aGlzLndpbmRvdy5zY3JvbGxUbyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2Nyb2xscyB0byBhbiBhbmNob3IgZWxlbWVudC4KICAgICAqIEBwYXJhbSB7P30gYW5jaG9yIFRoZSBJRCBvZiB0aGUgYW5jaG9yIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzY3JvbGxUb0FuY2hvcihhbmNob3IpIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICAvLyBFc2NhcGUgYW55dGhpbmcgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYCBhcyBpdCBjYW4gdGhyb3cgZXJyb3JzIGFuZCBzdG9wIHRoZSBhcHBsaWNhdGlvbgogICAgICAgICAgICAvLyBmcm9tIHdvcmtpbmcgaWYgaW52YWxpZCB2YWx1ZXMgYXJlIHBhc3NlZC4KICAgICAgICAgICAgaWYgKHRoaXMud2luZG93LkNTUyAmJiB0aGlzLndpbmRvdy5DU1MuZXNjYXBlKSB7CiAgICAgICAgICAgICAgICBhbmNob3IgPSB0aGlzLndpbmRvdy5DU1MuZXNjYXBlKGFuY2hvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhbmNob3IgPSBhbmNob3IucmVwbGFjZSgvKFwifFwnXCB8OnxcLnxcW3xcXXwsfD0pL2csICdcXCQxJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsU2VsZWN0ZWRCeUlkID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHthbmNob3J9YCk7CiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5SWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChlbFNlbGVjdGVkQnlJZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxTZWxlY3RlZEJ5TmFtZSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW25hbWU9JyR7YW5jaG9yfSddYCk7CiAgICAgICAgICAgICAgICBpZiAoZWxTZWxlY3RlZEJ5TmFtZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KGVsU2VsZWN0ZWRCeU5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIERpc2FibGVzIGF1dG9tYXRpYyBzY3JvbGwgcmVzdG9yYXRpb24gcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuCiAgICAgKiBAcGFyYW0gez99IHNjcm9sbFJlc3RvcmF0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24oc2Nyb2xsUmVzdG9yYXRpb24pIHsKICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnkgPSB0aGlzLndpbmRvdy5oaXN0b3J5OwogICAgICAgICAgICBpZiAoaGlzdG9yeSAmJiBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uKSB7CiAgICAgICAgICAgICAgICBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gc2Nyb2xsUmVzdG9yYXRpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzY3JvbGxUb0VsZW1lbnQoZWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsZWZ0ID0gcmVjdC5sZWZ0ICsgdGhpcy53aW5kb3cucGFnZVhPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRvcCA9IHJlY3QudG9wICsgdGhpcy53aW5kb3cucGFnZVlPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7CiAgICAgICAgdGhpcy53aW5kb3cuc2Nyb2xsVG8obGVmdCAtIG9mZnNldFswXSwgdG9wIC0gb2Zmc2V0WzFdKTsKICAgIH0KICAgIC8qKgogICAgICogV2Ugb25seSBzdXBwb3J0IHNjcm9sbCByZXN0b3JhdGlvbiB3aGVuIHdlIGNhbiBnZXQgYSBob2xkIG9mIHdpbmRvdy4KICAgICAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIGJlaGF2aW9yIHdoZW4gcnVubmluZyBpbiBhIHdlYiB3b3JrZXIuCiAgICAgKgogICAgICogTGlmdGluZyB0aGlzIHJlc3RyaWN0aW9uIHJpZ2h0IG5vdyB3b3VsZCByZXF1aXJlIG1vcmUgY2hhbmdlcyBpbiB0aGUgZG9tIGFkYXB0ZXIuCiAgICAgKiBTaW5jZSB3ZWJ3b3JrZXJzIGFyZW4ndCB3aWRlbHkgdXNlZCwgd2Ugd2lsbCBsaWZ0IGl0IG9uY2UgUm91dGVyU2Nyb2xsZXIgaXMKICAgICAqIGJhdHRsZS10ZXN0ZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMud2luZG93ICYmICEhdGhpcy53aW5kb3cuc2Nyb2xsVG87CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQp9CgovKioKICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjIKICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAqIExpY2Vuc2U6IE1JVAogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvZ2VuZXJpY19icm93c2VyX2FkYXB0ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFueSBicm93c2VyIGVudmlyb25tZW50LgogKgogKiBcQHNlY3VyaXR5IFRyZWFkIGNhcmVmdWxseSEgSW50ZXJhY3Rpbmcgd2l0aCB0aGUgRE9NIGRpcmVjdGx5IGlzIGRhbmdlcm91cyBhbmQKICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyIGV4dGVuZHMgRG9tQWRhcHRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdXBwb3J0c0RPTUV2ZW50cygpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci9icm93c2VyX2FkYXB0ZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY29uc3QgybUwJDUgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+IHsKICAgIGlmIChfZ2xvYmFsWydOb2RlJ10pIHsKICAgICAgICByZXR1cm4gX2dsb2JhbFsnTm9kZSddLnByb3RvdHlwZS5jb250YWlucyB8fCAoLyoqCiAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTsKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodW5kZWZpbmVkKSk7Cn07Ci8qKiBAdHlwZSB7P30gKi8KY29uc3Qgbm9kZUNvbnRhaW5zID0gKCjJtTAkNSkpKCk7Ci8qKgogKiBBIGBEb21BZGFwdGVyYCBwb3dlcmVkIGJ5IGZ1bGwgYnJvd3NlciBET00gQVBJcy4KICoKICogXEBzZWN1cml0eSBUcmVhZCBjYXJlZnVsbHkhIEludGVyYWN0aW5nIHdpdGggdGhlIERPTSBkaXJlY3RseSBpcyBkYW5nZXJvdXMgYW5kCiAqIGNhbiBpbnRyb2R1Y2UgWFNTIHJpc2tzLgogKi8KLyogdHNsaW50OmRpc2FibGU6cmVxdWlyZVBhcmFtZXRlclR5cGUgbm8tY29uc29sZSAqLwpjbGFzcyBCcm93c2VyRG9tQWRhcHRlciBleHRlbmRzIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBtYWtlQ3VycmVudCgpIHsKICAgICAgICBzZXRSb290RG9tQWRhcHRlcihuZXcgQnJvd3NlckRvbUFkYXB0ZXIoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0UHJvcGVydHkoZWwsIG5hbWUpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChlbCkpKVtuYW1lXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nKGVycm9yKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nR3JvdXAoZXJyb3IpIHsKICAgICAgICBpZiAod2luZG93LmNvbnNvbGUpIHsKICAgICAgICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXAgJiYgd2luZG93LmNvbnNvbGUuZ3JvdXAoZXJyb3IpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbG9nR3JvdXBFbmQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kICYmIHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IGV2dAogICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgb25BbmRDYW5jZWwoZWwsIGV2dCwgbGlzdGVuZXIpIHsKICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTsKICAgICAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZgogICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE3NDA2CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gZXZ0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkaXNwYXRjaEV2ZW50KGVsLCBldnQpIHsKICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldFZhbHVlKGVsKSB7CiAgICAgICAgcmV0dXJuIGVsLnZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhZ05hbWUKICAgICAqIEBwYXJhbSB7Pz19IGRvYwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2MpIHsKICAgICAgICBkb2MgPSBkb2MgfHwgdGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKTsKICAgICAgICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUh0bWxEb2N1bWVudCgpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCdmYWtlVGl0bGUnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0RGVmYXVsdERvY3VtZW50KCkgewogICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpc0VsZW1lbnROb2RlKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgaXNTaGFkb3dSb290KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0R2xvYmFsRXZlbnRUYXJnZXQoZG9jLCB0YXJnZXQpIHsKICAgICAgICBpZiAodGFyZ2V0ID09PSAnd2luZG93JykgewogICAgICAgICAgICByZXR1cm4gd2luZG93OwogICAgICAgIH0KICAgICAgICBpZiAodGFyZ2V0ID09PSAnZG9jdW1lbnQnKSB7CiAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgfQogICAgICAgIGlmICh0YXJnZXQgPT09ICdib2R5JykgewogICAgICAgICAgICByZXR1cm4gZG9jLmJvZHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRIaXN0b3J5KCkgewogICAgICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0TG9jYXRpb24oKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGdldEJhc2VIcmVmKGRvYykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBocmVmID0gZ2V0QmFzZUVsZW1lbnRIcmVmKCk7CiAgICAgICAgcmV0dXJuIGhyZWYgPT0gbnVsbCA/IG51bGwgOiByZWxhdGl2ZVBhdGgoaHJlZik7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlc2V0QmFzZUVsZW1lbnQoKSB7CiAgICAgICAgYmFzZUVsZW1lbnQgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRVc2VyQWdlbnQoKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBwZXJmb3JtYW5jZU5vdygpIHsKICAgICAgICAvLyBwZXJmb3JtYW5jZS5ub3coKSBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBicm93c2Vycywgc2VlCiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNzZWFyY2g9cGVyZm9ybWFuY2Uubm93CiAgICAgICAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZSAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93ID8gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpIDoKICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzQ29va2llcygpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgIHJldHVybiBwYXJzZUNvb2tpZVZhbHVlKGRvY3VtZW50LmNvb2tpZSwgbmFtZSk7CiAgICB9Cn0KLyoqIEB0eXBlIHs/fSAqLwpsZXQgYmFzZUVsZW1lbnQgPSBudWxsOwovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpIHsKICAgIGlmICghYmFzZUVsZW1lbnQpIHsKICAgICAgICBiYXNlRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJykpKTsKICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBiYXNlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKfQovLyBiYXNlZCBvbiB1cmxVdGlscy5qcyBpbiBBbmd1bGFySlMgMQovKiogQHR5cGUgez99ICovCmxldCB1cmxQYXJzaW5nTm9kZTsKLyoqCiAqIEBwYXJhbSB7P30gdXJsCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiByZWxhdGl2ZVBhdGgodXJsKSB7CiAgICBpZiAoIXVybFBhcnNpbmdOb2RlKSB7CiAgICAgICAgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICB9CiAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpOwogICAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6CiAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWU7Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvc2VydmVyLXRyYW5zaXRpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEFuIGlkIHRoYXQgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYmVpbmcgYm9vdHN0cmFwcGVkLCB0aGF0IHNob3VsZAogKiBtYXRjaCBhY3Jvc3MgdGhlIGNsaWVudC9zZXJ2ZXIgYm91bmRhcnkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVFJBTlNJVElPTl9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignVFJBTlNJVElPTl9JRCcpOwovKioKICogQHBhcmFtIHs/fSB0cmFuc2l0aW9uSWQKICogQHBhcmFtIHs/fSBkb2N1bWVudAogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBhcHBJbml0aWFsaXplckZhY3RvcnkodHJhbnNpdGlvbklkLCBkb2N1bWVudCwgaW5qZWN0b3IpIHsKICAgIHJldHVybiAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgLy8gV2FpdCBmb3IgYWxsIGFwcGxpY2F0aW9uIGluaXRpYWxpemVycyB0byBiZSBjb21wbGV0ZWQgYmVmb3JlIHJlbW92aW5nIHRoZSBzdHlsZXMgc2V0IGJ5CiAgICAgICAgLy8gdGhlIHNlcnZlci4KICAgICAgICBpbmplY3Rvci5nZXQoQXBwbGljYXRpb25Jbml0U3RhdHVzKS5kb25lUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb20gPSBnZXRET00oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgc3R5bGVbbmctdHJhbnNpdGlvbl1gKSk7CiAgICAgICAgICAgIHN0eWxlcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ25nLXRyYW5zaXRpb24nKSA9PT0gdHJhbnNpdGlvbklkKSkKICAgICAgICAgICAgICAgIC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWwgPT4gZG9tLnJlbW92ZShlbCkpKTsKICAgICAgICB9KSk7CiAgICB9KTsKfQovKiogQHR5cGUgez99ICovCmNvbnN0IFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUyA9IFsKICAgIHsKICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsCiAgICAgICAgdXNlRmFjdG9yeTogYXBwSW5pdGlhbGl6ZXJGYWN0b3J5LAogICAgICAgIGRlcHM6IFtUUkFOU0lUSU9OX0lELCBET0NVTUVOVCQxLCBJbmplY3Rvcl0sCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH0sCl07CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9icm93c2VyL3Rlc3RhYmlsaXR5LnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIEJyb3dzZXJHZXRUZXN0YWJpbGl0eSB7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpbml0KCkgewogICAgICAgIHNldFRlc3RhYmlsaXR5R2V0dGVyKG5ldyBCcm93c2VyR2V0VGVzdGFiaWxpdHkoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFRvV2luZG93KHJlZ2lzdHJ5KSB7CiAgICAgICAgX2dsb2JhbFsnZ2V0QW5ndWxhclRlc3RhYmlsaXR5J10gPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmluZEluQW5jZXN0b3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxlbSwgZmluZEluQW5jZXN0b3JzID0gdHJ1ZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRlc3RhYmlsaXR5ID0gcmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7CiAgICAgICAgICAgIGlmICh0ZXN0YWJpbGl0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0ZXN0YWJpbGl0eTsKICAgICAgICB9KTsKICAgICAgICBfZ2xvYmFsWydnZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcyddID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gcmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcygpKTsKICAgICAgICBfZ2xvYmFsWydnZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzJ10gPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiByZWdpc3RyeS5nZXRBbGxSb290RWxlbWVudHMoKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdoZW5BbGxTdGFibGUgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNhbGxiYWNrIC8qKiBUT0RPICM5MTAwICovKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGVzdGFiaWxpdGllcyA9IF9nbG9iYWxbJ2dldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzJ10oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY291bnQgPSB0ZXN0YWJpbGl0aWVzLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZGlkV29yayA9IGZhbHNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlY3JlbWVudCA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaWRXb3JrXwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGRpZFdvcmtfIC8qKiBUT0RPICM5MTAwICovKSB7CiAgICAgICAgICAgICAgICBkaWRXb3JrID0gZGlkV29yayB8fCBkaWRXb3JrXzsKICAgICAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRpZFdvcmspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGVzdGFiaWxpdGllcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZXN0YWJpbGl0eQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKHRlc3RhYmlsaXR5IC8qKiBUT0RPICM5MTAwICovKSB7CiAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0eS53aGVuU3RhYmxlKGRlY3JlbWVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KTsKICAgICAgICBpZiAoIV9nbG9iYWxbJ2ZyYW1ld29ya1N0YWJpbGl6ZXJzJ10pIHsKICAgICAgICAgICAgX2dsb2JhbFsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXSA9IFtdOwogICAgICAgIH0KICAgICAgICBfZ2xvYmFsWydmcmFtZXdvcmtTdGFiaWxpemVycyddLnB1c2god2hlbkFsbFN0YWJsZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnkKICAgICAqIEBwYXJhbSB7P30gZWxlbQogICAgICogQHBhcmFtIHs/fSBmaW5kSW5BbmNlc3RvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZWxlbSwgZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgaWYgKGVsZW0gPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHQgPSByZWdpc3RyeS5nZXRUZXN0YWJpbGl0eShlbGVtKTsKICAgICAgICBpZiAodCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0RE9NKCkuaXNTaGFkb3dSb290KGVsZW0pKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgKCgvKiogQHR5cGUgez99ICovIChlbGVtKSkpLmhvc3QsIHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0ucGFyZW50RWxlbWVudCwgdHJ1ZSk7CiAgICB9Cn0KLyoqCiAqIEV4cG9ydHMgdGhlIHZhbHVlIHVuZGVyIGEgZ2l2ZW4gYG5hbWVgIGluIHRoZSBnbG9iYWwgcHJvcGVydHkgYG5nYC4gRm9yIGV4YW1wbGUgYG5nLnByb2JlYCBpZgogKiBgbmFtZWAgaXMgYCdwcm9iZSdgLgogKiBAcGFyYW0gez99IG5hbWUgTmFtZSB1bmRlciB3aGljaCBpdCB3aWxsIGJlIGV4cG9ydGVkLiBLZWVwIGluIG1pbmQgdGhpcyB3aWxsIGJlIGEgcHJvcGVydHkgb2YgdGhlCiAqIGdsb2JhbCBgbmdgIG9iamVjdC4KICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXhwb3J0LgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXhwb3J0TmdWYXIobmFtZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlb2YgQ09NUElMRUQgPT09ICd1bmRlZmluZWQnIHx8ICFDT01QSUxFRCkgewogICAgICAgIC8vIE5vdGU6IHdlIGNhbid0IGV4cG9ydCBgbmdgIHdoZW4gdXNpbmcgY2xvc3VyZSBlbmhhbmNlZCBvcHRpbWl6YXRpb24gYXM6CiAgICAgICAgLy8gLSBjbG9zdXJlIGRlY2xhcmVzIGdsb2JhbHMgaXRzZWxmIGZvciBtaW5pZmllZCBuYW1lcywgd2hpY2ggc29tZXRpbWVzIGNsb2JiZXIgb3VyIGBuZ2AgZ2xvYmFsCiAgICAgICAgLy8gLSB3ZSBjYW4ndCBkZWNsYXJlIGEgY2xvc3VyZSBleHRlcm4gYXMgdGhlIG5hbWVzcGFjZSBgbmdgIGlzIGFscmVhZHkgdXNlZCB3aXRoaW4gR29vZ2xlCiAgICAgICAgLy8gICBmb3IgdHlwaW5ncyBmb3IgYW5ndWxhckpTICh2aWEgYGdvb2cucHJvdmlkZSgnbmcuLi4uJylgKS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmcgPSBfZ2xvYmFsWyduZyddID0gKCgvKiogQHR5cGUgez99ICovIChfZ2xvYmFsWyduZyddKSkpIHx8IHt9OwogICAgICAgIG5nW25hbWVdID0gdmFsdWU7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9kZWJ1Zy9uZ19wcm9iZS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwpjb25zdCDJtTAkMSQxID0gLyoqCiAqIEByZXR1cm4gez99CiAqLwooKSA9PiAoewogICAgJ0FwcGxpY2F0aW9uUmVmJzogQXBwbGljYXRpb25SZWYsCiAgICAnTmdab25lJzogTmdab25lLAp9KTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDT1JFX1RPS0VOUyA9ICgoybUwJDEkMSkpKCk7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSU5TUEVDVF9HTE9CQUxfTkFNRSA9ICdwcm9iZSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ09SRV9UT0tFTlNfR0xPQkFMX05BTUUgPSAnY29yZVRva2Vucyc7Ci8qKgogKiBSZXR1cm5zIGEge1xAbGluayBEZWJ1Z0VsZW1lbnR9IGZvciB0aGUgZ2l2ZW4gbmF0aXZlIERPTSBlbGVtZW50LCBvcgogKiBudWxsIGlmIHRoZSBnaXZlbiBuYXRpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIEFuZ3VsYXIgdmlldyBhc3NvY2lhdGVkCiAqIHdpdGggaXQuCiAqIEBwYXJhbSB7P30gZWxlbWVudAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5zcGVjdE5hdGl2ZUVsZW1lbnRSMihlbGVtZW50KSB7CiAgICByZXR1cm4gZ2V0RGVidWdOb2RlUjIoKTsKfQovKioKICogQHBhcmFtIHs/fSBjb3JlVG9rZW5zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfY3JlYXRlTmdQcm9iZVIyKGNvcmVUb2tlbnMpIHsKICAgIGV4cG9ydE5nVmFyKElOU1BFQ1RfR0xPQkFMX05BTUUsIGluc3BlY3ROYXRpdmVFbGVtZW50UjIpOwogICAgZXhwb3J0TmdWYXIoQ09SRV9UT0tFTlNfR0xPQkFMX05BTUUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgQ09SRV9UT0tFTlMpLCBfbmdQcm9iZVRva2Vuc1RvTWFwKGNvcmVUb2tlbnMgfHwgW10pKSk7CiAgICByZXR1cm4gKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gaW5zcGVjdE5hdGl2ZUVsZW1lbnRSMik7Cn0KLyoqCiAqIEBwYXJhbSB7P30gdG9rZW5zCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBfbmdQcm9iZVRva2Vuc1RvTWFwKHRva2VucykgewogICAgcmV0dXJuIHRva2Vucy5yZWR1Y2UoKC8qKgogICAgICogQHBhcmFtIHs/fSBwcmV2CiAgICAgKiBAcGFyYW0gez99IHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwcmV2LCB0KSA9PiAocHJldlt0Lm5hbWVdID0gdC50b2tlbiwgcHJldikpLCB7fSk7Cn0KLyoqCiAqIEluIEl2eSwgd2UgZG9uJ3Qgc3VwcG9ydCBOZ1Byb2JlIGJlY2F1c2Ugd2UgaGF2ZSBvdXIgb3duIHNldCBvZiB0ZXN0aW5nIHV0aWxpdGllcwogKiB3aXRoIG1vcmUgcm9idXN0IGZ1bmN0aW9uYWxpdHkuCiAqCiAqIFdlIHNob3VsZG4ndCBicmluZyBpbiBOZ1Byb2JlIGJlY2F1c2UgaXQgcHJldmVudHMgRGVidWdOb2RlIGFuZCBmcmllbmRzIGZyb20KICogdHJlZS1zaGFraW5nIHByb3Blcmx5LgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVMRU1FTlRfUFJPQkVfUFJPVklERVJTX19QT1NUX1IzX18gPSBbXTsKLyoqCiAqIFByb3ZpZGVycyB3aGljaCBzdXBwb3J0IGRlYnVnZ2luZyBBbmd1bGFyIGFwcGxpY2F0aW9ucyAoZS5nLiB2aWEgYG5nLnByb2JlYCkuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BSRV9SM19fID0gWwogICAgewogICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUiwKICAgICAgICB1c2VGYWN0b3J5OiBfY3JlYXRlTmdQcm9iZVIyLAogICAgICAgIGRlcHM6IFsKICAgICAgICAgICAgW05nUHJvYmVUb2tlbiwgbmV3IE9wdGlvbmFsKCldLAogICAgICAgIF0sCiAgICAgICAgbXVsdGk6IHRydWUsCiAgICB9LApdOwovKiogQHR5cGUgez99ICovCmNvbnN0IEVMRU1FTlRfUFJPQkVfUFJPVklERVJTID0gRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BPU1RfUjNfXzsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogVGhlIGluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGV2ZW50LW1hbmFnZXIgcGx1Zy1pbiBzZXJ2aWNlLgogKgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEVWRU5UX01BTkFHRVJfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignRXZlbnRNYW5hZ2VyUGx1Z2lucycpOwovKioKICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgZXZlbnQgbWFuYWdlbWVudCBmb3IgQW5ndWxhcgogKiB0aHJvdWdoIGEgYnJvd3NlciBwbHVnLWluLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgRXZlbnRNYW5hZ2VyIHsKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGV2ZW50LW1hbmFnZXIgc2VydmljZS4KICAgICAqIEBwYXJhbSB7P30gcGx1Z2lucwogICAgICogQHBhcmFtIHs/fSBfem9uZQogICAgICovCiAgICBjb25zdHJ1Y3RvcihwbHVnaW5zLCBfem9uZSkgewogICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTsKICAgICAgICB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbiA9IG5ldyBNYXAoKTsKICAgICAgICBwbHVnaW5zLmZvckVhY2goKC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBwID0+IHAubWFuYWdlciA9IHRoaXMpKTsKICAgICAgICB0aGlzLl9wbHVnaW5zID0gcGx1Z2lucy5zbGljZSgpLnJldmVyc2UoKTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgaGFuZGxlciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IGFuZCBldmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KICAgICAqIEBwYXJhbSB7P30gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbm90aWZpY2F0aW9uIG9jY3Vycy4gUmVjZWl2ZXMgdGhlCiAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyLgogICAgICovCiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7CiAgICAgICAgcmV0dXJuIHBsdWdpbi5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGdsb2JhbCBoYW5kbGVyIGZvciBhbiBldmVudCBpbiBhIHRhcmdldCB2aWV3LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0IEEgdGFyZ2V0IGZvciBnbG9iYWwgZXZlbnQgbm90aWZpY2F0aW9ucy4gT25lIG9mICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCBvciAiYm9keSIuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KICAgICAqIEBwYXJhbSB7P30gaGFuZGxlciBBIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbm90aWZpY2F0aW9uIG9jY3Vycy4gUmVjZWl2ZXMgdGhlCiAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyLgogICAgICovCiAgICBhZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZXZlbnROYW1lKTsKICAgICAgICByZXR1cm4gcGx1Z2luLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBpbGF0aW9uIHpvbmUgaW4gd2hpY2ggZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0Wm9uZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fem9uZTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5nZXQoZXZlbnROYW1lKTsKICAgICAgICBpZiAocGx1Z2luKSB7CiAgICAgICAgICAgIHJldHVybiBwbHVnaW47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5fcGx1Z2luczsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVnaW4gPSBwbHVnaW5zW2ldOwogICAgICAgICAgICBpZiAocGx1Z2luLnN1cHBvcnRzKGV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luLnNldChldmVudE5hbWUsIHBsdWdpbik7CiAgICAgICAgICAgICAgICByZXR1cm4gcGx1Z2luOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZXZlbnQgbWFuYWdlciBwbHVnaW4gZm91bmQgZm9yIGV2ZW50ICR7ZXZlbnROYW1lfWApOwogICAgfQp9CkV2ZW50TWFuYWdlci7JtWZhYyA9IGZ1bmN0aW9uIEV2ZW50TWFuYWdlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFdmVudE1hbmFnZXIpKMm1ybVpbmplY3QoRVZFTlRfTUFOQUdFUl9QTFVHSU5TKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfTsKRXZlbnRNYW5hZ2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEV2ZW50TWFuYWdlciwgZmFjdG9yeTogRXZlbnRNYW5hZ2VyLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRXZlbnRNYW5hZ2VyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRVZFTlRfTUFOQUdFUl9QTFVHSU5TLF0gfV0gfSwKICAgIHsgdHlwZTogTmdab25lIH0KXTsKLyoqCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhcmdldCA9IGdldERPTSgpLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRoaXMuX2RvYywgZWxlbWVudCk7CiAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBldmVudCB0YXJnZXQgJHt0YXJnZXR9IGZvciBldmVudCAke2V2ZW50TmFtZX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICB9Cn0KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9zaGFyZWRfc3R5bGVzX2hvc3QudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KY2xhc3MgU2hhcmVkU3R5bGVzSG9zdCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fc3R5bGVzU2V0ID0gbmV3IFNldCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkU3R5bGVzKHN0eWxlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhZGRpdGlvbnMgPSBuZXcgU2V0KCk7CiAgICAgICAgc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0eWxlID0+IHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9zdHlsZXNTZXQuaGFzKHN0eWxlKSkgewogICAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzU2V0LmFkZChzdHlsZSk7CiAgICAgICAgICAgICAgICBhZGRpdGlvbnMuYWRkKHN0eWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICB0aGlzLm9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKSB7IH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0QWxsU3R5bGVzKCkgewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0eWxlc1NldCk7CiAgICB9Cn0KU2hhcmVkU3R5bGVzSG9zdC7JtWZhYyA9IGZ1bmN0aW9uIFNoYXJlZFN0eWxlc0hvc3RfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2hhcmVkU3R5bGVzSG9zdCkoKTsgfTsKU2hhcmVkU3R5bGVzSG9zdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTaGFyZWRTdHlsZXNIb3N0LCBmYWN0b3J5OiBTaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjIH0pOwpjbGFzcyBEb21TaGFyZWRTdHlsZXNIb3N0IGV4dGVuZHMgU2hhcmVkU3R5bGVzSG9zdCB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgICAgIHRoaXMuX2hvc3ROb2RlcyA9IG5ldyBTZXQoKTsKICAgICAgICB0aGlzLl9zdHlsZU5vZGVzID0gbmV3IFNldCgpOwogICAgICAgIHRoaXMuX2hvc3ROb2Rlcy5hZGQoX2RvYy5oZWFkKTsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgKiBAcGFyYW0gez99IGhvc3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9hZGRTdHlsZXNUb0hvc3Qoc3R5bGVzLCBob3N0KSB7CiAgICAgICAgc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdHlsZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSB0aGlzLl9kb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IHN0eWxlOwogICAgICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmFkZChob3N0LmFwcGVuZENoaWxkKHN0eWxlRWwpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEhvc3QoaG9zdE5vZGUpIHsKICAgICAgICB0aGlzLl9hZGRTdHlsZXNUb0hvc3QodGhpcy5fc3R5bGVzU2V0LCBob3N0Tm9kZSk7CiAgICAgICAgdGhpcy5faG9zdE5vZGVzLmFkZChob3N0Tm9kZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUhvc3QoaG9zdE5vZGUpIHsKICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuZGVsZXRlKGhvc3ROb2RlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKSB7CiAgICAgICAgdGhpcy5faG9zdE5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhvc3ROb2RlID0+IHRoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVOb2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHlsZU5vZGUgPT4gZ2V0RE9NKCkucmVtb3ZlKHN0eWxlTm9kZSkpKTsKICAgIH0KfQpEb21TaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjID0gZnVuY3Rpb24gRG9tU2hhcmVkU3R5bGVzSG9zdF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEb21TaGFyZWRTdHlsZXNIb3N0KSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKRG9tU2hhcmVkU3R5bGVzSG9zdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEb21TaGFyZWRTdHlsZXNIb3N0LCBmYWN0b3J5OiBEb21TaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KRG9tU2hhcmVkU3R5bGVzSG9zdC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2RvbV9yZW5kZXJlci50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKiogQHR5cGUgez99ICovCmNvbnN0IE5BTUVTUEFDRV9VUklTID0gewogICAgJ3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsCiAgICAneGh0bWwnOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsCiAgICAneGxpbmsnOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsCiAgICAneG1sJzogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsCiAgICAneG1sbnMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nLAp9OwovKiogQHR5cGUgez99ICovCmNvbnN0IENPTVBPTkVOVF9SRUdFWCA9IC8lQ09NUCUvZzsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBOR19ERVZfTU9ERSQxID0gdHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgISFuZ0Rldk1vZGU7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgQ09NUE9ORU5UX1ZBUklBQkxFID0gJyVDT01QJSc7Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgSE9TVF9BVFRSID0gYF9uZ2hvc3QtJHtDT01QT05FTlRfVkFSSUFCTEV9YDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBDT05URU5UX0FUVFIgPSBgX25nY29udGVudC0ke0NPTVBPTkVOVF9WQVJJQUJMRX1gOwovKioKICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzaGltQ29udGVudEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7CiAgICByZXR1cm4gQ09OVEVOVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTsKfQovKioKICogQHBhcmFtIHs/fSBjb21wb25lbnRTaG9ydElkCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBzaGltSG9zdEF0dHJpYnV0ZShjb21wb25lbnRTaG9ydElkKSB7CiAgICByZXR1cm4gSE9TVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTsKfQovKioKICogQHBhcmFtIHs/fSBjb21wSWQKICogQHBhcmFtIHs/fSBzdHlsZXMKICogQHBhcmFtIHs/fSB0YXJnZXQKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZXMoY29tcElkLCBzdHlsZXMsIHRhcmdldCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2ldOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkgewogICAgICAgICAgICBmbGF0dGVuU3R5bGVzKGNvbXBJZCwgc3R5bGUsIHRhcmdldCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdHlsZSA9IHN0eWxlLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wSWQpOwogICAgICAgICAgICB0YXJnZXQucHVzaChzdHlsZSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKfQovKioKICogQHBhcmFtIHs/fSBldmVudEhhbmRsZXIKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIGRlY29yYXRlUHJldmVudERlZmF1bHQoZXZlbnRIYW5kbGVyKSB7CiAgICAvLyBgRGVidWdOb2RlLnRyaWdnZXJFdmVudEhhbmRsZXJgIG5lZWRzIHRvIGtub3cgaWYgdGhlIGxpc3RlbmVyIHdhcyBjcmVhdGVkIHdpdGgKICAgIC8vIGRlY29yYXRlUHJldmVudERlZmF1bHQgb3IgaXMgYSBsaXN0ZW5lciBhZGRlZCBvdXRzaWRlIHRoZSBBbmd1bGFyIGNvbnRleHQgc28gaXQgY2FuIGhhbmRsZSB0aGUKICAgIC8vIHR3byBkaWZmZXJlbnRseS4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBzcGVjaWFsICdfX25nVW53cmFwX18nIHRva2VuIGlzIHBhc3NlZCB0byB0aGUgdW53cmFwCiAgICAvLyB0aGUgbGlzdGVuZXIgKHNlZSBiZWxvdykuCiAgICByZXR1cm4gKC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV2ZW50KSA9PiB7CiAgICAgICAgLy8gSXZ5IHVzZXMgJ19fbmdVbndyYXBfXycgYXMgYSBzcGVjaWFsIHRva2VuIHRoYXQgYWxsb3dzIHVzIHRvIHVud3JhcCB0aGUgZnVuY3Rpb24KICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSBpbnZva2VkIHByb2dyYW1tYXRpY2FsbHkgYnkgYERlYnVnTm9kZS50cmlnZ2VyRXZlbnRIYW5kbGVyYC4gVGhlIGRlYnVnX25vZGUKICAgICAgICAvLyBjYW4gaW5zcGVjdCB0aGUgbGlzdGVuZXIgdG9TdHJpbmcgY29udGVudHMgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBzcGVjaWFsIHRva2VuLiBCZWNhdXNlCiAgICAgICAgLy8gdGhlIHRva2VuIGlzIGEgc3RyaW5nIGxpdGVyYWwsIGl0IGlzIGVuc3VyZWQgdG8gbm90IGJlIG1vZGlmaWVkIGJ5IGNvbXBpbGVkIGNvZGUuCiAgICAgICAgaWYgKGV2ZW50ID09PSAnX19uZ1Vud3JhcF9fJykgewogICAgICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsb3dEZWZhdWx0QmVoYXZpb3IgPSBldmVudEhhbmRsZXIoZXZlbnQpOwogICAgICAgIGlmIChhbGxvd0RlZmF1bHRCZWhhdmlvciA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHByZXZlbnREZWZhdWx0IGludG8gZXZlbnQgcGx1Z2lucy4uLgogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfSk7Cn0KY2xhc3MgRG9tUmVuZGVyZXJGYWN0b3J5MiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnRNYW5hZ2VyCiAgICAgKiBAcGFyYW0gez99IHNoYXJlZFN0eWxlc0hvc3QKICAgICAqIEBwYXJhbSB7P30gYXBwSWQKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBhcHBJZCkgewogICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gZXZlbnRNYW5hZ2VyOwogICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCA9IHNoYXJlZFN0eWxlc0hvc3Q7CiAgICAgICAgdGhpcy5hcHBJZCA9IGFwcElkOwogICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZCA9IG5ldyBNYXAoKTsKICAgICAgICB0aGlzLmRlZmF1bHRSZW5kZXJlciA9IG5ldyBEZWZhdWx0RG9tUmVuZGVyZXIyKGV2ZW50TWFuYWdlcik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBjcmVhdGVSZW5kZXJlcihlbGVtZW50LCB0eXBlKSB7CiAgICAgICAgaWYgKCFlbGVtZW50IHx8ICF0eXBlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0eXBlLmVuY2Fwc3VsYXRpb24pIHsKICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkOiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyQnlDb21wSWQuZ2V0KHR5cGUuaWQpOwogICAgICAgICAgICAgICAgaWYgKCFyZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gbmV3IEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMih0aGlzLmV2ZW50TWFuYWdlciwgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LCB0eXBlLCB0aGlzLmFwcElkKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyQnlDb21wSWQuc2V0KHR5cGUuaWQsIHJlbmRlcmVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuYXBwbHlUb0hvc3QoZWxlbWVudCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLk5hdGl2ZToKICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbToKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhZG93RG9tUmVuZGVyZXIodGhpcy5ldmVudE1hbmFnZXIsIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCwgZWxlbWVudCwgdHlwZSk7CiAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlckJ5Q29tcElkLmhhcyh0eXBlLmlkKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKHR5cGUuaWQsIHR5cGUuc3R5bGVzLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZFN0eWxlcyhzdHlsZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQodHlwZS5pZCwgdGhpcy5kZWZhdWx0UmVuZGVyZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBiZWdpbigpIHsgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBlbmQoKSB7IH0KfQpEb21SZW5kZXJlckZhY3RvcnkyLsm1ZmFjID0gZnVuY3Rpb24gRG9tUmVuZGVyZXJGYWN0b3J5Ml9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEb21SZW5kZXJlckZhY3RvcnkyKSjJtcm1aW5qZWN0KEV2ZW50TWFuYWdlciksIMm1ybVpbmplY3QoRG9tU2hhcmVkU3R5bGVzSG9zdCksIMm1ybVpbmplY3QoQVBQX0lEKSk7IH07CkRvbVJlbmRlcmVyRmFjdG9yeTIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRG9tUmVuZGVyZXJGYWN0b3J5MiwgZmFjdG9yeTogRG9tUmVuZGVyZXJGYWN0b3J5Mi7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRvbVJlbmRlcmVyRmFjdG9yeTIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IEV2ZW50TWFuYWdlciB9LAogICAgeyB0eXBlOiBEb21TaGFyZWRTdHlsZXNIb3N0IH0sCiAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0lELF0gfV0gfQpdOwpjbGFzcyBEZWZhdWx0RG9tUmVuZGVyZXIyIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE1hbmFnZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyKSB7CiAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIgPSBldmVudE1hbmFnZXI7CiAgICAgICAgdGhpcy5kYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZGVzdHJveSgpIHsgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIC8vIEluIGNhc2VzIHdoZXJlIEl2eSAobm90IFZpZXdFbmdpbmUpIGlzIGdpdmluZyB1cyB0aGUgYWN0dWFsIG5hbWVzcGFjZSwgdGhlIGxvb2sgdXAgYnkga2V5CiAgICAgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIHVuZGVmaW5lZCwgc28gd2UganVzdCByZXR1cm4gdGhlIG5hbWVzcGFjZSBoZXJlLgogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV0gfHwgbmFtZXNwYWNlLCBuYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUNvbW1lbnQodmFsdWUpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZVRleHQodmFsdWUpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBuZXdDaGlsZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCkgewogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKSB7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzZWxlY3Rvck9yTm9kZQogICAgICogQHBhcmFtIHs/PX0gcHJlc2VydmVDb250ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZWxlY3RSb290RWxlbWVudChzZWxlY3Rvck9yTm9kZSwgcHJlc2VydmVDb250ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlbCA9IHR5cGVvZiBzZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yT3JOb2RlKSA6CiAgICAgICAgICAgIHNlbGVjdG9yT3JOb2RlOwogICAgICAgIGlmICghZWwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2VsZWN0b3IgIiR7c2VsZWN0b3JPck5vZGV9IiBkaWQgbm90IG1hdGNoIGFueSBlbGVtZW50c2ApOwogICAgICAgIH0KICAgICAgICBpZiAoIXByZXNlcnZlQ29udGVudCkgewogICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcGFyZW50Tm9kZShub2RlKSB7CiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBuZXh0U2libGluZyhub2RlKSB7CiAgICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRBdHRyaWJ1dGUoZWwsIG5hbWUsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lc3BhY2UgKyAnOicgKyBuYW1lOwogICAgICAgICAgICAvLyBUT0RPKEZXLTgxMSk6IEl2eSBtYXkgY2F1c2UgaXNzdWVzIGhlcmUgYmVjYXVzZSBpdCdzIHBhc3NpbmcgYXJvdW5kCiAgICAgICAgICAgIC8vIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlcywgdGhlcmVmb3JlIHRoaXMgbG9va3VwIHdpbGwgZmFpbC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VVcmkgPSBOQU1FU1BBQ0VfVVJJU1tuYW1lc3BhY2VdOwogICAgICAgICAgICBpZiAobmFtZXNwYWNlVXJpKSB7CiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVcmksIG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgIC8vIFRPRE8oRlctODExKTogSXZ5IG1heSBjYXVzZSBpc3N1ZXMgaGVyZSBiZWNhdXNlIGl0J3MgcGFzc2luZyBhcm91bmQKICAgICAgICAgICAgLy8gZnVsbCBVUklzIGZvciBuYW1lc3BhY2VzLCB0aGVyZWZvcmUgdGhpcyBsb29rdXAgd2lsbCBmYWlsLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZVVyaSA9IE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV07CiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVcmkpIHsKICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVyaSwgbmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKEZXLTgxMSk6IFNpbmNlIGl2eSBpcyBwYXNzaW5nIGFyb3VuZCBmdWxsIFVSSXMgZm9yIG5hbWVzcGFjZXMKICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgcmVzdWx0IGluIHByb3BlcnRpZXMgbGlrZSBgaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc6Y3g9IjEyMyJgLAogICAgICAgICAgICAgICAgLy8gd2hpY2ggaXMgd3JvbmcuCiAgICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoYCR7bmFtZXNwYWNlfToke25hbWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkQ2xhc3MoZWwsIG5hbWUpIHsKICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKG5hbWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHJlbW92ZUNsYXNzKGVsLCBuYW1lKSB7CiAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShuYW1lKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0U3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSwgZmxhZ3MpIHsKICAgICAgICBpZiAoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnNldFByb3BlcnR5KHN0eWxlLCB2YWx1ZSwgISEoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudCkgPyAnaW1wb3J0YW50JyA6ICcnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlW3N0eWxlXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlU3R5bGUoZWwsIHN0eWxlLCBmbGFncykgewogICAgICAgIGlmIChmbGFncyAmIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpIHsKICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoc3R5bGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsCiAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy83OTE2CiAgICAgICAgICAgIGVsLnN0eWxlW3N0eWxlXSA9ICcnOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpIHsKICAgICAgICBOR19ERVZfTU9ERSQxICYmIGNoZWNrTm9TeW50aGV0aWNQcm9wKG5hbWUsICdwcm9wZXJ0eScpOwogICAgICAgIGVsW25hbWVdID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2V0VmFsdWUobm9kZSwgdmFsdWUpIHsKICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgbGlzdGVuKHRhcmdldCwgZXZlbnQsIGNhbGxiYWNrKSB7CiAgICAgICAgTkdfREVWX01PREUkMSAmJiBjaGVja05vU3ludGhldGljUHJvcChldmVudCwgJ2xpc3RlbmVyJyk7CiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50LCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50LCBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSkpKSkpOwogICAgfQp9CmNvbnN0IMm1MCQyJDEgPSAvKioKICogQHJldHVybiB7P30KICovCigpID0+ICdAJy5jaGFyQ29kZUF0KDApOwovKiogQHR5cGUgez99ICovCmNvbnN0IEFUX0NIQVJDT0RFID0gKCjJtTAkMiQxKSkoKTsKLyoqCiAqIEBwYXJhbSB7P30gbmFtZQogKiBAcGFyYW0gez99IG5hbWVLaW5kCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBjaGVja05vU3ludGhldGljUHJvcChuYW1lLCBuYW1lS2luZCkgewogICAgaWYgKG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gQVRfQ0hBUkNPREUpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHRoZSBzeW50aGV0aWMgJHtuYW1lS2luZH0gJHtuYW1lfS4gUGxlYXNlIGluY2x1ZGUgZWl0aGVyICJCcm93c2VyQW5pbWF0aW9uc01vZHVsZSIgb3IgIk5vb3BBbmltYXRpb25zTW9kdWxlIiBpbiB5b3VyIGFwcGxpY2F0aW9uLmApOwogICAgfQp9CmNsYXNzIEVtdWxhdGVkRW5jYXBzdWxhdGlvbkRvbVJlbmRlcmVyMiBleHRlbmRzIERlZmF1bHREb21SZW5kZXJlcjIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICogQHBhcmFtIHs/fSBzaGFyZWRTdHlsZXNIb3N0CiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSBhcHBJZAogICAgICovCiAgICBjb25zdHJ1Y3RvcihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGNvbXBvbmVudCwgYXBwSWQpIHsKICAgICAgICBzdXBlcihldmVudE1hbmFnZXIpOwogICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzKGFwcElkICsgJy0nICsgY29tcG9uZW50LmlkLCBjb21wb25lbnQuc3R5bGVzLCBbXSk7CiAgICAgICAgc2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMoc3R5bGVzKTsKICAgICAgICB0aGlzLmNvbnRlbnRBdHRyID0gc2hpbUNvbnRlbnRBdHRyaWJ1dGUoYXBwSWQgKyAnLScgKyBjb21wb25lbnQuaWQpOwogICAgICAgIHRoaXMuaG9zdEF0dHIgPSBzaGltSG9zdEF0dHJpYnV0ZShhcHBJZCArICctJyArIGNvbXBvbmVudC5pZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYXBwbHlUb0hvc3QoZWxlbWVudCkgewogICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCB0aGlzLmhvc3RBdHRyLCAnJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGNyZWF0ZUVsZW1lbnQocGFyZW50LCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsID0gc3VwZXIuY3JlYXRlRWxlbWVudChwYXJlbnQsIG5hbWUpOwogICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbCwgdGhpcy5jb250ZW50QXR0ciwgJycpOwogICAgICAgIHJldHVybiBlbDsKICAgIH0KfQpjbGFzcyBTaGFkb3dEb21SZW5kZXJlciBleHRlbmRzIERlZmF1bHREb21SZW5kZXJlcjIgewogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICogQHBhcmFtIHs/fSBzaGFyZWRTdHlsZXNIb3N0CiAgICAgKiBAcGFyYW0gez99IGhvc3RFbAogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAqLwogICAgY29uc3RydWN0b3IoZXZlbnRNYW5hZ2VyLCBzaGFyZWRTdHlsZXNIb3N0LCBob3N0RWwsIGNvbXBvbmVudCkgewogICAgICAgIHN1cGVyKGV2ZW50TWFuYWdlcik7CiAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0ID0gc2hhcmVkU3R5bGVzSG9zdDsKICAgICAgICB0aGlzLmhvc3RFbCA9IGhvc3RFbDsKICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgICBpZiAoY29tcG9uZW50LmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uJDEuU2hhZG93RG9tKSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9zdEVsKSkpLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoaG9zdEVsKSkpLmNyZWF0ZVNoYWRvd1Jvb3QoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZEhvc3QodGhpcy5zaGFkb3dSb290KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gZmxhdHRlblN0eWxlcyhjb21wb25lbnQuaWQsIGNvbXBvbmVudC5zdHlsZXMsIFtdKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gc3R5bGVzW2ldOwogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBub2RlT3JTaGFkb3dSb290KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSA9PT0gdGhpcy5ob3N0RWwgPyB0aGlzLnNoYWRvd1Jvb3QgOiBub2RlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBkZXN0cm95KCkgewogICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHRoaXMuc2hhZG93Um9vdCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLmFwcGVuZENoaWxkKHRoaXMubm9kZU9yU2hhZG93Um9vdChwYXJlbnQpLCBuZXdDaGlsZCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICByZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZU9yU2hhZG93Um9vdChwYXJlbnQpLCBuZXdDaGlsZCwgcmVmQ2hpbGQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBvbGRDaGlsZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlQ2hpbGQocGFyZW50LCBvbGRDaGlsZCkgewogICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QocGFyZW50KSwgb2xkQ2hpbGQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHBhcmVudE5vZGUobm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVPclNoYWRvd1Jvb3Qoc3VwZXIucGFyZW50Tm9kZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3Qobm9kZSkpKTsKICAgIH0KfQoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9kb21fZXZlbnRzLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCmNsYXNzIERvbUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKGRvYykgewogICAgICAgIHN1cGVyKGRvYyk7CiAgICB9CiAgICAvLyBUaGlzIHBsdWdpbiBzaG91bGQgY29tZSBsYXN0IGluIHRoZSBsaXN0IG9mIHBsdWdpbnMsIGJlY2F1c2UgaXQgYWNjZXB0cyBhbGwKICAgIC8vIGV2ZW50cy4KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKGV2ZW50TmFtZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKGhhbmRsZXIpKSwgZmFsc2UpOwogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoaGFuZGxlcikpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoY2FsbGJhY2spKSk7CiAgICB9Cn0KRG9tRXZlbnRzUGx1Z2luLsm1ZmFjID0gZnVuY3Rpb24gRG9tRXZlbnRzUGx1Z2luX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbUV2ZW50c1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CkRvbUV2ZW50c1BsdWdpbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEb21FdmVudHNQbHVnaW4sIGZhY3Rvcnk6IERvbUV2ZW50c1BsdWdpbi7JtWZhYyB9KTsKLyoqIEBub2NvbGxhcHNlICovCkRvbUV2ZW50c1BsdWdpbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9oYW1tZXJfZ2VzdHVyZXMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFN1cHBvcnRlZCBIYW1tZXJKUyByZWNvZ25pemVyIGV2ZW50IG5hbWVzLgogKiBAdHlwZSB7P30KICovCmNvbnN0IEVWRU5UX05BTUVTID0gewogICAgLy8gcGFuCiAgICAncGFuJzogdHJ1ZSwKICAgICdwYW5zdGFydCc6IHRydWUsCiAgICAncGFubW92ZSc6IHRydWUsCiAgICAncGFuZW5kJzogdHJ1ZSwKICAgICdwYW5jYW5jZWwnOiB0cnVlLAogICAgJ3BhbmxlZnQnOiB0cnVlLAogICAgJ3BhbnJpZ2h0JzogdHJ1ZSwKICAgICdwYW51cCc6IHRydWUsCiAgICAncGFuZG93bic6IHRydWUsCiAgICAvLyBwaW5jaAogICAgJ3BpbmNoJzogdHJ1ZSwKICAgICdwaW5jaHN0YXJ0JzogdHJ1ZSwKICAgICdwaW5jaG1vdmUnOiB0cnVlLAogICAgJ3BpbmNoZW5kJzogdHJ1ZSwKICAgICdwaW5jaGNhbmNlbCc6IHRydWUsCiAgICAncGluY2hpbic6IHRydWUsCiAgICAncGluY2hvdXQnOiB0cnVlLAogICAgLy8gcHJlc3MKICAgICdwcmVzcyc6IHRydWUsCiAgICAncHJlc3N1cCc6IHRydWUsCiAgICAvLyByb3RhdGUKICAgICdyb3RhdGUnOiB0cnVlLAogICAgJ3JvdGF0ZXN0YXJ0JzogdHJ1ZSwKICAgICdyb3RhdGVtb3ZlJzogdHJ1ZSwKICAgICdyb3RhdGVlbmQnOiB0cnVlLAogICAgJ3JvdGF0ZWNhbmNlbCc6IHRydWUsCiAgICAvLyBzd2lwZQogICAgJ3N3aXBlJzogdHJ1ZSwKICAgICdzd2lwZWxlZnQnOiB0cnVlLAogICAgJ3N3aXBlcmlnaHQnOiB0cnVlLAogICAgJ3N3aXBldXAnOiB0cnVlLAogICAgJ3N3aXBlZG93bic6IHRydWUsCiAgICAvLyB0YXAKICAgICd0YXAnOiB0cnVlLAp9OwovKioKICogREkgdG9rZW4gZm9yIHByb3ZpZGluZyBbSGFtbWVySlNdKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKSBzdXBwb3J0IHRvIEFuZ3VsYXIuCiAqIEBzZWUgYEhhbW1lckdlc3R1cmVDb25maWdgCiAqCiAqIFxAbmdNb2R1bGUgSGFtbWVyTW9kdWxlCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX0dFU1RVUkVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdIYW1tZXJHZXN0dXJlQ29uZmlnJyk7Ci8qKgogKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIGEge1xAbGluayBIYW1tZXJMb2FkZXJ9IHRvIEFuZ3VsYXIuCiAqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX0xPQURFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignSGFtbWVyTG9hZGVyJyk7Ci8qKgogKiBBbiBpbmplY3RhYmxlIFtIYW1tZXJKUyBNYW5hZ2VyXShodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL2FwaS8jaGFtbWVyLm1hbmFnZXIpCiAqIGZvciBnZXN0dXJlIHJlY29nbml0aW9uLiBDb25maWd1cmVzIHNwZWNpZmljIGV2ZW50IHJlY29nbml0aW9uLgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSGFtbWVyR2VzdHVyZUNvbmZpZyB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBBIHNldCBvZiBzdXBwb3J0ZWQgZXZlbnQgbmFtZXMgZm9yIGdlc3R1cmVzIHRvIGJlIHVzZWQgaW4gQW5ndWxhci4KICAgICAgICAgKiBBbmd1bGFyIHN1cHBvcnRzIGFsbCBidWlsdC1pbiByZWNvZ25pemVycywgYXMgbGlzdGVkIGluCiAgICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS4KICAgICAgICAgKi8KICAgICAgICB0aGlzLmV2ZW50cyA9IFtdOwogICAgICAgIC8qKgogICAgICAgICAqIE1hcHMgZ2VzdHVyZSBldmVudCBuYW1lcyB0byBhIHNldCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgICAgICAgKiB0aGF0IHNwZWNpZnkgb3ZlcnJpZGVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3Igc3BlY2lmaWMgcHJvcGVydGllcy4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBrZXkgaXMgYSBzdXBwb3J0ZWQgZXZlbnQgbmFtZSB0byBiZSBjb25maWd1cmVkLAogICAgICAgICAqIGFuZCB0aGUgb3B0aW9ucyBvYmplY3QgY29udGFpbnMgYSBzZXQgb2YgcHJvcGVydGllcywgd2l0aCBvdmVycmlkZSB2YWx1ZXMKICAgICAgICAgKiB0byBiZSBhcHBsaWVkIHRvIHRoZSBuYW1lZCByZWNvZ25pemVyIGV2ZW50LgogICAgICAgICAqIEZvciBleGFtcGxlLCB0byBkaXNhYmxlIHJlY29nbml0aW9uIG9mIHRoZSByb3RhdGUgZXZlbnQsIHNwZWNpZnkKICAgICAgICAgKiAgYHsicm90YXRlIjogeyJlbmFibGUiOiBmYWxzZX19YC4KICAgICAgICAgKgogICAgICAgICAqIFByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHByZXNlbnQgdGFrZSB0aGUgSGFtbWVySlMgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICogRm9yIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZCBmb3Igd2hpY2ggZXZlbnRzLAogICAgICAgICAqIGFuZCB0aGVpciBhbGxvd2VkIGFuZCBkZWZhdWx0IHZhbHVlcywgc2VlCiAgICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHRoaXMub3ZlcnJpZGVzID0ge307CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBbSGFtbWVySlMgTWFuYWdlcl0oaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9hcGkvI2hhbW1lci5tYW5hZ2VyKQogICAgICogYW5kIGF0dGFjaGVzIGl0IHRvIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgd2lsbCByZWNvZ25pemUgZ2VzdHVyZXMuCiAgICAgKiBAcmV0dXJuIHs/fSBBIEhhbW1lckpTIGV2ZW50LW1hbmFnZXIgb2JqZWN0LgogICAgICovCiAgICBidWlsZEhhbW1lcihlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1jID0gbmV3ICgvKiogQHR5cGUgez99ICovIChIYW1tZXIpKShlbGVtZW50LCB0aGlzLm9wdGlvbnMpOwogICAgICAgIG1jLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7CiAgICAgICAgbWMuZ2V0KCdyb3RhdGUnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7CiAgICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdGhpcy5vdmVycmlkZXMpIHsKICAgICAgICAgICAgbWMuZ2V0KGV2ZW50TmFtZSkuc2V0KHRoaXMub3ZlcnJpZGVzW2V2ZW50TmFtZV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWM7CiAgICB9Cn0KSGFtbWVyR2VzdHVyZUNvbmZpZy7JtWZhYyA9IGZ1bmN0aW9uIEhhbW1lckdlc3R1cmVDb25maWdfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFtbWVyR2VzdHVyZUNvbmZpZykoKTsgfTsKSGFtbWVyR2VzdHVyZUNvbmZpZy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIYW1tZXJHZXN0dXJlQ29uZmlnLCBmYWN0b3J5OiBIYW1tZXJHZXN0dXJlQ29uZmlnLsm1ZmFjIH0pOwovKioKICogRXZlbnQgcGx1Z2luIHRoYXQgYWRkcyBIYW1tZXIgc3VwcG9ydCB0byBhbiBhcHBsaWNhdGlvbi4KICoKICogXEBuZ01vZHVsZSBIYW1tZXJNb2R1bGUKICovCmNsYXNzIEhhbW1lckdlc3R1cmVzUGx1Z2luIGV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZwogICAgICogQHBhcmFtIHs/fSBjb25zb2xlCiAgICAgKiBAcGFyYW0gez89fSBsb2FkZXIKICAgICAqLwogICAgY29uc3RydWN0b3IoZG9jLCBfY29uZmlnLCBjb25zb2xlLCBsb2FkZXIpIHsKICAgICAgICBzdXBlcihkb2MpOwogICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgdGhpcy5jb25zb2xlID0gY29uc29sZTsKICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN1cHBvcnRzKGV2ZW50TmFtZSkgewogICAgICAgIGlmICghRVZFTlRfTkFNRVMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkpICYmICF0aGlzLmlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyICYmICF0aGlzLmxvYWRlcikgewogICAgICAgICAgICB0aGlzLmNvbnNvbGUud2FybihgVGhlICIke2V2ZW50TmFtZX0iIGV2ZW50IGNhbm5vdCBiZSBib3VuZCBiZWNhdXNlIEhhbW1lci5KUyBpcyBub3QgYCArCiAgICAgICAgICAgICAgICBgbG9hZGVkIGFuZCBubyBjdXN0b20gbG9hZGVyIGhhcyBiZWVuIHNwZWNpZmllZC5gKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTsKICAgICAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAvLyBJZiBIYW1tZXIgaXMgbm90IHByZXNlbnQgYnV0IGEgbG9hZGVyIGlzIHNwZWNpZmllZCwgd2UgZGVmZXIgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lcgogICAgICAgIC8vIHVudGlsIEhhbW1lciBpcyBsb2FkZWQuCiAgICAgICAgaWYgKCEoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5IYW1tZXIgJiYgdGhpcy5sb2FkZXIpIHsKICAgICAgICAgICAgLy8gVGhpcyBgYWRkRXZlbnRMaXN0ZW5lcmAgbWV0aG9kIHJldHVybnMgYSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGFkZGVkIGxpc3RlbmVyLgogICAgICAgICAgICAvLyBVbnRpbCBIYW1tZXIgaXMgbG9hZGVkLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gbmVlZHMgdG8gKmNhbmNlbCogdGhlIHJlZ2lzdHJhdGlvbiByYXRoZXIKICAgICAgICAgICAgLy8gdGhhbiByZW1vdmUgYW55dGhpbmcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNhbmNlbFJlZ2lzdHJhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZXJlZ2lzdGVyID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgY2FuY2VsUmVnaXN0cmF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMubG9hZGVyKCkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIElmIEhhbW1lciBpc24ndCBhY3R1YWxseSBsb2FkZWQgd2hlbiB0aGUgY3VzdG9tIGxvYWRlciByZXNvbHZlcywgZ2l2ZSB1cC4KICAgICAgICAgICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSBjdXN0b20gSEFNTUVSX0xPQURFUiBjb21wbGV0ZWQsIGJ1dCBIYW1tZXIuSlMgaXMgbm90IHByZXNlbnQuYCk7CiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlciA9ICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjYW5jZWxSZWdpc3RyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3cgdGhhdCBIYW1tZXIgaXMgbG9hZGVkIGFuZCB0aGUgbGlzdGVuZXIgaXMgYmVpbmcgbG9hZGVkIGZvciByZWFsLAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBjaGFuZ2VzIGZyb20gY2FuY2VsaW5nIHJlZ2lzdHJhdGlvbiB0byByZW1vdmFsLgogICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIgPSB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAuY2F0Y2goKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSAiJHtldmVudE5hbWV9IiBldmVudCBjYW5ub3QgYmUgYm91bmQgYmVjYXVzZSB0aGUgY3VzdG9tIGAgKwogICAgICAgICAgICAgICAgICAgIGBIYW1tZXIuSlMgbG9hZGVyIGZhaWxlZC5gKTsKICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgKmV4ZWN1dGVzKiBgZGVyZWdpc3RlcmAgKGFuZCBub3QgYGRlcmVnaXN0ZXJgIGl0c2VsZikgc28gdGhhdCB3ZQogICAgICAgICAgICAvLyBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBgZGVyZWdpc3RlcmAgb25jZSB0aGUgbGlzdGVuZXIgaXMgYWRkZWQuIFVzaW5nIGEgY2xvc3VyZSBpbgogICAgICAgICAgICAvLyB0aGlzIHdheSBhbGxvd3MgdXMgdG8gYXZvaWQgYW55IGFkZGl0aW9uYWwgZGF0YSBzdHJ1Y3R1cmVzIHRvIHRyYWNrIGxpc3RlbmVyIHJlbW92YWwuCiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIENyZWF0aW5nIHRoZSBtYW5hZ2VyIGJpbmQgZXZlbnRzLCBtdXN0IGJlIGRvbmUgb3V0c2lkZSBvZiBhbmd1bGFyCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWMgPSB0aGlzLl9jb25maWcuYnVpbGRIYW1tZXIoZWxlbWVudCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnRPYmoKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChldmVudE9iaikgewogICAgICAgICAgICAgICAgem9uZS5ydW5HdWFyZGVkKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50T2JqKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG1jLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgbWMub2ZmKGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgLy8gZGVzdHJveSBtYyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1jLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBtYy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5ldmVudHMuaW5kZXhPZihldmVudE5hbWUpID4gLTE7CiAgICB9Cn0KSGFtbWVyR2VzdHVyZXNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBIYW1tZXJHZXN0dXJlc1BsdWdpbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJHZXN0dXJlc1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChIQU1NRVJfR0VTVFVSRV9DT05GSUcpLCDJtcm1aW5qZWN0KENvbnNvbGUpLCDJtcm1aW5qZWN0KEhBTU1FUl9MT0FERVIsIDgpKTsgfTsKSGFtbWVyR2VzdHVyZXNQbHVnaW4uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSGFtbWVyR2VzdHVyZXNQbHVnaW4sIGZhY3Rvcnk6IEhhbW1lckdlc3R1cmVzUGx1Z2luLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KSGFtbWVyR2VzdHVyZXNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICB7IHR5cGU6IEhhbW1lckdlc3R1cmVDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0hBTU1FUl9HRVNUVVJFX0NPTkZJRyxdIH1dIH0sCiAgICB7IHR5cGU6IENvbnNvbGUgfSwKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0hBTU1FUl9MT0FERVIsXSB9XSB9Cl07Ci8qKgogKiBJbiBJdnksIHN1cHBvcnQgZm9yIEhhbW1lciBnZXN0dXJlcyBpcyBvcHRpb25hbCwgc28gYXBwbGljYXRpb25zIG11c3QKICogaW1wb3J0IHRoZSBgSGFtbWVyTW9kdWxlYCBhdCByb290IHRvIHR1cm4gb24gc3VwcG9ydC4gVGhpcyBtZWFucyB0aGF0CiAqIEhhbW1lci1zcGVjaWZpYyBjb2RlIGNhbiBiZSB0cmVlLXNoYWtlbiBhd2F5IGlmIG5vdCBuZWVkZWQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fID0gW107Ci8qKgogKiBJbiBWaWV3IEVuZ2luZSwgc3VwcG9ydCBmb3IgSGFtbWVyIGdlc3R1cmVzIGlzIGJ1aWx0LWluIGJ5IGRlZmF1bHQuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgSEFNTUVSX1BST1ZJREVSU19fUFJFX1IzX18gPSBbCiAgICB7CiAgICAgICAgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLAogICAgICAgIHVzZUNsYXNzOiBIYW1tZXJHZXN0dXJlc1BsdWdpbiwKICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICBkZXBzOiBbRE9DVU1FTlQkMSwgSEFNTUVSX0dFU1RVUkVfQ09ORklHLCBDb25zb2xlLCBbbmV3IE9wdGlvbmFsKCksIEhBTU1FUl9MT0FERVJdXQogICAgfSwKICAgIHsgcHJvdmlkZTogSEFNTUVSX0dFU1RVUkVfQ09ORklHLCB1c2VDbGFzczogSGFtbWVyR2VzdHVyZUNvbmZpZywgZGVwczogW10gfSwKXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBIQU1NRVJfUFJPVklERVJTID0gSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fOwovKioKICogQWRkcyBzdXBwb3J0IGZvciBIYW1tZXJKUy4KICoKICogSW1wb3J0IHRoaXMgbW9kdWxlIGF0IHRoZSByb290IG9mIHlvdXIgYXBwbGljYXRpb24gc28gdGhhdCBBbmd1bGFyIGNhbiB3b3JrIHdpdGgKICogSGFtbWVySlMgdG8gZGV0ZWN0IGdlc3R1cmUgZXZlbnRzLgogKgogKiBOb3RlIHRoYXQgYXBwbGljYXRpb25zIHN0aWxsIG5lZWQgdG8gaW5jbHVkZSB0aGUgSGFtbWVySlMgc2NyaXB0IGl0c2VsZi4gVGhpcyBtb2R1bGUKICogc2ltcGx5IHNldHMgdXAgdGhlIGNvb3JkaW5hdGlvbiBsYXllciBiZXR3ZWVuIEhhbW1lckpTIGFuZCBBbmd1bGFyJ3MgRXZlbnRNYW5hZ2VyLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgSGFtbWVyTW9kdWxlIHsKfQpIYW1tZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIYW1tZXJNb2R1bGUgfSk7CkhhbW1lck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhhbW1lck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogSEFNTUVSX1BST1ZJREVSU19fUFJFX1IzX18gfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9kb20vZXZlbnRzL2tleV9ldmVudHMudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIERlZmluZXMgc3VwcG9ydGVkIG1vZGlmaWVycyBmb3Iga2V5IGV2ZW50cy4KICogQHR5cGUgez99CiAqLwpjb25zdCBNT0RJRklFUl9LRVlTID0gWydhbHQnLCAnY29udHJvbCcsICdtZXRhJywgJ3NoaWZ0J107Ci8qKiBAdHlwZSB7P30gKi8KY29uc3QgRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgPSAzOwovLyBNYXAgdG8gY29udmVydCBzb21lIGtleSBvciBrZXlJZGVudGlmaWVyIHZhbHVlcyB0byB3aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgZ2V0RXZlbnRLZXkKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfa2V5TWFwID0gewogICAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZAogICAgLy8gY2YgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLWtleS8KICAgICdcYic6ICdCYWNrc3BhY2UnLAogICAgJ1x0JzogJ1RhYicsCiAgICAnXHg3Ric6ICdEZWxldGUnLAogICAgJ1x4MUInOiAnRXNjYXBlJywKICAgICdEZWwnOiAnRGVsZXRlJywKICAgICdFc2MnOiAnRXNjYXBlJywKICAgICdMZWZ0JzogJ0Fycm93TGVmdCcsCiAgICAnUmlnaHQnOiAnQXJyb3dSaWdodCcsCiAgICAnVXAnOiAnQXJyb3dVcCcsCiAgICAnRG93bic6ICdBcnJvd0Rvd24nLAogICAgJ01lbnUnOiAnQ29udGV4dE1lbnUnLAogICAgJ1Njcm9sbCc6ICdTY3JvbGxMb2NrJywKICAgICdXaW4nOiAnT1MnCn07Ci8vIFRoZXJlIGlzIGEgYnVnIGluIENocm9tZSBmb3IgbnVtZXJpYyBrZXlwYWQga2V5czoKLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1NTY1NAovLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi4KLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBfY2hyb21lTnVtS2V5UGFkTWFwID0gewogICAgJ0EnOiAnMScsCiAgICAnQic6ICcyJywKICAgICdDJzogJzMnLAogICAgJ0QnOiAnNCcsCiAgICAnRSc6ICc1JywKICAgICdGJzogJzYnLAogICAgJ0cnOiAnNycsCiAgICAnSCc6ICc4JywKICAgICdJJzogJzknLAogICAgJ0onOiAnKicsCiAgICAnSyc6ICcrJywKICAgICdNJzogJy0nLAogICAgJ04nOiAnLicsCiAgICAnTyc6ICcvJywKICAgICdceDYwJzogJzAnLAogICAgJ1x4OTAnOiAnTnVtTG9jaycKfTsKY29uc3QgybUwJDMkMSA9IC8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwooZXZlbnQpID0+IGV2ZW50LmFsdEtleSwgybUxJDEgPSAvKioKICogQHBhcmFtIHs/fSBldmVudAogKiBAcmV0dXJuIHs/fQogKi8KKGV2ZW50KSA9PiBldmVudC5jdHJsS2V5LCDJtTIkMiA9IC8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwooZXZlbnQpID0+IGV2ZW50Lm1ldGFLZXksIMm1MyQyID0gLyoqCiAqIEBwYXJhbSB7P30gZXZlbnQKICogQHJldHVybiB7P30KICovCihldmVudCkgPT4gZXZlbnQuc2hpZnRLZXk7Ci8qKgogKiBSZXRyaWV2ZXMgbW9kaWZpZXJzIGZyb20ga2V5LWV2ZW50IG9iamVjdHMuCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgTU9ESUZJRVJfS0VZX0dFVFRFUlMgPSB7CiAgICAnYWx0JzogKMm1MCQzJDEpLAogICAgJ2NvbnRyb2wnOiAoybUxJDEpLAogICAgJ21ldGEnOiAoybUyJDIpLAogICAgJ3NoaWZ0JzogKMm1MyQyKQp9OwovKioKICogXEBwdWJsaWNBcGkKICogQSBicm93c2VyIHBsdWctaW4gdGhhdCBwcm92aWRlcyBzdXBwb3J0IGZvciBoYW5kbGluZyBvZiBrZXkgZXZlbnRzIGluIEFuZ3VsYXIuCiAqLwpjbGFzcyBLZXlFdmVudHNQbHVnaW4gZXh0ZW5kcyBFdmVudE1hbmFnZXJQbHVnaW4gewogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgYnJvd3NlciBwbHVnLWluLgogICAgICogQHBhcmFtIHs/fSBkb2MgVGhlIGRvY3VtZW50IGluIHdoaWNoIGtleSBldmVudHMgd2lsbCBiZSBkZXRlY3RlZC4KICAgICAqLwogICAgY29uc3RydWN0b3IoZG9jKSB7CiAgICAgICAgc3VwZXIoZG9jKTsKICAgIH0KICAgIC8qKgogICAgICogUmVwb3J0cyB3aGV0aGVyIGEgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC4KICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lIFRoZSBldmVudCBuYW1lIHRvIHF1ZXJ5LgogICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC4KICAgICAqLwogICAgc3VwcG9ydHMoZXZlbnROYW1lKSB7CiAgICAgICAgcmV0dXJuIEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpICE9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCBhbmQga2V5IGV2ZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBIVE1MIGVsZW1lbnQgdG8gcmVjZWl2ZSBldmVudCBub3RpZmljYXRpb25zLgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSBldmVudCB0byBsaXN0ZW4gZm9yLgogICAgICogQHBhcmFtIHs/fSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBub3RpZmljYXRpb24gb2NjdXJzLiBSZWNlaXZlcyB0aGUKICAgICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC4KICAgICAqIEByZXR1cm4gez99IFRoZSBrZXkgZXZlbnQgdGhhdCB3YXMgcmVnaXN0ZXJlZC4KICAgICAqLwogICAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyc2VkRXZlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3V0c2lkZUhhbmRsZXIgPSBLZXlFdmVudHNQbHVnaW4uZXZlbnRDYWxsYmFjayhwYXJzZWRFdmVudFsnZnVsbEtleSddLCBoYW5kbGVyLCB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpKTsKICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBnZXRET00oKS5vbkFuZENhbmNlbChlbGVtZW50LCBwYXJzZWRFdmVudFsnZG9tRXZlbnROYW1lJ10sIG91dHNpZGVIYW5kbGVyKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgcGFyc2VFdmVudE5hbWUoZXZlbnROYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcnRzID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy4nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZG9tRXZlbnROYW1lID0gcGFydHMuc2hpZnQoKTsKICAgICAgICBpZiAoKHBhcnRzLmxlbmd0aCA9PT0gMCkgfHwgIShkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXl1cCcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qga2V5ID0gS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkoKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzLnBvcCgpKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZnVsbEtleSA9ICcnOwogICAgICAgIE1PRElGSUVSX0tFWVMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllck5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1vZGlmaWVyTmFtZSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJ0cy5pbmRleE9mKG1vZGlmaWVyTmFtZSk7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgZnVsbEtleSArPSBtb2RpZmllck5hbWUgKyAnLic7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgZnVsbEtleSArPSBrZXk7CiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAwIHx8IGtleS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgLy8gcmV0dXJuaW5nIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyB0byBsZXQgYW5vdGhlciBwbHVnaW4gcHJvY2VzcyB0aGUgZXZlbnQKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgICAgICByZXN1bHRbJ2RvbUV2ZW50TmFtZSddID0gZG9tRXZlbnROYW1lOwogICAgICAgIHJlc3VsdFsnZnVsbEtleSddID0gZnVsbEtleTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmdWxsS2V5ID0gJyc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBrZXkgPSBnZXRFdmVudEtleShldmVudCk7CiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGtleSA9PT0gJyAnKSB7CiAgICAgICAgICAgIGtleSA9ICdzcGFjZSc7IC8vIGZvciByZWFkYWJpbGl0eQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChrZXkgPT09ICcuJykgewogICAgICAgICAgICBrZXkgPSAnZG90JzsgLy8gYmVjYXVzZSAnLicgaXMgdXNlZCBhcyBhIHNlcGFyYXRvciBpbiBldmVudCBuYW1lcwogICAgICAgIH0KICAgICAgICBNT0RJRklFUl9LRVlTLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXJOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb2RpZmllck5hbWUgPT4gewogICAgICAgICAgICBpZiAobW9kaWZpZXJOYW1lICE9IGtleSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJHZXR0ZXIgPSBNT0RJRklFUl9LRVlfR0VUVEVSU1ttb2RpZmllck5hbWVdOwogICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyR2V0dGVyKGV2ZW50KSkgewogICAgICAgICAgICAgICAgICAgIGZ1bGxLZXkgKz0gbW9kaWZpZXJOYW1lICsgJy4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGZ1bGxLZXkgKz0ga2V5OwogICAgICAgIHJldHVybiBmdWxsS2V5OwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIGEgaGFuZGxlciBjYWxsYmFjayBmb3IgYSBrZXkgZXZlbnQuCiAgICAgKiBAcGFyYW0gez99IGZ1bGxLZXkgVGhlIGV2ZW50IG5hbWUgdGhhdCBjb21iaW5lcyBhbGwgc2ltdWx0YW5lb3VzIGtleXN0cm9rZXMuCiAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRoYXQgcmVzcG9uZHMgdG8gdGhlIGtleSBldmVudC4KICAgICAqIEBwYXJhbSB7P30gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgICovCiAgICBzdGF0aWMgZXZlbnRDYWxsYmFjayhmdWxsS2V5LCBoYW5kbGVyLCB6b25lKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXZlbnQgLyoqIFRPRE8gIzkxMDAgKi8pID0+IHsKICAgICAgICAgICAgaWYgKEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpID09PSBmdWxsS2V5KSB7CiAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gaGFuZGxlcihldmVudCkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAcGFyYW0gez99IGtleU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBfbm9ybWFsaXplS2V5KGtleU5hbWUpIHsKICAgICAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gYSBNYXAgaWYgdGhlIG1hcHBpbmcgZ3Jvd3MgdG9vIG11Y2gKICAgICAgICBzd2l0Y2ggKGtleU5hbWUpIHsKICAgICAgICAgICAgY2FzZSAnZXNjJzoKICAgICAgICAgICAgICAgIHJldHVybiAnZXNjYXBlJzsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBrZXlOYW1lOwogICAgICAgIH0KICAgIH0KfQpLZXlFdmVudHNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBLZXlFdmVudHNQbHVnaW5fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgS2V5RXZlbnRzUGx1Z2luKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKS2V5RXZlbnRzUGx1Z2luLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEtleUV2ZW50c1BsdWdpbiwgZmFjdG9yeTogS2V5RXZlbnRzUGx1Z2luLsm1ZmFjIH0pOwovKiogQG5vY29sbGFwc2UgKi8KS2V5RXZlbnRzUGx1Z2luLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9Cl07Ci8qKgogKiBAcGFyYW0gez99IGV2ZW50CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBnZXRFdmVudEtleShldmVudCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGtleSA9IGV2ZW50LmtleTsKICAgIGlmIChrZXkgPT0gbnVsbCkgewogICAgICAgIGtleSA9IGV2ZW50LmtleUlkZW50aWZpZXI7CiAgICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmQKICAgICAgICAvLyBTYWZhcmkgY2YKICAgICAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA3L1dELURPTS1MZXZlbC0zLUV2ZW50cy0yMDA3MTIyMS9ldmVudHMuaHRtbCNFdmVudHMtS2V5Ym9hcmRFdmVudHMtSW50ZXJmYWNlcwogICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJ1VuaWRlbnRpZmllZCc7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkgewogICAgICAgICAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGtleS5zdWJzdHJpbmcoMiksIDE2KSk7CiAgICAgICAgICAgIGlmIChldmVudC5sb2NhdGlvbiA9PT0gRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgJiYgX2Nocm9tZU51bUtleVBhZE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDaHJvbWUgZm9yIG51bWVyaWMga2V5cGFkIGtleXM6CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MTU1NjU0CiAgICAgICAgICAgICAgICAvLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi4KICAgICAgICAgICAgICAgIGtleSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoX2Nocm9tZU51bUtleVBhZE1hcCkpKVtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIF9rZXlNYXBba2V5XSB8fCBrZXk7Cn0KLyoqCiAqIERvbVNhbml0aXplciBoZWxwcyBwcmV2ZW50aW5nIENyb3NzIFNpdGUgU2NyaXB0aW5nIFNlY3VyaXR5IGJ1Z3MgKFhTUykgYnkgc2FuaXRpemluZwogKiB2YWx1ZXMgdG8gYmUgc2FmZSB0byB1c2UgaW4gdGhlIGRpZmZlcmVudCBET00gY29udGV4dHMuCiAqCiAqIEZvciBleGFtcGxlLCB3aGVuIGJpbmRpbmcgYSBVUkwgaW4gYW4gYDxhIFtocmVmXT0ic29tZVZhbHVlIj5gIGh5cGVybGluaywgYHNvbWVWYWx1ZWAgd2lsbCBiZQogKiBzYW5pdGl6ZWQgc28gdGhhdCBhbiBhdHRhY2tlciBjYW5ub3QgaW5qZWN0IGUuZy4gYSBgamF2YXNjcmlwdDpgIFVSTCB0aGF0IHdvdWxkIGV4ZWN1dGUgY29kZSBvbgogKiB0aGUgd2Vic2l0ZS4KICoKICogSW4gc3BlY2lmaWMgc2l0dWF0aW9ucywgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgc2FuaXRpemF0aW9uLCBmb3IgZXhhbXBsZSBpZiB0aGUKICogYXBwbGljYXRpb24gZ2VudWluZWx5IG5lZWRzIHRvIHByb2R1Y2UgYSBgamF2YXNjcmlwdDpgIHN0eWxlIGxpbmsgd2l0aCBhIGR5bmFtaWMgdmFsdWUgaW4gaXQuCiAqIFVzZXJzIGNhbiBieXBhc3Mgc2VjdXJpdHkgYnkgY29uc3RydWN0aW5nIGEgdmFsdWUgd2l0aCBvbmUgb2YgdGhlIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYAogKiBtZXRob2RzLCBhbmQgdGhlbiBiaW5kaW5nIHRvIHRoYXQgdmFsdWUgZnJvbSB0aGUgdGVtcGxhdGUuCiAqCiAqIFRoZXNlIHNpdHVhdGlvbnMgc2hvdWxkIGJlIHZlcnkgcmFyZSwgYW5kIGV4dHJhb3JkaW5hcnkgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGF2b2lkIGNyZWF0aW5nIGEKICogQ3Jvc3MgU2l0ZSBTY3JpcHRpbmcgKFhTUykgc2VjdXJpdHkgYnVnIQogKgogKiBXaGVuIHVzaW5nIGBieXBhc3NTZWN1cml0eVRydXN0Li4uYCwgbWFrZSBzdXJlIHRvIGNhbGwgdGhlIG1ldGhvZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBhbmQgYXMKICogY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIHNvdXJjZSBvZiB0aGUgdmFsdWUsIHRvIG1ha2UgaXQgZWFzeSB0byB2ZXJpZnkgbm8gc2VjdXJpdHkgYnVnIGlzCiAqIGNyZWF0ZWQgYnkgaXRzIHVzZS4KICoKICogSXQgaXMgbm90IHJlcXVpcmVkIChhbmQgbm90IHJlY29tbWVuZGVkKSB0byBieXBhc3Mgc2VjdXJpdHkgaWYgdGhlIHZhbHVlIGlzIHNhZmUsIGUuZy4gYSBVUkwgdGhhdAogKiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3VzcGljaW91cyBwcm90b2NvbCwgb3IgYW4gSFRNTCBzbmlwcGV0IHRoYXQgZG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXMKICogY29kZS4gVGhlIHNhbml0aXplciBsZWF2ZXMgc2FmZSB2YWx1ZXMgaW50YWN0LgogKgogKiBcQHNlY3VyaXR5IENhbGxpbmcgYW55IG9mIHRoZSBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmAgQVBJcyBkaXNhYmxlcyBBbmd1bGFyJ3MgYnVpbHQtaW4KICogc2FuaXRpemF0aW9uIGZvciB0aGUgdmFsdWUgcGFzc2VkIGluLiBDYXJlZnVsbHkgY2hlY2sgYW5kIGF1ZGl0IGFsbCB2YWx1ZXMgYW5kIGNvZGUgcGF0aHMgZ29pbmcKICogaW50byB0aGlzIGNhbGwuIE1ha2Ugc3VyZSBhbnkgdXNlciBkYXRhIGlzIGFwcHJvcHJpYXRlbHkgZXNjYXBlZCBmb3IgdGhpcyBzZWN1cml0eSBjb250ZXh0LgogKiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAqCiAqIFxAcHVibGljQXBpCiAqIEBhYnN0cmFjdAogKi8KY2xhc3MgRG9tU2FuaXRpemVyIHsKfQpEb21TYW5pdGl6ZXIuybVmYWMgPSBmdW5jdGlvbiBEb21TYW5pdGl6ZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRG9tU2FuaXRpemVyKSgpOyB9OwovKiogQG5vY29sbGFwc2UgKi8gRG9tU2FuaXRpemVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRG9tU2FuaXRpemVyX0ZhY3RvcnkoKSB7IHJldHVybiDJtcm1aW5qZWN0KERvbVNhbml0aXplckltcGwpOyB9LCB0b2tlbjogRG9tU2FuaXRpemVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7Ci8qKgogKiBAcGFyYW0gez99IGluamVjdG9yCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBkb21TYW5pdGl6ZXJJbXBsRmFjdG9yeShpbmplY3RvcikgewogICAgcmV0dXJuIG5ldyBEb21TYW5pdGl6ZXJJbXBsKGluamVjdG9yLmdldChET0NVTUVOVCQxKSk7Cn0KY2xhc3MgRG9tU2FuaXRpemVySW1wbCBleHRlbmRzIERvbVNhbml0aXplciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgc2FuaXRpemUoY3R4LCB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBzd2l0Y2ggKGN0eCkgewogICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5OT05FOgogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5IVE1MOgogICAgICAgICAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codmFsdWUsICJIVE1MIiAvKiBIdG1sICovKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZUh0bWwodGhpcy5fZG9jLCBTdHJpbmcodmFsdWUpKTsKICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuU1RZTEU6CiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgIlN0eWxlIiAvKiBTdHlsZSAqLykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfc2FuaXRpemVTdHlsZSgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlNDUklQVDoKICAgICAgICAgICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCAiU2NyaXB0IiAvKiBTY3JpcHQgKi8pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgc2NyaXB0IGNvbnRleHQnKTsKICAgICAgICAgICAgY2FzZSBTZWN1cml0eUNvbnRleHQuVVJMOgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdldFNhbml0aXphdGlvbkJ5cGFzc1R5cGUodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codmFsdWUsICJVUkwiIC8qIFVybCAqLykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfc2FuaXRpemVVcmwoU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTDoKICAgICAgICAgICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCAiUmVzb3VyY2VVUkwiIC8qIFJlc291cmNlVXJsICovKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKScpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIFNlY3VyaXR5Q29udGV4dCAke2N0eH0gKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSkgewogICAgICAgIHJldHVybiBieXBhc3NTYW5pdGl6YXRpb25UcnVzdEh0bWwodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodmFsdWUpIHsKICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQodmFsdWUpIHsKICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTY3JpcHQodmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBieXBhc3NTZWN1cml0eVRydXN0VXJsKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0VXJsKHZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0UmVzb3VyY2VVcmwodmFsdWUpOwogICAgfQp9CkRvbVNhbml0aXplckltcGwuybVmYWMgPSBmdW5jdGlvbiBEb21TYW5pdGl6ZXJJbXBsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbVNhbml0aXplckltcGwpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KRG9tU2FuaXRpemVySW1wbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gRG9tU2FuaXRpemVySW1wbC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIERvbVNhbml0aXplckltcGxfRmFjdG9yeSgpIHsgcmV0dXJuIGRvbVNhbml0aXplckltcGxGYWN0b3J5KMm1ybVpbmplY3QoSU5KRUNUT1IpKTsgfSwgdG9rZW46IERvbVNhbml0aXplckltcGwsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiBpbml0RG9tQWRhcHRlcigpIHsKICAgIEJyb3dzZXJEb21BZGFwdGVyLm1ha2VDdXJyZW50KCk7CiAgICBCcm93c2VyR2V0VGVzdGFiaWxpdHkuaW5pdCgpOwp9Ci8qKgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gZXJyb3JIYW5kbGVyKCkgewogICAgcmV0dXJuIG5ldyBFcnJvckhhbmRsZXIoKTsKfQovKioKICogQHJldHVybiB7P30KICovCmZ1bmN0aW9uIF9kb2N1bWVudCgpIHsKICAgIC8vIFRlbGwgaXZ5IGFib3V0IHRoZSBnbG9iYWwgZG9jdW1lbnQKICAgIHNldERvY3VtZW50KGRvY3VtZW50KTsKICAgIHJldHVybiBkb2N1bWVudDsKfQpjb25zdCDJtTAkNCQxID0gUExBVEZPUk1fQlJPV1NFUl9JRDsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBJTlRFUk5BTF9CUk9XU0VSX1BMQVRGT1JNX1BST1ZJREVSUyA9IFsKICAgIHsgcHJvdmlkZTogUExBVEZPUk1fSUQsIHVzZVZhbHVlOiDJtTAkNCQxIH0sCiAgICB7IHByb3ZpZGU6IFBMQVRGT1JNX0lOSVRJQUxJWkVSLCB1c2VWYWx1ZTogaW5pdERvbUFkYXB0ZXIsIG11bHRpOiB0cnVlIH0sCiAgICB7IHByb3ZpZGU6IERPQ1VNRU5UJDEsIHVzZUZhY3Rvcnk6IF9kb2N1bWVudCwgZGVwczogW10gfSwKXTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlNfX1BPU1RfUjNfXyA9IFtdOwovKioKICogXEBzZWN1cml0eSBSZXBsYWNpbmcgYnVpbHQtaW4gc2FuaXRpemF0aW9uIHByb3ZpZGVycyBleHBvc2VzIHRoZSBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuCiAqIEF0dGFja2VyLWNvbnRyb2xsZWQgZGF0YSBpbnRyb2R1Y2VkIGJ5IGFuIHVuc2FuaXRpemVkIHByb3ZpZGVyIGNvdWxkIGV4cG9zZSB5b3VyCiAqIGFwcGxpY2F0aW9uIHRvIFhTUyByaXNrcy4gRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlIFtTZWN1cml0eSBHdWlkZV0oaHR0cDovL2cuY28vbmcvc2VjdXJpdHkpLgogKiBcQHB1YmxpY0FwaQogKiBAdHlwZSB7P30KICovCmNvbnN0IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUyA9IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSU19fUE9TVF9SM19fOwovKioKICogXEBwdWJsaWNBcGkKICogQHR5cGUgez99CiAqLwpjb25zdCBwbGF0Zm9ybUJyb3dzZXIgPSBjcmVhdGVQbGF0Zm9ybUZhY3RvcnkocGxhdGZvcm1Db3JlLCAnYnJvd3NlcicsIElOVEVSTkFMX0JST1dTRVJfUExBVEZPUk1fUFJPVklERVJTKTsKLyoqIEB0eXBlIHs/fSAqLwpjb25zdCBCUk9XU0VSX01PRFVMRV9QUk9WSURFUlMgPSBbCiAgICBCUk9XU0VSX1NBTklUSVpBVElPTl9QUk9WSURFUlMsCiAgICB7IHByb3ZpZGU6IElOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sCiAgICB7IHByb3ZpZGU6IEVycm9ySGFuZGxlciwgdXNlRmFjdG9yeTogZXJyb3JIYW5kbGVyLCBkZXBzOiBbXSB9LAogICAgewogICAgICAgIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUywKICAgICAgICB1c2VDbGFzczogRG9tRXZlbnRzUGx1Z2luLAogICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgIGRlcHM6IFtET0NVTUVOVCQxLCBOZ1pvbmUsIFBMQVRGT1JNX0lEXQogICAgfSwKICAgIHsgcHJvdmlkZTogRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB1c2VDbGFzczogS2V5RXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZSwgZGVwczogW0RPQ1VNRU5UJDFdIH0sCiAgICBIQU1NRVJfUFJPVklERVJTLAogICAgewogICAgICAgIHByb3ZpZGU6IERvbVJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgdXNlQ2xhc3M6IERvbVJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgZGVwczogW0V2ZW50TWFuYWdlciwgRG9tU2hhcmVkU3R5bGVzSG9zdCwgQVBQX0lEXQogICAgfSwKICAgIHsgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwgdXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyRmFjdG9yeTIgfSwKICAgIHsgcHJvdmlkZTogU2hhcmVkU3R5bGVzSG9zdCwgdXNlRXhpc3Rpbmc6IERvbVNoYXJlZFN0eWxlc0hvc3QgfSwKICAgIHsgcHJvdmlkZTogRG9tU2hhcmVkU3R5bGVzSG9zdCwgdXNlQ2xhc3M6IERvbVNoYXJlZFN0eWxlc0hvc3QsIGRlcHM6IFtET0NVTUVOVCQxXSB9LAogICAgeyBwcm92aWRlOiBUZXN0YWJpbGl0eSwgdXNlQ2xhc3M6IFRlc3RhYmlsaXR5LCBkZXBzOiBbTmdab25lXSB9LAogICAgeyBwcm92aWRlOiBFdmVudE1hbmFnZXIsIHVzZUNsYXNzOiBFdmVudE1hbmFnZXIsIGRlcHM6IFtFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIE5nWm9uZV0gfSwKICAgIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLApdOwovKioKICogRXhwb3J0cyByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBmb3IgYWxsIEFuZ3VsYXIgYXBwcy4KICogSW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbGwgQW5ndWxhciBhcHBzIGNyZWF0ZWQgd2l0aCB0aGUgQ0xJCiAqIGBuZXdgIGNvbW1hbmQuCiAqIFJlLWV4cG9ydHMgYENvbW1vbk1vZHVsZWAgYW5kIGBBcHBsaWNhdGlvbk1vZHVsZWAsIG1ha2luZyB0aGVpcgogKiBleHBvcnRzIGFuZCBwcm92aWRlcnMgYXZhaWxhYmxlIHRvIGFsbCBhcHBzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQnJvd3Nlck1vZHVsZSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50TW9kdWxlCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKHBhcmVudE1vZHVsZSkgewogICAgICAgIGlmIChwYXJlbnRNb2R1bGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCcm93c2VyTW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiBJZiB5b3UgbmVlZCBhY2Nlc3MgdG8gY29tbW9uIGRpcmVjdGl2ZXMgc3VjaCBhcyBOZ0lmIGFuZCBOZ0ZvciBmcm9tIGEgbGF6eSBsb2FkZWQgbW9kdWxlLCBpbXBvcnQgQ29tbW9uTW9kdWxlIGluc3RlYWQuYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIGEgYnJvd3Nlci1iYXNlZCBhcHAgdG8gdHJhbnNpdGlvbiBmcm9tIGEgc2VydmVyLXJlbmRlcmVkIGFwcCwgaWYKICAgICAqIG9uZSBpcyBwcmVzZW50IG9uIHRoZSBwYWdlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcGFyYW1zIEFuIG9iamVjdCBjb250YWluaW5nIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBhcHAgdG8gdHJhbnNpdGlvbi4KICAgICAqIFRoZSBJRCBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIG9mIHRoZSBhcHAuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcmVjb25maWd1cmVkIGBCcm93c2VyTW9kdWxlYCB0byBpbXBvcnQgaW50byB0aGUgYXBwJ3Mgcm9vdCBgQXBwTW9kdWxlYC4KICAgICAqLwogICAgc3RhdGljIHdpdGhTZXJ2ZXJUcmFuc2l0aW9uKHBhcmFtcykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5nTW9kdWxlOiBCcm93c2VyTW9kdWxlLAogICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogQVBQX0lELCB1c2VWYWx1ZTogcGFyYW1zLmFwcElkIH0sCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IFRSQU5TSVRJT05fSUQsIHVzZUV4aXN0aW5nOiBBUFBfSUQgfSwKICAgICAgICAgICAgICAgIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUywKICAgICAgICAgICAgXSwKICAgICAgICB9OwogICAgfQp9CkJyb3dzZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBCcm93c2VyTW9kdWxlIH0pOwpCcm93c2VyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3Nlck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyTW9kdWxlKSjJtcm1aW5qZWN0KEJyb3dzZXJNb2R1bGUsIDEyKSk7IH0sIHByb3ZpZGVyczogQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBBcHBsaWNhdGlvbk1vZHVsZV0gfSk7Ci8qKiBAbm9jb2xsYXBzZSAqLwpCcm93c2VyTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2tpcFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtCcm93c2VyTW9kdWxlLF0gfV0gfQpdOwooZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShCcm93c2VyTW9kdWxlLCB7IGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsIEFwcGxpY2F0aW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvbWV0YS50cwogKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAqLwovKioKICogRmFjdG9yeSB0byBjcmVhdGUgTWV0YSBzZXJ2aWNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlTWV0YSgpIHsKICAgIHJldHVybiBuZXcgTWV0YSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsKfQovKioKICogQSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGFuZCBhZGQgbWV0YSB0YWdzLgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgTWV0YSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICovCiAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgdGhpcy5fZG9jID0gX2RvYzsKICAgICAgICB0aGlzLl9kb20gPSBnZXRET00oKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlQ3JlYXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGFkZFRhZyh0YWcsIGZvcmNlQ3JlYXRpb24gPSBmYWxzZSkgewogICAgICAgIGlmICghdGFnKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHRhZywgZm9yY2VDcmVhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFncwogICAgICogQHBhcmFtIHs/PX0gZm9yY2VDcmVhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgYWRkVGFncyh0YWdzLCBmb3JjZUNyZWF0aW9uID0gZmFsc2UpIHsKICAgICAgICBpZiAoIXRhZ3MpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdGFncy5yZWR1Y2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZXN1bHQsIHRhZykgPT4gewogICAgICAgICAgICBpZiAodGFnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodGFnLCBmb3JjZUNyZWF0aW9uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KSwgW10pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGF0dHJTZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0VGFnKGF0dHJTZWxlY3RvcikgewogICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jLnF1ZXJ5U2VsZWN0b3IoYG1ldGFbJHthdHRyU2VsZWN0b3J9XWApIHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXR0clNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUYWdzKGF0dHJTZWxlY3RvcikgewogICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxpc3QgLypOb2RlTGlzdCovID0gdGhpcy5fZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoYG1ldGFbJHthdHRyU2VsZWN0b3J9XWApOwogICAgICAgIHJldHVybiBsaXN0ID8gW10uc2xpY2UuY2FsbChsaXN0KSA6IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHVwZGF0ZVRhZyh0YWcsIHNlbGVjdG9yKSB7CiAgICAgICAgaWYgKCF0YWcpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgfHwgdGhpcy5fcGFyc2VTZWxlY3Rvcih0YWcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZ2V0VGFnKHNlbGVjdG9yKSkpOwogICAgICAgIGlmIChtZXRhKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModGFnLCBtZXRhKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0YWcsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGF0dHJTZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlVGFnKGF0dHJTZWxlY3RvcikgewogICAgICAgIHRoaXMucmVtb3ZlVGFnRWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5nZXRUYWcoYXR0clNlbGVjdG9yKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICByZW1vdmVUYWdFbGVtZW50KG1ldGEpIHsKICAgICAgICBpZiAobWV0YSkgewogICAgICAgICAgICB0aGlzLl9kb20ucmVtb3ZlKG1ldGEpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHBhcmFtIHs/PX0gZm9yY2VDcmVhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX2dldE9yQ3JlYXRlRWxlbWVudChtZXRhLCBmb3JjZUNyZWF0aW9uID0gZmFsc2UpIHsKICAgICAgICBpZiAoIWZvcmNlQ3JlYXRpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuX3BhcnNlU2VsZWN0b3IobWV0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmdldFRhZyhzZWxlY3RvcikpKTsKICAgICAgICAgICAgLy8gSXQncyBhbGxvd2VkIHRvIGhhdmUgbXVsdGlwbGUgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lIHNvIGl0J3Mgbm90IGVub3VnaCB0bwogICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHRoYXQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBwYWdlLiBXZSBhbHNvIG5lZWQgdG8KICAgICAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCBoYXMgdGFnIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKGVsZW0gJiYgdGhpcy5fY29udGFpbnNBdHRyaWJ1dGVzKG1ldGEsIGVsZW0pKQogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdtZXRhJykpKTsKICAgICAgICB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXMobWV0YSwgZWxlbWVudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLl9kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKICAgICAgICBoZWFkLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModGFnLCBlbCkgewogICAgICAgIE9iamVjdC5rZXlzKHRhZykuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocHJvcCkgPT4gZWwuc2V0QXR0cmlidXRlKHByb3AsIHRhZ1twcm9wXSkpKTsKICAgICAgICByZXR1cm4gZWw7CiAgICB9CiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgX3BhcnNlU2VsZWN0b3IodGFnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGF0dHIgPSB0YWcubmFtZSA/ICduYW1lJyA6ICdwcm9wZXJ0eSc7CiAgICAgICAgcmV0dXJuIGAke2F0dHJ9PSIke3RhZ1thdHRyXX0iYDsKICAgIH0KICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgKiBAcGFyYW0gez99IGVsZW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIF9jb250YWluc0F0dHJpYnV0ZXModGFnLCBlbGVtKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRhZykuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoa2V5KSA9PiBlbGVtLmdldEF0dHJpYnV0ZShrZXkpID09PSB0YWdba2V5XSkpOwogICAgfQp9Ck1ldGEuybVmYWMgPSBmdW5jdGlvbiBNZXRhX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldGEpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KTWV0YS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQpdOwovKiogQG5vY29sbGFwc2UgKi8gTWV0YS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGNyZWF0ZU1ldGEsIHRva2VuOiBNZXRhLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgovKioKICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9icm93c2VyL3RpdGxlLnRzCiAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICovCi8qKgogKiBGYWN0b3J5IHRvIGNyZWF0ZSBUaXRsZSBzZXJ2aWNlLgogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gY3JlYXRlVGl0bGUoKSB7CiAgICByZXR1cm4gbmV3IFRpdGxlKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOwp9Ci8qKgogKiBBIHNlcnZpY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgYW5kIHNldCB0aGUgdGl0bGUgb2YgYSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAqCiAqIFNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuJ3QgYmUgYm9vdHN0cmFwcGVkIG9uIHRoZSBlbnRpcmUgSFRNTCBkb2N1bWVudCAoYDxodG1sPmAgdGFnKQogKiBpdCBpcyBub3QgcG9zc2libGUgdG8gYmluZCB0byB0aGUgYHRleHRgIHByb3BlcnR5IG9mIHRoZSBgSFRNTFRpdGxlRWxlbWVudGAgZWxlbWVudHMKICogKHJlcHJlc2VudGluZyB0aGUgYDx0aXRsZT5gIHRhZykuIEluc3RlYWQsIHRoaXMgc2VydmljZSBjYW4gYmUgdXNlZCB0byBzZXQgYW5kIGdldCB0aGUgY3VycmVudAogKiB0aXRsZSB2YWx1ZS4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFRpdGxlIHsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBnZXRUaXRsZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZG9jLnRpdGxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAgICAgKiBAcGFyYW0gez99IG5ld1RpdGxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzZXRUaXRsZShuZXdUaXRsZSkgewogICAgICAgIHRoaXMuX2RvYy50aXRsZSA9IG5ld1RpdGxlIHx8ICcnOwogICAgfQp9ClRpdGxlLsm1ZmFjID0gZnVuY3Rpb24gVGl0bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGUpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwovKiogQG5vY29sbGFwc2UgKi8KVGl0bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KXTsKLyoqIEBub2NvbGxhcHNlICovIFRpdGxlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogY3JlYXRlVGl0bGUsIHRva2VuOiBUaXRsZSwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwovKioKICogQHBhcmFtIHs/fSB0ZXh0CiAqIEByZXR1cm4gez99CiAqLwpmdW5jdGlvbiB1bmVzY2FwZUh0bWwodGV4dCkgewogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdW5lc2NhcGVkVGV4dCA9IHsKICAgICAgICAnJmE7JzogJyYnLAogICAgICAgICcmcTsnOiAnIicsCiAgICAgICAgJyZzOyc6ICdcJycsCiAgICAgICAgJyZsOyc6ICc8JywKICAgICAgICAnJmc7JzogJz4nLAogICAgfTsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoLyZbXjtdKzsvZywgKC8qKgogICAgICogQHBhcmFtIHs/fSBzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBzID0+IHVuZXNjYXBlZFRleHRbc10pKTsKfQovKioKICogQSBrZXkgdmFsdWUgc3RvcmUgdGhhdCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUgdG8gdGhlIGFwcGxpY2F0aW9uCiAqIG9uIHRoZSBjbGllbnQgc2lkZS4KICoKICogYFRyYW5zZmVyU3RhdGVgIHdpbGwgYmUgYXZhaWxhYmxlIGFzIGFuIGluamVjdGFibGUgdG9rZW4uIFRvIHVzZSBpdCBpbXBvcnQKICogYFNlcnZlclRyYW5zZmVyU3RhdGVNb2R1bGVgIG9uIHRoZSBzZXJ2ZXIgYW5kIGBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZWAgb24gdGhlIGNsaWVudC4KICoKICogVGhlIHZhbHVlcyBpbiB0aGUgc3RvcmUgYXJlIHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkIHVzaW5nIEpTT04uc3RyaW5naWZ5L0pTT04ucGFyc2UuIFNvIG9ubHkKICogYm9vbGVhbiwgbnVtYmVyLCBzdHJpbmcsIG51bGwgYW5kIG5vbi1jbGFzcyBvYmplY3RzIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWx6aWVkIGluIGEKICogbm9uLWxvc3N5IG1hbm5lci4KICoKICogXEBwdWJsaWNBcGkKICovCmNsYXNzIFRyYW5zZmVyU3RhdGUgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5zdG9yZSA9IHt9OwogICAgICAgIHRoaXMub25TZXJpYWxpemVDYWxsYmFja3MgPSB7fTsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHBhcmFtIHs/fSBpbml0U3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHN0YXRpYyBpbml0KGluaXRTdGF0ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmFuc2ZlclN0YXRlID0gbmV3IFRyYW5zZmVyU3RhdGUoKTsKICAgICAgICB0cmFuc2ZlclN0YXRlLnN0b3JlID0gaW5pdFN0YXRlOwogICAgICAgIHJldHVybiB0cmFuc2ZlclN0YXRlOwogICAgfQogICAgLyoqCiAgICAgKiBHZXQgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBrZXkuIFJldHVybiBgZGVmYXVsdFZhbHVlYCBpZiBrZXkgaXMgbm90IGZvdW5kLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IGRlZmF1bHRWYWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZ2V0KGtleSwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmVba2V5XSAhPT0gdW5kZWZpbmVkID8gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc3RvcmVba2V5XSkpIDogZGVmYXVsdFZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBrZXkuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIHNldChrZXksIHZhbHVlKSB7CiAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhIGtleSBmcm9tIHRoZSBzdG9yZS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgcmVtb3ZlKGtleSkgewogICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlW2tleV07CiAgICB9CiAgICAvKioKICAgICAqIFRlc3Qgd2hldGhlciBhIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBoYXNLZXkoa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzT3duUHJvcGVydHkoa2V5KTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBwcm92aWRlIHRoZSB2YWx1ZSBmb3IgYSBrZXkgd2hlbiBgdG9Kc29uYCBpcyBjYWxsZWQuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIG9uU2VyaWFsaXplKGtleSwgY2FsbGJhY2spIHsKICAgICAgICB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzW2tleV0gPSBjYWxsYmFjazsKICAgIH0KICAgIC8qKgogICAgICogU2VyaWFsaXplIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzdG9yZSB0byBKU09OLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgdG9Kc29uKCkgewogICAgICAgIC8vIENhbGwgdGhlIG9uU2VyaWFsaXplIGNhbGxiYWNrcyBhbmQgcHV0IHRob3NlIHZhbHVlcyBpbnRvIHRoZSBzdG9yZS4KICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAnLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5zdG9yZSk7CiAgICB9Cn0KVHJhbnNmZXJTdGF0ZS7JtWZhYyA9IGZ1bmN0aW9uIFRyYW5zZmVyU3RhdGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVHJhbnNmZXJTdGF0ZSkoKTsgfTsKVHJhbnNmZXJTdGF0ZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUcmFuc2ZlclN0YXRlLCBmYWN0b3J5OiBUcmFuc2ZlclN0YXRlLsm1ZmFjIH0pOwovKioKICogQHBhcmFtIHs/fSBkb2MKICogQHBhcmFtIHs/fSBhcHBJZAogKiBAcmV0dXJuIHs/fQogKi8KZnVuY3Rpb24gaW5pdFRyYW5zZmVyU3RhdGUoZG9jLCBhcHBJZCkgewogICAgLy8gTG9jYXRlIHRoZSBzY3JpcHQgdGFnIHdpdGggdGhlIEpTT04gZGF0YSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAvLyBUaGUgaWQgb2YgdGhlIHNjcmlwdCB0YWcgaXMgc2V0IHRvIHRoZSBBbmd1bGFyIGFwcElkICsgJ3N0YXRlJy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChhcHBJZCArICctc3RhdGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbml0aWFsU3RhdGUgPSB7fTsKICAgIGlmIChzY3JpcHQgJiYgc2NyaXB0LnRleHRDb250ZW50KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaW5pdGlhbFN0YXRlID0gSlNPTi5wYXJzZSh1bmVzY2FwZUh0bWwoc2NyaXB0LnRleHRDb250ZW50KSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIHdoaWxlIHJlc3RvcmluZyBUcmFuc2ZlclN0YXRlIGZvciBhcHAgJyArIGFwcElkLCBlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gVHJhbnNmZXJTdGF0ZS5pbml0KGluaXRpYWxTdGF0ZSk7Cn0KLyoqCiAqIE5nTW9kdWxlIHRvIGluc3RhbGwgb24gdGhlIGNsaWVudCBzaWRlIHdoaWxlIHVzaW5nIHRoZSBgVHJhbnNmZXJTdGF0ZWAgdG8gdHJhbnNmZXIgc3RhdGUgZnJvbQogKiBzZXJ2ZXIgdG8gY2xpZW50LgogKgogKiBcQHB1YmxpY0FwaQogKi8KY2xhc3MgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgewp9CkJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgfSk7CkJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVHJhbnNmZXJTdGF0ZSwgdXNlRmFjdG9yeTogaW5pdFRyYW5zZmVyU3RhdGUsIGRlcHM6IFtET0NVTUVOVCQxLCBBUFBfSURdIH1dIH0pOwoKLyoqCiAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvcHJpdmF0ZV9leHBvcnQudHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3ZlcnNpb24udHMKICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogKi8KLyoqCiAqIFxAcHVibGljQXBpCiAqIEB0eXBlIHs/fQogKi8KY29uc3QgVkVSU0lPTiQyID0gbmV3IFZlcnNpb24oJzkuMS4yJyk7Cgp2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCi8qKgoqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4wLW5leHQuNCs2MS5zaGEtZTU1MjU5MS53aXRoLWxvY2FsLWNoYW5nZXMKKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KKiBMaWNlbnNlOiBNSVQKKi8KKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAKICAgICAgICBmYWN0b3J5KCk7Cn0oKGZ1bmN0aW9uICgpIHsKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIHZhciBab25lJDEgPSAoZnVuY3Rpb24gKGdsb2JhbCkgewogICAgICAgIHZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbFsncGVyZm9ybWFuY2UnXTsKICAgICAgICBmdW5jdGlvbiBtYXJrKG5hbWUpIHsgcGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2VbJ21hcmsnXSAmJiBwZXJmb3JtYW5jZVsnbWFyayddKG5hbWUpOyB9CiAgICAgICAgZnVuY3Rpb24gcGVyZm9ybWFuY2VNZWFzdXJlKG5hbWUsIGxhYmVsKSB7CiAgICAgICAgICAgIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10gJiYgcGVyZm9ybWFuY2VbJ21lYXN1cmUnXShuYW1lLCBsYWJlbCk7CiAgICAgICAgfQogICAgICAgIG1hcmsoJ1pvbmUnKTsKICAgICAgICAvLyBJbml0aWFsaXplIGJlZm9yZSBpdCdzIGFjY2Vzc2VkIGJlbG93LgogICAgICAgIC8vIF9fWm9uZV9zeW1ib2xfcHJlZml4IGdsb2JhbCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB6b25lCiAgICAgICAgLy8gc3ltYm9sIHByZWZpeCB3aXRoIGEgY3VzdG9tIG9uZSBpZiBuZWVkZWQuCiAgICAgICAgdmFyIHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJzsKICAgICAgICBmdW5jdGlvbiBfX3N5bWJvbF9fKG5hbWUpIHsgcmV0dXJuIHN5bWJvbFByZWZpeCArIG5hbWU7IH0KICAgICAgICB2YXIgY2hlY2tEdXBsaWNhdGUgPSBnbG9iYWxbX19zeW1ib2xfXygnZm9yY2VEdXBsaWNhdGVab25lQ2hlY2snKV0gPT09IHRydWU7CiAgICAgICAgaWYgKGdsb2JhbFsnWm9uZSddKSB7CiAgICAgICAgICAgIC8vIGlmIGdsb2JhbFsnWm9uZSddIGFscmVhZHkgZXhpc3RzIChtYXliZSB6b25lLmpzIHdhcyBhbHJlYWR5IGxvYWRlZCBvcgogICAgICAgICAgICAvLyBzb21lIG90aGVyIGxpYiBhbHNvIHJlZ2lzdGVyZWQgYSBnbG9iYWwgb2JqZWN0IG5hbWVkIFpvbmUpLCB3ZSBtYXkgbmVlZAogICAgICAgICAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLgogICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgLy8gd2UgaGF2ZSB0d28gd2ViIHBhZ2VzLCBwYWdlMSBpbmNsdWRlcyB6b25lLmpzLCBwYWdlMiBkb2Vzbid0LgogICAgICAgICAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLAogICAgICAgICAgICAvLyBidXQgd2hlbiB1c2VyIGxvYWQgcGFnZTIgYWdhaW4sIGVycm9yIG9jY3VycyBiZWNhdXNlIGdsb2JhbFsnWm9uZSddIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAvLyBzbyB3ZSBhZGQgYSBmbGFnIHRvIGxldCB1c2VyIGNob29zZSB3aGV0aGVyIHRvIHRocm93IHRoaXMgZXJyb3Igb3Igbm90LgogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLgogICAgICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGUgfHwgdHlwZW9mIGdsb2JhbFsnWm9uZSddLl9fc3ltYm9sX18gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWm9uZSBhbHJlYWR5IGxvYWRlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxbJ1pvbmUnXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgWm9uZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gWm9uZShwYXJlbnQsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICB0aGlzLl9uYW1lID0gem9uZVNwZWMgPyB6b25lU3BlYy5uYW1lIHx8ICd1bm5hbWVkJyA6ICc8cm9vdD4nOwogICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHpvbmVTcGVjICYmIHpvbmVTcGVjLnByb3BlcnRpZXMgfHwge307CiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUgPQogICAgICAgICAgICAgICAgICAgIG5ldyBab25lRGVsZWdhdGUodGhpcywgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLCB6b25lU3BlYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZS5hc3NlcnRab25lUGF0Y2hlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChnbG9iYWxbJ1Byb21pc2UnXSAhPT0gcGF0Y2hlc1snWm9uZUF3YXJlUHJvbWlzZSddKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBiZWVuIG92ZXJ3cml0dGVuLlxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICdNb3N0IGxpa2VseSBjYXVzZSBpcyB0aGF0IGEgUHJvbWlzZSBwb2x5ZmlsbCBoYXMgYmVlbiBsb2FkZWQgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgKwogICAgICAgICAgICAgICAgICAgICAgICAnSWYgeW91IG11c3QgbG9hZCBvbmUsIGRvIHNvIGJlZm9yZSBsb2FkaW5nIHpvbmUuanMuKScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgInJvb3QiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoem9uZS5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgem9uZSA9IHpvbmUucGFyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9uZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgImN1cnJlbnQiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9jdXJyZW50Wm9uZUZyYW1lLnpvbmU7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgImN1cnJlbnRUYXNrIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfY3VycmVudFRhc2s7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2ggPSBmdW5jdGlvbiAobmFtZSwgZm4pIHsKICAgICAgICAgICAgICAgIGlmIChwYXRjaGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRHVwbGljYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdBbHJlYWR5IGxvYWRlZCBwYXRjaDogJyArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFnbG9iYWxbJ19fWm9uZV9kaXNhYmxlXycgKyBuYW1lXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lOwogICAgICAgICAgICAgICAgICAgIG1hcmsocGVyZk5hbWUpOwogICAgICAgICAgICAgICAgICAgIHBhdGNoZXNbbmFtZV0gPSBmbihnbG9iYWwsIFpvbmUsIF9hcGkpOwogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlTWVhc3VyZShwZXJmTmFtZSwgcGVyZk5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZS5wcm90b3R5cGUsICJwYXJlbnQiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lLnByb3RvdHlwZSwgIm5hbWUiLCB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0sCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBab25lLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgem9uZSA9IHRoaXMuZ2V0Wm9uZVdpdGgoa2V5KTsKICAgICAgICAgICAgICAgIGlmICh6b25lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB6b25lLl9wcm9wZXJ0aWVzW2tleV07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmdldFpvbmVXaXRoID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmZvcmsgPSBmdW5jdGlvbiAoem9uZVNwZWMpIHsKICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuZm9yayh0aGlzLCB6b25lU3BlYyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGZ1bmN0aW9uIGdvdDogJyArIGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfY2FsbGJhY2sgPSB0aGlzLl96b25lRGVsZWdhdGUuaW50ZXJjZXB0KHRoaXMsIGNhbGxiYWNrLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgdmFyIHpvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5ydW5HdWFyZGVkKF9jYWxsYmFjaywgdGhpcywgYXJndW1lbnRzLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7CiAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IF9jdXJyZW50Wm9uZUZyYW1lLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUucnVuR3VhcmRlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgaWYgKGFwcGx5VGhpcyA9PT0gdm9pZCAwKSB7IGFwcGx5VGhpcyA9IG51bGw7IH0KICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAodGFzay56b25lICE9IHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgdGFzayBjYW4gb25seSBiZSBydW4gaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArICc7IEV4ZWN1dGlvbjogJyArIHRoaXMubmFtZSArICcpJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy83NzgsIHNvbWV0aW1lcyBldmVudFRhc2sKICAgICAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAvLyBydW4gc3VjaCBraW5kIG9mIHRhc2sgYnV0IGp1c3QgcmV0dXJuCiAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PT0gbm90U2NoZWR1bGVkICYmICh0YXNrLnR5cGUgPT09IGV2ZW50VGFzayB8fCB0YXNrLnR5cGUgPT09IG1hY3JvVGFzaykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcmVFbnRyeUd1YXJkID0gdGFzay5zdGF0ZSAhPSBydW5uaW5nOwogICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHRhc2suX3RyYW5zaXRpb25UbyhydW5uaW5nLCBzY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgdGFzay5ydW5Db3VudCsrOwogICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzVGFzayA9IF9jdXJyZW50VGFzazsKICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBfY3VycmVudFpvbmVGcmFtZSwgem9uZTogdGhpcyB9OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay50eXBlID09IG1hY3JvVGFzayAmJiB0YXNrLmRhdGEgJiYgIXRhc2suZGF0YS5pc1BlcmlvZGljKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FuY2VsRm4gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlVGFzayh0aGlzLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsIGVycm9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFzaydzIHN0YXRlIGlzIG5vdFNjaGVkdWxlZCBvciB1bmtub3duLCB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG5vdCByZXNldCB0aGUgc3RhdGUgdG8gc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgIT09IG5vdFNjaGVkdWxlZCAmJiB0YXNrLnN0YXRlICE9PSB1bmtub3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnR5cGUgPT0gZXZlbnRUYXNrIHx8ICh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmlzUGVyaW9kaWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgcnVubmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnJ1bkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZUVudHJ5R3VhcmQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8obm90U2NoZWR1bGVkLCBydW5uaW5nLCBub3RTY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50OwogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVUYXNrID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgJiYgdGFzay56b25lICE9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHRhc2sgd2FzIHJlc2NoZWR1bGVkLCB0aGUgbmV3Wm9uZQogICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBvcmlnaW5hbCB6b25lCiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1pvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdab25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdab25lID09PSB0YXNrLnpvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byAiICsgdGhpcy5uYW1lICsgIiB3aGljaCBpcyBkZXNjZW5kYW50cyBvZiB0aGUgb3JpZ2luYWwgem9uZSAiICsgdGFzay56b25lLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTsKICAgICAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gW107CiAgICAgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gem9uZURlbGVnYXRlczsKICAgICAgICAgICAgICAgIHRhc2suX3pvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB0YXNrID0gdGhpcy5fem9uZURlbGVnYXRlLnNjaGVkdWxlVGFzayh0aGlzLCB0YXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgc2V0IHRhc2sncyBzdGF0ZSB0byB1bmtub3duIHdoZW4gc2NoZWR1bGVUYXNrIHRocm93IGVycm9yCiAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZXJyIG1heSBmcm9tIHJlc2NoZWR1bGUsIHNvIHRoZSBmcm9tU3RhdGUgbWF5YmUgbm90U2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHVua25vd24sIHNjaGVkdWxpbmcsIG5vdFNjaGVkdWxlZCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc2hvdWxkIHdlIGNoZWNrIHRoZSByZXN1bHQgZnJvbSBoYW5kbGVFcnJvcj8KICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGFzay5fem9uZURlbGVnYXRlcyA9PT0gem9uZURlbGVnYXRlcykgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2hlY2sgYmVjYXVzZSBpbnRlcm5hbGx5IHRoZSBkZWxlZ2F0ZSBjYW4gcmVzY2hlZHVsZSB0aGUgdGFzay4KICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGFzay5zdGF0ZSA9PSBzY2hlZHVsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHNjaGVkdWxlZCwgc2NoZWR1bGluZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2sgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWljcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgdW5kZWZpbmVkKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlTWFjcm9UYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2sobWFjcm9UYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlRXZlbnRUYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlVGFzayhuZXcgWm9uZVRhc2soZXZlbnRUYXNrLCBzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIGNhbmNlbGxlZCBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICsgJzsgRXhlY3V0aW9uOiAnICsgdGhpcy5uYW1lICsgJyknKTsKICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25UbyhjYW5jZWxpbmcsIHNjaGVkdWxlZCwgcnVubmluZyk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd24KICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8odW5rbm93biwgY2FuY2VsaW5nKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVUYXNrQ291bnQodGFzaywgLTEpOwogICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTsKICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQgPSBmdW5jdGlvbiAodGFzaywgY291bnQpIHsKICAgICAgICAgICAgICAgIHZhciB6b25lRGVsZWdhdGVzID0gdGFzay5fem9uZURlbGVnYXRlczsKICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRhc2suX3pvbmVEZWxlZ2F0ZXMgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgem9uZURlbGVnYXRlc1tpXS5fdXBkYXRlVGFza0NvdW50KHRhc2sudHlwZSwgY291bnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZTsKICAgICAgICB9KCkpOwogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgIFpvbmUuX19zeW1ib2xfXyA9IF9fc3ltYm9sX187CiAgICAgICAgdmFyIERFTEVHQVRFX1pTID0gewogICAgICAgICAgICBuYW1lOiAnJywKICAgICAgICAgICAgb25IYXNUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgaGFzVGFza1N0YXRlKSB7IHJldHVybiBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTsgfSwKICAgICAgICAgICAgb25TY2hlZHVsZVRhc2s6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrKSB7IHJldHVybiBkZWxlZ2F0ZS5zY2hlZHVsZVRhc2sodGFyZ2V0LCB0YXNrKTsgfSwKICAgICAgICAgICAgb25JbnZva2VUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsgcmV0dXJuIGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7IH0sCiAgICAgICAgICAgIG9uQ2FuY2VsVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spIHsgcmV0dXJuIGRlbGVnYXRlLmNhbmNlbFRhc2sodGFyZ2V0LCB0YXNrKTsgfQogICAgICAgIH07CiAgICAgICAgdmFyIFpvbmVEZWxlZ2F0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZnVuY3Rpb24gWm9uZURlbGVnYXRlKHpvbmUsIHBhcmVudERlbGVnYXRlLCB6b25lU3BlYykgewogICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvdW50cyA9IHsgJ21pY3JvVGFzayc6IDAsICdtYWNyb1Rhc2snOiAwLCAnZXZlbnRUYXNrJzogMCB9OwogICAgICAgICAgICAgICAgdGhpcy56b25lID0gem9uZTsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudERlbGVnYXRlID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICB0aGlzLl9mb3JrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYyAmJiB6b25lU3BlYy5vbkZvcmsgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9mb3JrWlMpOwogICAgICAgICAgICAgICAgdGhpcy5fZm9ya0RsZ3QgPSB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5fZm9ya0RsZ3QpOwogICAgICAgICAgICAgICAgdGhpcy5fZm9ya0N1cnJab25lID0KICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHRaUyA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0WlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW50ZXJjZXB0RGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdEN1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlWlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW52b2tlRGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlRGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZUN1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JaUyk7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckRsZ3QgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JEbGd0KTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza1pTKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpOwogICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUgPSB6b25lU3BlYyAmJgogICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrWlMpOwogICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0RsZ3QgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrRGxndCk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza0N1cnJab25lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2taUyk7CiAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tEbGd0KTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9CiAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0ID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDsKICAgICAgICAgICAgICAgIHZhciB6b25lU3BlY0hhc1Rhc2sgPSB6b25lU3BlYyAmJiB6b25lU3BlYy5vbkhhc1Rhc2s7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SGFzVGFzayA9IHBhcmVudERlbGVnYXRlICYmIHBhcmVudERlbGVnYXRlLl9oYXNUYXNrWlM7CiAgICAgICAgICAgICAgICBpZiAoem9uZVNwZWNIYXNUYXNrIHx8IHBhcmVudEhhc1Rhc2spIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBuZWVkIHRvIHJlcG9ydCBoYXNUYXNrLCB0aGFuIHRoaXMgWlMgbmVlZHMgdG8gZG8gcmVmIGNvdW50aW5nIG9uIHRhc2tzLiBJbiBzdWNoCiAgICAgICAgICAgICAgICAgICAgLy8gYSBjYXNlIGFsbCB0YXNrIHJlbGF0ZWQgaW50ZXJjZXB0b3JzIG11c3QgZ28gdGhyb3VnaCB0aGlzIFpELiBXZSBjYW4ndCBzaG9ydCBjaXJjdWl0IGl0LgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyA9IHpvbmVTcGVjSGFzVGFzayA/IHpvbmVTcGVjIDogREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndE93bmVyID0gdGhpczsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrQ3VyclpvbmUgPSB6b25lOwogICAgICAgICAgICAgICAgICAgIGlmICghem9uZVNwZWMub25TY2hlZHVsZVRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPSBERUxFR0FURV9aUzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkludm9rZVRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTID0gREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkNhbmNlbFRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5mb3JrID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ya1pTID8KICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LCB0aGlzLnpvbmUsIHRhcmdldFpvbmUsIHpvbmVTcGVjKSA6CiAgICAgICAgICAgICAgICAgICAgbmV3IFpvbmUodGFyZ2V0Wm9uZSwgem9uZVNwZWMpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmludGVyY2VwdCA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdFpTLm9uSW50ZXJjZXB0KHRoaXMuX2ludGVyY2VwdERsZ3QsIHRoaXMuX2ludGVyY2VwdEN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgc291cmNlKSA6CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlWlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgOgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGFwcGx5VGhpcywgYXBwbHlBcmdzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBlcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUVycm9yWlMgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMub25IYW5kbGVFcnJvcih0aGlzLl9oYW5kbGVFcnJvckRsZ3QsIHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUsIHRhcmdldFpvbmUsIGVycm9yKSA6CiAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5zY2hlZHVsZVRhc2sgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgdGFzaykgewogICAgICAgICAgICAgICAgdmFyIHJldHVyblRhc2sgPSB0YXNrOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NjaGVkdWxlVGFza1pTKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1Rhc2taUykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spOwogICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogICAgICAgICAgICAgICAgICAgIGlmICghcmV0dXJuVGFzaykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc2NoZWR1bGVGbih0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblRhc2s7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZVRhc2taUyA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCwgdGhpcy5faW52b2tlVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgOgogICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFyZ2V0Wm9uZSwgdGFzaykgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhbmNlbFRhc2taUykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCwgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lLCB0YXJnZXRab25lLCB0YXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghdGFzay5jYW5jZWxGbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGFzayBpcyBub3QgY2FuY2VsYWJsZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRhc2suY2FuY2VsRm4odGFzayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaGFzVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBpc0VtcHR5KSB7CiAgICAgICAgICAgICAgICAvLyBoYXNUYXNrIHNob3VsZCBub3QgdGhyb3cgZXJyb3Igc28gb3RoZXIgWm9uZURlbGVnYXRlCiAgICAgICAgICAgICAgICAvLyBjYW4gc3RpbGwgdHJpZ2dlciBoYXNUYXNrIGNhbGxiYWNrCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyAmJgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LCB0aGlzLl9oYXNUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIGlzRW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IodGFyZ2V0Wm9uZSwgZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuX3VwZGF0ZVRhc2tDb3VudCA9IGZ1bmN0aW9uICh0eXBlLCBjb3VudCkgewogICAgICAgICAgICAgICAgdmFyIGNvdW50cyA9IHRoaXMuX3Rhc2tDb3VudHM7CiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IGNvdW50c1t0eXBlXTsKICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gY291bnRzW3R5cGVdID0gcHJldiArIGNvdW50OwogICAgICAgICAgICAgICAgaWYgKG5leHQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb3JlIHRhc2tzIGV4ZWN1dGVkIHRoZW4gd2VyZSBzY2hlZHVsZWQuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocHJldiA9PSAwIHx8IG5leHQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpc0VtcHR5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBtaWNyb1Rhc2s6IGNvdW50c1snbWljcm9UYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBtYWNyb1Rhc2s6IGNvdW50c1snbWFjcm9UYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhc2s6IGNvdW50c1snZXZlbnRUYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHR5cGUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzVGFzayh0aGlzLnpvbmUsIGlzRW1wdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZURlbGVnYXRlOwogICAgICAgIH0oKSk7CiAgICAgICAgdmFyIFpvbmVUYXNrID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmdW5jdGlvbiBab25lVGFzayh0eXBlLCBzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZUZuLCBjYW5jZWxGbikgewogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICB0aGlzLl96b25lID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMucnVuQ291bnQgPSAwOwogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGVzID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnbm90U2NoZWR1bGVkJzsKICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm4gPSBzY2hlZHVsZUZuOwogICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxGbiA9IGNhbmNlbEZuOwogICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgaXMgbm90IGRlZmluZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIC8vIFRPRE86IEBKaWFMaVBhc3Npb24gb3B0aW9ucyBzaG91bGQgaGF2ZSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBldmVudFRhc2sgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnVzZUcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IFpvbmVUYXNrLmludm9rZVRhc2s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVUYXNrLmludm9rZVRhc2suY2FsbChnbG9iYWwsIHNlbGYsIHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBab25lVGFzay5pbnZva2VUYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRhcmdldCwgYXJncykgewogICAgICAgICAgICAgICAgaWYgKCF0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGFzayA9IHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzKys7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay56b25lLnJ1blRhc2sodGFzaywgdGFyZ2V0LCBhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIGlmIChfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJhaW5NaWNyb1Rhc2tRdWV1ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lVGFzay5wcm90b3R5cGUsICJ6b25lIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl96b25lOyB9LAogICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVUYXNrLnByb3RvdHlwZSwgInN0YXRlIiwgewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9zdGF0ZTsgfSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS5jYW5jZWxTY2hlZHVsZVJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7IHRoaXMuX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHNjaGVkdWxpbmcpOyB9OwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLl90cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiAodG9TdGF0ZSwgZnJvbVN0YXRlMSwgZnJvbVN0YXRlMikgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUxIHx8IHRoaXMuX3N0YXRlID09PSBmcm9tU3RhdGUyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB0b1N0YXRlOwogICAgICAgICAgICAgICAgICAgIGlmICh0b1N0YXRlID09IG5vdFNjaGVkdWxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGVzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlICsgIiAnIiArIHRoaXMuc291cmNlICsgIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnIiArIHRvU3RhdGUgKyAiJywgZXhwZWN0aW5nIHN0YXRlICciICsgZnJvbVN0YXRlMSArICInIiArIChmcm9tU3RhdGUyID8gJyBvciBcJycgKyBmcm9tU3RhdGUyICsgJ1wnJyA6ICcnKSArICIsIHdhcyAnIiArIHRoaXMuX3N0YXRlICsgIicuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdHlwZW9mIHRoaXMuZGF0YS5oYW5kbGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmhhbmRsZUlkLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBhZGQgdG9KU09OIG1ldGhvZCB0byBwcmV2ZW50IGN5Y2xpYyBlcnJvciB3aGVuCiAgICAgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spCiAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSwKICAgICAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlLAogICAgICAgICAgICAgICAgICAgIHpvbmU6IHRoaXMuem9uZS5uYW1lLAogICAgICAgICAgICAgICAgICAgIHJ1bkNvdW50OiB0aGlzLnJ1bkNvdW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gWm9uZVRhc2s7CiAgICAgICAgfSgpKTsKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAvLy8gIE1JQ1JPVEFTSyBRVUVVRQogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIHZhciBzeW1ib2xTZXRUaW1lb3V0ID0gX19zeW1ib2xfXygnc2V0VGltZW91dCcpOwogICAgICAgIHZhciBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpOwogICAgICAgIHZhciBzeW1ib2xUaGVuID0gX19zeW1ib2xfXygndGhlbicpOwogICAgICAgIHZhciBfbWljcm9UYXNrUXVldWUgPSBbXTsKICAgICAgICB2YXIgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlOwogICAgICAgIHZhciBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2U7CiAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2sodGFzaykgewogICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkCiAgICAgICAgICAgIC8vIHdlIG11c3QgYm9vdHN0cmFwIHRoZSBpbml0aWFsIHRhc2sgY3JlYXRpb24gYnkgbWFudWFsbHkgc2NoZWR1bGluZyB0aGUgZHJhaW4KICAgICAgICAgICAgaWYgKF9udW1iZXJPZk5lc3RlZFRhc2tGcmFtZXMgPT09IDAgJiYgX21pY3JvVGFza1F1ZXVlLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuCiAgICAgICAgICAgICAgICBpZiAoIW5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnbG9iYWxbc3ltYm9sUHJvbWlzZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlID0gZ2xvYmFsW3N5bWJvbFByb21pc2VdLnJlc29sdmUoMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlW3N5bWJvbFRoZW5dOwogICAgICAgICAgICAgICAgICAgIGlmICghbmF0aXZlVGhlbikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgUHJvbWlzZSBpcyBub3QgcGF0Y2hhYmxlLCB3ZSBuZWVkIHRvIHVzZSBgdGhlbmAgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUgMTA3OAogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUaGVuID0gbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlWyd0aGVuJ107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRoZW4uY2FsbChuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UsIGRyYWluTWljcm9UYXNrUXVldWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFNldFRpbWVvdXRdKGRyYWluTWljcm9UYXNrUXVldWUsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhc2sgJiYgX21pY3JvVGFza1F1ZXVlLnB1c2godGFzayk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRyYWluTWljcm9UYXNrUXVldWUoKSB7CiAgICAgICAgICAgIGlmICghX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSkgewogICAgICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB3aGlsZSAoX21pY3JvVGFza1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IF9taWNyb1Rhc2tRdWV1ZTsKICAgICAgICAgICAgICAgICAgICBfbWljcm9UYXNrUXVldWUgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gcXVldWVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfYXBpLm1pY3JvdGFza0RyYWluRG9uZSgpOwogICAgICAgICAgICAgICAgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgIC8vLyAgQk9PVFNUUkFQCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgdmFyIE5PX1pPTkUgPSB7IG5hbWU6ICdOTyBaT05FJyB9OwogICAgICAgIHZhciBub3RTY2hlZHVsZWQgPSAnbm90U2NoZWR1bGVkJywgc2NoZWR1bGluZyA9ICdzY2hlZHVsaW5nJywgc2NoZWR1bGVkID0gJ3NjaGVkdWxlZCcsIHJ1bm5pbmcgPSAncnVubmluZycsIGNhbmNlbGluZyA9ICdjYW5jZWxpbmcnLCB1bmtub3duID0gJ3Vua25vd24nOwogICAgICAgIHZhciBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snOwogICAgICAgIHZhciBwYXRjaGVzID0ge307CiAgICAgICAgdmFyIF9hcGkgPSB7CiAgICAgICAgICAgIHN5bWJvbDogX19zeW1ib2xfXywKICAgICAgICAgICAgY3VycmVudFpvbmVGcmFtZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gX2N1cnJlbnRab25lRnJhbWU7IH0sCiAgICAgICAgICAgIG9uVW5oYW5kbGVkRXJyb3I6IG5vb3AsCiAgICAgICAgICAgIG1pY3JvdGFza0RyYWluRG9uZTogbm9vcCwKICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2s6IHNjaGVkdWxlTWljcm9UYXNrLAogICAgICAgICAgICBzaG93VW5jYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkgeyByZXR1cm4gIVpvbmVbX19zeW1ib2xfXygnaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvcicpXTsgfSwKICAgICAgICAgICAgcGF0Y2hFdmVudFRhcmdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgIHBhdGNoT25Qcm9wZXJ0aWVzOiBub29wLAogICAgICAgICAgICBwYXRjaE1ldGhvZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgYmluZEFyZ3VtZW50czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgIHBhdGNoVGhlbjogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgcGF0Y2hNYWNyb1Rhc2s6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgIHNldE5hdGl2ZVByb21pc2U6IGZ1bmN0aW9uIChOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgTmF0aXZlUHJvbWlzZS5yZXNvbHZlIHN0YXRpYyBmdW5jdGlvbgogICAgICAgICAgICAgICAgLy8gaXMgbm90IHJlYWR5IHlldCwgKHN1Y2ggYXMgY29yZS1qcy9lczYucHJvbWlzZSkKICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZS4KICAgICAgICAgICAgICAgIGlmIChOYXRpdmVQcm9taXNlICYmIHR5cGVvZiBOYXRpdmVQcm9taXNlLnJlc29sdmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UgPSBOYXRpdmVQcm9taXNlLnJlc29sdmUoMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhdGNoRXZlbnRQcm90b3R5cGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgIGlzSUVPckVkZ2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9LAogICAgICAgICAgICBnZXRHbG9iYWxPYmplY3RzOiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmRlZmluZWQ7IH0sCiAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5OiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSwKICAgICAgICAgICAgT2JqZWN0Q3JlYXRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmRlZmluZWQ7IH0sCiAgICAgICAgICAgIEFycmF5U2xpY2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LAogICAgICAgICAgICBwYXRjaENsYXNzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICB3cmFwV2l0aEN1cnJlbnRab25lOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbXTsgfSwKICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICBfcmVkZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgcGF0Y2hDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0KICAgICAgICB9OwogICAgICAgIHZhciBfY3VycmVudFpvbmVGcmFtZSA9IHsgcGFyZW50OiBudWxsLCB6b25lOiBuZXcgWm9uZShudWxsLCBudWxsKSB9OwogICAgICAgIHZhciBfY3VycmVudFRhc2sgPSBudWxsOwogICAgICAgIHZhciBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID0gMDsKICAgICAgICBmdW5jdGlvbiBub29wKCkgeyB9CiAgICAgICAgcGVyZm9ybWFuY2VNZWFzdXJlKCdab25lJywgJ1pvbmUnKTsKICAgICAgICByZXR1cm4gZ2xvYmFsWydab25lJ10gPSBab25lOwogICAgfSkodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93IHx8IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIHx8IGNvbW1vbmpzR2xvYmFsKTsKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIFpvbmUuX19sb2FkX3BhdGNoKCdab25lQXdhcmVQcm9taXNlJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgdmFyIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgdmFyIE9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgICAgIGZ1bmN0aW9uIHJlYWRhYmxlT2JqZWN0VG9TdHJpbmcob2JqKSB7CiAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLnRvU3RyaW5nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lOwogICAgICAgICAgICAgICAgcmV0dXJuIChjbGFzc05hbWUgPyBjbGFzc05hbWUgOiAnJykgKyAnOiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqID8gb2JqLnRvU3RyaW5nKCkgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTsKICAgICAgICB9CiAgICAgICAgdmFyIF9fc3ltYm9sX18gPSBhcGkuc3ltYm9sOwogICAgICAgIHZhciBfdW5jYXVnaHRQcm9taXNlRXJyb3JzID0gW107CiAgICAgICAgdmFyIGlzRGlzYWJsZVdyYXBwaW5nVW5jYXVnaHRQcm9taXNlUmVqZWN0aW9uID0gZ2xvYmFsW19fc3ltYm9sX18oJ0RJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04nKV0gPT09IHRydWU7CiAgICAgICAgdmFyIHN5bWJvbFByb21pc2UgPSBfX3N5bWJvbF9fKCdQcm9taXNlJyk7CiAgICAgICAgdmFyIHN5bWJvbFRoZW4gPSBfX3N5bWJvbF9fKCd0aGVuJyk7CiAgICAgICAgdmFyIGNyZWF0aW9uVHJhY2UgPSAnX19jcmVhdGlvblRyYWNlX18nOwogICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGFwaS5zaG93VW5jYXVnaHRFcnJvcigpKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVqZWN0aW9uID0gZSAmJiBlLnJlamVjdGlvbjsKICAgICAgICAgICAgICAgIGlmIChyZWplY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246JywgcmVqZWN0aW9uIGluc3RhbmNlb2YgRXJyb3IgPyByZWplY3Rpb24ubWVzc2FnZSA6IHJlamVjdGlvbiwgJzsgWm9uZTonLCBlLnpvbmUubmFtZSwgJzsgVGFzazonLCBlLnRhc2sgJiYgZS50YXNrLnNvdXJjZSwgJzsgVmFsdWU6JywgcmVqZWN0aW9uLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5zdGFjayA6IHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBhcGkubWljcm90YXNrRHJhaW5Eb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB1bmNhdWdodFByb21pc2VFcnJvciA9IF91bmNhdWdodFByb21pc2VFcnJvcnMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZS5ydW5HdWFyZGVkKGZ1bmN0aW9uICgpIHsgdGhyb3cgdW5jYXVnaHRQcm9taXNlRXJyb3I7IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVW5oYW5kbGVkUmVqZWN0aW9uKGVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgd2hpbGUgKF91bmNhdWdodFByb21pc2VFcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBfbG9vcF8xKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBVTkhBTkRMRURfUFJPTUlTRV9SRUpFQ1RJT05fSEFORExFUl9TWU1CT0wgPSBfX3N5bWJvbF9fKCd1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcicpOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlKSB7CiAgICAgICAgICAgIGFwaS5vblVuaGFuZGxlZEVycm9yKGUpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGlzVGhlbmFibGUodmFsdWUpIHsgcmV0dXJuIHZhbHVlICYmIHZhbHVlLnRoZW47IH0KICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVzb2x1dGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVqZWN0aW9uKHJlamVjdGlvbikgeyByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTsgfQogICAgICAgIHZhciBzeW1ib2xTdGF0ZSA9IF9fc3ltYm9sX18oJ3N0YXRlJyk7CiAgICAgICAgdmFyIHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTsKICAgICAgICB2YXIgc3ltYm9sRmluYWxseSA9IF9fc3ltYm9sX18oJ2ZpbmFsbHknKTsKICAgICAgICB2YXIgc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlID0gX19zeW1ib2xfXygncGFyZW50UHJvbWlzZVZhbHVlJyk7CiAgICAgICAgdmFyIHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpOwogICAgICAgIHZhciBzb3VyY2UgPSAnUHJvbWlzZS50aGVuJzsKICAgICAgICB2YXIgVU5SRVNPTFZFRCA9IG51bGw7CiAgICAgICAgdmFyIFJFU09MVkVEID0gdHJ1ZTsKICAgICAgICB2YXIgUkVKRUNURUQgPSBmYWxzZTsKICAgICAgICB2YXIgUkVKRUNURURfTk9fQ0FUQ0ggPSAwOwogICAgICAgIGZ1bmN0aW9uIG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRG8gbm90IHJldHVybiB2YWx1ZSBvciB5b3Ugd2lsbCBicmVhayB0aGUgUHJvbWlzZSBzcGVjLgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICB2YXIgb25jZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdhc0NhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlcih3cmFwcGVkRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEZ1bmN0aW9uLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgdmFyIFRZUEVfRVJST1IgPSAnUHJvbWlzZSByZXNvbHZlZCB3aXRoIGl0c2VsZic7CiAgICAgICAgdmFyIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wgPSBfX3N5bWJvbF9fKCdjdXJyZW50VGFza1RyYWNlJyk7CiAgICAgICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uCiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBvbmNlV3JhcHBlciA9IG9uY2UoKTsKICAgICAgICAgICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFRZUEVfRVJST1IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9taXNlW3N5bWJvbFN0YXRlXSA9PT0gVU5SRVNPTFZFRCkgewogICAgICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgZ2V0IHZhbHVlLnRoZW4gb25jZSBiYXNlZCBvbiBwcm9taXNlIHNwZWMuCiAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IG51bGw7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoZnVuY3Rpb24gKCkgeyByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTsgfSkoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlICYmCiAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoc3ltYm9sU3RhdGUpICYmIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgIHZhbHVlW3N5bWJvbFN0YXRlXSAhPT0gVU5SRVNPTFZFRCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSAhPT0gUkVKRUNURUQgJiYgdHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIG9uY2VXcmFwcGVyKG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkpLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgZmFsc2UpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25jZVdyYXBwZXIoZnVuY3Rpb24gKCkgeyByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBmYWxzZSwgZXJyKTsgfSkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IHN0YXRlOwogICAgICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdOwogICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sRmluYWxseV0gPT09IHN5bWJvbEZpbmFsbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRVNPTFZFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXRlIGlzIHJlc29sdmVkLCBzaG91bGQgaWdub3JlIHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVtzeW1ib2xTdGF0ZV0gPSBwcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VTdGF0ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGFzayBpbmZvcm1hdGlvbiBpbiB2YWx1ZSB3aGVuIGVycm9yIG9jY3Vycywgc28gd2UgY2FuCiAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2UKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEICYmIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgbG9uZ1N0YWNrVHJhY2Vab25lIGlzIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYWNlID0gWm9uZS5jdXJyZW50VGFzayAmJiBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpvbmUuY3VycmVudFRhc2suZGF0YVtjcmVhdGlvblRyYWNlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkodmFsdWUsIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB0cmFjZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXNvbHZlT3JSZWplY3QocHJvbWlzZSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSwgcXVldWVbaSsrXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT0gMCAmJiBzdGF0ZSA9PSBSRUpFQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFN0YXRlXSA9IFJFSkVDVEVEX05PX0NBVENIOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5jYXVnaHRQcm9taXNlRXJyb3IgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVXcmFwcGluZ1VuY2F1Z2h0UHJvbWlzZVJlamVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZGlzYWJsZSB3cmFwcGluZyB1bmNhdWdodCBwcm9taXNlIHJlamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSByZWplY3RlZCB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHZhbHVlIGluc3RlYWQgb2Ygd3JhcHBpbmcgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdGhyb3dzIGEgbmV3IEVycm9yIHRvIHByaW50IG1vcmUgcmVhZGFibGUgZXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGlmIHRoZSB2YWx1ZSBpcyBub3QgYW4gZXJyb3IsIHpvbmUuanMgYnVpbGRzIGFuIGBFcnJvcmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPYmplY3QgaGVyZSB0byBhdHRhY2ggdGhlIHN0YWNrIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICsgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgJiYgdmFsdWUuc3RhY2sgPyAnXG4nICsgdmFsdWUuc3RhY2sgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnJlamVjdGlvbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci5wcm9taXNlID0gcHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3IudGFzayA9IFpvbmUuY3VycmVudFRhc2s7CiAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMucHVzaCh1bmNhdWdodFByb21pc2VFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zY2hlZHVsZU1pY3JvVGFzaygpOyAvLyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlc29sdmluZyBhbiBhbHJlYWR5IHJlc29sdmVkIHByb21pc2UgaXMgYSBub29wLgogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgdmFyIFJFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVIgPSBfX3N5bWJvbF9fKCdyZWplY3Rpb25IYW5kbGVkSGFuZGxlcicpOwogICAgICAgIGZ1bmN0aW9uIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpIHsKICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sU3RhdGVdID09PSBSRUpFQ1RFRF9OT19DQVRDSCkgewogICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgbm8gY2F0Y2ggc3RhdHVzCiAgICAgICAgICAgICAgICAvLyBhbmQgcXVldWUubGVuZ3RoID4gMCwgbWVhbnMgdGhlcmUgaXMgYSBlcnJvciBoYW5kbGVyCiAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIGhhbmRsZSB0aGUgcmVqZWN0ZWQgcHJvbWlzZSwgd2Ugc2hvdWxkIHRyaWdnZXIKICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MucmVqZWN0aW9uaGFuZGxlZCBldmVudEhhbmRsZXIgb3Igbm9kZWpzIHJlamVjdGlvbkhhbmRsZWQKICAgICAgICAgICAgICAgIC8vIGV2ZW50SGFuZGxlcgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IFpvbmVbUkVKRUNUSU9OX0hBTkRMRURfSEFORExFUl07CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW